1 /* sp.c
2  *
3  * Copyright (C) 2006-2021 wolfSSL Inc.
4  *
5  * This file is part of wolfSSL.
6  *
7  * wolfSSL is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * wolfSSL 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
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20  */
21 
22 /* Implementation by Sean Parkinson. */
23 
24 #ifdef HAVE_CONFIG_H
25     #include <config.h>
26 #endif
27 
28 #include <wolfssl/wolfcrypt/settings.h>
29 
30 #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) || \
31     defined(WOLFSSL_HAVE_SP_ECC)
32 
33 #include <wolfssl/wolfcrypt/error-crypt.h>
34 #include <wolfssl/wolfcrypt/cpuid.h>
35 #ifdef NO_INLINE
36     #include <wolfssl/wolfcrypt/misc.h>
37 #else
38     #define WOLFSSL_MISC_INCLUDED
39     #include <wolfcrypt/src/misc.c>
40 #endif
41 
42 #ifdef RSA_LOW_MEM
43 #ifndef WOLFSSL_SP_SMALL
44 #define WOLFSSL_SP_SMALL
45 #endif
46 #endif
47 
48 #include <wolfssl/wolfcrypt/sp.h>
49 
50 #ifdef WOLFSSL_SP_ARM64_ASM
51 #define SP_PRINT_NUM(var, name, total, words, bits)     \
52     do {                                                \
53         int ii;                                         \
54         fprintf(stderr, name "=0x");                    \
55         for (ii = words - 1; ii >= 0; ii--)             \
56             fprintf(stderr, SP_PRINT_FMT, (var)[ii]);   \
57         fprintf(stderr, "\n");                         \
58     } while (0)
59 
60 #define SP_PRINT_VAL(var, name)                         \
61     fprintf(stderr, name "=0x" SP_PRINT_FMT "\n", var)
62 #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)
63 #ifndef WOLFSSL_SP_NO_2048
64 /* Read big endian unsigned byte array into r.
65  *
66  * r  A single precision integer.
67  * size  Maximum number of bytes to convert
68  * a  Byte array.
69  * n  Number of bytes in array to read.
70  */
sp_2048_from_bin(sp_digit * r,int size,const byte * a,int n)71 static void sp_2048_from_bin(sp_digit* r, int size, const byte* a, int n)
72 {
73     int i;
74     int j;
75     byte* d;
76 
77     for (i = n - 1,j = 0; i >= 7; i -= 8) {
78         r[j]  = ((sp_digit)a[i - 0] <<  0) |
79                 ((sp_digit)a[i - 1] <<  8) |
80                 ((sp_digit)a[i - 2] << 16) |
81                 ((sp_digit)a[i - 3] << 24) |
82                 ((sp_digit)a[i - 4] << 32) |
83                 ((sp_digit)a[i - 5] << 40) |
84                 ((sp_digit)a[i - 6] << 48) |
85                 ((sp_digit)a[i - 7] << 56);
86         j++;
87     }
88 
89     if (i >= 0) {
90         r[j] = 0;
91 
92         d = (byte*)r;
93         switch (i) {
94             case 6: d[n - 1 - 6] = a[6]; //fallthrough
95             case 5: d[n - 1 - 5] = a[5]; //fallthrough
96             case 4: d[n - 1 - 4] = a[4]; //fallthrough
97             case 3: d[n - 1 - 3] = a[3]; //fallthrough
98             case 2: d[n - 1 - 2] = a[2]; //fallthrough
99             case 1: d[n - 1 - 1] = a[1]; //fallthrough
100             case 0: d[n - 1 - 0] = a[0]; //fallthrough
101         }
102         j++;
103     }
104 
105     for (; j < size; j++) {
106         r[j] = 0;
107     }
108 }
109 
110 /* Convert an mp_int to an array of sp_digit.
111  *
112  * r  A single precision integer.
113  * size  Maximum number of bytes to convert
114  * a  A multi-precision integer.
115  */
sp_2048_from_mp(sp_digit * r,int size,const mp_int * a)116 static void sp_2048_from_mp(sp_digit* r, int size, const mp_int* a)
117 {
118 #if DIGIT_BIT == 64
119     int j;
120 
121     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
122 
123     for (j = a->used; j < size; j++) {
124         r[j] = 0;
125     }
126 #elif DIGIT_BIT > 64
127     int i;
128     int j = 0;
129     word32 s = 0;
130 
131     r[0] = 0;
132     for (i = 0; i < a->used && j < size; i++) {
133         r[j] |= ((sp_digit)a->dp[i] << s);
134         r[j] &= 0xffffffffffffffffl;
135         s = 64U - s;
136         if (j + 1 >= size) {
137             break;
138         }
139         /* lint allow cast of mismatch word32 and mp_digit */
140         r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
141         while ((s + 64U) <= (word32)DIGIT_BIT) {
142             s += 64U;
143             r[j] &= 0xffffffffffffffffl;
144             if (j + 1 >= size) {
145                 break;
146             }
147             if (s < (word32)DIGIT_BIT) {
148                 /* lint allow cast of mismatch word32 and mp_digit */
149                 r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
150             }
151             else {
152                 r[++j] = (sp_digit)0;
153             }
154         }
155         s = (word32)DIGIT_BIT - s;
156     }
157 
158     for (j++; j < size; j++) {
159         r[j] = 0;
160     }
161 #else
162     int i;
163     int j = 0;
164     int s = 0;
165 
166     r[0] = 0;
167     for (i = 0; i < a->used && j < size; i++) {
168         r[j] |= ((sp_digit)a->dp[i]) << s;
169         if (s + DIGIT_BIT >= 64) {
170             r[j] &= 0xffffffffffffffffl;
171             if (j + 1 >= size) {
172                 break;
173             }
174             s = 64 - s;
175             if (s == DIGIT_BIT) {
176                 r[++j] = 0;
177                 s = 0;
178             }
179             else {
180                 r[++j] = a->dp[i] >> s;
181                 s = DIGIT_BIT - s;
182             }
183         }
184         else {
185             s += DIGIT_BIT;
186         }
187     }
188 
189     for (j++; j < size; j++) {
190         r[j] = 0;
191     }
192 #endif
193 }
194 
195 /* Write r as big endian to byte array.
196  * Fixed length number of bytes written: 256
197  *
198  * r  A single precision integer.
199  * a  Byte array.
200  */
sp_2048_to_bin_32(sp_digit * r,byte * a)201 static void sp_2048_to_bin_32(sp_digit* r, byte* a)
202 {
203     int i;
204     int j;
205 
206     for (i = 31, j = 0; i >= 0; i--) {
207         a[j++] = r[i] >> 56;
208         a[j++] = r[i] >> 48;
209         a[j++] = r[i] >> 40;
210         a[j++] = r[i] >> 32;
211         a[j++] = r[i] >> 24;
212         a[j++] = r[i] >> 16;
213         a[j++] = r[i] >> 8;
214         a[j++] = r[i] >> 0;
215     }
216 }
217 
218 #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
219 /* Normalize the values in each word to 64.
220  *
221  * a  Array of sp_digit to normalize.
222  */
223 #define sp_2048_norm_32(a)
224 
225 #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
226 /* Normalize the values in each word to 64.
227  *
228  * a  Array of sp_digit to normalize.
229  */
230 #define sp_2048_norm_32(a)
231 
232 #ifndef WOLFSSL_SP_SMALL
233 /* Multiply a and b into r. (r = a * b)
234  *
235  * r  A single precision integer.
236  * a  A single precision integer.
237  * b  A single precision integer.
238  */
sp_2048_mul_8(sp_digit * r,const sp_digit * a,const sp_digit * b)239 static void sp_2048_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
240 {
241     __asm__ __volatile__ (
242         "ldp	x8, x9, [%[a], 0]\n\t"
243         "ldp	x10, x11, [%[a], 16]\n\t"
244         "ldp	x12, x13, [%[a], 32]\n\t"
245         "ldp	x14, x15, [%[a], 48]\n\t"
246         "ldp	x16, x17, [%[b], 0]\n\t"
247         "ldp	x19, x20, [%[b], 16]\n\t"
248         "ldp	x21, x22, [%[b], 32]\n\t"
249         "ldp	x23, x24, [%[b], 48]\n\t"
250         "#  A[0] * B[0]\n\t"
251         "mul	x3, x8, x16\n\t"
252         "umulh	x4, x8, x16\n\t"
253         "str	x3, [%[r]]\n\t"
254         "#  A[0] * B[1]\n\t"
255         "mul	x6, x8, x17\n\t"
256         "umulh	x7, x8, x17\n\t"
257         "adds	x4, x4, x6\n\t"
258         "#  A[1] * B[0]\n\t"
259         "mul	x6, x9, x16\n\t"
260         "adc	x5, xzr, x7\n\t"
261         "umulh	x7, x9, x16\n\t"
262         "adds	x4, x4, x6\n\t"
263         "adcs	x5, x5, x7\n\t"
264         "str	x4, [%[r], 8]\n\t"
265         "adc	x3, xzr, xzr\n\t"
266         "#  A[0] * B[2]\n\t"
267         "mul	x6, x8, x19\n\t"
268         "umulh	x7, x8, x19\n\t"
269         "adds	x5, x5, x6\n\t"
270         "#  A[1] * B[1]\n\t"
271         "mul	x6, x9, x17\n\t"
272         "adcs	x3, x3, x7\n\t"
273         "umulh	x7, x9, x17\n\t"
274         "adc	x4, xzr, xzr\n\t"
275         "adds	x5, x5, x6\n\t"
276         "#  A[2] * B[0]\n\t"
277         "mul	x6, x10, x16\n\t"
278         "adcs	x3, x3, x7\n\t"
279         "umulh	x7, x10, x16\n\t"
280         "adc	x4, x4, xzr\n\t"
281         "adds	x5, x5, x6\n\t"
282         "adcs	x3, x3, x7\n\t"
283         "str	x5, [%[r], 16]\n\t"
284         "adc	x4, x4, xzr\n\t"
285         "#  A[0] * B[3]\n\t"
286         "mul	x6, x8, x20\n\t"
287         "umulh	x7, x8, x20\n\t"
288         "adds	x3, x3, x6\n\t"
289         "#  A[1] * B[2]\n\t"
290         "mul	x6, x9, x19\n\t"
291         "adcs	x4, x4, x7\n\t"
292         "umulh	x7, x9, x19\n\t"
293         "adc	x5, xzr, xzr\n\t"
294         "adds	x3, x3, x6\n\t"
295         "#  A[2] * B[1]\n\t"
296         "mul	x6, x10, x17\n\t"
297         "adcs	x4, x4, x7\n\t"
298         "umulh	x7, x10, x17\n\t"
299         "adc	x5, x5, xzr\n\t"
300         "adds	x3, x3, x6\n\t"
301         "#  A[3] * B[0]\n\t"
302         "mul	x6, x11, x16\n\t"
303         "adcs	x4, x4, x7\n\t"
304         "umulh	x7, x11, x16\n\t"
305         "adc	x5, x5, xzr\n\t"
306         "adds	x3, x3, x6\n\t"
307         "adcs	x4, x4, x7\n\t"
308         "str	x3, [%[r], 24]\n\t"
309         "adc	x5, x5, xzr\n\t"
310         "#  A[0] * B[4]\n\t"
311         "mul	x6, x8, x21\n\t"
312         "umulh	x7, x8, x21\n\t"
313         "adds	x4, x4, x6\n\t"
314         "#  A[1] * B[3]\n\t"
315         "mul	x6, x9, x20\n\t"
316         "adcs	x5, x5, x7\n\t"
317         "umulh	x7, x9, x20\n\t"
318         "adc	x3, xzr, xzr\n\t"
319         "adds	x4, x4, x6\n\t"
320         "#  A[2] * B[2]\n\t"
321         "mul	x6, x10, x19\n\t"
322         "adcs	x5, x5, x7\n\t"
323         "umulh	x7, x10, x19\n\t"
324         "adc	x3, x3, xzr\n\t"
325         "adds	x4, x4, x6\n\t"
326         "#  A[3] * B[1]\n\t"
327         "mul	x6, x11, x17\n\t"
328         "adcs	x5, x5, x7\n\t"
329         "umulh	x7, x11, x17\n\t"
330         "adc	x3, x3, xzr\n\t"
331         "adds	x4, x4, x6\n\t"
332         "#  A[4] * B[0]\n\t"
333         "mul	x6, x12, x16\n\t"
334         "adcs	x5, x5, x7\n\t"
335         "umulh	x7, x12, x16\n\t"
336         "adc	x3, x3, xzr\n\t"
337         "adds	x4, x4, x6\n\t"
338         "adcs	x5, x5, x7\n\t"
339         "str	x4, [%[r], 32]\n\t"
340         "adc	x3, x3, xzr\n\t"
341         "#  A[0] * B[5]\n\t"
342         "mul	x6, x8, x22\n\t"
343         "umulh	x7, x8, x22\n\t"
344         "adds	x5, x5, x6\n\t"
345         "#  A[1] * B[4]\n\t"
346         "mul	x6, x9, x21\n\t"
347         "adcs	x3, x3, x7\n\t"
348         "umulh	x7, x9, x21\n\t"
349         "adc	x4, xzr, xzr\n\t"
350         "adds	x5, x5, x6\n\t"
351         "#  A[2] * B[3]\n\t"
352         "mul	x6, x10, x20\n\t"
353         "adcs	x3, x3, x7\n\t"
354         "umulh	x7, x10, x20\n\t"
355         "adc	x4, x4, xzr\n\t"
356         "adds	x5, x5, x6\n\t"
357         "#  A[3] * B[2]\n\t"
358         "mul	x6, x11, x19\n\t"
359         "adcs	x3, x3, x7\n\t"
360         "umulh	x7, x11, x19\n\t"
361         "adc	x4, x4, xzr\n\t"
362         "adds	x5, x5, x6\n\t"
363         "#  A[4] * B[1]\n\t"
364         "mul	x6, x12, x17\n\t"
365         "adcs	x3, x3, x7\n\t"
366         "umulh	x7, x12, x17\n\t"
367         "adc	x4, x4, xzr\n\t"
368         "adds	x5, x5, x6\n\t"
369         "#  A[5] * B[0]\n\t"
370         "mul	x6, x13, x16\n\t"
371         "adcs	x3, x3, x7\n\t"
372         "umulh	x7, x13, x16\n\t"
373         "adc	x4, x4, xzr\n\t"
374         "adds	x5, x5, x6\n\t"
375         "adcs	x3, x3, x7\n\t"
376         "str	x5, [%[r], 40]\n\t"
377         "adc	x4, x4, xzr\n\t"
378         "#  A[0] * B[6]\n\t"
379         "mul	x6, x8, x23\n\t"
380         "umulh	x7, x8, x23\n\t"
381         "adds	x3, x3, x6\n\t"
382         "#  A[1] * B[5]\n\t"
383         "mul	x6, x9, x22\n\t"
384         "adcs	x4, x4, x7\n\t"
385         "umulh	x7, x9, x22\n\t"
386         "adc	x5, xzr, xzr\n\t"
387         "adds	x3, x3, x6\n\t"
388         "#  A[2] * B[4]\n\t"
389         "mul	x6, x10, x21\n\t"
390         "adcs	x4, x4, x7\n\t"
391         "umulh	x7, x10, x21\n\t"
392         "adc	x5, x5, xzr\n\t"
393         "adds	x3, x3, x6\n\t"
394         "#  A[3] * B[3]\n\t"
395         "mul	x6, x11, x20\n\t"
396         "adcs	x4, x4, x7\n\t"
397         "umulh	x7, x11, x20\n\t"
398         "adc	x5, x5, xzr\n\t"
399         "adds	x3, x3, x6\n\t"
400         "#  A[4] * B[2]\n\t"
401         "mul	x6, x12, x19\n\t"
402         "adcs	x4, x4, x7\n\t"
403         "umulh	x7, x12, x19\n\t"
404         "adc	x5, x5, xzr\n\t"
405         "adds	x3, x3, x6\n\t"
406         "#  A[5] * B[1]\n\t"
407         "mul	x6, x13, x17\n\t"
408         "adcs	x4, x4, x7\n\t"
409         "umulh	x7, x13, x17\n\t"
410         "adc	x5, x5, xzr\n\t"
411         "adds	x3, x3, x6\n\t"
412         "#  A[6] * B[0]\n\t"
413         "mul	x6, x14, x16\n\t"
414         "adcs	x4, x4, x7\n\t"
415         "umulh	x7, x14, x16\n\t"
416         "adc	x5, x5, xzr\n\t"
417         "adds	x3, x3, x6\n\t"
418         "adcs	x4, x4, x7\n\t"
419         "str	x3, [%[r], 48]\n\t"
420         "adc	x5, x5, xzr\n\t"
421         "#  A[0] * B[7]\n\t"
422         "mul	x6, x8, x24\n\t"
423         "umulh	x7, x8, x24\n\t"
424         "adds	x4, x4, x6\n\t"
425         "#  A[1] * B[6]\n\t"
426         "mul	x6, x9, x23\n\t"
427         "adcs	x5, x5, x7\n\t"
428         "umulh	x7, x9, x23\n\t"
429         "adc	x3, xzr, xzr\n\t"
430         "adds	x4, x4, x6\n\t"
431         "#  A[2] * B[5]\n\t"
432         "mul	x6, x10, x22\n\t"
433         "adcs	x5, x5, x7\n\t"
434         "umulh	x7, x10, x22\n\t"
435         "adc	x3, x3, xzr\n\t"
436         "adds	x4, x4, x6\n\t"
437         "#  A[3] * B[4]\n\t"
438         "mul	x6, x11, x21\n\t"
439         "adcs	x5, x5, x7\n\t"
440         "umulh	x7, x11, x21\n\t"
441         "adc	x3, x3, xzr\n\t"
442         "adds	x4, x4, x6\n\t"
443         "#  A[4] * B[3]\n\t"
444         "mul	x6, x12, x20\n\t"
445         "adcs	x5, x5, x7\n\t"
446         "umulh	x7, x12, x20\n\t"
447         "adc	x3, x3, xzr\n\t"
448         "adds	x4, x4, x6\n\t"
449         "#  A[5] * B[2]\n\t"
450         "mul	x6, x13, x19\n\t"
451         "adcs	x5, x5, x7\n\t"
452         "umulh	x7, x13, x19\n\t"
453         "adc	x3, x3, xzr\n\t"
454         "adds	x4, x4, x6\n\t"
455         "#  A[6] * B[1]\n\t"
456         "mul	x6, x14, x17\n\t"
457         "adcs	x5, x5, x7\n\t"
458         "umulh	x7, x14, x17\n\t"
459         "adc	x3, x3, xzr\n\t"
460         "adds	x4, x4, x6\n\t"
461         "#  A[7] * B[0]\n\t"
462         "mul	x6, x15, x16\n\t"
463         "adcs	x5, x5, x7\n\t"
464         "umulh	x7, x15, x16\n\t"
465         "adc	x3, x3, xzr\n\t"
466         "adds	x4, x4, x6\n\t"
467         "adcs	x5, x5, x7\n\t"
468         "str	x4, [%[r], 56]\n\t"
469         "adc	x3, x3, xzr\n\t"
470         "#  A[1] * B[7]\n\t"
471         "mul	x6, x9, x24\n\t"
472         "umulh	x7, x9, x24\n\t"
473         "adds	x5, x5, x6\n\t"
474         "#  A[2] * B[6]\n\t"
475         "mul	x6, x10, x23\n\t"
476         "adcs	x3, x3, x7\n\t"
477         "umulh	x7, x10, x23\n\t"
478         "adc	x4, xzr, xzr\n\t"
479         "adds	x5, x5, x6\n\t"
480         "#  A[3] * B[5]\n\t"
481         "mul	x6, x11, x22\n\t"
482         "adcs	x3, x3, x7\n\t"
483         "umulh	x7, x11, x22\n\t"
484         "adc	x4, x4, xzr\n\t"
485         "adds	x5, x5, x6\n\t"
486         "#  A[4] * B[4]\n\t"
487         "mul	x6, x12, x21\n\t"
488         "adcs	x3, x3, x7\n\t"
489         "umulh	x7, x12, x21\n\t"
490         "adc	x4, x4, xzr\n\t"
491         "adds	x5, x5, x6\n\t"
492         "#  A[5] * B[3]\n\t"
493         "mul	x6, x13, x20\n\t"
494         "adcs	x3, x3, x7\n\t"
495         "umulh	x7, x13, x20\n\t"
496         "adc	x4, x4, xzr\n\t"
497         "adds	x5, x5, x6\n\t"
498         "#  A[6] * B[2]\n\t"
499         "mul	x6, x14, x19\n\t"
500         "adcs	x3, x3, x7\n\t"
501         "umulh	x7, x14, x19\n\t"
502         "adc	x4, x4, xzr\n\t"
503         "adds	x5, x5, x6\n\t"
504         "#  A[7] * B[1]\n\t"
505         "mul	x6, x15, x17\n\t"
506         "adcs	x3, x3, x7\n\t"
507         "umulh	x7, x15, x17\n\t"
508         "adc	x4, x4, xzr\n\t"
509         "adds	x5, x5, x6\n\t"
510         "adcs	x3, x3, x7\n\t"
511         "str	x5, [%[r], 64]\n\t"
512         "adc	x4, x4, xzr\n\t"
513         "#  A[2] * B[7]\n\t"
514         "mul	x6, x10, x24\n\t"
515         "umulh	x7, x10, x24\n\t"
516         "adds	x3, x3, x6\n\t"
517         "#  A[3] * B[6]\n\t"
518         "mul	x6, x11, x23\n\t"
519         "adcs	x4, x4, x7\n\t"
520         "umulh	x7, x11, x23\n\t"
521         "adc	x5, xzr, xzr\n\t"
522         "adds	x3, x3, x6\n\t"
523         "#  A[4] * B[5]\n\t"
524         "mul	x6, x12, x22\n\t"
525         "adcs	x4, x4, x7\n\t"
526         "umulh	x7, x12, x22\n\t"
527         "adc	x5, x5, xzr\n\t"
528         "adds	x3, x3, x6\n\t"
529         "#  A[5] * B[4]\n\t"
530         "mul	x6, x13, x21\n\t"
531         "adcs	x4, x4, x7\n\t"
532         "umulh	x7, x13, x21\n\t"
533         "adc	x5, x5, xzr\n\t"
534         "adds	x3, x3, x6\n\t"
535         "#  A[6] * B[3]\n\t"
536         "mul	x6, x14, x20\n\t"
537         "adcs	x4, x4, x7\n\t"
538         "umulh	x7, x14, x20\n\t"
539         "adc	x5, x5, xzr\n\t"
540         "adds	x3, x3, x6\n\t"
541         "#  A[7] * B[2]\n\t"
542         "mul	x6, x15, x19\n\t"
543         "adcs	x4, x4, x7\n\t"
544         "umulh	x7, x15, x19\n\t"
545         "adc	x5, x5, xzr\n\t"
546         "adds	x3, x3, x6\n\t"
547         "adcs	x4, x4, x7\n\t"
548         "str	x3, [%[r], 72]\n\t"
549         "adc	x5, x5, xzr\n\t"
550         "#  A[3] * B[7]\n\t"
551         "mul	x6, x11, x24\n\t"
552         "umulh	x7, x11, x24\n\t"
553         "adds	x4, x4, x6\n\t"
554         "#  A[4] * B[6]\n\t"
555         "mul	x6, x12, x23\n\t"
556         "adcs	x5, x5, x7\n\t"
557         "umulh	x7, x12, x23\n\t"
558         "adc	x3, xzr, xzr\n\t"
559         "adds	x4, x4, x6\n\t"
560         "#  A[5] * B[5]\n\t"
561         "mul	x6, x13, x22\n\t"
562         "adcs	x5, x5, x7\n\t"
563         "umulh	x7, x13, x22\n\t"
564         "adc	x3, x3, xzr\n\t"
565         "adds	x4, x4, x6\n\t"
566         "#  A[6] * B[4]\n\t"
567         "mul	x6, x14, x21\n\t"
568         "adcs	x5, x5, x7\n\t"
569         "umulh	x7, x14, x21\n\t"
570         "adc	x3, x3, xzr\n\t"
571         "adds	x4, x4, x6\n\t"
572         "#  A[7] * B[3]\n\t"
573         "mul	x6, x15, x20\n\t"
574         "adcs	x5, x5, x7\n\t"
575         "umulh	x7, x15, x20\n\t"
576         "adc	x3, x3, xzr\n\t"
577         "adds	x4, x4, x6\n\t"
578         "adcs	x5, x5, x7\n\t"
579         "str	x4, [%[r], 80]\n\t"
580         "adc	x3, x3, xzr\n\t"
581         "#  A[4] * B[7]\n\t"
582         "mul	x6, x12, x24\n\t"
583         "umulh	x7, x12, x24\n\t"
584         "adds	x5, x5, x6\n\t"
585         "#  A[5] * B[6]\n\t"
586         "mul	x6, x13, x23\n\t"
587         "adcs	x3, x3, x7\n\t"
588         "umulh	x7, x13, x23\n\t"
589         "adc	x4, xzr, xzr\n\t"
590         "adds	x5, x5, x6\n\t"
591         "#  A[6] * B[5]\n\t"
592         "mul	x6, x14, x22\n\t"
593         "adcs	x3, x3, x7\n\t"
594         "umulh	x7, x14, x22\n\t"
595         "adc	x4, x4, xzr\n\t"
596         "adds	x5, x5, x6\n\t"
597         "#  A[7] * B[4]\n\t"
598         "mul	x6, x15, x21\n\t"
599         "adcs	x3, x3, x7\n\t"
600         "umulh	x7, x15, x21\n\t"
601         "adc	x4, x4, xzr\n\t"
602         "adds	x5, x5, x6\n\t"
603         "adcs	x3, x3, x7\n\t"
604         "str	x5, [%[r], 88]\n\t"
605         "adc	x4, x4, xzr\n\t"
606         "#  A[5] * B[7]\n\t"
607         "mul	x6, x13, x24\n\t"
608         "umulh	x7, x13, x24\n\t"
609         "adds	x3, x3, x6\n\t"
610         "#  A[6] * B[6]\n\t"
611         "mul	x6, x14, x23\n\t"
612         "adcs	x4, x4, x7\n\t"
613         "umulh	x7, x14, x23\n\t"
614         "adc	x5, xzr, xzr\n\t"
615         "adds	x3, x3, x6\n\t"
616         "#  A[7] * B[5]\n\t"
617         "mul	x6, x15, x22\n\t"
618         "adcs	x4, x4, x7\n\t"
619         "umulh	x7, x15, x22\n\t"
620         "adc	x5, x5, xzr\n\t"
621         "adds	x3, x3, x6\n\t"
622         "adcs	x4, x4, x7\n\t"
623         "str	x3, [%[r], 96]\n\t"
624         "adc	x5, x5, xzr\n\t"
625         "#  A[6] * B[7]\n\t"
626         "mul	x6, x14, x24\n\t"
627         "umulh	x7, x14, x24\n\t"
628         "adds	x4, x4, x6\n\t"
629         "#  A[7] * B[6]\n\t"
630         "mul	x6, x15, x23\n\t"
631         "adcs	x5, x5, x7\n\t"
632         "umulh	x7, x15, x23\n\t"
633         "adc	x3, xzr, xzr\n\t"
634         "adds	x4, x4, x6\n\t"
635         "adcs	x5, x5, x7\n\t"
636         "str	x4, [%[r], 104]\n\t"
637         "adc	x3, x3, xzr\n\t"
638         "#  A[7] * B[7]\n\t"
639         "mul	x6, x15, x24\n\t"
640         "umulh	x7, x15, x24\n\t"
641         "adds	x5, x5, x6\n\t"
642         "adc	x3, x3, x7\n\t"
643         "stp	x5, x3, [%[r], 112]\n\t"
644         :
645         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
646         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24"
647     );
648 }
649 
650 /* Square a and put result in r. (r = a * a)
651  *
652  * All registers version.
653  *
654  * r  A single precision integer.
655  * a  A single precision integer.
656  */
sp_2048_sqr_8(sp_digit * r,const sp_digit * a)657 static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
658 {
659     __asm__ __volatile__ (
660         "ldp       x21, x22, [%[a], 0]\n\t"
661         "ldp       x23, x24, [%[a], 16]\n\t"
662         "ldp       x25, x26, [%[a], 32]\n\t"
663         "ldp       x27, x28, [%[a], 48]\n\t"
664         "#  A[0] * A[1]\n\t"
665         "mul	x6, x21, x22\n\t"
666         "umulh	x7, x21, x22\n\t"
667         "#  A[0] * A[2]\n\t"
668         "mul	x4, x21, x23\n\t"
669         "umulh	x5, x21, x23\n\t"
670         "adds	x7, x7, x4\n\t"
671         "#  A[0] * A[3]\n\t"
672         "mul	x4, x21, x24\n\t"
673         "adc	x8, xzr, x5\n\t"
674         "umulh	x5, x21, x24\n\t"
675         "adds	x8, x8, x4\n\t"
676         "#  A[1] * A[2]\n\t"
677         "mul	x4, x22, x23\n\t"
678         "adc	x9, xzr, x5\n\t"
679         "umulh	x5, x22, x23\n\t"
680         "adds	x8, x8, x4\n\t"
681         "#  A[0] * A[4]\n\t"
682         "mul	x4, x21, x25\n\t"
683         "adcs	x9, x9, x5\n\t"
684         "umulh	x5, x21, x25\n\t"
685         "adc	x10, xzr, xzr\n\t"
686         "adds	x9, x9, x4\n\t"
687         "#  A[1] * A[3]\n\t"
688         "mul	x4, x22, x24\n\t"
689         "adc	x10, x10, x5\n\t"
690         "umulh	x5, x22, x24\n\t"
691         "adds	x9, x9, x4\n\t"
692         "#  A[0] * A[5]\n\t"
693         "mul	x4, x21, x26\n\t"
694         "adcs	x10, x10, x5\n\t"
695         "umulh	x5, x21, x26\n\t"
696         "adc	x11, xzr, xzr\n\t"
697         "adds	x10, x10, x4\n\t"
698         "#  A[1] * A[4]\n\t"
699         "mul	x4, x22, x25\n\t"
700         "adc	x11, x11, x5\n\t"
701         "umulh	x5, x22, x25\n\t"
702         "adds	x10, x10, x4\n\t"
703         "#  A[2] * A[3]\n\t"
704         "mul	x4, x23, x24\n\t"
705         "adcs	x11, x11, x5\n\t"
706         "umulh	x5, x23, x24\n\t"
707         "adc	x12, xzr, xzr\n\t"
708         "adds	x10, x10, x4\n\t"
709         "#  A[0] * A[6]\n\t"
710         "mul	x4, x21, x27\n\t"
711         "adcs	x11, x11, x5\n\t"
712         "umulh	x5, x21, x27\n\t"
713         "adc	x12, x12, xzr\n\t"
714         "adds	x11, x11, x4\n\t"
715         "#  A[1] * A[5]\n\t"
716         "mul	x4, x22, x26\n\t"
717         "adcs	x12, x12, x5\n\t"
718         "umulh	x5, x22, x26\n\t"
719         "adc	x13, xzr, xzr\n\t"
720         "adds	x11, x11, x4\n\t"
721         "#  A[2] * A[4]\n\t"
722         "mul	x4, x23, x25\n\t"
723         "adcs	x12, x12, x5\n\t"
724         "umulh	x5, x23, x25\n\t"
725         "adc	x13, x13, xzr\n\t"
726         "adds	x11, x11, x4\n\t"
727         "#  A[0] * A[7]\n\t"
728         "mul	x4, x21, x28\n\t"
729         "adcs	x12, x12, x5\n\t"
730         "umulh	x5, x21, x28\n\t"
731         "adc	x13, x13, xzr\n\t"
732         "adds	x12, x12, x4\n\t"
733         "#  A[1] * A[6]\n\t"
734         "mul	x4, x22, x27\n\t"
735         "adcs	x13, x13, x5\n\t"
736         "umulh	x5, x22, x27\n\t"
737         "adc	x14, xzr, xzr\n\t"
738         "adds	x12, x12, x4\n\t"
739         "#  A[2] * A[5]\n\t"
740         "mul	x4, x23, x26\n\t"
741         "adcs	x13, x13, x5\n\t"
742         "umulh	x5, x23, x26\n\t"
743         "adc	x14, x14, xzr\n\t"
744         "adds	x12, x12, x4\n\t"
745         "#  A[3] * A[4]\n\t"
746         "mul	x4, x24, x25\n\t"
747         "adcs	x13, x13, x5\n\t"
748         "umulh	x5, x24, x25\n\t"
749         "adc	x14, x14, xzr\n\t"
750         "adds	x12, x12, x4\n\t"
751         "#  A[1] * A[7]\n\t"
752         "mul	x4, x22, x28\n\t"
753         "adcs	x13, x13, x5\n\t"
754         "umulh	x5, x22, x28\n\t"
755         "adc	x14, x14, xzr\n\t"
756         "adds	x13, x13, x4\n\t"
757         "#  A[2] * A[6]\n\t"
758         "mul	x4, x23, x27\n\t"
759         "adcs	x14, x14, x5\n\t"
760         "umulh	x5, x23, x27\n\t"
761         "adc	x15, xzr, xzr\n\t"
762         "adds	x13, x13, x4\n\t"
763         "#  A[3] * A[5]\n\t"
764         "mul	x4, x24, x26\n\t"
765         "adcs	x14, x14, x5\n\t"
766         "umulh	x5, x24, x26\n\t"
767         "adc	x15, x15, xzr\n\t"
768         "adds	x13, x13, x4\n\t"
769         "#  A[2] * A[7]\n\t"
770         "mul	x4, x23, x28\n\t"
771         "adcs	x14, x14, x5\n\t"
772         "umulh	x5, x23, x28\n\t"
773         "adc	x15, x15, xzr\n\t"
774         "adds	x14, x14, x4\n\t"
775         "#  A[3] * A[6]\n\t"
776         "mul	x4, x24, x27\n\t"
777         "adcs	x15, x15, x5\n\t"
778         "umulh	x5, x24, x27\n\t"
779         "adc	x16, xzr, xzr\n\t"
780         "adds	x14, x14, x4\n\t"
781         "#  A[4] * A[5]\n\t"
782         "mul	x4, x25, x26\n\t"
783         "adcs	x15, x15, x5\n\t"
784         "umulh	x5, x25, x26\n\t"
785         "adc	x16, x16, xzr\n\t"
786         "adds	x14, x14, x4\n\t"
787         "#  A[3] * A[7]\n\t"
788         "mul	x4, x24, x28\n\t"
789         "adcs	x15, x15, x5\n\t"
790         "umulh	x5, x24, x28\n\t"
791         "adc	x16, x16, xzr\n\t"
792         "adds	x15, x15, x4\n\t"
793         "#  A[4] * A[6]\n\t"
794         "mul	x4, x25, x27\n\t"
795         "adcs	x16, x16, x5\n\t"
796         "umulh	x5, x25, x27\n\t"
797         "adc	x17, xzr, xzr\n\t"
798         "adds	x15, x15, x4\n\t"
799         "#  A[4] * A[7]\n\t"
800         "mul	x4, x25, x28\n\t"
801         "adcs	x16, x16, x5\n\t"
802         "umulh	x5, x25, x28\n\t"
803         "adc	x17, x17, xzr\n\t"
804         "adds	x16, x16, x4\n\t"
805         "#  A[5] * A[6]\n\t"
806         "mul	x4, x26, x27\n\t"
807         "adcs	x17, x17, x5\n\t"
808         "umulh	x5, x26, x27\n\t"
809         "adc	x19, xzr, xzr\n\t"
810         "adds	x16, x16, x4\n\t"
811         "#  A[5] * A[7]\n\t"
812         "mul	x4, x26, x28\n\t"
813         "adcs	x17, x17, x5\n\t"
814         "umulh	x5, x26, x28\n\t"
815         "adc	x19, x19, xzr\n\t"
816         "adds	x17, x17, x4\n\t"
817         "#  A[6] * A[7]\n\t"
818         "mul	x4, x27, x28\n\t"
819         "adcs	x19, x19, x5\n\t"
820         "umulh	x5, x27, x28\n\t"
821         "adc	x20, xzr, xzr\n\t"
822         "adds	x19, x19, x4\n\t"
823         "adc	x20, x20, x5\n\t"
824         "# Double\n\t"
825         "adds	x6, x6, x6\n\t"
826         "adcs	x7, x7, x7\n\t"
827         "adcs	x8, x8, x8\n\t"
828         "adcs	x9, x9, x9\n\t"
829         "adcs	x10, x10, x10\n\t"
830         "adcs	x11, x11, x11\n\t"
831         "adcs	x12, x12, x12\n\t"
832         "adcs	x13, x13, x13\n\t"
833         "adcs	x14, x14, x14\n\t"
834         "adcs	x15, x15, x15\n\t"
835         "adcs	x16, x16, x16\n\t"
836         "adcs	x17, x17, x17\n\t"
837         "adcs	x19, x19, x19\n\t"
838         "#  A[0] * A[0]\n\t"
839         "mul	x5, x21, x21\n\t"
840         "adcs	x20, x20, x20\n\t"
841         "umulh	x2, x21, x21\n\t"
842         "cset  x21, cs\n\t"
843         "#  A[1] * A[1]\n\t"
844         "mul	x3, x22, x22\n\t"
845         "adds	x6, x6, x2\n\t"
846         "umulh	x4, x22, x22\n\t"
847         "adcs	x7, x7, x3\n\t"
848         "#  A[2] * A[2]\n\t"
849         "mul	x2, x23, x23\n\t"
850         "adcs	x8, x8, x4\n\t"
851         "umulh	x3, x23, x23\n\t"
852         "adcs	x9, x9, x2\n\t"
853         "#  A[3] * A[3]\n\t"
854         "mul	x4, x24, x24\n\t"
855         "adcs	x10, x10, x3\n\t"
856         "umulh	x2, x24, x24\n\t"
857         "adcs	x11, x11, x4\n\t"
858         "#  A[4] * A[4]\n\t"
859         "mul	x3, x25, x25\n\t"
860         "adcs	x12, x12, x2\n\t"
861         "umulh	x4, x25, x25\n\t"
862         "adcs	x13, x13, x3\n\t"
863         "#  A[5] * A[5]\n\t"
864         "mul	x2, x26, x26\n\t"
865         "adcs	x14, x14, x4\n\t"
866         "umulh	x3, x26, x26\n\t"
867         "adcs	x15, x15, x2\n\t"
868         "#  A[6] * A[6]\n\t"
869         "mul	x4, x27, x27\n\t"
870         "adcs	x16, x16, x3\n\t"
871         "umulh	x2, x27, x27\n\t"
872         "adcs	x17, x17, x4\n\t"
873         "#  A[7] * A[7]\n\t"
874         "mul	x3, x28, x28\n\t"
875         "adcs	x19, x19, x2\n\t"
876         "umulh	x4, x28, x28\n\t"
877         "adcs	x20, x20, x3\n\t"
878         "stp	x5, x6, [%[r], 0]\n\t"
879         "adc	x21, x21, x4\n\t"
880         "stp	x7, x8, [%[r], 16]\n\t"
881         "stp	x9, x10, [%[r], 32]\n\t"
882         "stp	x11, x12, [%[r], 48]\n\t"
883         "stp	x13, x14, [%[r], 64]\n\t"
884         "stp	x15, x16, [%[r], 80]\n\t"
885         "stp	x17, x19, [%[r], 96]\n\t"
886         "stp	x20, x21, [%[r], 112]\n\t"
887         :
888         : [r] "r" (r), [a] "r" (a)
889         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
890     );
891 }
892 
893 /* Add b to a into r. (r = a + b)
894  *
895  * r  A single precision integer.
896  * a  A single precision integer.
897  * b  A single precision integer.
898  */
sp_2048_add_8(sp_digit * r,const sp_digit * a,const sp_digit * b)899 static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a,
900         const sp_digit* b)
901 {
902     __asm__ __volatile__ (
903         "ldp	x3, x4, [%[a], 0]\n\t"
904         "ldp	x7, x8, [%[b], 0]\n\t"
905         "adds	x3, x3, x7\n\t"
906         "ldp	x5, x6, [%[a], 16]\n\t"
907         "adcs	x4, x4, x8\n\t"
908         "ldp	x9, x10, [%[b], 16]\n\t"
909         "adcs	x5, x5, x9\n\t"
910         "stp	x3, x4, [%[r], 0]\n\t"
911         "adcs	x6, x6, x10\n\t"
912         "stp	x5, x6, [%[r], 16]\n\t"
913         "ldp	x3, x4, [%[a], 32]\n\t"
914         "ldp	x7, x8, [%[b], 32]\n\t"
915         "adcs	x3, x3, x7\n\t"
916         "ldp	x5, x6, [%[a], 48]\n\t"
917         "adcs	x4, x4, x8\n\t"
918         "ldp	x9, x10, [%[b], 48]\n\t"
919         "adcs	x5, x5, x9\n\t"
920         "stp	x3, x4, [%[r], 32]\n\t"
921         "adcs	x6, x6, x10\n\t"
922         "stp	x5, x6, [%[r], 48]\n\t"
923         "cset	%[r], cs\n\t"
924         : [r] "+r" (r)
925         : [a] "r" (a), [b] "r" (b)
926         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
927     );
928 
929     return (sp_digit)r;
930 }
931 
932 /* Sub b from a into a. (a -= b)
933  *
934  * a  A single precision integer and result.
935  * b  A single precision integer.
936  */
sp_2048_sub_in_place_16(sp_digit * a,const sp_digit * b)937 static sp_digit sp_2048_sub_in_place_16(sp_digit* a, const sp_digit* b)
938 {
939     __asm__ __volatile__ (
940         "ldp	x2, x3, [%[a], 0]\n\t"
941         "ldp	x6, x7, [%[b], 0]\n\t"
942         "subs	x2, x2, x6\n\t"
943         "ldp	x4, x5, [%[a], 16]\n\t"
944         "sbcs	x3, x3, x7\n\t"
945         "ldp	x8, x9, [%[b], 16]\n\t"
946         "sbcs	x4, x4, x8\n\t"
947         "stp	x2, x3, [%[a], 0]\n\t"
948         "sbcs	x5, x5, x9\n\t"
949         "stp	x4, x5, [%[a], 16]\n\t"
950         "ldp	x2, x3, [%[a], 32]\n\t"
951         "ldp	x6, x7, [%[b], 32]\n\t"
952         "sbcs	x2, x2, x6\n\t"
953         "ldp	x4, x5, [%[a], 48]\n\t"
954         "sbcs	x3, x3, x7\n\t"
955         "ldp	x8, x9, [%[b], 48]\n\t"
956         "sbcs	x4, x4, x8\n\t"
957         "stp	x2, x3, [%[a], 32]\n\t"
958         "sbcs	x5, x5, x9\n\t"
959         "stp	x4, x5, [%[a], 48]\n\t"
960         "ldp	x2, x3, [%[a], 64]\n\t"
961         "ldp	x6, x7, [%[b], 64]\n\t"
962         "sbcs	x2, x2, x6\n\t"
963         "ldp	x4, x5, [%[a], 80]\n\t"
964         "sbcs	x3, x3, x7\n\t"
965         "ldp	x8, x9, [%[b], 80]\n\t"
966         "sbcs	x4, x4, x8\n\t"
967         "stp	x2, x3, [%[a], 64]\n\t"
968         "sbcs	x5, x5, x9\n\t"
969         "stp	x4, x5, [%[a], 80]\n\t"
970         "ldp	x2, x3, [%[a], 96]\n\t"
971         "ldp	x6, x7, [%[b], 96]\n\t"
972         "sbcs	x2, x2, x6\n\t"
973         "ldp	x4, x5, [%[a], 112]\n\t"
974         "sbcs	x3, x3, x7\n\t"
975         "ldp	x8, x9, [%[b], 112]\n\t"
976         "sbcs	x4, x4, x8\n\t"
977         "stp	x2, x3, [%[a], 96]\n\t"
978         "sbcs	x5, x5, x9\n\t"
979         "stp	x4, x5, [%[a], 112]\n\t"
980         "csetm	%[a], cc\n\t"
981         : [a] "+r" (a)
982         : [b] "r" (b)
983         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
984     );
985 
986     return (sp_digit)a;
987 }
988 
989 /* Add b to a into r. (r = a + b)
990  *
991  * r  A single precision integer.
992  * a  A single precision integer.
993  * b  A single precision integer.
994  */
sp_2048_add_16(sp_digit * r,const sp_digit * a,const sp_digit * b)995 static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a,
996         const sp_digit* b)
997 {
998     __asm__ __volatile__ (
999         "ldp	x3, x4, [%[a], 0]\n\t"
1000         "ldp	x7, x8, [%[b], 0]\n\t"
1001         "adds	x3, x3, x7\n\t"
1002         "ldp	x5, x6, [%[a], 16]\n\t"
1003         "adcs	x4, x4, x8\n\t"
1004         "ldp	x9, x10, [%[b], 16]\n\t"
1005         "adcs	x5, x5, x9\n\t"
1006         "stp	x3, x4, [%[r], 0]\n\t"
1007         "adcs	x6, x6, x10\n\t"
1008         "stp	x5, x6, [%[r], 16]\n\t"
1009         "ldp	x3, x4, [%[a], 32]\n\t"
1010         "ldp	x7, x8, [%[b], 32]\n\t"
1011         "adcs	x3, x3, x7\n\t"
1012         "ldp	x5, x6, [%[a], 48]\n\t"
1013         "adcs	x4, x4, x8\n\t"
1014         "ldp	x9, x10, [%[b], 48]\n\t"
1015         "adcs	x5, x5, x9\n\t"
1016         "stp	x3, x4, [%[r], 32]\n\t"
1017         "adcs	x6, x6, x10\n\t"
1018         "stp	x5, x6, [%[r], 48]\n\t"
1019         "ldp	x3, x4, [%[a], 64]\n\t"
1020         "ldp	x7, x8, [%[b], 64]\n\t"
1021         "adcs	x3, x3, x7\n\t"
1022         "ldp	x5, x6, [%[a], 80]\n\t"
1023         "adcs	x4, x4, x8\n\t"
1024         "ldp	x9, x10, [%[b], 80]\n\t"
1025         "adcs	x5, x5, x9\n\t"
1026         "stp	x3, x4, [%[r], 64]\n\t"
1027         "adcs	x6, x6, x10\n\t"
1028         "stp	x5, x6, [%[r], 80]\n\t"
1029         "ldp	x3, x4, [%[a], 96]\n\t"
1030         "ldp	x7, x8, [%[b], 96]\n\t"
1031         "adcs	x3, x3, x7\n\t"
1032         "ldp	x5, x6, [%[a], 112]\n\t"
1033         "adcs	x4, x4, x8\n\t"
1034         "ldp	x9, x10, [%[b], 112]\n\t"
1035         "adcs	x5, x5, x9\n\t"
1036         "stp	x3, x4, [%[r], 96]\n\t"
1037         "adcs	x6, x6, x10\n\t"
1038         "stp	x5, x6, [%[r], 112]\n\t"
1039         "cset	%[r], cs\n\t"
1040         : [r] "+r" (r)
1041         : [a] "r" (a), [b] "r" (b)
1042         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
1043     );
1044 
1045     return (sp_digit)r;
1046 }
1047 
1048 /* AND m into each word of a and store in r.
1049  *
1050  * r  A single precision integer.
1051  * a  A single precision integer.
1052  * m  Mask to AND against each digit.
1053  */
sp_2048_mask_8(sp_digit * r,const sp_digit * a,sp_digit m)1054 static void sp_2048_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
1055 {
1056 #ifdef WOLFSSL_SP_SMALL
1057     int i;
1058 
1059     for (i=0; i<8; i++) {
1060         r[i] = a[i] & m;
1061     }
1062 #else
1063     r[0] = a[0] & m;
1064     r[1] = a[1] & m;
1065     r[2] = a[2] & m;
1066     r[3] = a[3] & m;
1067     r[4] = a[4] & m;
1068     r[5] = a[5] & m;
1069     r[6] = a[6] & m;
1070     r[7] = a[7] & m;
1071 #endif
1072 }
1073 
1074 /* Add digit to a into r. (r = a + b)
1075  *
1076  * r  A single precision integer.
1077  * a  A single precision integer.
1078  * b  A single precision integer.
1079  */
sp_2048_add_zero_8(sp_digit * r,const sp_digit * a,const sp_digit d)1080 static void sp_2048_add_zero_8(sp_digit* r, const sp_digit* a,
1081         const sp_digit d)
1082 {
1083     __asm__ __volatile__ (
1084         "ldp	x3, x4, [%[a], 0]\n\t"
1085         "ldp	x5, x6, [%[a], 16]\n\t"
1086         "adds	x3, x3, %[d]\n\t"
1087         "adcs	x4, x4, xzr\n\t"
1088         "adcs	x5, x5, xzr\n\t"
1089         "stp	x3, x4, [%[r], 0]\n\t"
1090         "adcs	x6, x6, xzr\n\t"
1091         "stp	x5, x6, [%[r], 16]\n\t"
1092         "ldp	x3, x4, [%[a], 32]\n\t"
1093         "ldp	x5, x6, [%[a], 48]\n\t"
1094         "adcs	x3, x3, xzr\n\t"
1095         "adcs	x4, x4, xzr\n\t"
1096         "adcs	x5, x5, xzr\n\t"
1097         "stp	x3, x4, [%[r], 32]\n\t"
1098         "adcs	x6, x6, xzr\n\t"
1099         "stp	x5, x6, [%[r], 48]\n\t"
1100         :
1101         : [r] "r" (r), [a] "r" (a), [d] "r" (d)
1102         : "memory", "x3", "x4", "x5", "x6"
1103     );
1104 }
1105 
1106 /* Multiply a and b into r. (r = a * b)
1107  *
1108  * r  A single precision integer.
1109  * a  A single precision integer.
1110  * b  A single precision integer.
1111  */
sp_2048_mul_16(sp_digit * r,const sp_digit * a,const sp_digit * b)1112 SP_NOINLINE static void sp_2048_mul_16(sp_digit* r, const sp_digit* a,
1113         const sp_digit* b)
1114 {
1115     sp_digit* z0 = r;
1116     sp_digit z1[16];
1117     sp_digit a1[8];
1118     sp_digit b1[8];
1119     sp_digit z2[16];
1120     sp_digit u, ca, cb;
1121 
1122     ca = sp_2048_add_8(a1, a, &a[8]);
1123     cb = sp_2048_add_8(b1, b, &b[8]);
1124     u  = ca & cb;
1125     sp_2048_mul_8(z1, a1, b1);
1126     sp_2048_mul_8(z2, &a[8], &b[8]);
1127     sp_2048_mul_8(z0, a, b);
1128     sp_2048_mask_8(r + 16, a1, 0 - cb);
1129     sp_2048_mask_8(b1, b1, 0 - ca);
1130     u += sp_2048_add_8(r + 16, r + 16, b1);
1131     u += sp_2048_sub_in_place_16(z1, z2);
1132     u += sp_2048_sub_in_place_16(z1, z0);
1133     u += sp_2048_add_16(r + 8, r + 8, z1);
1134     u += sp_2048_add_8(r + 16, r + 16, z2);
1135     sp_2048_add_zero_8(r + 24, z2 + 8, u);
1136 }
1137 
1138 #ifdef WOLFSSL_SP_SMALL
1139 /* Double a into r. (r = a + a)
1140  *
1141  * r  A single precision integer.
1142  * a  A single precision integer.
1143  */
sp_2048_dbl_8(sp_digit * r,const sp_digit * a)1144 static sp_digit sp_2048_dbl_8(sp_digit* r, const sp_digit* a)
1145 {
1146     sp_digit c = 0;
1147 
1148     __asm__ __volatile__ (
1149         "add	x11, %[a], 64\n\t"
1150         "\n1:\n\t"
1151         "adds	%[c], %[c], #-1\n\t"
1152         "ldp	x3, x4, [%[a]], #16\n\t"
1153         "ldp	x5, x6, [%[a]], #16\n\t"
1154         "adcs	x3, x3, x3\n\t"
1155         "adcs	x4, x4, x4\n\t"
1156         "adcs	x5, x5, x5\n\t"
1157         "stp	x3, x4, [%[r]], #16\n\t"
1158         "adcs	x6, x6, x6\n\t"
1159         "stp	x5, x6, [%[r]], #16\n\t"
1160         "cset	%[c], cs\n\t"
1161         "cmp	%[a], x11\n\t"
1162         "b.ne	1b\n\t"
1163         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a)
1164         :
1165         : "memory", "x3", "x4", "x5", "x6", "x11"
1166     );
1167 
1168     return c;
1169 }
1170 
1171 #else
1172 /* Double a into r. (r = a + a)
1173  *
1174  * r  A single precision integer.
1175  * a  A single precision integer.
1176  */
sp_2048_dbl_8(sp_digit * r,const sp_digit * a)1177 static sp_digit sp_2048_dbl_8(sp_digit* r, const sp_digit* a)
1178 {
1179     __asm__ __volatile__ (
1180         "ldp	x3, x4, [%[a], 0]\n\t"
1181         "adds	x3, x3, x3\n\t"
1182         "ldr	x5, [%[a], 16]\n\t"
1183         "adcs	x4, x4, x4\n\t"
1184         "ldr	x6, [%[a], 24]\n\t"
1185         "adcs	x5, x5, x5\n\t"
1186         "stp	x3, x4, [%[r], 0]\n\t"
1187         "adcs	x6, x6, x6\n\t"
1188         "stp	x5, x6, [%[r], 16]\n\t"
1189         "ldp	x3, x4, [%[a], 32]\n\t"
1190         "adcs	x3, x3, x3\n\t"
1191         "ldr	x5, [%[a], 48]\n\t"
1192         "adcs	x4, x4, x4\n\t"
1193         "ldr	x6, [%[a], 56]\n\t"
1194         "adcs	x5, x5, x5\n\t"
1195         "stp	x3, x4, [%[r], 32]\n\t"
1196         "adcs	x6, x6, x6\n\t"
1197         "stp	x5, x6, [%[r], 48]\n\t"
1198         "cset	%[r], cs\n\t"
1199         : [r] "+r" (r)
1200         : [a] "r" (a)
1201         : "memory", "x3", "x4", "x5", "x6"
1202     );
1203 
1204     return (sp_digit)r;
1205 }
1206 
1207 #endif /* WOLFSSL_SP_SMALL */
1208 /* Square a and put result in r. (r = a * a)
1209  *
1210  * r  A single precision integer.
1211  * a  A single precision integer.
1212  */
sp_2048_sqr_16(sp_digit * r,const sp_digit * a)1213 SP_NOINLINE static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
1214 {
1215     sp_digit* z0 = r;
1216     sp_digit z2[16];
1217     sp_digit z1[16];
1218     sp_digit a1[8];
1219     sp_digit u;
1220 
1221     u = sp_2048_add_8(a1, a, &a[8]);
1222     sp_2048_sqr_8(z1, a1);
1223     sp_2048_sqr_8(z2, &a[8]);
1224     sp_2048_sqr_8(z0, a);
1225     sp_2048_mask_8(r + 16, a1, 0 - u);
1226     u += sp_2048_dbl_8(r + 16, r + 16);
1227     u += sp_2048_sub_in_place_16(z1, z2);
1228     u += sp_2048_sub_in_place_16(z1, z0);
1229     u += sp_2048_add_16(r + 8, r + 8, z1);
1230     u += sp_2048_add_8(r + 16, r + 16, z2);
1231     sp_2048_add_zero_8(r + 24, z2 + 8, u);
1232 }
1233 
1234 /* Sub b from a into a. (a -= b)
1235  *
1236  * a  A single precision integer and result.
1237  * b  A single precision integer.
1238  */
sp_2048_sub_in_place_32(sp_digit * a,const sp_digit * b)1239 static sp_digit sp_2048_sub_in_place_32(sp_digit* a, const sp_digit* b)
1240 {
1241     __asm__ __volatile__ (
1242         "ldp	x2, x3, [%[a], 0]\n\t"
1243         "ldp	x6, x7, [%[b], 0]\n\t"
1244         "subs	x2, x2, x6\n\t"
1245         "ldp	x4, x5, [%[a], 16]\n\t"
1246         "sbcs	x3, x3, x7\n\t"
1247         "ldp	x8, x9, [%[b], 16]\n\t"
1248         "sbcs	x4, x4, x8\n\t"
1249         "stp	x2, x3, [%[a], 0]\n\t"
1250         "sbcs	x5, x5, x9\n\t"
1251         "stp	x4, x5, [%[a], 16]\n\t"
1252         "ldp	x2, x3, [%[a], 32]\n\t"
1253         "ldp	x6, x7, [%[b], 32]\n\t"
1254         "sbcs	x2, x2, x6\n\t"
1255         "ldp	x4, x5, [%[a], 48]\n\t"
1256         "sbcs	x3, x3, x7\n\t"
1257         "ldp	x8, x9, [%[b], 48]\n\t"
1258         "sbcs	x4, x4, x8\n\t"
1259         "stp	x2, x3, [%[a], 32]\n\t"
1260         "sbcs	x5, x5, x9\n\t"
1261         "stp	x4, x5, [%[a], 48]\n\t"
1262         "ldp	x2, x3, [%[a], 64]\n\t"
1263         "ldp	x6, x7, [%[b], 64]\n\t"
1264         "sbcs	x2, x2, x6\n\t"
1265         "ldp	x4, x5, [%[a], 80]\n\t"
1266         "sbcs	x3, x3, x7\n\t"
1267         "ldp	x8, x9, [%[b], 80]\n\t"
1268         "sbcs	x4, x4, x8\n\t"
1269         "stp	x2, x3, [%[a], 64]\n\t"
1270         "sbcs	x5, x5, x9\n\t"
1271         "stp	x4, x5, [%[a], 80]\n\t"
1272         "ldp	x2, x3, [%[a], 96]\n\t"
1273         "ldp	x6, x7, [%[b], 96]\n\t"
1274         "sbcs	x2, x2, x6\n\t"
1275         "ldp	x4, x5, [%[a], 112]\n\t"
1276         "sbcs	x3, x3, x7\n\t"
1277         "ldp	x8, x9, [%[b], 112]\n\t"
1278         "sbcs	x4, x4, x8\n\t"
1279         "stp	x2, x3, [%[a], 96]\n\t"
1280         "sbcs	x5, x5, x9\n\t"
1281         "stp	x4, x5, [%[a], 112]\n\t"
1282         "ldp	x2, x3, [%[a], 128]\n\t"
1283         "ldp	x6, x7, [%[b], 128]\n\t"
1284         "sbcs	x2, x2, x6\n\t"
1285         "ldp	x4, x5, [%[a], 144]\n\t"
1286         "sbcs	x3, x3, x7\n\t"
1287         "ldp	x8, x9, [%[b], 144]\n\t"
1288         "sbcs	x4, x4, x8\n\t"
1289         "stp	x2, x3, [%[a], 128]\n\t"
1290         "sbcs	x5, x5, x9\n\t"
1291         "stp	x4, x5, [%[a], 144]\n\t"
1292         "ldp	x2, x3, [%[a], 160]\n\t"
1293         "ldp	x6, x7, [%[b], 160]\n\t"
1294         "sbcs	x2, x2, x6\n\t"
1295         "ldp	x4, x5, [%[a], 176]\n\t"
1296         "sbcs	x3, x3, x7\n\t"
1297         "ldp	x8, x9, [%[b], 176]\n\t"
1298         "sbcs	x4, x4, x8\n\t"
1299         "stp	x2, x3, [%[a], 160]\n\t"
1300         "sbcs	x5, x5, x9\n\t"
1301         "stp	x4, x5, [%[a], 176]\n\t"
1302         "ldp	x2, x3, [%[a], 192]\n\t"
1303         "ldp	x6, x7, [%[b], 192]\n\t"
1304         "sbcs	x2, x2, x6\n\t"
1305         "ldp	x4, x5, [%[a], 208]\n\t"
1306         "sbcs	x3, x3, x7\n\t"
1307         "ldp	x8, x9, [%[b], 208]\n\t"
1308         "sbcs	x4, x4, x8\n\t"
1309         "stp	x2, x3, [%[a], 192]\n\t"
1310         "sbcs	x5, x5, x9\n\t"
1311         "stp	x4, x5, [%[a], 208]\n\t"
1312         "ldp	x2, x3, [%[a], 224]\n\t"
1313         "ldp	x6, x7, [%[b], 224]\n\t"
1314         "sbcs	x2, x2, x6\n\t"
1315         "ldp	x4, x5, [%[a], 240]\n\t"
1316         "sbcs	x3, x3, x7\n\t"
1317         "ldp	x8, x9, [%[b], 240]\n\t"
1318         "sbcs	x4, x4, x8\n\t"
1319         "stp	x2, x3, [%[a], 224]\n\t"
1320         "sbcs	x5, x5, x9\n\t"
1321         "stp	x4, x5, [%[a], 240]\n\t"
1322         "csetm	%[a], cc\n\t"
1323         : [a] "+r" (a)
1324         : [b] "r" (b)
1325         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
1326     );
1327 
1328     return (sp_digit)a;
1329 }
1330 
1331 /* Add b to a into r. (r = a + b)
1332  *
1333  * r  A single precision integer.
1334  * a  A single precision integer.
1335  * b  A single precision integer.
1336  */
sp_2048_add_32(sp_digit * r,const sp_digit * a,const sp_digit * b)1337 static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
1338         const sp_digit* b)
1339 {
1340     __asm__ __volatile__ (
1341         "ldp	x3, x4, [%[a], 0]\n\t"
1342         "ldp	x7, x8, [%[b], 0]\n\t"
1343         "adds	x3, x3, x7\n\t"
1344         "ldp	x5, x6, [%[a], 16]\n\t"
1345         "adcs	x4, x4, x8\n\t"
1346         "ldp	x9, x10, [%[b], 16]\n\t"
1347         "adcs	x5, x5, x9\n\t"
1348         "stp	x3, x4, [%[r], 0]\n\t"
1349         "adcs	x6, x6, x10\n\t"
1350         "stp	x5, x6, [%[r], 16]\n\t"
1351         "ldp	x3, x4, [%[a], 32]\n\t"
1352         "ldp	x7, x8, [%[b], 32]\n\t"
1353         "adcs	x3, x3, x7\n\t"
1354         "ldp	x5, x6, [%[a], 48]\n\t"
1355         "adcs	x4, x4, x8\n\t"
1356         "ldp	x9, x10, [%[b], 48]\n\t"
1357         "adcs	x5, x5, x9\n\t"
1358         "stp	x3, x4, [%[r], 32]\n\t"
1359         "adcs	x6, x6, x10\n\t"
1360         "stp	x5, x6, [%[r], 48]\n\t"
1361         "ldp	x3, x4, [%[a], 64]\n\t"
1362         "ldp	x7, x8, [%[b], 64]\n\t"
1363         "adcs	x3, x3, x7\n\t"
1364         "ldp	x5, x6, [%[a], 80]\n\t"
1365         "adcs	x4, x4, x8\n\t"
1366         "ldp	x9, x10, [%[b], 80]\n\t"
1367         "adcs	x5, x5, x9\n\t"
1368         "stp	x3, x4, [%[r], 64]\n\t"
1369         "adcs	x6, x6, x10\n\t"
1370         "stp	x5, x6, [%[r], 80]\n\t"
1371         "ldp	x3, x4, [%[a], 96]\n\t"
1372         "ldp	x7, x8, [%[b], 96]\n\t"
1373         "adcs	x3, x3, x7\n\t"
1374         "ldp	x5, x6, [%[a], 112]\n\t"
1375         "adcs	x4, x4, x8\n\t"
1376         "ldp	x9, x10, [%[b], 112]\n\t"
1377         "adcs	x5, x5, x9\n\t"
1378         "stp	x3, x4, [%[r], 96]\n\t"
1379         "adcs	x6, x6, x10\n\t"
1380         "stp	x5, x6, [%[r], 112]\n\t"
1381         "ldp	x3, x4, [%[a], 128]\n\t"
1382         "ldp	x7, x8, [%[b], 128]\n\t"
1383         "adcs	x3, x3, x7\n\t"
1384         "ldp	x5, x6, [%[a], 144]\n\t"
1385         "adcs	x4, x4, x8\n\t"
1386         "ldp	x9, x10, [%[b], 144]\n\t"
1387         "adcs	x5, x5, x9\n\t"
1388         "stp	x3, x4, [%[r], 128]\n\t"
1389         "adcs	x6, x6, x10\n\t"
1390         "stp	x5, x6, [%[r], 144]\n\t"
1391         "ldp	x3, x4, [%[a], 160]\n\t"
1392         "ldp	x7, x8, [%[b], 160]\n\t"
1393         "adcs	x3, x3, x7\n\t"
1394         "ldp	x5, x6, [%[a], 176]\n\t"
1395         "adcs	x4, x4, x8\n\t"
1396         "ldp	x9, x10, [%[b], 176]\n\t"
1397         "adcs	x5, x5, x9\n\t"
1398         "stp	x3, x4, [%[r], 160]\n\t"
1399         "adcs	x6, x6, x10\n\t"
1400         "stp	x5, x6, [%[r], 176]\n\t"
1401         "ldp	x3, x4, [%[a], 192]\n\t"
1402         "ldp	x7, x8, [%[b], 192]\n\t"
1403         "adcs	x3, x3, x7\n\t"
1404         "ldp	x5, x6, [%[a], 208]\n\t"
1405         "adcs	x4, x4, x8\n\t"
1406         "ldp	x9, x10, [%[b], 208]\n\t"
1407         "adcs	x5, x5, x9\n\t"
1408         "stp	x3, x4, [%[r], 192]\n\t"
1409         "adcs	x6, x6, x10\n\t"
1410         "stp	x5, x6, [%[r], 208]\n\t"
1411         "ldp	x3, x4, [%[a], 224]\n\t"
1412         "ldp	x7, x8, [%[b], 224]\n\t"
1413         "adcs	x3, x3, x7\n\t"
1414         "ldp	x5, x6, [%[a], 240]\n\t"
1415         "adcs	x4, x4, x8\n\t"
1416         "ldp	x9, x10, [%[b], 240]\n\t"
1417         "adcs	x5, x5, x9\n\t"
1418         "stp	x3, x4, [%[r], 224]\n\t"
1419         "adcs	x6, x6, x10\n\t"
1420         "stp	x5, x6, [%[r], 240]\n\t"
1421         "cset	%[r], cs\n\t"
1422         : [r] "+r" (r)
1423         : [a] "r" (a), [b] "r" (b)
1424         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
1425     );
1426 
1427     return (sp_digit)r;
1428 }
1429 
1430 /* AND m into each word of a and store in r.
1431  *
1432  * r  A single precision integer.
1433  * a  A single precision integer.
1434  * m  Mask to AND against each digit.
1435  */
sp_2048_mask_16(sp_digit * r,const sp_digit * a,sp_digit m)1436 static void sp_2048_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
1437 {
1438 #ifdef WOLFSSL_SP_SMALL
1439     int i;
1440 
1441     for (i=0; i<16; i++) {
1442         r[i] = a[i] & m;
1443     }
1444 #else
1445     int i;
1446 
1447     for (i = 0; i < 16; i += 8) {
1448         r[i+0] = a[i+0] & m;
1449         r[i+1] = a[i+1] & m;
1450         r[i+2] = a[i+2] & m;
1451         r[i+3] = a[i+3] & m;
1452         r[i+4] = a[i+4] & m;
1453         r[i+5] = a[i+5] & m;
1454         r[i+6] = a[i+6] & m;
1455         r[i+7] = a[i+7] & m;
1456     }
1457 #endif
1458 }
1459 
1460 /* Add digit to a into r. (r = a + b)
1461  *
1462  * r  A single precision integer.
1463  * a  A single precision integer.
1464  * b  A single precision integer.
1465  */
sp_2048_add_zero_16(sp_digit * r,const sp_digit * a,const sp_digit d)1466 static void sp_2048_add_zero_16(sp_digit* r, const sp_digit* a,
1467         const sp_digit d)
1468 {
1469     __asm__ __volatile__ (
1470         "ldp	x3, x4, [%[a], 0]\n\t"
1471         "ldp	x5, x6, [%[a], 16]\n\t"
1472         "adds	x3, x3, %[d]\n\t"
1473         "adcs	x4, x4, xzr\n\t"
1474         "adcs	x5, x5, xzr\n\t"
1475         "stp	x3, x4, [%[r], 0]\n\t"
1476         "adcs	x6, x6, xzr\n\t"
1477         "stp	x5, x6, [%[r], 16]\n\t"
1478         "ldp	x3, x4, [%[a], 32]\n\t"
1479         "ldp	x5, x6, [%[a], 48]\n\t"
1480         "adcs	x3, x3, xzr\n\t"
1481         "adcs	x4, x4, xzr\n\t"
1482         "adcs	x5, x5, xzr\n\t"
1483         "stp	x3, x4, [%[r], 32]\n\t"
1484         "adcs	x6, x6, xzr\n\t"
1485         "stp	x5, x6, [%[r], 48]\n\t"
1486         "ldp	x3, x4, [%[a], 64]\n\t"
1487         "ldp	x5, x6, [%[a], 80]\n\t"
1488         "adcs	x3, x3, xzr\n\t"
1489         "adcs	x4, x4, xzr\n\t"
1490         "adcs	x5, x5, xzr\n\t"
1491         "stp	x3, x4, [%[r], 64]\n\t"
1492         "adcs	x6, x6, xzr\n\t"
1493         "stp	x5, x6, [%[r], 80]\n\t"
1494         "ldp	x3, x4, [%[a], 96]\n\t"
1495         "ldp	x5, x6, [%[a], 112]\n\t"
1496         "adcs	x3, x3, xzr\n\t"
1497         "adcs	x4, x4, xzr\n\t"
1498         "adcs	x5, x5, xzr\n\t"
1499         "stp	x3, x4, [%[r], 96]\n\t"
1500         "adcs	x6, x6, xzr\n\t"
1501         "stp	x5, x6, [%[r], 112]\n\t"
1502         :
1503         : [r] "r" (r), [a] "r" (a), [d] "r" (d)
1504         : "memory", "x3", "x4", "x5", "x6"
1505     );
1506 }
1507 
1508 /* Multiply a and b into r. (r = a * b)
1509  *
1510  * r  A single precision integer.
1511  * a  A single precision integer.
1512  * b  A single precision integer.
1513  */
sp_2048_mul_32(sp_digit * r,const sp_digit * a,const sp_digit * b)1514 SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
1515         const sp_digit* b)
1516 {
1517     sp_digit* z0 = r;
1518     sp_digit z1[32];
1519     sp_digit a1[16];
1520     sp_digit b1[16];
1521     sp_digit z2[32];
1522     sp_digit u, ca, cb;
1523 
1524     ca = sp_2048_add_16(a1, a, &a[16]);
1525     cb = sp_2048_add_16(b1, b, &b[16]);
1526     u  = ca & cb;
1527     sp_2048_mul_16(z1, a1, b1);
1528     sp_2048_mul_16(z2, &a[16], &b[16]);
1529     sp_2048_mul_16(z0, a, b);
1530     sp_2048_mask_16(r + 32, a1, 0 - cb);
1531     sp_2048_mask_16(b1, b1, 0 - ca);
1532     u += sp_2048_add_16(r + 32, r + 32, b1);
1533     u += sp_2048_sub_in_place_32(z1, z2);
1534     u += sp_2048_sub_in_place_32(z1, z0);
1535     u += sp_2048_add_32(r + 16, r + 16, z1);
1536     u += sp_2048_add_16(r + 32, r + 32, z2);
1537     sp_2048_add_zero_16(r + 48, z2 + 16, u);
1538 }
1539 
1540 #ifdef WOLFSSL_SP_SMALL
1541 /* Double a into r. (r = a + a)
1542  *
1543  * r  A single precision integer.
1544  * a  A single precision integer.
1545  */
sp_2048_dbl_16(sp_digit * r,const sp_digit * a)1546 static sp_digit sp_2048_dbl_16(sp_digit* r, const sp_digit* a)
1547 {
1548     sp_digit c = 0;
1549 
1550     __asm__ __volatile__ (
1551         "add	x11, %[a], 128\n\t"
1552         "\n1:\n\t"
1553         "adds	%[c], %[c], #-1\n\t"
1554         "ldp	x3, x4, [%[a]], #16\n\t"
1555         "ldp	x5, x6, [%[a]], #16\n\t"
1556         "adcs	x3, x3, x3\n\t"
1557         "adcs	x4, x4, x4\n\t"
1558         "adcs	x5, x5, x5\n\t"
1559         "stp	x3, x4, [%[r]], #16\n\t"
1560         "adcs	x6, x6, x6\n\t"
1561         "stp	x5, x6, [%[r]], #16\n\t"
1562         "cset	%[c], cs\n\t"
1563         "cmp	%[a], x11\n\t"
1564         "b.ne	1b\n\t"
1565         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a)
1566         :
1567         : "memory", "x3", "x4", "x5", "x6", "x11"
1568     );
1569 
1570     return c;
1571 }
1572 
1573 #else
1574 /* Double a into r. (r = a + a)
1575  *
1576  * r  A single precision integer.
1577  * a  A single precision integer.
1578  */
sp_2048_dbl_16(sp_digit * r,const sp_digit * a)1579 static sp_digit sp_2048_dbl_16(sp_digit* r, const sp_digit* a)
1580 {
1581     __asm__ __volatile__ (
1582         "ldp	x3, x4, [%[a], 0]\n\t"
1583         "adds	x3, x3, x3\n\t"
1584         "ldr	x5, [%[a], 16]\n\t"
1585         "adcs	x4, x4, x4\n\t"
1586         "ldr	x6, [%[a], 24]\n\t"
1587         "adcs	x5, x5, x5\n\t"
1588         "stp	x3, x4, [%[r], 0]\n\t"
1589         "adcs	x6, x6, x6\n\t"
1590         "stp	x5, x6, [%[r], 16]\n\t"
1591         "ldp	x3, x4, [%[a], 32]\n\t"
1592         "adcs	x3, x3, x3\n\t"
1593         "ldr	x5, [%[a], 48]\n\t"
1594         "adcs	x4, x4, x4\n\t"
1595         "ldr	x6, [%[a], 56]\n\t"
1596         "adcs	x5, x5, x5\n\t"
1597         "stp	x3, x4, [%[r], 32]\n\t"
1598         "adcs	x6, x6, x6\n\t"
1599         "stp	x5, x6, [%[r], 48]\n\t"
1600         "ldp	x3, x4, [%[a], 64]\n\t"
1601         "adcs	x3, x3, x3\n\t"
1602         "ldr	x5, [%[a], 80]\n\t"
1603         "adcs	x4, x4, x4\n\t"
1604         "ldr	x6, [%[a], 88]\n\t"
1605         "adcs	x5, x5, x5\n\t"
1606         "stp	x3, x4, [%[r], 64]\n\t"
1607         "adcs	x6, x6, x6\n\t"
1608         "stp	x5, x6, [%[r], 80]\n\t"
1609         "ldp	x3, x4, [%[a], 96]\n\t"
1610         "adcs	x3, x3, x3\n\t"
1611         "ldr	x5, [%[a], 112]\n\t"
1612         "adcs	x4, x4, x4\n\t"
1613         "ldr	x6, [%[a], 120]\n\t"
1614         "adcs	x5, x5, x5\n\t"
1615         "stp	x3, x4, [%[r], 96]\n\t"
1616         "adcs	x6, x6, x6\n\t"
1617         "stp	x5, x6, [%[r], 112]\n\t"
1618         "cset	%[r], cs\n\t"
1619         : [r] "+r" (r)
1620         : [a] "r" (a)
1621         : "memory", "x3", "x4", "x5", "x6"
1622     );
1623 
1624     return (sp_digit)r;
1625 }
1626 
1627 #endif /* WOLFSSL_SP_SMALL */
1628 /* Square a and put result in r. (r = a * a)
1629  *
1630  * r  A single precision integer.
1631  * a  A single precision integer.
1632  */
sp_2048_sqr_32(sp_digit * r,const sp_digit * a)1633 SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
1634 {
1635     sp_digit* z0 = r;
1636     sp_digit z2[32];
1637     sp_digit z1[32];
1638     sp_digit a1[16];
1639     sp_digit u;
1640 
1641     u = sp_2048_add_16(a1, a, &a[16]);
1642     sp_2048_sqr_16(z1, a1);
1643     sp_2048_sqr_16(z2, &a[16]);
1644     sp_2048_sqr_16(z0, a);
1645     sp_2048_mask_16(r + 32, a1, 0 - u);
1646     u += sp_2048_dbl_16(r + 32, r + 32);
1647     u += sp_2048_sub_in_place_32(z1, z2);
1648     u += sp_2048_sub_in_place_32(z1, z0);
1649     u += sp_2048_add_32(r + 16, r + 16, z1);
1650     u += sp_2048_add_16(r + 32, r + 32, z2);
1651     sp_2048_add_zero_16(r + 48, z2 + 16, u);
1652 }
1653 
1654 #endif /* !WOLFSSL_SP_SMALL */
1655 #ifdef WOLFSSL_SP_SMALL
1656 /* Add b to a into r. (r = a + b)
1657  *
1658  * r  A single precision integer.
1659  * a  A single precision integer.
1660  * b  A single precision integer.
1661  */
sp_2048_add_32(sp_digit * r,const sp_digit * a,const sp_digit * b)1662 static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
1663         const sp_digit* b)
1664 {
1665     sp_digit c = 0;
1666 
1667     __asm__ __volatile__ (
1668         "add	x11, %[a], 256\n\t"
1669         "\n1:\n\t"
1670         "adds	%[c], %[c], #-1\n\t"
1671         "ldp	x3, x4, [%[a]], #16\n\t"
1672         "ldp	x5, x6, [%[a]], #16\n\t"
1673         "ldp	x7, x8, [%[b]], #16\n\t"
1674         "adcs	x3, x3, x7\n\t"
1675         "ldp	x9, x10, [%[b]], #16\n\t"
1676         "adcs	x4, x4, x8\n\t"
1677         "adcs	x5, x5, x9\n\t"
1678         "stp	x3, x4, [%[r]], #16\n\t"
1679         "adcs	x6, x6, x10\n\t"
1680         "stp	x5, x6, [%[r]], #16\n\t"
1681         "cset	%[c], cs\n\t"
1682         "cmp	%[a], x11\n\t"
1683         "b.ne	1b\n\t"
1684         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
1685         :
1686         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
1687     );
1688 
1689     return c;
1690 }
1691 
1692 #endif /* WOLFSSL_SP_SMALL */
1693 #ifdef WOLFSSL_SP_SMALL
1694 /* Sub b from a into a. (a -= b)
1695  *
1696  * a  A single precision integer.
1697  * b  A single precision integer.
1698  */
sp_2048_sub_in_place_32(sp_digit * a,const sp_digit * b)1699 static sp_digit sp_2048_sub_in_place_32(sp_digit* a, const sp_digit* b)
1700 {
1701     sp_digit c = 0;
1702 
1703     __asm__ __volatile__ (
1704         "add	x10, %[a], 256\n\t"
1705         "\n1:\n\t"
1706         "subs	%[c], xzr, %[c]\n\t"
1707         "ldp	x2, x3, [%[a]]\n\t"
1708         "ldp	x4, x5, [%[a], #16]\n\t"
1709         "ldp	x6, x7, [%[b]], #16\n\t"
1710         "sbcs	x2, x2, x6\n\t"
1711         "ldp	x8, x9, [%[b]], #16\n\t"
1712         "sbcs	x3, x3, x7\n\t"
1713         "sbcs	x4, x4, x8\n\t"
1714         "stp	x2, x3, [%[a]], #16\n\t"
1715         "sbcs	x5, x5, x9\n\t"
1716         "stp	x4, x5, [%[a]], #16\n\t"
1717         "csetm	%[c], cc\n\t"
1718         "cmp	%[a], x10\n\t"
1719         "b.ne	1b\n\t"
1720         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
1721         :
1722         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
1723     );
1724 
1725     return c;
1726 }
1727 
1728 #endif /* WOLFSSL_SP_SMALL */
1729 #ifdef WOLFSSL_SP_SMALL
1730 /* Multiply a and b into r. (r = a * b)
1731  *
1732  * r  A single precision integer.
1733  * a  A single precision integer.
1734  * b  A single precision integer.
1735  */
sp_2048_mul_32(sp_digit * r,const sp_digit * a,const sp_digit * b)1736 static void sp_2048_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b)
1737 {
1738     sp_digit tmp[64];
1739 
1740     __asm__ __volatile__ (
1741         "mov	x5, 0\n\t"
1742         "mov	x6, 0\n\t"
1743         "mov	x7, 0\n\t"
1744         "mov	x8, 0\n\t"
1745         "\n1:\n\t"
1746         "subs	x3, x5, 248\n\t"
1747         "csel	x3, xzr, x3, cc\n\t"
1748         "sub	x4, x5, x3\n\t"
1749         "\n2:\n\t"
1750         "ldr	x10, [%[a], x3]\n\t"
1751         "ldr	x11, [%[b], x4]\n\t"
1752         "mul	x9, x10, x11\n\t"
1753         "umulh	x10, x10, x11\n\t"
1754         "adds	x6, x6, x9\n\t"
1755         "adcs	x7, x7, x10\n\t"
1756         "adc	x8, x8, xzr\n\t"
1757         "add	x3, x3, #8\n\t"
1758         "sub	x4, x4, #8\n\t"
1759         "cmp	x3, 256\n\t"
1760         "b.eq	3f\n\t"
1761         "cmp	x3, x5\n\t"
1762         "b.le	2b\n\t"
1763         "\n3:\n\t"
1764         "str	x6, [%[r], x5]\n\t"
1765         "mov	x6, x7\n\t"
1766         "mov	x7, x8\n\t"
1767         "mov	x8, #0\n\t"
1768         "add	x5, x5, #8\n\t"
1769         "cmp	x5, 496\n\t"
1770         "b.le	1b\n\t"
1771         "str	x6, [%[r], x5]\n\t"
1772         :
1773         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
1774         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
1775     );
1776 
1777     XMEMCPY(r, tmp, sizeof(tmp));
1778 }
1779 
1780 /* Square a and put result in r. (r = a * a)
1781  *
1782  * r  A single precision integer.
1783  * a  A single precision integer.
1784  */
sp_2048_sqr_32(sp_digit * r,const sp_digit * a)1785 static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
1786 {
1787     sp_digit tmp[64];
1788 
1789     __asm__ __volatile__ (
1790         "mov	x6, 0\n\t"
1791         "mov	x7, 0\n\t"
1792         "mov	x8, 0\n\t"
1793         "mov	x5, 0\n\t"
1794         "\n1:\n\t"
1795         "subs	x3, x5, 248\n\t"
1796         "csel	x3, xzr, x3, cc\n\t"
1797         "sub	x4, x5, x3\n\t"
1798         "\n2:\n\t"
1799         "cmp	x4, x3\n\t"
1800         "b.eq	4f\n\t"
1801         "ldr	x10, [%[a], x3]\n\t"
1802         "ldr	x11, [%[a], x4]\n\t"
1803         "mul	x9, x10, x11\n\t"
1804         "umulh	x10, x10, x11\n\t"
1805         "adds	x6, x6, x9\n\t"
1806         "adcs	x7, x7, x10\n\t"
1807         "adc	x8, x8, xzr\n\t"
1808         "adds	x6, x6, x9\n\t"
1809         "adcs	x7, x7, x10\n\t"
1810         "adc	x8, x8, xzr\n\t"
1811         "b.al	5f\n\t"
1812         "\n4:\n\t"
1813         "ldr	x10, [%[a], x3]\n\t"
1814         "mul	x9, x10, x10\n\t"
1815         "umulh	x10, x10, x10\n\t"
1816         "adds	x6, x6, x9\n\t"
1817         "adcs	x7, x7, x10\n\t"
1818         "adc	x8, x8, xzr\n\t"
1819         "\n5:\n\t"
1820         "add	x3, x3, #8\n\t"
1821         "sub	x4, x4, #8\n\t"
1822         "cmp	x3, 256\n\t"
1823         "b.eq	3f\n\t"
1824         "cmp	x3, x4\n\t"
1825         "b.gt	3f\n\t"
1826         "cmp	x3, x5\n\t"
1827         "b.le	2b\n\t"
1828         "\n3:\n\t"
1829         "str	x6, [%[r], x5]\n\t"
1830         "mov	x6, x7\n\t"
1831         "mov	x7, x8\n\t"
1832         "mov	x8, #0\n\t"
1833         "add	x5, x5, #8\n\t"
1834         "cmp	x5, 496\n\t"
1835         "b.le	1b\n\t"
1836         "str	x6, [%[r], x5]\n\t"
1837         :
1838         : [r] "r" (tmp), [a] "r" (a)
1839         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
1840     );
1841 
1842     XMEMCPY(r, tmp, sizeof(tmp));
1843 }
1844 
1845 #endif /* WOLFSSL_SP_SMALL */
1846 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
1847 #ifdef WOLFSSL_SP_SMALL
1848 /* AND m into each word of a and store in r.
1849  *
1850  * r  A single precision integer.
1851  * a  A single precision integer.
1852  * m  Mask to AND against each digit.
1853  */
sp_2048_mask_16(sp_digit * r,const sp_digit * a,sp_digit m)1854 static void sp_2048_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
1855 {
1856     int i;
1857 
1858     for (i=0; i<16; i++) {
1859         r[i] = a[i] & m;
1860     }
1861 }
1862 
1863 #endif /* WOLFSSL_SP_SMALL */
1864 #ifdef WOLFSSL_SP_SMALL
1865 /* Add b to a into r. (r = a + b)
1866  *
1867  * r  A single precision integer.
1868  * a  A single precision integer.
1869  * b  A single precision integer.
1870  */
sp_2048_add_16(sp_digit * r,const sp_digit * a,const sp_digit * b)1871 static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a,
1872         const sp_digit* b)
1873 {
1874     sp_digit c = 0;
1875 
1876     __asm__ __volatile__ (
1877         "add	x11, %[a], 128\n\t"
1878         "\n1:\n\t"
1879         "adds	%[c], %[c], #-1\n\t"
1880         "ldp	x3, x4, [%[a]], #16\n\t"
1881         "ldp	x5, x6, [%[a]], #16\n\t"
1882         "ldp	x7, x8, [%[b]], #16\n\t"
1883         "adcs	x3, x3, x7\n\t"
1884         "ldp	x9, x10, [%[b]], #16\n\t"
1885         "adcs	x4, x4, x8\n\t"
1886         "adcs	x5, x5, x9\n\t"
1887         "stp	x3, x4, [%[r]], #16\n\t"
1888         "adcs	x6, x6, x10\n\t"
1889         "stp	x5, x6, [%[r]], #16\n\t"
1890         "cset	%[c], cs\n\t"
1891         "cmp	%[a], x11\n\t"
1892         "b.ne	1b\n\t"
1893         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
1894         :
1895         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
1896     );
1897 
1898     return c;
1899 }
1900 
1901 #endif /* WOLFSSL_SP_SMALL */
1902 #ifdef WOLFSSL_SP_SMALL
1903 /* Sub b from a into a. (a -= b)
1904  *
1905  * a  A single precision integer.
1906  * b  A single precision integer.
1907  */
sp_2048_sub_in_place_16(sp_digit * a,const sp_digit * b)1908 static sp_digit sp_2048_sub_in_place_16(sp_digit* a, const sp_digit* b)
1909 {
1910     sp_digit c = 0;
1911 
1912     __asm__ __volatile__ (
1913         "add	x10, %[a], 128\n\t"
1914         "\n1:\n\t"
1915         "subs	%[c], xzr, %[c]\n\t"
1916         "ldp	x2, x3, [%[a]]\n\t"
1917         "ldp	x4, x5, [%[a], #16]\n\t"
1918         "ldp	x6, x7, [%[b]], #16\n\t"
1919         "sbcs	x2, x2, x6\n\t"
1920         "ldp	x8, x9, [%[b]], #16\n\t"
1921         "sbcs	x3, x3, x7\n\t"
1922         "sbcs	x4, x4, x8\n\t"
1923         "stp	x2, x3, [%[a]], #16\n\t"
1924         "sbcs	x5, x5, x9\n\t"
1925         "stp	x4, x5, [%[a]], #16\n\t"
1926         "csetm	%[c], cc\n\t"
1927         "cmp	%[a], x10\n\t"
1928         "b.ne	1b\n\t"
1929         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
1930         :
1931         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
1932     );
1933 
1934     return c;
1935 }
1936 
1937 #endif /* WOLFSSL_SP_SMALL */
1938 #ifdef WOLFSSL_SP_SMALL
1939 /* Multiply a and b into r. (r = a * b)
1940  *
1941  * r  A single precision integer.
1942  * a  A single precision integer.
1943  * b  A single precision integer.
1944  */
sp_2048_mul_16(sp_digit * r,const sp_digit * a,const sp_digit * b)1945 static void sp_2048_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b)
1946 {
1947     sp_digit tmp[32];
1948 
1949     __asm__ __volatile__ (
1950         "mov	x5, 0\n\t"
1951         "mov	x6, 0\n\t"
1952         "mov	x7, 0\n\t"
1953         "mov	x8, 0\n\t"
1954         "\n1:\n\t"
1955         "subs	x3, x5, 120\n\t"
1956         "csel	x3, xzr, x3, cc\n\t"
1957         "sub	x4, x5, x3\n\t"
1958         "\n2:\n\t"
1959         "ldr	x10, [%[a], x3]\n\t"
1960         "ldr	x11, [%[b], x4]\n\t"
1961         "mul	x9, x10, x11\n\t"
1962         "umulh	x10, x10, x11\n\t"
1963         "adds	x6, x6, x9\n\t"
1964         "adcs	x7, x7, x10\n\t"
1965         "adc	x8, x8, xzr\n\t"
1966         "add	x3, x3, #8\n\t"
1967         "sub	x4, x4, #8\n\t"
1968         "cmp	x3, 128\n\t"
1969         "b.eq	3f\n\t"
1970         "cmp	x3, x5\n\t"
1971         "b.le	2b\n\t"
1972         "\n3:\n\t"
1973         "str	x6, [%[r], x5]\n\t"
1974         "mov	x6, x7\n\t"
1975         "mov	x7, x8\n\t"
1976         "mov	x8, #0\n\t"
1977         "add	x5, x5, #8\n\t"
1978         "cmp	x5, 240\n\t"
1979         "b.le	1b\n\t"
1980         "str	x6, [%[r], x5]\n\t"
1981         :
1982         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
1983         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
1984     );
1985 
1986     XMEMCPY(r, tmp, sizeof(tmp));
1987 }
1988 
1989 /* Square a and put result in r. (r = a * a)
1990  *
1991  * r  A single precision integer.
1992  * a  A single precision integer.
1993  */
sp_2048_sqr_16(sp_digit * r,const sp_digit * a)1994 static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
1995 {
1996     sp_digit tmp[32];
1997 
1998     __asm__ __volatile__ (
1999         "mov	x6, 0\n\t"
2000         "mov	x7, 0\n\t"
2001         "mov	x8, 0\n\t"
2002         "mov	x5, 0\n\t"
2003         "\n1:\n\t"
2004         "subs	x3, x5, 120\n\t"
2005         "csel	x3, xzr, x3, cc\n\t"
2006         "sub	x4, x5, x3\n\t"
2007         "\n2:\n\t"
2008         "cmp	x4, x3\n\t"
2009         "b.eq	4f\n\t"
2010         "ldr	x10, [%[a], x3]\n\t"
2011         "ldr	x11, [%[a], x4]\n\t"
2012         "mul	x9, x10, x11\n\t"
2013         "umulh	x10, x10, x11\n\t"
2014         "adds	x6, x6, x9\n\t"
2015         "adcs	x7, x7, x10\n\t"
2016         "adc	x8, x8, xzr\n\t"
2017         "adds	x6, x6, x9\n\t"
2018         "adcs	x7, x7, x10\n\t"
2019         "adc	x8, x8, xzr\n\t"
2020         "b.al	5f\n\t"
2021         "\n4:\n\t"
2022         "ldr	x10, [%[a], x3]\n\t"
2023         "mul	x9, x10, x10\n\t"
2024         "umulh	x10, x10, x10\n\t"
2025         "adds	x6, x6, x9\n\t"
2026         "adcs	x7, x7, x10\n\t"
2027         "adc	x8, x8, xzr\n\t"
2028         "\n5:\n\t"
2029         "add	x3, x3, #8\n\t"
2030         "sub	x4, x4, #8\n\t"
2031         "cmp	x3, 128\n\t"
2032         "b.eq	3f\n\t"
2033         "cmp	x3, x4\n\t"
2034         "b.gt	3f\n\t"
2035         "cmp	x3, x5\n\t"
2036         "b.le	2b\n\t"
2037         "\n3:\n\t"
2038         "str	x6, [%[r], x5]\n\t"
2039         "mov	x6, x7\n\t"
2040         "mov	x7, x8\n\t"
2041         "mov	x8, #0\n\t"
2042         "add	x5, x5, #8\n\t"
2043         "cmp	x5, 240\n\t"
2044         "b.le	1b\n\t"
2045         "str	x6, [%[r], x5]\n\t"
2046         :
2047         : [r] "r" (tmp), [a] "r" (a)
2048         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
2049     );
2050 
2051     XMEMCPY(r, tmp, sizeof(tmp));
2052 }
2053 
2054 #endif /* WOLFSSL_SP_SMALL */
2055 #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
2056 
2057 /* Caclulate the bottom digit of -1/a mod 2^n.
2058  *
2059  * a    A single precision number.
2060  * rho  Bottom word of inverse.
2061  */
sp_2048_mont_setup(const sp_digit * a,sp_digit * rho)2062 static void sp_2048_mont_setup(const sp_digit* a, sp_digit* rho)
2063 {
2064     sp_digit x;
2065     sp_digit b;
2066 
2067     b = a[0];
2068     x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
2069     x *= 2 - b * x;               /* here x*a==1 mod 2**8 */
2070     x *= 2 - b * x;               /* here x*a==1 mod 2**16 */
2071     x *= 2 - b * x;               /* here x*a==1 mod 2**32 */
2072     x *= 2 - b * x;               /* here x*a==1 mod 2**64 */
2073 
2074     /* rho = -1/m mod b */
2075     *rho = (sp_digit)0 - x;
2076 }
2077 
2078 /* Mul a by digit b into r. (r = a * b)
2079  *
2080  * r  A single precision integer.
2081  * a  A single precision integer.
2082  * b  A single precision digit.
2083  */
sp_2048_mul_d_32(sp_digit * r,const sp_digit * a,sp_digit b)2084 static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a,
2085         sp_digit b)
2086 {
2087 #ifdef WOLFSSL_SP_SMALL
2088     __asm__ __volatile__ (
2089         "# A[0] * B\n\t"
2090         "ldr	x8, [%[a]]\n\t"
2091         "mul	x5, %[b], x8\n\t"
2092         "umulh	x3, %[b], x8\n\t"
2093         "mov	x4, 0\n\t"
2094         "str	x5, [%[r]]\n\t"
2095         "mov	x5, 0\n\t"
2096         "mov	x9, #8\n\t"
2097         "1:\n\t"
2098         "ldr	x8, [%[a], x9]\n\t"
2099         "mul	x6, %[b], x8\n\t"
2100         "umulh	x7, %[b], x8\n\t"
2101         "adds	x3, x3, x6\n\t"
2102         "adcs	x4, x4, x7\n\t"
2103         "adc	x5, xzr, xzr\n\t"
2104         "str	x3, [%[r], x9]\n\t"
2105         "mov	x3, x4\n\t"
2106         "mov	x4, x5\n\t"
2107         "mov	x5, #0\n\t"
2108         "add	x9, x9, #8\n\t"
2109         "cmp	x9, 256\n\t"
2110         "b.lt	1b\n\t"
2111         "str	x3, [%[r], 256]\n\t"
2112         :
2113         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
2114         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
2115     );
2116 #else
2117     __asm__ __volatile__ (
2118         "# A[0] * B\n\t"
2119         "ldp	x8, x9, [%[a]]\n\t"
2120         "mul	x3, %[b], x8\n\t"
2121         "umulh	x4, %[b], x8\n\t"
2122         "mov	x5, 0\n\t"
2123         "# A[1] * B\n\t"
2124         "str	x3, [%[r]]\n\t"
2125         "mov	x3, 0\n\t"
2126         "mul	x6, %[b], x9\n\t"
2127         "umulh	x7, %[b], x9\n\t"
2128         "adds	x4, x4, x6\n\t"
2129         "# A[2] * B\n\t"
2130         "ldp	x8, x9, [%[a], 16]\n\t"
2131         "str	x4, [%[r], 8]\n\t"
2132         "mov	x4, 0\n\t"
2133         "mul	x6, %[b], x8\n\t"
2134         "adcs	x5, x5, x7\n\t"
2135         "umulh	x7, %[b], x8\n\t"
2136         "adc	x3, xzr, xzr\n\t"
2137         "adds	x5, x5, x6\n\t"
2138         "# A[3] * B\n\t"
2139         "str	x5, [%[r], 16]\n\t"
2140         "mov	x5, 0\n\t"
2141         "mul	x6, %[b], x9\n\t"
2142         "adcs	x3, x3, x7\n\t"
2143         "umulh	x7, %[b], x9\n\t"
2144         "adc	x4, xzr, xzr\n\t"
2145         "adds	x3, x3, x6\n\t"
2146         "# A[4] * B\n\t"
2147         "ldp	x8, x9, [%[a], 32]\n\t"
2148         "str	x3, [%[r], 24]\n\t"
2149         "mov	x3, 0\n\t"
2150         "mul	x6, %[b], x8\n\t"
2151         "adcs	x4, x4, x7\n\t"
2152         "umulh	x7, %[b], x8\n\t"
2153         "adc	x5, xzr, xzr\n\t"
2154         "adds	x4, x4, x6\n\t"
2155         "# A[5] * B\n\t"
2156         "str	x4, [%[r], 32]\n\t"
2157         "mov	x4, 0\n\t"
2158         "mul	x6, %[b], x9\n\t"
2159         "adcs	x5, x5, x7\n\t"
2160         "umulh	x7, %[b], x9\n\t"
2161         "adc	x3, xzr, xzr\n\t"
2162         "adds	x5, x5, x6\n\t"
2163         "# A[6] * B\n\t"
2164         "ldp	x8, x9, [%[a], 48]\n\t"
2165         "str	x5, [%[r], 40]\n\t"
2166         "mov	x5, 0\n\t"
2167         "mul	x6, %[b], x8\n\t"
2168         "adcs	x3, x3, x7\n\t"
2169         "umulh	x7, %[b], x8\n\t"
2170         "adc	x4, xzr, xzr\n\t"
2171         "adds	x3, x3, x6\n\t"
2172         "# A[7] * B\n\t"
2173         "str	x3, [%[r], 48]\n\t"
2174         "mov	x3, 0\n\t"
2175         "mul	x6, %[b], x9\n\t"
2176         "adcs	x4, x4, x7\n\t"
2177         "umulh	x7, %[b], x9\n\t"
2178         "adc	x5, xzr, xzr\n\t"
2179         "adds	x4, x4, x6\n\t"
2180         "# A[8] * B\n\t"
2181         "ldp	x8, x9, [%[a], 64]\n\t"
2182         "str	x4, [%[r], 56]\n\t"
2183         "mov	x4, 0\n\t"
2184         "mul	x6, %[b], x8\n\t"
2185         "adcs	x5, x5, x7\n\t"
2186         "umulh	x7, %[b], x8\n\t"
2187         "adc	x3, xzr, xzr\n\t"
2188         "adds	x5, x5, x6\n\t"
2189         "# A[9] * B\n\t"
2190         "str	x5, [%[r], 64]\n\t"
2191         "mov	x5, 0\n\t"
2192         "mul	x6, %[b], x9\n\t"
2193         "adcs	x3, x3, x7\n\t"
2194         "umulh	x7, %[b], x9\n\t"
2195         "adc	x4, xzr, xzr\n\t"
2196         "adds	x3, x3, x6\n\t"
2197         "# A[10] * B\n\t"
2198         "ldp	x8, x9, [%[a], 80]\n\t"
2199         "str	x3, [%[r], 72]\n\t"
2200         "mov	x3, 0\n\t"
2201         "mul	x6, %[b], x8\n\t"
2202         "adcs	x4, x4, x7\n\t"
2203         "umulh	x7, %[b], x8\n\t"
2204         "adc	x5, xzr, xzr\n\t"
2205         "adds	x4, x4, x6\n\t"
2206         "# A[11] * B\n\t"
2207         "str	x4, [%[r], 80]\n\t"
2208         "mov	x4, 0\n\t"
2209         "mul	x6, %[b], x9\n\t"
2210         "adcs	x5, x5, x7\n\t"
2211         "umulh	x7, %[b], x9\n\t"
2212         "adc	x3, xzr, xzr\n\t"
2213         "adds	x5, x5, x6\n\t"
2214         "# A[12] * B\n\t"
2215         "ldp	x8, x9, [%[a], 96]\n\t"
2216         "str	x5, [%[r], 88]\n\t"
2217         "mov	x5, 0\n\t"
2218         "mul	x6, %[b], x8\n\t"
2219         "adcs	x3, x3, x7\n\t"
2220         "umulh	x7, %[b], x8\n\t"
2221         "adc	x4, xzr, xzr\n\t"
2222         "adds	x3, x3, x6\n\t"
2223         "# A[13] * B\n\t"
2224         "str	x3, [%[r], 96]\n\t"
2225         "mov	x3, 0\n\t"
2226         "mul	x6, %[b], x9\n\t"
2227         "adcs	x4, x4, x7\n\t"
2228         "umulh	x7, %[b], x9\n\t"
2229         "adc	x5, xzr, xzr\n\t"
2230         "adds	x4, x4, x6\n\t"
2231         "# A[14] * B\n\t"
2232         "ldp	x8, x9, [%[a], 112]\n\t"
2233         "str	x4, [%[r], 104]\n\t"
2234         "mov	x4, 0\n\t"
2235         "mul	x6, %[b], x8\n\t"
2236         "adcs	x5, x5, x7\n\t"
2237         "umulh	x7, %[b], x8\n\t"
2238         "adc	x3, xzr, xzr\n\t"
2239         "adds	x5, x5, x6\n\t"
2240         "# A[15] * B\n\t"
2241         "str	x5, [%[r], 112]\n\t"
2242         "mov	x5, 0\n\t"
2243         "mul	x6, %[b], x9\n\t"
2244         "adcs	x3, x3, x7\n\t"
2245         "umulh	x7, %[b], x9\n\t"
2246         "adc	x4, xzr, xzr\n\t"
2247         "adds	x3, x3, x6\n\t"
2248         "# A[16] * B\n\t"
2249         "ldp	x8, x9, [%[a], 128]\n\t"
2250         "str	x3, [%[r], 120]\n\t"
2251         "mov	x3, 0\n\t"
2252         "mul	x6, %[b], x8\n\t"
2253         "adcs	x4, x4, x7\n\t"
2254         "umulh	x7, %[b], x8\n\t"
2255         "adc	x5, xzr, xzr\n\t"
2256         "adds	x4, x4, x6\n\t"
2257         "# A[17] * B\n\t"
2258         "str	x4, [%[r], 128]\n\t"
2259         "mov	x4, 0\n\t"
2260         "mul	x6, %[b], x9\n\t"
2261         "adcs	x5, x5, x7\n\t"
2262         "umulh	x7, %[b], x9\n\t"
2263         "adc	x3, xzr, xzr\n\t"
2264         "adds	x5, x5, x6\n\t"
2265         "# A[18] * B\n\t"
2266         "ldp	x8, x9, [%[a], 144]\n\t"
2267         "str	x5, [%[r], 136]\n\t"
2268         "mov	x5, 0\n\t"
2269         "mul	x6, %[b], x8\n\t"
2270         "adcs	x3, x3, x7\n\t"
2271         "umulh	x7, %[b], x8\n\t"
2272         "adc	x4, xzr, xzr\n\t"
2273         "adds	x3, x3, x6\n\t"
2274         "# A[19] * B\n\t"
2275         "str	x3, [%[r], 144]\n\t"
2276         "mov	x3, 0\n\t"
2277         "mul	x6, %[b], x9\n\t"
2278         "adcs	x4, x4, x7\n\t"
2279         "umulh	x7, %[b], x9\n\t"
2280         "adc	x5, xzr, xzr\n\t"
2281         "adds	x4, x4, x6\n\t"
2282         "# A[20] * B\n\t"
2283         "ldp	x8, x9, [%[a], 160]\n\t"
2284         "str	x4, [%[r], 152]\n\t"
2285         "mov	x4, 0\n\t"
2286         "mul	x6, %[b], x8\n\t"
2287         "adcs	x5, x5, x7\n\t"
2288         "umulh	x7, %[b], x8\n\t"
2289         "adc	x3, xzr, xzr\n\t"
2290         "adds	x5, x5, x6\n\t"
2291         "# A[21] * B\n\t"
2292         "str	x5, [%[r], 160]\n\t"
2293         "mov	x5, 0\n\t"
2294         "mul	x6, %[b], x9\n\t"
2295         "adcs	x3, x3, x7\n\t"
2296         "umulh	x7, %[b], x9\n\t"
2297         "adc	x4, xzr, xzr\n\t"
2298         "adds	x3, x3, x6\n\t"
2299         "# A[22] * B\n\t"
2300         "ldp	x8, x9, [%[a], 176]\n\t"
2301         "str	x3, [%[r], 168]\n\t"
2302         "mov	x3, 0\n\t"
2303         "mul	x6, %[b], x8\n\t"
2304         "adcs	x4, x4, x7\n\t"
2305         "umulh	x7, %[b], x8\n\t"
2306         "adc	x5, xzr, xzr\n\t"
2307         "adds	x4, x4, x6\n\t"
2308         "# A[23] * B\n\t"
2309         "str	x4, [%[r], 176]\n\t"
2310         "mov	x4, 0\n\t"
2311         "mul	x6, %[b], x9\n\t"
2312         "adcs	x5, x5, x7\n\t"
2313         "umulh	x7, %[b], x9\n\t"
2314         "adc	x3, xzr, xzr\n\t"
2315         "adds	x5, x5, x6\n\t"
2316         "# A[24] * B\n\t"
2317         "ldp	x8, x9, [%[a], 192]\n\t"
2318         "str	x5, [%[r], 184]\n\t"
2319         "mov	x5, 0\n\t"
2320         "mul	x6, %[b], x8\n\t"
2321         "adcs	x3, x3, x7\n\t"
2322         "umulh	x7, %[b], x8\n\t"
2323         "adc	x4, xzr, xzr\n\t"
2324         "adds	x3, x3, x6\n\t"
2325         "# A[25] * B\n\t"
2326         "str	x3, [%[r], 192]\n\t"
2327         "mov	x3, 0\n\t"
2328         "mul	x6, %[b], x9\n\t"
2329         "adcs	x4, x4, x7\n\t"
2330         "umulh	x7, %[b], x9\n\t"
2331         "adc	x5, xzr, xzr\n\t"
2332         "adds	x4, x4, x6\n\t"
2333         "# A[26] * B\n\t"
2334         "ldp	x8, x9, [%[a], 208]\n\t"
2335         "str	x4, [%[r], 200]\n\t"
2336         "mov	x4, 0\n\t"
2337         "mul	x6, %[b], x8\n\t"
2338         "adcs	x5, x5, x7\n\t"
2339         "umulh	x7, %[b], x8\n\t"
2340         "adc	x3, xzr, xzr\n\t"
2341         "adds	x5, x5, x6\n\t"
2342         "# A[27] * B\n\t"
2343         "str	x5, [%[r], 208]\n\t"
2344         "mov	x5, 0\n\t"
2345         "mul	x6, %[b], x9\n\t"
2346         "adcs	x3, x3, x7\n\t"
2347         "umulh	x7, %[b], x9\n\t"
2348         "adc	x4, xzr, xzr\n\t"
2349         "adds	x3, x3, x6\n\t"
2350         "# A[28] * B\n\t"
2351         "ldp	x8, x9, [%[a], 224]\n\t"
2352         "str	x3, [%[r], 216]\n\t"
2353         "mov	x3, 0\n\t"
2354         "mul	x6, %[b], x8\n\t"
2355         "adcs	x4, x4, x7\n\t"
2356         "umulh	x7, %[b], x8\n\t"
2357         "adc	x5, xzr, xzr\n\t"
2358         "adds	x4, x4, x6\n\t"
2359         "# A[29] * B\n\t"
2360         "str	x4, [%[r], 224]\n\t"
2361         "mov	x4, 0\n\t"
2362         "mul	x6, %[b], x9\n\t"
2363         "adcs	x5, x5, x7\n\t"
2364         "umulh	x7, %[b], x9\n\t"
2365         "adc	x3, xzr, xzr\n\t"
2366         "adds	x5, x5, x6\n\t"
2367         "# A[30] * B\n\t"
2368         "ldp	x8, x9, [%[a], 240]\n\t"
2369         "str	x5, [%[r], 232]\n\t"
2370         "mov	x5, 0\n\t"
2371         "mul	x6, %[b], x8\n\t"
2372         "adcs	x3, x3, x7\n\t"
2373         "umulh	x7, %[b], x8\n\t"
2374         "adc	x4, xzr, xzr\n\t"
2375         "adds	x3, x3, x6\n\t"
2376         "# A[31] * B\n\t"
2377         "str	x3, [%[r], 240]\n\t"
2378         "mul	x6, %[b], x9\n\t"
2379         "adcs	x4, x4, x7\n\t"
2380         "umulh	x7, %[b], x9\n\t"
2381         "adc	x5, xzr, xzr\n\t"
2382         "adds	x4, x4, x6\n\t"
2383         "adc	x5, x5, x7\n\t"
2384         "stp	x4, x5, [%[r], 248]\n\t"
2385         :
2386         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
2387         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
2388     );
2389 #endif
2390 }
2391 
2392 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
2393 /* r = 2^n mod m where n is the number of bits to reduce by.
2394  * Given m must be 2048 bits, just need to subtract.
2395  *
2396  * r  A single precision number.
2397  * m  A single precision number.
2398  */
sp_2048_mont_norm_16(sp_digit * r,const sp_digit * m)2399 static void sp_2048_mont_norm_16(sp_digit* r, const sp_digit* m)
2400 {
2401     XMEMSET(r, 0, sizeof(sp_digit) * 16);
2402 
2403     /* r = 2^n mod m */
2404     sp_2048_sub_in_place_16(r, m);
2405 }
2406 
2407 /* Reduce the number back to 2048 bits using Montgomery reduction.
2408  *
2409  * a   A single precision number to reduce in place.
2410  * m   The single precision number representing the modulus.
2411  * mp  The digit representing the negative inverse of m mod 2^n.
2412  */
sp_2048_mont_reduce_16(sp_digit * a,const sp_digit * m,sp_digit mp)2413 SP_NOINLINE static void sp_2048_mont_reduce_16(sp_digit* a, const sp_digit* m,
2414         sp_digit mp)
2415 {
2416 
2417     __asm__ __volatile__ (
2418         "ldp	x14, x15, [%[m], 0]\n\t"
2419         "ldp	x16, x17, [%[m], 16]\n\t"
2420         "ldp	x19, x20, [%[m], 32]\n\t"
2421         "ldp	x21, x22, [%[m], 48]\n\t"
2422         "ldp	x23, x24, [%[m], 64]\n\t"
2423         "ldp	x25, x26, [%[m], 80]\n\t"
2424         "ldp	x27, x28, [%[m], 96]\n\t"
2425         "mov	x3, xzr\n\t"
2426         "# i = 16\n\t"
2427         "mov	x4, 16\n\t"
2428         "ldp	x12, x13, [%[a], 0]\n\t"
2429         "\n1:\n\t"
2430         "# mu = a[i] * mp\n\t"
2431         "mul	x9, %[mp], x12\n\t"
2432         "# a[i+0] += m[0] * mu\n\t"
2433         "mul	x7, x14, x9\n\t"
2434         "umulh	x8, x14, x9\n\t"
2435         "adds	x12, x12, x7\n\t"
2436         "# a[i+1] += m[1] * mu\n\t"
2437         "mul	x7, x15, x9\n\t"
2438         "adc	x6, x8, xzr\n\t"
2439         "umulh	x8, x15, x9\n\t"
2440         "adds	x12, x13, x7\n\t"
2441         "# a[i+2] += m[2] * mu\n\t"
2442         "ldr	x13, [%[a], 16]\n\t"
2443         "adc	x5, x8, xzr\n\t"
2444         "mul	x7, x16, x9\n\t"
2445         "adds	x12, x12, x6\n\t"
2446         "umulh	x8, x16, x9\n\t"
2447         "adc	x5, x5, xzr\n\t"
2448         "adds	x13, x13, x7\n\t"
2449         "# a[i+3] += m[3] * mu\n\t"
2450         "ldr	x10, [%[a], 24]\n\t"
2451         "adc	x6, x8, xzr\n\t"
2452         "mul	x7, x17, x9\n\t"
2453         "adds	x13, x13, x5\n\t"
2454         "umulh	x8, x17, x9\n\t"
2455         "adc	x6, x6, xzr\n\t"
2456         "adds	x10, x10, x7\n\t"
2457         "# a[i+4] += m[4] * mu\n\t"
2458         "ldr	x11, [%[a], 32]\n\t"
2459         "adc	x5, x8, xzr\n\t"
2460         "adds	x10, x10, x6\n\t"
2461         "mul	x7, x19, x9\n\t"
2462         "adc	x5, x5, xzr\n\t"
2463         "umulh	x8, x19, x9\n\t"
2464         "str	x10, [%[a], 24]\n\t"
2465         "adds	x11, x11, x7\n\t"
2466         "# a[i+5] += m[5] * mu\n\t"
2467         "ldr	x10, [%[a], 40]\n\t"
2468         "adc	x6, x8, xzr\n\t"
2469         "adds	x11, x11, x5\n\t"
2470         "mul	x7, x20, x9\n\t"
2471         "adc	x6, x6, xzr\n\t"
2472         "umulh	x8, x20, x9\n\t"
2473         "str	x11, [%[a], 32]\n\t"
2474         "adds	x10, x10, x7\n\t"
2475         "# a[i+6] += m[6] * mu\n\t"
2476         "ldr	x11, [%[a], 48]\n\t"
2477         "adc	x5, x8, xzr\n\t"
2478         "adds	x10, x10, x6\n\t"
2479         "mul	x7, x21, x9\n\t"
2480         "adc	x5, x5, xzr\n\t"
2481         "umulh	x8, x21, x9\n\t"
2482         "str	x10, [%[a], 40]\n\t"
2483         "adds	x11, x11, x7\n\t"
2484         "# a[i+7] += m[7] * mu\n\t"
2485         "ldr	x10, [%[a], 56]\n\t"
2486         "adc	x6, x8, xzr\n\t"
2487         "adds	x11, x11, x5\n\t"
2488         "mul	x7, x22, x9\n\t"
2489         "adc	x6, x6, xzr\n\t"
2490         "umulh	x8, x22, x9\n\t"
2491         "str	x11, [%[a], 48]\n\t"
2492         "adds	x10, x10, x7\n\t"
2493         "# a[i+8] += m[8] * mu\n\t"
2494         "ldr	x11, [%[a], 64]\n\t"
2495         "adc	x5, x8, xzr\n\t"
2496         "adds	x10, x10, x6\n\t"
2497         "mul	x7, x23, x9\n\t"
2498         "adc	x5, x5, xzr\n\t"
2499         "umulh	x8, x23, x9\n\t"
2500         "str	x10, [%[a], 56]\n\t"
2501         "adds	x11, x11, x7\n\t"
2502         "# a[i+9] += m[9] * mu\n\t"
2503         "ldr	x10, [%[a], 72]\n\t"
2504         "adc	x6, x8, xzr\n\t"
2505         "adds	x11, x11, x5\n\t"
2506         "mul	x7, x24, x9\n\t"
2507         "adc	x6, x6, xzr\n\t"
2508         "umulh	x8, x24, x9\n\t"
2509         "str	x11, [%[a], 64]\n\t"
2510         "adds	x10, x10, x7\n\t"
2511         "# a[i+10] += m[10] * mu\n\t"
2512         "ldr	x11, [%[a], 80]\n\t"
2513         "adc	x5, x8, xzr\n\t"
2514         "adds	x10, x10, x6\n\t"
2515         "mul	x7, x25, x9\n\t"
2516         "adc	x5, x5, xzr\n\t"
2517         "umulh	x8, x25, x9\n\t"
2518         "str	x10, [%[a], 72]\n\t"
2519         "adds	x11, x11, x7\n\t"
2520         "# a[i+11] += m[11] * mu\n\t"
2521         "ldr	x10, [%[a], 88]\n\t"
2522         "adc	x6, x8, xzr\n\t"
2523         "adds	x11, x11, x5\n\t"
2524         "mul	x7, x26, x9\n\t"
2525         "adc	x6, x6, xzr\n\t"
2526         "umulh	x8, x26, x9\n\t"
2527         "str	x11, [%[a], 80]\n\t"
2528         "adds	x10, x10, x7\n\t"
2529         "# a[i+12] += m[12] * mu\n\t"
2530         "ldr	x11, [%[a], 96]\n\t"
2531         "adc	x5, x8, xzr\n\t"
2532         "adds	x10, x10, x6\n\t"
2533         "mul	x7, x27, x9\n\t"
2534         "adc	x5, x5, xzr\n\t"
2535         "umulh	x8, x27, x9\n\t"
2536         "str	x10, [%[a], 88]\n\t"
2537         "adds	x11, x11, x7\n\t"
2538         "# a[i+13] += m[13] * mu\n\t"
2539         "ldr	x10, [%[a], 104]\n\t"
2540         "adc	x6, x8, xzr\n\t"
2541         "adds	x11, x11, x5\n\t"
2542         "mul	x7, x28, x9\n\t"
2543         "adc	x6, x6, xzr\n\t"
2544         "umulh	x8, x28, x9\n\t"
2545         "str	x11, [%[a], 96]\n\t"
2546         "adds	x10, x10, x7\n\t"
2547         "# a[i+14] += m[14] * mu\n\t"
2548         "ldr	x11, [%[a], 112]\n\t"
2549         "adc	x5, x8, xzr\n\t"
2550         "ldr	x8, [%[m], 112]\n\t"
2551         "adds	x10, x10, x6\n\t"
2552         "mul	x7, x8, x9\n\t"
2553         "adc	x5, x5, xzr\n\t"
2554         "umulh	x8, x8, x9\n\t"
2555         "str	x10, [%[a], 104]\n\t"
2556         "adds	x11, x11, x7\n\t"
2557         "# a[i+15] += m[15] * mu\n\t"
2558         "ldr	x10, [%[a], 120]\n\t"
2559         "adc	x6, x8, xzr\n\t"
2560         "ldr	x8, [%[m], 120]\n\t"
2561         "adds	x11, x11, x5\n\t"
2562         "mul	x7, x8, x9\n\t"
2563         "adc	x6, x6, xzr\n\t"
2564         "umulh	x8, x8, x9\n\t"
2565         "adds	x6, x6, x7\n\t"
2566         "adcs	x8, x8, x3\n\t"
2567         "str	x11, [%[a], 112]\n\t"
2568         "cset  x3, cs\n\t"
2569         "adds	x10, x10, x6\n\t"
2570         "ldr	x11, [%[a], 128]\n\t"
2571         "str	x10, [%[a], 120]\n\t"
2572         "adcs	x11, x11, x8\n\t"
2573         "str	x11, [%[a], 128]\n\t"
2574         "adc	x3, x3, xzr\n\t"
2575         "subs	x4, x4, 1\n\t"
2576         "add	%[a], %[a], 8\n\t"
2577         "bne	1b\n\t"
2578         "# x12 and x13 hold a[0] and a[1]\n\t"
2579         "# Create mask\n\t"
2580         "neg       x3, x3\n\t"
2581         "mov   x9, %[a]\n\t"
2582         "sub   %[a], %[a], 128\n\t"
2583         "# Subtract masked modulus\n\t"
2584         "# x12 and x13 hold a[0] and a[1]\n\t"
2585         "and       x14, x14, x3\n\t"
2586         "ldp       x11, x10, [x9, 16]\n\t"
2587         "and       x15, x15, x3\n\t"
2588         "subs      x12, x12, x14\n\t"
2589         "and       x16, x16, x3\n\t"
2590         "sbcs      x13, x13, x15\n\t"
2591         "and       x17, x17, x3\n\t"
2592         "sbcs      x11, x11, x16\n\t"
2593         "stp       x12, x13, [%[a], 0]\n\t"
2594         "sbcs      x10, x10, x17\n\t"
2595         "stp       x11, x10, [%[a], 16]\n\t"
2596         "ldp       x12, x13, [x9, 32]\n\t"
2597         "and       x19, x19, x3\n\t"
2598         "ldp       x11, x10, [x9, 48]\n\t"
2599         "and       x20, x20, x3\n\t"
2600         "sbcs      x12, x12, x19\n\t"
2601         "and       x21, x21, x3\n\t"
2602         "sbcs      x13, x13, x20\n\t"
2603         "and       x22, x22, x3\n\t"
2604         "sbcs      x11, x11, x21\n\t"
2605         "stp       x12, x13, [%[a], 32]\n\t"
2606         "sbcs      x10, x10, x22\n\t"
2607         "stp       x11, x10, [%[a], 48]\n\t"
2608         "ldp       x12, x13, [x9, 64]\n\t"
2609         "and       x23, x23, x3\n\t"
2610         "ldp       x11, x10, [x9, 80]\n\t"
2611         "and       x24, x24, x3\n\t"
2612         "sbcs      x12, x12, x23\n\t"
2613         "and       x25, x25, x3\n\t"
2614         "sbcs      x13, x13, x24\n\t"
2615         "and       x26, x26, x3\n\t"
2616         "sbcs      x11, x11, x25\n\t"
2617         "stp       x12, x13, [%[a], 64]\n\t"
2618         "sbcs      x10, x10, x26\n\t"
2619         "stp       x11, x10, [%[a], 80]\n\t"
2620         "ldp       x7, x8, [%[m], 112]\n\t"
2621         "ldp       x12, x13, [x9, 96]\n\t"
2622         "and       x27, x27, x3\n\t"
2623         "ldp       x11, x10, [x9, 112]\n\t"
2624         "and       x28, x28, x3\n\t"
2625         "sbcs      x12, x12, x27\n\t"
2626         "and       x7, x7, x3\n\t"
2627         "sbcs      x13, x13, x28\n\t"
2628         "and       x8, x8, x3\n\t"
2629         "sbcs      x11, x11, x7\n\t"
2630         "stp       x12, x13, [%[a], 96]\n\t"
2631         "sbcs      x10, x10, x8\n\t"
2632         "stp       x11, x10, [%[a], 112]\n\t"
2633         : [a] "+r" (a)
2634         : [m] "r" (m), [mp] "r" (mp)
2635         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
2636     );
2637 
2638 }
2639 
2640 /* Multiply two Montgomery form numbers mod the modulus (prime).
2641  * (r = a * b mod m)
2642  *
2643  * r   Result of multiplication.
2644  * a   First number to multiply in Montgomery form.
2645  * b   Second number to multiply in Montgomery form.
2646  * m   Modulus (prime).
2647  * mp  Montgomery mulitplier.
2648  */
sp_2048_mont_mul_16(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m,sp_digit mp)2649 static void sp_2048_mont_mul_16(sp_digit* r, const sp_digit* a,
2650         const sp_digit* b, const sp_digit* m, sp_digit mp)
2651 {
2652     sp_2048_mul_16(r, a, b);
2653     sp_2048_mont_reduce_16(r, m, mp);
2654 }
2655 
2656 /* Square the Montgomery form number. (r = a * a mod m)
2657  *
2658  * r   Result of squaring.
2659  * a   Number to square in Montgomery form.
2660  * m   Modulus (prime).
2661  * mp  Montgomery mulitplier.
2662  */
sp_2048_mont_sqr_16(sp_digit * r,const sp_digit * a,const sp_digit * m,sp_digit mp)2663 static void sp_2048_mont_sqr_16(sp_digit* r, const sp_digit* a,
2664         const sp_digit* m, sp_digit mp)
2665 {
2666     sp_2048_sqr_16(r, a);
2667     sp_2048_mont_reduce_16(r, m, mp);
2668 }
2669 
2670 /* Conditionally subtract b from a using the mask m.
2671  * m is -1 to subtract and 0 when not copying.
2672  *
2673  * r  A single precision number representing condition subtract result.
2674  * a  A single precision number to subtract from.
2675  * b  A single precision number to subtract.
2676  * m  Mask value to apply.
2677  */
sp_2048_cond_sub_16(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)2678 static sp_digit sp_2048_cond_sub_16(sp_digit* r, const sp_digit* a, const sp_digit* b,
2679         sp_digit m)
2680 {
2681 #ifdef WOLFSSL_SP_SMALL
2682     sp_digit c = 0;
2683 
2684     __asm__ __volatile__ (
2685         "mov	x8, #0\n\t"
2686         "1:\n\t"
2687         "subs	%[c], xzr, %[c]\n\t"
2688         "ldr	x4, [%[a], x8]\n\t"
2689         "ldr	x5, [%[b], x8]\n\t"
2690         "and	x5, x5, %[m]\n\t"
2691         "sbcs	x4, x4, x5\n\t"
2692         "csetm	%[c], cc\n\t"
2693         "str	x4, [%[r], x8]\n\t"
2694         "add	x8, x8, #8\n\t"
2695         "cmp	x8, 128\n\t"
2696         "b.lt	1b\n\t"
2697         : [c] "+r" (c)
2698         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
2699         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
2700     );
2701 
2702     return c;
2703 #else
2704     __asm__ __volatile__ (
2705 
2706         "ldp	x5, x7, [%[b], 0]\n\t"
2707         "ldp	x11, x12, [%[b], 16]\n\t"
2708         "ldp	x4, x6, [%[a], 0]\n\t"
2709         "and	x5, x5, %[m]\n\t"
2710         "ldp	x9, x10, [%[a], 16]\n\t"
2711         "and	x7, x7, %[m]\n\t"
2712         "subs	x4, x4, x5\n\t"
2713         "and	x11, x11, %[m]\n\t"
2714         "sbcs	x6, x6, x7\n\t"
2715         "and	x12, x12, %[m]\n\t"
2716         "sbcs	x9, x9, x11\n\t"
2717         "stp	x4, x6, [%[r], 0]\n\t"
2718         "sbcs	x10, x10, x12\n\t"
2719         "stp	x9, x10, [%[r], 16]\n\t"
2720         "ldp	x5, x7, [%[b], 32]\n\t"
2721         "ldp	x11, x12, [%[b], 48]\n\t"
2722         "ldp	x4, x6, [%[a], 32]\n\t"
2723         "and	x5, x5, %[m]\n\t"
2724         "ldp	x9, x10, [%[a], 48]\n\t"
2725         "and	x7, x7, %[m]\n\t"
2726         "sbcs	x4, x4, x5\n\t"
2727         "and	x11, x11, %[m]\n\t"
2728         "sbcs	x6, x6, x7\n\t"
2729         "and	x12, x12, %[m]\n\t"
2730         "sbcs	x9, x9, x11\n\t"
2731         "stp	x4, x6, [%[r], 32]\n\t"
2732         "sbcs	x10, x10, x12\n\t"
2733         "stp	x9, x10, [%[r], 48]\n\t"
2734         "ldp	x5, x7, [%[b], 64]\n\t"
2735         "ldp	x11, x12, [%[b], 80]\n\t"
2736         "ldp	x4, x6, [%[a], 64]\n\t"
2737         "and	x5, x5, %[m]\n\t"
2738         "ldp	x9, x10, [%[a], 80]\n\t"
2739         "and	x7, x7, %[m]\n\t"
2740         "sbcs	x4, x4, x5\n\t"
2741         "and	x11, x11, %[m]\n\t"
2742         "sbcs	x6, x6, x7\n\t"
2743         "and	x12, x12, %[m]\n\t"
2744         "sbcs	x9, x9, x11\n\t"
2745         "stp	x4, x6, [%[r], 64]\n\t"
2746         "sbcs	x10, x10, x12\n\t"
2747         "stp	x9, x10, [%[r], 80]\n\t"
2748         "ldp	x5, x7, [%[b], 96]\n\t"
2749         "ldp	x11, x12, [%[b], 112]\n\t"
2750         "ldp	x4, x6, [%[a], 96]\n\t"
2751         "and	x5, x5, %[m]\n\t"
2752         "ldp	x9, x10, [%[a], 112]\n\t"
2753         "and	x7, x7, %[m]\n\t"
2754         "sbcs	x4, x4, x5\n\t"
2755         "and	x11, x11, %[m]\n\t"
2756         "sbcs	x6, x6, x7\n\t"
2757         "and	x12, x12, %[m]\n\t"
2758         "sbcs	x9, x9, x11\n\t"
2759         "stp	x4, x6, [%[r], 96]\n\t"
2760         "sbcs	x10, x10, x12\n\t"
2761         "stp	x9, x10, [%[r], 112]\n\t"
2762         "csetm	%[r], cc\n\t"
2763         : [r] "+r" (r)
2764         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
2765         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
2766     );
2767 
2768     return (sp_digit)r;
2769 #endif /* WOLFSSL_SP_SMALL */
2770 }
2771 
2772 /* Mul a by digit b into r. (r = a * b)
2773  *
2774  * r  A single precision integer.
2775  * a  A single precision integer.
2776  * b  A single precision digit.
2777  */
sp_2048_mul_d_16(sp_digit * r,const sp_digit * a,sp_digit b)2778 static void sp_2048_mul_d_16(sp_digit* r, const sp_digit* a,
2779         sp_digit b)
2780 {
2781 #ifdef WOLFSSL_SP_SMALL
2782     __asm__ __volatile__ (
2783         "# A[0] * B\n\t"
2784         "ldr	x8, [%[a]]\n\t"
2785         "mul	x5, %[b], x8\n\t"
2786         "umulh	x3, %[b], x8\n\t"
2787         "mov	x4, 0\n\t"
2788         "str	x5, [%[r]]\n\t"
2789         "mov	x5, 0\n\t"
2790         "mov	x9, #8\n\t"
2791         "1:\n\t"
2792         "ldr	x8, [%[a], x9]\n\t"
2793         "mul	x6, %[b], x8\n\t"
2794         "umulh	x7, %[b], x8\n\t"
2795         "adds	x3, x3, x6\n\t"
2796         "adcs	x4, x4, x7\n\t"
2797         "adc	x5, xzr, xzr\n\t"
2798         "str	x3, [%[r], x9]\n\t"
2799         "mov	x3, x4\n\t"
2800         "mov	x4, x5\n\t"
2801         "mov	x5, #0\n\t"
2802         "add	x9, x9, #8\n\t"
2803         "cmp	x9, 128\n\t"
2804         "b.lt	1b\n\t"
2805         "str	x3, [%[r], 128]\n\t"
2806         :
2807         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
2808         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
2809     );
2810 #else
2811     __asm__ __volatile__ (
2812         "# A[0] * B\n\t"
2813         "ldp	x8, x9, [%[a]]\n\t"
2814         "mul	x3, %[b], x8\n\t"
2815         "umulh	x4, %[b], x8\n\t"
2816         "mov	x5, 0\n\t"
2817         "# A[1] * B\n\t"
2818         "str	x3, [%[r]]\n\t"
2819         "mov	x3, 0\n\t"
2820         "mul	x6, %[b], x9\n\t"
2821         "umulh	x7, %[b], x9\n\t"
2822         "adds	x4, x4, x6\n\t"
2823         "# A[2] * B\n\t"
2824         "ldp	x8, x9, [%[a], 16]\n\t"
2825         "str	x4, [%[r], 8]\n\t"
2826         "mov	x4, 0\n\t"
2827         "mul	x6, %[b], x8\n\t"
2828         "adcs	x5, x5, x7\n\t"
2829         "umulh	x7, %[b], x8\n\t"
2830         "adc	x3, xzr, xzr\n\t"
2831         "adds	x5, x5, x6\n\t"
2832         "# A[3] * B\n\t"
2833         "str	x5, [%[r], 16]\n\t"
2834         "mov	x5, 0\n\t"
2835         "mul	x6, %[b], x9\n\t"
2836         "adcs	x3, x3, x7\n\t"
2837         "umulh	x7, %[b], x9\n\t"
2838         "adc	x4, xzr, xzr\n\t"
2839         "adds	x3, x3, x6\n\t"
2840         "# A[4] * B\n\t"
2841         "ldp	x8, x9, [%[a], 32]\n\t"
2842         "str	x3, [%[r], 24]\n\t"
2843         "mov	x3, 0\n\t"
2844         "mul	x6, %[b], x8\n\t"
2845         "adcs	x4, x4, x7\n\t"
2846         "umulh	x7, %[b], x8\n\t"
2847         "adc	x5, xzr, xzr\n\t"
2848         "adds	x4, x4, x6\n\t"
2849         "# A[5] * B\n\t"
2850         "str	x4, [%[r], 32]\n\t"
2851         "mov	x4, 0\n\t"
2852         "mul	x6, %[b], x9\n\t"
2853         "adcs	x5, x5, x7\n\t"
2854         "umulh	x7, %[b], x9\n\t"
2855         "adc	x3, xzr, xzr\n\t"
2856         "adds	x5, x5, x6\n\t"
2857         "# A[6] * B\n\t"
2858         "ldp	x8, x9, [%[a], 48]\n\t"
2859         "str	x5, [%[r], 40]\n\t"
2860         "mov	x5, 0\n\t"
2861         "mul	x6, %[b], x8\n\t"
2862         "adcs	x3, x3, x7\n\t"
2863         "umulh	x7, %[b], x8\n\t"
2864         "adc	x4, xzr, xzr\n\t"
2865         "adds	x3, x3, x6\n\t"
2866         "# A[7] * B\n\t"
2867         "str	x3, [%[r], 48]\n\t"
2868         "mov	x3, 0\n\t"
2869         "mul	x6, %[b], x9\n\t"
2870         "adcs	x4, x4, x7\n\t"
2871         "umulh	x7, %[b], x9\n\t"
2872         "adc	x5, xzr, xzr\n\t"
2873         "adds	x4, x4, x6\n\t"
2874         "# A[8] * B\n\t"
2875         "ldp	x8, x9, [%[a], 64]\n\t"
2876         "str	x4, [%[r], 56]\n\t"
2877         "mov	x4, 0\n\t"
2878         "mul	x6, %[b], x8\n\t"
2879         "adcs	x5, x5, x7\n\t"
2880         "umulh	x7, %[b], x8\n\t"
2881         "adc	x3, xzr, xzr\n\t"
2882         "adds	x5, x5, x6\n\t"
2883         "# A[9] * B\n\t"
2884         "str	x5, [%[r], 64]\n\t"
2885         "mov	x5, 0\n\t"
2886         "mul	x6, %[b], x9\n\t"
2887         "adcs	x3, x3, x7\n\t"
2888         "umulh	x7, %[b], x9\n\t"
2889         "adc	x4, xzr, xzr\n\t"
2890         "adds	x3, x3, x6\n\t"
2891         "# A[10] * B\n\t"
2892         "ldp	x8, x9, [%[a], 80]\n\t"
2893         "str	x3, [%[r], 72]\n\t"
2894         "mov	x3, 0\n\t"
2895         "mul	x6, %[b], x8\n\t"
2896         "adcs	x4, x4, x7\n\t"
2897         "umulh	x7, %[b], x8\n\t"
2898         "adc	x5, xzr, xzr\n\t"
2899         "adds	x4, x4, x6\n\t"
2900         "# A[11] * B\n\t"
2901         "str	x4, [%[r], 80]\n\t"
2902         "mov	x4, 0\n\t"
2903         "mul	x6, %[b], x9\n\t"
2904         "adcs	x5, x5, x7\n\t"
2905         "umulh	x7, %[b], x9\n\t"
2906         "adc	x3, xzr, xzr\n\t"
2907         "adds	x5, x5, x6\n\t"
2908         "# A[12] * B\n\t"
2909         "ldp	x8, x9, [%[a], 96]\n\t"
2910         "str	x5, [%[r], 88]\n\t"
2911         "mov	x5, 0\n\t"
2912         "mul	x6, %[b], x8\n\t"
2913         "adcs	x3, x3, x7\n\t"
2914         "umulh	x7, %[b], x8\n\t"
2915         "adc	x4, xzr, xzr\n\t"
2916         "adds	x3, x3, x6\n\t"
2917         "# A[13] * B\n\t"
2918         "str	x3, [%[r], 96]\n\t"
2919         "mov	x3, 0\n\t"
2920         "mul	x6, %[b], x9\n\t"
2921         "adcs	x4, x4, x7\n\t"
2922         "umulh	x7, %[b], x9\n\t"
2923         "adc	x5, xzr, xzr\n\t"
2924         "adds	x4, x4, x6\n\t"
2925         "# A[14] * B\n\t"
2926         "ldp	x8, x9, [%[a], 112]\n\t"
2927         "str	x4, [%[r], 104]\n\t"
2928         "mov	x4, 0\n\t"
2929         "mul	x6, %[b], x8\n\t"
2930         "adcs	x5, x5, x7\n\t"
2931         "umulh	x7, %[b], x8\n\t"
2932         "adc	x3, xzr, xzr\n\t"
2933         "adds	x5, x5, x6\n\t"
2934         "# A[15] * B\n\t"
2935         "str	x5, [%[r], 112]\n\t"
2936         "mul	x6, %[b], x9\n\t"
2937         "adcs	x3, x3, x7\n\t"
2938         "umulh	x7, %[b], x9\n\t"
2939         "adc	x4, xzr, xzr\n\t"
2940         "adds	x3, x3, x6\n\t"
2941         "adc	x4, x4, x7\n\t"
2942         "stp	x3, x4, [%[r], 120]\n\t"
2943         :
2944         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
2945         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
2946     );
2947 #endif
2948 }
2949 
2950 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
2951  *
2952  * d1   The high order half of the number to divide.
2953  * d0   The low order half of the number to divide.
2954  * div  The dividend.
2955  * returns the result of the division.
2956  */
div_2048_word_16(sp_digit d1,sp_digit d0,sp_digit div)2957 static sp_digit div_2048_word_16(sp_digit d1, sp_digit d0, sp_digit div)
2958 {
2959     sp_digit r;
2960 
2961     __asm__ __volatile__ (
2962         "lsr	x5, %[div], 32\n\t"
2963         "add	x5, x5, 1\n\t"
2964 
2965         "udiv	x3, %[d1], x5\n\t"
2966         "lsl	x6, x3, 32\n\t"
2967         "mul	x4, %[div], x6\n\t"
2968         "umulh	x3, %[div], x6\n\t"
2969         "subs	%[d0], %[d0], x4\n\t"
2970         "sbc	%[d1], %[d1], x3\n\t"
2971 
2972         "udiv	x3, %[d1], x5\n\t"
2973         "lsl	x3, x3, 32\n\t"
2974         "add	x6, x6, x3\n\t"
2975         "mul	x4, %[div], x3\n\t"
2976         "umulh	x3, %[div], x3\n\t"
2977         "subs	%[d0], %[d0], x4\n\t"
2978         "sbc	%[d1], %[d1], x3\n\t"
2979 
2980         "lsr	x3, %[d0], 32\n\t"
2981         "orr	x3, x3, %[d1], lsl 32\n\t"
2982 
2983         "udiv	x3, x3, x5\n\t"
2984         "add	x6, x6, x3\n\t"
2985         "mul	x4, %[div], x3\n\t"
2986         "umulh	x3, %[div], x3\n\t"
2987         "subs	%[d0], %[d0], x4\n\t"
2988         "sbc	%[d1], %[d1], x3\n\t"
2989 
2990         "lsr	x3, %[d0], 32\n\t"
2991         "orr	x3, x3, %[d1], lsl 32\n\t"
2992 
2993         "udiv	x3, x3, x5\n\t"
2994         "add	x6, x6, x3\n\t"
2995         "mul	x4, %[div], x3\n\t"
2996         "sub	%[d0], %[d0], x4\n\t"
2997 
2998         "udiv	x3, %[d0], %[div]\n\t"
2999         "add	%[r], x6, x3\n\t"
3000 
3001         : [r] "=r" (r)
3002         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
3003         : "x3", "x4", "x5", "x6"
3004     );
3005 
3006     return r;
3007 }
3008 
3009 /* Compare a with b in constant time.
3010  *
3011  * a  A single precision integer.
3012  * b  A single precision integer.
3013  * return -ve, 0 or +ve if a is less than, equal to or greater than b
3014  * respectively.
3015  */
sp_2048_cmp_16(const sp_digit * a,const sp_digit * b)3016 static sp_int64 sp_2048_cmp_16(const sp_digit* a, const sp_digit* b)
3017 {
3018 #ifdef WOLFSSL_SP_SMALL
3019     __asm__ __volatile__ (
3020         "mov	x2, -1\n\t"
3021         "mov	x3, 1\n\t"
3022         "mov	x4, -1\n\t"
3023         "mov	x5, 120\n\t"
3024         "1:\n\t"
3025         "ldr	x6, [%[a], x5]\n\t"
3026         "ldr	x7, [%[b], x5]\n\t"
3027         "and	x6, x6, x4\n\t"
3028         "and	x7, x7, x4\n\t"
3029         "subs	x6, x6, x7\n\t"
3030         "csel	x2, x3, x2, hi\n\t"
3031         "csel	x2, x4, x2, lo\n\t"
3032         "csel	x4, x4, xzr, eq\n\t"
3033         "subs	x5, x5, #8\n\t"
3034         "b.cs	1b\n\t"
3035         "eor	%[a], x2, x4\n\t"
3036         : [a] "+r" (a)
3037         : [b] "r" (b)
3038         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
3039     );
3040 #else
3041     __asm__ __volatile__ (
3042         "mov	x2, -1\n\t"
3043         "mov	x3, 1\n\t"
3044         "mov  x4, -1\n\t"
3045         "ldp	x5, x6, [%[a], 112]\n\t"
3046         "ldp	x7, x8, [%[b], 112]\n\t"
3047         "and	x6, x6, x4\n\t"
3048         "and	x8, x8, x4\n\t"
3049         "subs	x6, x6, x8\n\t"
3050         "csel	x2, x4, x2, lo\n\t"
3051         "csel	x4, x4, xzr, eq\n\t"
3052         "csel	x2, x3, x2, hi\n\t"
3053         "and	x5, x5, x4\n\t"
3054         "and	x7, x7, x4\n\t"
3055         "subs	x5, x5, x7\n\t"
3056         "csel	x2, x4, x2, lo\n\t"
3057         "csel	x4, x4, xzr, eq\n\t"
3058         "csel	x2, x3, x2, hi\n\t"
3059         "ldp	x5, x6, [%[a], 96]\n\t"
3060         "ldp	x7, x8, [%[b], 96]\n\t"
3061         "and	x6, x6, x4\n\t"
3062         "and	x8, x8, x4\n\t"
3063         "subs	x6, x6, x8\n\t"
3064         "csel	x2, x4, x2, lo\n\t"
3065         "csel	x4, x4, xzr, eq\n\t"
3066         "csel	x2, x3, x2, hi\n\t"
3067         "and	x5, x5, x4\n\t"
3068         "and	x7, x7, x4\n\t"
3069         "subs	x5, x5, x7\n\t"
3070         "csel	x2, x4, x2, lo\n\t"
3071         "csel	x4, x4, xzr, eq\n\t"
3072         "csel	x2, x3, x2, hi\n\t"
3073         "ldp	x5, x6, [%[a], 80]\n\t"
3074         "ldp	x7, x8, [%[b], 80]\n\t"
3075         "and	x6, x6, x4\n\t"
3076         "and	x8, x8, x4\n\t"
3077         "subs	x6, x6, x8\n\t"
3078         "csel	x2, x4, x2, lo\n\t"
3079         "csel	x4, x4, xzr, eq\n\t"
3080         "csel	x2, x3, x2, hi\n\t"
3081         "and	x5, x5, x4\n\t"
3082         "and	x7, x7, x4\n\t"
3083         "subs	x5, x5, x7\n\t"
3084         "csel	x2, x4, x2, lo\n\t"
3085         "csel	x4, x4, xzr, eq\n\t"
3086         "csel	x2, x3, x2, hi\n\t"
3087         "ldp	x5, x6, [%[a], 64]\n\t"
3088         "ldp	x7, x8, [%[b], 64]\n\t"
3089         "and	x6, x6, x4\n\t"
3090         "and	x8, x8, x4\n\t"
3091         "subs	x6, x6, x8\n\t"
3092         "csel	x2, x4, x2, lo\n\t"
3093         "csel	x4, x4, xzr, eq\n\t"
3094         "csel	x2, x3, x2, hi\n\t"
3095         "and	x5, x5, x4\n\t"
3096         "and	x7, x7, x4\n\t"
3097         "subs	x5, x5, x7\n\t"
3098         "csel	x2, x4, x2, lo\n\t"
3099         "csel	x4, x4, xzr, eq\n\t"
3100         "csel	x2, x3, x2, hi\n\t"
3101         "ldp	x5, x6, [%[a], 48]\n\t"
3102         "ldp	x7, x8, [%[b], 48]\n\t"
3103         "and	x6, x6, x4\n\t"
3104         "and	x8, x8, x4\n\t"
3105         "subs	x6, x6, x8\n\t"
3106         "csel	x2, x4, x2, lo\n\t"
3107         "csel	x4, x4, xzr, eq\n\t"
3108         "csel	x2, x3, x2, hi\n\t"
3109         "and	x5, x5, x4\n\t"
3110         "and	x7, x7, x4\n\t"
3111         "subs	x5, x5, x7\n\t"
3112         "csel	x2, x4, x2, lo\n\t"
3113         "csel	x4, x4, xzr, eq\n\t"
3114         "csel	x2, x3, x2, hi\n\t"
3115         "ldp	x5, x6, [%[a], 32]\n\t"
3116         "ldp	x7, x8, [%[b], 32]\n\t"
3117         "and	x6, x6, x4\n\t"
3118         "and	x8, x8, x4\n\t"
3119         "subs	x6, x6, x8\n\t"
3120         "csel	x2, x4, x2, lo\n\t"
3121         "csel	x4, x4, xzr, eq\n\t"
3122         "csel	x2, x3, x2, hi\n\t"
3123         "and	x5, x5, x4\n\t"
3124         "and	x7, x7, x4\n\t"
3125         "subs	x5, x5, x7\n\t"
3126         "csel	x2, x4, x2, lo\n\t"
3127         "csel	x4, x4, xzr, eq\n\t"
3128         "csel	x2, x3, x2, hi\n\t"
3129         "ldp	x5, x6, [%[a], 16]\n\t"
3130         "ldp	x7, x8, [%[b], 16]\n\t"
3131         "and	x6, x6, x4\n\t"
3132         "and	x8, x8, x4\n\t"
3133         "subs	x6, x6, x8\n\t"
3134         "csel	x2, x4, x2, lo\n\t"
3135         "csel	x4, x4, xzr, eq\n\t"
3136         "csel	x2, x3, x2, hi\n\t"
3137         "and	x5, x5, x4\n\t"
3138         "and	x7, x7, x4\n\t"
3139         "subs	x5, x5, x7\n\t"
3140         "csel	x2, x4, x2, lo\n\t"
3141         "csel	x4, x4, xzr, eq\n\t"
3142         "csel	x2, x3, x2, hi\n\t"
3143         "ldp	x5, x6, [%[a], 0]\n\t"
3144         "ldp	x7, x8, [%[b], 0]\n\t"
3145         "and	x6, x6, x4\n\t"
3146         "and	x8, x8, x4\n\t"
3147         "subs	x6, x6, x8\n\t"
3148         "csel	x2, x4, x2, lo\n\t"
3149         "csel	x4, x4, xzr, eq\n\t"
3150         "csel	x2, x3, x2, hi\n\t"
3151         "and	x5, x5, x4\n\t"
3152         "and	x7, x7, x4\n\t"
3153         "subs	x5, x5, x7\n\t"
3154         "csel	x2, x4, x2, lo\n\t"
3155         "csel	x4, x4, xzr, eq\n\t"
3156         "csel	x2, x3, x2, hi\n\t"
3157         "eor	%[a], x2, x4\n\t"
3158         : [a] "+r" (a)
3159         : [b] "r" (b)
3160         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
3161     );
3162 #endif
3163 
3164     return (sp_int64)a;
3165 }
3166 
3167 /* Divide d in a and put remainder into r (m*d + r = a)
3168  * m is not calculated as it is not needed at this time.
3169  *
3170  * a  Number to be divided.
3171  * d  Number to divide with.
3172  * m  Multiplier result.
3173  * r  Remainder from the division.
3174  * returns MP_OKAY indicating success.
3175  */
sp_2048_div_16(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)3176 static WC_INLINE int sp_2048_div_16(const sp_digit* a, const sp_digit* d, sp_digit* m,
3177         sp_digit* r)
3178 {
3179     sp_digit t1[32], t2[17];
3180     sp_digit div, r1;
3181     int i;
3182 
3183     (void)m;
3184 
3185     div = d[15];
3186     XMEMCPY(t1, a, sizeof(*t1) * 2 * 16);
3187     for (i=15; i>=0; i--) {
3188         sp_digit hi = t1[16 + i] - (t1[16 + i] == div);
3189         r1 = div_2048_word_16(hi, t1[16 + i - 1], div);
3190 
3191         sp_2048_mul_d_16(t2, d, r1);
3192         t1[16 + i] += sp_2048_sub_in_place_16(&t1[i], t2);
3193         t1[16 + i] -= t2[16];
3194         sp_2048_mask_16(t2, d, t1[16 + i]);
3195         t1[16 + i] += sp_2048_add_16(&t1[i], &t1[i], t2);
3196         sp_2048_mask_16(t2, d, t1[16 + i]);
3197         t1[16 + i] += sp_2048_add_16(&t1[i], &t1[i], t2);
3198     }
3199 
3200     r1 = sp_2048_cmp_16(t1, d) >= 0;
3201     sp_2048_cond_sub_16(r, t1, d, (sp_digit)0 - r1);
3202 
3203     return MP_OKAY;
3204 }
3205 
3206 /* Reduce a modulo m into r. (r = a mod m)
3207  *
3208  * r  A single precision number that is the reduced result.
3209  * a  A single precision number that is to be reduced.
3210  * m  A single precision number that is the modulus to reduce with.
3211  * returns MP_OKAY indicating success.
3212  */
sp_2048_mod_16(sp_digit * r,const sp_digit * a,const sp_digit * m)3213 static WC_INLINE int sp_2048_mod_16(sp_digit* r, const sp_digit* a, const sp_digit* m)
3214 {
3215     return sp_2048_div_16(a, m, NULL, r);
3216 }
3217 
3218 #ifdef WOLFSSL_SP_SMALL
3219 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
3220  *
3221  * r     A single precision number that is the result of the operation.
3222  * a     A single precision number being exponentiated.
3223  * e     A single precision number that is the exponent.
3224  * bits  The number of bits in the exponent.
3225  * m     A single precision number that is the modulus.
3226  * returns  0 on success.
3227  * returns  MEMORY_E on dynamic memory allocation failure.
3228  * returns  MP_VAL when base is even or exponent is 0.
3229  */
sp_2048_mod_exp_16(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)3230 static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e,
3231         int bits, const sp_digit* m, int reduceA)
3232 {
3233 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
3234     sp_digit* td = NULL;
3235 #else
3236     sp_digit td[16 * 32];
3237 #endif
3238     sp_digit* t[16];
3239     sp_digit* norm = NULL;
3240     sp_digit mp = 1;
3241     sp_digit n;
3242     sp_digit mask;
3243     int i;
3244     int c;
3245     byte y;
3246     int err = MP_OKAY;
3247 
3248     if ((m[0] & 1) == 0) {
3249         err = MP_VAL;
3250     }
3251     else if (bits == 0) {
3252         err = MP_VAL;
3253     }
3254 
3255 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
3256     if (err == MP_OKAY) {
3257         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 32), NULL,
3258                                 DYNAMIC_TYPE_TMP_BUFFER);
3259         if (td == NULL)
3260             err = MEMORY_E;
3261     }
3262 #endif
3263 
3264     if (err == MP_OKAY) {
3265         norm = td;
3266         for (i=0; i<16; i++) {
3267             t[i] = td + i * 32;
3268         }
3269 
3270         sp_2048_mont_setup(m, &mp);
3271         sp_2048_mont_norm_16(norm, m);
3272 
3273         XMEMSET(t[1], 0, sizeof(sp_digit) * 16U);
3274         if (reduceA != 0) {
3275             err = sp_2048_mod_16(t[1] + 16, a, m);
3276             if (err == MP_OKAY) {
3277                 err = sp_2048_mod_16(t[1], t[1], m);
3278             }
3279         }
3280         else {
3281             XMEMCPY(t[1] + 16, a, sizeof(sp_digit) * 16);
3282             err = sp_2048_mod_16(t[1], t[1], m);
3283         }
3284     }
3285 
3286     if (err == MP_OKAY) {
3287         sp_2048_mont_sqr_16(t[ 2], t[ 1], m, mp);
3288         sp_2048_mont_mul_16(t[ 3], t[ 2], t[ 1], m, mp);
3289         sp_2048_mont_sqr_16(t[ 4], t[ 2], m, mp);
3290         sp_2048_mont_mul_16(t[ 5], t[ 3], t[ 2], m, mp);
3291         sp_2048_mont_sqr_16(t[ 6], t[ 3], m, mp);
3292         sp_2048_mont_mul_16(t[ 7], t[ 4], t[ 3], m, mp);
3293         sp_2048_mont_sqr_16(t[ 8], t[ 4], m, mp);
3294         sp_2048_mont_mul_16(t[ 9], t[ 5], t[ 4], m, mp);
3295         sp_2048_mont_sqr_16(t[10], t[ 5], m, mp);
3296         sp_2048_mont_mul_16(t[11], t[ 6], t[ 5], m, mp);
3297         sp_2048_mont_sqr_16(t[12], t[ 6], m, mp);
3298         sp_2048_mont_mul_16(t[13], t[ 7], t[ 6], m, mp);
3299         sp_2048_mont_sqr_16(t[14], t[ 7], m, mp);
3300         sp_2048_mont_mul_16(t[15], t[ 8], t[ 7], m, mp);
3301 
3302         i = (bits - 1) / 64;
3303         n = e[i--];
3304         c = bits & 63;
3305         if (c == 0) {
3306             c = 64;
3307         }
3308         c -= bits % 4;
3309         if (c == 64) {
3310             c = 60;
3311         }
3312         if (c < 0) {
3313             /* Number of bits in top word is less than number needed. */
3314             c = -c;
3315             y = (byte)(n << c);
3316             n = e[i--];
3317             y |= (byte)(n >> (64 - c));
3318             n <<= c;
3319             c = 64 - c;
3320         }
3321         else {
3322             y = (byte)(n >> c);
3323             n <<= 64 - c;
3324         }
3325         XMEMCPY(r, t[y], sizeof(sp_digit) * 16);
3326         for (; i>=0 || c>=4; ) {
3327             if (c == 0) {
3328                 n = e[i--];
3329                 y = (byte)(n >> 60);
3330                 n <<= 4;
3331                 c = 60;
3332             }
3333             else if (c < 4) {
3334                 y = (byte)(n >> 60);
3335                 n = e[i--];
3336                 c = 4 - c;
3337                 y |= (byte)(n >> (64 - c));
3338                 n <<= c;
3339                 c = 64 - c;
3340             }
3341             else {
3342                 y = (byte)((n >> 60) & 0xf);
3343                 n <<= 4;
3344                 c -= 4;
3345             }
3346 
3347             sp_2048_mont_sqr_16(r, r, m, mp);
3348             sp_2048_mont_sqr_16(r, r, m, mp);
3349             sp_2048_mont_sqr_16(r, r, m, mp);
3350             sp_2048_mont_sqr_16(r, r, m, mp);
3351 
3352             sp_2048_mont_mul_16(r, r, t[y], m, mp);
3353         }
3354 
3355         XMEMSET(&r[16], 0, sizeof(sp_digit) * 16U);
3356         sp_2048_mont_reduce_16(r, m, mp);
3357 
3358         mask = 0 - (sp_2048_cmp_16(r, m) >= 0);
3359         sp_2048_cond_sub_16(r, r, m, mask);
3360     }
3361 
3362 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
3363     if (td != NULL)
3364         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
3365 #endif
3366 
3367     return err;
3368 }
3369 #else
3370 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
3371  *
3372  * r     A single precision number that is the result of the operation.
3373  * a     A single precision number being exponentiated.
3374  * e     A single precision number that is the exponent.
3375  * bits  The number of bits in the exponent.
3376  * m     A single precision number that is the modulus.
3377  * returns  0 on success.
3378  * returns  MEMORY_E on dynamic memory allocation failure.
3379  * returns  MP_VAL when base is even or exponent is 0.
3380  */
sp_2048_mod_exp_16(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)3381 static int sp_2048_mod_exp_16(sp_digit* r, const sp_digit* a, const sp_digit* e,
3382         int bits, const sp_digit* m, int reduceA)
3383 {
3384 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
3385     sp_digit* td = NULL;
3386 #else
3387     sp_digit td[32 * 32];
3388 #endif
3389     sp_digit* t[32];
3390     sp_digit* norm = NULL;
3391     sp_digit mp = 1;
3392     sp_digit n;
3393     sp_digit mask;
3394     int i;
3395     int c;
3396     byte y;
3397     int err = MP_OKAY;
3398 
3399     if ((m[0] & 1) == 0) {
3400         err = MP_VAL;
3401     }
3402     else if (bits == 0) {
3403         err = MP_VAL;
3404     }
3405 
3406 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
3407     if (err == MP_OKAY) {
3408         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 32), NULL,
3409                                 DYNAMIC_TYPE_TMP_BUFFER);
3410         if (td == NULL)
3411             err = MEMORY_E;
3412     }
3413 #endif
3414 
3415     if (err == MP_OKAY) {
3416         norm = td;
3417         for (i=0; i<32; i++) {
3418             t[i] = td + i * 32;
3419         }
3420 
3421         sp_2048_mont_setup(m, &mp);
3422         sp_2048_mont_norm_16(norm, m);
3423 
3424         XMEMSET(t[1], 0, sizeof(sp_digit) * 16U);
3425         if (reduceA != 0) {
3426             err = sp_2048_mod_16(t[1] + 16, a, m);
3427             if (err == MP_OKAY) {
3428                 err = sp_2048_mod_16(t[1], t[1], m);
3429             }
3430         }
3431         else {
3432             XMEMCPY(t[1] + 16, a, sizeof(sp_digit) * 16);
3433             err = sp_2048_mod_16(t[1], t[1], m);
3434         }
3435     }
3436 
3437     if (err == MP_OKAY) {
3438         sp_2048_mont_sqr_16(t[ 2], t[ 1], m, mp);
3439         sp_2048_mont_mul_16(t[ 3], t[ 2], t[ 1], m, mp);
3440         sp_2048_mont_sqr_16(t[ 4], t[ 2], m, mp);
3441         sp_2048_mont_mul_16(t[ 5], t[ 3], t[ 2], m, mp);
3442         sp_2048_mont_sqr_16(t[ 6], t[ 3], m, mp);
3443         sp_2048_mont_mul_16(t[ 7], t[ 4], t[ 3], m, mp);
3444         sp_2048_mont_sqr_16(t[ 8], t[ 4], m, mp);
3445         sp_2048_mont_mul_16(t[ 9], t[ 5], t[ 4], m, mp);
3446         sp_2048_mont_sqr_16(t[10], t[ 5], m, mp);
3447         sp_2048_mont_mul_16(t[11], t[ 6], t[ 5], m, mp);
3448         sp_2048_mont_sqr_16(t[12], t[ 6], m, mp);
3449         sp_2048_mont_mul_16(t[13], t[ 7], t[ 6], m, mp);
3450         sp_2048_mont_sqr_16(t[14], t[ 7], m, mp);
3451         sp_2048_mont_mul_16(t[15], t[ 8], t[ 7], m, mp);
3452         sp_2048_mont_sqr_16(t[16], t[ 8], m, mp);
3453         sp_2048_mont_mul_16(t[17], t[ 9], t[ 8], m, mp);
3454         sp_2048_mont_sqr_16(t[18], t[ 9], m, mp);
3455         sp_2048_mont_mul_16(t[19], t[10], t[ 9], m, mp);
3456         sp_2048_mont_sqr_16(t[20], t[10], m, mp);
3457         sp_2048_mont_mul_16(t[21], t[11], t[10], m, mp);
3458         sp_2048_mont_sqr_16(t[22], t[11], m, mp);
3459         sp_2048_mont_mul_16(t[23], t[12], t[11], m, mp);
3460         sp_2048_mont_sqr_16(t[24], t[12], m, mp);
3461         sp_2048_mont_mul_16(t[25], t[13], t[12], m, mp);
3462         sp_2048_mont_sqr_16(t[26], t[13], m, mp);
3463         sp_2048_mont_mul_16(t[27], t[14], t[13], m, mp);
3464         sp_2048_mont_sqr_16(t[28], t[14], m, mp);
3465         sp_2048_mont_mul_16(t[29], t[15], t[14], m, mp);
3466         sp_2048_mont_sqr_16(t[30], t[15], m, mp);
3467         sp_2048_mont_mul_16(t[31], t[16], t[15], m, mp);
3468 
3469         i = (bits - 1) / 64;
3470         n = e[i--];
3471         c = bits & 63;
3472         if (c == 0) {
3473             c = 64;
3474         }
3475         c -= bits % 5;
3476         if (c == 64) {
3477             c = 59;
3478         }
3479         if (c < 0) {
3480             /* Number of bits in top word is less than number needed. */
3481             c = -c;
3482             y = (byte)(n << c);
3483             n = e[i--];
3484             y |= (byte)(n >> (64 - c));
3485             n <<= c;
3486             c = 64 - c;
3487         }
3488         else {
3489             y = (byte)(n >> c);
3490             n <<= 64 - c;
3491         }
3492         XMEMCPY(r, t[y], sizeof(sp_digit) * 16);
3493         for (; i>=0 || c>=5; ) {
3494             if (c == 0) {
3495                 n = e[i--];
3496                 y = (byte)(n >> 59);
3497                 n <<= 5;
3498                 c = 59;
3499             }
3500             else if (c < 5) {
3501                 y = (byte)(n >> 59);
3502                 n = e[i--];
3503                 c = 5 - c;
3504                 y |= (byte)(n >> (64 - c));
3505                 n <<= c;
3506                 c = 64 - c;
3507             }
3508             else {
3509                 y = (byte)((n >> 59) & 0x1f);
3510                 n <<= 5;
3511                 c -= 5;
3512             }
3513 
3514             sp_2048_mont_sqr_16(r, r, m, mp);
3515             sp_2048_mont_sqr_16(r, r, m, mp);
3516             sp_2048_mont_sqr_16(r, r, m, mp);
3517             sp_2048_mont_sqr_16(r, r, m, mp);
3518             sp_2048_mont_sqr_16(r, r, m, mp);
3519 
3520             sp_2048_mont_mul_16(r, r, t[y], m, mp);
3521         }
3522 
3523         XMEMSET(&r[16], 0, sizeof(sp_digit) * 16U);
3524         sp_2048_mont_reduce_16(r, m, mp);
3525 
3526         mask = 0 - (sp_2048_cmp_16(r, m) >= 0);
3527         sp_2048_cond_sub_16(r, r, m, mask);
3528     }
3529 
3530 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
3531     if (td != NULL)
3532         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
3533 #endif
3534 
3535     return err;
3536 }
3537 #endif /* WOLFSSL_SP_SMALL */
3538 
3539 #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
3540 
3541 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
3542 /* r = 2^n mod m where n is the number of bits to reduce by.
3543  * Given m must be 2048 bits, just need to subtract.
3544  *
3545  * r  A single precision number.
3546  * m  A single precision number.
3547  */
sp_2048_mont_norm_32(sp_digit * r,const sp_digit * m)3548 static void sp_2048_mont_norm_32(sp_digit* r, const sp_digit* m)
3549 {
3550     XMEMSET(r, 0, sizeof(sp_digit) * 32);
3551 
3552     /* r = 2^n mod m */
3553     sp_2048_sub_in_place_32(r, m);
3554 }
3555 
3556 #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
3557 /* Reduce the number back to 2048 bits using Montgomery reduction.
3558  *
3559  * a   A single precision number to reduce in place.
3560  * m   The single precision number representing the modulus.
3561  * mp  The digit representing the negative inverse of m mod 2^n.
3562  */
sp_2048_mont_reduce_32(sp_digit * a,const sp_digit * m,sp_digit mp)3563 SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m,
3564         sp_digit mp)
3565 {
3566 
3567     __asm__ __volatile__ (
3568         "ldp	x14, x15, [%[m], 0]\n\t"
3569         "ldp	x16, x17, [%[m], 16]\n\t"
3570         "ldp	x19, x20, [%[m], 32]\n\t"
3571         "ldp	x21, x22, [%[m], 48]\n\t"
3572         "ldp	x23, x24, [%[m], 64]\n\t"
3573         "ldp	x25, x26, [%[m], 80]\n\t"
3574         "ldp	x27, x28, [%[m], 96]\n\t"
3575         "mov	x3, xzr\n\t"
3576         "# i = 32\n\t"
3577         "mov	x4, 32\n\t"
3578         "ldp	x12, x13, [%[a], 0]\n\t"
3579         "\n1:\n\t"
3580         "# mu = a[i] * mp\n\t"
3581         "mul	x9, %[mp], x12\n\t"
3582         "# a[i+0] += m[0] * mu\n\t"
3583         "mul	x7, x14, x9\n\t"
3584         "umulh	x8, x14, x9\n\t"
3585         "adds	x12, x12, x7\n\t"
3586         "# a[i+1] += m[1] * mu\n\t"
3587         "mul	x7, x15, x9\n\t"
3588         "adc	x6, x8, xzr\n\t"
3589         "umulh	x8, x15, x9\n\t"
3590         "adds	x12, x13, x7\n\t"
3591         "# a[i+2] += m[2] * mu\n\t"
3592         "ldr	x13, [%[a], 16]\n\t"
3593         "adc	x5, x8, xzr\n\t"
3594         "mul	x7, x16, x9\n\t"
3595         "adds	x12, x12, x6\n\t"
3596         "umulh	x8, x16, x9\n\t"
3597         "adc	x5, x5, xzr\n\t"
3598         "adds	x13, x13, x7\n\t"
3599         "# a[i+3] += m[3] * mu\n\t"
3600         "ldr	x10, [%[a], 24]\n\t"
3601         "adc	x6, x8, xzr\n\t"
3602         "mul	x7, x17, x9\n\t"
3603         "adds	x13, x13, x5\n\t"
3604         "umulh	x8, x17, x9\n\t"
3605         "adc	x6, x6, xzr\n\t"
3606         "adds	x10, x10, x7\n\t"
3607         "# a[i+4] += m[4] * mu\n\t"
3608         "ldr	x11, [%[a], 32]\n\t"
3609         "adc	x5, x8, xzr\n\t"
3610         "adds	x10, x10, x6\n\t"
3611         "mul	x7, x19, x9\n\t"
3612         "adc	x5, x5, xzr\n\t"
3613         "umulh	x8, x19, x9\n\t"
3614         "str	x10, [%[a], 24]\n\t"
3615         "adds	x11, x11, x7\n\t"
3616         "# a[i+5] += m[5] * mu\n\t"
3617         "ldr	x10, [%[a], 40]\n\t"
3618         "adc	x6, x8, xzr\n\t"
3619         "adds	x11, x11, x5\n\t"
3620         "mul	x7, x20, x9\n\t"
3621         "adc	x6, x6, xzr\n\t"
3622         "umulh	x8, x20, x9\n\t"
3623         "str	x11, [%[a], 32]\n\t"
3624         "adds	x10, x10, x7\n\t"
3625         "# a[i+6] += m[6] * mu\n\t"
3626         "ldr	x11, [%[a], 48]\n\t"
3627         "adc	x5, x8, xzr\n\t"
3628         "adds	x10, x10, x6\n\t"
3629         "mul	x7, x21, x9\n\t"
3630         "adc	x5, x5, xzr\n\t"
3631         "umulh	x8, x21, x9\n\t"
3632         "str	x10, [%[a], 40]\n\t"
3633         "adds	x11, x11, x7\n\t"
3634         "# a[i+7] += m[7] * mu\n\t"
3635         "ldr	x10, [%[a], 56]\n\t"
3636         "adc	x6, x8, xzr\n\t"
3637         "adds	x11, x11, x5\n\t"
3638         "mul	x7, x22, x9\n\t"
3639         "adc	x6, x6, xzr\n\t"
3640         "umulh	x8, x22, x9\n\t"
3641         "str	x11, [%[a], 48]\n\t"
3642         "adds	x10, x10, x7\n\t"
3643         "# a[i+8] += m[8] * mu\n\t"
3644         "ldr	x11, [%[a], 64]\n\t"
3645         "adc	x5, x8, xzr\n\t"
3646         "adds	x10, x10, x6\n\t"
3647         "mul	x7, x23, x9\n\t"
3648         "adc	x5, x5, xzr\n\t"
3649         "umulh	x8, x23, x9\n\t"
3650         "str	x10, [%[a], 56]\n\t"
3651         "adds	x11, x11, x7\n\t"
3652         "# a[i+9] += m[9] * mu\n\t"
3653         "ldr	x10, [%[a], 72]\n\t"
3654         "adc	x6, x8, xzr\n\t"
3655         "adds	x11, x11, x5\n\t"
3656         "mul	x7, x24, x9\n\t"
3657         "adc	x6, x6, xzr\n\t"
3658         "umulh	x8, x24, x9\n\t"
3659         "str	x11, [%[a], 64]\n\t"
3660         "adds	x10, x10, x7\n\t"
3661         "# a[i+10] += m[10] * mu\n\t"
3662         "ldr	x11, [%[a], 80]\n\t"
3663         "adc	x5, x8, xzr\n\t"
3664         "adds	x10, x10, x6\n\t"
3665         "mul	x7, x25, x9\n\t"
3666         "adc	x5, x5, xzr\n\t"
3667         "umulh	x8, x25, x9\n\t"
3668         "str	x10, [%[a], 72]\n\t"
3669         "adds	x11, x11, x7\n\t"
3670         "# a[i+11] += m[11] * mu\n\t"
3671         "ldr	x10, [%[a], 88]\n\t"
3672         "adc	x6, x8, xzr\n\t"
3673         "adds	x11, x11, x5\n\t"
3674         "mul	x7, x26, x9\n\t"
3675         "adc	x6, x6, xzr\n\t"
3676         "umulh	x8, x26, x9\n\t"
3677         "str	x11, [%[a], 80]\n\t"
3678         "adds	x10, x10, x7\n\t"
3679         "# a[i+12] += m[12] * mu\n\t"
3680         "ldr	x11, [%[a], 96]\n\t"
3681         "adc	x5, x8, xzr\n\t"
3682         "adds	x10, x10, x6\n\t"
3683         "mul	x7, x27, x9\n\t"
3684         "adc	x5, x5, xzr\n\t"
3685         "umulh	x8, x27, x9\n\t"
3686         "str	x10, [%[a], 88]\n\t"
3687         "adds	x11, x11, x7\n\t"
3688         "# a[i+13] += m[13] * mu\n\t"
3689         "ldr	x10, [%[a], 104]\n\t"
3690         "adc	x6, x8, xzr\n\t"
3691         "adds	x11, x11, x5\n\t"
3692         "mul	x7, x28, x9\n\t"
3693         "adc	x6, x6, xzr\n\t"
3694         "umulh	x8, x28, x9\n\t"
3695         "str	x11, [%[a], 96]\n\t"
3696         "adds	x10, x10, x7\n\t"
3697         "# a[i+14] += m[14] * mu\n\t"
3698         "ldr	x11, [%[a], 112]\n\t"
3699         "adc	x5, x8, xzr\n\t"
3700         "ldr	x8, [%[m], 112]\n\t"
3701         "adds	x10, x10, x6\n\t"
3702         "mul	x7, x8, x9\n\t"
3703         "adc	x5, x5, xzr\n\t"
3704         "umulh	x8, x8, x9\n\t"
3705         "str	x10, [%[a], 104]\n\t"
3706         "adds	x11, x11, x7\n\t"
3707         "# a[i+15] += m[15] * mu\n\t"
3708         "ldr	x10, [%[a], 120]\n\t"
3709         "adc	x6, x8, xzr\n\t"
3710         "ldr	x8, [%[m], 120]\n\t"
3711         "adds	x11, x11, x5\n\t"
3712         "mul	x7, x8, x9\n\t"
3713         "adc	x6, x6, xzr\n\t"
3714         "umulh	x8, x8, x9\n\t"
3715         "str	x11, [%[a], 112]\n\t"
3716         "adds	x10, x10, x7\n\t"
3717         "# a[i+16] += m[16] * mu\n\t"
3718         "ldr	x11, [%[a], 128]\n\t"
3719         "adc	x5, x8, xzr\n\t"
3720         "ldr	x8, [%[m], 128]\n\t"
3721         "adds	x10, x10, x6\n\t"
3722         "mul	x7, x8, x9\n\t"
3723         "adc	x5, x5, xzr\n\t"
3724         "umulh	x8, x8, x9\n\t"
3725         "str	x10, [%[a], 120]\n\t"
3726         "adds	x11, x11, x7\n\t"
3727         "# a[i+17] += m[17] * mu\n\t"
3728         "ldr	x10, [%[a], 136]\n\t"
3729         "adc	x6, x8, xzr\n\t"
3730         "ldr	x8, [%[m], 136]\n\t"
3731         "adds	x11, x11, x5\n\t"
3732         "mul	x7, x8, x9\n\t"
3733         "adc	x6, x6, xzr\n\t"
3734         "umulh	x8, x8, x9\n\t"
3735         "str	x11, [%[a], 128]\n\t"
3736         "adds	x10, x10, x7\n\t"
3737         "# a[i+18] += m[18] * mu\n\t"
3738         "ldr	x11, [%[a], 144]\n\t"
3739         "adc	x5, x8, xzr\n\t"
3740         "ldr	x8, [%[m], 144]\n\t"
3741         "adds	x10, x10, x6\n\t"
3742         "mul	x7, x8, x9\n\t"
3743         "adc	x5, x5, xzr\n\t"
3744         "umulh	x8, x8, x9\n\t"
3745         "str	x10, [%[a], 136]\n\t"
3746         "adds	x11, x11, x7\n\t"
3747         "# a[i+19] += m[19] * mu\n\t"
3748         "ldr	x10, [%[a], 152]\n\t"
3749         "adc	x6, x8, xzr\n\t"
3750         "ldr	x8, [%[m], 152]\n\t"
3751         "adds	x11, x11, x5\n\t"
3752         "mul	x7, x8, x9\n\t"
3753         "adc	x6, x6, xzr\n\t"
3754         "umulh	x8, x8, x9\n\t"
3755         "str	x11, [%[a], 144]\n\t"
3756         "adds	x10, x10, x7\n\t"
3757         "# a[i+20] += m[20] * mu\n\t"
3758         "ldr	x11, [%[a], 160]\n\t"
3759         "adc	x5, x8, xzr\n\t"
3760         "ldr	x8, [%[m], 160]\n\t"
3761         "adds	x10, x10, x6\n\t"
3762         "mul	x7, x8, x9\n\t"
3763         "adc	x5, x5, xzr\n\t"
3764         "umulh	x8, x8, x9\n\t"
3765         "str	x10, [%[a], 152]\n\t"
3766         "adds	x11, x11, x7\n\t"
3767         "# a[i+21] += m[21] * mu\n\t"
3768         "ldr	x10, [%[a], 168]\n\t"
3769         "adc	x6, x8, xzr\n\t"
3770         "ldr	x8, [%[m], 168]\n\t"
3771         "adds	x11, x11, x5\n\t"
3772         "mul	x7, x8, x9\n\t"
3773         "adc	x6, x6, xzr\n\t"
3774         "umulh	x8, x8, x9\n\t"
3775         "str	x11, [%[a], 160]\n\t"
3776         "adds	x10, x10, x7\n\t"
3777         "# a[i+22] += m[22] * mu\n\t"
3778         "ldr	x11, [%[a], 176]\n\t"
3779         "adc	x5, x8, xzr\n\t"
3780         "ldr	x8, [%[m], 176]\n\t"
3781         "adds	x10, x10, x6\n\t"
3782         "mul	x7, x8, x9\n\t"
3783         "adc	x5, x5, xzr\n\t"
3784         "umulh	x8, x8, x9\n\t"
3785         "str	x10, [%[a], 168]\n\t"
3786         "adds	x11, x11, x7\n\t"
3787         "# a[i+23] += m[23] * mu\n\t"
3788         "ldr	x10, [%[a], 184]\n\t"
3789         "adc	x6, x8, xzr\n\t"
3790         "ldr	x8, [%[m], 184]\n\t"
3791         "adds	x11, x11, x5\n\t"
3792         "mul	x7, x8, x9\n\t"
3793         "adc	x6, x6, xzr\n\t"
3794         "umulh	x8, x8, x9\n\t"
3795         "str	x11, [%[a], 176]\n\t"
3796         "adds	x10, x10, x7\n\t"
3797         "# a[i+24] += m[24] * mu\n\t"
3798         "ldr	x11, [%[a], 192]\n\t"
3799         "adc	x5, x8, xzr\n\t"
3800         "ldr	x8, [%[m], 192]\n\t"
3801         "adds	x10, x10, x6\n\t"
3802         "mul	x7, x8, x9\n\t"
3803         "adc	x5, x5, xzr\n\t"
3804         "umulh	x8, x8, x9\n\t"
3805         "str	x10, [%[a], 184]\n\t"
3806         "adds	x11, x11, x7\n\t"
3807         "# a[i+25] += m[25] * mu\n\t"
3808         "ldr	x10, [%[a], 200]\n\t"
3809         "adc	x6, x8, xzr\n\t"
3810         "ldr	x8, [%[m], 200]\n\t"
3811         "adds	x11, x11, x5\n\t"
3812         "mul	x7, x8, x9\n\t"
3813         "adc	x6, x6, xzr\n\t"
3814         "umulh	x8, x8, x9\n\t"
3815         "str	x11, [%[a], 192]\n\t"
3816         "adds	x10, x10, x7\n\t"
3817         "# a[i+26] += m[26] * mu\n\t"
3818         "ldr	x11, [%[a], 208]\n\t"
3819         "adc	x5, x8, xzr\n\t"
3820         "ldr	x8, [%[m], 208]\n\t"
3821         "adds	x10, x10, x6\n\t"
3822         "mul	x7, x8, x9\n\t"
3823         "adc	x5, x5, xzr\n\t"
3824         "umulh	x8, x8, x9\n\t"
3825         "str	x10, [%[a], 200]\n\t"
3826         "adds	x11, x11, x7\n\t"
3827         "# a[i+27] += m[27] * mu\n\t"
3828         "ldr	x10, [%[a], 216]\n\t"
3829         "adc	x6, x8, xzr\n\t"
3830         "ldr	x8, [%[m], 216]\n\t"
3831         "adds	x11, x11, x5\n\t"
3832         "mul	x7, x8, x9\n\t"
3833         "adc	x6, x6, xzr\n\t"
3834         "umulh	x8, x8, x9\n\t"
3835         "str	x11, [%[a], 208]\n\t"
3836         "adds	x10, x10, x7\n\t"
3837         "# a[i+28] += m[28] * mu\n\t"
3838         "ldr	x11, [%[a], 224]\n\t"
3839         "adc	x5, x8, xzr\n\t"
3840         "ldr	x8, [%[m], 224]\n\t"
3841         "adds	x10, x10, x6\n\t"
3842         "mul	x7, x8, x9\n\t"
3843         "adc	x5, x5, xzr\n\t"
3844         "umulh	x8, x8, x9\n\t"
3845         "str	x10, [%[a], 216]\n\t"
3846         "adds	x11, x11, x7\n\t"
3847         "# a[i+29] += m[29] * mu\n\t"
3848         "ldr	x10, [%[a], 232]\n\t"
3849         "adc	x6, x8, xzr\n\t"
3850         "ldr	x8, [%[m], 232]\n\t"
3851         "adds	x11, x11, x5\n\t"
3852         "mul	x7, x8, x9\n\t"
3853         "adc	x6, x6, xzr\n\t"
3854         "umulh	x8, x8, x9\n\t"
3855         "str	x11, [%[a], 224]\n\t"
3856         "adds	x10, x10, x7\n\t"
3857         "# a[i+30] += m[30] * mu\n\t"
3858         "ldr	x11, [%[a], 240]\n\t"
3859         "adc	x5, x8, xzr\n\t"
3860         "ldr	x8, [%[m], 240]\n\t"
3861         "adds	x10, x10, x6\n\t"
3862         "mul	x7, x8, x9\n\t"
3863         "adc	x5, x5, xzr\n\t"
3864         "umulh	x8, x8, x9\n\t"
3865         "str	x10, [%[a], 232]\n\t"
3866         "adds	x11, x11, x7\n\t"
3867         "# a[i+31] += m[31] * mu\n\t"
3868         "ldr	x10, [%[a], 248]\n\t"
3869         "adc	x6, x8, xzr\n\t"
3870         "ldr	x8, [%[m], 248]\n\t"
3871         "adds	x11, x11, x5\n\t"
3872         "mul	x7, x8, x9\n\t"
3873         "adc	x6, x6, xzr\n\t"
3874         "umulh	x8, x8, x9\n\t"
3875         "adds	x6, x6, x7\n\t"
3876         "adcs	x8, x8, x3\n\t"
3877         "str	x11, [%[a], 240]\n\t"
3878         "cset  x3, cs\n\t"
3879         "adds	x10, x10, x6\n\t"
3880         "ldr	x11, [%[a], 256]\n\t"
3881         "str	x10, [%[a], 248]\n\t"
3882         "adcs	x11, x11, x8\n\t"
3883         "str	x11, [%[a], 256]\n\t"
3884         "adc	x3, x3, xzr\n\t"
3885         "subs	x4, x4, 1\n\t"
3886         "add	%[a], %[a], 8\n\t"
3887         "bne	1b\n\t"
3888         "# x12 and x13 hold a[0] and a[1]\n\t"
3889         "# Create mask\n\t"
3890         "neg       x3, x3\n\t"
3891         "mov   x9, %[a]\n\t"
3892         "sub   %[a], %[a], 256\n\t"
3893         "# Subtract masked modulus\n\t"
3894         "# x12 and x13 hold a[0] and a[1]\n\t"
3895         "and       x14, x14, x3\n\t"
3896         "ldp       x11, x10, [x9, 16]\n\t"
3897         "and       x15, x15, x3\n\t"
3898         "subs      x12, x12, x14\n\t"
3899         "and       x16, x16, x3\n\t"
3900         "sbcs      x13, x13, x15\n\t"
3901         "and       x17, x17, x3\n\t"
3902         "sbcs      x11, x11, x16\n\t"
3903         "stp       x12, x13, [%[a], 0]\n\t"
3904         "sbcs      x10, x10, x17\n\t"
3905         "stp       x11, x10, [%[a], 16]\n\t"
3906         "ldp       x12, x13, [x9, 32]\n\t"
3907         "and       x19, x19, x3\n\t"
3908         "ldp       x11, x10, [x9, 48]\n\t"
3909         "and       x20, x20, x3\n\t"
3910         "sbcs      x12, x12, x19\n\t"
3911         "and       x21, x21, x3\n\t"
3912         "sbcs      x13, x13, x20\n\t"
3913         "and       x22, x22, x3\n\t"
3914         "sbcs      x11, x11, x21\n\t"
3915         "stp       x12, x13, [%[a], 32]\n\t"
3916         "sbcs      x10, x10, x22\n\t"
3917         "stp       x11, x10, [%[a], 48]\n\t"
3918         "ldp       x12, x13, [x9, 64]\n\t"
3919         "and       x23, x23, x3\n\t"
3920         "ldp       x11, x10, [x9, 80]\n\t"
3921         "and       x24, x24, x3\n\t"
3922         "sbcs      x12, x12, x23\n\t"
3923         "and       x25, x25, x3\n\t"
3924         "sbcs      x13, x13, x24\n\t"
3925         "and       x26, x26, x3\n\t"
3926         "sbcs      x11, x11, x25\n\t"
3927         "stp       x12, x13, [%[a], 64]\n\t"
3928         "sbcs      x10, x10, x26\n\t"
3929         "stp       x11, x10, [%[a], 80]\n\t"
3930         "ldp       x7, x8, [%[m], 112]\n\t"
3931         "ldp       x12, x13, [x9, 96]\n\t"
3932         "and       x27, x27, x3\n\t"
3933         "ldp       x11, x10, [x9, 112]\n\t"
3934         "and       x28, x28, x3\n\t"
3935         "sbcs      x12, x12, x27\n\t"
3936         "and       x7, x7, x3\n\t"
3937         "sbcs      x13, x13, x28\n\t"
3938         "and       x8, x8, x3\n\t"
3939         "sbcs      x11, x11, x7\n\t"
3940         "stp       x12, x13, [%[a], 96]\n\t"
3941         "sbcs      x10, x10, x8\n\t"
3942         "stp       x11, x10, [%[a], 112]\n\t"
3943         "ldp       x5, x6, [%[m], 128]\n\t"
3944         "ldp       x7, x8, [%[m], 144]\n\t"
3945         "ldp       x12, x13, [x9, 128]\n\t"
3946         "and       x5, x5, x3\n\t"
3947         "ldp       x11, x10, [x9, 144]\n\t"
3948         "and       x6, x6, x3\n\t"
3949         "sbcs      x12, x12, x5\n\t"
3950         "and       x7, x7, x3\n\t"
3951         "sbcs      x13, x13, x6\n\t"
3952         "and       x8, x8, x3\n\t"
3953         "sbcs      x11, x11, x7\n\t"
3954         "stp       x12, x13, [%[a], 128]\n\t"
3955         "sbcs      x10, x10, x8\n\t"
3956         "stp       x11, x10, [%[a], 144]\n\t"
3957         "ldp       x5, x6, [%[m], 160]\n\t"
3958         "ldp       x7, x8, [%[m], 176]\n\t"
3959         "ldp       x12, x13, [x9, 160]\n\t"
3960         "and       x5, x5, x3\n\t"
3961         "ldp       x11, x10, [x9, 176]\n\t"
3962         "and       x6, x6, x3\n\t"
3963         "sbcs      x12, x12, x5\n\t"
3964         "and       x7, x7, x3\n\t"
3965         "sbcs      x13, x13, x6\n\t"
3966         "and       x8, x8, x3\n\t"
3967         "sbcs      x11, x11, x7\n\t"
3968         "stp       x12, x13, [%[a], 160]\n\t"
3969         "sbcs      x10, x10, x8\n\t"
3970         "stp       x11, x10, [%[a], 176]\n\t"
3971         "ldp       x5, x6, [%[m], 192]\n\t"
3972         "ldp       x7, x8, [%[m], 208]\n\t"
3973         "ldp       x12, x13, [x9, 192]\n\t"
3974         "and       x5, x5, x3\n\t"
3975         "ldp       x11, x10, [x9, 208]\n\t"
3976         "and       x6, x6, x3\n\t"
3977         "sbcs      x12, x12, x5\n\t"
3978         "and       x7, x7, x3\n\t"
3979         "sbcs      x13, x13, x6\n\t"
3980         "and       x8, x8, x3\n\t"
3981         "sbcs      x11, x11, x7\n\t"
3982         "stp       x12, x13, [%[a], 192]\n\t"
3983         "sbcs      x10, x10, x8\n\t"
3984         "stp       x11, x10, [%[a], 208]\n\t"
3985         "ldp       x5, x6, [%[m], 224]\n\t"
3986         "ldp       x7, x8, [%[m], 240]\n\t"
3987         "ldp       x12, x13, [x9, 224]\n\t"
3988         "and       x5, x5, x3\n\t"
3989         "ldp       x11, x10, [x9, 240]\n\t"
3990         "and       x6, x6, x3\n\t"
3991         "sbcs      x12, x12, x5\n\t"
3992         "and       x7, x7, x3\n\t"
3993         "sbcs      x13, x13, x6\n\t"
3994         "and       x8, x8, x3\n\t"
3995         "sbcs      x11, x11, x7\n\t"
3996         "stp       x12, x13, [%[a], 224]\n\t"
3997         "sbcs      x10, x10, x8\n\t"
3998         "stp       x11, x10, [%[a], 240]\n\t"
3999         : [a] "+r" (a)
4000         : [m] "r" (m), [mp] "r" (mp)
4001         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
4002     );
4003 
4004 }
4005 
4006 /* Multiply two Montgomery form numbers mod the modulus (prime).
4007  * (r = a * b mod m)
4008  *
4009  * r   Result of multiplication.
4010  * a   First number to multiply in Montgomery form.
4011  * b   Second number to multiply in Montgomery form.
4012  * m   Modulus (prime).
4013  * mp  Montgomery mulitplier.
4014  */
sp_2048_mont_mul_32(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m,sp_digit mp)4015 static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a,
4016         const sp_digit* b, const sp_digit* m, sp_digit mp)
4017 {
4018     sp_2048_mul_32(r, a, b);
4019     sp_2048_mont_reduce_32(r, m, mp);
4020 }
4021 
4022 /* Square the Montgomery form number. (r = a * a mod m)
4023  *
4024  * r   Result of squaring.
4025  * a   Number to square in Montgomery form.
4026  * m   Modulus (prime).
4027  * mp  Montgomery mulitplier.
4028  */
sp_2048_mont_sqr_32(sp_digit * r,const sp_digit * a,const sp_digit * m,sp_digit mp)4029 static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a,
4030         const sp_digit* m, sp_digit mp)
4031 {
4032     sp_2048_sqr_32(r, a);
4033     sp_2048_mont_reduce_32(r, m, mp);
4034 }
4035 
4036 #ifdef WOLFSSL_SP_SMALL
4037 /* Sub b from a into r. (r = a - b)
4038  *
4039  * r  A single precision integer.
4040  * a  A single precision integer.
4041  * b  A single precision integer.
4042  */
sp_2048_sub_32(sp_digit * r,const sp_digit * a,const sp_digit * b)4043 static sp_digit sp_2048_sub_32(sp_digit* r, const sp_digit* a,
4044         const sp_digit* b)
4045 {
4046     sp_digit c = 0;
4047 
4048     __asm__ __volatile__ (
4049         "add	x11, %[a], 256\n\t"
4050         "\n1:\n\t"
4051         "subs	%[c], xzr, %[c]\n\t"
4052         "ldp	x3, x4, [%[a]], #16\n\t"
4053         "ldp	x5, x6, [%[a]], #16\n\t"
4054         "ldp	x7, x8, [%[b]], #16\n\t"
4055         "sbcs	x3, x3, x7\n\t"
4056         "ldp	x9, x10, [%[b]], #16\n\t"
4057         "sbcs	x4, x4, x8\n\t"
4058         "sbcs	x5, x5, x9\n\t"
4059         "stp	x3, x4, [%[r]], #16\n\t"
4060         "sbcs	x6, x6, x10\n\t"
4061         "stp	x5, x6, [%[r]], #16\n\t"
4062         "csetm	%[c], cc\n\t"
4063         "cmp	%[a], x11\n\t"
4064         "b.ne	1b\n\t"
4065         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
4066         :
4067         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
4068     );
4069 
4070     return c;
4071 }
4072 
4073 #else
4074 /* Sub b from a into r. (r = a - b)
4075  *
4076  * r  A single precision integer.
4077  * a  A single precision integer.
4078  * b  A single precision integer.
4079  */
sp_2048_sub_32(sp_digit * r,const sp_digit * a,const sp_digit * b)4080 static sp_digit sp_2048_sub_32(sp_digit* r, const sp_digit* a,
4081         const sp_digit* b)
4082 {
4083     __asm__ __volatile__ (
4084         "ldp	x3, x4, [%[a], 0]\n\t"
4085         "ldp	x7, x8, [%[b], 0]\n\t"
4086         "subs	x3, x3, x7\n\t"
4087         "ldp	x5, x6, [%[a], 16]\n\t"
4088         "sbcs	x4, x4, x8\n\t"
4089         "ldp	x9, x10, [%[b], 16]\n\t"
4090         "sbcs	x5, x5, x9\n\t"
4091         "stp	x3, x4, [%[r], 0]\n\t"
4092         "sbcs	x6, x6, x10\n\t"
4093         "stp	x5, x6, [%[r], 16]\n\t"
4094         "ldp	x3, x4, [%[a], 32]\n\t"
4095         "ldp	x7, x8, [%[b], 32]\n\t"
4096         "sbcs	x3, x3, x7\n\t"
4097         "ldp	x5, x6, [%[a], 48]\n\t"
4098         "sbcs	x4, x4, x8\n\t"
4099         "ldp	x9, x10, [%[b], 48]\n\t"
4100         "sbcs	x5, x5, x9\n\t"
4101         "stp	x3, x4, [%[r], 32]\n\t"
4102         "sbcs	x6, x6, x10\n\t"
4103         "stp	x5, x6, [%[r], 48]\n\t"
4104         "ldp	x3, x4, [%[a], 64]\n\t"
4105         "ldp	x7, x8, [%[b], 64]\n\t"
4106         "sbcs	x3, x3, x7\n\t"
4107         "ldp	x5, x6, [%[a], 80]\n\t"
4108         "sbcs	x4, x4, x8\n\t"
4109         "ldp	x9, x10, [%[b], 80]\n\t"
4110         "sbcs	x5, x5, x9\n\t"
4111         "stp	x3, x4, [%[r], 64]\n\t"
4112         "sbcs	x6, x6, x10\n\t"
4113         "stp	x5, x6, [%[r], 80]\n\t"
4114         "ldp	x3, x4, [%[a], 96]\n\t"
4115         "ldp	x7, x8, [%[b], 96]\n\t"
4116         "sbcs	x3, x3, x7\n\t"
4117         "ldp	x5, x6, [%[a], 112]\n\t"
4118         "sbcs	x4, x4, x8\n\t"
4119         "ldp	x9, x10, [%[b], 112]\n\t"
4120         "sbcs	x5, x5, x9\n\t"
4121         "stp	x3, x4, [%[r], 96]\n\t"
4122         "sbcs	x6, x6, x10\n\t"
4123         "stp	x5, x6, [%[r], 112]\n\t"
4124         "ldp	x3, x4, [%[a], 128]\n\t"
4125         "ldp	x7, x8, [%[b], 128]\n\t"
4126         "sbcs	x3, x3, x7\n\t"
4127         "ldp	x5, x6, [%[a], 144]\n\t"
4128         "sbcs	x4, x4, x8\n\t"
4129         "ldp	x9, x10, [%[b], 144]\n\t"
4130         "sbcs	x5, x5, x9\n\t"
4131         "stp	x3, x4, [%[r], 128]\n\t"
4132         "sbcs	x6, x6, x10\n\t"
4133         "stp	x5, x6, [%[r], 144]\n\t"
4134         "ldp	x3, x4, [%[a], 160]\n\t"
4135         "ldp	x7, x8, [%[b], 160]\n\t"
4136         "sbcs	x3, x3, x7\n\t"
4137         "ldp	x5, x6, [%[a], 176]\n\t"
4138         "sbcs	x4, x4, x8\n\t"
4139         "ldp	x9, x10, [%[b], 176]\n\t"
4140         "sbcs	x5, x5, x9\n\t"
4141         "stp	x3, x4, [%[r], 160]\n\t"
4142         "sbcs	x6, x6, x10\n\t"
4143         "stp	x5, x6, [%[r], 176]\n\t"
4144         "ldp	x3, x4, [%[a], 192]\n\t"
4145         "ldp	x7, x8, [%[b], 192]\n\t"
4146         "sbcs	x3, x3, x7\n\t"
4147         "ldp	x5, x6, [%[a], 208]\n\t"
4148         "sbcs	x4, x4, x8\n\t"
4149         "ldp	x9, x10, [%[b], 208]\n\t"
4150         "sbcs	x5, x5, x9\n\t"
4151         "stp	x3, x4, [%[r], 192]\n\t"
4152         "sbcs	x6, x6, x10\n\t"
4153         "stp	x5, x6, [%[r], 208]\n\t"
4154         "ldp	x3, x4, [%[a], 224]\n\t"
4155         "ldp	x7, x8, [%[b], 224]\n\t"
4156         "sbcs	x3, x3, x7\n\t"
4157         "ldp	x5, x6, [%[a], 240]\n\t"
4158         "sbcs	x4, x4, x8\n\t"
4159         "ldp	x9, x10, [%[b], 240]\n\t"
4160         "sbcs	x5, x5, x9\n\t"
4161         "stp	x3, x4, [%[r], 224]\n\t"
4162         "sbcs	x6, x6, x10\n\t"
4163         "stp	x5, x6, [%[r], 240]\n\t"
4164         "csetm	%[r], cc\n\t"
4165         : [r] "+r" (r)
4166         : [a] "r" (a), [b] "r" (b)
4167         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
4168     );
4169 
4170     return (sp_digit)r;
4171 }
4172 
4173 #endif /* WOLFSSL_SP_SMALL */
4174 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
4175  *
4176  * d1   The high order half of the number to divide.
4177  * d0   The low order half of the number to divide.
4178  * div  The dividend.
4179  * returns the result of the division.
4180  */
div_2048_word_32(sp_digit d1,sp_digit d0,sp_digit div)4181 static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0, sp_digit div)
4182 {
4183     sp_digit r;
4184 
4185     __asm__ __volatile__ (
4186         "lsr	x5, %[div], 32\n\t"
4187         "add	x5, x5, 1\n\t"
4188 
4189         "udiv	x3, %[d1], x5\n\t"
4190         "lsl	x6, x3, 32\n\t"
4191         "mul	x4, %[div], x6\n\t"
4192         "umulh	x3, %[div], x6\n\t"
4193         "subs	%[d0], %[d0], x4\n\t"
4194         "sbc	%[d1], %[d1], x3\n\t"
4195 
4196         "udiv	x3, %[d1], x5\n\t"
4197         "lsl	x3, x3, 32\n\t"
4198         "add	x6, x6, x3\n\t"
4199         "mul	x4, %[div], x3\n\t"
4200         "umulh	x3, %[div], x3\n\t"
4201         "subs	%[d0], %[d0], x4\n\t"
4202         "sbc	%[d1], %[d1], x3\n\t"
4203 
4204         "lsr	x3, %[d0], 32\n\t"
4205         "orr	x3, x3, %[d1], lsl 32\n\t"
4206 
4207         "udiv	x3, x3, x5\n\t"
4208         "add	x6, x6, x3\n\t"
4209         "mul	x4, %[div], x3\n\t"
4210         "umulh	x3, %[div], x3\n\t"
4211         "subs	%[d0], %[d0], x4\n\t"
4212         "sbc	%[d1], %[d1], x3\n\t"
4213 
4214         "lsr	x3, %[d0], 32\n\t"
4215         "orr	x3, x3, %[d1], lsl 32\n\t"
4216 
4217         "udiv	x3, x3, x5\n\t"
4218         "add	x6, x6, x3\n\t"
4219         "mul	x4, %[div], x3\n\t"
4220         "sub	%[d0], %[d0], x4\n\t"
4221 
4222         "udiv	x3, %[d0], %[div]\n\t"
4223         "add	%[r], x6, x3\n\t"
4224 
4225         : [r] "=r" (r)
4226         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
4227         : "x3", "x4", "x5", "x6"
4228     );
4229 
4230     return r;
4231 }
4232 
4233 /* Divide d in a and put remainder into r (m*d + r = a)
4234  * m is not calculated as it is not needed at this time.
4235  *
4236  * a  Number to be divided.
4237  * d  Number to divide with.
4238  * m  Multiplier result.
4239  * r  Remainder from the division.
4240  * returns MP_OKAY indicating success.
4241  */
sp_2048_div_32_cond(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)4242 static WC_INLINE int sp_2048_div_32_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
4243         sp_digit* r)
4244 {
4245     sp_digit t1[64], t2[33];
4246     sp_digit div, r1;
4247     int i;
4248 
4249     (void)m;
4250 
4251     div = d[31];
4252     XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
4253     for (i=31; i>=0; i--) {
4254         sp_digit hi = t1[32 + i] - (t1[32 + i] == div);
4255         r1 = div_2048_word_32(hi, t1[32 + i - 1], div);
4256 
4257         sp_2048_mul_d_32(t2, d, r1);
4258         t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
4259         t1[32 + i] -= t2[32];
4260         if (t1[32 + i] != 0) {
4261             t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], d);
4262             if (t1[32 + i] != 0)
4263                 t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], d);
4264         }
4265     }
4266 
4267     for (i = 31; i > 0; i--) {
4268         if (t1[i] != d[i])
4269             break;
4270     }
4271     if (t1[i] >= d[i]) {
4272         sp_2048_sub_32(r, t1, d);
4273     }
4274     else {
4275         XMEMCPY(r, t1, sizeof(*t1) * 32);
4276     }
4277 
4278     return MP_OKAY;
4279 }
4280 
4281 /* Reduce a modulo m into r. (r = a mod m)
4282  *
4283  * r  A single precision number that is the reduced result.
4284  * a  A single precision number that is to be reduced.
4285  * m  A single precision number that is the modulus to reduce with.
4286  * returns MP_OKAY indicating success.
4287  */
sp_2048_mod_32_cond(sp_digit * r,const sp_digit * a,const sp_digit * m)4288 static WC_INLINE int sp_2048_mod_32_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
4289 {
4290     return sp_2048_div_32_cond(a, m, NULL, r);
4291 }
4292 
4293 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
4294 /* Conditionally subtract b from a using the mask m.
4295  * m is -1 to subtract and 0 when not copying.
4296  *
4297  * r  A single precision number representing condition subtract result.
4298  * a  A single precision number to subtract from.
4299  * b  A single precision number to subtract.
4300  * m  Mask value to apply.
4301  */
sp_2048_cond_sub_32(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)4302 static sp_digit sp_2048_cond_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b,
4303         sp_digit m)
4304 {
4305 #ifdef WOLFSSL_SP_SMALL
4306     sp_digit c = 0;
4307 
4308     __asm__ __volatile__ (
4309         "mov	x8, #0\n\t"
4310         "1:\n\t"
4311         "subs	%[c], xzr, %[c]\n\t"
4312         "ldr	x4, [%[a], x8]\n\t"
4313         "ldr	x5, [%[b], x8]\n\t"
4314         "and	x5, x5, %[m]\n\t"
4315         "sbcs	x4, x4, x5\n\t"
4316         "csetm	%[c], cc\n\t"
4317         "str	x4, [%[r], x8]\n\t"
4318         "add	x8, x8, #8\n\t"
4319         "cmp	x8, 256\n\t"
4320         "b.lt	1b\n\t"
4321         : [c] "+r" (c)
4322         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
4323         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
4324     );
4325 
4326     return c;
4327 #else
4328     __asm__ __volatile__ (
4329 
4330         "ldp	x5, x7, [%[b], 0]\n\t"
4331         "ldp	x11, x12, [%[b], 16]\n\t"
4332         "ldp	x4, x6, [%[a], 0]\n\t"
4333         "and	x5, x5, %[m]\n\t"
4334         "ldp	x9, x10, [%[a], 16]\n\t"
4335         "and	x7, x7, %[m]\n\t"
4336         "subs	x4, x4, x5\n\t"
4337         "and	x11, x11, %[m]\n\t"
4338         "sbcs	x6, x6, x7\n\t"
4339         "and	x12, x12, %[m]\n\t"
4340         "sbcs	x9, x9, x11\n\t"
4341         "stp	x4, x6, [%[r], 0]\n\t"
4342         "sbcs	x10, x10, x12\n\t"
4343         "stp	x9, x10, [%[r], 16]\n\t"
4344         "ldp	x5, x7, [%[b], 32]\n\t"
4345         "ldp	x11, x12, [%[b], 48]\n\t"
4346         "ldp	x4, x6, [%[a], 32]\n\t"
4347         "and	x5, x5, %[m]\n\t"
4348         "ldp	x9, x10, [%[a], 48]\n\t"
4349         "and	x7, x7, %[m]\n\t"
4350         "sbcs	x4, x4, x5\n\t"
4351         "and	x11, x11, %[m]\n\t"
4352         "sbcs	x6, x6, x7\n\t"
4353         "and	x12, x12, %[m]\n\t"
4354         "sbcs	x9, x9, x11\n\t"
4355         "stp	x4, x6, [%[r], 32]\n\t"
4356         "sbcs	x10, x10, x12\n\t"
4357         "stp	x9, x10, [%[r], 48]\n\t"
4358         "ldp	x5, x7, [%[b], 64]\n\t"
4359         "ldp	x11, x12, [%[b], 80]\n\t"
4360         "ldp	x4, x6, [%[a], 64]\n\t"
4361         "and	x5, x5, %[m]\n\t"
4362         "ldp	x9, x10, [%[a], 80]\n\t"
4363         "and	x7, x7, %[m]\n\t"
4364         "sbcs	x4, x4, x5\n\t"
4365         "and	x11, x11, %[m]\n\t"
4366         "sbcs	x6, x6, x7\n\t"
4367         "and	x12, x12, %[m]\n\t"
4368         "sbcs	x9, x9, x11\n\t"
4369         "stp	x4, x6, [%[r], 64]\n\t"
4370         "sbcs	x10, x10, x12\n\t"
4371         "stp	x9, x10, [%[r], 80]\n\t"
4372         "ldp	x5, x7, [%[b], 96]\n\t"
4373         "ldp	x11, x12, [%[b], 112]\n\t"
4374         "ldp	x4, x6, [%[a], 96]\n\t"
4375         "and	x5, x5, %[m]\n\t"
4376         "ldp	x9, x10, [%[a], 112]\n\t"
4377         "and	x7, x7, %[m]\n\t"
4378         "sbcs	x4, x4, x5\n\t"
4379         "and	x11, x11, %[m]\n\t"
4380         "sbcs	x6, x6, x7\n\t"
4381         "and	x12, x12, %[m]\n\t"
4382         "sbcs	x9, x9, x11\n\t"
4383         "stp	x4, x6, [%[r], 96]\n\t"
4384         "sbcs	x10, x10, x12\n\t"
4385         "stp	x9, x10, [%[r], 112]\n\t"
4386         "ldp	x5, x7, [%[b], 128]\n\t"
4387         "ldp	x11, x12, [%[b], 144]\n\t"
4388         "ldp	x4, x6, [%[a], 128]\n\t"
4389         "and	x5, x5, %[m]\n\t"
4390         "ldp	x9, x10, [%[a], 144]\n\t"
4391         "and	x7, x7, %[m]\n\t"
4392         "sbcs	x4, x4, x5\n\t"
4393         "and	x11, x11, %[m]\n\t"
4394         "sbcs	x6, x6, x7\n\t"
4395         "and	x12, x12, %[m]\n\t"
4396         "sbcs	x9, x9, x11\n\t"
4397         "stp	x4, x6, [%[r], 128]\n\t"
4398         "sbcs	x10, x10, x12\n\t"
4399         "stp	x9, x10, [%[r], 144]\n\t"
4400         "ldp	x5, x7, [%[b], 160]\n\t"
4401         "ldp	x11, x12, [%[b], 176]\n\t"
4402         "ldp	x4, x6, [%[a], 160]\n\t"
4403         "and	x5, x5, %[m]\n\t"
4404         "ldp	x9, x10, [%[a], 176]\n\t"
4405         "and	x7, x7, %[m]\n\t"
4406         "sbcs	x4, x4, x5\n\t"
4407         "and	x11, x11, %[m]\n\t"
4408         "sbcs	x6, x6, x7\n\t"
4409         "and	x12, x12, %[m]\n\t"
4410         "sbcs	x9, x9, x11\n\t"
4411         "stp	x4, x6, [%[r], 160]\n\t"
4412         "sbcs	x10, x10, x12\n\t"
4413         "stp	x9, x10, [%[r], 176]\n\t"
4414         "ldp	x5, x7, [%[b], 192]\n\t"
4415         "ldp	x11, x12, [%[b], 208]\n\t"
4416         "ldp	x4, x6, [%[a], 192]\n\t"
4417         "and	x5, x5, %[m]\n\t"
4418         "ldp	x9, x10, [%[a], 208]\n\t"
4419         "and	x7, x7, %[m]\n\t"
4420         "sbcs	x4, x4, x5\n\t"
4421         "and	x11, x11, %[m]\n\t"
4422         "sbcs	x6, x6, x7\n\t"
4423         "and	x12, x12, %[m]\n\t"
4424         "sbcs	x9, x9, x11\n\t"
4425         "stp	x4, x6, [%[r], 192]\n\t"
4426         "sbcs	x10, x10, x12\n\t"
4427         "stp	x9, x10, [%[r], 208]\n\t"
4428         "ldp	x5, x7, [%[b], 224]\n\t"
4429         "ldp	x11, x12, [%[b], 240]\n\t"
4430         "ldp	x4, x6, [%[a], 224]\n\t"
4431         "and	x5, x5, %[m]\n\t"
4432         "ldp	x9, x10, [%[a], 240]\n\t"
4433         "and	x7, x7, %[m]\n\t"
4434         "sbcs	x4, x4, x5\n\t"
4435         "and	x11, x11, %[m]\n\t"
4436         "sbcs	x6, x6, x7\n\t"
4437         "and	x12, x12, %[m]\n\t"
4438         "sbcs	x9, x9, x11\n\t"
4439         "stp	x4, x6, [%[r], 224]\n\t"
4440         "sbcs	x10, x10, x12\n\t"
4441         "stp	x9, x10, [%[r], 240]\n\t"
4442         "csetm	%[r], cc\n\t"
4443         : [r] "+r" (r)
4444         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
4445         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
4446     );
4447 
4448     return (sp_digit)r;
4449 #endif /* WOLFSSL_SP_SMALL */
4450 }
4451 
4452 /* AND m into each word of a and store in r.
4453  *
4454  * r  A single precision integer.
4455  * a  A single precision integer.
4456  * m  Mask to AND against each digit.
4457  */
sp_2048_mask_32(sp_digit * r,const sp_digit * a,sp_digit m)4458 static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
4459 {
4460 #ifdef WOLFSSL_SP_SMALL
4461     int i;
4462 
4463     for (i=0; i<32; i++) {
4464         r[i] = a[i] & m;
4465     }
4466 #else
4467     int i;
4468 
4469     for (i = 0; i < 32; i += 8) {
4470         r[i+0] = a[i+0] & m;
4471         r[i+1] = a[i+1] & m;
4472         r[i+2] = a[i+2] & m;
4473         r[i+3] = a[i+3] & m;
4474         r[i+4] = a[i+4] & m;
4475         r[i+5] = a[i+5] & m;
4476         r[i+6] = a[i+6] & m;
4477         r[i+7] = a[i+7] & m;
4478     }
4479 #endif
4480 }
4481 
4482 /* Compare a with b in constant time.
4483  *
4484  * a  A single precision integer.
4485  * b  A single precision integer.
4486  * return -ve, 0 or +ve if a is less than, equal to or greater than b
4487  * respectively.
4488  */
sp_2048_cmp_32(const sp_digit * a,const sp_digit * b)4489 static sp_int64 sp_2048_cmp_32(const sp_digit* a, const sp_digit* b)
4490 {
4491 #ifdef WOLFSSL_SP_SMALL
4492     __asm__ __volatile__ (
4493         "mov	x2, -1\n\t"
4494         "mov	x3, 1\n\t"
4495         "mov	x4, -1\n\t"
4496         "mov	x5, 248\n\t"
4497         "1:\n\t"
4498         "ldr	x6, [%[a], x5]\n\t"
4499         "ldr	x7, [%[b], x5]\n\t"
4500         "and	x6, x6, x4\n\t"
4501         "and	x7, x7, x4\n\t"
4502         "subs	x6, x6, x7\n\t"
4503         "csel	x2, x3, x2, hi\n\t"
4504         "csel	x2, x4, x2, lo\n\t"
4505         "csel	x4, x4, xzr, eq\n\t"
4506         "subs	x5, x5, #8\n\t"
4507         "b.cs	1b\n\t"
4508         "eor	%[a], x2, x4\n\t"
4509         : [a] "+r" (a)
4510         : [b] "r" (b)
4511         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
4512     );
4513 #else
4514     __asm__ __volatile__ (
4515         "mov	x2, -1\n\t"
4516         "mov	x3, 1\n\t"
4517         "mov  x4, -1\n\t"
4518         "ldp	x5, x6, [%[a], 240]\n\t"
4519         "ldp	x7, x8, [%[b], 240]\n\t"
4520         "and	x6, x6, x4\n\t"
4521         "and	x8, x8, x4\n\t"
4522         "subs	x6, x6, x8\n\t"
4523         "csel	x2, x4, x2, lo\n\t"
4524         "csel	x4, x4, xzr, eq\n\t"
4525         "csel	x2, x3, x2, hi\n\t"
4526         "and	x5, x5, x4\n\t"
4527         "and	x7, x7, x4\n\t"
4528         "subs	x5, x5, x7\n\t"
4529         "csel	x2, x4, x2, lo\n\t"
4530         "csel	x4, x4, xzr, eq\n\t"
4531         "csel	x2, x3, x2, hi\n\t"
4532         "ldp	x5, x6, [%[a], 224]\n\t"
4533         "ldp	x7, x8, [%[b], 224]\n\t"
4534         "and	x6, x6, x4\n\t"
4535         "and	x8, x8, x4\n\t"
4536         "subs	x6, x6, x8\n\t"
4537         "csel	x2, x4, x2, lo\n\t"
4538         "csel	x4, x4, xzr, eq\n\t"
4539         "csel	x2, x3, x2, hi\n\t"
4540         "and	x5, x5, x4\n\t"
4541         "and	x7, x7, x4\n\t"
4542         "subs	x5, x5, x7\n\t"
4543         "csel	x2, x4, x2, lo\n\t"
4544         "csel	x4, x4, xzr, eq\n\t"
4545         "csel	x2, x3, x2, hi\n\t"
4546         "ldp	x5, x6, [%[a], 208]\n\t"
4547         "ldp	x7, x8, [%[b], 208]\n\t"
4548         "and	x6, x6, x4\n\t"
4549         "and	x8, x8, x4\n\t"
4550         "subs	x6, x6, x8\n\t"
4551         "csel	x2, x4, x2, lo\n\t"
4552         "csel	x4, x4, xzr, eq\n\t"
4553         "csel	x2, x3, x2, hi\n\t"
4554         "and	x5, x5, x4\n\t"
4555         "and	x7, x7, x4\n\t"
4556         "subs	x5, x5, x7\n\t"
4557         "csel	x2, x4, x2, lo\n\t"
4558         "csel	x4, x4, xzr, eq\n\t"
4559         "csel	x2, x3, x2, hi\n\t"
4560         "ldp	x5, x6, [%[a], 192]\n\t"
4561         "ldp	x7, x8, [%[b], 192]\n\t"
4562         "and	x6, x6, x4\n\t"
4563         "and	x8, x8, x4\n\t"
4564         "subs	x6, x6, x8\n\t"
4565         "csel	x2, x4, x2, lo\n\t"
4566         "csel	x4, x4, xzr, eq\n\t"
4567         "csel	x2, x3, x2, hi\n\t"
4568         "and	x5, x5, x4\n\t"
4569         "and	x7, x7, x4\n\t"
4570         "subs	x5, x5, x7\n\t"
4571         "csel	x2, x4, x2, lo\n\t"
4572         "csel	x4, x4, xzr, eq\n\t"
4573         "csel	x2, x3, x2, hi\n\t"
4574         "ldp	x5, x6, [%[a], 176]\n\t"
4575         "ldp	x7, x8, [%[b], 176]\n\t"
4576         "and	x6, x6, x4\n\t"
4577         "and	x8, x8, x4\n\t"
4578         "subs	x6, x6, x8\n\t"
4579         "csel	x2, x4, x2, lo\n\t"
4580         "csel	x4, x4, xzr, eq\n\t"
4581         "csel	x2, x3, x2, hi\n\t"
4582         "and	x5, x5, x4\n\t"
4583         "and	x7, x7, x4\n\t"
4584         "subs	x5, x5, x7\n\t"
4585         "csel	x2, x4, x2, lo\n\t"
4586         "csel	x4, x4, xzr, eq\n\t"
4587         "csel	x2, x3, x2, hi\n\t"
4588         "ldp	x5, x6, [%[a], 160]\n\t"
4589         "ldp	x7, x8, [%[b], 160]\n\t"
4590         "and	x6, x6, x4\n\t"
4591         "and	x8, x8, x4\n\t"
4592         "subs	x6, x6, x8\n\t"
4593         "csel	x2, x4, x2, lo\n\t"
4594         "csel	x4, x4, xzr, eq\n\t"
4595         "csel	x2, x3, x2, hi\n\t"
4596         "and	x5, x5, x4\n\t"
4597         "and	x7, x7, x4\n\t"
4598         "subs	x5, x5, x7\n\t"
4599         "csel	x2, x4, x2, lo\n\t"
4600         "csel	x4, x4, xzr, eq\n\t"
4601         "csel	x2, x3, x2, hi\n\t"
4602         "ldp	x5, x6, [%[a], 144]\n\t"
4603         "ldp	x7, x8, [%[b], 144]\n\t"
4604         "and	x6, x6, x4\n\t"
4605         "and	x8, x8, x4\n\t"
4606         "subs	x6, x6, x8\n\t"
4607         "csel	x2, x4, x2, lo\n\t"
4608         "csel	x4, x4, xzr, eq\n\t"
4609         "csel	x2, x3, x2, hi\n\t"
4610         "and	x5, x5, x4\n\t"
4611         "and	x7, x7, x4\n\t"
4612         "subs	x5, x5, x7\n\t"
4613         "csel	x2, x4, x2, lo\n\t"
4614         "csel	x4, x4, xzr, eq\n\t"
4615         "csel	x2, x3, x2, hi\n\t"
4616         "ldp	x5, x6, [%[a], 128]\n\t"
4617         "ldp	x7, x8, [%[b], 128]\n\t"
4618         "and	x6, x6, x4\n\t"
4619         "and	x8, x8, x4\n\t"
4620         "subs	x6, x6, x8\n\t"
4621         "csel	x2, x4, x2, lo\n\t"
4622         "csel	x4, x4, xzr, eq\n\t"
4623         "csel	x2, x3, x2, hi\n\t"
4624         "and	x5, x5, x4\n\t"
4625         "and	x7, x7, x4\n\t"
4626         "subs	x5, x5, x7\n\t"
4627         "csel	x2, x4, x2, lo\n\t"
4628         "csel	x4, x4, xzr, eq\n\t"
4629         "csel	x2, x3, x2, hi\n\t"
4630         "ldp	x5, x6, [%[a], 112]\n\t"
4631         "ldp	x7, x8, [%[b], 112]\n\t"
4632         "and	x6, x6, x4\n\t"
4633         "and	x8, x8, x4\n\t"
4634         "subs	x6, x6, x8\n\t"
4635         "csel	x2, x4, x2, lo\n\t"
4636         "csel	x4, x4, xzr, eq\n\t"
4637         "csel	x2, x3, x2, hi\n\t"
4638         "and	x5, x5, x4\n\t"
4639         "and	x7, x7, x4\n\t"
4640         "subs	x5, x5, x7\n\t"
4641         "csel	x2, x4, x2, lo\n\t"
4642         "csel	x4, x4, xzr, eq\n\t"
4643         "csel	x2, x3, x2, hi\n\t"
4644         "ldp	x5, x6, [%[a], 96]\n\t"
4645         "ldp	x7, x8, [%[b], 96]\n\t"
4646         "and	x6, x6, x4\n\t"
4647         "and	x8, x8, x4\n\t"
4648         "subs	x6, x6, x8\n\t"
4649         "csel	x2, x4, x2, lo\n\t"
4650         "csel	x4, x4, xzr, eq\n\t"
4651         "csel	x2, x3, x2, hi\n\t"
4652         "and	x5, x5, x4\n\t"
4653         "and	x7, x7, x4\n\t"
4654         "subs	x5, x5, x7\n\t"
4655         "csel	x2, x4, x2, lo\n\t"
4656         "csel	x4, x4, xzr, eq\n\t"
4657         "csel	x2, x3, x2, hi\n\t"
4658         "ldp	x5, x6, [%[a], 80]\n\t"
4659         "ldp	x7, x8, [%[b], 80]\n\t"
4660         "and	x6, x6, x4\n\t"
4661         "and	x8, x8, x4\n\t"
4662         "subs	x6, x6, x8\n\t"
4663         "csel	x2, x4, x2, lo\n\t"
4664         "csel	x4, x4, xzr, eq\n\t"
4665         "csel	x2, x3, x2, hi\n\t"
4666         "and	x5, x5, x4\n\t"
4667         "and	x7, x7, x4\n\t"
4668         "subs	x5, x5, x7\n\t"
4669         "csel	x2, x4, x2, lo\n\t"
4670         "csel	x4, x4, xzr, eq\n\t"
4671         "csel	x2, x3, x2, hi\n\t"
4672         "ldp	x5, x6, [%[a], 64]\n\t"
4673         "ldp	x7, x8, [%[b], 64]\n\t"
4674         "and	x6, x6, x4\n\t"
4675         "and	x8, x8, x4\n\t"
4676         "subs	x6, x6, x8\n\t"
4677         "csel	x2, x4, x2, lo\n\t"
4678         "csel	x4, x4, xzr, eq\n\t"
4679         "csel	x2, x3, x2, hi\n\t"
4680         "and	x5, x5, x4\n\t"
4681         "and	x7, x7, x4\n\t"
4682         "subs	x5, x5, x7\n\t"
4683         "csel	x2, x4, x2, lo\n\t"
4684         "csel	x4, x4, xzr, eq\n\t"
4685         "csel	x2, x3, x2, hi\n\t"
4686         "ldp	x5, x6, [%[a], 48]\n\t"
4687         "ldp	x7, x8, [%[b], 48]\n\t"
4688         "and	x6, x6, x4\n\t"
4689         "and	x8, x8, x4\n\t"
4690         "subs	x6, x6, x8\n\t"
4691         "csel	x2, x4, x2, lo\n\t"
4692         "csel	x4, x4, xzr, eq\n\t"
4693         "csel	x2, x3, x2, hi\n\t"
4694         "and	x5, x5, x4\n\t"
4695         "and	x7, x7, x4\n\t"
4696         "subs	x5, x5, x7\n\t"
4697         "csel	x2, x4, x2, lo\n\t"
4698         "csel	x4, x4, xzr, eq\n\t"
4699         "csel	x2, x3, x2, hi\n\t"
4700         "ldp	x5, x6, [%[a], 32]\n\t"
4701         "ldp	x7, x8, [%[b], 32]\n\t"
4702         "and	x6, x6, x4\n\t"
4703         "and	x8, x8, x4\n\t"
4704         "subs	x6, x6, x8\n\t"
4705         "csel	x2, x4, x2, lo\n\t"
4706         "csel	x4, x4, xzr, eq\n\t"
4707         "csel	x2, x3, x2, hi\n\t"
4708         "and	x5, x5, x4\n\t"
4709         "and	x7, x7, x4\n\t"
4710         "subs	x5, x5, x7\n\t"
4711         "csel	x2, x4, x2, lo\n\t"
4712         "csel	x4, x4, xzr, eq\n\t"
4713         "csel	x2, x3, x2, hi\n\t"
4714         "ldp	x5, x6, [%[a], 16]\n\t"
4715         "ldp	x7, x8, [%[b], 16]\n\t"
4716         "and	x6, x6, x4\n\t"
4717         "and	x8, x8, x4\n\t"
4718         "subs	x6, x6, x8\n\t"
4719         "csel	x2, x4, x2, lo\n\t"
4720         "csel	x4, x4, xzr, eq\n\t"
4721         "csel	x2, x3, x2, hi\n\t"
4722         "and	x5, x5, x4\n\t"
4723         "and	x7, x7, x4\n\t"
4724         "subs	x5, x5, x7\n\t"
4725         "csel	x2, x4, x2, lo\n\t"
4726         "csel	x4, x4, xzr, eq\n\t"
4727         "csel	x2, x3, x2, hi\n\t"
4728         "ldp	x5, x6, [%[a], 0]\n\t"
4729         "ldp	x7, x8, [%[b], 0]\n\t"
4730         "and	x6, x6, x4\n\t"
4731         "and	x8, x8, x4\n\t"
4732         "subs	x6, x6, x8\n\t"
4733         "csel	x2, x4, x2, lo\n\t"
4734         "csel	x4, x4, xzr, eq\n\t"
4735         "csel	x2, x3, x2, hi\n\t"
4736         "and	x5, x5, x4\n\t"
4737         "and	x7, x7, x4\n\t"
4738         "subs	x5, x5, x7\n\t"
4739         "csel	x2, x4, x2, lo\n\t"
4740         "csel	x4, x4, xzr, eq\n\t"
4741         "csel	x2, x3, x2, hi\n\t"
4742         "eor	%[a], x2, x4\n\t"
4743         : [a] "+r" (a)
4744         : [b] "r" (b)
4745         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
4746     );
4747 #endif
4748 
4749     return (sp_int64)a;
4750 }
4751 
4752 /* Divide d in a and put remainder into r (m*d + r = a)
4753  * m is not calculated as it is not needed at this time.
4754  *
4755  * a  Number to be divided.
4756  * d  Number to divide with.
4757  * m  Multiplier result.
4758  * r  Remainder from the division.
4759  * returns MP_OKAY indicating success.
4760  */
sp_2048_div_32(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)4761 static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
4762         sp_digit* r)
4763 {
4764     sp_digit t1[64], t2[33];
4765     sp_digit div, r1;
4766     int i;
4767 
4768     (void)m;
4769 
4770     div = d[31];
4771     XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
4772     for (i=31; i>=0; i--) {
4773         sp_digit hi = t1[32 + i] - (t1[32 + i] == div);
4774         r1 = div_2048_word_32(hi, t1[32 + i - 1], div);
4775 
4776         sp_2048_mul_d_32(t2, d, r1);
4777         t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
4778         t1[32 + i] -= t2[32];
4779         sp_2048_mask_32(t2, d, t1[32 + i]);
4780         t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
4781         sp_2048_mask_32(t2, d, t1[32 + i]);
4782         t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
4783     }
4784 
4785     r1 = sp_2048_cmp_32(t1, d) >= 0;
4786     sp_2048_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
4787 
4788     return MP_OKAY;
4789 }
4790 
4791 /* Reduce a modulo m into r. (r = a mod m)
4792  *
4793  * r  A single precision number that is the reduced result.
4794  * a  A single precision number that is to be reduced.
4795  * m  A single precision number that is the modulus to reduce with.
4796  * returns MP_OKAY indicating success.
4797  */
sp_2048_mod_32(sp_digit * r,const sp_digit * a,const sp_digit * m)4798 static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
4799 {
4800     return sp_2048_div_32(a, m, NULL, r);
4801 }
4802 
4803 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
4804                                                      defined(WOLFSSL_HAVE_SP_DH)
4805 #ifdef WOLFSSL_SP_SMALL
4806 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
4807  *
4808  * r     A single precision number that is the result of the operation.
4809  * a     A single precision number being exponentiated.
4810  * e     A single precision number that is the exponent.
4811  * bits  The number of bits in the exponent.
4812  * m     A single precision number that is the modulus.
4813  * returns  0 on success.
4814  * returns  MEMORY_E on dynamic memory allocation failure.
4815  * returns  MP_VAL when base is even or exponent is 0.
4816  */
sp_2048_mod_exp_32(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)4817 static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
4818         int bits, const sp_digit* m, int reduceA)
4819 {
4820 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
4821     sp_digit* td = NULL;
4822 #else
4823     sp_digit td[8 * 64];
4824 #endif
4825     sp_digit* t[8];
4826     sp_digit* norm = NULL;
4827     sp_digit mp = 1;
4828     sp_digit n;
4829     sp_digit mask;
4830     int i;
4831     int c;
4832     byte y;
4833     int err = MP_OKAY;
4834 
4835     if ((m[0] & 1) == 0) {
4836         err = MP_VAL;
4837     }
4838     else if (bits == 0) {
4839         err = MP_VAL;
4840     }
4841 
4842 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
4843     if (err == MP_OKAY) {
4844         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 64), NULL,
4845                                 DYNAMIC_TYPE_TMP_BUFFER);
4846         if (td == NULL)
4847             err = MEMORY_E;
4848     }
4849 #endif
4850 
4851     if (err == MP_OKAY) {
4852         norm = td;
4853         for (i=0; i<8; i++) {
4854             t[i] = td + i * 64;
4855         }
4856 
4857         sp_2048_mont_setup(m, &mp);
4858         sp_2048_mont_norm_32(norm, m);
4859 
4860         XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
4861         if (reduceA != 0) {
4862             err = sp_2048_mod_32(t[1] + 32, a, m);
4863             if (err == MP_OKAY) {
4864                 err = sp_2048_mod_32(t[1], t[1], m);
4865             }
4866         }
4867         else {
4868             XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
4869             err = sp_2048_mod_32(t[1], t[1], m);
4870         }
4871     }
4872 
4873     if (err == MP_OKAY) {
4874         sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
4875         sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
4876         sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
4877         sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
4878         sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
4879         sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
4880 
4881         i = (bits - 1) / 64;
4882         n = e[i--];
4883         c = bits & 63;
4884         if (c == 0) {
4885             c = 64;
4886         }
4887         c -= bits % 3;
4888         if (c == 64) {
4889             c = 61;
4890         }
4891         if (c < 0) {
4892             /* Number of bits in top word is less than number needed. */
4893             c = -c;
4894             y = (byte)(n << c);
4895             n = e[i--];
4896             y |= (byte)(n >> (64 - c));
4897             n <<= c;
4898             c = 64 - c;
4899         }
4900         else {
4901             y = (byte)(n >> c);
4902             n <<= 64 - c;
4903         }
4904         XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
4905         for (; i>=0 || c>=3; ) {
4906             if (c == 0) {
4907                 n = e[i--];
4908                 y = (byte)(n >> 61);
4909                 n <<= 3;
4910                 c = 61;
4911             }
4912             else if (c < 3) {
4913                 y = (byte)(n >> 61);
4914                 n = e[i--];
4915                 c = 3 - c;
4916                 y |= (byte)(n >> (64 - c));
4917                 n <<= c;
4918                 c = 64 - c;
4919             }
4920             else {
4921                 y = (byte)((n >> 61) & 0x7);
4922                 n <<= 3;
4923                 c -= 3;
4924             }
4925 
4926             sp_2048_mont_sqr_32(r, r, m, mp);
4927             sp_2048_mont_sqr_32(r, r, m, mp);
4928             sp_2048_mont_sqr_32(r, r, m, mp);
4929 
4930             sp_2048_mont_mul_32(r, r, t[y], m, mp);
4931         }
4932 
4933         XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
4934         sp_2048_mont_reduce_32(r, m, mp);
4935 
4936         mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
4937         sp_2048_cond_sub_32(r, r, m, mask);
4938     }
4939 
4940 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
4941     if (td != NULL)
4942         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
4943 #endif
4944 
4945     return err;
4946 }
4947 #else
4948 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
4949  *
4950  * r     A single precision number that is the result of the operation.
4951  * a     A single precision number being exponentiated.
4952  * e     A single precision number that is the exponent.
4953  * bits  The number of bits in the exponent.
4954  * m     A single precision number that is the modulus.
4955  * returns  0 on success.
4956  * returns  MEMORY_E on dynamic memory allocation failure.
4957  * returns  MP_VAL when base is even or exponent is 0.
4958  */
sp_2048_mod_exp_32(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)4959 static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
4960         int bits, const sp_digit* m, int reduceA)
4961 {
4962 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
4963     sp_digit* td = NULL;
4964 #else
4965     sp_digit td[16 * 64];
4966 #endif
4967     sp_digit* t[16];
4968     sp_digit* norm = NULL;
4969     sp_digit mp = 1;
4970     sp_digit n;
4971     sp_digit mask;
4972     int i;
4973     int c;
4974     byte y;
4975     int err = MP_OKAY;
4976 
4977     if ((m[0] & 1) == 0) {
4978         err = MP_VAL;
4979     }
4980     else if (bits == 0) {
4981         err = MP_VAL;
4982     }
4983 
4984 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
4985     if (err == MP_OKAY) {
4986         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL,
4987                                 DYNAMIC_TYPE_TMP_BUFFER);
4988         if (td == NULL)
4989             err = MEMORY_E;
4990     }
4991 #endif
4992 
4993     if (err == MP_OKAY) {
4994         norm = td;
4995         for (i=0; i<16; i++) {
4996             t[i] = td + i * 64;
4997         }
4998 
4999         sp_2048_mont_setup(m, &mp);
5000         sp_2048_mont_norm_32(norm, m);
5001 
5002         XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
5003         if (reduceA != 0) {
5004             err = sp_2048_mod_32(t[1] + 32, a, m);
5005             if (err == MP_OKAY) {
5006                 err = sp_2048_mod_32(t[1], t[1], m);
5007             }
5008         }
5009         else {
5010             XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
5011             err = sp_2048_mod_32(t[1], t[1], m);
5012         }
5013     }
5014 
5015     if (err == MP_OKAY) {
5016         sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
5017         sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
5018         sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
5019         sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
5020         sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
5021         sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
5022         sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
5023         sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
5024         sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
5025         sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
5026         sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
5027         sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
5028         sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
5029         sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
5030 
5031         i = (bits - 1) / 64;
5032         n = e[i--];
5033         c = bits & 63;
5034         if (c == 0) {
5035             c = 64;
5036         }
5037         c -= bits % 4;
5038         if (c == 64) {
5039             c = 60;
5040         }
5041         if (c < 0) {
5042             /* Number of bits in top word is less than number needed. */
5043             c = -c;
5044             y = (byte)(n << c);
5045             n = e[i--];
5046             y |= (byte)(n >> (64 - c));
5047             n <<= c;
5048             c = 64 - c;
5049         }
5050         else {
5051             y = (byte)(n >> c);
5052             n <<= 64 - c;
5053         }
5054         XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
5055         for (; i>=0 || c>=4; ) {
5056             if (c == 0) {
5057                 n = e[i--];
5058                 y = (byte)(n >> 60);
5059                 n <<= 4;
5060                 c = 60;
5061             }
5062             else if (c < 4) {
5063                 y = (byte)(n >> 60);
5064                 n = e[i--];
5065                 c = 4 - c;
5066                 y |= (byte)(n >> (64 - c));
5067                 n <<= c;
5068                 c = 64 - c;
5069             }
5070             else {
5071                 y = (byte)((n >> 60) & 0xf);
5072                 n <<= 4;
5073                 c -= 4;
5074             }
5075 
5076             sp_2048_mont_sqr_32(r, r, m, mp);
5077             sp_2048_mont_sqr_32(r, r, m, mp);
5078             sp_2048_mont_sqr_32(r, r, m, mp);
5079             sp_2048_mont_sqr_32(r, r, m, mp);
5080 
5081             sp_2048_mont_mul_32(r, r, t[y], m, mp);
5082         }
5083 
5084         XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
5085         sp_2048_mont_reduce_32(r, m, mp);
5086 
5087         mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
5088         sp_2048_cond_sub_32(r, r, m, mask);
5089     }
5090 
5091 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5092     if (td != NULL)
5093         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
5094 #endif
5095 
5096     return err;
5097 }
5098 #endif /* WOLFSSL_SP_SMALL */
5099 #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
5100 
5101 #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
5102 #ifdef WOLFSSL_HAVE_SP_RSA
5103 /* RSA public key operation.
5104  *
5105  * in      Array of bytes representing the number to exponentiate, base.
5106  * inLen   Number of bytes in base.
5107  * em      Public exponent.
5108  * mm      Modulus.
5109  * out     Buffer to hold big-endian bytes of exponentiation result.
5110  *         Must be at least 256 bytes long.
5111  * outLen  Number of bytes in result.
5112  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
5113  * an array is too long and MEMORY_E when dynamic memory allocation fails.
5114  */
sp_RsaPublic_2048(const byte * in,word32 inLen,const mp_int * em,const mp_int * mm,byte * out,word32 * outLen)5115 int sp_RsaPublic_2048(const byte* in, word32 inLen, const mp_int* em,
5116     const mp_int* mm, byte* out, word32* outLen)
5117 {
5118 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5119     sp_digit* a = NULL;
5120 #else
5121     sp_digit a[32 * 5];
5122 #endif
5123     sp_digit* m = NULL;
5124     sp_digit* r = NULL;
5125     sp_digit *ah = NULL;
5126     sp_digit e[1] = {0};
5127     int err = MP_OKAY;
5128 
5129     if (*outLen < 256) {
5130         err = MP_TO_E;
5131     }
5132     else if (mp_count_bits(em) > 64 || inLen > 256 ||
5133                                                      mp_count_bits(mm) != 2048) {
5134         err = MP_READ_E;
5135     }
5136     else if (mp_iseven(mm)) {
5137         err = MP_VAL;
5138     }
5139 
5140 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5141     if (err == MP_OKAY) {
5142         a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 5, NULL,
5143                                                               DYNAMIC_TYPE_RSA);
5144         if (a == NULL)
5145             err = MEMORY_E;
5146     }
5147 #endif
5148 
5149     if (err == MP_OKAY) {
5150         r = a + 32 * 2;
5151         m = r + 32 * 2;
5152         ah = a + 32;
5153 
5154         sp_2048_from_bin(ah, 32, in, inLen);
5155 #if DIGIT_BIT >= 64
5156         e[0] = em->dp[0];
5157 #else
5158         e[0] = em->dp[0];
5159         if (em->used > 1) {
5160             e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
5161         }
5162 #endif
5163         if (e[0] == 0) {
5164             err = MP_EXPTMOD_E;
5165         }
5166     }
5167     if (err == MP_OKAY) {
5168         sp_2048_from_mp(m, 32, mm);
5169 
5170         if (e[0] == 0x3) {
5171             if (err == MP_OKAY) {
5172                 sp_2048_sqr_32(r, ah);
5173                 err = sp_2048_mod_32_cond(r, r, m);
5174             }
5175             if (err == MP_OKAY) {
5176                 sp_2048_mul_32(r, ah, r);
5177                 err = sp_2048_mod_32_cond(r, r, m);
5178             }
5179         }
5180         else {
5181             int i;
5182             sp_digit mp;
5183 
5184             sp_2048_mont_setup(m, &mp);
5185 
5186             /* Convert to Montgomery form. */
5187             XMEMSET(a, 0, sizeof(sp_digit) * 32);
5188             err = sp_2048_mod_32_cond(a, a, m);
5189 
5190             if (err == MP_OKAY) {
5191                 for (i = 63; i >= 0; i--) {
5192                     if (e[0] >> i) {
5193                         break;
5194                     }
5195                 }
5196 
5197                 XMEMCPY(r, a, sizeof(sp_digit) * 32);
5198                 for (i--; i>=0; i--) {
5199                     sp_2048_mont_sqr_32(r, r, m, mp);
5200                     if (((e[0] >> i) & 1) == 1) {
5201                         sp_2048_mont_mul_32(r, r, a, m, mp);
5202                     }
5203                 }
5204                 XMEMSET(&r[32], 0, sizeof(sp_digit) * 32);
5205                 sp_2048_mont_reduce_32(r, m, mp);
5206 
5207                 for (i = 31; i > 0; i--) {
5208                     if (r[i] != m[i]) {
5209                         break;
5210                     }
5211                 }
5212                 if (r[i] >= m[i]) {
5213                     sp_2048_sub_in_place_32(r, m);
5214                 }
5215             }
5216         }
5217     }
5218 
5219     if (err == MP_OKAY) {
5220         sp_2048_to_bin_32(r, out);
5221         *outLen = 256;
5222     }
5223 
5224 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5225     if (a != NULL)
5226         XFREE(a, NULL, DYNAMIC_TYPE_RSA);
5227 #endif
5228 
5229     return err;
5230 }
5231 
5232 #ifndef WOLFSSL_RSA_PUBLIC_ONLY
5233 /* Conditionally add a and b using the mask m.
5234  * m is -1 to add and 0 when not.
5235  *
5236  * r  A single precision number representing conditional add result.
5237  * a  A single precision number to add with.
5238  * b  A single precision number to add.
5239  * m  Mask value to apply.
5240  */
sp_2048_cond_add_16(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)5241 static sp_digit sp_2048_cond_add_16(sp_digit* r, const sp_digit* a, const sp_digit* b,
5242         sp_digit m)
5243 {
5244 #ifdef WOLFSSL_SP_SMALL
5245     sp_digit c = 0;
5246 
5247     __asm__ __volatile__ (
5248         "mov	x8, #0\n\t"
5249         "1:\n\t"
5250         "adds	%[c], %[c], #-1\n\t"
5251         "ldr	x4, [%[a], x8]\n\t"
5252         "ldr	x5, [%[b], x8]\n\t"
5253         "and	x5, x5, %[m]\n\t"
5254         "adcs	x4, x4, x5\n\t"
5255         "cset	%[c], cs\n\t"
5256         "str	x4, [%[r], x8]\n\t"
5257         "add	x8, x8, #8\n\t"
5258         "cmp	x8, 128\n\t"
5259         "b.lt	1b\n\t"
5260         : [c] "+r" (c)
5261         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
5262         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
5263     );
5264 
5265     return c;
5266 #else
5267     __asm__ __volatile__ (
5268 
5269         "ldp	x5, x7, [%[b], 0]\n\t"
5270         "ldp	x11, x12, [%[b], 16]\n\t"
5271         "ldp	x4, x6, [%[a], 0]\n\t"
5272         "and	x5, x5, %[m]\n\t"
5273         "ldp	x9, x10, [%[a], 16]\n\t"
5274         "and	x7, x7, %[m]\n\t"
5275         "adds	x4, x4, x5\n\t"
5276         "and	x11, x11, %[m]\n\t"
5277         "adcs	x6, x6, x7\n\t"
5278         "and	x12, x12, %[m]\n\t"
5279         "adcs	x9, x9, x11\n\t"
5280         "stp	x4, x6, [%[r], 0]\n\t"
5281         "adcs	x10, x10, x12\n\t"
5282         "stp	x9, x10, [%[r], 16]\n\t"
5283         "ldp	x5, x7, [%[b], 32]\n\t"
5284         "ldp	x11, x12, [%[b], 48]\n\t"
5285         "ldp	x4, x6, [%[a], 32]\n\t"
5286         "and	x5, x5, %[m]\n\t"
5287         "ldp	x9, x10, [%[a], 48]\n\t"
5288         "and	x7, x7, %[m]\n\t"
5289         "adcs	x4, x4, x5\n\t"
5290         "and	x11, x11, %[m]\n\t"
5291         "adcs	x6, x6, x7\n\t"
5292         "and	x12, x12, %[m]\n\t"
5293         "adcs	x9, x9, x11\n\t"
5294         "stp	x4, x6, [%[r], 32]\n\t"
5295         "adcs	x10, x10, x12\n\t"
5296         "stp	x9, x10, [%[r], 48]\n\t"
5297         "ldp	x5, x7, [%[b], 64]\n\t"
5298         "ldp	x11, x12, [%[b], 80]\n\t"
5299         "ldp	x4, x6, [%[a], 64]\n\t"
5300         "and	x5, x5, %[m]\n\t"
5301         "ldp	x9, x10, [%[a], 80]\n\t"
5302         "and	x7, x7, %[m]\n\t"
5303         "adcs	x4, x4, x5\n\t"
5304         "and	x11, x11, %[m]\n\t"
5305         "adcs	x6, x6, x7\n\t"
5306         "and	x12, x12, %[m]\n\t"
5307         "adcs	x9, x9, x11\n\t"
5308         "stp	x4, x6, [%[r], 64]\n\t"
5309         "adcs	x10, x10, x12\n\t"
5310         "stp	x9, x10, [%[r], 80]\n\t"
5311         "ldp	x5, x7, [%[b], 96]\n\t"
5312         "ldp	x11, x12, [%[b], 112]\n\t"
5313         "ldp	x4, x6, [%[a], 96]\n\t"
5314         "and	x5, x5, %[m]\n\t"
5315         "ldp	x9, x10, [%[a], 112]\n\t"
5316         "and	x7, x7, %[m]\n\t"
5317         "adcs	x4, x4, x5\n\t"
5318         "and	x11, x11, %[m]\n\t"
5319         "adcs	x6, x6, x7\n\t"
5320         "and	x12, x12, %[m]\n\t"
5321         "adcs	x9, x9, x11\n\t"
5322         "stp	x4, x6, [%[r], 96]\n\t"
5323         "adcs	x10, x10, x12\n\t"
5324         "stp	x9, x10, [%[r], 112]\n\t"
5325         "cset	%[r], cs\n\t"
5326         : [r] "+r" (r)
5327         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
5328         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
5329     );
5330 
5331     return (sp_digit)r;
5332 #endif /* WOLFSSL_SP_SMALL */
5333 }
5334 
5335 /* RSA private key operation.
5336  *
5337  * in      Array of bytes representing the number to exponentiate, base.
5338  * inLen   Number of bytes in base.
5339  * dm      Private exponent.
5340  * pm      First prime.
5341  * qm      Second prime.
5342  * dpm     First prime's CRT exponent.
5343  * dqm     Second prime's CRT exponent.
5344  * qim     Inverse of second prime mod p.
5345  * mm      Modulus.
5346  * out     Buffer to hold big-endian bytes of exponentiation result.
5347  *         Must be at least 256 bytes long.
5348  * outLen  Number of bytes in result.
5349  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
5350  * an array is too long and MEMORY_E when dynamic memory allocation fails.
5351  */
sp_RsaPrivate_2048(const byte * in,word32 inLen,const mp_int * dm,const mp_int * pm,const mp_int * qm,const mp_int * dpm,const mp_int * dqm,const mp_int * qim,const mp_int * mm,byte * out,word32 * outLen)5352 int sp_RsaPrivate_2048(const byte* in, word32 inLen, const mp_int* dm,
5353     const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
5354     const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
5355 {
5356 #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
5357 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5358     sp_digit* d = NULL;
5359 #else
5360     sp_digit  d[32 * 4];
5361 #endif
5362     sp_digit* a = NULL;
5363     sp_digit* m = NULL;
5364     sp_digit* r = NULL;
5365     int err = MP_OKAY;
5366 
5367     (void)pm;
5368     (void)qm;
5369     (void)dpm;
5370     (void)dqm;
5371     (void)qim;
5372 
5373     if (*outLen < 256U) {
5374         err = MP_TO_E;
5375     }
5376     if (err == MP_OKAY) {
5377         if (mp_count_bits(dm) > 2048) {
5378            err = MP_READ_E;
5379         }
5380         else if (inLen > 256) {
5381             err = MP_READ_E;
5382         }
5383         else if (mp_count_bits(mm) != 2048) {
5384             err = MP_READ_E;
5385         }
5386         else if (mp_iseven(mm)) {
5387             err = MP_VAL;
5388         }
5389     }
5390 
5391 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5392     if (err == MP_OKAY) {
5393         d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, NULL,
5394                                                               DYNAMIC_TYPE_RSA);
5395         if (d == NULL)
5396             err = MEMORY_E;
5397     }
5398 #endif
5399 
5400     if (err == MP_OKAY) {
5401         a = d + 32;
5402         m = a + 64;
5403         r = a;
5404 
5405         sp_2048_from_bin(a, 32, in, inLen);
5406         sp_2048_from_mp(d, 32, dm);
5407         sp_2048_from_mp(m, 32, mm);
5408         err = sp_2048_mod_exp_32(r, a, d, 2048, m, 0);
5409     }
5410 
5411     if (err == MP_OKAY) {
5412         sp_2048_to_bin_32(r, out);
5413         *outLen = 256;
5414     }
5415 
5416 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5417     if (d != NULL)
5418 #endif
5419     {
5420         /* only "a" and "r" are sensitive and need zeroized (same pointer) */
5421         if (a != NULL)
5422             ForceZero(a, sizeof(sp_digit) * 32);
5423 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5424         XFREE(d, NULL, DYNAMIC_TYPE_RSA);
5425 #endif
5426     }
5427 
5428     return err;
5429 #else
5430 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5431     sp_digit* a = NULL;
5432 #else
5433     sp_digit a[16 * 11];
5434 #endif
5435     sp_digit* p = NULL;
5436     sp_digit* q = NULL;
5437     sp_digit* dp = NULL;
5438     sp_digit* tmpa = NULL;
5439     sp_digit* tmpb = NULL;
5440     sp_digit* r = NULL;
5441     sp_digit* qi = NULL;
5442     sp_digit* dq = NULL;
5443     sp_digit c;
5444     int err = MP_OKAY;
5445 
5446     (void)dm;
5447     (void)mm;
5448 
5449     if (*outLen < 256) {
5450         err = MP_TO_E;
5451     }
5452     else if (inLen > 256 || mp_count_bits(mm) != 2048) {
5453         err = MP_READ_E;
5454     }
5455     else if (mp_iseven(mm)) {
5456         err = MP_VAL;
5457     }
5458 
5459 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5460     if (err == MP_OKAY) {
5461         a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 11, NULL,
5462                                                               DYNAMIC_TYPE_RSA);
5463         if (a == NULL)
5464             err = MEMORY_E;
5465     }
5466 #endif
5467 
5468     if (err == MP_OKAY) {
5469         p = a + 32 * 2;
5470         q = p + 16;
5471         qi = dq = dp = q + 16;
5472         tmpa = qi + 16;
5473         tmpb = tmpa + 32;
5474         r = a;
5475 
5476         sp_2048_from_bin(a, 32, in, inLen);
5477         sp_2048_from_mp(p, 16, pm);
5478         sp_2048_from_mp(q, 16, qm);
5479         sp_2048_from_mp(dp, 16, dpm);
5480 
5481         err = sp_2048_mod_exp_16(tmpa, a, dp, 1024, p, 1);
5482     }
5483     if (err == MP_OKAY) {
5484         sp_2048_from_mp(dq, 16, dqm);
5485         err = sp_2048_mod_exp_16(tmpb, a, dq, 1024, q, 1);
5486     }
5487 
5488     if (err == MP_OKAY) {
5489         c = sp_2048_sub_in_place_16(tmpa, tmpb);
5490         c += sp_2048_cond_add_16(tmpa, tmpa, p, c);
5491         sp_2048_cond_add_16(tmpa, tmpa, p, c);
5492 
5493         sp_2048_from_mp(qi, 16, qim);
5494         sp_2048_mul_16(tmpa, tmpa, qi);
5495         err = sp_2048_mod_16(tmpa, tmpa, p);
5496     }
5497 
5498     if (err == MP_OKAY) {
5499         sp_2048_mul_16(tmpa, q, tmpa);
5500         XMEMSET(&tmpb[16], 0, sizeof(sp_digit) * 16);
5501         sp_2048_add_32(r, tmpb, tmpa);
5502 
5503         sp_2048_to_bin_32(r, out);
5504         *outLen = 256;
5505     }
5506 
5507 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5508     if (a != NULL)
5509 #endif
5510     {
5511         ForceZero(a, sizeof(sp_digit) * 16 * 11);
5512     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5513         XFREE(a, NULL, DYNAMIC_TYPE_RSA);
5514     #endif
5515     }
5516 #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
5517     return err;
5518 }
5519 #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
5520 #endif /* WOLFSSL_HAVE_SP_RSA */
5521 #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
5522                                               !defined(WOLFSSL_RSA_PUBLIC_ONLY))
5523 /* Convert an array of sp_digit to an mp_int.
5524  *
5525  * a  A single precision integer.
5526  * r  A multi-precision integer.
5527  */
sp_2048_to_mp(const sp_digit * a,mp_int * r)5528 static int sp_2048_to_mp(const sp_digit* a, mp_int* r)
5529 {
5530     int err;
5531 
5532     err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
5533     if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
5534 #if DIGIT_BIT == 64
5535         XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
5536         r->used = 32;
5537         mp_clamp(r);
5538 #elif DIGIT_BIT < 64
5539         int i;
5540         int j = 0;
5541         int s = 0;
5542 
5543         r->dp[0] = 0;
5544         for (i = 0; i < 32; i++) {
5545             r->dp[j] |= (mp_digit)(a[i] << s);
5546             r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
5547             s = DIGIT_BIT - s;
5548             r->dp[++j] = (mp_digit)(a[i] >> s);
5549             while (s + DIGIT_BIT <= 64) {
5550                 s += DIGIT_BIT;
5551                 r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
5552                 if (s == SP_WORD_SIZE) {
5553                     r->dp[j] = 0;
5554                 }
5555                 else {
5556                     r->dp[j] = (mp_digit)(a[i] >> s);
5557                 }
5558             }
5559             s = 64 - s;
5560         }
5561         r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
5562         mp_clamp(r);
5563 #else
5564         int i;
5565         int j = 0;
5566         int s = 0;
5567 
5568         r->dp[0] = 0;
5569         for (i = 0; i < 32; i++) {
5570             r->dp[j] |= ((mp_digit)a[i]) << s;
5571             if (s + 64 >= DIGIT_BIT) {
5572     #if DIGIT_BIT != 32 && DIGIT_BIT != 64
5573                 r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
5574     #endif
5575                 s = DIGIT_BIT - s;
5576                 r->dp[++j] = a[i] >> s;
5577                 s = 64 - s;
5578             }
5579             else {
5580                 s += 64;
5581             }
5582         }
5583         r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
5584         mp_clamp(r);
5585 #endif
5586     }
5587 
5588     return err;
5589 }
5590 
5591 /* Perform the modular exponentiation for Diffie-Hellman.
5592  *
5593  * base  Base. MP integer.
5594  * exp   Exponent. MP integer.
5595  * mod   Modulus. MP integer.
5596  * res   Result. MP integer.
5597  * returns 0 on success, MP_READ_E if there are too many bytes in an array
5598  * and MEMORY_E if memory allocation fails.
5599  */
sp_ModExp_2048(const mp_int * base,const mp_int * exp,const mp_int * mod,mp_int * res)5600 int sp_ModExp_2048(const mp_int* base, const mp_int* exp, const mp_int* mod,
5601     mp_int* res)
5602 {
5603     int err = MP_OKAY;
5604     sp_digit b[64];
5605     sp_digit e[32];
5606     sp_digit m[32];
5607     sp_digit* r = b;
5608     int expBits = mp_count_bits(exp);
5609 
5610     if (mp_count_bits(base) > 2048) {
5611         err = MP_READ_E;
5612     }
5613     else if (expBits > 2048) {
5614         err = MP_READ_E;
5615     }
5616     else if (mp_count_bits(mod) != 2048) {
5617         err = MP_READ_E;
5618     }
5619     else if (mp_iseven(mod)) {
5620         err = MP_VAL;
5621     }
5622 
5623     if (err == MP_OKAY) {
5624         sp_2048_from_mp(b, 32, base);
5625         sp_2048_from_mp(e, 32, exp);
5626         sp_2048_from_mp(m, 32, mod);
5627 
5628         err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
5629     }
5630 
5631     if (err == MP_OKAY) {
5632         err = sp_2048_to_mp(r, res);
5633     }
5634 
5635     XMEMSET(e, 0, sizeof(e));
5636 
5637     return err;
5638 }
5639 
5640 #ifdef WOLFSSL_HAVE_SP_DH
5641 
5642 #ifdef HAVE_FFDHE_2048
sp_2048_lshift_32(sp_digit * r,sp_digit * a,byte n)5643 static void sp_2048_lshift_32(sp_digit* r, sp_digit* a, byte n)
5644 {
5645     word64 n64 = n;
5646     __asm__ __volatile__ (
5647         "mov	x6, 63\n\t"
5648         "sub	x6, x6, %[n]\n\t"
5649         "ldr	x3, [%[a], 248]\n\t"
5650         "lsr	x4, x3, 1\n\t"
5651         "lsl	x3, x3, %[n]\n\t"
5652         "lsr	x4, x4, x6\n\t"
5653         "ldr	x2, [%[a], 240]\n\t"
5654         "str	x4, [%[r], 256]\n\t"
5655         "lsr	x5, x2, 1\n\t"
5656         "lsl	x2, x2, %[n]\n\t"
5657         "lsr	x5, x5, x6\n\t"
5658         "orr	x3, x3, x5\n\t"
5659         "ldr	x4, [%[a], 232]\n\t"
5660         "str	x3, [%[r], 248]\n\t"
5661         "lsr	x5, x4, 1\n\t"
5662         "lsl	x4, x4, %[n]\n\t"
5663         "lsr	x5, x5, x6\n\t"
5664         "orr	x2, x2, x5\n\t"
5665         "ldr	x3, [%[a], 224]\n\t"
5666         "str	x2, [%[r], 240]\n\t"
5667         "lsr	x5, x3, 1\n\t"
5668         "lsl	x3, x3, %[n]\n\t"
5669         "lsr	x5, x5, x6\n\t"
5670         "orr	x4, x4, x5\n\t"
5671         "ldr	x2, [%[a], 216]\n\t"
5672         "str	x4, [%[r], 232]\n\t"
5673         "lsr	x5, x2, 1\n\t"
5674         "lsl	x2, x2, %[n]\n\t"
5675         "lsr	x5, x5, x6\n\t"
5676         "orr	x3, x3, x5\n\t"
5677         "ldr	x4, [%[a], 208]\n\t"
5678         "str	x3, [%[r], 224]\n\t"
5679         "lsr	x5, x4, 1\n\t"
5680         "lsl	x4, x4, %[n]\n\t"
5681         "lsr	x5, x5, x6\n\t"
5682         "orr	x2, x2, x5\n\t"
5683         "ldr	x3, [%[a], 200]\n\t"
5684         "str	x2, [%[r], 216]\n\t"
5685         "lsr	x5, x3, 1\n\t"
5686         "lsl	x3, x3, %[n]\n\t"
5687         "lsr	x5, x5, x6\n\t"
5688         "orr	x4, x4, x5\n\t"
5689         "ldr	x2, [%[a], 192]\n\t"
5690         "str	x4, [%[r], 208]\n\t"
5691         "lsr	x5, x2, 1\n\t"
5692         "lsl	x2, x2, %[n]\n\t"
5693         "lsr	x5, x5, x6\n\t"
5694         "orr	x3, x3, x5\n\t"
5695         "ldr	x4, [%[a], 184]\n\t"
5696         "str	x3, [%[r], 200]\n\t"
5697         "lsr	x5, x4, 1\n\t"
5698         "lsl	x4, x4, %[n]\n\t"
5699         "lsr	x5, x5, x6\n\t"
5700         "orr	x2, x2, x5\n\t"
5701         "ldr	x3, [%[a], 176]\n\t"
5702         "str	x2, [%[r], 192]\n\t"
5703         "lsr	x5, x3, 1\n\t"
5704         "lsl	x3, x3, %[n]\n\t"
5705         "lsr	x5, x5, x6\n\t"
5706         "orr	x4, x4, x5\n\t"
5707         "ldr	x2, [%[a], 168]\n\t"
5708         "str	x4, [%[r], 184]\n\t"
5709         "lsr	x5, x2, 1\n\t"
5710         "lsl	x2, x2, %[n]\n\t"
5711         "lsr	x5, x5, x6\n\t"
5712         "orr	x3, x3, x5\n\t"
5713         "ldr	x4, [%[a], 160]\n\t"
5714         "str	x3, [%[r], 176]\n\t"
5715         "lsr	x5, x4, 1\n\t"
5716         "lsl	x4, x4, %[n]\n\t"
5717         "lsr	x5, x5, x6\n\t"
5718         "orr	x2, x2, x5\n\t"
5719         "ldr	x3, [%[a], 152]\n\t"
5720         "str	x2, [%[r], 168]\n\t"
5721         "lsr	x5, x3, 1\n\t"
5722         "lsl	x3, x3, %[n]\n\t"
5723         "lsr	x5, x5, x6\n\t"
5724         "orr	x4, x4, x5\n\t"
5725         "ldr	x2, [%[a], 144]\n\t"
5726         "str	x4, [%[r], 160]\n\t"
5727         "lsr	x5, x2, 1\n\t"
5728         "lsl	x2, x2, %[n]\n\t"
5729         "lsr	x5, x5, x6\n\t"
5730         "orr	x3, x3, x5\n\t"
5731         "ldr	x4, [%[a], 136]\n\t"
5732         "str	x3, [%[r], 152]\n\t"
5733         "lsr	x5, x4, 1\n\t"
5734         "lsl	x4, x4, %[n]\n\t"
5735         "lsr	x5, x5, x6\n\t"
5736         "orr	x2, x2, x5\n\t"
5737         "ldr	x3, [%[a], 128]\n\t"
5738         "str	x2, [%[r], 144]\n\t"
5739         "lsr	x5, x3, 1\n\t"
5740         "lsl	x3, x3, %[n]\n\t"
5741         "lsr	x5, x5, x6\n\t"
5742         "orr	x4, x4, x5\n\t"
5743         "ldr	x2, [%[a], 120]\n\t"
5744         "str	x4, [%[r], 136]\n\t"
5745         "lsr	x5, x2, 1\n\t"
5746         "lsl	x2, x2, %[n]\n\t"
5747         "lsr	x5, x5, x6\n\t"
5748         "orr	x3, x3, x5\n\t"
5749         "ldr	x4, [%[a], 112]\n\t"
5750         "str	x3, [%[r], 128]\n\t"
5751         "lsr	x5, x4, 1\n\t"
5752         "lsl	x4, x4, %[n]\n\t"
5753         "lsr	x5, x5, x6\n\t"
5754         "orr	x2, x2, x5\n\t"
5755         "ldr	x3, [%[a], 104]\n\t"
5756         "str	x2, [%[r], 120]\n\t"
5757         "lsr	x5, x3, 1\n\t"
5758         "lsl	x3, x3, %[n]\n\t"
5759         "lsr	x5, x5, x6\n\t"
5760         "orr	x4, x4, x5\n\t"
5761         "ldr	x2, [%[a], 96]\n\t"
5762         "str	x4, [%[r], 112]\n\t"
5763         "lsr	x5, x2, 1\n\t"
5764         "lsl	x2, x2, %[n]\n\t"
5765         "lsr	x5, x5, x6\n\t"
5766         "orr	x3, x3, x5\n\t"
5767         "ldr	x4, [%[a], 88]\n\t"
5768         "str	x3, [%[r], 104]\n\t"
5769         "lsr	x5, x4, 1\n\t"
5770         "lsl	x4, x4, %[n]\n\t"
5771         "lsr	x5, x5, x6\n\t"
5772         "orr	x2, x2, x5\n\t"
5773         "ldr	x3, [%[a], 80]\n\t"
5774         "str	x2, [%[r], 96]\n\t"
5775         "lsr	x5, x3, 1\n\t"
5776         "lsl	x3, x3, %[n]\n\t"
5777         "lsr	x5, x5, x6\n\t"
5778         "orr	x4, x4, x5\n\t"
5779         "ldr	x2, [%[a], 72]\n\t"
5780         "str	x4, [%[r], 88]\n\t"
5781         "lsr	x5, x2, 1\n\t"
5782         "lsl	x2, x2, %[n]\n\t"
5783         "lsr	x5, x5, x6\n\t"
5784         "orr	x3, x3, x5\n\t"
5785         "ldr	x4, [%[a], 64]\n\t"
5786         "str	x3, [%[r], 80]\n\t"
5787         "lsr	x5, x4, 1\n\t"
5788         "lsl	x4, x4, %[n]\n\t"
5789         "lsr	x5, x5, x6\n\t"
5790         "orr	x2, x2, x5\n\t"
5791         "ldr	x3, [%[a], 56]\n\t"
5792         "str	x2, [%[r], 72]\n\t"
5793         "lsr	x5, x3, 1\n\t"
5794         "lsl	x3, x3, %[n]\n\t"
5795         "lsr	x5, x5, x6\n\t"
5796         "orr	x4, x4, x5\n\t"
5797         "ldr	x2, [%[a], 48]\n\t"
5798         "str	x4, [%[r], 64]\n\t"
5799         "lsr	x5, x2, 1\n\t"
5800         "lsl	x2, x2, %[n]\n\t"
5801         "lsr	x5, x5, x6\n\t"
5802         "orr	x3, x3, x5\n\t"
5803         "ldr	x4, [%[a], 40]\n\t"
5804         "str	x3, [%[r], 56]\n\t"
5805         "lsr	x5, x4, 1\n\t"
5806         "lsl	x4, x4, %[n]\n\t"
5807         "lsr	x5, x5, x6\n\t"
5808         "orr	x2, x2, x5\n\t"
5809         "ldr	x3, [%[a], 32]\n\t"
5810         "str	x2, [%[r], 48]\n\t"
5811         "lsr	x5, x3, 1\n\t"
5812         "lsl	x3, x3, %[n]\n\t"
5813         "lsr	x5, x5, x6\n\t"
5814         "orr	x4, x4, x5\n\t"
5815         "ldr	x2, [%[a], 24]\n\t"
5816         "str	x4, [%[r], 40]\n\t"
5817         "lsr	x5, x2, 1\n\t"
5818         "lsl	x2, x2, %[n]\n\t"
5819         "lsr	x5, x5, x6\n\t"
5820         "orr	x3, x3, x5\n\t"
5821         "ldr	x4, [%[a], 16]\n\t"
5822         "str	x3, [%[r], 32]\n\t"
5823         "lsr	x5, x4, 1\n\t"
5824         "lsl	x4, x4, %[n]\n\t"
5825         "lsr	x5, x5, x6\n\t"
5826         "orr	x2, x2, x5\n\t"
5827         "ldr	x3, [%[a], 8]\n\t"
5828         "str	x2, [%[r], 24]\n\t"
5829         "lsr	x5, x3, 1\n\t"
5830         "lsl	x3, x3, %[n]\n\t"
5831         "lsr	x5, x5, x6\n\t"
5832         "orr	x4, x4, x5\n\t"
5833         "ldr	x2, [%[a], 0]\n\t"
5834         "str	x4, [%[r], 16]\n\t"
5835         "lsr	x5, x2, 1\n\t"
5836         "lsl	x2, x2, %[n]\n\t"
5837         "lsr	x5, x5, x6\n\t"
5838         "orr	x3, x3, x5\n\t"
5839         "str	x2, [%[r]]\n\t"
5840         "str	x3, [%[r], 8]\n\t"
5841         :
5842         : [r] "r" (r), [a] "r" (a), [n] "r" (n64)
5843         : "memory", "x2", "x3", "x4", "x5", "x6"
5844     );
5845 }
5846 
5847 /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
5848  *
5849  * r     A single precision number that is the result of the operation.
5850  * e     A single precision number that is the exponent.
5851  * bits  The number of bits in the exponent.
5852  * m     A single precision number that is the modulus.
5853  * returns  0 on success.
5854  * returns  MEMORY_E on dynamic memory allocation failure.
5855  * returns  MP_VAL when base is even.
5856  */
sp_2048_mod_exp_2_32(sp_digit * r,const sp_digit * e,int bits,const sp_digit * m)5857 static int sp_2048_mod_exp_2_32(sp_digit* r, const sp_digit* e, int bits,
5858         const sp_digit* m)
5859 {
5860 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5861     sp_digit* td = NULL;
5862 #else
5863     sp_digit td[97];
5864 #endif
5865     sp_digit* norm = NULL;
5866     sp_digit* tmp = NULL;
5867     sp_digit mp = 1;
5868     sp_digit n;
5869     sp_digit o;
5870     sp_digit mask;
5871     int i;
5872     int c;
5873     byte y;
5874     int err = MP_OKAY;
5875 
5876     if ((m[0] & 1) == 0) {
5877         err = MP_VAL;
5878     }
5879 
5880 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5881     if (err == MP_OKAY) {
5882         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 97, NULL,
5883                                 DYNAMIC_TYPE_TMP_BUFFER);
5884         if (td == NULL)
5885             err = MEMORY_E;
5886     }
5887 #endif
5888 
5889     if (err == MP_OKAY) {
5890         norm = td;
5891         tmp = td + 64;
5892 
5893         sp_2048_mont_setup(m, &mp);
5894         sp_2048_mont_norm_32(norm, m);
5895 
5896         i = (bits - 1) / 64;
5897         n = e[i--];
5898         c = bits & 63;
5899         if (c == 0) {
5900             c = 64;
5901         }
5902         c -= bits % 6;
5903         if (c == 64) {
5904             c = 58;
5905         }
5906         if (c < 0) {
5907             /* Number of bits in top word is less than number needed. */
5908             c = -c;
5909             y = (byte)(n << c);
5910             n = e[i--];
5911             y |= (byte)(n >> (64 - c));
5912             n <<= c;
5913             c = 64 - c;
5914         }
5915         else {
5916             y = (byte)(n >> c);
5917             n <<= 64 - c;
5918         }
5919         sp_2048_lshift_32(r, norm, y);
5920         for (; i>=0 || c>=6; ) {
5921             if (c == 0) {
5922                 n = e[i--];
5923                 y = (byte)(n >> 58);
5924                 n <<= 6;
5925                 c = 58;
5926             }
5927             else if (c < 6) {
5928                 y = (byte)(n >> 58);
5929                 n = e[i--];
5930                 c = 6 - c;
5931                 y |= (byte)(n >> (64 - c));
5932                 n <<= c;
5933                 c = 64 - c;
5934             }
5935             else {
5936                 y = (byte)((n >> 58) & 0x3f);
5937                 n <<= 6;
5938                 c -= 6;
5939             }
5940 
5941             sp_2048_mont_sqr_32(r, r, m, mp);
5942             sp_2048_mont_sqr_32(r, r, m, mp);
5943             sp_2048_mont_sqr_32(r, r, m, mp);
5944             sp_2048_mont_sqr_32(r, r, m, mp);
5945             sp_2048_mont_sqr_32(r, r, m, mp);
5946             sp_2048_mont_sqr_32(r, r, m, mp);
5947 
5948             sp_2048_lshift_32(r, r, y);
5949             sp_2048_mul_d_32(tmp, norm, r[32]);
5950             r[32] = 0;
5951             o = sp_2048_add_32(r, r, tmp);
5952             sp_2048_cond_sub_32(r, r, m, (sp_digit)0 - o);
5953         }
5954 
5955         XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
5956         sp_2048_mont_reduce_32(r, m, mp);
5957 
5958         mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
5959         sp_2048_cond_sub_32(r, r, m, mask);
5960     }
5961 
5962 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
5963     if (td != NULL)
5964         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
5965 #endif
5966 
5967     return err;
5968 }
5969 #endif /* HAVE_FFDHE_2048 */
5970 
5971 /* Perform the modular exponentiation for Diffie-Hellman.
5972  *
5973  * base     Base.
5974  * exp      Array of bytes that is the exponent.
5975  * expLen   Length of data, in bytes, in exponent.
5976  * mod      Modulus.
5977  * out      Buffer to hold big-endian bytes of exponentiation result.
5978  *          Must be at least 256 bytes long.
5979  * outLen   Length, in bytes, of exponentiation result.
5980  * returns 0 on success, MP_READ_E if there are too many bytes in an array
5981  * and MEMORY_E if memory allocation fails.
5982  */
sp_DhExp_2048(const mp_int * base,const byte * exp,word32 expLen,const mp_int * mod,byte * out,word32 * outLen)5983 int sp_DhExp_2048(const mp_int* base, const byte* exp, word32 expLen,
5984     const mp_int* mod, byte* out, word32* outLen)
5985 {
5986     int err = MP_OKAY;
5987     sp_digit b[64];
5988     sp_digit e[32];
5989     sp_digit m[32];
5990     sp_digit* r = b;
5991     word32 i;
5992 
5993     if (mp_count_bits(base) > 2048) {
5994         err = MP_READ_E;
5995     }
5996     else if (expLen > 256) {
5997         err = MP_READ_E;
5998     }
5999     else if (mp_count_bits(mod) != 2048) {
6000         err = MP_READ_E;
6001     }
6002     else if (mp_iseven(mod)) {
6003         err = MP_VAL;
6004     }
6005 
6006     if (err == MP_OKAY) {
6007         sp_2048_from_mp(b, 32, base);
6008         sp_2048_from_bin(e, 32, exp, expLen);
6009         sp_2048_from_mp(m, 32, mod);
6010 
6011     #ifdef HAVE_FFDHE_2048
6012         if (base->used == 1 && base->dp[0] == 2 && m[31] == (sp_digit)-1)
6013             err = sp_2048_mod_exp_2_32(r, e, expLen * 8, m);
6014         else
6015     #endif
6016             err = sp_2048_mod_exp_32(r, b, e, expLen * 8, m, 0);
6017 
6018     }
6019 
6020     if (err == MP_OKAY) {
6021         sp_2048_to_bin_32(r, out);
6022         *outLen = 256;
6023         for (i=0; i<256 && out[i] == 0; i++) {
6024             /* Search for first non-zero. */
6025         }
6026         *outLen -= i;
6027         XMEMMOVE(out, out + i, *outLen);
6028 
6029     }
6030 
6031     XMEMSET(e, 0, sizeof(e));
6032 
6033     return err;
6034 }
6035 #endif /* WOLFSSL_HAVE_SP_DH */
6036 
6037 /* Perform the modular exponentiation for Diffie-Hellman.
6038  *
6039  * base  Base. MP integer.
6040  * exp   Exponent. MP integer.
6041  * mod   Modulus. MP integer.
6042  * res   Result. MP integer.
6043  * returns 0 on success, MP_READ_E if there are too many bytes in an array
6044  * and MEMORY_E if memory allocation fails.
6045  */
sp_ModExp_1024(const mp_int * base,const mp_int * exp,const mp_int * mod,mp_int * res)6046 int sp_ModExp_1024(const mp_int* base, const mp_int* exp, const mp_int* mod,
6047     mp_int* res)
6048 {
6049     int err = MP_OKAY;
6050     sp_digit b[32];
6051     sp_digit e[16];
6052     sp_digit m[16];
6053     sp_digit* r = b;
6054     int expBits = mp_count_bits(exp);
6055 
6056     if (mp_count_bits(base) > 1024) {
6057         err = MP_READ_E;
6058     }
6059     else if (expBits > 1024) {
6060         err = MP_READ_E;
6061     }
6062     else if (mp_count_bits(mod) != 1024) {
6063         err = MP_READ_E;
6064     }
6065     else if (mp_iseven(mod)) {
6066         err = MP_VAL;
6067     }
6068 
6069     if (err == MP_OKAY) {
6070         sp_2048_from_mp(b, 16, base);
6071         sp_2048_from_mp(e, 16, exp);
6072         sp_2048_from_mp(m, 16, mod);
6073 
6074         err = sp_2048_mod_exp_16(r, b, e, expBits, m, 0);
6075     }
6076 
6077     if (err == MP_OKAY) {
6078         XMEMSET(r + 16, 0, sizeof(*r) * 16U);
6079         err = sp_2048_to_mp(r, res);
6080         res->used = mod->used;
6081         mp_clamp(res);
6082     }
6083 
6084     XMEMSET(e, 0, sizeof(e));
6085 
6086     return err;
6087 }
6088 
6089 #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
6090 
6091 #endif /* !WOLFSSL_SP_NO_2048 */
6092 
6093 #ifndef WOLFSSL_SP_NO_3072
6094 /* Read big endian unsigned byte array into r.
6095  *
6096  * r  A single precision integer.
6097  * size  Maximum number of bytes to convert
6098  * a  Byte array.
6099  * n  Number of bytes in array to read.
6100  */
sp_3072_from_bin(sp_digit * r,int size,const byte * a,int n)6101 static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n)
6102 {
6103     int i;
6104     int j;
6105     byte* d;
6106 
6107     for (i = n - 1,j = 0; i >= 7; i -= 8) {
6108         r[j]  = ((sp_digit)a[i - 0] <<  0) |
6109                 ((sp_digit)a[i - 1] <<  8) |
6110                 ((sp_digit)a[i - 2] << 16) |
6111                 ((sp_digit)a[i - 3] << 24) |
6112                 ((sp_digit)a[i - 4] << 32) |
6113                 ((sp_digit)a[i - 5] << 40) |
6114                 ((sp_digit)a[i - 6] << 48) |
6115                 ((sp_digit)a[i - 7] << 56);
6116         j++;
6117     }
6118 
6119     if (i >= 0) {
6120         r[j] = 0;
6121 
6122         d = (byte*)r;
6123         switch (i) {
6124             case 6: d[n - 1 - 6] = a[6]; //fallthrough
6125             case 5: d[n - 1 - 5] = a[5]; //fallthrough
6126             case 4: d[n - 1 - 4] = a[4]; //fallthrough
6127             case 3: d[n - 1 - 3] = a[3]; //fallthrough
6128             case 2: d[n - 1 - 2] = a[2]; //fallthrough
6129             case 1: d[n - 1 - 1] = a[1]; //fallthrough
6130             case 0: d[n - 1 - 0] = a[0]; //fallthrough
6131         }
6132         j++;
6133     }
6134 
6135     for (; j < size; j++) {
6136         r[j] = 0;
6137     }
6138 }
6139 
6140 /* Convert an mp_int to an array of sp_digit.
6141  *
6142  * r  A single precision integer.
6143  * size  Maximum number of bytes to convert
6144  * a  A multi-precision integer.
6145  */
sp_3072_from_mp(sp_digit * r,int size,const mp_int * a)6146 static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a)
6147 {
6148 #if DIGIT_BIT == 64
6149     int j;
6150 
6151     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
6152 
6153     for (j = a->used; j < size; j++) {
6154         r[j] = 0;
6155     }
6156 #elif DIGIT_BIT > 64
6157     int i;
6158     int j = 0;
6159     word32 s = 0;
6160 
6161     r[0] = 0;
6162     for (i = 0; i < a->used && j < size; i++) {
6163         r[j] |= ((sp_digit)a->dp[i] << s);
6164         r[j] &= 0xffffffffffffffffl;
6165         s = 64U - s;
6166         if (j + 1 >= size) {
6167             break;
6168         }
6169         /* lint allow cast of mismatch word32 and mp_digit */
6170         r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
6171         while ((s + 64U) <= (word32)DIGIT_BIT) {
6172             s += 64U;
6173             r[j] &= 0xffffffffffffffffl;
6174             if (j + 1 >= size) {
6175                 break;
6176             }
6177             if (s < (word32)DIGIT_BIT) {
6178                 /* lint allow cast of mismatch word32 and mp_digit */
6179                 r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
6180             }
6181             else {
6182                 r[++j] = (sp_digit)0;
6183             }
6184         }
6185         s = (word32)DIGIT_BIT - s;
6186     }
6187 
6188     for (j++; j < size; j++) {
6189         r[j] = 0;
6190     }
6191 #else
6192     int i;
6193     int j = 0;
6194     int s = 0;
6195 
6196     r[0] = 0;
6197     for (i = 0; i < a->used && j < size; i++) {
6198         r[j] |= ((sp_digit)a->dp[i]) << s;
6199         if (s + DIGIT_BIT >= 64) {
6200             r[j] &= 0xffffffffffffffffl;
6201             if (j + 1 >= size) {
6202                 break;
6203             }
6204             s = 64 - s;
6205             if (s == DIGIT_BIT) {
6206                 r[++j] = 0;
6207                 s = 0;
6208             }
6209             else {
6210                 r[++j] = a->dp[i] >> s;
6211                 s = DIGIT_BIT - s;
6212             }
6213         }
6214         else {
6215             s += DIGIT_BIT;
6216         }
6217     }
6218 
6219     for (j++; j < size; j++) {
6220         r[j] = 0;
6221     }
6222 #endif
6223 }
6224 
6225 /* Write r as big endian to byte array.
6226  * Fixed length number of bytes written: 384
6227  *
6228  * r  A single precision integer.
6229  * a  Byte array.
6230  */
sp_3072_to_bin_48(sp_digit * r,byte * a)6231 static void sp_3072_to_bin_48(sp_digit* r, byte* a)
6232 {
6233     int i;
6234     int j;
6235 
6236     for (i = 47, j = 0; i >= 0; i--) {
6237         a[j++] = r[i] >> 56;
6238         a[j++] = r[i] >> 48;
6239         a[j++] = r[i] >> 40;
6240         a[j++] = r[i] >> 32;
6241         a[j++] = r[i] >> 24;
6242         a[j++] = r[i] >> 16;
6243         a[j++] = r[i] >> 8;
6244         a[j++] = r[i] >> 0;
6245     }
6246 }
6247 
6248 #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
6249 /* Normalize the values in each word to 64.
6250  *
6251  * a  Array of sp_digit to normalize.
6252  */
6253 #define sp_3072_norm_48(a)
6254 
6255 #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
6256 /* Normalize the values in each word to 64.
6257  *
6258  * a  Array of sp_digit to normalize.
6259  */
6260 #define sp_3072_norm_48(a)
6261 
6262 #ifndef WOLFSSL_SP_SMALL
6263 /* Multiply a and b into r. (r = a * b)
6264  *
6265  * r  A single precision integer.
6266  * a  A single precision integer.
6267  * b  A single precision integer.
6268  */
sp_3072_mul_12(sp_digit * r,const sp_digit * a,const sp_digit * b)6269 static void sp_3072_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
6270 {
6271     sp_digit tmp[12];
6272 
6273     __asm__ __volatile__ (
6274         "ldp	x10, x11, [%[a], 0]\n\t"
6275         "ldp	x12, x13, [%[a], 16]\n\t"
6276         "ldp	x14, x15, [%[a], 32]\n\t"
6277         "ldp	x16, x17, [%[a], 48]\n\t"
6278         "ldp	x19, x20, [%[a], 64]\n\t"
6279         "ldp	x21, x22, [%[a], 80]\n\t"
6280         "#  A[0] * B[0]\n\t"
6281         "ldr	x9, [%[b], 0]\n\t"
6282         "mul	x4, x10, x9\n\t"
6283         "umulh	x5, x10, x9\n\t"
6284         "mov	x6, 0\n\t"
6285         "str	x4, [%[tmp]]\n\t"
6286         "#  A[0] * B[1]\n\t"
6287         "ldr	x9, [%[b], 8]\n\t"
6288         "mul	x7, x10, x9\n\t"
6289         "umulh	x8, x10, x9\n\t"
6290         "adds	x5, x5, x7\n\t"
6291         "#  A[1] * B[0]\n\t"
6292         "ldr	x9, [%[b], 0]\n\t"
6293         "adcs	x6, x6, x8\n\t"
6294         "mul	x7, x11, x9\n\t"
6295         "adc	x4, xzr, xzr\n\t"
6296         "umulh	x8, x11, x9\n\t"
6297         "adds	x5, x5, x7\n\t"
6298         "adcs	x6, x6, x8\n\t"
6299         "str	x5, [%[tmp], 8]\n\t"
6300         "adc	x4, x4, xzr\n\t"
6301         "#  A[0] * B[2]\n\t"
6302         "ldr	x9, [%[b], 16]\n\t"
6303         "mul	x7, x10, x9\n\t"
6304         "umulh	x8, x10, x9\n\t"
6305         "adds	x6, x6, x7\n\t"
6306         "#  A[1] * B[1]\n\t"
6307         "ldr	x9, [%[b], 8]\n\t"
6308         "adcs	x4, x4, x8\n\t"
6309         "mul	x7, x11, x9\n\t"
6310         "adc	x5, xzr, xzr\n\t"
6311         "umulh	x8, x11, x9\n\t"
6312         "adds	x6, x6, x7\n\t"
6313         "#  A[2] * B[0]\n\t"
6314         "ldr	x9, [%[b], 0]\n\t"
6315         "adcs	x4, x4, x8\n\t"
6316         "mul	x7, x12, x9\n\t"
6317         "adc	x5, x5, xzr\n\t"
6318         "umulh	x8, x12, x9\n\t"
6319         "adds	x6, x6, x7\n\t"
6320         "adcs	x4, x4, x8\n\t"
6321         "str	x6, [%[tmp], 16]\n\t"
6322         "adc	x5, x5, xzr\n\t"
6323         "#  A[0] * B[3]\n\t"
6324         "ldr	x9, [%[b], 24]\n\t"
6325         "mul	x7, x10, x9\n\t"
6326         "umulh	x8, x10, x9\n\t"
6327         "adds	x4, x4, x7\n\t"
6328         "#  A[1] * B[2]\n\t"
6329         "ldr	x9, [%[b], 16]\n\t"
6330         "adcs	x5, x5, x8\n\t"
6331         "mul	x7, x11, x9\n\t"
6332         "adc	x6, xzr, xzr\n\t"
6333         "umulh	x8, x11, x9\n\t"
6334         "adds	x4, x4, x7\n\t"
6335         "#  A[2] * B[1]\n\t"
6336         "ldr	x9, [%[b], 8]\n\t"
6337         "adcs	x5, x5, x8\n\t"
6338         "mul	x7, x12, x9\n\t"
6339         "adc	x6, x6, xzr\n\t"
6340         "umulh	x8, x12, x9\n\t"
6341         "adds	x4, x4, x7\n\t"
6342         "#  A[3] * B[0]\n\t"
6343         "ldr	x9, [%[b], 0]\n\t"
6344         "adcs	x5, x5, x8\n\t"
6345         "mul	x7, x13, x9\n\t"
6346         "adc	x6, x6, xzr\n\t"
6347         "umulh	x8, x13, x9\n\t"
6348         "adds	x4, x4, x7\n\t"
6349         "adcs	x5, x5, x8\n\t"
6350         "str	x4, [%[tmp], 24]\n\t"
6351         "adc	x6, x6, xzr\n\t"
6352         "#  A[0] * B[4]\n\t"
6353         "ldr	x9, [%[b], 32]\n\t"
6354         "mul	x7, x10, x9\n\t"
6355         "umulh	x8, x10, x9\n\t"
6356         "adds	x5, x5, x7\n\t"
6357         "#  A[1] * B[3]\n\t"
6358         "ldr	x9, [%[b], 24]\n\t"
6359         "adcs	x6, x6, x8\n\t"
6360         "mul	x7, x11, x9\n\t"
6361         "adc	x4, xzr, xzr\n\t"
6362         "umulh	x8, x11, x9\n\t"
6363         "adds	x5, x5, x7\n\t"
6364         "#  A[2] * B[2]\n\t"
6365         "ldr	x9, [%[b], 16]\n\t"
6366         "adcs	x6, x6, x8\n\t"
6367         "mul	x7, x12, x9\n\t"
6368         "adc	x4, x4, xzr\n\t"
6369         "umulh	x8, x12, x9\n\t"
6370         "adds	x5, x5, x7\n\t"
6371         "#  A[3] * B[1]\n\t"
6372         "ldr	x9, [%[b], 8]\n\t"
6373         "adcs	x6, x6, x8\n\t"
6374         "mul	x7, x13, x9\n\t"
6375         "adc	x4, x4, xzr\n\t"
6376         "umulh	x8, x13, x9\n\t"
6377         "adds	x5, x5, x7\n\t"
6378         "#  A[4] * B[0]\n\t"
6379         "ldr	x9, [%[b], 0]\n\t"
6380         "adcs	x6, x6, x8\n\t"
6381         "mul	x7, x14, x9\n\t"
6382         "adc	x4, x4, xzr\n\t"
6383         "umulh	x8, x14, x9\n\t"
6384         "adds	x5, x5, x7\n\t"
6385         "adcs	x6, x6, x8\n\t"
6386         "str	x5, [%[tmp], 32]\n\t"
6387         "adc	x4, x4, xzr\n\t"
6388         "#  A[0] * B[5]\n\t"
6389         "ldr	x9, [%[b], 40]\n\t"
6390         "mul	x7, x10, x9\n\t"
6391         "umulh	x8, x10, x9\n\t"
6392         "adds	x6, x6, x7\n\t"
6393         "#  A[1] * B[4]\n\t"
6394         "ldr	x9, [%[b], 32]\n\t"
6395         "adcs	x4, x4, x8\n\t"
6396         "mul	x7, x11, x9\n\t"
6397         "adc	x5, xzr, xzr\n\t"
6398         "umulh	x8, x11, x9\n\t"
6399         "adds	x6, x6, x7\n\t"
6400         "#  A[2] * B[3]\n\t"
6401         "ldr	x9, [%[b], 24]\n\t"
6402         "adcs	x4, x4, x8\n\t"
6403         "mul	x7, x12, x9\n\t"
6404         "adc	x5, x5, xzr\n\t"
6405         "umulh	x8, x12, x9\n\t"
6406         "adds	x6, x6, x7\n\t"
6407         "#  A[3] * B[2]\n\t"
6408         "ldr	x9, [%[b], 16]\n\t"
6409         "adcs	x4, x4, x8\n\t"
6410         "mul	x7, x13, x9\n\t"
6411         "adc	x5, x5, xzr\n\t"
6412         "umulh	x8, x13, x9\n\t"
6413         "adds	x6, x6, x7\n\t"
6414         "#  A[4] * B[1]\n\t"
6415         "ldr	x9, [%[b], 8]\n\t"
6416         "adcs	x4, x4, x8\n\t"
6417         "mul	x7, x14, x9\n\t"
6418         "adc	x5, x5, xzr\n\t"
6419         "umulh	x8, x14, x9\n\t"
6420         "adds	x6, x6, x7\n\t"
6421         "#  A[5] * B[0]\n\t"
6422         "ldr	x9, [%[b], 0]\n\t"
6423         "adcs	x4, x4, x8\n\t"
6424         "mul	x7, x15, x9\n\t"
6425         "adc	x5, x5, xzr\n\t"
6426         "umulh	x8, x15, x9\n\t"
6427         "adds	x6, x6, x7\n\t"
6428         "adcs	x4, x4, x8\n\t"
6429         "str	x6, [%[tmp], 40]\n\t"
6430         "adc	x5, x5, xzr\n\t"
6431         "#  A[0] * B[6]\n\t"
6432         "ldr	x9, [%[b], 48]\n\t"
6433         "mul	x7, x10, x9\n\t"
6434         "umulh	x8, x10, x9\n\t"
6435         "adds	x4, x4, x7\n\t"
6436         "#  A[1] * B[5]\n\t"
6437         "ldr	x9, [%[b], 40]\n\t"
6438         "adcs	x5, x5, x8\n\t"
6439         "mul	x7, x11, x9\n\t"
6440         "adc	x6, xzr, xzr\n\t"
6441         "umulh	x8, x11, x9\n\t"
6442         "adds	x4, x4, x7\n\t"
6443         "#  A[2] * B[4]\n\t"
6444         "ldr	x9, [%[b], 32]\n\t"
6445         "adcs	x5, x5, x8\n\t"
6446         "mul	x7, x12, x9\n\t"
6447         "adc	x6, x6, xzr\n\t"
6448         "umulh	x8, x12, x9\n\t"
6449         "adds	x4, x4, x7\n\t"
6450         "#  A[3] * B[3]\n\t"
6451         "ldr	x9, [%[b], 24]\n\t"
6452         "adcs	x5, x5, x8\n\t"
6453         "mul	x7, x13, x9\n\t"
6454         "adc	x6, x6, xzr\n\t"
6455         "umulh	x8, x13, x9\n\t"
6456         "adds	x4, x4, x7\n\t"
6457         "#  A[4] * B[2]\n\t"
6458         "ldr	x9, [%[b], 16]\n\t"
6459         "adcs	x5, x5, x8\n\t"
6460         "mul	x7, x14, x9\n\t"
6461         "adc	x6, x6, xzr\n\t"
6462         "umulh	x8, x14, x9\n\t"
6463         "adds	x4, x4, x7\n\t"
6464         "#  A[5] * B[1]\n\t"
6465         "ldr	x9, [%[b], 8]\n\t"
6466         "adcs	x5, x5, x8\n\t"
6467         "mul	x7, x15, x9\n\t"
6468         "adc	x6, x6, xzr\n\t"
6469         "umulh	x8, x15, x9\n\t"
6470         "adds	x4, x4, x7\n\t"
6471         "#  A[6] * B[0]\n\t"
6472         "ldr	x9, [%[b], 0]\n\t"
6473         "adcs	x5, x5, x8\n\t"
6474         "mul	x7, x16, x9\n\t"
6475         "adc	x6, x6, xzr\n\t"
6476         "umulh	x8, x16, x9\n\t"
6477         "adds	x4, x4, x7\n\t"
6478         "adcs	x5, x5, x8\n\t"
6479         "str	x4, [%[tmp], 48]\n\t"
6480         "adc	x6, x6, xzr\n\t"
6481         "#  A[0] * B[7]\n\t"
6482         "ldr	x9, [%[b], 56]\n\t"
6483         "mul	x7, x10, x9\n\t"
6484         "umulh	x8, x10, x9\n\t"
6485         "adds	x5, x5, x7\n\t"
6486         "#  A[1] * B[6]\n\t"
6487         "ldr	x9, [%[b], 48]\n\t"
6488         "adcs	x6, x6, x8\n\t"
6489         "mul	x7, x11, x9\n\t"
6490         "adc	x4, xzr, xzr\n\t"
6491         "umulh	x8, x11, x9\n\t"
6492         "adds	x5, x5, x7\n\t"
6493         "#  A[2] * B[5]\n\t"
6494         "ldr	x9, [%[b], 40]\n\t"
6495         "adcs	x6, x6, x8\n\t"
6496         "mul	x7, x12, x9\n\t"
6497         "adc	x4, x4, xzr\n\t"
6498         "umulh	x8, x12, x9\n\t"
6499         "adds	x5, x5, x7\n\t"
6500         "#  A[3] * B[4]\n\t"
6501         "ldr	x9, [%[b], 32]\n\t"
6502         "adcs	x6, x6, x8\n\t"
6503         "mul	x7, x13, x9\n\t"
6504         "adc	x4, x4, xzr\n\t"
6505         "umulh	x8, x13, x9\n\t"
6506         "adds	x5, x5, x7\n\t"
6507         "#  A[4] * B[3]\n\t"
6508         "ldr	x9, [%[b], 24]\n\t"
6509         "adcs	x6, x6, x8\n\t"
6510         "mul	x7, x14, x9\n\t"
6511         "adc	x4, x4, xzr\n\t"
6512         "umulh	x8, x14, x9\n\t"
6513         "adds	x5, x5, x7\n\t"
6514         "#  A[5] * B[2]\n\t"
6515         "ldr	x9, [%[b], 16]\n\t"
6516         "adcs	x6, x6, x8\n\t"
6517         "mul	x7, x15, x9\n\t"
6518         "adc	x4, x4, xzr\n\t"
6519         "umulh	x8, x15, x9\n\t"
6520         "adds	x5, x5, x7\n\t"
6521         "#  A[6] * B[1]\n\t"
6522         "ldr	x9, [%[b], 8]\n\t"
6523         "adcs	x6, x6, x8\n\t"
6524         "mul	x7, x16, x9\n\t"
6525         "adc	x4, x4, xzr\n\t"
6526         "umulh	x8, x16, x9\n\t"
6527         "adds	x5, x5, x7\n\t"
6528         "#  A[7] * B[0]\n\t"
6529         "ldr	x9, [%[b], 0]\n\t"
6530         "adcs	x6, x6, x8\n\t"
6531         "mul	x7, x17, x9\n\t"
6532         "adc	x4, x4, xzr\n\t"
6533         "umulh	x8, x17, x9\n\t"
6534         "adds	x5, x5, x7\n\t"
6535         "adcs	x6, x6, x8\n\t"
6536         "str	x5, [%[tmp], 56]\n\t"
6537         "adc	x4, x4, xzr\n\t"
6538         "#  A[0] * B[8]\n\t"
6539         "ldr	x9, [%[b], 64]\n\t"
6540         "mul	x7, x10, x9\n\t"
6541         "umulh	x8, x10, x9\n\t"
6542         "adds	x6, x6, x7\n\t"
6543         "#  A[1] * B[7]\n\t"
6544         "ldr	x9, [%[b], 56]\n\t"
6545         "adcs	x4, x4, x8\n\t"
6546         "mul	x7, x11, x9\n\t"
6547         "adc	x5, xzr, xzr\n\t"
6548         "umulh	x8, x11, x9\n\t"
6549         "adds	x6, x6, x7\n\t"
6550         "#  A[2] * B[6]\n\t"
6551         "ldr	x9, [%[b], 48]\n\t"
6552         "adcs	x4, x4, x8\n\t"
6553         "mul	x7, x12, x9\n\t"
6554         "adc	x5, x5, xzr\n\t"
6555         "umulh	x8, x12, x9\n\t"
6556         "adds	x6, x6, x7\n\t"
6557         "#  A[3] * B[5]\n\t"
6558         "ldr	x9, [%[b], 40]\n\t"
6559         "adcs	x4, x4, x8\n\t"
6560         "mul	x7, x13, x9\n\t"
6561         "adc	x5, x5, xzr\n\t"
6562         "umulh	x8, x13, x9\n\t"
6563         "adds	x6, x6, x7\n\t"
6564         "#  A[4] * B[4]\n\t"
6565         "ldr	x9, [%[b], 32]\n\t"
6566         "adcs	x4, x4, x8\n\t"
6567         "mul	x7, x14, x9\n\t"
6568         "adc	x5, x5, xzr\n\t"
6569         "umulh	x8, x14, x9\n\t"
6570         "adds	x6, x6, x7\n\t"
6571         "#  A[5] * B[3]\n\t"
6572         "ldr	x9, [%[b], 24]\n\t"
6573         "adcs	x4, x4, x8\n\t"
6574         "mul	x7, x15, x9\n\t"
6575         "adc	x5, x5, xzr\n\t"
6576         "umulh	x8, x15, x9\n\t"
6577         "adds	x6, x6, x7\n\t"
6578         "#  A[6] * B[2]\n\t"
6579         "ldr	x9, [%[b], 16]\n\t"
6580         "adcs	x4, x4, x8\n\t"
6581         "mul	x7, x16, x9\n\t"
6582         "adc	x5, x5, xzr\n\t"
6583         "umulh	x8, x16, x9\n\t"
6584         "adds	x6, x6, x7\n\t"
6585         "#  A[7] * B[1]\n\t"
6586         "ldr	x9, [%[b], 8]\n\t"
6587         "adcs	x4, x4, x8\n\t"
6588         "mul	x7, x17, x9\n\t"
6589         "adc	x5, x5, xzr\n\t"
6590         "umulh	x8, x17, x9\n\t"
6591         "adds	x6, x6, x7\n\t"
6592         "#  A[8] * B[0]\n\t"
6593         "ldr	x9, [%[b], 0]\n\t"
6594         "adcs	x4, x4, x8\n\t"
6595         "mul	x7, x19, x9\n\t"
6596         "adc	x5, x5, xzr\n\t"
6597         "umulh	x8, x19, x9\n\t"
6598         "adds	x6, x6, x7\n\t"
6599         "adcs	x4, x4, x8\n\t"
6600         "str	x6, [%[tmp], 64]\n\t"
6601         "adc	x5, x5, xzr\n\t"
6602         "#  A[0] * B[9]\n\t"
6603         "ldr	x9, [%[b], 72]\n\t"
6604         "mul	x7, x10, x9\n\t"
6605         "umulh	x8, x10, x9\n\t"
6606         "adds	x4, x4, x7\n\t"
6607         "#  A[1] * B[8]\n\t"
6608         "ldr	x9, [%[b], 64]\n\t"
6609         "adcs	x5, x5, x8\n\t"
6610         "mul	x7, x11, x9\n\t"
6611         "adc	x6, xzr, xzr\n\t"
6612         "umulh	x8, x11, x9\n\t"
6613         "adds	x4, x4, x7\n\t"
6614         "#  A[2] * B[7]\n\t"
6615         "ldr	x9, [%[b], 56]\n\t"
6616         "adcs	x5, x5, x8\n\t"
6617         "mul	x7, x12, x9\n\t"
6618         "adc	x6, x6, xzr\n\t"
6619         "umulh	x8, x12, x9\n\t"
6620         "adds	x4, x4, x7\n\t"
6621         "#  A[3] * B[6]\n\t"
6622         "ldr	x9, [%[b], 48]\n\t"
6623         "adcs	x5, x5, x8\n\t"
6624         "mul	x7, x13, x9\n\t"
6625         "adc	x6, x6, xzr\n\t"
6626         "umulh	x8, x13, x9\n\t"
6627         "adds	x4, x4, x7\n\t"
6628         "#  A[4] * B[5]\n\t"
6629         "ldr	x9, [%[b], 40]\n\t"
6630         "adcs	x5, x5, x8\n\t"
6631         "mul	x7, x14, x9\n\t"
6632         "adc	x6, x6, xzr\n\t"
6633         "umulh	x8, x14, x9\n\t"
6634         "adds	x4, x4, x7\n\t"
6635         "#  A[5] * B[4]\n\t"
6636         "ldr	x9, [%[b], 32]\n\t"
6637         "adcs	x5, x5, x8\n\t"
6638         "mul	x7, x15, x9\n\t"
6639         "adc	x6, x6, xzr\n\t"
6640         "umulh	x8, x15, x9\n\t"
6641         "adds	x4, x4, x7\n\t"
6642         "#  A[6] * B[3]\n\t"
6643         "ldr	x9, [%[b], 24]\n\t"
6644         "adcs	x5, x5, x8\n\t"
6645         "mul	x7, x16, x9\n\t"
6646         "adc	x6, x6, xzr\n\t"
6647         "umulh	x8, x16, x9\n\t"
6648         "adds	x4, x4, x7\n\t"
6649         "#  A[7] * B[2]\n\t"
6650         "ldr	x9, [%[b], 16]\n\t"
6651         "adcs	x5, x5, x8\n\t"
6652         "mul	x7, x17, x9\n\t"
6653         "adc	x6, x6, xzr\n\t"
6654         "umulh	x8, x17, x9\n\t"
6655         "adds	x4, x4, x7\n\t"
6656         "#  A[8] * B[1]\n\t"
6657         "ldr	x9, [%[b], 8]\n\t"
6658         "adcs	x5, x5, x8\n\t"
6659         "mul	x7, x19, x9\n\t"
6660         "adc	x6, x6, xzr\n\t"
6661         "umulh	x8, x19, x9\n\t"
6662         "adds	x4, x4, x7\n\t"
6663         "#  A[9] * B[0]\n\t"
6664         "ldr	x9, [%[b], 0]\n\t"
6665         "adcs	x5, x5, x8\n\t"
6666         "mul	x7, x20, x9\n\t"
6667         "adc	x6, x6, xzr\n\t"
6668         "umulh	x8, x20, x9\n\t"
6669         "adds	x4, x4, x7\n\t"
6670         "adcs	x5, x5, x8\n\t"
6671         "str	x4, [%[tmp], 72]\n\t"
6672         "adc	x6, x6, xzr\n\t"
6673         "#  A[0] * B[10]\n\t"
6674         "ldr	x9, [%[b], 80]\n\t"
6675         "mul	x7, x10, x9\n\t"
6676         "umulh	x8, x10, x9\n\t"
6677         "adds	x5, x5, x7\n\t"
6678         "#  A[1] * B[9]\n\t"
6679         "ldr	x9, [%[b], 72]\n\t"
6680         "adcs	x6, x6, x8\n\t"
6681         "mul	x7, x11, x9\n\t"
6682         "adc	x4, xzr, xzr\n\t"
6683         "umulh	x8, x11, x9\n\t"
6684         "adds	x5, x5, x7\n\t"
6685         "#  A[2] * B[8]\n\t"
6686         "ldr	x9, [%[b], 64]\n\t"
6687         "adcs	x6, x6, x8\n\t"
6688         "mul	x7, x12, x9\n\t"
6689         "adc	x4, x4, xzr\n\t"
6690         "umulh	x8, x12, x9\n\t"
6691         "adds	x5, x5, x7\n\t"
6692         "#  A[3] * B[7]\n\t"
6693         "ldr	x9, [%[b], 56]\n\t"
6694         "adcs	x6, x6, x8\n\t"
6695         "mul	x7, x13, x9\n\t"
6696         "adc	x4, x4, xzr\n\t"
6697         "umulh	x8, x13, x9\n\t"
6698         "adds	x5, x5, x7\n\t"
6699         "#  A[4] * B[6]\n\t"
6700         "ldr	x9, [%[b], 48]\n\t"
6701         "adcs	x6, x6, x8\n\t"
6702         "mul	x7, x14, x9\n\t"
6703         "adc	x4, x4, xzr\n\t"
6704         "umulh	x8, x14, x9\n\t"
6705         "adds	x5, x5, x7\n\t"
6706         "#  A[5] * B[5]\n\t"
6707         "ldr	x9, [%[b], 40]\n\t"
6708         "adcs	x6, x6, x8\n\t"
6709         "mul	x7, x15, x9\n\t"
6710         "adc	x4, x4, xzr\n\t"
6711         "umulh	x8, x15, x9\n\t"
6712         "adds	x5, x5, x7\n\t"
6713         "#  A[6] * B[4]\n\t"
6714         "ldr	x9, [%[b], 32]\n\t"
6715         "adcs	x6, x6, x8\n\t"
6716         "mul	x7, x16, x9\n\t"
6717         "adc	x4, x4, xzr\n\t"
6718         "umulh	x8, x16, x9\n\t"
6719         "adds	x5, x5, x7\n\t"
6720         "#  A[7] * B[3]\n\t"
6721         "ldr	x9, [%[b], 24]\n\t"
6722         "adcs	x6, x6, x8\n\t"
6723         "mul	x7, x17, x9\n\t"
6724         "adc	x4, x4, xzr\n\t"
6725         "umulh	x8, x17, x9\n\t"
6726         "adds	x5, x5, x7\n\t"
6727         "#  A[8] * B[2]\n\t"
6728         "ldr	x9, [%[b], 16]\n\t"
6729         "adcs	x6, x6, x8\n\t"
6730         "mul	x7, x19, x9\n\t"
6731         "adc	x4, x4, xzr\n\t"
6732         "umulh	x8, x19, x9\n\t"
6733         "adds	x5, x5, x7\n\t"
6734         "#  A[9] * B[1]\n\t"
6735         "ldr	x9, [%[b], 8]\n\t"
6736         "adcs	x6, x6, x8\n\t"
6737         "mul	x7, x20, x9\n\t"
6738         "adc	x4, x4, xzr\n\t"
6739         "umulh	x8, x20, x9\n\t"
6740         "adds	x5, x5, x7\n\t"
6741         "#  A[10] * B[0]\n\t"
6742         "ldr	x9, [%[b], 0]\n\t"
6743         "adcs	x6, x6, x8\n\t"
6744         "mul	x7, x21, x9\n\t"
6745         "adc	x4, x4, xzr\n\t"
6746         "umulh	x8, x21, x9\n\t"
6747         "adds	x5, x5, x7\n\t"
6748         "adcs	x6, x6, x8\n\t"
6749         "str	x5, [%[tmp], 80]\n\t"
6750         "adc	x4, x4, xzr\n\t"
6751         "#  A[0] * B[11]\n\t"
6752         "ldr	x9, [%[b], 88]\n\t"
6753         "mul	x7, x10, x9\n\t"
6754         "umulh	x8, x10, x9\n\t"
6755         "adds	x6, x6, x7\n\t"
6756         "#  A[1] * B[10]\n\t"
6757         "ldr	x9, [%[b], 80]\n\t"
6758         "adcs	x4, x4, x8\n\t"
6759         "mul	x7, x11, x9\n\t"
6760         "adc	x5, xzr, xzr\n\t"
6761         "umulh	x8, x11, x9\n\t"
6762         "adds	x6, x6, x7\n\t"
6763         "#  A[2] * B[9]\n\t"
6764         "ldr	x9, [%[b], 72]\n\t"
6765         "adcs	x4, x4, x8\n\t"
6766         "mul	x7, x12, x9\n\t"
6767         "adc	x5, x5, xzr\n\t"
6768         "umulh	x8, x12, x9\n\t"
6769         "adds	x6, x6, x7\n\t"
6770         "#  A[3] * B[8]\n\t"
6771         "ldr	x9, [%[b], 64]\n\t"
6772         "adcs	x4, x4, x8\n\t"
6773         "mul	x7, x13, x9\n\t"
6774         "adc	x5, x5, xzr\n\t"
6775         "umulh	x8, x13, x9\n\t"
6776         "adds	x6, x6, x7\n\t"
6777         "#  A[4] * B[7]\n\t"
6778         "ldr	x9, [%[b], 56]\n\t"
6779         "adcs	x4, x4, x8\n\t"
6780         "mul	x7, x14, x9\n\t"
6781         "adc	x5, x5, xzr\n\t"
6782         "umulh	x8, x14, x9\n\t"
6783         "adds	x6, x6, x7\n\t"
6784         "#  A[5] * B[6]\n\t"
6785         "ldr	x9, [%[b], 48]\n\t"
6786         "adcs	x4, x4, x8\n\t"
6787         "mul	x7, x15, x9\n\t"
6788         "adc	x5, x5, xzr\n\t"
6789         "umulh	x8, x15, x9\n\t"
6790         "adds	x6, x6, x7\n\t"
6791         "#  A[6] * B[5]\n\t"
6792         "ldr	x9, [%[b], 40]\n\t"
6793         "adcs	x4, x4, x8\n\t"
6794         "mul	x7, x16, x9\n\t"
6795         "adc	x5, x5, xzr\n\t"
6796         "umulh	x8, x16, x9\n\t"
6797         "adds	x6, x6, x7\n\t"
6798         "#  A[7] * B[4]\n\t"
6799         "ldr	x9, [%[b], 32]\n\t"
6800         "adcs	x4, x4, x8\n\t"
6801         "mul	x7, x17, x9\n\t"
6802         "adc	x5, x5, xzr\n\t"
6803         "umulh	x8, x17, x9\n\t"
6804         "adds	x6, x6, x7\n\t"
6805         "#  A[8] * B[3]\n\t"
6806         "ldr	x9, [%[b], 24]\n\t"
6807         "adcs	x4, x4, x8\n\t"
6808         "mul	x7, x19, x9\n\t"
6809         "adc	x5, x5, xzr\n\t"
6810         "umulh	x8, x19, x9\n\t"
6811         "adds	x6, x6, x7\n\t"
6812         "#  A[9] * B[2]\n\t"
6813         "ldr	x9, [%[b], 16]\n\t"
6814         "adcs	x4, x4, x8\n\t"
6815         "mul	x7, x20, x9\n\t"
6816         "adc	x5, x5, xzr\n\t"
6817         "umulh	x8, x20, x9\n\t"
6818         "adds	x6, x6, x7\n\t"
6819         "#  A[10] * B[1]\n\t"
6820         "ldr	x9, [%[b], 8]\n\t"
6821         "adcs	x4, x4, x8\n\t"
6822         "mul	x7, x21, x9\n\t"
6823         "adc	x5, x5, xzr\n\t"
6824         "umulh	x8, x21, x9\n\t"
6825         "adds	x6, x6, x7\n\t"
6826         "#  A[11] * B[0]\n\t"
6827         "ldr	x9, [%[b], 0]\n\t"
6828         "adcs	x4, x4, x8\n\t"
6829         "mul	x7, x22, x9\n\t"
6830         "adc	x5, x5, xzr\n\t"
6831         "umulh	x8, x22, x9\n\t"
6832         "adds	x6, x6, x7\n\t"
6833         "adcs	x4, x4, x8\n\t"
6834         "str	x6, [%[tmp], 88]\n\t"
6835         "adc	x5, x5, xzr\n\t"
6836         "#  A[1] * B[11]\n\t"
6837         "ldr	x9, [%[b], 88]\n\t"
6838         "mul	x7, x11, x9\n\t"
6839         "umulh	x8, x11, x9\n\t"
6840         "adds	x4, x4, x7\n\t"
6841         "#  A[2] * B[10]\n\t"
6842         "ldr	x9, [%[b], 80]\n\t"
6843         "adcs	x5, x5, x8\n\t"
6844         "mul	x7, x12, x9\n\t"
6845         "adc	x6, xzr, xzr\n\t"
6846         "umulh	x8, x12, x9\n\t"
6847         "adds	x4, x4, x7\n\t"
6848         "#  A[3] * B[9]\n\t"
6849         "ldr	x9, [%[b], 72]\n\t"
6850         "adcs	x5, x5, x8\n\t"
6851         "mul	x7, x13, x9\n\t"
6852         "adc	x6, x6, xzr\n\t"
6853         "umulh	x8, x13, x9\n\t"
6854         "adds	x4, x4, x7\n\t"
6855         "#  A[4] * B[8]\n\t"
6856         "ldr	x9, [%[b], 64]\n\t"
6857         "adcs	x5, x5, x8\n\t"
6858         "mul	x7, x14, x9\n\t"
6859         "adc	x6, x6, xzr\n\t"
6860         "umulh	x8, x14, x9\n\t"
6861         "adds	x4, x4, x7\n\t"
6862         "#  A[5] * B[7]\n\t"
6863         "ldr	x9, [%[b], 56]\n\t"
6864         "adcs	x5, x5, x8\n\t"
6865         "mul	x7, x15, x9\n\t"
6866         "adc	x6, x6, xzr\n\t"
6867         "umulh	x8, x15, x9\n\t"
6868         "adds	x4, x4, x7\n\t"
6869         "#  A[6] * B[6]\n\t"
6870         "ldr	x9, [%[b], 48]\n\t"
6871         "adcs	x5, x5, x8\n\t"
6872         "mul	x7, x16, x9\n\t"
6873         "adc	x6, x6, xzr\n\t"
6874         "umulh	x8, x16, x9\n\t"
6875         "adds	x4, x4, x7\n\t"
6876         "#  A[7] * B[5]\n\t"
6877         "ldr	x9, [%[b], 40]\n\t"
6878         "adcs	x5, x5, x8\n\t"
6879         "mul	x7, x17, x9\n\t"
6880         "adc	x6, x6, xzr\n\t"
6881         "umulh	x8, x17, x9\n\t"
6882         "adds	x4, x4, x7\n\t"
6883         "#  A[8] * B[4]\n\t"
6884         "ldr	x9, [%[b], 32]\n\t"
6885         "adcs	x5, x5, x8\n\t"
6886         "mul	x7, x19, x9\n\t"
6887         "adc	x6, x6, xzr\n\t"
6888         "umulh	x8, x19, x9\n\t"
6889         "adds	x4, x4, x7\n\t"
6890         "#  A[9] * B[3]\n\t"
6891         "ldr	x9, [%[b], 24]\n\t"
6892         "adcs	x5, x5, x8\n\t"
6893         "mul	x7, x20, x9\n\t"
6894         "adc	x6, x6, xzr\n\t"
6895         "umulh	x8, x20, x9\n\t"
6896         "adds	x4, x4, x7\n\t"
6897         "#  A[10] * B[2]\n\t"
6898         "ldr	x9, [%[b], 16]\n\t"
6899         "adcs	x5, x5, x8\n\t"
6900         "mul	x7, x21, x9\n\t"
6901         "adc	x6, x6, xzr\n\t"
6902         "umulh	x8, x21, x9\n\t"
6903         "adds	x4, x4, x7\n\t"
6904         "#  A[11] * B[1]\n\t"
6905         "ldr	x9, [%[b], 8]\n\t"
6906         "adcs	x5, x5, x8\n\t"
6907         "mul	x7, x22, x9\n\t"
6908         "adc	x6, x6, xzr\n\t"
6909         "umulh	x8, x22, x9\n\t"
6910         "adds	x4, x4, x7\n\t"
6911         "adcs	x5, x5, x8\n\t"
6912         "str	x4, [%[r], 96]\n\t"
6913         "adc	x6, x6, xzr\n\t"
6914         "#  A[2] * B[11]\n\t"
6915         "ldr	x9, [%[b], 88]\n\t"
6916         "mul	x7, x12, x9\n\t"
6917         "umulh	x8, x12, x9\n\t"
6918         "adds	x5, x5, x7\n\t"
6919         "#  A[3] * B[10]\n\t"
6920         "ldr	x9, [%[b], 80]\n\t"
6921         "adcs	x6, x6, x8\n\t"
6922         "mul	x7, x13, x9\n\t"
6923         "adc	x4, xzr, xzr\n\t"
6924         "umulh	x8, x13, x9\n\t"
6925         "adds	x5, x5, x7\n\t"
6926         "#  A[4] * B[9]\n\t"
6927         "ldr	x9, [%[b], 72]\n\t"
6928         "adcs	x6, x6, x8\n\t"
6929         "mul	x7, x14, x9\n\t"
6930         "adc	x4, x4, xzr\n\t"
6931         "umulh	x8, x14, x9\n\t"
6932         "adds	x5, x5, x7\n\t"
6933         "#  A[5] * B[8]\n\t"
6934         "ldr	x9, [%[b], 64]\n\t"
6935         "adcs	x6, x6, x8\n\t"
6936         "mul	x7, x15, x9\n\t"
6937         "adc	x4, x4, xzr\n\t"
6938         "umulh	x8, x15, x9\n\t"
6939         "adds	x5, x5, x7\n\t"
6940         "#  A[6] * B[7]\n\t"
6941         "ldr	x9, [%[b], 56]\n\t"
6942         "adcs	x6, x6, x8\n\t"
6943         "mul	x7, x16, x9\n\t"
6944         "adc	x4, x4, xzr\n\t"
6945         "umulh	x8, x16, x9\n\t"
6946         "adds	x5, x5, x7\n\t"
6947         "#  A[7] * B[6]\n\t"
6948         "ldr	x9, [%[b], 48]\n\t"
6949         "adcs	x6, x6, x8\n\t"
6950         "mul	x7, x17, x9\n\t"
6951         "adc	x4, x4, xzr\n\t"
6952         "umulh	x8, x17, x9\n\t"
6953         "adds	x5, x5, x7\n\t"
6954         "#  A[8] * B[5]\n\t"
6955         "ldr	x9, [%[b], 40]\n\t"
6956         "adcs	x6, x6, x8\n\t"
6957         "mul	x7, x19, x9\n\t"
6958         "adc	x4, x4, xzr\n\t"
6959         "umulh	x8, x19, x9\n\t"
6960         "adds	x5, x5, x7\n\t"
6961         "#  A[9] * B[4]\n\t"
6962         "ldr	x9, [%[b], 32]\n\t"
6963         "adcs	x6, x6, x8\n\t"
6964         "mul	x7, x20, x9\n\t"
6965         "adc	x4, x4, xzr\n\t"
6966         "umulh	x8, x20, x9\n\t"
6967         "adds	x5, x5, x7\n\t"
6968         "#  A[10] * B[3]\n\t"
6969         "ldr	x9, [%[b], 24]\n\t"
6970         "adcs	x6, x6, x8\n\t"
6971         "mul	x7, x21, x9\n\t"
6972         "adc	x4, x4, xzr\n\t"
6973         "umulh	x8, x21, x9\n\t"
6974         "adds	x5, x5, x7\n\t"
6975         "#  A[11] * B[2]\n\t"
6976         "ldr	x9, [%[b], 16]\n\t"
6977         "adcs	x6, x6, x8\n\t"
6978         "mul	x7, x22, x9\n\t"
6979         "adc	x4, x4, xzr\n\t"
6980         "umulh	x8, x22, x9\n\t"
6981         "adds	x5, x5, x7\n\t"
6982         "adcs	x6, x6, x8\n\t"
6983         "str	x5, [%[r], 104]\n\t"
6984         "adc	x4, x4, xzr\n\t"
6985         "#  A[3] * B[11]\n\t"
6986         "ldr	x9, [%[b], 88]\n\t"
6987         "mul	x7, x13, x9\n\t"
6988         "umulh	x8, x13, x9\n\t"
6989         "adds	x6, x6, x7\n\t"
6990         "#  A[4] * B[10]\n\t"
6991         "ldr	x9, [%[b], 80]\n\t"
6992         "adcs	x4, x4, x8\n\t"
6993         "mul	x7, x14, x9\n\t"
6994         "adc	x5, xzr, xzr\n\t"
6995         "umulh	x8, x14, x9\n\t"
6996         "adds	x6, x6, x7\n\t"
6997         "#  A[5] * B[9]\n\t"
6998         "ldr	x9, [%[b], 72]\n\t"
6999         "adcs	x4, x4, x8\n\t"
7000         "mul	x7, x15, x9\n\t"
7001         "adc	x5, x5, xzr\n\t"
7002         "umulh	x8, x15, x9\n\t"
7003         "adds	x6, x6, x7\n\t"
7004         "#  A[6] * B[8]\n\t"
7005         "ldr	x9, [%[b], 64]\n\t"
7006         "adcs	x4, x4, x8\n\t"
7007         "mul	x7, x16, x9\n\t"
7008         "adc	x5, x5, xzr\n\t"
7009         "umulh	x8, x16, x9\n\t"
7010         "adds	x6, x6, x7\n\t"
7011         "#  A[7] * B[7]\n\t"
7012         "ldr	x9, [%[b], 56]\n\t"
7013         "adcs	x4, x4, x8\n\t"
7014         "mul	x7, x17, x9\n\t"
7015         "adc	x5, x5, xzr\n\t"
7016         "umulh	x8, x17, x9\n\t"
7017         "adds	x6, x6, x7\n\t"
7018         "#  A[8] * B[6]\n\t"
7019         "ldr	x9, [%[b], 48]\n\t"
7020         "adcs	x4, x4, x8\n\t"
7021         "mul	x7, x19, x9\n\t"
7022         "adc	x5, x5, xzr\n\t"
7023         "umulh	x8, x19, x9\n\t"
7024         "adds	x6, x6, x7\n\t"
7025         "#  A[9] * B[5]\n\t"
7026         "ldr	x9, [%[b], 40]\n\t"
7027         "adcs	x4, x4, x8\n\t"
7028         "mul	x7, x20, x9\n\t"
7029         "adc	x5, x5, xzr\n\t"
7030         "umulh	x8, x20, x9\n\t"
7031         "adds	x6, x6, x7\n\t"
7032         "#  A[10] * B[4]\n\t"
7033         "ldr	x9, [%[b], 32]\n\t"
7034         "adcs	x4, x4, x8\n\t"
7035         "mul	x7, x21, x9\n\t"
7036         "adc	x5, x5, xzr\n\t"
7037         "umulh	x8, x21, x9\n\t"
7038         "adds	x6, x6, x7\n\t"
7039         "#  A[11] * B[3]\n\t"
7040         "ldr	x9, [%[b], 24]\n\t"
7041         "adcs	x4, x4, x8\n\t"
7042         "mul	x7, x22, x9\n\t"
7043         "adc	x5, x5, xzr\n\t"
7044         "umulh	x8, x22, x9\n\t"
7045         "adds	x6, x6, x7\n\t"
7046         "adcs	x4, x4, x8\n\t"
7047         "str	x6, [%[r], 112]\n\t"
7048         "adc	x5, x5, xzr\n\t"
7049         "#  A[4] * B[11]\n\t"
7050         "ldr	x9, [%[b], 88]\n\t"
7051         "mul	x7, x14, x9\n\t"
7052         "umulh	x8, x14, x9\n\t"
7053         "adds	x4, x4, x7\n\t"
7054         "#  A[5] * B[10]\n\t"
7055         "ldr	x9, [%[b], 80]\n\t"
7056         "adcs	x5, x5, x8\n\t"
7057         "mul	x7, x15, x9\n\t"
7058         "adc	x6, xzr, xzr\n\t"
7059         "umulh	x8, x15, x9\n\t"
7060         "adds	x4, x4, x7\n\t"
7061         "#  A[6] * B[9]\n\t"
7062         "ldr	x9, [%[b], 72]\n\t"
7063         "adcs	x5, x5, x8\n\t"
7064         "mul	x7, x16, x9\n\t"
7065         "adc	x6, x6, xzr\n\t"
7066         "umulh	x8, x16, x9\n\t"
7067         "adds	x4, x4, x7\n\t"
7068         "#  A[7] * B[8]\n\t"
7069         "ldr	x9, [%[b], 64]\n\t"
7070         "adcs	x5, x5, x8\n\t"
7071         "mul	x7, x17, x9\n\t"
7072         "adc	x6, x6, xzr\n\t"
7073         "umulh	x8, x17, x9\n\t"
7074         "adds	x4, x4, x7\n\t"
7075         "#  A[8] * B[7]\n\t"
7076         "ldr	x9, [%[b], 56]\n\t"
7077         "adcs	x5, x5, x8\n\t"
7078         "mul	x7, x19, x9\n\t"
7079         "adc	x6, x6, xzr\n\t"
7080         "umulh	x8, x19, x9\n\t"
7081         "adds	x4, x4, x7\n\t"
7082         "#  A[9] * B[6]\n\t"
7083         "ldr	x9, [%[b], 48]\n\t"
7084         "adcs	x5, x5, x8\n\t"
7085         "mul	x7, x20, x9\n\t"
7086         "adc	x6, x6, xzr\n\t"
7087         "umulh	x8, x20, x9\n\t"
7088         "adds	x4, x4, x7\n\t"
7089         "#  A[10] * B[5]\n\t"
7090         "ldr	x9, [%[b], 40]\n\t"
7091         "adcs	x5, x5, x8\n\t"
7092         "mul	x7, x21, x9\n\t"
7093         "adc	x6, x6, xzr\n\t"
7094         "umulh	x8, x21, x9\n\t"
7095         "adds	x4, x4, x7\n\t"
7096         "#  A[11] * B[4]\n\t"
7097         "ldr	x9, [%[b], 32]\n\t"
7098         "adcs	x5, x5, x8\n\t"
7099         "mul	x7, x22, x9\n\t"
7100         "adc	x6, x6, xzr\n\t"
7101         "umulh	x8, x22, x9\n\t"
7102         "adds	x4, x4, x7\n\t"
7103         "adcs	x5, x5, x8\n\t"
7104         "str	x4, [%[r], 120]\n\t"
7105         "adc	x6, x6, xzr\n\t"
7106         "#  A[5] * B[11]\n\t"
7107         "ldr	x9, [%[b], 88]\n\t"
7108         "mul	x7, x15, x9\n\t"
7109         "umulh	x8, x15, x9\n\t"
7110         "adds	x5, x5, x7\n\t"
7111         "#  A[6] * B[10]\n\t"
7112         "ldr	x9, [%[b], 80]\n\t"
7113         "adcs	x6, x6, x8\n\t"
7114         "mul	x7, x16, x9\n\t"
7115         "adc	x4, xzr, xzr\n\t"
7116         "umulh	x8, x16, x9\n\t"
7117         "adds	x5, x5, x7\n\t"
7118         "#  A[7] * B[9]\n\t"
7119         "ldr	x9, [%[b], 72]\n\t"
7120         "adcs	x6, x6, x8\n\t"
7121         "mul	x7, x17, x9\n\t"
7122         "adc	x4, x4, xzr\n\t"
7123         "umulh	x8, x17, x9\n\t"
7124         "adds	x5, x5, x7\n\t"
7125         "#  A[8] * B[8]\n\t"
7126         "ldr	x9, [%[b], 64]\n\t"
7127         "adcs	x6, x6, x8\n\t"
7128         "mul	x7, x19, x9\n\t"
7129         "adc	x4, x4, xzr\n\t"
7130         "umulh	x8, x19, x9\n\t"
7131         "adds	x5, x5, x7\n\t"
7132         "#  A[9] * B[7]\n\t"
7133         "ldr	x9, [%[b], 56]\n\t"
7134         "adcs	x6, x6, x8\n\t"
7135         "mul	x7, x20, x9\n\t"
7136         "adc	x4, x4, xzr\n\t"
7137         "umulh	x8, x20, x9\n\t"
7138         "adds	x5, x5, x7\n\t"
7139         "#  A[10] * B[6]\n\t"
7140         "ldr	x9, [%[b], 48]\n\t"
7141         "adcs	x6, x6, x8\n\t"
7142         "mul	x7, x21, x9\n\t"
7143         "adc	x4, x4, xzr\n\t"
7144         "umulh	x8, x21, x9\n\t"
7145         "adds	x5, x5, x7\n\t"
7146         "#  A[11] * B[5]\n\t"
7147         "ldr	x9, [%[b], 40]\n\t"
7148         "adcs	x6, x6, x8\n\t"
7149         "mul	x7, x22, x9\n\t"
7150         "adc	x4, x4, xzr\n\t"
7151         "umulh	x8, x22, x9\n\t"
7152         "adds	x5, x5, x7\n\t"
7153         "adcs	x6, x6, x8\n\t"
7154         "str	x5, [%[r], 128]\n\t"
7155         "adc	x4, x4, xzr\n\t"
7156         "#  A[6] * B[11]\n\t"
7157         "ldr	x9, [%[b], 88]\n\t"
7158         "mul	x7, x16, x9\n\t"
7159         "umulh	x8, x16, x9\n\t"
7160         "adds	x6, x6, x7\n\t"
7161         "#  A[7] * B[10]\n\t"
7162         "ldr	x9, [%[b], 80]\n\t"
7163         "adcs	x4, x4, x8\n\t"
7164         "mul	x7, x17, x9\n\t"
7165         "adc	x5, xzr, xzr\n\t"
7166         "umulh	x8, x17, x9\n\t"
7167         "adds	x6, x6, x7\n\t"
7168         "#  A[8] * B[9]\n\t"
7169         "ldr	x9, [%[b], 72]\n\t"
7170         "adcs	x4, x4, x8\n\t"
7171         "mul	x7, x19, x9\n\t"
7172         "adc	x5, x5, xzr\n\t"
7173         "umulh	x8, x19, x9\n\t"
7174         "adds	x6, x6, x7\n\t"
7175         "#  A[9] * B[8]\n\t"
7176         "ldr	x9, [%[b], 64]\n\t"
7177         "adcs	x4, x4, x8\n\t"
7178         "mul	x7, x20, x9\n\t"
7179         "adc	x5, x5, xzr\n\t"
7180         "umulh	x8, x20, x9\n\t"
7181         "adds	x6, x6, x7\n\t"
7182         "#  A[10] * B[7]\n\t"
7183         "ldr	x9, [%[b], 56]\n\t"
7184         "adcs	x4, x4, x8\n\t"
7185         "mul	x7, x21, x9\n\t"
7186         "adc	x5, x5, xzr\n\t"
7187         "umulh	x8, x21, x9\n\t"
7188         "adds	x6, x6, x7\n\t"
7189         "#  A[11] * B[6]\n\t"
7190         "ldr	x9, [%[b], 48]\n\t"
7191         "adcs	x4, x4, x8\n\t"
7192         "mul	x7, x22, x9\n\t"
7193         "adc	x5, x5, xzr\n\t"
7194         "umulh	x8, x22, x9\n\t"
7195         "adds	x6, x6, x7\n\t"
7196         "adcs	x4, x4, x8\n\t"
7197         "str	x6, [%[r], 136]\n\t"
7198         "adc	x5, x5, xzr\n\t"
7199         "#  A[7] * B[11]\n\t"
7200         "ldr	x9, [%[b], 88]\n\t"
7201         "mul	x7, x17, x9\n\t"
7202         "umulh	x8, x17, x9\n\t"
7203         "adds	x4, x4, x7\n\t"
7204         "#  A[8] * B[10]\n\t"
7205         "ldr	x9, [%[b], 80]\n\t"
7206         "adcs	x5, x5, x8\n\t"
7207         "mul	x7, x19, x9\n\t"
7208         "adc	x6, xzr, xzr\n\t"
7209         "umulh	x8, x19, x9\n\t"
7210         "adds	x4, x4, x7\n\t"
7211         "#  A[9] * B[9]\n\t"
7212         "ldr	x9, [%[b], 72]\n\t"
7213         "adcs	x5, x5, x8\n\t"
7214         "mul	x7, x20, x9\n\t"
7215         "adc	x6, x6, xzr\n\t"
7216         "umulh	x8, x20, x9\n\t"
7217         "adds	x4, x4, x7\n\t"
7218         "#  A[10] * B[8]\n\t"
7219         "ldr	x9, [%[b], 64]\n\t"
7220         "adcs	x5, x5, x8\n\t"
7221         "mul	x7, x21, x9\n\t"
7222         "adc	x6, x6, xzr\n\t"
7223         "umulh	x8, x21, x9\n\t"
7224         "adds	x4, x4, x7\n\t"
7225         "#  A[11] * B[7]\n\t"
7226         "ldr	x9, [%[b], 56]\n\t"
7227         "adcs	x5, x5, x8\n\t"
7228         "mul	x7, x22, x9\n\t"
7229         "adc	x6, x6, xzr\n\t"
7230         "umulh	x8, x22, x9\n\t"
7231         "adds	x4, x4, x7\n\t"
7232         "adcs	x5, x5, x8\n\t"
7233         "str	x4, [%[r], 144]\n\t"
7234         "adc	x6, x6, xzr\n\t"
7235         "#  A[8] * B[11]\n\t"
7236         "ldr	x9, [%[b], 88]\n\t"
7237         "mul	x7, x19, x9\n\t"
7238         "umulh	x8, x19, x9\n\t"
7239         "adds	x5, x5, x7\n\t"
7240         "#  A[9] * B[10]\n\t"
7241         "ldr	x9, [%[b], 80]\n\t"
7242         "adcs	x6, x6, x8\n\t"
7243         "mul	x7, x20, x9\n\t"
7244         "adc	x4, xzr, xzr\n\t"
7245         "umulh	x8, x20, x9\n\t"
7246         "adds	x5, x5, x7\n\t"
7247         "#  A[10] * B[9]\n\t"
7248         "ldr	x9, [%[b], 72]\n\t"
7249         "adcs	x6, x6, x8\n\t"
7250         "mul	x7, x21, x9\n\t"
7251         "adc	x4, x4, xzr\n\t"
7252         "umulh	x8, x21, x9\n\t"
7253         "adds	x5, x5, x7\n\t"
7254         "#  A[11] * B[8]\n\t"
7255         "ldr	x9, [%[b], 64]\n\t"
7256         "adcs	x6, x6, x8\n\t"
7257         "mul	x7, x22, x9\n\t"
7258         "adc	x4, x4, xzr\n\t"
7259         "umulh	x8, x22, x9\n\t"
7260         "adds	x5, x5, x7\n\t"
7261         "adcs	x6, x6, x8\n\t"
7262         "str	x5, [%[r], 152]\n\t"
7263         "adc	x4, x4, xzr\n\t"
7264         "#  A[9] * B[11]\n\t"
7265         "ldr	x9, [%[b], 88]\n\t"
7266         "mul	x7, x20, x9\n\t"
7267         "umulh	x8, x20, x9\n\t"
7268         "adds	x6, x6, x7\n\t"
7269         "#  A[10] * B[10]\n\t"
7270         "ldr	x9, [%[b], 80]\n\t"
7271         "adcs	x4, x4, x8\n\t"
7272         "mul	x7, x21, x9\n\t"
7273         "adc	x5, xzr, xzr\n\t"
7274         "umulh	x8, x21, x9\n\t"
7275         "adds	x6, x6, x7\n\t"
7276         "#  A[11] * B[9]\n\t"
7277         "ldr	x9, [%[b], 72]\n\t"
7278         "adcs	x4, x4, x8\n\t"
7279         "mul	x7, x22, x9\n\t"
7280         "adc	x5, x5, xzr\n\t"
7281         "umulh	x8, x22, x9\n\t"
7282         "adds	x6, x6, x7\n\t"
7283         "adcs	x4, x4, x8\n\t"
7284         "str	x6, [%[r], 160]\n\t"
7285         "adc	x5, x5, xzr\n\t"
7286         "#  A[10] * B[11]\n\t"
7287         "ldr	x9, [%[b], 88]\n\t"
7288         "mul	x7, x21, x9\n\t"
7289         "umulh	x8, x21, x9\n\t"
7290         "adds	x4, x4, x7\n\t"
7291         "#  A[11] * B[10]\n\t"
7292         "ldr	x9, [%[b], 80]\n\t"
7293         "adcs	x5, x5, x8\n\t"
7294         "mul	x7, x22, x9\n\t"
7295         "adc	x6, xzr, xzr\n\t"
7296         "umulh	x8, x22, x9\n\t"
7297         "adds	x4, x4, x7\n\t"
7298         "adcs	x5, x5, x8\n\t"
7299         "str	x4, [%[r], 168]\n\t"
7300         "adc	x6, x6, xzr\n\t"
7301         "#  A[11] * B[11]\n\t"
7302         "ldr	x9, [%[b], 88]\n\t"
7303         "mul	x7, x22, x9\n\t"
7304         "umulh	x8, x22, x9\n\t"
7305         "adds	x5, x5, x7\n\t"
7306         "adc	x6, x6, x8\n\t"
7307         "stp	x5, x6, [%[r], 176]\n\t"
7308         "ldp	x10, x11, [%[tmp], 0]\n\t"
7309         "ldp	x12, x13, [%[tmp], 16]\n\t"
7310         "ldp	x14, x15, [%[tmp], 32]\n\t"
7311         "ldp	x16, x17, [%[tmp], 48]\n\t"
7312         "ldp	x19, x20, [%[tmp], 64]\n\t"
7313         "ldp	x21, x22, [%[tmp], 80]\n\t"
7314         "stp	x10, x11, [%[r], 0]\n\t"
7315         "stp	x12, x13, [%[r], 16]\n\t"
7316         "stp	x14, x15, [%[r], 32]\n\t"
7317         "stp	x16, x17, [%[r], 48]\n\t"
7318         "stp	x19, x20, [%[r], 64]\n\t"
7319         "stp	x21, x22, [%[r], 80]\n\t"
7320         :
7321         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp)
7322         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22"
7323     );
7324 }
7325 
7326 /* Square a and put result in r. (r = a * a)
7327  *
7328  * r  A single precision integer.
7329  * a  A single precision integer.
7330  */
sp_3072_sqr_12(sp_digit * r,const sp_digit * a)7331 static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
7332 {
7333     __asm__ __volatile__ (
7334         "ldp	x10, x11, [%[a], 0]\n\t"
7335         "ldp	x12, x13, [%[a], 16]\n\t"
7336         "ldp	x14, x15, [%[a], 32]\n\t"
7337         "ldp	x16, x17, [%[a], 48]\n\t"
7338         "ldp	x19, x20, [%[a], 64]\n\t"
7339         "ldp	x21, x22, [%[a], 80]\n\t"
7340         "#  A[0] * A[0]\n\t"
7341         "mul	x2, x10, x10\n\t"
7342         "umulh	x3, x10, x10\n\t"
7343         "str	x2, [%[r]]\n\t"
7344         "mov	x4, 0\n\t"
7345         "#  A[0] * A[1]\n\t"
7346         "mul	x8, x10, x11\n\t"
7347         "umulh	x9, x10, x11\n\t"
7348         "adds	x3, x3, x8\n\t"
7349         "adcs	x4, x4, x9\n\t"
7350         "adc	x2, xzr, xzr\n\t"
7351         "adds	x3, x3, x8\n\t"
7352         "str	x3, [%[r], 8]\n\t"
7353         "#  A[0] * A[2]\n\t"
7354         "mul	x8, x10, x12\n\t"
7355         "adcs	x4, x4, x9\n\t"
7356         "umulh	x9, x10, x12\n\t"
7357         "adc	x2, x2, xzr\n\t"
7358         "adds	x4, x4, x8\n\t"
7359         "adcs	x2, x2, x9\n\t"
7360         "adc	x3, xzr, xzr\n\t"
7361         "adds	x4, x4, x8\n\t"
7362         "#  A[1] * A[1]\n\t"
7363         "mul	x8, x11, x11\n\t"
7364         "adcs	x2, x2, x9\n\t"
7365         "umulh	x9, x11, x11\n\t"
7366         "adc	x3, x3, xzr\n\t"
7367         "adds	x4, x4, x8\n\t"
7368         "str	x4, [%[r], 16]\n\t"
7369         "#  A[0] * A[3]\n\t"
7370         "mul	x8, x10, x13\n\t"
7371         "adcs	x2, x2, x9\n\t"
7372         "umulh	x9, x10, x13\n\t"
7373         "adc	x3, x3, xzr\n\t"
7374         "adds	x2, x2, x8\n\t"
7375         "adcs	x3, x3, x9\n\t"
7376         "adc	x4, xzr, xzr\n\t"
7377         "adds	x2, x2, x8\n\t"
7378         "#  A[1] * A[2]\n\t"
7379         "mul	x8, x11, x12\n\t"
7380         "adcs	x3, x3, x9\n\t"
7381         "umulh	x9, x11, x12\n\t"
7382         "adc	x4, x4, xzr\n\t"
7383         "adds	x2, x2, x8\n\t"
7384         "adcs	x3, x3, x9\n\t"
7385         "adc	x4, x4, xzr\n\t"
7386         "adds	x2, x2, x8\n\t"
7387         "str	x2, [%[r], 24]\n\t"
7388         "#  A[0] * A[4]\n\t"
7389         "mul	x8, x10, x14\n\t"
7390         "adcs	x3, x3, x9\n\t"
7391         "umulh	x9, x10, x14\n\t"
7392         "adc	x4, x4, xzr\n\t"
7393         "adds	x3, x3, x8\n\t"
7394         "adcs	x4, x4, x9\n\t"
7395         "adc	x2, xzr, xzr\n\t"
7396         "adds	x3, x3, x8\n\t"
7397         "#  A[1] * A[3]\n\t"
7398         "mul	x8, x11, x13\n\t"
7399         "adcs	x4, x4, x9\n\t"
7400         "umulh	x9, x11, x13\n\t"
7401         "adc	x2, x2, xzr\n\t"
7402         "adds	x3, x3, x8\n\t"
7403         "adcs	x4, x4, x9\n\t"
7404         "adc	x2, x2, xzr\n\t"
7405         "adds	x3, x3, x8\n\t"
7406         "#  A[2] * A[2]\n\t"
7407         "mul	x8, x12, x12\n\t"
7408         "adcs	x4, x4, x9\n\t"
7409         "umulh	x9, x12, x12\n\t"
7410         "adc	x2, x2, xzr\n\t"
7411         "adds	x3, x3, x8\n\t"
7412         "str	x3, [%[r], 32]\n\t"
7413         "#  A[0] * A[5]\n\t"
7414         "mul	x5, x10, x15\n\t"
7415         "adcs	x4, x4, x9\n\t"
7416         "umulh	x6, x10, x15\n\t"
7417         "adc	x2, x2, xzr\n\t"
7418         "mov	x3, 0\n\t"
7419         "mov	x7, 0\n\t"
7420         "#  A[1] * A[4]\n\t"
7421         "mul	x8, x11, x14\n\t"
7422         "umulh	x9, x11, x14\n\t"
7423         "adds	x5, x5, x8\n\t"
7424         "#  A[2] * A[3]\n\t"
7425         "mul	x8, x12, x13\n\t"
7426         "adcs	x6, x6, x9\n\t"
7427         "umulh	x9, x12, x13\n\t"
7428         "adc	x7, x7, xzr\n\t"
7429         "adds	x5, x5, x8\n\t"
7430         "adcs	x6, x6, x9\n\t"
7431         "adc	x7, x7, xzr\n\t"
7432         "adds	x5, x5, x5\n\t"
7433         "adcs	x6, x6, x6\n\t"
7434         "adc	x7, x7, x7\n\t"
7435         "adds	x4, x4, x5\n\t"
7436         "adcs	x2, x2, x6\n\t"
7437         "adc	x3, x3, x7\n\t"
7438         "str	x4, [%[r], 40]\n\t"
7439         "#  A[0] * A[6]\n\t"
7440         "mul	x5, x10, x16\n\t"
7441         "umulh	x6, x10, x16\n\t"
7442         "mov	x4, 0\n\t"
7443         "mov	x7, 0\n\t"
7444         "#  A[1] * A[5]\n\t"
7445         "mul	x8, x11, x15\n\t"
7446         "umulh	x9, x11, x15\n\t"
7447         "adds	x5, x5, x8\n\t"
7448         "#  A[2] * A[4]\n\t"
7449         "mul	x8, x12, x14\n\t"
7450         "adcs	x6, x6, x9\n\t"
7451         "umulh	x9, x12, x14\n\t"
7452         "adc	x7, x7, xzr\n\t"
7453         "adds	x5, x5, x8\n\t"
7454         "#  A[3] * A[3]\n\t"
7455         "mul	x8, x13, x13\n\t"
7456         "adcs	x6, x6, x9\n\t"
7457         "umulh	x9, x13, x13\n\t"
7458         "adc	x7, x7, xzr\n\t"
7459         "adds	x5, x5, x5\n\t"
7460         "adcs	x6, x6, x6\n\t"
7461         "adc	x7, x7, x7\n\t"
7462         "adds	x5, x5, x8\n\t"
7463         "adcs	x6, x6, x9\n\t"
7464         "adc	x7, x7, xzr\n\t"
7465         "adds	x2, x2, x5\n\t"
7466         "adcs	x3, x3, x6\n\t"
7467         "adc	x4, x4, x7\n\t"
7468         "str	x2, [%[r], 48]\n\t"
7469         "#  A[0] * A[7]\n\t"
7470         "mul	x5, x10, x17\n\t"
7471         "umulh	x6, x10, x17\n\t"
7472         "mov	x2, 0\n\t"
7473         "mov	x7, 0\n\t"
7474         "#  A[1] * A[6]\n\t"
7475         "mul	x8, x11, x16\n\t"
7476         "umulh	x9, x11, x16\n\t"
7477         "adds	x5, x5, x8\n\t"
7478         "#  A[2] * A[5]\n\t"
7479         "mul	x8, x12, x15\n\t"
7480         "adcs	x6, x6, x9\n\t"
7481         "umulh	x9, x12, x15\n\t"
7482         "adc	x7, x7, xzr\n\t"
7483         "adds	x5, x5, x8\n\t"
7484         "#  A[3] * A[4]\n\t"
7485         "mul	x8, x13, x14\n\t"
7486         "adcs	x6, x6, x9\n\t"
7487         "umulh	x9, x13, x14\n\t"
7488         "adc	x7, x7, xzr\n\t"
7489         "adds	x5, x5, x8\n\t"
7490         "adcs	x6, x6, x9\n\t"
7491         "adc	x7, x7, xzr\n\t"
7492         "adds	x5, x5, x5\n\t"
7493         "adcs	x6, x6, x6\n\t"
7494         "adc	x7, x7, x7\n\t"
7495         "adds	x3, x3, x5\n\t"
7496         "adcs	x4, x4, x6\n\t"
7497         "adc	x2, x2, x7\n\t"
7498         "str	x3, [%[r], 56]\n\t"
7499         "#  A[0] * A[8]\n\t"
7500         "mul	x5, x10, x19\n\t"
7501         "umulh	x6, x10, x19\n\t"
7502         "mov	x3, 0\n\t"
7503         "mov	x7, 0\n\t"
7504         "#  A[1] * A[7]\n\t"
7505         "mul	x8, x11, x17\n\t"
7506         "umulh	x9, x11, x17\n\t"
7507         "adds	x5, x5, x8\n\t"
7508         "#  A[2] * A[6]\n\t"
7509         "mul	x8, x12, x16\n\t"
7510         "adcs	x6, x6, x9\n\t"
7511         "umulh	x9, x12, x16\n\t"
7512         "adc	x7, x7, xzr\n\t"
7513         "adds	x5, x5, x8\n\t"
7514         "#  A[3] * A[5]\n\t"
7515         "mul	x8, x13, x15\n\t"
7516         "adcs	x6, x6, x9\n\t"
7517         "umulh	x9, x13, x15\n\t"
7518         "adc	x7, x7, xzr\n\t"
7519         "adds	x5, x5, x8\n\t"
7520         "#  A[4] * A[4]\n\t"
7521         "mul	x8, x14, x14\n\t"
7522         "adcs	x6, x6, x9\n\t"
7523         "umulh	x9, x14, x14\n\t"
7524         "adc	x7, x7, xzr\n\t"
7525         "adds	x5, x5, x5\n\t"
7526         "adcs	x6, x6, x6\n\t"
7527         "adc	x7, x7, x7\n\t"
7528         "adds	x5, x5, x8\n\t"
7529         "adcs	x6, x6, x9\n\t"
7530         "adc	x7, x7, xzr\n\t"
7531         "adds	x4, x4, x5\n\t"
7532         "adcs	x2, x2, x6\n\t"
7533         "adc	x3, x3, x7\n\t"
7534         "str	x4, [%[r], 64]\n\t"
7535         "#  A[0] * A[9]\n\t"
7536         "mul	x5, x10, x20\n\t"
7537         "umulh	x6, x10, x20\n\t"
7538         "mov	x4, 0\n\t"
7539         "mov	x7, 0\n\t"
7540         "#  A[1] * A[8]\n\t"
7541         "mul	x8, x11, x19\n\t"
7542         "umulh	x9, x11, x19\n\t"
7543         "adds	x5, x5, x8\n\t"
7544         "#  A[2] * A[7]\n\t"
7545         "mul	x8, x12, x17\n\t"
7546         "adcs	x6, x6, x9\n\t"
7547         "umulh	x9, x12, x17\n\t"
7548         "adc	x7, x7, xzr\n\t"
7549         "adds	x5, x5, x8\n\t"
7550         "#  A[3] * A[6]\n\t"
7551         "mul	x8, x13, x16\n\t"
7552         "adcs	x6, x6, x9\n\t"
7553         "umulh	x9, x13, x16\n\t"
7554         "adc	x7, x7, xzr\n\t"
7555         "adds	x5, x5, x8\n\t"
7556         "#  A[4] * A[5]\n\t"
7557         "mul	x8, x14, x15\n\t"
7558         "adcs	x6, x6, x9\n\t"
7559         "umulh	x9, x14, x15\n\t"
7560         "adc	x7, x7, xzr\n\t"
7561         "adds	x5, x5, x8\n\t"
7562         "adcs	x6, x6, x9\n\t"
7563         "adc	x7, x7, xzr\n\t"
7564         "adds	x5, x5, x5\n\t"
7565         "adcs	x6, x6, x6\n\t"
7566         "adc	x7, x7, x7\n\t"
7567         "adds	x2, x2, x5\n\t"
7568         "adcs	x3, x3, x6\n\t"
7569         "adc	x4, x4, x7\n\t"
7570         "str	x2, [%[r], 72]\n\t"
7571         "#  A[0] * A[10]\n\t"
7572         "mul	x5, x10, x21\n\t"
7573         "umulh	x6, x10, x21\n\t"
7574         "mov	x2, 0\n\t"
7575         "mov	x7, 0\n\t"
7576         "#  A[1] * A[9]\n\t"
7577         "mul	x8, x11, x20\n\t"
7578         "umulh	x9, x11, x20\n\t"
7579         "adds	x5, x5, x8\n\t"
7580         "#  A[2] * A[8]\n\t"
7581         "mul	x8, x12, x19\n\t"
7582         "adcs	x6, x6, x9\n\t"
7583         "umulh	x9, x12, x19\n\t"
7584         "adc	x7, x7, xzr\n\t"
7585         "adds	x5, x5, x8\n\t"
7586         "#  A[3] * A[7]\n\t"
7587         "mul	x8, x13, x17\n\t"
7588         "adcs	x6, x6, x9\n\t"
7589         "umulh	x9, x13, x17\n\t"
7590         "adc	x7, x7, xzr\n\t"
7591         "adds	x5, x5, x8\n\t"
7592         "#  A[4] * A[6]\n\t"
7593         "mul	x8, x14, x16\n\t"
7594         "adcs	x6, x6, x9\n\t"
7595         "umulh	x9, x14, x16\n\t"
7596         "adc	x7, x7, xzr\n\t"
7597         "adds	x5, x5, x8\n\t"
7598         "#  A[5] * A[5]\n\t"
7599         "mul	x8, x15, x15\n\t"
7600         "adcs	x6, x6, x9\n\t"
7601         "umulh	x9, x15, x15\n\t"
7602         "adc	x7, x7, xzr\n\t"
7603         "adds	x5, x5, x5\n\t"
7604         "adcs	x6, x6, x6\n\t"
7605         "adc	x7, x7, x7\n\t"
7606         "adds	x5, x5, x8\n\t"
7607         "adcs	x6, x6, x9\n\t"
7608         "adc	x7, x7, xzr\n\t"
7609         "adds	x3, x3, x5\n\t"
7610         "adcs	x4, x4, x6\n\t"
7611         "adc	x2, x2, x7\n\t"
7612         "str	x3, [%[r], 80]\n\t"
7613         "#  A[0] * A[11]\n\t"
7614         "mul	x5, x10, x22\n\t"
7615         "umulh	x6, x10, x22\n\t"
7616         "mov	x3, 0\n\t"
7617         "mov	x7, 0\n\t"
7618         "#  A[1] * A[10]\n\t"
7619         "mul	x8, x11, x21\n\t"
7620         "umulh	x9, x11, x21\n\t"
7621         "adds	x5, x5, x8\n\t"
7622         "#  A[2] * A[9]\n\t"
7623         "mul	x8, x12, x20\n\t"
7624         "adcs	x6, x6, x9\n\t"
7625         "umulh	x9, x12, x20\n\t"
7626         "adc	x7, x7, xzr\n\t"
7627         "adds	x5, x5, x8\n\t"
7628         "#  A[3] * A[8]\n\t"
7629         "mul	x8, x13, x19\n\t"
7630         "adcs	x6, x6, x9\n\t"
7631         "umulh	x9, x13, x19\n\t"
7632         "adc	x7, x7, xzr\n\t"
7633         "adds	x5, x5, x8\n\t"
7634         "#  A[4] * A[7]\n\t"
7635         "mul	x8, x14, x17\n\t"
7636         "adcs	x6, x6, x9\n\t"
7637         "umulh	x9, x14, x17\n\t"
7638         "adc	x7, x7, xzr\n\t"
7639         "adds	x5, x5, x8\n\t"
7640         "#  A[5] * A[6]\n\t"
7641         "mul	x8, x15, x16\n\t"
7642         "adcs	x6, x6, x9\n\t"
7643         "umulh	x9, x15, x16\n\t"
7644         "adc	x7, x7, xzr\n\t"
7645         "adds	x5, x5, x8\n\t"
7646         "adcs	x6, x6, x9\n\t"
7647         "adc	x7, x7, xzr\n\t"
7648         "adds	x5, x5, x5\n\t"
7649         "adcs	x6, x6, x6\n\t"
7650         "adc	x7, x7, x7\n\t"
7651         "adds	x4, x4, x5\n\t"
7652         "adcs	x2, x2, x6\n\t"
7653         "adc	x3, x3, x7\n\t"
7654         "str	x4, [%[r], 88]\n\t"
7655         "#  A[1] * A[11]\n\t"
7656         "mul	x5, x11, x22\n\t"
7657         "umulh	x6, x11, x22\n\t"
7658         "mov	x4, 0\n\t"
7659         "mov	x7, 0\n\t"
7660         "#  A[2] * A[10]\n\t"
7661         "mul	x8, x12, x21\n\t"
7662         "umulh	x9, x12, x21\n\t"
7663         "adds	x5, x5, x8\n\t"
7664         "#  A[3] * A[9]\n\t"
7665         "mul	x8, x13, x20\n\t"
7666         "adcs	x6, x6, x9\n\t"
7667         "umulh	x9, x13, x20\n\t"
7668         "adc	x7, x7, xzr\n\t"
7669         "adds	x5, x5, x8\n\t"
7670         "#  A[4] * A[8]\n\t"
7671         "mul	x8, x14, x19\n\t"
7672         "adcs	x6, x6, x9\n\t"
7673         "umulh	x9, x14, x19\n\t"
7674         "adc	x7, x7, xzr\n\t"
7675         "adds	x5, x5, x8\n\t"
7676         "#  A[5] * A[7]\n\t"
7677         "mul	x8, x15, x17\n\t"
7678         "adcs	x6, x6, x9\n\t"
7679         "umulh	x9, x15, x17\n\t"
7680         "adc	x7, x7, xzr\n\t"
7681         "adds	x5, x5, x8\n\t"
7682         "#  A[6] * A[6]\n\t"
7683         "mul	x8, x16, x16\n\t"
7684         "adcs	x6, x6, x9\n\t"
7685         "umulh	x9, x16, x16\n\t"
7686         "adc	x7, x7, xzr\n\t"
7687         "adds	x5, x5, x5\n\t"
7688         "adcs	x6, x6, x6\n\t"
7689         "adc	x7, x7, x7\n\t"
7690         "adds	x5, x5, x8\n\t"
7691         "adcs	x6, x6, x9\n\t"
7692         "adc	x7, x7, xzr\n\t"
7693         "adds	x2, x2, x5\n\t"
7694         "adcs	x3, x3, x6\n\t"
7695         "adc	x4, x4, x7\n\t"
7696         "str	x2, [%[r], 96]\n\t"
7697         "#  A[2] * A[11]\n\t"
7698         "mul	x5, x12, x22\n\t"
7699         "umulh	x6, x12, x22\n\t"
7700         "mov	x2, 0\n\t"
7701         "mov	x7, 0\n\t"
7702         "#  A[3] * A[10]\n\t"
7703         "mul	x8, x13, x21\n\t"
7704         "umulh	x9, x13, x21\n\t"
7705         "adds	x5, x5, x8\n\t"
7706         "#  A[4] * A[9]\n\t"
7707         "mul	x8, x14, x20\n\t"
7708         "adcs	x6, x6, x9\n\t"
7709         "umulh	x9, x14, x20\n\t"
7710         "adc	x7, x7, xzr\n\t"
7711         "adds	x5, x5, x8\n\t"
7712         "#  A[5] * A[8]\n\t"
7713         "mul	x8, x15, x19\n\t"
7714         "adcs	x6, x6, x9\n\t"
7715         "umulh	x9, x15, x19\n\t"
7716         "adc	x7, x7, xzr\n\t"
7717         "adds	x5, x5, x8\n\t"
7718         "#  A[6] * A[7]\n\t"
7719         "mul	x8, x16, x17\n\t"
7720         "adcs	x6, x6, x9\n\t"
7721         "umulh	x9, x16, x17\n\t"
7722         "adc	x7, x7, xzr\n\t"
7723         "adds	x5, x5, x8\n\t"
7724         "adcs	x6, x6, x9\n\t"
7725         "adc	x7, x7, xzr\n\t"
7726         "adds	x5, x5, x5\n\t"
7727         "adcs	x6, x6, x6\n\t"
7728         "adc	x7, x7, x7\n\t"
7729         "adds	x3, x3, x5\n\t"
7730         "adcs	x4, x4, x6\n\t"
7731         "adc	x2, x2, x7\n\t"
7732         "str	x3, [%[r], 104]\n\t"
7733         "#  A[3] * A[11]\n\t"
7734         "mul	x5, x13, x22\n\t"
7735         "umulh	x6, x13, x22\n\t"
7736         "mov	x3, 0\n\t"
7737         "mov	x7, 0\n\t"
7738         "#  A[4] * A[10]\n\t"
7739         "mul	x8, x14, x21\n\t"
7740         "umulh	x9, x14, x21\n\t"
7741         "adds	x5, x5, x8\n\t"
7742         "#  A[5] * A[9]\n\t"
7743         "mul	x8, x15, x20\n\t"
7744         "adcs	x6, x6, x9\n\t"
7745         "umulh	x9, x15, x20\n\t"
7746         "adc	x7, x7, xzr\n\t"
7747         "adds	x5, x5, x8\n\t"
7748         "#  A[6] * A[8]\n\t"
7749         "mul	x8, x16, x19\n\t"
7750         "adcs	x6, x6, x9\n\t"
7751         "umulh	x9, x16, x19\n\t"
7752         "adc	x7, x7, xzr\n\t"
7753         "adds	x5, x5, x8\n\t"
7754         "#  A[7] * A[7]\n\t"
7755         "mul	x8, x17, x17\n\t"
7756         "adcs	x6, x6, x9\n\t"
7757         "umulh	x9, x17, x17\n\t"
7758         "adc	x7, x7, xzr\n\t"
7759         "adds	x5, x5, x5\n\t"
7760         "adcs	x6, x6, x6\n\t"
7761         "adc	x7, x7, x7\n\t"
7762         "adds	x5, x5, x8\n\t"
7763         "adcs	x6, x6, x9\n\t"
7764         "adc	x7, x7, xzr\n\t"
7765         "adds	x4, x4, x5\n\t"
7766         "adcs	x2, x2, x6\n\t"
7767         "adc	x3, x3, x7\n\t"
7768         "str	x4, [%[r], 112]\n\t"
7769         "#  A[4] * A[11]\n\t"
7770         "mul	x5, x14, x22\n\t"
7771         "umulh	x6, x14, x22\n\t"
7772         "mov	x4, 0\n\t"
7773         "mov	x7, 0\n\t"
7774         "#  A[5] * A[10]\n\t"
7775         "mul	x8, x15, x21\n\t"
7776         "umulh	x9, x15, x21\n\t"
7777         "adds	x5, x5, x8\n\t"
7778         "#  A[6] * A[9]\n\t"
7779         "mul	x8, x16, x20\n\t"
7780         "adcs	x6, x6, x9\n\t"
7781         "umulh	x9, x16, x20\n\t"
7782         "adc	x7, x7, xzr\n\t"
7783         "adds	x5, x5, x8\n\t"
7784         "#  A[7] * A[8]\n\t"
7785         "mul	x8, x17, x19\n\t"
7786         "adcs	x6, x6, x9\n\t"
7787         "umulh	x9, x17, x19\n\t"
7788         "adc	x7, x7, xzr\n\t"
7789         "adds	x5, x5, x8\n\t"
7790         "adcs	x6, x6, x9\n\t"
7791         "adc	x7, x7, xzr\n\t"
7792         "adds	x5, x5, x5\n\t"
7793         "adcs	x6, x6, x6\n\t"
7794         "adc	x7, x7, x7\n\t"
7795         "adds	x2, x2, x5\n\t"
7796         "adcs	x3, x3, x6\n\t"
7797         "adc	x4, x4, x7\n\t"
7798         "str	x2, [%[r], 120]\n\t"
7799         "#  A[5] * A[11]\n\t"
7800         "mul	x5, x15, x22\n\t"
7801         "umulh	x6, x15, x22\n\t"
7802         "mov	x2, 0\n\t"
7803         "mov	x7, 0\n\t"
7804         "#  A[6] * A[10]\n\t"
7805         "mul	x8, x16, x21\n\t"
7806         "umulh	x9, x16, x21\n\t"
7807         "adds	x5, x5, x8\n\t"
7808         "#  A[7] * A[9]\n\t"
7809         "mul	x8, x17, x20\n\t"
7810         "adcs	x6, x6, x9\n\t"
7811         "umulh	x9, x17, x20\n\t"
7812         "adc	x7, x7, xzr\n\t"
7813         "adds	x5, x5, x8\n\t"
7814         "#  A[8] * A[8]\n\t"
7815         "mul	x8, x19, x19\n\t"
7816         "adcs	x6, x6, x9\n\t"
7817         "umulh	x9, x19, x19\n\t"
7818         "adc	x7, x7, xzr\n\t"
7819         "adds	x5, x5, x5\n\t"
7820         "adcs	x6, x6, x6\n\t"
7821         "adc	x7, x7, x7\n\t"
7822         "adds	x5, x5, x8\n\t"
7823         "adcs	x6, x6, x9\n\t"
7824         "adc	x7, x7, xzr\n\t"
7825         "adds	x3, x3, x5\n\t"
7826         "adcs	x4, x4, x6\n\t"
7827         "adc	x2, x2, x7\n\t"
7828         "str	x3, [%[r], 128]\n\t"
7829         "#  A[6] * A[11]\n\t"
7830         "mul	x5, x16, x22\n\t"
7831         "umulh	x6, x16, x22\n\t"
7832         "mov	x3, 0\n\t"
7833         "mov	x7, 0\n\t"
7834         "#  A[7] * A[10]\n\t"
7835         "mul	x8, x17, x21\n\t"
7836         "umulh	x9, x17, x21\n\t"
7837         "adds	x5, x5, x8\n\t"
7838         "#  A[8] * A[9]\n\t"
7839         "mul	x8, x19, x20\n\t"
7840         "adcs	x6, x6, x9\n\t"
7841         "umulh	x9, x19, x20\n\t"
7842         "adc	x7, x7, xzr\n\t"
7843         "adds	x5, x5, x8\n\t"
7844         "adcs	x6, x6, x9\n\t"
7845         "adc	x7, x7, xzr\n\t"
7846         "adds	x5, x5, x5\n\t"
7847         "adcs	x6, x6, x6\n\t"
7848         "adc	x7, x7, x7\n\t"
7849         "adds	x4, x4, x5\n\t"
7850         "adcs	x2, x2, x6\n\t"
7851         "adc	x3, x3, x7\n\t"
7852         "str	x4, [%[r], 136]\n\t"
7853         "#  A[7] * A[11]\n\t"
7854         "mul	x8, x17, x22\n\t"
7855         "umulh	x9, x17, x22\n\t"
7856         "adds	x2, x2, x8\n\t"
7857         "adcs	x3, x3, x9\n\t"
7858         "adc	x4, xzr, xzr\n\t"
7859         "adds	x2, x2, x8\n\t"
7860         "#  A[8] * A[10]\n\t"
7861         "mul	x8, x19, x21\n\t"
7862         "adcs	x3, x3, x9\n\t"
7863         "umulh	x9, x19, x21\n\t"
7864         "adc	x4, x4, xzr\n\t"
7865         "adds	x2, x2, x8\n\t"
7866         "adcs	x3, x3, x9\n\t"
7867         "adc	x4, x4, xzr\n\t"
7868         "adds	x2, x2, x8\n\t"
7869         "#  A[9] * A[9]\n\t"
7870         "mul	x8, x20, x20\n\t"
7871         "adcs	x3, x3, x9\n\t"
7872         "umulh	x9, x20, x20\n\t"
7873         "adc	x4, x4, xzr\n\t"
7874         "adds	x2, x2, x8\n\t"
7875         "str	x2, [%[r], 144]\n\t"
7876         "#  A[8] * A[11]\n\t"
7877         "mul	x8, x19, x22\n\t"
7878         "adcs	x3, x3, x9\n\t"
7879         "umulh	x9, x19, x22\n\t"
7880         "adc	x4, x4, xzr\n\t"
7881         "adds	x3, x3, x8\n\t"
7882         "adcs	x4, x4, x9\n\t"
7883         "adc	x2, xzr, xzr\n\t"
7884         "adds	x3, x3, x8\n\t"
7885         "#  A[9] * A[10]\n\t"
7886         "mul	x8, x20, x21\n\t"
7887         "adcs	x4, x4, x9\n\t"
7888         "umulh	x9, x20, x21\n\t"
7889         "adc	x2, x2, xzr\n\t"
7890         "adds	x3, x3, x8\n\t"
7891         "adcs	x4, x4, x9\n\t"
7892         "adc	x2, x2, xzr\n\t"
7893         "adds	x3, x3, x8\n\t"
7894         "str	x3, [%[r], 152]\n\t"
7895         "#  A[9] * A[11]\n\t"
7896         "mul	x8, x20, x22\n\t"
7897         "adcs	x4, x4, x9\n\t"
7898         "umulh	x9, x20, x22\n\t"
7899         "adc	x2, x2, xzr\n\t"
7900         "adds	x4, x4, x8\n\t"
7901         "adcs	x2, x2, x9\n\t"
7902         "adc	x3, xzr, xzr\n\t"
7903         "adds	x4, x4, x8\n\t"
7904         "#  A[10] * A[10]\n\t"
7905         "mul	x8, x21, x21\n\t"
7906         "adcs	x2, x2, x9\n\t"
7907         "umulh	x9, x21, x21\n\t"
7908         "adc	x3, x3, xzr\n\t"
7909         "adds	x4, x4, x8\n\t"
7910         "str	x4, [%[r], 160]\n\t"
7911         "#  A[10] * A[11]\n\t"
7912         "mul	x8, x21, x22\n\t"
7913         "adcs	x2, x2, x9\n\t"
7914         "umulh	x9, x21, x22\n\t"
7915         "adc	x3, x3, xzr\n\t"
7916         "adds	x2, x2, x8\n\t"
7917         "adcs	x3, x3, x9\n\t"
7918         "adc	x4, xzr, xzr\n\t"
7919         "adds	x2, x2, x8\n\t"
7920         "str	x2, [%[r], 168]\n\t"
7921         "#  A[11] * A[11]\n\t"
7922         "mul	x8, x22, x22\n\t"
7923         "adcs	x3, x3, x9\n\t"
7924         "umulh	x9, x22, x22\n\t"
7925         "adc	x4, x4, xzr\n\t"
7926         "adds	x3, x3, x8\n\t"
7927         "adc	x4, x4, x9\n\t"
7928         "stp	x3, x4, [%[r], 176]\n\t"
7929         :
7930         : [r] "r" (r), [a] "r" (a)
7931         : "memory", "x2", "x3", "x4", "x8", "x9", "x10", "x5", "x6", "x7", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22"
7932     );
7933 }
7934 
7935 /* Add b to a into r. (r = a + b)
7936  *
7937  * r  A single precision integer.
7938  * a  A single precision integer.
7939  * b  A single precision integer.
7940  */
sp_3072_add_12(sp_digit * r,const sp_digit * a,const sp_digit * b)7941 static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a,
7942         const sp_digit* b)
7943 {
7944     __asm__ __volatile__ (
7945         "ldp	x3, x4, [%[a], 0]\n\t"
7946         "ldp	x7, x8, [%[b], 0]\n\t"
7947         "adds	x3, x3, x7\n\t"
7948         "ldp	x5, x6, [%[a], 16]\n\t"
7949         "adcs	x4, x4, x8\n\t"
7950         "ldp	x9, x10, [%[b], 16]\n\t"
7951         "adcs	x5, x5, x9\n\t"
7952         "stp	x3, x4, [%[r], 0]\n\t"
7953         "adcs	x6, x6, x10\n\t"
7954         "stp	x5, x6, [%[r], 16]\n\t"
7955         "ldp	x3, x4, [%[a], 32]\n\t"
7956         "ldp	x7, x8, [%[b], 32]\n\t"
7957         "adcs	x3, x3, x7\n\t"
7958         "ldp	x5, x6, [%[a], 48]\n\t"
7959         "adcs	x4, x4, x8\n\t"
7960         "ldp	x9, x10, [%[b], 48]\n\t"
7961         "adcs	x5, x5, x9\n\t"
7962         "stp	x3, x4, [%[r], 32]\n\t"
7963         "adcs	x6, x6, x10\n\t"
7964         "stp	x5, x6, [%[r], 48]\n\t"
7965         "ldp	x3, x4, [%[a], 64]\n\t"
7966         "ldp	x7, x8, [%[b], 64]\n\t"
7967         "adcs	x3, x3, x7\n\t"
7968         "ldp	x5, x6, [%[a], 80]\n\t"
7969         "adcs	x4, x4, x8\n\t"
7970         "ldp	x9, x10, [%[b], 80]\n\t"
7971         "adcs	x5, x5, x9\n\t"
7972         "stp	x3, x4, [%[r], 64]\n\t"
7973         "adcs	x6, x6, x10\n\t"
7974         "stp	x5, x6, [%[r], 80]\n\t"
7975         "cset	%[r], cs\n\t"
7976         : [r] "+r" (r)
7977         : [a] "r" (a), [b] "r" (b)
7978         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
7979     );
7980 
7981     return (sp_digit)r;
7982 }
7983 
7984 /* Sub b from a into a. (a -= b)
7985  *
7986  * a  A single precision integer and result.
7987  * b  A single precision integer.
7988  */
sp_3072_sub_in_place_24(sp_digit * a,const sp_digit * b)7989 static sp_digit sp_3072_sub_in_place_24(sp_digit* a, const sp_digit* b)
7990 {
7991     __asm__ __volatile__ (
7992         "ldp	x2, x3, [%[a], 0]\n\t"
7993         "ldp	x6, x7, [%[b], 0]\n\t"
7994         "subs	x2, x2, x6\n\t"
7995         "ldp	x4, x5, [%[a], 16]\n\t"
7996         "sbcs	x3, x3, x7\n\t"
7997         "ldp	x8, x9, [%[b], 16]\n\t"
7998         "sbcs	x4, x4, x8\n\t"
7999         "stp	x2, x3, [%[a], 0]\n\t"
8000         "sbcs	x5, x5, x9\n\t"
8001         "stp	x4, x5, [%[a], 16]\n\t"
8002         "ldp	x2, x3, [%[a], 32]\n\t"
8003         "ldp	x6, x7, [%[b], 32]\n\t"
8004         "sbcs	x2, x2, x6\n\t"
8005         "ldp	x4, x5, [%[a], 48]\n\t"
8006         "sbcs	x3, x3, x7\n\t"
8007         "ldp	x8, x9, [%[b], 48]\n\t"
8008         "sbcs	x4, x4, x8\n\t"
8009         "stp	x2, x3, [%[a], 32]\n\t"
8010         "sbcs	x5, x5, x9\n\t"
8011         "stp	x4, x5, [%[a], 48]\n\t"
8012         "ldp	x2, x3, [%[a], 64]\n\t"
8013         "ldp	x6, x7, [%[b], 64]\n\t"
8014         "sbcs	x2, x2, x6\n\t"
8015         "ldp	x4, x5, [%[a], 80]\n\t"
8016         "sbcs	x3, x3, x7\n\t"
8017         "ldp	x8, x9, [%[b], 80]\n\t"
8018         "sbcs	x4, x4, x8\n\t"
8019         "stp	x2, x3, [%[a], 64]\n\t"
8020         "sbcs	x5, x5, x9\n\t"
8021         "stp	x4, x5, [%[a], 80]\n\t"
8022         "ldp	x2, x3, [%[a], 96]\n\t"
8023         "ldp	x6, x7, [%[b], 96]\n\t"
8024         "sbcs	x2, x2, x6\n\t"
8025         "ldp	x4, x5, [%[a], 112]\n\t"
8026         "sbcs	x3, x3, x7\n\t"
8027         "ldp	x8, x9, [%[b], 112]\n\t"
8028         "sbcs	x4, x4, x8\n\t"
8029         "stp	x2, x3, [%[a], 96]\n\t"
8030         "sbcs	x5, x5, x9\n\t"
8031         "stp	x4, x5, [%[a], 112]\n\t"
8032         "ldp	x2, x3, [%[a], 128]\n\t"
8033         "ldp	x6, x7, [%[b], 128]\n\t"
8034         "sbcs	x2, x2, x6\n\t"
8035         "ldp	x4, x5, [%[a], 144]\n\t"
8036         "sbcs	x3, x3, x7\n\t"
8037         "ldp	x8, x9, [%[b], 144]\n\t"
8038         "sbcs	x4, x4, x8\n\t"
8039         "stp	x2, x3, [%[a], 128]\n\t"
8040         "sbcs	x5, x5, x9\n\t"
8041         "stp	x4, x5, [%[a], 144]\n\t"
8042         "ldp	x2, x3, [%[a], 160]\n\t"
8043         "ldp	x6, x7, [%[b], 160]\n\t"
8044         "sbcs	x2, x2, x6\n\t"
8045         "ldp	x4, x5, [%[a], 176]\n\t"
8046         "sbcs	x3, x3, x7\n\t"
8047         "ldp	x8, x9, [%[b], 176]\n\t"
8048         "sbcs	x4, x4, x8\n\t"
8049         "stp	x2, x3, [%[a], 160]\n\t"
8050         "sbcs	x5, x5, x9\n\t"
8051         "stp	x4, x5, [%[a], 176]\n\t"
8052         "csetm	%[a], cc\n\t"
8053         : [a] "+r" (a)
8054         : [b] "r" (b)
8055         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
8056     );
8057 
8058     return (sp_digit)a;
8059 }
8060 
8061 /* Add b to a into r. (r = a + b)
8062  *
8063  * r  A single precision integer.
8064  * a  A single precision integer.
8065  * b  A single precision integer.
8066  */
sp_3072_add_24(sp_digit * r,const sp_digit * a,const sp_digit * b)8067 static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a,
8068         const sp_digit* b)
8069 {
8070     __asm__ __volatile__ (
8071         "ldp	x3, x4, [%[a], 0]\n\t"
8072         "ldp	x7, x8, [%[b], 0]\n\t"
8073         "adds	x3, x3, x7\n\t"
8074         "ldp	x5, x6, [%[a], 16]\n\t"
8075         "adcs	x4, x4, x8\n\t"
8076         "ldp	x9, x10, [%[b], 16]\n\t"
8077         "adcs	x5, x5, x9\n\t"
8078         "stp	x3, x4, [%[r], 0]\n\t"
8079         "adcs	x6, x6, x10\n\t"
8080         "stp	x5, x6, [%[r], 16]\n\t"
8081         "ldp	x3, x4, [%[a], 32]\n\t"
8082         "ldp	x7, x8, [%[b], 32]\n\t"
8083         "adcs	x3, x3, x7\n\t"
8084         "ldp	x5, x6, [%[a], 48]\n\t"
8085         "adcs	x4, x4, x8\n\t"
8086         "ldp	x9, x10, [%[b], 48]\n\t"
8087         "adcs	x5, x5, x9\n\t"
8088         "stp	x3, x4, [%[r], 32]\n\t"
8089         "adcs	x6, x6, x10\n\t"
8090         "stp	x5, x6, [%[r], 48]\n\t"
8091         "ldp	x3, x4, [%[a], 64]\n\t"
8092         "ldp	x7, x8, [%[b], 64]\n\t"
8093         "adcs	x3, x3, x7\n\t"
8094         "ldp	x5, x6, [%[a], 80]\n\t"
8095         "adcs	x4, x4, x8\n\t"
8096         "ldp	x9, x10, [%[b], 80]\n\t"
8097         "adcs	x5, x5, x9\n\t"
8098         "stp	x3, x4, [%[r], 64]\n\t"
8099         "adcs	x6, x6, x10\n\t"
8100         "stp	x5, x6, [%[r], 80]\n\t"
8101         "ldp	x3, x4, [%[a], 96]\n\t"
8102         "ldp	x7, x8, [%[b], 96]\n\t"
8103         "adcs	x3, x3, x7\n\t"
8104         "ldp	x5, x6, [%[a], 112]\n\t"
8105         "adcs	x4, x4, x8\n\t"
8106         "ldp	x9, x10, [%[b], 112]\n\t"
8107         "adcs	x5, x5, x9\n\t"
8108         "stp	x3, x4, [%[r], 96]\n\t"
8109         "adcs	x6, x6, x10\n\t"
8110         "stp	x5, x6, [%[r], 112]\n\t"
8111         "ldp	x3, x4, [%[a], 128]\n\t"
8112         "ldp	x7, x8, [%[b], 128]\n\t"
8113         "adcs	x3, x3, x7\n\t"
8114         "ldp	x5, x6, [%[a], 144]\n\t"
8115         "adcs	x4, x4, x8\n\t"
8116         "ldp	x9, x10, [%[b], 144]\n\t"
8117         "adcs	x5, x5, x9\n\t"
8118         "stp	x3, x4, [%[r], 128]\n\t"
8119         "adcs	x6, x6, x10\n\t"
8120         "stp	x5, x6, [%[r], 144]\n\t"
8121         "ldp	x3, x4, [%[a], 160]\n\t"
8122         "ldp	x7, x8, [%[b], 160]\n\t"
8123         "adcs	x3, x3, x7\n\t"
8124         "ldp	x5, x6, [%[a], 176]\n\t"
8125         "adcs	x4, x4, x8\n\t"
8126         "ldp	x9, x10, [%[b], 176]\n\t"
8127         "adcs	x5, x5, x9\n\t"
8128         "stp	x3, x4, [%[r], 160]\n\t"
8129         "adcs	x6, x6, x10\n\t"
8130         "stp	x5, x6, [%[r], 176]\n\t"
8131         "cset	%[r], cs\n\t"
8132         : [r] "+r" (r)
8133         : [a] "r" (a), [b] "r" (b)
8134         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
8135     );
8136 
8137     return (sp_digit)r;
8138 }
8139 
8140 /* AND m into each word of a and store in r.
8141  *
8142  * r  A single precision integer.
8143  * a  A single precision integer.
8144  * m  Mask to AND against each digit.
8145  */
sp_3072_mask_12(sp_digit * r,const sp_digit * a,sp_digit m)8146 static void sp_3072_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
8147 {
8148 #ifdef WOLFSSL_SP_SMALL
8149     int i;
8150 
8151     for (i=0; i<12; i++) {
8152         r[i] = a[i] & m;
8153     }
8154 #else
8155     r[0] = a[0] & m;
8156     r[1] = a[1] & m;
8157     r[2] = a[2] & m;
8158     r[3] = a[3] & m;
8159     r[4] = a[4] & m;
8160     r[5] = a[5] & m;
8161     r[6] = a[6] & m;
8162     r[7] = a[7] & m;
8163     r[8] = a[8] & m;
8164     r[9] = a[9] & m;
8165     r[10] = a[10] & m;
8166     r[11] = a[11] & m;
8167 #endif
8168 }
8169 
8170 /* Add digit to a into r. (r = a + b)
8171  *
8172  * r  A single precision integer.
8173  * a  A single precision integer.
8174  * b  A single precision integer.
8175  */
sp_3072_add_zero_12(sp_digit * r,const sp_digit * a,const sp_digit d)8176 static void sp_3072_add_zero_12(sp_digit* r, const sp_digit* a,
8177         const sp_digit d)
8178 {
8179     __asm__ __volatile__ (
8180         "ldp	x3, x4, [%[a], 0]\n\t"
8181         "ldp	x5, x6, [%[a], 16]\n\t"
8182         "adds	x3, x3, %[d]\n\t"
8183         "adcs	x4, x4, xzr\n\t"
8184         "adcs	x5, x5, xzr\n\t"
8185         "stp	x3, x4, [%[r], 0]\n\t"
8186         "adcs	x6, x6, xzr\n\t"
8187         "stp	x5, x6, [%[r], 16]\n\t"
8188         "ldp	x3, x4, [%[a], 32]\n\t"
8189         "ldp	x5, x6, [%[a], 48]\n\t"
8190         "adcs	x3, x3, xzr\n\t"
8191         "adcs	x4, x4, xzr\n\t"
8192         "adcs	x5, x5, xzr\n\t"
8193         "stp	x3, x4, [%[r], 32]\n\t"
8194         "adcs	x6, x6, xzr\n\t"
8195         "stp	x5, x6, [%[r], 48]\n\t"
8196         "ldp	x3, x4, [%[a], 64]\n\t"
8197         "ldp	x5, x6, [%[a], 80]\n\t"
8198         "adcs	x3, x3, xzr\n\t"
8199         "adcs	x4, x4, xzr\n\t"
8200         "adcs	x5, x5, xzr\n\t"
8201         "stp	x3, x4, [%[r], 64]\n\t"
8202         "adcs	x6, x6, xzr\n\t"
8203         "stp	x5, x6, [%[r], 80]\n\t"
8204         :
8205         : [r] "r" (r), [a] "r" (a), [d] "r" (d)
8206         : "memory", "x3", "x4", "x5", "x6"
8207     );
8208 }
8209 
8210 /* Multiply a and b into r. (r = a * b)
8211  *
8212  * r  A single precision integer.
8213  * a  A single precision integer.
8214  * b  A single precision integer.
8215  */
sp_3072_mul_24(sp_digit * r,const sp_digit * a,const sp_digit * b)8216 SP_NOINLINE static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
8217         const sp_digit* b)
8218 {
8219     sp_digit* z0 = r;
8220     sp_digit z1[24];
8221     sp_digit a1[12];
8222     sp_digit b1[12];
8223     sp_digit z2[24];
8224     sp_digit u, ca, cb;
8225 
8226     ca = sp_3072_add_12(a1, a, &a[12]);
8227     cb = sp_3072_add_12(b1, b, &b[12]);
8228     u  = ca & cb;
8229     sp_3072_mul_12(z1, a1, b1);
8230     sp_3072_mul_12(z2, &a[12], &b[12]);
8231     sp_3072_mul_12(z0, a, b);
8232     sp_3072_mask_12(r + 24, a1, 0 - cb);
8233     sp_3072_mask_12(b1, b1, 0 - ca);
8234     u += sp_3072_add_12(r + 24, r + 24, b1);
8235     u += sp_3072_sub_in_place_24(z1, z2);
8236     u += sp_3072_sub_in_place_24(z1, z0);
8237     u += sp_3072_add_24(r + 12, r + 12, z1);
8238     u += sp_3072_add_12(r + 24, r + 24, z2);
8239     sp_3072_add_zero_12(r + 36, z2 + 12, u);
8240 }
8241 
8242 #ifdef WOLFSSL_SP_SMALL
8243 /* Double a into r. (r = a + a)
8244  *
8245  * r  A single precision integer.
8246  * a  A single precision integer.
8247  */
sp_3072_dbl_12(sp_digit * r,const sp_digit * a)8248 static sp_digit sp_3072_dbl_12(sp_digit* r, const sp_digit* a)
8249 {
8250     sp_digit c = 0;
8251 
8252     __asm__ __volatile__ (
8253         "add	x11, %[a], 96\n\t"
8254         "\n1:\n\t"
8255         "adds	%[c], %[c], #-1\n\t"
8256         "ldp	x3, x4, [%[a]], #16\n\t"
8257         "ldp	x5, x6, [%[a]], #16\n\t"
8258         "adcs	x3, x3, x3\n\t"
8259         "adcs	x4, x4, x4\n\t"
8260         "adcs	x5, x5, x5\n\t"
8261         "stp	x3, x4, [%[r]], #16\n\t"
8262         "adcs	x6, x6, x6\n\t"
8263         "stp	x5, x6, [%[r]], #16\n\t"
8264         "cset	%[c], cs\n\t"
8265         "cmp	%[a], x11\n\t"
8266         "b.ne	1b\n\t"
8267         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a)
8268         :
8269         : "memory", "x3", "x4", "x5", "x6", "x11"
8270     );
8271 
8272     return c;
8273 }
8274 
8275 #else
8276 /* Double a into r. (r = a + a)
8277  *
8278  * r  A single precision integer.
8279  * a  A single precision integer.
8280  */
sp_3072_dbl_12(sp_digit * r,const sp_digit * a)8281 static sp_digit sp_3072_dbl_12(sp_digit* r, const sp_digit* a)
8282 {
8283     __asm__ __volatile__ (
8284         "ldp	x3, x4, [%[a], 0]\n\t"
8285         "adds	x3, x3, x3\n\t"
8286         "ldr	x5, [%[a], 16]\n\t"
8287         "adcs	x4, x4, x4\n\t"
8288         "ldr	x6, [%[a], 24]\n\t"
8289         "adcs	x5, x5, x5\n\t"
8290         "stp	x3, x4, [%[r], 0]\n\t"
8291         "adcs	x6, x6, x6\n\t"
8292         "stp	x5, x6, [%[r], 16]\n\t"
8293         "ldp	x3, x4, [%[a], 32]\n\t"
8294         "adcs	x3, x3, x3\n\t"
8295         "ldr	x5, [%[a], 48]\n\t"
8296         "adcs	x4, x4, x4\n\t"
8297         "ldr	x6, [%[a], 56]\n\t"
8298         "adcs	x5, x5, x5\n\t"
8299         "stp	x3, x4, [%[r], 32]\n\t"
8300         "adcs	x6, x6, x6\n\t"
8301         "stp	x5, x6, [%[r], 48]\n\t"
8302         "ldp	x3, x4, [%[a], 64]\n\t"
8303         "adcs	x3, x3, x3\n\t"
8304         "ldr	x5, [%[a], 80]\n\t"
8305         "adcs	x4, x4, x4\n\t"
8306         "ldr	x6, [%[a], 88]\n\t"
8307         "adcs	x5, x5, x5\n\t"
8308         "stp	x3, x4, [%[r], 64]\n\t"
8309         "adcs	x6, x6, x6\n\t"
8310         "stp	x5, x6, [%[r], 80]\n\t"
8311         "cset	%[r], cs\n\t"
8312         : [r] "+r" (r)
8313         : [a] "r" (a)
8314         : "memory", "x3", "x4", "x5", "x6"
8315     );
8316 
8317     return (sp_digit)r;
8318 }
8319 
8320 #endif /* WOLFSSL_SP_SMALL */
8321 /* Square a and put result in r. (r = a * a)
8322  *
8323  * r  A single precision integer.
8324  * a  A single precision integer.
8325  */
sp_3072_sqr_24(sp_digit * r,const sp_digit * a)8326 SP_NOINLINE static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
8327 {
8328     sp_digit* z0 = r;
8329     sp_digit z2[24];
8330     sp_digit z1[24];
8331     sp_digit a1[12];
8332     sp_digit u;
8333 
8334     u = sp_3072_add_12(a1, a, &a[12]);
8335     sp_3072_sqr_12(z1, a1);
8336     sp_3072_sqr_12(z2, &a[12]);
8337     sp_3072_sqr_12(z0, a);
8338     sp_3072_mask_12(r + 24, a1, 0 - u);
8339     u += sp_3072_dbl_12(r + 24, r + 24);
8340     u += sp_3072_sub_in_place_24(z1, z2);
8341     u += sp_3072_sub_in_place_24(z1, z0);
8342     u += sp_3072_add_24(r + 12, r + 12, z1);
8343     u += sp_3072_add_12(r + 24, r + 24, z2);
8344     sp_3072_add_zero_12(r + 36, z2 + 12, u);
8345 }
8346 
8347 /* Sub b from a into a. (a -= b)
8348  *
8349  * a  A single precision integer and result.
8350  * b  A single precision integer.
8351  */
sp_3072_sub_in_place_48(sp_digit * a,const sp_digit * b)8352 static sp_digit sp_3072_sub_in_place_48(sp_digit* a, const sp_digit* b)
8353 {
8354     __asm__ __volatile__ (
8355         "ldp	x2, x3, [%[a], 0]\n\t"
8356         "ldp	x6, x7, [%[b], 0]\n\t"
8357         "subs	x2, x2, x6\n\t"
8358         "ldp	x4, x5, [%[a], 16]\n\t"
8359         "sbcs	x3, x3, x7\n\t"
8360         "ldp	x8, x9, [%[b], 16]\n\t"
8361         "sbcs	x4, x4, x8\n\t"
8362         "stp	x2, x3, [%[a], 0]\n\t"
8363         "sbcs	x5, x5, x9\n\t"
8364         "stp	x4, x5, [%[a], 16]\n\t"
8365         "ldp	x2, x3, [%[a], 32]\n\t"
8366         "ldp	x6, x7, [%[b], 32]\n\t"
8367         "sbcs	x2, x2, x6\n\t"
8368         "ldp	x4, x5, [%[a], 48]\n\t"
8369         "sbcs	x3, x3, x7\n\t"
8370         "ldp	x8, x9, [%[b], 48]\n\t"
8371         "sbcs	x4, x4, x8\n\t"
8372         "stp	x2, x3, [%[a], 32]\n\t"
8373         "sbcs	x5, x5, x9\n\t"
8374         "stp	x4, x5, [%[a], 48]\n\t"
8375         "ldp	x2, x3, [%[a], 64]\n\t"
8376         "ldp	x6, x7, [%[b], 64]\n\t"
8377         "sbcs	x2, x2, x6\n\t"
8378         "ldp	x4, x5, [%[a], 80]\n\t"
8379         "sbcs	x3, x3, x7\n\t"
8380         "ldp	x8, x9, [%[b], 80]\n\t"
8381         "sbcs	x4, x4, x8\n\t"
8382         "stp	x2, x3, [%[a], 64]\n\t"
8383         "sbcs	x5, x5, x9\n\t"
8384         "stp	x4, x5, [%[a], 80]\n\t"
8385         "ldp	x2, x3, [%[a], 96]\n\t"
8386         "ldp	x6, x7, [%[b], 96]\n\t"
8387         "sbcs	x2, x2, x6\n\t"
8388         "ldp	x4, x5, [%[a], 112]\n\t"
8389         "sbcs	x3, x3, x7\n\t"
8390         "ldp	x8, x9, [%[b], 112]\n\t"
8391         "sbcs	x4, x4, x8\n\t"
8392         "stp	x2, x3, [%[a], 96]\n\t"
8393         "sbcs	x5, x5, x9\n\t"
8394         "stp	x4, x5, [%[a], 112]\n\t"
8395         "ldp	x2, x3, [%[a], 128]\n\t"
8396         "ldp	x6, x7, [%[b], 128]\n\t"
8397         "sbcs	x2, x2, x6\n\t"
8398         "ldp	x4, x5, [%[a], 144]\n\t"
8399         "sbcs	x3, x3, x7\n\t"
8400         "ldp	x8, x9, [%[b], 144]\n\t"
8401         "sbcs	x4, x4, x8\n\t"
8402         "stp	x2, x3, [%[a], 128]\n\t"
8403         "sbcs	x5, x5, x9\n\t"
8404         "stp	x4, x5, [%[a], 144]\n\t"
8405         "ldp	x2, x3, [%[a], 160]\n\t"
8406         "ldp	x6, x7, [%[b], 160]\n\t"
8407         "sbcs	x2, x2, x6\n\t"
8408         "ldp	x4, x5, [%[a], 176]\n\t"
8409         "sbcs	x3, x3, x7\n\t"
8410         "ldp	x8, x9, [%[b], 176]\n\t"
8411         "sbcs	x4, x4, x8\n\t"
8412         "stp	x2, x3, [%[a], 160]\n\t"
8413         "sbcs	x5, x5, x9\n\t"
8414         "stp	x4, x5, [%[a], 176]\n\t"
8415         "ldp	x2, x3, [%[a], 192]\n\t"
8416         "ldp	x6, x7, [%[b], 192]\n\t"
8417         "sbcs	x2, x2, x6\n\t"
8418         "ldp	x4, x5, [%[a], 208]\n\t"
8419         "sbcs	x3, x3, x7\n\t"
8420         "ldp	x8, x9, [%[b], 208]\n\t"
8421         "sbcs	x4, x4, x8\n\t"
8422         "stp	x2, x3, [%[a], 192]\n\t"
8423         "sbcs	x5, x5, x9\n\t"
8424         "stp	x4, x5, [%[a], 208]\n\t"
8425         "ldp	x2, x3, [%[a], 224]\n\t"
8426         "ldp	x6, x7, [%[b], 224]\n\t"
8427         "sbcs	x2, x2, x6\n\t"
8428         "ldp	x4, x5, [%[a], 240]\n\t"
8429         "sbcs	x3, x3, x7\n\t"
8430         "ldp	x8, x9, [%[b], 240]\n\t"
8431         "sbcs	x4, x4, x8\n\t"
8432         "stp	x2, x3, [%[a], 224]\n\t"
8433         "sbcs	x5, x5, x9\n\t"
8434         "stp	x4, x5, [%[a], 240]\n\t"
8435         "ldp	x2, x3, [%[a], 256]\n\t"
8436         "ldp	x6, x7, [%[b], 256]\n\t"
8437         "sbcs	x2, x2, x6\n\t"
8438         "ldp	x4, x5, [%[a], 272]\n\t"
8439         "sbcs	x3, x3, x7\n\t"
8440         "ldp	x8, x9, [%[b], 272]\n\t"
8441         "sbcs	x4, x4, x8\n\t"
8442         "stp	x2, x3, [%[a], 256]\n\t"
8443         "sbcs	x5, x5, x9\n\t"
8444         "stp	x4, x5, [%[a], 272]\n\t"
8445         "ldp	x2, x3, [%[a], 288]\n\t"
8446         "ldp	x6, x7, [%[b], 288]\n\t"
8447         "sbcs	x2, x2, x6\n\t"
8448         "ldp	x4, x5, [%[a], 304]\n\t"
8449         "sbcs	x3, x3, x7\n\t"
8450         "ldp	x8, x9, [%[b], 304]\n\t"
8451         "sbcs	x4, x4, x8\n\t"
8452         "stp	x2, x3, [%[a], 288]\n\t"
8453         "sbcs	x5, x5, x9\n\t"
8454         "stp	x4, x5, [%[a], 304]\n\t"
8455         "ldp	x2, x3, [%[a], 320]\n\t"
8456         "ldp	x6, x7, [%[b], 320]\n\t"
8457         "sbcs	x2, x2, x6\n\t"
8458         "ldp	x4, x5, [%[a], 336]\n\t"
8459         "sbcs	x3, x3, x7\n\t"
8460         "ldp	x8, x9, [%[b], 336]\n\t"
8461         "sbcs	x4, x4, x8\n\t"
8462         "stp	x2, x3, [%[a], 320]\n\t"
8463         "sbcs	x5, x5, x9\n\t"
8464         "stp	x4, x5, [%[a], 336]\n\t"
8465         "ldp	x2, x3, [%[a], 352]\n\t"
8466         "ldp	x6, x7, [%[b], 352]\n\t"
8467         "sbcs	x2, x2, x6\n\t"
8468         "ldp	x4, x5, [%[a], 368]\n\t"
8469         "sbcs	x3, x3, x7\n\t"
8470         "ldp	x8, x9, [%[b], 368]\n\t"
8471         "sbcs	x4, x4, x8\n\t"
8472         "stp	x2, x3, [%[a], 352]\n\t"
8473         "sbcs	x5, x5, x9\n\t"
8474         "stp	x4, x5, [%[a], 368]\n\t"
8475         "csetm	%[a], cc\n\t"
8476         : [a] "+r" (a)
8477         : [b] "r" (b)
8478         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
8479     );
8480 
8481     return (sp_digit)a;
8482 }
8483 
8484 /* Add b to a into r. (r = a + b)
8485  *
8486  * r  A single precision integer.
8487  * a  A single precision integer.
8488  * b  A single precision integer.
8489  */
sp_3072_add_48(sp_digit * r,const sp_digit * a,const sp_digit * b)8490 static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
8491         const sp_digit* b)
8492 {
8493     __asm__ __volatile__ (
8494         "ldp	x3, x4, [%[a], 0]\n\t"
8495         "ldp	x7, x8, [%[b], 0]\n\t"
8496         "adds	x3, x3, x7\n\t"
8497         "ldp	x5, x6, [%[a], 16]\n\t"
8498         "adcs	x4, x4, x8\n\t"
8499         "ldp	x9, x10, [%[b], 16]\n\t"
8500         "adcs	x5, x5, x9\n\t"
8501         "stp	x3, x4, [%[r], 0]\n\t"
8502         "adcs	x6, x6, x10\n\t"
8503         "stp	x5, x6, [%[r], 16]\n\t"
8504         "ldp	x3, x4, [%[a], 32]\n\t"
8505         "ldp	x7, x8, [%[b], 32]\n\t"
8506         "adcs	x3, x3, x7\n\t"
8507         "ldp	x5, x6, [%[a], 48]\n\t"
8508         "adcs	x4, x4, x8\n\t"
8509         "ldp	x9, x10, [%[b], 48]\n\t"
8510         "adcs	x5, x5, x9\n\t"
8511         "stp	x3, x4, [%[r], 32]\n\t"
8512         "adcs	x6, x6, x10\n\t"
8513         "stp	x5, x6, [%[r], 48]\n\t"
8514         "ldp	x3, x4, [%[a], 64]\n\t"
8515         "ldp	x7, x8, [%[b], 64]\n\t"
8516         "adcs	x3, x3, x7\n\t"
8517         "ldp	x5, x6, [%[a], 80]\n\t"
8518         "adcs	x4, x4, x8\n\t"
8519         "ldp	x9, x10, [%[b], 80]\n\t"
8520         "adcs	x5, x5, x9\n\t"
8521         "stp	x3, x4, [%[r], 64]\n\t"
8522         "adcs	x6, x6, x10\n\t"
8523         "stp	x5, x6, [%[r], 80]\n\t"
8524         "ldp	x3, x4, [%[a], 96]\n\t"
8525         "ldp	x7, x8, [%[b], 96]\n\t"
8526         "adcs	x3, x3, x7\n\t"
8527         "ldp	x5, x6, [%[a], 112]\n\t"
8528         "adcs	x4, x4, x8\n\t"
8529         "ldp	x9, x10, [%[b], 112]\n\t"
8530         "adcs	x5, x5, x9\n\t"
8531         "stp	x3, x4, [%[r], 96]\n\t"
8532         "adcs	x6, x6, x10\n\t"
8533         "stp	x5, x6, [%[r], 112]\n\t"
8534         "ldp	x3, x4, [%[a], 128]\n\t"
8535         "ldp	x7, x8, [%[b], 128]\n\t"
8536         "adcs	x3, x3, x7\n\t"
8537         "ldp	x5, x6, [%[a], 144]\n\t"
8538         "adcs	x4, x4, x8\n\t"
8539         "ldp	x9, x10, [%[b], 144]\n\t"
8540         "adcs	x5, x5, x9\n\t"
8541         "stp	x3, x4, [%[r], 128]\n\t"
8542         "adcs	x6, x6, x10\n\t"
8543         "stp	x5, x6, [%[r], 144]\n\t"
8544         "ldp	x3, x4, [%[a], 160]\n\t"
8545         "ldp	x7, x8, [%[b], 160]\n\t"
8546         "adcs	x3, x3, x7\n\t"
8547         "ldp	x5, x6, [%[a], 176]\n\t"
8548         "adcs	x4, x4, x8\n\t"
8549         "ldp	x9, x10, [%[b], 176]\n\t"
8550         "adcs	x5, x5, x9\n\t"
8551         "stp	x3, x4, [%[r], 160]\n\t"
8552         "adcs	x6, x6, x10\n\t"
8553         "stp	x5, x6, [%[r], 176]\n\t"
8554         "ldp	x3, x4, [%[a], 192]\n\t"
8555         "ldp	x7, x8, [%[b], 192]\n\t"
8556         "adcs	x3, x3, x7\n\t"
8557         "ldp	x5, x6, [%[a], 208]\n\t"
8558         "adcs	x4, x4, x8\n\t"
8559         "ldp	x9, x10, [%[b], 208]\n\t"
8560         "adcs	x5, x5, x9\n\t"
8561         "stp	x3, x4, [%[r], 192]\n\t"
8562         "adcs	x6, x6, x10\n\t"
8563         "stp	x5, x6, [%[r], 208]\n\t"
8564         "ldp	x3, x4, [%[a], 224]\n\t"
8565         "ldp	x7, x8, [%[b], 224]\n\t"
8566         "adcs	x3, x3, x7\n\t"
8567         "ldp	x5, x6, [%[a], 240]\n\t"
8568         "adcs	x4, x4, x8\n\t"
8569         "ldp	x9, x10, [%[b], 240]\n\t"
8570         "adcs	x5, x5, x9\n\t"
8571         "stp	x3, x4, [%[r], 224]\n\t"
8572         "adcs	x6, x6, x10\n\t"
8573         "stp	x5, x6, [%[r], 240]\n\t"
8574         "ldp	x3, x4, [%[a], 256]\n\t"
8575         "ldp	x7, x8, [%[b], 256]\n\t"
8576         "adcs	x3, x3, x7\n\t"
8577         "ldp	x5, x6, [%[a], 272]\n\t"
8578         "adcs	x4, x4, x8\n\t"
8579         "ldp	x9, x10, [%[b], 272]\n\t"
8580         "adcs	x5, x5, x9\n\t"
8581         "stp	x3, x4, [%[r], 256]\n\t"
8582         "adcs	x6, x6, x10\n\t"
8583         "stp	x5, x6, [%[r], 272]\n\t"
8584         "ldp	x3, x4, [%[a], 288]\n\t"
8585         "ldp	x7, x8, [%[b], 288]\n\t"
8586         "adcs	x3, x3, x7\n\t"
8587         "ldp	x5, x6, [%[a], 304]\n\t"
8588         "adcs	x4, x4, x8\n\t"
8589         "ldp	x9, x10, [%[b], 304]\n\t"
8590         "adcs	x5, x5, x9\n\t"
8591         "stp	x3, x4, [%[r], 288]\n\t"
8592         "adcs	x6, x6, x10\n\t"
8593         "stp	x5, x6, [%[r], 304]\n\t"
8594         "ldp	x3, x4, [%[a], 320]\n\t"
8595         "ldp	x7, x8, [%[b], 320]\n\t"
8596         "adcs	x3, x3, x7\n\t"
8597         "ldp	x5, x6, [%[a], 336]\n\t"
8598         "adcs	x4, x4, x8\n\t"
8599         "ldp	x9, x10, [%[b], 336]\n\t"
8600         "adcs	x5, x5, x9\n\t"
8601         "stp	x3, x4, [%[r], 320]\n\t"
8602         "adcs	x6, x6, x10\n\t"
8603         "stp	x5, x6, [%[r], 336]\n\t"
8604         "ldp	x3, x4, [%[a], 352]\n\t"
8605         "ldp	x7, x8, [%[b], 352]\n\t"
8606         "adcs	x3, x3, x7\n\t"
8607         "ldp	x5, x6, [%[a], 368]\n\t"
8608         "adcs	x4, x4, x8\n\t"
8609         "ldp	x9, x10, [%[b], 368]\n\t"
8610         "adcs	x5, x5, x9\n\t"
8611         "stp	x3, x4, [%[r], 352]\n\t"
8612         "adcs	x6, x6, x10\n\t"
8613         "stp	x5, x6, [%[r], 368]\n\t"
8614         "cset	%[r], cs\n\t"
8615         : [r] "+r" (r)
8616         : [a] "r" (a), [b] "r" (b)
8617         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
8618     );
8619 
8620     return (sp_digit)r;
8621 }
8622 
8623 /* AND m into each word of a and store in r.
8624  *
8625  * r  A single precision integer.
8626  * a  A single precision integer.
8627  * m  Mask to AND against each digit.
8628  */
sp_3072_mask_24(sp_digit * r,const sp_digit * a,sp_digit m)8629 static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
8630 {
8631 #ifdef WOLFSSL_SP_SMALL
8632     int i;
8633 
8634     for (i=0; i<24; i++) {
8635         r[i] = a[i] & m;
8636     }
8637 #else
8638     int i;
8639 
8640     for (i = 0; i < 24; i += 8) {
8641         r[i+0] = a[i+0] & m;
8642         r[i+1] = a[i+1] & m;
8643         r[i+2] = a[i+2] & m;
8644         r[i+3] = a[i+3] & m;
8645         r[i+4] = a[i+4] & m;
8646         r[i+5] = a[i+5] & m;
8647         r[i+6] = a[i+6] & m;
8648         r[i+7] = a[i+7] & m;
8649     }
8650 #endif
8651 }
8652 
8653 /* Add digit to a into r. (r = a + b)
8654  *
8655  * r  A single precision integer.
8656  * a  A single precision integer.
8657  * b  A single precision integer.
8658  */
sp_3072_add_zero_24(sp_digit * r,const sp_digit * a,const sp_digit d)8659 static void sp_3072_add_zero_24(sp_digit* r, const sp_digit* a,
8660         const sp_digit d)
8661 {
8662     __asm__ __volatile__ (
8663         "ldp	x3, x4, [%[a], 0]\n\t"
8664         "ldp	x5, x6, [%[a], 16]\n\t"
8665         "adds	x3, x3, %[d]\n\t"
8666         "adcs	x4, x4, xzr\n\t"
8667         "adcs	x5, x5, xzr\n\t"
8668         "stp	x3, x4, [%[r], 0]\n\t"
8669         "adcs	x6, x6, xzr\n\t"
8670         "stp	x5, x6, [%[r], 16]\n\t"
8671         "ldp	x3, x4, [%[a], 32]\n\t"
8672         "ldp	x5, x6, [%[a], 48]\n\t"
8673         "adcs	x3, x3, xzr\n\t"
8674         "adcs	x4, x4, xzr\n\t"
8675         "adcs	x5, x5, xzr\n\t"
8676         "stp	x3, x4, [%[r], 32]\n\t"
8677         "adcs	x6, x6, xzr\n\t"
8678         "stp	x5, x6, [%[r], 48]\n\t"
8679         "ldp	x3, x4, [%[a], 64]\n\t"
8680         "ldp	x5, x6, [%[a], 80]\n\t"
8681         "adcs	x3, x3, xzr\n\t"
8682         "adcs	x4, x4, xzr\n\t"
8683         "adcs	x5, x5, xzr\n\t"
8684         "stp	x3, x4, [%[r], 64]\n\t"
8685         "adcs	x6, x6, xzr\n\t"
8686         "stp	x5, x6, [%[r], 80]\n\t"
8687         "ldp	x3, x4, [%[a], 96]\n\t"
8688         "ldp	x5, x6, [%[a], 112]\n\t"
8689         "adcs	x3, x3, xzr\n\t"
8690         "adcs	x4, x4, xzr\n\t"
8691         "adcs	x5, x5, xzr\n\t"
8692         "stp	x3, x4, [%[r], 96]\n\t"
8693         "adcs	x6, x6, xzr\n\t"
8694         "stp	x5, x6, [%[r], 112]\n\t"
8695         "ldp	x3, x4, [%[a], 128]\n\t"
8696         "ldp	x5, x6, [%[a], 144]\n\t"
8697         "adcs	x3, x3, xzr\n\t"
8698         "adcs	x4, x4, xzr\n\t"
8699         "adcs	x5, x5, xzr\n\t"
8700         "stp	x3, x4, [%[r], 128]\n\t"
8701         "adcs	x6, x6, xzr\n\t"
8702         "stp	x5, x6, [%[r], 144]\n\t"
8703         "ldp	x3, x4, [%[a], 160]\n\t"
8704         "ldp	x5, x6, [%[a], 176]\n\t"
8705         "adcs	x3, x3, xzr\n\t"
8706         "adcs	x4, x4, xzr\n\t"
8707         "adcs	x5, x5, xzr\n\t"
8708         "stp	x3, x4, [%[r], 160]\n\t"
8709         "adcs	x6, x6, xzr\n\t"
8710         "stp	x5, x6, [%[r], 176]\n\t"
8711         :
8712         : [r] "r" (r), [a] "r" (a), [d] "r" (d)
8713         : "memory", "x3", "x4", "x5", "x6"
8714     );
8715 }
8716 
8717 /* Multiply a and b into r. (r = a * b)
8718  *
8719  * r  A single precision integer.
8720  * a  A single precision integer.
8721  * b  A single precision integer.
8722  */
sp_3072_mul_48(sp_digit * r,const sp_digit * a,const sp_digit * b)8723 SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
8724         const sp_digit* b)
8725 {
8726     sp_digit* z0 = r;
8727     sp_digit z1[48];
8728     sp_digit a1[24];
8729     sp_digit b1[24];
8730     sp_digit z2[48];
8731     sp_digit u, ca, cb;
8732 
8733     ca = sp_3072_add_24(a1, a, &a[24]);
8734     cb = sp_3072_add_24(b1, b, &b[24]);
8735     u  = ca & cb;
8736     sp_3072_mul_24(z1, a1, b1);
8737     sp_3072_mul_24(z2, &a[24], &b[24]);
8738     sp_3072_mul_24(z0, a, b);
8739     sp_3072_mask_24(r + 48, a1, 0 - cb);
8740     sp_3072_mask_24(b1, b1, 0 - ca);
8741     u += sp_3072_add_24(r + 48, r + 48, b1);
8742     u += sp_3072_sub_in_place_48(z1, z2);
8743     u += sp_3072_sub_in_place_48(z1, z0);
8744     u += sp_3072_add_48(r + 24, r + 24, z1);
8745     u += sp_3072_add_24(r + 48, r + 48, z2);
8746     sp_3072_add_zero_24(r + 72, z2 + 24, u);
8747 }
8748 
8749 #ifdef WOLFSSL_SP_SMALL
8750 /* Double a into r. (r = a + a)
8751  *
8752  * r  A single precision integer.
8753  * a  A single precision integer.
8754  */
sp_3072_dbl_24(sp_digit * r,const sp_digit * a)8755 static sp_digit sp_3072_dbl_24(sp_digit* r, const sp_digit* a)
8756 {
8757     sp_digit c = 0;
8758 
8759     __asm__ __volatile__ (
8760         "add	x11, %[a], 192\n\t"
8761         "\n1:\n\t"
8762         "adds	%[c], %[c], #-1\n\t"
8763         "ldp	x3, x4, [%[a]], #16\n\t"
8764         "ldp	x5, x6, [%[a]], #16\n\t"
8765         "adcs	x3, x3, x3\n\t"
8766         "adcs	x4, x4, x4\n\t"
8767         "adcs	x5, x5, x5\n\t"
8768         "stp	x3, x4, [%[r]], #16\n\t"
8769         "adcs	x6, x6, x6\n\t"
8770         "stp	x5, x6, [%[r]], #16\n\t"
8771         "cset	%[c], cs\n\t"
8772         "cmp	%[a], x11\n\t"
8773         "b.ne	1b\n\t"
8774         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a)
8775         :
8776         : "memory", "x3", "x4", "x5", "x6", "x11"
8777     );
8778 
8779     return c;
8780 }
8781 
8782 #else
8783 /* Double a into r. (r = a + a)
8784  *
8785  * r  A single precision integer.
8786  * a  A single precision integer.
8787  */
sp_3072_dbl_24(sp_digit * r,const sp_digit * a)8788 static sp_digit sp_3072_dbl_24(sp_digit* r, const sp_digit* a)
8789 {
8790     __asm__ __volatile__ (
8791         "ldp	x3, x4, [%[a], 0]\n\t"
8792         "adds	x3, x3, x3\n\t"
8793         "ldr	x5, [%[a], 16]\n\t"
8794         "adcs	x4, x4, x4\n\t"
8795         "ldr	x6, [%[a], 24]\n\t"
8796         "adcs	x5, x5, x5\n\t"
8797         "stp	x3, x4, [%[r], 0]\n\t"
8798         "adcs	x6, x6, x6\n\t"
8799         "stp	x5, x6, [%[r], 16]\n\t"
8800         "ldp	x3, x4, [%[a], 32]\n\t"
8801         "adcs	x3, x3, x3\n\t"
8802         "ldr	x5, [%[a], 48]\n\t"
8803         "adcs	x4, x4, x4\n\t"
8804         "ldr	x6, [%[a], 56]\n\t"
8805         "adcs	x5, x5, x5\n\t"
8806         "stp	x3, x4, [%[r], 32]\n\t"
8807         "adcs	x6, x6, x6\n\t"
8808         "stp	x5, x6, [%[r], 48]\n\t"
8809         "ldp	x3, x4, [%[a], 64]\n\t"
8810         "adcs	x3, x3, x3\n\t"
8811         "ldr	x5, [%[a], 80]\n\t"
8812         "adcs	x4, x4, x4\n\t"
8813         "ldr	x6, [%[a], 88]\n\t"
8814         "adcs	x5, x5, x5\n\t"
8815         "stp	x3, x4, [%[r], 64]\n\t"
8816         "adcs	x6, x6, x6\n\t"
8817         "stp	x5, x6, [%[r], 80]\n\t"
8818         "ldp	x3, x4, [%[a], 96]\n\t"
8819         "adcs	x3, x3, x3\n\t"
8820         "ldr	x5, [%[a], 112]\n\t"
8821         "adcs	x4, x4, x4\n\t"
8822         "ldr	x6, [%[a], 120]\n\t"
8823         "adcs	x5, x5, x5\n\t"
8824         "stp	x3, x4, [%[r], 96]\n\t"
8825         "adcs	x6, x6, x6\n\t"
8826         "stp	x5, x6, [%[r], 112]\n\t"
8827         "ldp	x3, x4, [%[a], 128]\n\t"
8828         "adcs	x3, x3, x3\n\t"
8829         "ldr	x5, [%[a], 144]\n\t"
8830         "adcs	x4, x4, x4\n\t"
8831         "ldr	x6, [%[a], 152]\n\t"
8832         "adcs	x5, x5, x5\n\t"
8833         "stp	x3, x4, [%[r], 128]\n\t"
8834         "adcs	x6, x6, x6\n\t"
8835         "stp	x5, x6, [%[r], 144]\n\t"
8836         "ldp	x3, x4, [%[a], 160]\n\t"
8837         "adcs	x3, x3, x3\n\t"
8838         "ldr	x5, [%[a], 176]\n\t"
8839         "adcs	x4, x4, x4\n\t"
8840         "ldr	x6, [%[a], 184]\n\t"
8841         "adcs	x5, x5, x5\n\t"
8842         "stp	x3, x4, [%[r], 160]\n\t"
8843         "adcs	x6, x6, x6\n\t"
8844         "stp	x5, x6, [%[r], 176]\n\t"
8845         "cset	%[r], cs\n\t"
8846         : [r] "+r" (r)
8847         : [a] "r" (a)
8848         : "memory", "x3", "x4", "x5", "x6"
8849     );
8850 
8851     return (sp_digit)r;
8852 }
8853 
8854 #endif /* WOLFSSL_SP_SMALL */
8855 /* Square a and put result in r. (r = a * a)
8856  *
8857  * r  A single precision integer.
8858  * a  A single precision integer.
8859  */
sp_3072_sqr_48(sp_digit * r,const sp_digit * a)8860 SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
8861 {
8862     sp_digit* z0 = r;
8863     sp_digit z2[48];
8864     sp_digit z1[48];
8865     sp_digit a1[24];
8866     sp_digit u;
8867 
8868     u = sp_3072_add_24(a1, a, &a[24]);
8869     sp_3072_sqr_24(z1, a1);
8870     sp_3072_sqr_24(z2, &a[24]);
8871     sp_3072_sqr_24(z0, a);
8872     sp_3072_mask_24(r + 48, a1, 0 - u);
8873     u += sp_3072_dbl_24(r + 48, r + 48);
8874     u += sp_3072_sub_in_place_48(z1, z2);
8875     u += sp_3072_sub_in_place_48(z1, z0);
8876     u += sp_3072_add_48(r + 24, r + 24, z1);
8877     u += sp_3072_add_24(r + 48, r + 48, z2);
8878     sp_3072_add_zero_24(r + 72, z2 + 24, u);
8879 }
8880 
8881 #endif /* !WOLFSSL_SP_SMALL */
8882 #ifdef WOLFSSL_SP_SMALL
8883 /* Add b to a into r. (r = a + b)
8884  *
8885  * r  A single precision integer.
8886  * a  A single precision integer.
8887  * b  A single precision integer.
8888  */
sp_3072_add_48(sp_digit * r,const sp_digit * a,const sp_digit * b)8889 static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
8890         const sp_digit* b)
8891 {
8892     sp_digit c = 0;
8893 
8894     __asm__ __volatile__ (
8895         "add	x11, %[a], 384\n\t"
8896         "\n1:\n\t"
8897         "adds	%[c], %[c], #-1\n\t"
8898         "ldp	x3, x4, [%[a]], #16\n\t"
8899         "ldp	x5, x6, [%[a]], #16\n\t"
8900         "ldp	x7, x8, [%[b]], #16\n\t"
8901         "adcs	x3, x3, x7\n\t"
8902         "ldp	x9, x10, [%[b]], #16\n\t"
8903         "adcs	x4, x4, x8\n\t"
8904         "adcs	x5, x5, x9\n\t"
8905         "stp	x3, x4, [%[r]], #16\n\t"
8906         "adcs	x6, x6, x10\n\t"
8907         "stp	x5, x6, [%[r]], #16\n\t"
8908         "cset	%[c], cs\n\t"
8909         "cmp	%[a], x11\n\t"
8910         "b.ne	1b\n\t"
8911         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
8912         :
8913         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
8914     );
8915 
8916     return c;
8917 }
8918 
8919 #endif /* WOLFSSL_SP_SMALL */
8920 #ifdef WOLFSSL_SP_SMALL
8921 /* Sub b from a into a. (a -= b)
8922  *
8923  * a  A single precision integer.
8924  * b  A single precision integer.
8925  */
sp_3072_sub_in_place_48(sp_digit * a,const sp_digit * b)8926 static sp_digit sp_3072_sub_in_place_48(sp_digit* a, const sp_digit* b)
8927 {
8928     sp_digit c = 0;
8929 
8930     __asm__ __volatile__ (
8931         "add	x10, %[a], 384\n\t"
8932         "\n1:\n\t"
8933         "subs	%[c], xzr, %[c]\n\t"
8934         "ldp	x2, x3, [%[a]]\n\t"
8935         "ldp	x4, x5, [%[a], #16]\n\t"
8936         "ldp	x6, x7, [%[b]], #16\n\t"
8937         "sbcs	x2, x2, x6\n\t"
8938         "ldp	x8, x9, [%[b]], #16\n\t"
8939         "sbcs	x3, x3, x7\n\t"
8940         "sbcs	x4, x4, x8\n\t"
8941         "stp	x2, x3, [%[a]], #16\n\t"
8942         "sbcs	x5, x5, x9\n\t"
8943         "stp	x4, x5, [%[a]], #16\n\t"
8944         "csetm	%[c], cc\n\t"
8945         "cmp	%[a], x10\n\t"
8946         "b.ne	1b\n\t"
8947         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
8948         :
8949         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
8950     );
8951 
8952     return c;
8953 }
8954 
8955 #endif /* WOLFSSL_SP_SMALL */
8956 #ifdef WOLFSSL_SP_SMALL
8957 /* Multiply a and b into r. (r = a * b)
8958  *
8959  * r  A single precision integer.
8960  * a  A single precision integer.
8961  * b  A single precision integer.
8962  */
sp_3072_mul_48(sp_digit * r,const sp_digit * a,const sp_digit * b)8963 static void sp_3072_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b)
8964 {
8965     sp_digit tmp[96];
8966 
8967     __asm__ __volatile__ (
8968         "mov	x5, 0\n\t"
8969         "mov	x6, 0\n\t"
8970         "mov	x7, 0\n\t"
8971         "mov	x8, 0\n\t"
8972         "\n1:\n\t"
8973         "subs	x3, x5, 376\n\t"
8974         "csel	x3, xzr, x3, cc\n\t"
8975         "sub	x4, x5, x3\n\t"
8976         "\n2:\n\t"
8977         "ldr	x10, [%[a], x3]\n\t"
8978         "ldr	x11, [%[b], x4]\n\t"
8979         "mul	x9, x10, x11\n\t"
8980         "umulh	x10, x10, x11\n\t"
8981         "adds	x6, x6, x9\n\t"
8982         "adcs	x7, x7, x10\n\t"
8983         "adc	x8, x8, xzr\n\t"
8984         "add	x3, x3, #8\n\t"
8985         "sub	x4, x4, #8\n\t"
8986         "cmp	x3, 384\n\t"
8987         "b.eq	3f\n\t"
8988         "cmp	x3, x5\n\t"
8989         "b.le	2b\n\t"
8990         "\n3:\n\t"
8991         "str	x6, [%[r], x5]\n\t"
8992         "mov	x6, x7\n\t"
8993         "mov	x7, x8\n\t"
8994         "mov	x8, #0\n\t"
8995         "add	x5, x5, #8\n\t"
8996         "cmp	x5, 752\n\t"
8997         "b.le	1b\n\t"
8998         "str	x6, [%[r], x5]\n\t"
8999         :
9000         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
9001         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
9002     );
9003 
9004     XMEMCPY(r, tmp, sizeof(tmp));
9005 }
9006 
9007 /* Square a and put result in r. (r = a * a)
9008  *
9009  * r  A single precision integer.
9010  * a  A single precision integer.
9011  */
sp_3072_sqr_48(sp_digit * r,const sp_digit * a)9012 static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
9013 {
9014     sp_digit tmp[96];
9015 
9016     __asm__ __volatile__ (
9017         "mov	x6, 0\n\t"
9018         "mov	x7, 0\n\t"
9019         "mov	x8, 0\n\t"
9020         "mov	x5, 0\n\t"
9021         "\n1:\n\t"
9022         "subs	x3, x5, 376\n\t"
9023         "csel	x3, xzr, x3, cc\n\t"
9024         "sub	x4, x5, x3\n\t"
9025         "\n2:\n\t"
9026         "cmp	x4, x3\n\t"
9027         "b.eq	4f\n\t"
9028         "ldr	x10, [%[a], x3]\n\t"
9029         "ldr	x11, [%[a], x4]\n\t"
9030         "mul	x9, x10, x11\n\t"
9031         "umulh	x10, x10, x11\n\t"
9032         "adds	x6, x6, x9\n\t"
9033         "adcs	x7, x7, x10\n\t"
9034         "adc	x8, x8, xzr\n\t"
9035         "adds	x6, x6, x9\n\t"
9036         "adcs	x7, x7, x10\n\t"
9037         "adc	x8, x8, xzr\n\t"
9038         "b.al	5f\n\t"
9039         "\n4:\n\t"
9040         "ldr	x10, [%[a], x3]\n\t"
9041         "mul	x9, x10, x10\n\t"
9042         "umulh	x10, x10, x10\n\t"
9043         "adds	x6, x6, x9\n\t"
9044         "adcs	x7, x7, x10\n\t"
9045         "adc	x8, x8, xzr\n\t"
9046         "\n5:\n\t"
9047         "add	x3, x3, #8\n\t"
9048         "sub	x4, x4, #8\n\t"
9049         "cmp	x3, 384\n\t"
9050         "b.eq	3f\n\t"
9051         "cmp	x3, x4\n\t"
9052         "b.gt	3f\n\t"
9053         "cmp	x3, x5\n\t"
9054         "b.le	2b\n\t"
9055         "\n3:\n\t"
9056         "str	x6, [%[r], x5]\n\t"
9057         "mov	x6, x7\n\t"
9058         "mov	x7, x8\n\t"
9059         "mov	x8, #0\n\t"
9060         "add	x5, x5, #8\n\t"
9061         "cmp	x5, 752\n\t"
9062         "b.le	1b\n\t"
9063         "str	x6, [%[r], x5]\n\t"
9064         :
9065         : [r] "r" (tmp), [a] "r" (a)
9066         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
9067     );
9068 
9069     XMEMCPY(r, tmp, sizeof(tmp));
9070 }
9071 
9072 #endif /* WOLFSSL_SP_SMALL */
9073 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
9074 #ifdef WOLFSSL_SP_SMALL
9075 /* AND m into each word of a and store in r.
9076  *
9077  * r  A single precision integer.
9078  * a  A single precision integer.
9079  * m  Mask to AND against each digit.
9080  */
sp_3072_mask_24(sp_digit * r,const sp_digit * a,sp_digit m)9081 static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
9082 {
9083     int i;
9084 
9085     for (i=0; i<24; i++) {
9086         r[i] = a[i] & m;
9087     }
9088 }
9089 
9090 #endif /* WOLFSSL_SP_SMALL */
9091 #ifdef WOLFSSL_SP_SMALL
9092 /* Add b to a into r. (r = a + b)
9093  *
9094  * r  A single precision integer.
9095  * a  A single precision integer.
9096  * b  A single precision integer.
9097  */
sp_3072_add_24(sp_digit * r,const sp_digit * a,const sp_digit * b)9098 static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a,
9099         const sp_digit* b)
9100 {
9101     sp_digit c = 0;
9102 
9103     __asm__ __volatile__ (
9104         "add	x11, %[a], 192\n\t"
9105         "\n1:\n\t"
9106         "adds	%[c], %[c], #-1\n\t"
9107         "ldp	x3, x4, [%[a]], #16\n\t"
9108         "ldp	x5, x6, [%[a]], #16\n\t"
9109         "ldp	x7, x8, [%[b]], #16\n\t"
9110         "adcs	x3, x3, x7\n\t"
9111         "ldp	x9, x10, [%[b]], #16\n\t"
9112         "adcs	x4, x4, x8\n\t"
9113         "adcs	x5, x5, x9\n\t"
9114         "stp	x3, x4, [%[r]], #16\n\t"
9115         "adcs	x6, x6, x10\n\t"
9116         "stp	x5, x6, [%[r]], #16\n\t"
9117         "cset	%[c], cs\n\t"
9118         "cmp	%[a], x11\n\t"
9119         "b.ne	1b\n\t"
9120         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
9121         :
9122         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
9123     );
9124 
9125     return c;
9126 }
9127 
9128 #endif /* WOLFSSL_SP_SMALL */
9129 #ifdef WOLFSSL_SP_SMALL
9130 /* Sub b from a into a. (a -= b)
9131  *
9132  * a  A single precision integer.
9133  * b  A single precision integer.
9134  */
sp_3072_sub_in_place_24(sp_digit * a,const sp_digit * b)9135 static sp_digit sp_3072_sub_in_place_24(sp_digit* a, const sp_digit* b)
9136 {
9137     sp_digit c = 0;
9138 
9139     __asm__ __volatile__ (
9140         "add	x10, %[a], 192\n\t"
9141         "\n1:\n\t"
9142         "subs	%[c], xzr, %[c]\n\t"
9143         "ldp	x2, x3, [%[a]]\n\t"
9144         "ldp	x4, x5, [%[a], #16]\n\t"
9145         "ldp	x6, x7, [%[b]], #16\n\t"
9146         "sbcs	x2, x2, x6\n\t"
9147         "ldp	x8, x9, [%[b]], #16\n\t"
9148         "sbcs	x3, x3, x7\n\t"
9149         "sbcs	x4, x4, x8\n\t"
9150         "stp	x2, x3, [%[a]], #16\n\t"
9151         "sbcs	x5, x5, x9\n\t"
9152         "stp	x4, x5, [%[a]], #16\n\t"
9153         "csetm	%[c], cc\n\t"
9154         "cmp	%[a], x10\n\t"
9155         "b.ne	1b\n\t"
9156         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
9157         :
9158         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
9159     );
9160 
9161     return c;
9162 }
9163 
9164 #endif /* WOLFSSL_SP_SMALL */
9165 #ifdef WOLFSSL_SP_SMALL
9166 /* Multiply a and b into r. (r = a * b)
9167  *
9168  * r  A single precision integer.
9169  * a  A single precision integer.
9170  * b  A single precision integer.
9171  */
sp_3072_mul_24(sp_digit * r,const sp_digit * a,const sp_digit * b)9172 static void sp_3072_mul_24(sp_digit* r, const sp_digit* a, const sp_digit* b)
9173 {
9174     sp_digit tmp[48];
9175 
9176     __asm__ __volatile__ (
9177         "mov	x5, 0\n\t"
9178         "mov	x6, 0\n\t"
9179         "mov	x7, 0\n\t"
9180         "mov	x8, 0\n\t"
9181         "\n1:\n\t"
9182         "subs	x3, x5, 184\n\t"
9183         "csel	x3, xzr, x3, cc\n\t"
9184         "sub	x4, x5, x3\n\t"
9185         "\n2:\n\t"
9186         "ldr	x10, [%[a], x3]\n\t"
9187         "ldr	x11, [%[b], x4]\n\t"
9188         "mul	x9, x10, x11\n\t"
9189         "umulh	x10, x10, x11\n\t"
9190         "adds	x6, x6, x9\n\t"
9191         "adcs	x7, x7, x10\n\t"
9192         "adc	x8, x8, xzr\n\t"
9193         "add	x3, x3, #8\n\t"
9194         "sub	x4, x4, #8\n\t"
9195         "cmp	x3, 192\n\t"
9196         "b.eq	3f\n\t"
9197         "cmp	x3, x5\n\t"
9198         "b.le	2b\n\t"
9199         "\n3:\n\t"
9200         "str	x6, [%[r], x5]\n\t"
9201         "mov	x6, x7\n\t"
9202         "mov	x7, x8\n\t"
9203         "mov	x8, #0\n\t"
9204         "add	x5, x5, #8\n\t"
9205         "cmp	x5, 368\n\t"
9206         "b.le	1b\n\t"
9207         "str	x6, [%[r], x5]\n\t"
9208         :
9209         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
9210         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
9211     );
9212 
9213     XMEMCPY(r, tmp, sizeof(tmp));
9214 }
9215 
9216 /* Square a and put result in r. (r = a * a)
9217  *
9218  * r  A single precision integer.
9219  * a  A single precision integer.
9220  */
sp_3072_sqr_24(sp_digit * r,const sp_digit * a)9221 static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
9222 {
9223     sp_digit tmp[48];
9224 
9225     __asm__ __volatile__ (
9226         "mov	x6, 0\n\t"
9227         "mov	x7, 0\n\t"
9228         "mov	x8, 0\n\t"
9229         "mov	x5, 0\n\t"
9230         "\n1:\n\t"
9231         "subs	x3, x5, 184\n\t"
9232         "csel	x3, xzr, x3, cc\n\t"
9233         "sub	x4, x5, x3\n\t"
9234         "\n2:\n\t"
9235         "cmp	x4, x3\n\t"
9236         "b.eq	4f\n\t"
9237         "ldr	x10, [%[a], x3]\n\t"
9238         "ldr	x11, [%[a], x4]\n\t"
9239         "mul	x9, x10, x11\n\t"
9240         "umulh	x10, x10, x11\n\t"
9241         "adds	x6, x6, x9\n\t"
9242         "adcs	x7, x7, x10\n\t"
9243         "adc	x8, x8, xzr\n\t"
9244         "adds	x6, x6, x9\n\t"
9245         "adcs	x7, x7, x10\n\t"
9246         "adc	x8, x8, xzr\n\t"
9247         "b.al	5f\n\t"
9248         "\n4:\n\t"
9249         "ldr	x10, [%[a], x3]\n\t"
9250         "mul	x9, x10, x10\n\t"
9251         "umulh	x10, x10, x10\n\t"
9252         "adds	x6, x6, x9\n\t"
9253         "adcs	x7, x7, x10\n\t"
9254         "adc	x8, x8, xzr\n\t"
9255         "\n5:\n\t"
9256         "add	x3, x3, #8\n\t"
9257         "sub	x4, x4, #8\n\t"
9258         "cmp	x3, 192\n\t"
9259         "b.eq	3f\n\t"
9260         "cmp	x3, x4\n\t"
9261         "b.gt	3f\n\t"
9262         "cmp	x3, x5\n\t"
9263         "b.le	2b\n\t"
9264         "\n3:\n\t"
9265         "str	x6, [%[r], x5]\n\t"
9266         "mov	x6, x7\n\t"
9267         "mov	x7, x8\n\t"
9268         "mov	x8, #0\n\t"
9269         "add	x5, x5, #8\n\t"
9270         "cmp	x5, 368\n\t"
9271         "b.le	1b\n\t"
9272         "str	x6, [%[r], x5]\n\t"
9273         :
9274         : [r] "r" (tmp), [a] "r" (a)
9275         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
9276     );
9277 
9278     XMEMCPY(r, tmp, sizeof(tmp));
9279 }
9280 
9281 #endif /* WOLFSSL_SP_SMALL */
9282 #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
9283 
9284 /* Caclulate the bottom digit of -1/a mod 2^n.
9285  *
9286  * a    A single precision number.
9287  * rho  Bottom word of inverse.
9288  */
sp_3072_mont_setup(const sp_digit * a,sp_digit * rho)9289 static void sp_3072_mont_setup(const sp_digit* a, sp_digit* rho)
9290 {
9291     sp_digit x;
9292     sp_digit b;
9293 
9294     b = a[0];
9295     x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
9296     x *= 2 - b * x;               /* here x*a==1 mod 2**8 */
9297     x *= 2 - b * x;               /* here x*a==1 mod 2**16 */
9298     x *= 2 - b * x;               /* here x*a==1 mod 2**32 */
9299     x *= 2 - b * x;               /* here x*a==1 mod 2**64 */
9300 
9301     /* rho = -1/m mod b */
9302     *rho = (sp_digit)0 - x;
9303 }
9304 
9305 /* Mul a by digit b into r. (r = a * b)
9306  *
9307  * r  A single precision integer.
9308  * a  A single precision integer.
9309  * b  A single precision digit.
9310  */
sp_3072_mul_d_48(sp_digit * r,const sp_digit * a,sp_digit b)9311 static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a,
9312         sp_digit b)
9313 {
9314 #ifdef WOLFSSL_SP_SMALL
9315     __asm__ __volatile__ (
9316         "# A[0] * B\n\t"
9317         "ldr	x8, [%[a]]\n\t"
9318         "mul	x5, %[b], x8\n\t"
9319         "umulh	x3, %[b], x8\n\t"
9320         "mov	x4, 0\n\t"
9321         "str	x5, [%[r]]\n\t"
9322         "mov	x5, 0\n\t"
9323         "mov	x9, #8\n\t"
9324         "1:\n\t"
9325         "ldr	x8, [%[a], x9]\n\t"
9326         "mul	x6, %[b], x8\n\t"
9327         "umulh	x7, %[b], x8\n\t"
9328         "adds	x3, x3, x6\n\t"
9329         "adcs	x4, x4, x7\n\t"
9330         "adc	x5, xzr, xzr\n\t"
9331         "str	x3, [%[r], x9]\n\t"
9332         "mov	x3, x4\n\t"
9333         "mov	x4, x5\n\t"
9334         "mov	x5, #0\n\t"
9335         "add	x9, x9, #8\n\t"
9336         "cmp	x9, 384\n\t"
9337         "b.lt	1b\n\t"
9338         "str	x3, [%[r], 384]\n\t"
9339         :
9340         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
9341         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
9342     );
9343 #else
9344     __asm__ __volatile__ (
9345         "# A[0] * B\n\t"
9346         "ldp	x8, x9, [%[a]]\n\t"
9347         "mul	x3, %[b], x8\n\t"
9348         "umulh	x4, %[b], x8\n\t"
9349         "mov	x5, 0\n\t"
9350         "# A[1] * B\n\t"
9351         "str	x3, [%[r]]\n\t"
9352         "mov	x3, 0\n\t"
9353         "mul	x6, %[b], x9\n\t"
9354         "umulh	x7, %[b], x9\n\t"
9355         "adds	x4, x4, x6\n\t"
9356         "# A[2] * B\n\t"
9357         "ldp	x8, x9, [%[a], 16]\n\t"
9358         "str	x4, [%[r], 8]\n\t"
9359         "mov	x4, 0\n\t"
9360         "mul	x6, %[b], x8\n\t"
9361         "adcs	x5, x5, x7\n\t"
9362         "umulh	x7, %[b], x8\n\t"
9363         "adc	x3, xzr, xzr\n\t"
9364         "adds	x5, x5, x6\n\t"
9365         "# A[3] * B\n\t"
9366         "str	x5, [%[r], 16]\n\t"
9367         "mov	x5, 0\n\t"
9368         "mul	x6, %[b], x9\n\t"
9369         "adcs	x3, x3, x7\n\t"
9370         "umulh	x7, %[b], x9\n\t"
9371         "adc	x4, xzr, xzr\n\t"
9372         "adds	x3, x3, x6\n\t"
9373         "# A[4] * B\n\t"
9374         "ldp	x8, x9, [%[a], 32]\n\t"
9375         "str	x3, [%[r], 24]\n\t"
9376         "mov	x3, 0\n\t"
9377         "mul	x6, %[b], x8\n\t"
9378         "adcs	x4, x4, x7\n\t"
9379         "umulh	x7, %[b], x8\n\t"
9380         "adc	x5, xzr, xzr\n\t"
9381         "adds	x4, x4, x6\n\t"
9382         "# A[5] * B\n\t"
9383         "str	x4, [%[r], 32]\n\t"
9384         "mov	x4, 0\n\t"
9385         "mul	x6, %[b], x9\n\t"
9386         "adcs	x5, x5, x7\n\t"
9387         "umulh	x7, %[b], x9\n\t"
9388         "adc	x3, xzr, xzr\n\t"
9389         "adds	x5, x5, x6\n\t"
9390         "# A[6] * B\n\t"
9391         "ldp	x8, x9, [%[a], 48]\n\t"
9392         "str	x5, [%[r], 40]\n\t"
9393         "mov	x5, 0\n\t"
9394         "mul	x6, %[b], x8\n\t"
9395         "adcs	x3, x3, x7\n\t"
9396         "umulh	x7, %[b], x8\n\t"
9397         "adc	x4, xzr, xzr\n\t"
9398         "adds	x3, x3, x6\n\t"
9399         "# A[7] * B\n\t"
9400         "str	x3, [%[r], 48]\n\t"
9401         "mov	x3, 0\n\t"
9402         "mul	x6, %[b], x9\n\t"
9403         "adcs	x4, x4, x7\n\t"
9404         "umulh	x7, %[b], x9\n\t"
9405         "adc	x5, xzr, xzr\n\t"
9406         "adds	x4, x4, x6\n\t"
9407         "# A[8] * B\n\t"
9408         "ldp	x8, x9, [%[a], 64]\n\t"
9409         "str	x4, [%[r], 56]\n\t"
9410         "mov	x4, 0\n\t"
9411         "mul	x6, %[b], x8\n\t"
9412         "adcs	x5, x5, x7\n\t"
9413         "umulh	x7, %[b], x8\n\t"
9414         "adc	x3, xzr, xzr\n\t"
9415         "adds	x5, x5, x6\n\t"
9416         "# A[9] * B\n\t"
9417         "str	x5, [%[r], 64]\n\t"
9418         "mov	x5, 0\n\t"
9419         "mul	x6, %[b], x9\n\t"
9420         "adcs	x3, x3, x7\n\t"
9421         "umulh	x7, %[b], x9\n\t"
9422         "adc	x4, xzr, xzr\n\t"
9423         "adds	x3, x3, x6\n\t"
9424         "# A[10] * B\n\t"
9425         "ldp	x8, x9, [%[a], 80]\n\t"
9426         "str	x3, [%[r], 72]\n\t"
9427         "mov	x3, 0\n\t"
9428         "mul	x6, %[b], x8\n\t"
9429         "adcs	x4, x4, x7\n\t"
9430         "umulh	x7, %[b], x8\n\t"
9431         "adc	x5, xzr, xzr\n\t"
9432         "adds	x4, x4, x6\n\t"
9433         "# A[11] * B\n\t"
9434         "str	x4, [%[r], 80]\n\t"
9435         "mov	x4, 0\n\t"
9436         "mul	x6, %[b], x9\n\t"
9437         "adcs	x5, x5, x7\n\t"
9438         "umulh	x7, %[b], x9\n\t"
9439         "adc	x3, xzr, xzr\n\t"
9440         "adds	x5, x5, x6\n\t"
9441         "# A[12] * B\n\t"
9442         "ldp	x8, x9, [%[a], 96]\n\t"
9443         "str	x5, [%[r], 88]\n\t"
9444         "mov	x5, 0\n\t"
9445         "mul	x6, %[b], x8\n\t"
9446         "adcs	x3, x3, x7\n\t"
9447         "umulh	x7, %[b], x8\n\t"
9448         "adc	x4, xzr, xzr\n\t"
9449         "adds	x3, x3, x6\n\t"
9450         "# A[13] * B\n\t"
9451         "str	x3, [%[r], 96]\n\t"
9452         "mov	x3, 0\n\t"
9453         "mul	x6, %[b], x9\n\t"
9454         "adcs	x4, x4, x7\n\t"
9455         "umulh	x7, %[b], x9\n\t"
9456         "adc	x5, xzr, xzr\n\t"
9457         "adds	x4, x4, x6\n\t"
9458         "# A[14] * B\n\t"
9459         "ldp	x8, x9, [%[a], 112]\n\t"
9460         "str	x4, [%[r], 104]\n\t"
9461         "mov	x4, 0\n\t"
9462         "mul	x6, %[b], x8\n\t"
9463         "adcs	x5, x5, x7\n\t"
9464         "umulh	x7, %[b], x8\n\t"
9465         "adc	x3, xzr, xzr\n\t"
9466         "adds	x5, x5, x6\n\t"
9467         "# A[15] * B\n\t"
9468         "str	x5, [%[r], 112]\n\t"
9469         "mov	x5, 0\n\t"
9470         "mul	x6, %[b], x9\n\t"
9471         "adcs	x3, x3, x7\n\t"
9472         "umulh	x7, %[b], x9\n\t"
9473         "adc	x4, xzr, xzr\n\t"
9474         "adds	x3, x3, x6\n\t"
9475         "# A[16] * B\n\t"
9476         "ldp	x8, x9, [%[a], 128]\n\t"
9477         "str	x3, [%[r], 120]\n\t"
9478         "mov	x3, 0\n\t"
9479         "mul	x6, %[b], x8\n\t"
9480         "adcs	x4, x4, x7\n\t"
9481         "umulh	x7, %[b], x8\n\t"
9482         "adc	x5, xzr, xzr\n\t"
9483         "adds	x4, x4, x6\n\t"
9484         "# A[17] * B\n\t"
9485         "str	x4, [%[r], 128]\n\t"
9486         "mov	x4, 0\n\t"
9487         "mul	x6, %[b], x9\n\t"
9488         "adcs	x5, x5, x7\n\t"
9489         "umulh	x7, %[b], x9\n\t"
9490         "adc	x3, xzr, xzr\n\t"
9491         "adds	x5, x5, x6\n\t"
9492         "# A[18] * B\n\t"
9493         "ldp	x8, x9, [%[a], 144]\n\t"
9494         "str	x5, [%[r], 136]\n\t"
9495         "mov	x5, 0\n\t"
9496         "mul	x6, %[b], x8\n\t"
9497         "adcs	x3, x3, x7\n\t"
9498         "umulh	x7, %[b], x8\n\t"
9499         "adc	x4, xzr, xzr\n\t"
9500         "adds	x3, x3, x6\n\t"
9501         "# A[19] * B\n\t"
9502         "str	x3, [%[r], 144]\n\t"
9503         "mov	x3, 0\n\t"
9504         "mul	x6, %[b], x9\n\t"
9505         "adcs	x4, x4, x7\n\t"
9506         "umulh	x7, %[b], x9\n\t"
9507         "adc	x5, xzr, xzr\n\t"
9508         "adds	x4, x4, x6\n\t"
9509         "# A[20] * B\n\t"
9510         "ldp	x8, x9, [%[a], 160]\n\t"
9511         "str	x4, [%[r], 152]\n\t"
9512         "mov	x4, 0\n\t"
9513         "mul	x6, %[b], x8\n\t"
9514         "adcs	x5, x5, x7\n\t"
9515         "umulh	x7, %[b], x8\n\t"
9516         "adc	x3, xzr, xzr\n\t"
9517         "adds	x5, x5, x6\n\t"
9518         "# A[21] * B\n\t"
9519         "str	x5, [%[r], 160]\n\t"
9520         "mov	x5, 0\n\t"
9521         "mul	x6, %[b], x9\n\t"
9522         "adcs	x3, x3, x7\n\t"
9523         "umulh	x7, %[b], x9\n\t"
9524         "adc	x4, xzr, xzr\n\t"
9525         "adds	x3, x3, x6\n\t"
9526         "# A[22] * B\n\t"
9527         "ldp	x8, x9, [%[a], 176]\n\t"
9528         "str	x3, [%[r], 168]\n\t"
9529         "mov	x3, 0\n\t"
9530         "mul	x6, %[b], x8\n\t"
9531         "adcs	x4, x4, x7\n\t"
9532         "umulh	x7, %[b], x8\n\t"
9533         "adc	x5, xzr, xzr\n\t"
9534         "adds	x4, x4, x6\n\t"
9535         "# A[23] * B\n\t"
9536         "str	x4, [%[r], 176]\n\t"
9537         "mov	x4, 0\n\t"
9538         "mul	x6, %[b], x9\n\t"
9539         "adcs	x5, x5, x7\n\t"
9540         "umulh	x7, %[b], x9\n\t"
9541         "adc	x3, xzr, xzr\n\t"
9542         "adds	x5, x5, x6\n\t"
9543         "# A[24] * B\n\t"
9544         "ldp	x8, x9, [%[a], 192]\n\t"
9545         "str	x5, [%[r], 184]\n\t"
9546         "mov	x5, 0\n\t"
9547         "mul	x6, %[b], x8\n\t"
9548         "adcs	x3, x3, x7\n\t"
9549         "umulh	x7, %[b], x8\n\t"
9550         "adc	x4, xzr, xzr\n\t"
9551         "adds	x3, x3, x6\n\t"
9552         "# A[25] * B\n\t"
9553         "str	x3, [%[r], 192]\n\t"
9554         "mov	x3, 0\n\t"
9555         "mul	x6, %[b], x9\n\t"
9556         "adcs	x4, x4, x7\n\t"
9557         "umulh	x7, %[b], x9\n\t"
9558         "adc	x5, xzr, xzr\n\t"
9559         "adds	x4, x4, x6\n\t"
9560         "# A[26] * B\n\t"
9561         "ldp	x8, x9, [%[a], 208]\n\t"
9562         "str	x4, [%[r], 200]\n\t"
9563         "mov	x4, 0\n\t"
9564         "mul	x6, %[b], x8\n\t"
9565         "adcs	x5, x5, x7\n\t"
9566         "umulh	x7, %[b], x8\n\t"
9567         "adc	x3, xzr, xzr\n\t"
9568         "adds	x5, x5, x6\n\t"
9569         "# A[27] * B\n\t"
9570         "str	x5, [%[r], 208]\n\t"
9571         "mov	x5, 0\n\t"
9572         "mul	x6, %[b], x9\n\t"
9573         "adcs	x3, x3, x7\n\t"
9574         "umulh	x7, %[b], x9\n\t"
9575         "adc	x4, xzr, xzr\n\t"
9576         "adds	x3, x3, x6\n\t"
9577         "# A[28] * B\n\t"
9578         "ldp	x8, x9, [%[a], 224]\n\t"
9579         "str	x3, [%[r], 216]\n\t"
9580         "mov	x3, 0\n\t"
9581         "mul	x6, %[b], x8\n\t"
9582         "adcs	x4, x4, x7\n\t"
9583         "umulh	x7, %[b], x8\n\t"
9584         "adc	x5, xzr, xzr\n\t"
9585         "adds	x4, x4, x6\n\t"
9586         "# A[29] * B\n\t"
9587         "str	x4, [%[r], 224]\n\t"
9588         "mov	x4, 0\n\t"
9589         "mul	x6, %[b], x9\n\t"
9590         "adcs	x5, x5, x7\n\t"
9591         "umulh	x7, %[b], x9\n\t"
9592         "adc	x3, xzr, xzr\n\t"
9593         "adds	x5, x5, x6\n\t"
9594         "# A[30] * B\n\t"
9595         "ldp	x8, x9, [%[a], 240]\n\t"
9596         "str	x5, [%[r], 232]\n\t"
9597         "mov	x5, 0\n\t"
9598         "mul	x6, %[b], x8\n\t"
9599         "adcs	x3, x3, x7\n\t"
9600         "umulh	x7, %[b], x8\n\t"
9601         "adc	x4, xzr, xzr\n\t"
9602         "adds	x3, x3, x6\n\t"
9603         "# A[31] * B\n\t"
9604         "str	x3, [%[r], 240]\n\t"
9605         "mov	x3, 0\n\t"
9606         "mul	x6, %[b], x9\n\t"
9607         "adcs	x4, x4, x7\n\t"
9608         "umulh	x7, %[b], x9\n\t"
9609         "adc	x5, xzr, xzr\n\t"
9610         "adds	x4, x4, x6\n\t"
9611         "# A[32] * B\n\t"
9612         "ldp	x8, x9, [%[a], 256]\n\t"
9613         "str	x4, [%[r], 248]\n\t"
9614         "mov	x4, 0\n\t"
9615         "mul	x6, %[b], x8\n\t"
9616         "adcs	x5, x5, x7\n\t"
9617         "umulh	x7, %[b], x8\n\t"
9618         "adc	x3, xzr, xzr\n\t"
9619         "adds	x5, x5, x6\n\t"
9620         "# A[33] * B\n\t"
9621         "str	x5, [%[r], 256]\n\t"
9622         "mov	x5, 0\n\t"
9623         "mul	x6, %[b], x9\n\t"
9624         "adcs	x3, x3, x7\n\t"
9625         "umulh	x7, %[b], x9\n\t"
9626         "adc	x4, xzr, xzr\n\t"
9627         "adds	x3, x3, x6\n\t"
9628         "# A[34] * B\n\t"
9629         "ldp	x8, x9, [%[a], 272]\n\t"
9630         "str	x3, [%[r], 264]\n\t"
9631         "mov	x3, 0\n\t"
9632         "mul	x6, %[b], x8\n\t"
9633         "adcs	x4, x4, x7\n\t"
9634         "umulh	x7, %[b], x8\n\t"
9635         "adc	x5, xzr, xzr\n\t"
9636         "adds	x4, x4, x6\n\t"
9637         "# A[35] * B\n\t"
9638         "str	x4, [%[r], 272]\n\t"
9639         "mov	x4, 0\n\t"
9640         "mul	x6, %[b], x9\n\t"
9641         "adcs	x5, x5, x7\n\t"
9642         "umulh	x7, %[b], x9\n\t"
9643         "adc	x3, xzr, xzr\n\t"
9644         "adds	x5, x5, x6\n\t"
9645         "# A[36] * B\n\t"
9646         "ldp	x8, x9, [%[a], 288]\n\t"
9647         "str	x5, [%[r], 280]\n\t"
9648         "mov	x5, 0\n\t"
9649         "mul	x6, %[b], x8\n\t"
9650         "adcs	x3, x3, x7\n\t"
9651         "umulh	x7, %[b], x8\n\t"
9652         "adc	x4, xzr, xzr\n\t"
9653         "adds	x3, x3, x6\n\t"
9654         "# A[37] * B\n\t"
9655         "str	x3, [%[r], 288]\n\t"
9656         "mov	x3, 0\n\t"
9657         "mul	x6, %[b], x9\n\t"
9658         "adcs	x4, x4, x7\n\t"
9659         "umulh	x7, %[b], x9\n\t"
9660         "adc	x5, xzr, xzr\n\t"
9661         "adds	x4, x4, x6\n\t"
9662         "# A[38] * B\n\t"
9663         "ldp	x8, x9, [%[a], 304]\n\t"
9664         "str	x4, [%[r], 296]\n\t"
9665         "mov	x4, 0\n\t"
9666         "mul	x6, %[b], x8\n\t"
9667         "adcs	x5, x5, x7\n\t"
9668         "umulh	x7, %[b], x8\n\t"
9669         "adc	x3, xzr, xzr\n\t"
9670         "adds	x5, x5, x6\n\t"
9671         "# A[39] * B\n\t"
9672         "str	x5, [%[r], 304]\n\t"
9673         "mov	x5, 0\n\t"
9674         "mul	x6, %[b], x9\n\t"
9675         "adcs	x3, x3, x7\n\t"
9676         "umulh	x7, %[b], x9\n\t"
9677         "adc	x4, xzr, xzr\n\t"
9678         "adds	x3, x3, x6\n\t"
9679         "# A[40] * B\n\t"
9680         "ldp	x8, x9, [%[a], 320]\n\t"
9681         "str	x3, [%[r], 312]\n\t"
9682         "mov	x3, 0\n\t"
9683         "mul	x6, %[b], x8\n\t"
9684         "adcs	x4, x4, x7\n\t"
9685         "umulh	x7, %[b], x8\n\t"
9686         "adc	x5, xzr, xzr\n\t"
9687         "adds	x4, x4, x6\n\t"
9688         "# A[41] * B\n\t"
9689         "str	x4, [%[r], 320]\n\t"
9690         "mov	x4, 0\n\t"
9691         "mul	x6, %[b], x9\n\t"
9692         "adcs	x5, x5, x7\n\t"
9693         "umulh	x7, %[b], x9\n\t"
9694         "adc	x3, xzr, xzr\n\t"
9695         "adds	x5, x5, x6\n\t"
9696         "# A[42] * B\n\t"
9697         "ldp	x8, x9, [%[a], 336]\n\t"
9698         "str	x5, [%[r], 328]\n\t"
9699         "mov	x5, 0\n\t"
9700         "mul	x6, %[b], x8\n\t"
9701         "adcs	x3, x3, x7\n\t"
9702         "umulh	x7, %[b], x8\n\t"
9703         "adc	x4, xzr, xzr\n\t"
9704         "adds	x3, x3, x6\n\t"
9705         "# A[43] * B\n\t"
9706         "str	x3, [%[r], 336]\n\t"
9707         "mov	x3, 0\n\t"
9708         "mul	x6, %[b], x9\n\t"
9709         "adcs	x4, x4, x7\n\t"
9710         "umulh	x7, %[b], x9\n\t"
9711         "adc	x5, xzr, xzr\n\t"
9712         "adds	x4, x4, x6\n\t"
9713         "# A[44] * B\n\t"
9714         "ldp	x8, x9, [%[a], 352]\n\t"
9715         "str	x4, [%[r], 344]\n\t"
9716         "mov	x4, 0\n\t"
9717         "mul	x6, %[b], x8\n\t"
9718         "adcs	x5, x5, x7\n\t"
9719         "umulh	x7, %[b], x8\n\t"
9720         "adc	x3, xzr, xzr\n\t"
9721         "adds	x5, x5, x6\n\t"
9722         "# A[45] * B\n\t"
9723         "str	x5, [%[r], 352]\n\t"
9724         "mov	x5, 0\n\t"
9725         "mul	x6, %[b], x9\n\t"
9726         "adcs	x3, x3, x7\n\t"
9727         "umulh	x7, %[b], x9\n\t"
9728         "adc	x4, xzr, xzr\n\t"
9729         "adds	x3, x3, x6\n\t"
9730         "# A[46] * B\n\t"
9731         "ldp	x8, x9, [%[a], 368]\n\t"
9732         "str	x3, [%[r], 360]\n\t"
9733         "mov	x3, 0\n\t"
9734         "mul	x6, %[b], x8\n\t"
9735         "adcs	x4, x4, x7\n\t"
9736         "umulh	x7, %[b], x8\n\t"
9737         "adc	x5, xzr, xzr\n\t"
9738         "adds	x4, x4, x6\n\t"
9739         "# A[47] * B\n\t"
9740         "str	x4, [%[r], 368]\n\t"
9741         "mul	x6, %[b], x9\n\t"
9742         "adcs	x5, x5, x7\n\t"
9743         "umulh	x7, %[b], x9\n\t"
9744         "adc	x3, xzr, xzr\n\t"
9745         "adds	x5, x5, x6\n\t"
9746         "adc	x3, x3, x7\n\t"
9747         "stp	x5, x3, [%[r], 376]\n\t"
9748         :
9749         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
9750         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
9751     );
9752 #endif
9753 }
9754 
9755 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
9756 /* r = 2^n mod m where n is the number of bits to reduce by.
9757  * Given m must be 3072 bits, just need to subtract.
9758  *
9759  * r  A single precision number.
9760  * m  A single precision number.
9761  */
sp_3072_mont_norm_24(sp_digit * r,const sp_digit * m)9762 static void sp_3072_mont_norm_24(sp_digit* r, const sp_digit* m)
9763 {
9764     XMEMSET(r, 0, sizeof(sp_digit) * 24);
9765 
9766     /* r = 2^n mod m */
9767     sp_3072_sub_in_place_24(r, m);
9768 }
9769 
9770 /* Reduce the number back to 3072 bits using Montgomery reduction.
9771  *
9772  * a   A single precision number to reduce in place.
9773  * m   The single precision number representing the modulus.
9774  * mp  The digit representing the negative inverse of m mod 2^n.
9775  */
sp_3072_mont_reduce_24(sp_digit * a,const sp_digit * m,sp_digit mp)9776 SP_NOINLINE static void sp_3072_mont_reduce_24(sp_digit* a, const sp_digit* m,
9777         sp_digit mp)
9778 {
9779 
9780     __asm__ __volatile__ (
9781         "ldp	x14, x15, [%[m], 0]\n\t"
9782         "ldp	x16, x17, [%[m], 16]\n\t"
9783         "ldp	x19, x20, [%[m], 32]\n\t"
9784         "ldp	x21, x22, [%[m], 48]\n\t"
9785         "ldp	x23, x24, [%[m], 64]\n\t"
9786         "ldp	x25, x26, [%[m], 80]\n\t"
9787         "ldp	x27, x28, [%[m], 96]\n\t"
9788         "mov	x3, xzr\n\t"
9789         "# i = 24\n\t"
9790         "mov	x4, 24\n\t"
9791         "ldp	x12, x13, [%[a], 0]\n\t"
9792         "\n1:\n\t"
9793         "# mu = a[i] * mp\n\t"
9794         "mul	x9, %[mp], x12\n\t"
9795         "# a[i+0] += m[0] * mu\n\t"
9796         "mul	x7, x14, x9\n\t"
9797         "umulh	x8, x14, x9\n\t"
9798         "adds	x12, x12, x7\n\t"
9799         "# a[i+1] += m[1] * mu\n\t"
9800         "mul	x7, x15, x9\n\t"
9801         "adc	x6, x8, xzr\n\t"
9802         "umulh	x8, x15, x9\n\t"
9803         "adds	x12, x13, x7\n\t"
9804         "# a[i+2] += m[2] * mu\n\t"
9805         "ldr	x13, [%[a], 16]\n\t"
9806         "adc	x5, x8, xzr\n\t"
9807         "mul	x7, x16, x9\n\t"
9808         "adds	x12, x12, x6\n\t"
9809         "umulh	x8, x16, x9\n\t"
9810         "adc	x5, x5, xzr\n\t"
9811         "adds	x13, x13, x7\n\t"
9812         "# a[i+3] += m[3] * mu\n\t"
9813         "ldr	x10, [%[a], 24]\n\t"
9814         "adc	x6, x8, xzr\n\t"
9815         "mul	x7, x17, x9\n\t"
9816         "adds	x13, x13, x5\n\t"
9817         "umulh	x8, x17, x9\n\t"
9818         "adc	x6, x6, xzr\n\t"
9819         "adds	x10, x10, x7\n\t"
9820         "# a[i+4] += m[4] * mu\n\t"
9821         "ldr	x11, [%[a], 32]\n\t"
9822         "adc	x5, x8, xzr\n\t"
9823         "adds	x10, x10, x6\n\t"
9824         "mul	x7, x19, x9\n\t"
9825         "adc	x5, x5, xzr\n\t"
9826         "umulh	x8, x19, x9\n\t"
9827         "str	x10, [%[a], 24]\n\t"
9828         "adds	x11, x11, x7\n\t"
9829         "# a[i+5] += m[5] * mu\n\t"
9830         "ldr	x10, [%[a], 40]\n\t"
9831         "adc	x6, x8, xzr\n\t"
9832         "adds	x11, x11, x5\n\t"
9833         "mul	x7, x20, x9\n\t"
9834         "adc	x6, x6, xzr\n\t"
9835         "umulh	x8, x20, x9\n\t"
9836         "str	x11, [%[a], 32]\n\t"
9837         "adds	x10, x10, x7\n\t"
9838         "# a[i+6] += m[6] * mu\n\t"
9839         "ldr	x11, [%[a], 48]\n\t"
9840         "adc	x5, x8, xzr\n\t"
9841         "adds	x10, x10, x6\n\t"
9842         "mul	x7, x21, x9\n\t"
9843         "adc	x5, x5, xzr\n\t"
9844         "umulh	x8, x21, x9\n\t"
9845         "str	x10, [%[a], 40]\n\t"
9846         "adds	x11, x11, x7\n\t"
9847         "# a[i+7] += m[7] * mu\n\t"
9848         "ldr	x10, [%[a], 56]\n\t"
9849         "adc	x6, x8, xzr\n\t"
9850         "adds	x11, x11, x5\n\t"
9851         "mul	x7, x22, x9\n\t"
9852         "adc	x6, x6, xzr\n\t"
9853         "umulh	x8, x22, x9\n\t"
9854         "str	x11, [%[a], 48]\n\t"
9855         "adds	x10, x10, x7\n\t"
9856         "# a[i+8] += m[8] * mu\n\t"
9857         "ldr	x11, [%[a], 64]\n\t"
9858         "adc	x5, x8, xzr\n\t"
9859         "adds	x10, x10, x6\n\t"
9860         "mul	x7, x23, x9\n\t"
9861         "adc	x5, x5, xzr\n\t"
9862         "umulh	x8, x23, x9\n\t"
9863         "str	x10, [%[a], 56]\n\t"
9864         "adds	x11, x11, x7\n\t"
9865         "# a[i+9] += m[9] * mu\n\t"
9866         "ldr	x10, [%[a], 72]\n\t"
9867         "adc	x6, x8, xzr\n\t"
9868         "adds	x11, x11, x5\n\t"
9869         "mul	x7, x24, x9\n\t"
9870         "adc	x6, x6, xzr\n\t"
9871         "umulh	x8, x24, x9\n\t"
9872         "str	x11, [%[a], 64]\n\t"
9873         "adds	x10, x10, x7\n\t"
9874         "# a[i+10] += m[10] * mu\n\t"
9875         "ldr	x11, [%[a], 80]\n\t"
9876         "adc	x5, x8, xzr\n\t"
9877         "adds	x10, x10, x6\n\t"
9878         "mul	x7, x25, x9\n\t"
9879         "adc	x5, x5, xzr\n\t"
9880         "umulh	x8, x25, x9\n\t"
9881         "str	x10, [%[a], 72]\n\t"
9882         "adds	x11, x11, x7\n\t"
9883         "# a[i+11] += m[11] * mu\n\t"
9884         "ldr	x10, [%[a], 88]\n\t"
9885         "adc	x6, x8, xzr\n\t"
9886         "adds	x11, x11, x5\n\t"
9887         "mul	x7, x26, x9\n\t"
9888         "adc	x6, x6, xzr\n\t"
9889         "umulh	x8, x26, x9\n\t"
9890         "str	x11, [%[a], 80]\n\t"
9891         "adds	x10, x10, x7\n\t"
9892         "# a[i+12] += m[12] * mu\n\t"
9893         "ldr	x11, [%[a], 96]\n\t"
9894         "adc	x5, x8, xzr\n\t"
9895         "adds	x10, x10, x6\n\t"
9896         "mul	x7, x27, x9\n\t"
9897         "adc	x5, x5, xzr\n\t"
9898         "umulh	x8, x27, x9\n\t"
9899         "str	x10, [%[a], 88]\n\t"
9900         "adds	x11, x11, x7\n\t"
9901         "# a[i+13] += m[13] * mu\n\t"
9902         "ldr	x10, [%[a], 104]\n\t"
9903         "adc	x6, x8, xzr\n\t"
9904         "adds	x11, x11, x5\n\t"
9905         "mul	x7, x28, x9\n\t"
9906         "adc	x6, x6, xzr\n\t"
9907         "umulh	x8, x28, x9\n\t"
9908         "str	x11, [%[a], 96]\n\t"
9909         "adds	x10, x10, x7\n\t"
9910         "# a[i+14] += m[14] * mu\n\t"
9911         "ldr	x11, [%[a], 112]\n\t"
9912         "adc	x5, x8, xzr\n\t"
9913         "ldr	x8, [%[m], 112]\n\t"
9914         "adds	x10, x10, x6\n\t"
9915         "mul	x7, x8, x9\n\t"
9916         "adc	x5, x5, xzr\n\t"
9917         "umulh	x8, x8, x9\n\t"
9918         "str	x10, [%[a], 104]\n\t"
9919         "adds	x11, x11, x7\n\t"
9920         "# a[i+15] += m[15] * mu\n\t"
9921         "ldr	x10, [%[a], 120]\n\t"
9922         "adc	x6, x8, xzr\n\t"
9923         "ldr	x8, [%[m], 120]\n\t"
9924         "adds	x11, x11, x5\n\t"
9925         "mul	x7, x8, x9\n\t"
9926         "adc	x6, x6, xzr\n\t"
9927         "umulh	x8, x8, x9\n\t"
9928         "str	x11, [%[a], 112]\n\t"
9929         "adds	x10, x10, x7\n\t"
9930         "# a[i+16] += m[16] * mu\n\t"
9931         "ldr	x11, [%[a], 128]\n\t"
9932         "adc	x5, x8, xzr\n\t"
9933         "ldr	x8, [%[m], 128]\n\t"
9934         "adds	x10, x10, x6\n\t"
9935         "mul	x7, x8, x9\n\t"
9936         "adc	x5, x5, xzr\n\t"
9937         "umulh	x8, x8, x9\n\t"
9938         "str	x10, [%[a], 120]\n\t"
9939         "adds	x11, x11, x7\n\t"
9940         "# a[i+17] += m[17] * mu\n\t"
9941         "ldr	x10, [%[a], 136]\n\t"
9942         "adc	x6, x8, xzr\n\t"
9943         "ldr	x8, [%[m], 136]\n\t"
9944         "adds	x11, x11, x5\n\t"
9945         "mul	x7, x8, x9\n\t"
9946         "adc	x6, x6, xzr\n\t"
9947         "umulh	x8, x8, x9\n\t"
9948         "str	x11, [%[a], 128]\n\t"
9949         "adds	x10, x10, x7\n\t"
9950         "# a[i+18] += m[18] * mu\n\t"
9951         "ldr	x11, [%[a], 144]\n\t"
9952         "adc	x5, x8, xzr\n\t"
9953         "ldr	x8, [%[m], 144]\n\t"
9954         "adds	x10, x10, x6\n\t"
9955         "mul	x7, x8, x9\n\t"
9956         "adc	x5, x5, xzr\n\t"
9957         "umulh	x8, x8, x9\n\t"
9958         "str	x10, [%[a], 136]\n\t"
9959         "adds	x11, x11, x7\n\t"
9960         "# a[i+19] += m[19] * mu\n\t"
9961         "ldr	x10, [%[a], 152]\n\t"
9962         "adc	x6, x8, xzr\n\t"
9963         "ldr	x8, [%[m], 152]\n\t"
9964         "adds	x11, x11, x5\n\t"
9965         "mul	x7, x8, x9\n\t"
9966         "adc	x6, x6, xzr\n\t"
9967         "umulh	x8, x8, x9\n\t"
9968         "str	x11, [%[a], 144]\n\t"
9969         "adds	x10, x10, x7\n\t"
9970         "# a[i+20] += m[20] * mu\n\t"
9971         "ldr	x11, [%[a], 160]\n\t"
9972         "adc	x5, x8, xzr\n\t"
9973         "ldr	x8, [%[m], 160]\n\t"
9974         "adds	x10, x10, x6\n\t"
9975         "mul	x7, x8, x9\n\t"
9976         "adc	x5, x5, xzr\n\t"
9977         "umulh	x8, x8, x9\n\t"
9978         "str	x10, [%[a], 152]\n\t"
9979         "adds	x11, x11, x7\n\t"
9980         "# a[i+21] += m[21] * mu\n\t"
9981         "ldr	x10, [%[a], 168]\n\t"
9982         "adc	x6, x8, xzr\n\t"
9983         "ldr	x8, [%[m], 168]\n\t"
9984         "adds	x11, x11, x5\n\t"
9985         "mul	x7, x8, x9\n\t"
9986         "adc	x6, x6, xzr\n\t"
9987         "umulh	x8, x8, x9\n\t"
9988         "str	x11, [%[a], 160]\n\t"
9989         "adds	x10, x10, x7\n\t"
9990         "# a[i+22] += m[22] * mu\n\t"
9991         "ldr	x11, [%[a], 176]\n\t"
9992         "adc	x5, x8, xzr\n\t"
9993         "ldr	x8, [%[m], 176]\n\t"
9994         "adds	x10, x10, x6\n\t"
9995         "mul	x7, x8, x9\n\t"
9996         "adc	x5, x5, xzr\n\t"
9997         "umulh	x8, x8, x9\n\t"
9998         "str	x10, [%[a], 168]\n\t"
9999         "adds	x11, x11, x7\n\t"
10000         "# a[i+23] += m[23] * mu\n\t"
10001         "ldr	x10, [%[a], 184]\n\t"
10002         "adc	x6, x8, xzr\n\t"
10003         "ldr	x8, [%[m], 184]\n\t"
10004         "adds	x11, x11, x5\n\t"
10005         "mul	x7, x8, x9\n\t"
10006         "adc	x6, x6, xzr\n\t"
10007         "umulh	x8, x8, x9\n\t"
10008         "adds	x6, x6, x7\n\t"
10009         "adcs	x8, x8, x3\n\t"
10010         "str	x11, [%[a], 176]\n\t"
10011         "cset  x3, cs\n\t"
10012         "adds	x10, x10, x6\n\t"
10013         "ldr	x11, [%[a], 192]\n\t"
10014         "str	x10, [%[a], 184]\n\t"
10015         "adcs	x11, x11, x8\n\t"
10016         "str	x11, [%[a], 192]\n\t"
10017         "adc	x3, x3, xzr\n\t"
10018         "subs	x4, x4, 1\n\t"
10019         "add	%[a], %[a], 8\n\t"
10020         "bne	1b\n\t"
10021         "# x12 and x13 hold a[0] and a[1]\n\t"
10022         "# Create mask\n\t"
10023         "neg       x3, x3\n\t"
10024         "mov   x9, %[a]\n\t"
10025         "sub   %[a], %[a], 192\n\t"
10026         "# Subtract masked modulus\n\t"
10027         "# x12 and x13 hold a[0] and a[1]\n\t"
10028         "and       x14, x14, x3\n\t"
10029         "ldp       x11, x10, [x9, 16]\n\t"
10030         "and       x15, x15, x3\n\t"
10031         "subs      x12, x12, x14\n\t"
10032         "and       x16, x16, x3\n\t"
10033         "sbcs      x13, x13, x15\n\t"
10034         "and       x17, x17, x3\n\t"
10035         "sbcs      x11, x11, x16\n\t"
10036         "stp       x12, x13, [%[a], 0]\n\t"
10037         "sbcs      x10, x10, x17\n\t"
10038         "stp       x11, x10, [%[a], 16]\n\t"
10039         "ldp       x12, x13, [x9, 32]\n\t"
10040         "and       x19, x19, x3\n\t"
10041         "ldp       x11, x10, [x9, 48]\n\t"
10042         "and       x20, x20, x3\n\t"
10043         "sbcs      x12, x12, x19\n\t"
10044         "and       x21, x21, x3\n\t"
10045         "sbcs      x13, x13, x20\n\t"
10046         "and       x22, x22, x3\n\t"
10047         "sbcs      x11, x11, x21\n\t"
10048         "stp       x12, x13, [%[a], 32]\n\t"
10049         "sbcs      x10, x10, x22\n\t"
10050         "stp       x11, x10, [%[a], 48]\n\t"
10051         "ldp       x12, x13, [x9, 64]\n\t"
10052         "and       x23, x23, x3\n\t"
10053         "ldp       x11, x10, [x9, 80]\n\t"
10054         "and       x24, x24, x3\n\t"
10055         "sbcs      x12, x12, x23\n\t"
10056         "and       x25, x25, x3\n\t"
10057         "sbcs      x13, x13, x24\n\t"
10058         "and       x26, x26, x3\n\t"
10059         "sbcs      x11, x11, x25\n\t"
10060         "stp       x12, x13, [%[a], 64]\n\t"
10061         "sbcs      x10, x10, x26\n\t"
10062         "stp       x11, x10, [%[a], 80]\n\t"
10063         "ldp       x7, x8, [%[m], 112]\n\t"
10064         "ldp       x12, x13, [x9, 96]\n\t"
10065         "and       x27, x27, x3\n\t"
10066         "ldp       x11, x10, [x9, 112]\n\t"
10067         "and       x28, x28, x3\n\t"
10068         "sbcs      x12, x12, x27\n\t"
10069         "and       x7, x7, x3\n\t"
10070         "sbcs      x13, x13, x28\n\t"
10071         "and       x8, x8, x3\n\t"
10072         "sbcs      x11, x11, x7\n\t"
10073         "stp       x12, x13, [%[a], 96]\n\t"
10074         "sbcs      x10, x10, x8\n\t"
10075         "stp       x11, x10, [%[a], 112]\n\t"
10076         "ldp       x5, x6, [%[m], 128]\n\t"
10077         "ldp       x7, x8, [%[m], 144]\n\t"
10078         "ldp       x12, x13, [x9, 128]\n\t"
10079         "and       x5, x5, x3\n\t"
10080         "ldp       x11, x10, [x9, 144]\n\t"
10081         "and       x6, x6, x3\n\t"
10082         "sbcs      x12, x12, x5\n\t"
10083         "and       x7, x7, x3\n\t"
10084         "sbcs      x13, x13, x6\n\t"
10085         "and       x8, x8, x3\n\t"
10086         "sbcs      x11, x11, x7\n\t"
10087         "stp       x12, x13, [%[a], 128]\n\t"
10088         "sbcs      x10, x10, x8\n\t"
10089         "stp       x11, x10, [%[a], 144]\n\t"
10090         "ldp       x5, x6, [%[m], 160]\n\t"
10091         "ldp       x7, x8, [%[m], 176]\n\t"
10092         "ldp       x12, x13, [x9, 160]\n\t"
10093         "and       x5, x5, x3\n\t"
10094         "ldp       x11, x10, [x9, 176]\n\t"
10095         "and       x6, x6, x3\n\t"
10096         "sbcs      x12, x12, x5\n\t"
10097         "and       x7, x7, x3\n\t"
10098         "sbcs      x13, x13, x6\n\t"
10099         "and       x8, x8, x3\n\t"
10100         "sbcs      x11, x11, x7\n\t"
10101         "stp       x12, x13, [%[a], 160]\n\t"
10102         "sbcs      x10, x10, x8\n\t"
10103         "stp       x11, x10, [%[a], 176]\n\t"
10104         : [a] "+r" (a)
10105         : [m] "r" (m), [mp] "r" (mp)
10106         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
10107     );
10108 
10109 }
10110 
10111 /* Multiply two Montgomery form numbers mod the modulus (prime).
10112  * (r = a * b mod m)
10113  *
10114  * r   Result of multiplication.
10115  * a   First number to multiply in Montgomery form.
10116  * b   Second number to multiply in Montgomery form.
10117  * m   Modulus (prime).
10118  * mp  Montgomery mulitplier.
10119  */
sp_3072_mont_mul_24(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m,sp_digit mp)10120 static void sp_3072_mont_mul_24(sp_digit* r, const sp_digit* a,
10121         const sp_digit* b, const sp_digit* m, sp_digit mp)
10122 {
10123     sp_3072_mul_24(r, a, b);
10124     sp_3072_mont_reduce_24(r, m, mp);
10125 }
10126 
10127 /* Square the Montgomery form number. (r = a * a mod m)
10128  *
10129  * r   Result of squaring.
10130  * a   Number to square in Montgomery form.
10131  * m   Modulus (prime).
10132  * mp  Montgomery mulitplier.
10133  */
sp_3072_mont_sqr_24(sp_digit * r,const sp_digit * a,const sp_digit * m,sp_digit mp)10134 static void sp_3072_mont_sqr_24(sp_digit* r, const sp_digit* a,
10135         const sp_digit* m, sp_digit mp)
10136 {
10137     sp_3072_sqr_24(r, a);
10138     sp_3072_mont_reduce_24(r, m, mp);
10139 }
10140 
10141 /* Conditionally subtract b from a using the mask m.
10142  * m is -1 to subtract and 0 when not copying.
10143  *
10144  * r  A single precision number representing condition subtract result.
10145  * a  A single precision number to subtract from.
10146  * b  A single precision number to subtract.
10147  * m  Mask value to apply.
10148  */
sp_3072_cond_sub_24(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)10149 static sp_digit sp_3072_cond_sub_24(sp_digit* r, const sp_digit* a, const sp_digit* b,
10150         sp_digit m)
10151 {
10152 #ifdef WOLFSSL_SP_SMALL
10153     sp_digit c = 0;
10154 
10155     __asm__ __volatile__ (
10156         "mov	x8, #0\n\t"
10157         "1:\n\t"
10158         "subs	%[c], xzr, %[c]\n\t"
10159         "ldr	x4, [%[a], x8]\n\t"
10160         "ldr	x5, [%[b], x8]\n\t"
10161         "and	x5, x5, %[m]\n\t"
10162         "sbcs	x4, x4, x5\n\t"
10163         "csetm	%[c], cc\n\t"
10164         "str	x4, [%[r], x8]\n\t"
10165         "add	x8, x8, #8\n\t"
10166         "cmp	x8, 192\n\t"
10167         "b.lt	1b\n\t"
10168         : [c] "+r" (c)
10169         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
10170         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
10171     );
10172 
10173     return c;
10174 #else
10175     __asm__ __volatile__ (
10176 
10177         "ldp	x5, x7, [%[b], 0]\n\t"
10178         "ldp	x11, x12, [%[b], 16]\n\t"
10179         "ldp	x4, x6, [%[a], 0]\n\t"
10180         "and	x5, x5, %[m]\n\t"
10181         "ldp	x9, x10, [%[a], 16]\n\t"
10182         "and	x7, x7, %[m]\n\t"
10183         "subs	x4, x4, x5\n\t"
10184         "and	x11, x11, %[m]\n\t"
10185         "sbcs	x6, x6, x7\n\t"
10186         "and	x12, x12, %[m]\n\t"
10187         "sbcs	x9, x9, x11\n\t"
10188         "stp	x4, x6, [%[r], 0]\n\t"
10189         "sbcs	x10, x10, x12\n\t"
10190         "stp	x9, x10, [%[r], 16]\n\t"
10191         "ldp	x5, x7, [%[b], 32]\n\t"
10192         "ldp	x11, x12, [%[b], 48]\n\t"
10193         "ldp	x4, x6, [%[a], 32]\n\t"
10194         "and	x5, x5, %[m]\n\t"
10195         "ldp	x9, x10, [%[a], 48]\n\t"
10196         "and	x7, x7, %[m]\n\t"
10197         "sbcs	x4, x4, x5\n\t"
10198         "and	x11, x11, %[m]\n\t"
10199         "sbcs	x6, x6, x7\n\t"
10200         "and	x12, x12, %[m]\n\t"
10201         "sbcs	x9, x9, x11\n\t"
10202         "stp	x4, x6, [%[r], 32]\n\t"
10203         "sbcs	x10, x10, x12\n\t"
10204         "stp	x9, x10, [%[r], 48]\n\t"
10205         "ldp	x5, x7, [%[b], 64]\n\t"
10206         "ldp	x11, x12, [%[b], 80]\n\t"
10207         "ldp	x4, x6, [%[a], 64]\n\t"
10208         "and	x5, x5, %[m]\n\t"
10209         "ldp	x9, x10, [%[a], 80]\n\t"
10210         "and	x7, x7, %[m]\n\t"
10211         "sbcs	x4, x4, x5\n\t"
10212         "and	x11, x11, %[m]\n\t"
10213         "sbcs	x6, x6, x7\n\t"
10214         "and	x12, x12, %[m]\n\t"
10215         "sbcs	x9, x9, x11\n\t"
10216         "stp	x4, x6, [%[r], 64]\n\t"
10217         "sbcs	x10, x10, x12\n\t"
10218         "stp	x9, x10, [%[r], 80]\n\t"
10219         "ldp	x5, x7, [%[b], 96]\n\t"
10220         "ldp	x11, x12, [%[b], 112]\n\t"
10221         "ldp	x4, x6, [%[a], 96]\n\t"
10222         "and	x5, x5, %[m]\n\t"
10223         "ldp	x9, x10, [%[a], 112]\n\t"
10224         "and	x7, x7, %[m]\n\t"
10225         "sbcs	x4, x4, x5\n\t"
10226         "and	x11, x11, %[m]\n\t"
10227         "sbcs	x6, x6, x7\n\t"
10228         "and	x12, x12, %[m]\n\t"
10229         "sbcs	x9, x9, x11\n\t"
10230         "stp	x4, x6, [%[r], 96]\n\t"
10231         "sbcs	x10, x10, x12\n\t"
10232         "stp	x9, x10, [%[r], 112]\n\t"
10233         "ldp	x5, x7, [%[b], 128]\n\t"
10234         "ldp	x11, x12, [%[b], 144]\n\t"
10235         "ldp	x4, x6, [%[a], 128]\n\t"
10236         "and	x5, x5, %[m]\n\t"
10237         "ldp	x9, x10, [%[a], 144]\n\t"
10238         "and	x7, x7, %[m]\n\t"
10239         "sbcs	x4, x4, x5\n\t"
10240         "and	x11, x11, %[m]\n\t"
10241         "sbcs	x6, x6, x7\n\t"
10242         "and	x12, x12, %[m]\n\t"
10243         "sbcs	x9, x9, x11\n\t"
10244         "stp	x4, x6, [%[r], 128]\n\t"
10245         "sbcs	x10, x10, x12\n\t"
10246         "stp	x9, x10, [%[r], 144]\n\t"
10247         "ldp	x5, x7, [%[b], 160]\n\t"
10248         "ldp	x11, x12, [%[b], 176]\n\t"
10249         "ldp	x4, x6, [%[a], 160]\n\t"
10250         "and	x5, x5, %[m]\n\t"
10251         "ldp	x9, x10, [%[a], 176]\n\t"
10252         "and	x7, x7, %[m]\n\t"
10253         "sbcs	x4, x4, x5\n\t"
10254         "and	x11, x11, %[m]\n\t"
10255         "sbcs	x6, x6, x7\n\t"
10256         "and	x12, x12, %[m]\n\t"
10257         "sbcs	x9, x9, x11\n\t"
10258         "stp	x4, x6, [%[r], 160]\n\t"
10259         "sbcs	x10, x10, x12\n\t"
10260         "stp	x9, x10, [%[r], 176]\n\t"
10261         "csetm	%[r], cc\n\t"
10262         : [r] "+r" (r)
10263         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
10264         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
10265     );
10266 
10267     return (sp_digit)r;
10268 #endif /* WOLFSSL_SP_SMALL */
10269 }
10270 
10271 /* Mul a by digit b into r. (r = a * b)
10272  *
10273  * r  A single precision integer.
10274  * a  A single precision integer.
10275  * b  A single precision digit.
10276  */
sp_3072_mul_d_24(sp_digit * r,const sp_digit * a,sp_digit b)10277 static void sp_3072_mul_d_24(sp_digit* r, const sp_digit* a,
10278         sp_digit b)
10279 {
10280 #ifdef WOLFSSL_SP_SMALL
10281     __asm__ __volatile__ (
10282         "# A[0] * B\n\t"
10283         "ldr	x8, [%[a]]\n\t"
10284         "mul	x5, %[b], x8\n\t"
10285         "umulh	x3, %[b], x8\n\t"
10286         "mov	x4, 0\n\t"
10287         "str	x5, [%[r]]\n\t"
10288         "mov	x5, 0\n\t"
10289         "mov	x9, #8\n\t"
10290         "1:\n\t"
10291         "ldr	x8, [%[a], x9]\n\t"
10292         "mul	x6, %[b], x8\n\t"
10293         "umulh	x7, %[b], x8\n\t"
10294         "adds	x3, x3, x6\n\t"
10295         "adcs	x4, x4, x7\n\t"
10296         "adc	x5, xzr, xzr\n\t"
10297         "str	x3, [%[r], x9]\n\t"
10298         "mov	x3, x4\n\t"
10299         "mov	x4, x5\n\t"
10300         "mov	x5, #0\n\t"
10301         "add	x9, x9, #8\n\t"
10302         "cmp	x9, 192\n\t"
10303         "b.lt	1b\n\t"
10304         "str	x3, [%[r], 192]\n\t"
10305         :
10306         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
10307         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
10308     );
10309 #else
10310     __asm__ __volatile__ (
10311         "# A[0] * B\n\t"
10312         "ldp	x8, x9, [%[a]]\n\t"
10313         "mul	x3, %[b], x8\n\t"
10314         "umulh	x4, %[b], x8\n\t"
10315         "mov	x5, 0\n\t"
10316         "# A[1] * B\n\t"
10317         "str	x3, [%[r]]\n\t"
10318         "mov	x3, 0\n\t"
10319         "mul	x6, %[b], x9\n\t"
10320         "umulh	x7, %[b], x9\n\t"
10321         "adds	x4, x4, x6\n\t"
10322         "# A[2] * B\n\t"
10323         "ldp	x8, x9, [%[a], 16]\n\t"
10324         "str	x4, [%[r], 8]\n\t"
10325         "mov	x4, 0\n\t"
10326         "mul	x6, %[b], x8\n\t"
10327         "adcs	x5, x5, x7\n\t"
10328         "umulh	x7, %[b], x8\n\t"
10329         "adc	x3, xzr, xzr\n\t"
10330         "adds	x5, x5, x6\n\t"
10331         "# A[3] * B\n\t"
10332         "str	x5, [%[r], 16]\n\t"
10333         "mov	x5, 0\n\t"
10334         "mul	x6, %[b], x9\n\t"
10335         "adcs	x3, x3, x7\n\t"
10336         "umulh	x7, %[b], x9\n\t"
10337         "adc	x4, xzr, xzr\n\t"
10338         "adds	x3, x3, x6\n\t"
10339         "# A[4] * B\n\t"
10340         "ldp	x8, x9, [%[a], 32]\n\t"
10341         "str	x3, [%[r], 24]\n\t"
10342         "mov	x3, 0\n\t"
10343         "mul	x6, %[b], x8\n\t"
10344         "adcs	x4, x4, x7\n\t"
10345         "umulh	x7, %[b], x8\n\t"
10346         "adc	x5, xzr, xzr\n\t"
10347         "adds	x4, x4, x6\n\t"
10348         "# A[5] * B\n\t"
10349         "str	x4, [%[r], 32]\n\t"
10350         "mov	x4, 0\n\t"
10351         "mul	x6, %[b], x9\n\t"
10352         "adcs	x5, x5, x7\n\t"
10353         "umulh	x7, %[b], x9\n\t"
10354         "adc	x3, xzr, xzr\n\t"
10355         "adds	x5, x5, x6\n\t"
10356         "# A[6] * B\n\t"
10357         "ldp	x8, x9, [%[a], 48]\n\t"
10358         "str	x5, [%[r], 40]\n\t"
10359         "mov	x5, 0\n\t"
10360         "mul	x6, %[b], x8\n\t"
10361         "adcs	x3, x3, x7\n\t"
10362         "umulh	x7, %[b], x8\n\t"
10363         "adc	x4, xzr, xzr\n\t"
10364         "adds	x3, x3, x6\n\t"
10365         "# A[7] * B\n\t"
10366         "str	x3, [%[r], 48]\n\t"
10367         "mov	x3, 0\n\t"
10368         "mul	x6, %[b], x9\n\t"
10369         "adcs	x4, x4, x7\n\t"
10370         "umulh	x7, %[b], x9\n\t"
10371         "adc	x5, xzr, xzr\n\t"
10372         "adds	x4, x4, x6\n\t"
10373         "# A[8] * B\n\t"
10374         "ldp	x8, x9, [%[a], 64]\n\t"
10375         "str	x4, [%[r], 56]\n\t"
10376         "mov	x4, 0\n\t"
10377         "mul	x6, %[b], x8\n\t"
10378         "adcs	x5, x5, x7\n\t"
10379         "umulh	x7, %[b], x8\n\t"
10380         "adc	x3, xzr, xzr\n\t"
10381         "adds	x5, x5, x6\n\t"
10382         "# A[9] * B\n\t"
10383         "str	x5, [%[r], 64]\n\t"
10384         "mov	x5, 0\n\t"
10385         "mul	x6, %[b], x9\n\t"
10386         "adcs	x3, x3, x7\n\t"
10387         "umulh	x7, %[b], x9\n\t"
10388         "adc	x4, xzr, xzr\n\t"
10389         "adds	x3, x3, x6\n\t"
10390         "# A[10] * B\n\t"
10391         "ldp	x8, x9, [%[a], 80]\n\t"
10392         "str	x3, [%[r], 72]\n\t"
10393         "mov	x3, 0\n\t"
10394         "mul	x6, %[b], x8\n\t"
10395         "adcs	x4, x4, x7\n\t"
10396         "umulh	x7, %[b], x8\n\t"
10397         "adc	x5, xzr, xzr\n\t"
10398         "adds	x4, x4, x6\n\t"
10399         "# A[11] * B\n\t"
10400         "str	x4, [%[r], 80]\n\t"
10401         "mov	x4, 0\n\t"
10402         "mul	x6, %[b], x9\n\t"
10403         "adcs	x5, x5, x7\n\t"
10404         "umulh	x7, %[b], x9\n\t"
10405         "adc	x3, xzr, xzr\n\t"
10406         "adds	x5, x5, x6\n\t"
10407         "# A[12] * B\n\t"
10408         "ldp	x8, x9, [%[a], 96]\n\t"
10409         "str	x5, [%[r], 88]\n\t"
10410         "mov	x5, 0\n\t"
10411         "mul	x6, %[b], x8\n\t"
10412         "adcs	x3, x3, x7\n\t"
10413         "umulh	x7, %[b], x8\n\t"
10414         "adc	x4, xzr, xzr\n\t"
10415         "adds	x3, x3, x6\n\t"
10416         "# A[13] * B\n\t"
10417         "str	x3, [%[r], 96]\n\t"
10418         "mov	x3, 0\n\t"
10419         "mul	x6, %[b], x9\n\t"
10420         "adcs	x4, x4, x7\n\t"
10421         "umulh	x7, %[b], x9\n\t"
10422         "adc	x5, xzr, xzr\n\t"
10423         "adds	x4, x4, x6\n\t"
10424         "# A[14] * B\n\t"
10425         "ldp	x8, x9, [%[a], 112]\n\t"
10426         "str	x4, [%[r], 104]\n\t"
10427         "mov	x4, 0\n\t"
10428         "mul	x6, %[b], x8\n\t"
10429         "adcs	x5, x5, x7\n\t"
10430         "umulh	x7, %[b], x8\n\t"
10431         "adc	x3, xzr, xzr\n\t"
10432         "adds	x5, x5, x6\n\t"
10433         "# A[15] * B\n\t"
10434         "str	x5, [%[r], 112]\n\t"
10435         "mov	x5, 0\n\t"
10436         "mul	x6, %[b], x9\n\t"
10437         "adcs	x3, x3, x7\n\t"
10438         "umulh	x7, %[b], x9\n\t"
10439         "adc	x4, xzr, xzr\n\t"
10440         "adds	x3, x3, x6\n\t"
10441         "# A[16] * B\n\t"
10442         "ldp	x8, x9, [%[a], 128]\n\t"
10443         "str	x3, [%[r], 120]\n\t"
10444         "mov	x3, 0\n\t"
10445         "mul	x6, %[b], x8\n\t"
10446         "adcs	x4, x4, x7\n\t"
10447         "umulh	x7, %[b], x8\n\t"
10448         "adc	x5, xzr, xzr\n\t"
10449         "adds	x4, x4, x6\n\t"
10450         "# A[17] * B\n\t"
10451         "str	x4, [%[r], 128]\n\t"
10452         "mov	x4, 0\n\t"
10453         "mul	x6, %[b], x9\n\t"
10454         "adcs	x5, x5, x7\n\t"
10455         "umulh	x7, %[b], x9\n\t"
10456         "adc	x3, xzr, xzr\n\t"
10457         "adds	x5, x5, x6\n\t"
10458         "# A[18] * B\n\t"
10459         "ldp	x8, x9, [%[a], 144]\n\t"
10460         "str	x5, [%[r], 136]\n\t"
10461         "mov	x5, 0\n\t"
10462         "mul	x6, %[b], x8\n\t"
10463         "adcs	x3, x3, x7\n\t"
10464         "umulh	x7, %[b], x8\n\t"
10465         "adc	x4, xzr, xzr\n\t"
10466         "adds	x3, x3, x6\n\t"
10467         "# A[19] * B\n\t"
10468         "str	x3, [%[r], 144]\n\t"
10469         "mov	x3, 0\n\t"
10470         "mul	x6, %[b], x9\n\t"
10471         "adcs	x4, x4, x7\n\t"
10472         "umulh	x7, %[b], x9\n\t"
10473         "adc	x5, xzr, xzr\n\t"
10474         "adds	x4, x4, x6\n\t"
10475         "# A[20] * B\n\t"
10476         "ldp	x8, x9, [%[a], 160]\n\t"
10477         "str	x4, [%[r], 152]\n\t"
10478         "mov	x4, 0\n\t"
10479         "mul	x6, %[b], x8\n\t"
10480         "adcs	x5, x5, x7\n\t"
10481         "umulh	x7, %[b], x8\n\t"
10482         "adc	x3, xzr, xzr\n\t"
10483         "adds	x5, x5, x6\n\t"
10484         "# A[21] * B\n\t"
10485         "str	x5, [%[r], 160]\n\t"
10486         "mov	x5, 0\n\t"
10487         "mul	x6, %[b], x9\n\t"
10488         "adcs	x3, x3, x7\n\t"
10489         "umulh	x7, %[b], x9\n\t"
10490         "adc	x4, xzr, xzr\n\t"
10491         "adds	x3, x3, x6\n\t"
10492         "# A[22] * B\n\t"
10493         "ldp	x8, x9, [%[a], 176]\n\t"
10494         "str	x3, [%[r], 168]\n\t"
10495         "mov	x3, 0\n\t"
10496         "mul	x6, %[b], x8\n\t"
10497         "adcs	x4, x4, x7\n\t"
10498         "umulh	x7, %[b], x8\n\t"
10499         "adc	x5, xzr, xzr\n\t"
10500         "adds	x4, x4, x6\n\t"
10501         "# A[23] * B\n\t"
10502         "str	x4, [%[r], 176]\n\t"
10503         "mul	x6, %[b], x9\n\t"
10504         "adcs	x5, x5, x7\n\t"
10505         "umulh	x7, %[b], x9\n\t"
10506         "adc	x3, xzr, xzr\n\t"
10507         "adds	x5, x5, x6\n\t"
10508         "adc	x3, x3, x7\n\t"
10509         "stp	x5, x3, [%[r], 184]\n\t"
10510         :
10511         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
10512         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
10513     );
10514 #endif
10515 }
10516 
10517 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
10518  *
10519  * d1   The high order half of the number to divide.
10520  * d0   The low order half of the number to divide.
10521  * div  The dividend.
10522  * returns the result of the division.
10523  */
div_3072_word_24(sp_digit d1,sp_digit d0,sp_digit div)10524 static sp_digit div_3072_word_24(sp_digit d1, sp_digit d0, sp_digit div)
10525 {
10526     sp_digit r;
10527 
10528     __asm__ __volatile__ (
10529         "lsr	x5, %[div], 32\n\t"
10530         "add	x5, x5, 1\n\t"
10531 
10532         "udiv	x3, %[d1], x5\n\t"
10533         "lsl	x6, x3, 32\n\t"
10534         "mul	x4, %[div], x6\n\t"
10535         "umulh	x3, %[div], x6\n\t"
10536         "subs	%[d0], %[d0], x4\n\t"
10537         "sbc	%[d1], %[d1], x3\n\t"
10538 
10539         "udiv	x3, %[d1], x5\n\t"
10540         "lsl	x3, x3, 32\n\t"
10541         "add	x6, x6, x3\n\t"
10542         "mul	x4, %[div], x3\n\t"
10543         "umulh	x3, %[div], x3\n\t"
10544         "subs	%[d0], %[d0], x4\n\t"
10545         "sbc	%[d1], %[d1], x3\n\t"
10546 
10547         "lsr	x3, %[d0], 32\n\t"
10548         "orr	x3, x3, %[d1], lsl 32\n\t"
10549 
10550         "udiv	x3, x3, x5\n\t"
10551         "add	x6, x6, x3\n\t"
10552         "mul	x4, %[div], x3\n\t"
10553         "umulh	x3, %[div], x3\n\t"
10554         "subs	%[d0], %[d0], x4\n\t"
10555         "sbc	%[d1], %[d1], x3\n\t"
10556 
10557         "lsr	x3, %[d0], 32\n\t"
10558         "orr	x3, x3, %[d1], lsl 32\n\t"
10559 
10560         "udiv	x3, x3, x5\n\t"
10561         "add	x6, x6, x3\n\t"
10562         "mul	x4, %[div], x3\n\t"
10563         "sub	%[d0], %[d0], x4\n\t"
10564 
10565         "udiv	x3, %[d0], %[div]\n\t"
10566         "add	%[r], x6, x3\n\t"
10567 
10568         : [r] "=r" (r)
10569         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
10570         : "x3", "x4", "x5", "x6"
10571     );
10572 
10573     return r;
10574 }
10575 
10576 /* Compare a with b in constant time.
10577  *
10578  * a  A single precision integer.
10579  * b  A single precision integer.
10580  * return -ve, 0 or +ve if a is less than, equal to or greater than b
10581  * respectively.
10582  */
sp_3072_cmp_24(const sp_digit * a,const sp_digit * b)10583 static sp_int64 sp_3072_cmp_24(const sp_digit* a, const sp_digit* b)
10584 {
10585 #ifdef WOLFSSL_SP_SMALL
10586     __asm__ __volatile__ (
10587         "mov	x2, -1\n\t"
10588         "mov	x3, 1\n\t"
10589         "mov	x4, -1\n\t"
10590         "mov	x5, 184\n\t"
10591         "1:\n\t"
10592         "ldr	x6, [%[a], x5]\n\t"
10593         "ldr	x7, [%[b], x5]\n\t"
10594         "and	x6, x6, x4\n\t"
10595         "and	x7, x7, x4\n\t"
10596         "subs	x6, x6, x7\n\t"
10597         "csel	x2, x3, x2, hi\n\t"
10598         "csel	x2, x4, x2, lo\n\t"
10599         "csel	x4, x4, xzr, eq\n\t"
10600         "subs	x5, x5, #8\n\t"
10601         "b.cs	1b\n\t"
10602         "eor	%[a], x2, x4\n\t"
10603         : [a] "+r" (a)
10604         : [b] "r" (b)
10605         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
10606     );
10607 #else
10608     __asm__ __volatile__ (
10609         "mov	x2, -1\n\t"
10610         "mov	x3, 1\n\t"
10611         "mov  x4, -1\n\t"
10612         "ldp	x5, x6, [%[a], 176]\n\t"
10613         "ldp	x7, x8, [%[b], 176]\n\t"
10614         "and	x6, x6, x4\n\t"
10615         "and	x8, x8, x4\n\t"
10616         "subs	x6, x6, x8\n\t"
10617         "csel	x2, x4, x2, lo\n\t"
10618         "csel	x4, x4, xzr, eq\n\t"
10619         "csel	x2, x3, x2, hi\n\t"
10620         "and	x5, x5, x4\n\t"
10621         "and	x7, x7, x4\n\t"
10622         "subs	x5, x5, x7\n\t"
10623         "csel	x2, x4, x2, lo\n\t"
10624         "csel	x4, x4, xzr, eq\n\t"
10625         "csel	x2, x3, x2, hi\n\t"
10626         "ldp	x5, x6, [%[a], 160]\n\t"
10627         "ldp	x7, x8, [%[b], 160]\n\t"
10628         "and	x6, x6, x4\n\t"
10629         "and	x8, x8, x4\n\t"
10630         "subs	x6, x6, x8\n\t"
10631         "csel	x2, x4, x2, lo\n\t"
10632         "csel	x4, x4, xzr, eq\n\t"
10633         "csel	x2, x3, x2, hi\n\t"
10634         "and	x5, x5, x4\n\t"
10635         "and	x7, x7, x4\n\t"
10636         "subs	x5, x5, x7\n\t"
10637         "csel	x2, x4, x2, lo\n\t"
10638         "csel	x4, x4, xzr, eq\n\t"
10639         "csel	x2, x3, x2, hi\n\t"
10640         "ldp	x5, x6, [%[a], 144]\n\t"
10641         "ldp	x7, x8, [%[b], 144]\n\t"
10642         "and	x6, x6, x4\n\t"
10643         "and	x8, x8, x4\n\t"
10644         "subs	x6, x6, x8\n\t"
10645         "csel	x2, x4, x2, lo\n\t"
10646         "csel	x4, x4, xzr, eq\n\t"
10647         "csel	x2, x3, x2, hi\n\t"
10648         "and	x5, x5, x4\n\t"
10649         "and	x7, x7, x4\n\t"
10650         "subs	x5, x5, x7\n\t"
10651         "csel	x2, x4, x2, lo\n\t"
10652         "csel	x4, x4, xzr, eq\n\t"
10653         "csel	x2, x3, x2, hi\n\t"
10654         "ldp	x5, x6, [%[a], 128]\n\t"
10655         "ldp	x7, x8, [%[b], 128]\n\t"
10656         "and	x6, x6, x4\n\t"
10657         "and	x8, x8, x4\n\t"
10658         "subs	x6, x6, x8\n\t"
10659         "csel	x2, x4, x2, lo\n\t"
10660         "csel	x4, x4, xzr, eq\n\t"
10661         "csel	x2, x3, x2, hi\n\t"
10662         "and	x5, x5, x4\n\t"
10663         "and	x7, x7, x4\n\t"
10664         "subs	x5, x5, x7\n\t"
10665         "csel	x2, x4, x2, lo\n\t"
10666         "csel	x4, x4, xzr, eq\n\t"
10667         "csel	x2, x3, x2, hi\n\t"
10668         "ldp	x5, x6, [%[a], 112]\n\t"
10669         "ldp	x7, x8, [%[b], 112]\n\t"
10670         "and	x6, x6, x4\n\t"
10671         "and	x8, x8, x4\n\t"
10672         "subs	x6, x6, x8\n\t"
10673         "csel	x2, x4, x2, lo\n\t"
10674         "csel	x4, x4, xzr, eq\n\t"
10675         "csel	x2, x3, x2, hi\n\t"
10676         "and	x5, x5, x4\n\t"
10677         "and	x7, x7, x4\n\t"
10678         "subs	x5, x5, x7\n\t"
10679         "csel	x2, x4, x2, lo\n\t"
10680         "csel	x4, x4, xzr, eq\n\t"
10681         "csel	x2, x3, x2, hi\n\t"
10682         "ldp	x5, x6, [%[a], 96]\n\t"
10683         "ldp	x7, x8, [%[b], 96]\n\t"
10684         "and	x6, x6, x4\n\t"
10685         "and	x8, x8, x4\n\t"
10686         "subs	x6, x6, x8\n\t"
10687         "csel	x2, x4, x2, lo\n\t"
10688         "csel	x4, x4, xzr, eq\n\t"
10689         "csel	x2, x3, x2, hi\n\t"
10690         "and	x5, x5, x4\n\t"
10691         "and	x7, x7, x4\n\t"
10692         "subs	x5, x5, x7\n\t"
10693         "csel	x2, x4, x2, lo\n\t"
10694         "csel	x4, x4, xzr, eq\n\t"
10695         "csel	x2, x3, x2, hi\n\t"
10696         "ldp	x5, x6, [%[a], 80]\n\t"
10697         "ldp	x7, x8, [%[b], 80]\n\t"
10698         "and	x6, x6, x4\n\t"
10699         "and	x8, x8, x4\n\t"
10700         "subs	x6, x6, x8\n\t"
10701         "csel	x2, x4, x2, lo\n\t"
10702         "csel	x4, x4, xzr, eq\n\t"
10703         "csel	x2, x3, x2, hi\n\t"
10704         "and	x5, x5, x4\n\t"
10705         "and	x7, x7, x4\n\t"
10706         "subs	x5, x5, x7\n\t"
10707         "csel	x2, x4, x2, lo\n\t"
10708         "csel	x4, x4, xzr, eq\n\t"
10709         "csel	x2, x3, x2, hi\n\t"
10710         "ldp	x5, x6, [%[a], 64]\n\t"
10711         "ldp	x7, x8, [%[b], 64]\n\t"
10712         "and	x6, x6, x4\n\t"
10713         "and	x8, x8, x4\n\t"
10714         "subs	x6, x6, x8\n\t"
10715         "csel	x2, x4, x2, lo\n\t"
10716         "csel	x4, x4, xzr, eq\n\t"
10717         "csel	x2, x3, x2, hi\n\t"
10718         "and	x5, x5, x4\n\t"
10719         "and	x7, x7, x4\n\t"
10720         "subs	x5, x5, x7\n\t"
10721         "csel	x2, x4, x2, lo\n\t"
10722         "csel	x4, x4, xzr, eq\n\t"
10723         "csel	x2, x3, x2, hi\n\t"
10724         "ldp	x5, x6, [%[a], 48]\n\t"
10725         "ldp	x7, x8, [%[b], 48]\n\t"
10726         "and	x6, x6, x4\n\t"
10727         "and	x8, x8, x4\n\t"
10728         "subs	x6, x6, x8\n\t"
10729         "csel	x2, x4, x2, lo\n\t"
10730         "csel	x4, x4, xzr, eq\n\t"
10731         "csel	x2, x3, x2, hi\n\t"
10732         "and	x5, x5, x4\n\t"
10733         "and	x7, x7, x4\n\t"
10734         "subs	x5, x5, x7\n\t"
10735         "csel	x2, x4, x2, lo\n\t"
10736         "csel	x4, x4, xzr, eq\n\t"
10737         "csel	x2, x3, x2, hi\n\t"
10738         "ldp	x5, x6, [%[a], 32]\n\t"
10739         "ldp	x7, x8, [%[b], 32]\n\t"
10740         "and	x6, x6, x4\n\t"
10741         "and	x8, x8, x4\n\t"
10742         "subs	x6, x6, x8\n\t"
10743         "csel	x2, x4, x2, lo\n\t"
10744         "csel	x4, x4, xzr, eq\n\t"
10745         "csel	x2, x3, x2, hi\n\t"
10746         "and	x5, x5, x4\n\t"
10747         "and	x7, x7, x4\n\t"
10748         "subs	x5, x5, x7\n\t"
10749         "csel	x2, x4, x2, lo\n\t"
10750         "csel	x4, x4, xzr, eq\n\t"
10751         "csel	x2, x3, x2, hi\n\t"
10752         "ldp	x5, x6, [%[a], 16]\n\t"
10753         "ldp	x7, x8, [%[b], 16]\n\t"
10754         "and	x6, x6, x4\n\t"
10755         "and	x8, x8, x4\n\t"
10756         "subs	x6, x6, x8\n\t"
10757         "csel	x2, x4, x2, lo\n\t"
10758         "csel	x4, x4, xzr, eq\n\t"
10759         "csel	x2, x3, x2, hi\n\t"
10760         "and	x5, x5, x4\n\t"
10761         "and	x7, x7, x4\n\t"
10762         "subs	x5, x5, x7\n\t"
10763         "csel	x2, x4, x2, lo\n\t"
10764         "csel	x4, x4, xzr, eq\n\t"
10765         "csel	x2, x3, x2, hi\n\t"
10766         "ldp	x5, x6, [%[a], 0]\n\t"
10767         "ldp	x7, x8, [%[b], 0]\n\t"
10768         "and	x6, x6, x4\n\t"
10769         "and	x8, x8, x4\n\t"
10770         "subs	x6, x6, x8\n\t"
10771         "csel	x2, x4, x2, lo\n\t"
10772         "csel	x4, x4, xzr, eq\n\t"
10773         "csel	x2, x3, x2, hi\n\t"
10774         "and	x5, x5, x4\n\t"
10775         "and	x7, x7, x4\n\t"
10776         "subs	x5, x5, x7\n\t"
10777         "csel	x2, x4, x2, lo\n\t"
10778         "csel	x4, x4, xzr, eq\n\t"
10779         "csel	x2, x3, x2, hi\n\t"
10780         "eor	%[a], x2, x4\n\t"
10781         : [a] "+r" (a)
10782         : [b] "r" (b)
10783         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
10784     );
10785 #endif
10786 
10787     return (sp_int64)a;
10788 }
10789 
10790 /* Divide d in a and put remainder into r (m*d + r = a)
10791  * m is not calculated as it is not needed at this time.
10792  *
10793  * a  Number to be divided.
10794  * d  Number to divide with.
10795  * m  Multiplier result.
10796  * r  Remainder from the division.
10797  * returns MP_OKAY indicating success.
10798  */
sp_3072_div_24(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)10799 static WC_INLINE int sp_3072_div_24(const sp_digit* a, const sp_digit* d, sp_digit* m,
10800         sp_digit* r)
10801 {
10802     sp_digit t1[48], t2[25];
10803     sp_digit div, r1;
10804     int i;
10805 
10806     (void)m;
10807 
10808     div = d[23];
10809     XMEMCPY(t1, a, sizeof(*t1) * 2 * 24);
10810     for (i=23; i>=0; i--) {
10811         sp_digit hi = t1[24 + i] - (t1[24 + i] == div);
10812         r1 = div_3072_word_24(hi, t1[24 + i - 1], div);
10813 
10814         sp_3072_mul_d_24(t2, d, r1);
10815         t1[24 + i] += sp_3072_sub_in_place_24(&t1[i], t2);
10816         t1[24 + i] -= t2[24];
10817         sp_3072_mask_24(t2, d, t1[24 + i]);
10818         t1[24 + i] += sp_3072_add_24(&t1[i], &t1[i], t2);
10819         sp_3072_mask_24(t2, d, t1[24 + i]);
10820         t1[24 + i] += sp_3072_add_24(&t1[i], &t1[i], t2);
10821     }
10822 
10823     r1 = sp_3072_cmp_24(t1, d) >= 0;
10824     sp_3072_cond_sub_24(r, t1, d, (sp_digit)0 - r1);
10825 
10826     return MP_OKAY;
10827 }
10828 
10829 /* Reduce a modulo m into r. (r = a mod m)
10830  *
10831  * r  A single precision number that is the reduced result.
10832  * a  A single precision number that is to be reduced.
10833  * m  A single precision number that is the modulus to reduce with.
10834  * returns MP_OKAY indicating success.
10835  */
sp_3072_mod_24(sp_digit * r,const sp_digit * a,const sp_digit * m)10836 static WC_INLINE int sp_3072_mod_24(sp_digit* r, const sp_digit* a, const sp_digit* m)
10837 {
10838     return sp_3072_div_24(a, m, NULL, r);
10839 }
10840 
10841 #ifdef WOLFSSL_SP_SMALL
10842 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
10843  *
10844  * r     A single precision number that is the result of the operation.
10845  * a     A single precision number being exponentiated.
10846  * e     A single precision number that is the exponent.
10847  * bits  The number of bits in the exponent.
10848  * m     A single precision number that is the modulus.
10849  * returns  0 on success.
10850  * returns  MEMORY_E on dynamic memory allocation failure.
10851  * returns  MP_VAL when base is even or exponent is 0.
10852  */
sp_3072_mod_exp_24(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)10853 static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e,
10854         int bits, const sp_digit* m, int reduceA)
10855 {
10856 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
10857     sp_digit* td = NULL;
10858 #else
10859     sp_digit td[16 * 48];
10860 #endif
10861     sp_digit* t[16];
10862     sp_digit* norm = NULL;
10863     sp_digit mp = 1;
10864     sp_digit n;
10865     sp_digit mask;
10866     int i;
10867     int c;
10868     byte y;
10869     int err = MP_OKAY;
10870 
10871     if ((m[0] & 1) == 0) {
10872         err = MP_VAL;
10873     }
10874     else if (bits == 0) {
10875         err = MP_VAL;
10876     }
10877 
10878 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
10879     if (err == MP_OKAY) {
10880         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 48), NULL,
10881                                 DYNAMIC_TYPE_TMP_BUFFER);
10882         if (td == NULL)
10883             err = MEMORY_E;
10884     }
10885 #endif
10886 
10887     if (err == MP_OKAY) {
10888         norm = td;
10889         for (i=0; i<16; i++) {
10890             t[i] = td + i * 48;
10891         }
10892 
10893         sp_3072_mont_setup(m, &mp);
10894         sp_3072_mont_norm_24(norm, m);
10895 
10896         XMEMSET(t[1], 0, sizeof(sp_digit) * 24U);
10897         if (reduceA != 0) {
10898             err = sp_3072_mod_24(t[1] + 24, a, m);
10899             if (err == MP_OKAY) {
10900                 err = sp_3072_mod_24(t[1], t[1], m);
10901             }
10902         }
10903         else {
10904             XMEMCPY(t[1] + 24, a, sizeof(sp_digit) * 24);
10905             err = sp_3072_mod_24(t[1], t[1], m);
10906         }
10907     }
10908 
10909     if (err == MP_OKAY) {
10910         sp_3072_mont_sqr_24(t[ 2], t[ 1], m, mp);
10911         sp_3072_mont_mul_24(t[ 3], t[ 2], t[ 1], m, mp);
10912         sp_3072_mont_sqr_24(t[ 4], t[ 2], m, mp);
10913         sp_3072_mont_mul_24(t[ 5], t[ 3], t[ 2], m, mp);
10914         sp_3072_mont_sqr_24(t[ 6], t[ 3], m, mp);
10915         sp_3072_mont_mul_24(t[ 7], t[ 4], t[ 3], m, mp);
10916         sp_3072_mont_sqr_24(t[ 8], t[ 4], m, mp);
10917         sp_3072_mont_mul_24(t[ 9], t[ 5], t[ 4], m, mp);
10918         sp_3072_mont_sqr_24(t[10], t[ 5], m, mp);
10919         sp_3072_mont_mul_24(t[11], t[ 6], t[ 5], m, mp);
10920         sp_3072_mont_sqr_24(t[12], t[ 6], m, mp);
10921         sp_3072_mont_mul_24(t[13], t[ 7], t[ 6], m, mp);
10922         sp_3072_mont_sqr_24(t[14], t[ 7], m, mp);
10923         sp_3072_mont_mul_24(t[15], t[ 8], t[ 7], m, mp);
10924 
10925         i = (bits - 1) / 64;
10926         n = e[i--];
10927         c = bits & 63;
10928         if (c == 0) {
10929             c = 64;
10930         }
10931         c -= bits % 4;
10932         if (c == 64) {
10933             c = 60;
10934         }
10935         if (c < 0) {
10936             /* Number of bits in top word is less than number needed. */
10937             c = -c;
10938             y = (byte)(n << c);
10939             n = e[i--];
10940             y |= (byte)(n >> (64 - c));
10941             n <<= c;
10942             c = 64 - c;
10943         }
10944         else {
10945             y = (byte)(n >> c);
10946             n <<= 64 - c;
10947         }
10948         XMEMCPY(r, t[y], sizeof(sp_digit) * 24);
10949         for (; i>=0 || c>=4; ) {
10950             if (c == 0) {
10951                 n = e[i--];
10952                 y = (byte)(n >> 60);
10953                 n <<= 4;
10954                 c = 60;
10955             }
10956             else if (c < 4) {
10957                 y = (byte)(n >> 60);
10958                 n = e[i--];
10959                 c = 4 - c;
10960                 y |= (byte)(n >> (64 - c));
10961                 n <<= c;
10962                 c = 64 - c;
10963             }
10964             else {
10965                 y = (byte)((n >> 60) & 0xf);
10966                 n <<= 4;
10967                 c -= 4;
10968             }
10969 
10970             sp_3072_mont_sqr_24(r, r, m, mp);
10971             sp_3072_mont_sqr_24(r, r, m, mp);
10972             sp_3072_mont_sqr_24(r, r, m, mp);
10973             sp_3072_mont_sqr_24(r, r, m, mp);
10974 
10975             sp_3072_mont_mul_24(r, r, t[y], m, mp);
10976         }
10977 
10978         XMEMSET(&r[24], 0, sizeof(sp_digit) * 24U);
10979         sp_3072_mont_reduce_24(r, m, mp);
10980 
10981         mask = 0 - (sp_3072_cmp_24(r, m) >= 0);
10982         sp_3072_cond_sub_24(r, r, m, mask);
10983     }
10984 
10985 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
10986     if (td != NULL)
10987         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
10988 #endif
10989 
10990     return err;
10991 }
10992 #else
10993 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
10994  *
10995  * r     A single precision number that is the result of the operation.
10996  * a     A single precision number being exponentiated.
10997  * e     A single precision number that is the exponent.
10998  * bits  The number of bits in the exponent.
10999  * m     A single precision number that is the modulus.
11000  * returns  0 on success.
11001  * returns  MEMORY_E on dynamic memory allocation failure.
11002  * returns  MP_VAL when base is even or exponent is 0.
11003  */
sp_3072_mod_exp_24(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)11004 static int sp_3072_mod_exp_24(sp_digit* r, const sp_digit* a, const sp_digit* e,
11005         int bits, const sp_digit* m, int reduceA)
11006 {
11007 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
11008     sp_digit* td = NULL;
11009 #else
11010     sp_digit td[32 * 48];
11011 #endif
11012     sp_digit* t[32];
11013     sp_digit* norm = NULL;
11014     sp_digit mp = 1;
11015     sp_digit n;
11016     sp_digit mask;
11017     int i;
11018     int c;
11019     byte y;
11020     int err = MP_OKAY;
11021 
11022     if ((m[0] & 1) == 0) {
11023         err = MP_VAL;
11024     }
11025     else if (bits == 0) {
11026         err = MP_VAL;
11027     }
11028 
11029 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
11030     if (err == MP_OKAY) {
11031         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 48), NULL,
11032                                 DYNAMIC_TYPE_TMP_BUFFER);
11033         if (td == NULL)
11034             err = MEMORY_E;
11035     }
11036 #endif
11037 
11038     if (err == MP_OKAY) {
11039         norm = td;
11040         for (i=0; i<32; i++) {
11041             t[i] = td + i * 48;
11042         }
11043 
11044         sp_3072_mont_setup(m, &mp);
11045         sp_3072_mont_norm_24(norm, m);
11046 
11047         XMEMSET(t[1], 0, sizeof(sp_digit) * 24U);
11048         if (reduceA != 0) {
11049             err = sp_3072_mod_24(t[1] + 24, a, m);
11050             if (err == MP_OKAY) {
11051                 err = sp_3072_mod_24(t[1], t[1], m);
11052             }
11053         }
11054         else {
11055             XMEMCPY(t[1] + 24, a, sizeof(sp_digit) * 24);
11056             err = sp_3072_mod_24(t[1], t[1], m);
11057         }
11058     }
11059 
11060     if (err == MP_OKAY) {
11061         sp_3072_mont_sqr_24(t[ 2], t[ 1], m, mp);
11062         sp_3072_mont_mul_24(t[ 3], t[ 2], t[ 1], m, mp);
11063         sp_3072_mont_sqr_24(t[ 4], t[ 2], m, mp);
11064         sp_3072_mont_mul_24(t[ 5], t[ 3], t[ 2], m, mp);
11065         sp_3072_mont_sqr_24(t[ 6], t[ 3], m, mp);
11066         sp_3072_mont_mul_24(t[ 7], t[ 4], t[ 3], m, mp);
11067         sp_3072_mont_sqr_24(t[ 8], t[ 4], m, mp);
11068         sp_3072_mont_mul_24(t[ 9], t[ 5], t[ 4], m, mp);
11069         sp_3072_mont_sqr_24(t[10], t[ 5], m, mp);
11070         sp_3072_mont_mul_24(t[11], t[ 6], t[ 5], m, mp);
11071         sp_3072_mont_sqr_24(t[12], t[ 6], m, mp);
11072         sp_3072_mont_mul_24(t[13], t[ 7], t[ 6], m, mp);
11073         sp_3072_mont_sqr_24(t[14], t[ 7], m, mp);
11074         sp_3072_mont_mul_24(t[15], t[ 8], t[ 7], m, mp);
11075         sp_3072_mont_sqr_24(t[16], t[ 8], m, mp);
11076         sp_3072_mont_mul_24(t[17], t[ 9], t[ 8], m, mp);
11077         sp_3072_mont_sqr_24(t[18], t[ 9], m, mp);
11078         sp_3072_mont_mul_24(t[19], t[10], t[ 9], m, mp);
11079         sp_3072_mont_sqr_24(t[20], t[10], m, mp);
11080         sp_3072_mont_mul_24(t[21], t[11], t[10], m, mp);
11081         sp_3072_mont_sqr_24(t[22], t[11], m, mp);
11082         sp_3072_mont_mul_24(t[23], t[12], t[11], m, mp);
11083         sp_3072_mont_sqr_24(t[24], t[12], m, mp);
11084         sp_3072_mont_mul_24(t[25], t[13], t[12], m, mp);
11085         sp_3072_mont_sqr_24(t[26], t[13], m, mp);
11086         sp_3072_mont_mul_24(t[27], t[14], t[13], m, mp);
11087         sp_3072_mont_sqr_24(t[28], t[14], m, mp);
11088         sp_3072_mont_mul_24(t[29], t[15], t[14], m, mp);
11089         sp_3072_mont_sqr_24(t[30], t[15], m, mp);
11090         sp_3072_mont_mul_24(t[31], t[16], t[15], m, mp);
11091 
11092         i = (bits - 1) / 64;
11093         n = e[i--];
11094         c = bits & 63;
11095         if (c == 0) {
11096             c = 64;
11097         }
11098         c -= bits % 5;
11099         if (c == 64) {
11100             c = 59;
11101         }
11102         if (c < 0) {
11103             /* Number of bits in top word is less than number needed. */
11104             c = -c;
11105             y = (byte)(n << c);
11106             n = e[i--];
11107             y |= (byte)(n >> (64 - c));
11108             n <<= c;
11109             c = 64 - c;
11110         }
11111         else {
11112             y = (byte)(n >> c);
11113             n <<= 64 - c;
11114         }
11115         XMEMCPY(r, t[y], sizeof(sp_digit) * 24);
11116         for (; i>=0 || c>=5; ) {
11117             if (c == 0) {
11118                 n = e[i--];
11119                 y = (byte)(n >> 59);
11120                 n <<= 5;
11121                 c = 59;
11122             }
11123             else if (c < 5) {
11124                 y = (byte)(n >> 59);
11125                 n = e[i--];
11126                 c = 5 - c;
11127                 y |= (byte)(n >> (64 - c));
11128                 n <<= c;
11129                 c = 64 - c;
11130             }
11131             else {
11132                 y = (byte)((n >> 59) & 0x1f);
11133                 n <<= 5;
11134                 c -= 5;
11135             }
11136 
11137             sp_3072_mont_sqr_24(r, r, m, mp);
11138             sp_3072_mont_sqr_24(r, r, m, mp);
11139             sp_3072_mont_sqr_24(r, r, m, mp);
11140             sp_3072_mont_sqr_24(r, r, m, mp);
11141             sp_3072_mont_sqr_24(r, r, m, mp);
11142 
11143             sp_3072_mont_mul_24(r, r, t[y], m, mp);
11144         }
11145 
11146         XMEMSET(&r[24], 0, sizeof(sp_digit) * 24U);
11147         sp_3072_mont_reduce_24(r, m, mp);
11148 
11149         mask = 0 - (sp_3072_cmp_24(r, m) >= 0);
11150         sp_3072_cond_sub_24(r, r, m, mask);
11151     }
11152 
11153 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
11154     if (td != NULL)
11155         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11156 #endif
11157 
11158     return err;
11159 }
11160 #endif /* WOLFSSL_SP_SMALL */
11161 
11162 #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
11163 
11164 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
11165 /* r = 2^n mod m where n is the number of bits to reduce by.
11166  * Given m must be 3072 bits, just need to subtract.
11167  *
11168  * r  A single precision number.
11169  * m  A single precision number.
11170  */
sp_3072_mont_norm_48(sp_digit * r,const sp_digit * m)11171 static void sp_3072_mont_norm_48(sp_digit* r, const sp_digit* m)
11172 {
11173     XMEMSET(r, 0, sizeof(sp_digit) * 48);
11174 
11175     /* r = 2^n mod m */
11176     sp_3072_sub_in_place_48(r, m);
11177 }
11178 
11179 #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
11180 /* Reduce the number back to 3072 bits using Montgomery reduction.
11181  *
11182  * a   A single precision number to reduce in place.
11183  * m   The single precision number representing the modulus.
11184  * mp  The digit representing the negative inverse of m mod 2^n.
11185  */
sp_3072_mont_reduce_48(sp_digit * a,const sp_digit * m,sp_digit mp)11186 SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m,
11187         sp_digit mp)
11188 {
11189 
11190     __asm__ __volatile__ (
11191         "ldp	x14, x15, [%[m], 0]\n\t"
11192         "ldp	x16, x17, [%[m], 16]\n\t"
11193         "ldp	x19, x20, [%[m], 32]\n\t"
11194         "ldp	x21, x22, [%[m], 48]\n\t"
11195         "ldp	x23, x24, [%[m], 64]\n\t"
11196         "ldp	x25, x26, [%[m], 80]\n\t"
11197         "ldp	x27, x28, [%[m], 96]\n\t"
11198         "mov	x3, xzr\n\t"
11199         "# i = 48\n\t"
11200         "mov	x4, 48\n\t"
11201         "ldp	x12, x13, [%[a], 0]\n\t"
11202         "\n1:\n\t"
11203         "# mu = a[i] * mp\n\t"
11204         "mul	x9, %[mp], x12\n\t"
11205         "# a[i+0] += m[0] * mu\n\t"
11206         "mul	x7, x14, x9\n\t"
11207         "umulh	x8, x14, x9\n\t"
11208         "adds	x12, x12, x7\n\t"
11209         "# a[i+1] += m[1] * mu\n\t"
11210         "mul	x7, x15, x9\n\t"
11211         "adc	x6, x8, xzr\n\t"
11212         "umulh	x8, x15, x9\n\t"
11213         "adds	x12, x13, x7\n\t"
11214         "# a[i+2] += m[2] * mu\n\t"
11215         "ldr	x13, [%[a], 16]\n\t"
11216         "adc	x5, x8, xzr\n\t"
11217         "mul	x7, x16, x9\n\t"
11218         "adds	x12, x12, x6\n\t"
11219         "umulh	x8, x16, x9\n\t"
11220         "adc	x5, x5, xzr\n\t"
11221         "adds	x13, x13, x7\n\t"
11222         "# a[i+3] += m[3] * mu\n\t"
11223         "ldr	x10, [%[a], 24]\n\t"
11224         "adc	x6, x8, xzr\n\t"
11225         "mul	x7, x17, x9\n\t"
11226         "adds	x13, x13, x5\n\t"
11227         "umulh	x8, x17, x9\n\t"
11228         "adc	x6, x6, xzr\n\t"
11229         "adds	x10, x10, x7\n\t"
11230         "# a[i+4] += m[4] * mu\n\t"
11231         "ldr	x11, [%[a], 32]\n\t"
11232         "adc	x5, x8, xzr\n\t"
11233         "adds	x10, x10, x6\n\t"
11234         "mul	x7, x19, x9\n\t"
11235         "adc	x5, x5, xzr\n\t"
11236         "umulh	x8, x19, x9\n\t"
11237         "str	x10, [%[a], 24]\n\t"
11238         "adds	x11, x11, x7\n\t"
11239         "# a[i+5] += m[5] * mu\n\t"
11240         "ldr	x10, [%[a], 40]\n\t"
11241         "adc	x6, x8, xzr\n\t"
11242         "adds	x11, x11, x5\n\t"
11243         "mul	x7, x20, x9\n\t"
11244         "adc	x6, x6, xzr\n\t"
11245         "umulh	x8, x20, x9\n\t"
11246         "str	x11, [%[a], 32]\n\t"
11247         "adds	x10, x10, x7\n\t"
11248         "# a[i+6] += m[6] * mu\n\t"
11249         "ldr	x11, [%[a], 48]\n\t"
11250         "adc	x5, x8, xzr\n\t"
11251         "adds	x10, x10, x6\n\t"
11252         "mul	x7, x21, x9\n\t"
11253         "adc	x5, x5, xzr\n\t"
11254         "umulh	x8, x21, x9\n\t"
11255         "str	x10, [%[a], 40]\n\t"
11256         "adds	x11, x11, x7\n\t"
11257         "# a[i+7] += m[7] * mu\n\t"
11258         "ldr	x10, [%[a], 56]\n\t"
11259         "adc	x6, x8, xzr\n\t"
11260         "adds	x11, x11, x5\n\t"
11261         "mul	x7, x22, x9\n\t"
11262         "adc	x6, x6, xzr\n\t"
11263         "umulh	x8, x22, x9\n\t"
11264         "str	x11, [%[a], 48]\n\t"
11265         "adds	x10, x10, x7\n\t"
11266         "# a[i+8] += m[8] * mu\n\t"
11267         "ldr	x11, [%[a], 64]\n\t"
11268         "adc	x5, x8, xzr\n\t"
11269         "adds	x10, x10, x6\n\t"
11270         "mul	x7, x23, x9\n\t"
11271         "adc	x5, x5, xzr\n\t"
11272         "umulh	x8, x23, x9\n\t"
11273         "str	x10, [%[a], 56]\n\t"
11274         "adds	x11, x11, x7\n\t"
11275         "# a[i+9] += m[9] * mu\n\t"
11276         "ldr	x10, [%[a], 72]\n\t"
11277         "adc	x6, x8, xzr\n\t"
11278         "adds	x11, x11, x5\n\t"
11279         "mul	x7, x24, x9\n\t"
11280         "adc	x6, x6, xzr\n\t"
11281         "umulh	x8, x24, x9\n\t"
11282         "str	x11, [%[a], 64]\n\t"
11283         "adds	x10, x10, x7\n\t"
11284         "# a[i+10] += m[10] * mu\n\t"
11285         "ldr	x11, [%[a], 80]\n\t"
11286         "adc	x5, x8, xzr\n\t"
11287         "adds	x10, x10, x6\n\t"
11288         "mul	x7, x25, x9\n\t"
11289         "adc	x5, x5, xzr\n\t"
11290         "umulh	x8, x25, x9\n\t"
11291         "str	x10, [%[a], 72]\n\t"
11292         "adds	x11, x11, x7\n\t"
11293         "# a[i+11] += m[11] * mu\n\t"
11294         "ldr	x10, [%[a], 88]\n\t"
11295         "adc	x6, x8, xzr\n\t"
11296         "adds	x11, x11, x5\n\t"
11297         "mul	x7, x26, x9\n\t"
11298         "adc	x6, x6, xzr\n\t"
11299         "umulh	x8, x26, x9\n\t"
11300         "str	x11, [%[a], 80]\n\t"
11301         "adds	x10, x10, x7\n\t"
11302         "# a[i+12] += m[12] * mu\n\t"
11303         "ldr	x11, [%[a], 96]\n\t"
11304         "adc	x5, x8, xzr\n\t"
11305         "adds	x10, x10, x6\n\t"
11306         "mul	x7, x27, x9\n\t"
11307         "adc	x5, x5, xzr\n\t"
11308         "umulh	x8, x27, x9\n\t"
11309         "str	x10, [%[a], 88]\n\t"
11310         "adds	x11, x11, x7\n\t"
11311         "# a[i+13] += m[13] * mu\n\t"
11312         "ldr	x10, [%[a], 104]\n\t"
11313         "adc	x6, x8, xzr\n\t"
11314         "adds	x11, x11, x5\n\t"
11315         "mul	x7, x28, x9\n\t"
11316         "adc	x6, x6, xzr\n\t"
11317         "umulh	x8, x28, x9\n\t"
11318         "str	x11, [%[a], 96]\n\t"
11319         "adds	x10, x10, x7\n\t"
11320         "# a[i+14] += m[14] * mu\n\t"
11321         "ldr	x11, [%[a], 112]\n\t"
11322         "adc	x5, x8, xzr\n\t"
11323         "ldr	x8, [%[m], 112]\n\t"
11324         "adds	x10, x10, x6\n\t"
11325         "mul	x7, x8, x9\n\t"
11326         "adc	x5, x5, xzr\n\t"
11327         "umulh	x8, x8, x9\n\t"
11328         "str	x10, [%[a], 104]\n\t"
11329         "adds	x11, x11, x7\n\t"
11330         "# a[i+15] += m[15] * mu\n\t"
11331         "ldr	x10, [%[a], 120]\n\t"
11332         "adc	x6, x8, xzr\n\t"
11333         "ldr	x8, [%[m], 120]\n\t"
11334         "adds	x11, x11, x5\n\t"
11335         "mul	x7, x8, x9\n\t"
11336         "adc	x6, x6, xzr\n\t"
11337         "umulh	x8, x8, x9\n\t"
11338         "str	x11, [%[a], 112]\n\t"
11339         "adds	x10, x10, x7\n\t"
11340         "# a[i+16] += m[16] * mu\n\t"
11341         "ldr	x11, [%[a], 128]\n\t"
11342         "adc	x5, x8, xzr\n\t"
11343         "ldr	x8, [%[m], 128]\n\t"
11344         "adds	x10, x10, x6\n\t"
11345         "mul	x7, x8, x9\n\t"
11346         "adc	x5, x5, xzr\n\t"
11347         "umulh	x8, x8, x9\n\t"
11348         "str	x10, [%[a], 120]\n\t"
11349         "adds	x11, x11, x7\n\t"
11350         "# a[i+17] += m[17] * mu\n\t"
11351         "ldr	x10, [%[a], 136]\n\t"
11352         "adc	x6, x8, xzr\n\t"
11353         "ldr	x8, [%[m], 136]\n\t"
11354         "adds	x11, x11, x5\n\t"
11355         "mul	x7, x8, x9\n\t"
11356         "adc	x6, x6, xzr\n\t"
11357         "umulh	x8, x8, x9\n\t"
11358         "str	x11, [%[a], 128]\n\t"
11359         "adds	x10, x10, x7\n\t"
11360         "# a[i+18] += m[18] * mu\n\t"
11361         "ldr	x11, [%[a], 144]\n\t"
11362         "adc	x5, x8, xzr\n\t"
11363         "ldr	x8, [%[m], 144]\n\t"
11364         "adds	x10, x10, x6\n\t"
11365         "mul	x7, x8, x9\n\t"
11366         "adc	x5, x5, xzr\n\t"
11367         "umulh	x8, x8, x9\n\t"
11368         "str	x10, [%[a], 136]\n\t"
11369         "adds	x11, x11, x7\n\t"
11370         "# a[i+19] += m[19] * mu\n\t"
11371         "ldr	x10, [%[a], 152]\n\t"
11372         "adc	x6, x8, xzr\n\t"
11373         "ldr	x8, [%[m], 152]\n\t"
11374         "adds	x11, x11, x5\n\t"
11375         "mul	x7, x8, x9\n\t"
11376         "adc	x6, x6, xzr\n\t"
11377         "umulh	x8, x8, x9\n\t"
11378         "str	x11, [%[a], 144]\n\t"
11379         "adds	x10, x10, x7\n\t"
11380         "# a[i+20] += m[20] * mu\n\t"
11381         "ldr	x11, [%[a], 160]\n\t"
11382         "adc	x5, x8, xzr\n\t"
11383         "ldr	x8, [%[m], 160]\n\t"
11384         "adds	x10, x10, x6\n\t"
11385         "mul	x7, x8, x9\n\t"
11386         "adc	x5, x5, xzr\n\t"
11387         "umulh	x8, x8, x9\n\t"
11388         "str	x10, [%[a], 152]\n\t"
11389         "adds	x11, x11, x7\n\t"
11390         "# a[i+21] += m[21] * mu\n\t"
11391         "ldr	x10, [%[a], 168]\n\t"
11392         "adc	x6, x8, xzr\n\t"
11393         "ldr	x8, [%[m], 168]\n\t"
11394         "adds	x11, x11, x5\n\t"
11395         "mul	x7, x8, x9\n\t"
11396         "adc	x6, x6, xzr\n\t"
11397         "umulh	x8, x8, x9\n\t"
11398         "str	x11, [%[a], 160]\n\t"
11399         "adds	x10, x10, x7\n\t"
11400         "# a[i+22] += m[22] * mu\n\t"
11401         "ldr	x11, [%[a], 176]\n\t"
11402         "adc	x5, x8, xzr\n\t"
11403         "ldr	x8, [%[m], 176]\n\t"
11404         "adds	x10, x10, x6\n\t"
11405         "mul	x7, x8, x9\n\t"
11406         "adc	x5, x5, xzr\n\t"
11407         "umulh	x8, x8, x9\n\t"
11408         "str	x10, [%[a], 168]\n\t"
11409         "adds	x11, x11, x7\n\t"
11410         "# a[i+23] += m[23] * mu\n\t"
11411         "ldr	x10, [%[a], 184]\n\t"
11412         "adc	x6, x8, xzr\n\t"
11413         "ldr	x8, [%[m], 184]\n\t"
11414         "adds	x11, x11, x5\n\t"
11415         "mul	x7, x8, x9\n\t"
11416         "adc	x6, x6, xzr\n\t"
11417         "umulh	x8, x8, x9\n\t"
11418         "str	x11, [%[a], 176]\n\t"
11419         "adds	x10, x10, x7\n\t"
11420         "# a[i+24] += m[24] * mu\n\t"
11421         "ldr	x11, [%[a], 192]\n\t"
11422         "adc	x5, x8, xzr\n\t"
11423         "ldr	x8, [%[m], 192]\n\t"
11424         "adds	x10, x10, x6\n\t"
11425         "mul	x7, x8, x9\n\t"
11426         "adc	x5, x5, xzr\n\t"
11427         "umulh	x8, x8, x9\n\t"
11428         "str	x10, [%[a], 184]\n\t"
11429         "adds	x11, x11, x7\n\t"
11430         "# a[i+25] += m[25] * mu\n\t"
11431         "ldr	x10, [%[a], 200]\n\t"
11432         "adc	x6, x8, xzr\n\t"
11433         "ldr	x8, [%[m], 200]\n\t"
11434         "adds	x11, x11, x5\n\t"
11435         "mul	x7, x8, x9\n\t"
11436         "adc	x6, x6, xzr\n\t"
11437         "umulh	x8, x8, x9\n\t"
11438         "str	x11, [%[a], 192]\n\t"
11439         "adds	x10, x10, x7\n\t"
11440         "# a[i+26] += m[26] * mu\n\t"
11441         "ldr	x11, [%[a], 208]\n\t"
11442         "adc	x5, x8, xzr\n\t"
11443         "ldr	x8, [%[m], 208]\n\t"
11444         "adds	x10, x10, x6\n\t"
11445         "mul	x7, x8, x9\n\t"
11446         "adc	x5, x5, xzr\n\t"
11447         "umulh	x8, x8, x9\n\t"
11448         "str	x10, [%[a], 200]\n\t"
11449         "adds	x11, x11, x7\n\t"
11450         "# a[i+27] += m[27] * mu\n\t"
11451         "ldr	x10, [%[a], 216]\n\t"
11452         "adc	x6, x8, xzr\n\t"
11453         "ldr	x8, [%[m], 216]\n\t"
11454         "adds	x11, x11, x5\n\t"
11455         "mul	x7, x8, x9\n\t"
11456         "adc	x6, x6, xzr\n\t"
11457         "umulh	x8, x8, x9\n\t"
11458         "str	x11, [%[a], 208]\n\t"
11459         "adds	x10, x10, x7\n\t"
11460         "# a[i+28] += m[28] * mu\n\t"
11461         "ldr	x11, [%[a], 224]\n\t"
11462         "adc	x5, x8, xzr\n\t"
11463         "ldr	x8, [%[m], 224]\n\t"
11464         "adds	x10, x10, x6\n\t"
11465         "mul	x7, x8, x9\n\t"
11466         "adc	x5, x5, xzr\n\t"
11467         "umulh	x8, x8, x9\n\t"
11468         "str	x10, [%[a], 216]\n\t"
11469         "adds	x11, x11, x7\n\t"
11470         "# a[i+29] += m[29] * mu\n\t"
11471         "ldr	x10, [%[a], 232]\n\t"
11472         "adc	x6, x8, xzr\n\t"
11473         "ldr	x8, [%[m], 232]\n\t"
11474         "adds	x11, x11, x5\n\t"
11475         "mul	x7, x8, x9\n\t"
11476         "adc	x6, x6, xzr\n\t"
11477         "umulh	x8, x8, x9\n\t"
11478         "str	x11, [%[a], 224]\n\t"
11479         "adds	x10, x10, x7\n\t"
11480         "# a[i+30] += m[30] * mu\n\t"
11481         "ldr	x11, [%[a], 240]\n\t"
11482         "adc	x5, x8, xzr\n\t"
11483         "ldr	x8, [%[m], 240]\n\t"
11484         "adds	x10, x10, x6\n\t"
11485         "mul	x7, x8, x9\n\t"
11486         "adc	x5, x5, xzr\n\t"
11487         "umulh	x8, x8, x9\n\t"
11488         "str	x10, [%[a], 232]\n\t"
11489         "adds	x11, x11, x7\n\t"
11490         "# a[i+31] += m[31] * mu\n\t"
11491         "ldr	x10, [%[a], 248]\n\t"
11492         "adc	x6, x8, xzr\n\t"
11493         "ldr	x8, [%[m], 248]\n\t"
11494         "adds	x11, x11, x5\n\t"
11495         "mul	x7, x8, x9\n\t"
11496         "adc	x6, x6, xzr\n\t"
11497         "umulh	x8, x8, x9\n\t"
11498         "str	x11, [%[a], 240]\n\t"
11499         "adds	x10, x10, x7\n\t"
11500         "# a[i+32] += m[32] * mu\n\t"
11501         "ldr	x11, [%[a], 256]\n\t"
11502         "adc	x5, x8, xzr\n\t"
11503         "ldr	x8, [%[m], 256]\n\t"
11504         "adds	x10, x10, x6\n\t"
11505         "mul	x7, x8, x9\n\t"
11506         "adc	x5, x5, xzr\n\t"
11507         "umulh	x8, x8, x9\n\t"
11508         "str	x10, [%[a], 248]\n\t"
11509         "adds	x11, x11, x7\n\t"
11510         "# a[i+33] += m[33] * mu\n\t"
11511         "ldr	x10, [%[a], 264]\n\t"
11512         "adc	x6, x8, xzr\n\t"
11513         "ldr	x8, [%[m], 264]\n\t"
11514         "adds	x11, x11, x5\n\t"
11515         "mul	x7, x8, x9\n\t"
11516         "adc	x6, x6, xzr\n\t"
11517         "umulh	x8, x8, x9\n\t"
11518         "str	x11, [%[a], 256]\n\t"
11519         "adds	x10, x10, x7\n\t"
11520         "# a[i+34] += m[34] * mu\n\t"
11521         "ldr	x11, [%[a], 272]\n\t"
11522         "adc	x5, x8, xzr\n\t"
11523         "ldr	x8, [%[m], 272]\n\t"
11524         "adds	x10, x10, x6\n\t"
11525         "mul	x7, x8, x9\n\t"
11526         "adc	x5, x5, xzr\n\t"
11527         "umulh	x8, x8, x9\n\t"
11528         "str	x10, [%[a], 264]\n\t"
11529         "adds	x11, x11, x7\n\t"
11530         "# a[i+35] += m[35] * mu\n\t"
11531         "ldr	x10, [%[a], 280]\n\t"
11532         "adc	x6, x8, xzr\n\t"
11533         "ldr	x8, [%[m], 280]\n\t"
11534         "adds	x11, x11, x5\n\t"
11535         "mul	x7, x8, x9\n\t"
11536         "adc	x6, x6, xzr\n\t"
11537         "umulh	x8, x8, x9\n\t"
11538         "str	x11, [%[a], 272]\n\t"
11539         "adds	x10, x10, x7\n\t"
11540         "# a[i+36] += m[36] * mu\n\t"
11541         "ldr	x11, [%[a], 288]\n\t"
11542         "adc	x5, x8, xzr\n\t"
11543         "ldr	x8, [%[m], 288]\n\t"
11544         "adds	x10, x10, x6\n\t"
11545         "mul	x7, x8, x9\n\t"
11546         "adc	x5, x5, xzr\n\t"
11547         "umulh	x8, x8, x9\n\t"
11548         "str	x10, [%[a], 280]\n\t"
11549         "adds	x11, x11, x7\n\t"
11550         "# a[i+37] += m[37] * mu\n\t"
11551         "ldr	x10, [%[a], 296]\n\t"
11552         "adc	x6, x8, xzr\n\t"
11553         "ldr	x8, [%[m], 296]\n\t"
11554         "adds	x11, x11, x5\n\t"
11555         "mul	x7, x8, x9\n\t"
11556         "adc	x6, x6, xzr\n\t"
11557         "umulh	x8, x8, x9\n\t"
11558         "str	x11, [%[a], 288]\n\t"
11559         "adds	x10, x10, x7\n\t"
11560         "# a[i+38] += m[38] * mu\n\t"
11561         "ldr	x11, [%[a], 304]\n\t"
11562         "adc	x5, x8, xzr\n\t"
11563         "ldr	x8, [%[m], 304]\n\t"
11564         "adds	x10, x10, x6\n\t"
11565         "mul	x7, x8, x9\n\t"
11566         "adc	x5, x5, xzr\n\t"
11567         "umulh	x8, x8, x9\n\t"
11568         "str	x10, [%[a], 296]\n\t"
11569         "adds	x11, x11, x7\n\t"
11570         "# a[i+39] += m[39] * mu\n\t"
11571         "ldr	x10, [%[a], 312]\n\t"
11572         "adc	x6, x8, xzr\n\t"
11573         "ldr	x8, [%[m], 312]\n\t"
11574         "adds	x11, x11, x5\n\t"
11575         "mul	x7, x8, x9\n\t"
11576         "adc	x6, x6, xzr\n\t"
11577         "umulh	x8, x8, x9\n\t"
11578         "str	x11, [%[a], 304]\n\t"
11579         "adds	x10, x10, x7\n\t"
11580         "# a[i+40] += m[40] * mu\n\t"
11581         "ldr	x11, [%[a], 320]\n\t"
11582         "adc	x5, x8, xzr\n\t"
11583         "ldr	x8, [%[m], 320]\n\t"
11584         "adds	x10, x10, x6\n\t"
11585         "mul	x7, x8, x9\n\t"
11586         "adc	x5, x5, xzr\n\t"
11587         "umulh	x8, x8, x9\n\t"
11588         "str	x10, [%[a], 312]\n\t"
11589         "adds	x11, x11, x7\n\t"
11590         "# a[i+41] += m[41] * mu\n\t"
11591         "ldr	x10, [%[a], 328]\n\t"
11592         "adc	x6, x8, xzr\n\t"
11593         "ldr	x8, [%[m], 328]\n\t"
11594         "adds	x11, x11, x5\n\t"
11595         "mul	x7, x8, x9\n\t"
11596         "adc	x6, x6, xzr\n\t"
11597         "umulh	x8, x8, x9\n\t"
11598         "str	x11, [%[a], 320]\n\t"
11599         "adds	x10, x10, x7\n\t"
11600         "# a[i+42] += m[42] * mu\n\t"
11601         "ldr	x11, [%[a], 336]\n\t"
11602         "adc	x5, x8, xzr\n\t"
11603         "ldr	x8, [%[m], 336]\n\t"
11604         "adds	x10, x10, x6\n\t"
11605         "mul	x7, x8, x9\n\t"
11606         "adc	x5, x5, xzr\n\t"
11607         "umulh	x8, x8, x9\n\t"
11608         "str	x10, [%[a], 328]\n\t"
11609         "adds	x11, x11, x7\n\t"
11610         "# a[i+43] += m[43] * mu\n\t"
11611         "ldr	x10, [%[a], 344]\n\t"
11612         "adc	x6, x8, xzr\n\t"
11613         "ldr	x8, [%[m], 344]\n\t"
11614         "adds	x11, x11, x5\n\t"
11615         "mul	x7, x8, x9\n\t"
11616         "adc	x6, x6, xzr\n\t"
11617         "umulh	x8, x8, x9\n\t"
11618         "str	x11, [%[a], 336]\n\t"
11619         "adds	x10, x10, x7\n\t"
11620         "# a[i+44] += m[44] * mu\n\t"
11621         "ldr	x11, [%[a], 352]\n\t"
11622         "adc	x5, x8, xzr\n\t"
11623         "ldr	x8, [%[m], 352]\n\t"
11624         "adds	x10, x10, x6\n\t"
11625         "mul	x7, x8, x9\n\t"
11626         "adc	x5, x5, xzr\n\t"
11627         "umulh	x8, x8, x9\n\t"
11628         "str	x10, [%[a], 344]\n\t"
11629         "adds	x11, x11, x7\n\t"
11630         "# a[i+45] += m[45] * mu\n\t"
11631         "ldr	x10, [%[a], 360]\n\t"
11632         "adc	x6, x8, xzr\n\t"
11633         "ldr	x8, [%[m], 360]\n\t"
11634         "adds	x11, x11, x5\n\t"
11635         "mul	x7, x8, x9\n\t"
11636         "adc	x6, x6, xzr\n\t"
11637         "umulh	x8, x8, x9\n\t"
11638         "str	x11, [%[a], 352]\n\t"
11639         "adds	x10, x10, x7\n\t"
11640         "# a[i+46] += m[46] * mu\n\t"
11641         "ldr	x11, [%[a], 368]\n\t"
11642         "adc	x5, x8, xzr\n\t"
11643         "ldr	x8, [%[m], 368]\n\t"
11644         "adds	x10, x10, x6\n\t"
11645         "mul	x7, x8, x9\n\t"
11646         "adc	x5, x5, xzr\n\t"
11647         "umulh	x8, x8, x9\n\t"
11648         "str	x10, [%[a], 360]\n\t"
11649         "adds	x11, x11, x7\n\t"
11650         "# a[i+47] += m[47] * mu\n\t"
11651         "ldr	x10, [%[a], 376]\n\t"
11652         "adc	x6, x8, xzr\n\t"
11653         "ldr	x8, [%[m], 376]\n\t"
11654         "adds	x11, x11, x5\n\t"
11655         "mul	x7, x8, x9\n\t"
11656         "adc	x6, x6, xzr\n\t"
11657         "umulh	x8, x8, x9\n\t"
11658         "adds	x6, x6, x7\n\t"
11659         "adcs	x8, x8, x3\n\t"
11660         "str	x11, [%[a], 368]\n\t"
11661         "cset  x3, cs\n\t"
11662         "adds	x10, x10, x6\n\t"
11663         "ldr	x11, [%[a], 384]\n\t"
11664         "str	x10, [%[a], 376]\n\t"
11665         "adcs	x11, x11, x8\n\t"
11666         "str	x11, [%[a], 384]\n\t"
11667         "adc	x3, x3, xzr\n\t"
11668         "subs	x4, x4, 1\n\t"
11669         "add	%[a], %[a], 8\n\t"
11670         "bne	1b\n\t"
11671         "# x12 and x13 hold a[0] and a[1]\n\t"
11672         "# Create mask\n\t"
11673         "neg       x3, x3\n\t"
11674         "mov   x9, %[a]\n\t"
11675         "sub   %[a], %[a], 384\n\t"
11676         "# Subtract masked modulus\n\t"
11677         "# x12 and x13 hold a[0] and a[1]\n\t"
11678         "and       x14, x14, x3\n\t"
11679         "ldp       x11, x10, [x9, 16]\n\t"
11680         "and       x15, x15, x3\n\t"
11681         "subs      x12, x12, x14\n\t"
11682         "and       x16, x16, x3\n\t"
11683         "sbcs      x13, x13, x15\n\t"
11684         "and       x17, x17, x3\n\t"
11685         "sbcs      x11, x11, x16\n\t"
11686         "stp       x12, x13, [%[a], 0]\n\t"
11687         "sbcs      x10, x10, x17\n\t"
11688         "stp       x11, x10, [%[a], 16]\n\t"
11689         "ldp       x12, x13, [x9, 32]\n\t"
11690         "and       x19, x19, x3\n\t"
11691         "ldp       x11, x10, [x9, 48]\n\t"
11692         "and       x20, x20, x3\n\t"
11693         "sbcs      x12, x12, x19\n\t"
11694         "and       x21, x21, x3\n\t"
11695         "sbcs      x13, x13, x20\n\t"
11696         "and       x22, x22, x3\n\t"
11697         "sbcs      x11, x11, x21\n\t"
11698         "stp       x12, x13, [%[a], 32]\n\t"
11699         "sbcs      x10, x10, x22\n\t"
11700         "stp       x11, x10, [%[a], 48]\n\t"
11701         "ldp       x12, x13, [x9, 64]\n\t"
11702         "and       x23, x23, x3\n\t"
11703         "ldp       x11, x10, [x9, 80]\n\t"
11704         "and       x24, x24, x3\n\t"
11705         "sbcs      x12, x12, x23\n\t"
11706         "and       x25, x25, x3\n\t"
11707         "sbcs      x13, x13, x24\n\t"
11708         "and       x26, x26, x3\n\t"
11709         "sbcs      x11, x11, x25\n\t"
11710         "stp       x12, x13, [%[a], 64]\n\t"
11711         "sbcs      x10, x10, x26\n\t"
11712         "stp       x11, x10, [%[a], 80]\n\t"
11713         "ldp       x7, x8, [%[m], 112]\n\t"
11714         "ldp       x12, x13, [x9, 96]\n\t"
11715         "and       x27, x27, x3\n\t"
11716         "ldp       x11, x10, [x9, 112]\n\t"
11717         "and       x28, x28, x3\n\t"
11718         "sbcs      x12, x12, x27\n\t"
11719         "and       x7, x7, x3\n\t"
11720         "sbcs      x13, x13, x28\n\t"
11721         "and       x8, x8, x3\n\t"
11722         "sbcs      x11, x11, x7\n\t"
11723         "stp       x12, x13, [%[a], 96]\n\t"
11724         "sbcs      x10, x10, x8\n\t"
11725         "stp       x11, x10, [%[a], 112]\n\t"
11726         "ldp       x5, x6, [%[m], 128]\n\t"
11727         "ldp       x7, x8, [%[m], 144]\n\t"
11728         "ldp       x12, x13, [x9, 128]\n\t"
11729         "and       x5, x5, x3\n\t"
11730         "ldp       x11, x10, [x9, 144]\n\t"
11731         "and       x6, x6, x3\n\t"
11732         "sbcs      x12, x12, x5\n\t"
11733         "and       x7, x7, x3\n\t"
11734         "sbcs      x13, x13, x6\n\t"
11735         "and       x8, x8, x3\n\t"
11736         "sbcs      x11, x11, x7\n\t"
11737         "stp       x12, x13, [%[a], 128]\n\t"
11738         "sbcs      x10, x10, x8\n\t"
11739         "stp       x11, x10, [%[a], 144]\n\t"
11740         "ldp       x5, x6, [%[m], 160]\n\t"
11741         "ldp       x7, x8, [%[m], 176]\n\t"
11742         "ldp       x12, x13, [x9, 160]\n\t"
11743         "and       x5, x5, x3\n\t"
11744         "ldp       x11, x10, [x9, 176]\n\t"
11745         "and       x6, x6, x3\n\t"
11746         "sbcs      x12, x12, x5\n\t"
11747         "and       x7, x7, x3\n\t"
11748         "sbcs      x13, x13, x6\n\t"
11749         "and       x8, x8, x3\n\t"
11750         "sbcs      x11, x11, x7\n\t"
11751         "stp       x12, x13, [%[a], 160]\n\t"
11752         "sbcs      x10, x10, x8\n\t"
11753         "stp       x11, x10, [%[a], 176]\n\t"
11754         "ldp       x5, x6, [%[m], 192]\n\t"
11755         "ldp       x7, x8, [%[m], 208]\n\t"
11756         "ldp       x12, x13, [x9, 192]\n\t"
11757         "and       x5, x5, x3\n\t"
11758         "ldp       x11, x10, [x9, 208]\n\t"
11759         "and       x6, x6, x3\n\t"
11760         "sbcs      x12, x12, x5\n\t"
11761         "and       x7, x7, x3\n\t"
11762         "sbcs      x13, x13, x6\n\t"
11763         "and       x8, x8, x3\n\t"
11764         "sbcs      x11, x11, x7\n\t"
11765         "stp       x12, x13, [%[a], 192]\n\t"
11766         "sbcs      x10, x10, x8\n\t"
11767         "stp       x11, x10, [%[a], 208]\n\t"
11768         "ldp       x5, x6, [%[m], 224]\n\t"
11769         "ldp       x7, x8, [%[m], 240]\n\t"
11770         "ldp       x12, x13, [x9, 224]\n\t"
11771         "and       x5, x5, x3\n\t"
11772         "ldp       x11, x10, [x9, 240]\n\t"
11773         "and       x6, x6, x3\n\t"
11774         "sbcs      x12, x12, x5\n\t"
11775         "and       x7, x7, x3\n\t"
11776         "sbcs      x13, x13, x6\n\t"
11777         "and       x8, x8, x3\n\t"
11778         "sbcs      x11, x11, x7\n\t"
11779         "stp       x12, x13, [%[a], 224]\n\t"
11780         "sbcs      x10, x10, x8\n\t"
11781         "stp       x11, x10, [%[a], 240]\n\t"
11782         "ldp       x5, x6, [%[m], 256]\n\t"
11783         "ldp       x7, x8, [%[m], 272]\n\t"
11784         "ldp       x12, x13, [x9, 256]\n\t"
11785         "and       x5, x5, x3\n\t"
11786         "ldp       x11, x10, [x9, 272]\n\t"
11787         "and       x6, x6, x3\n\t"
11788         "sbcs      x12, x12, x5\n\t"
11789         "and       x7, x7, x3\n\t"
11790         "sbcs      x13, x13, x6\n\t"
11791         "and       x8, x8, x3\n\t"
11792         "sbcs      x11, x11, x7\n\t"
11793         "stp       x12, x13, [%[a], 256]\n\t"
11794         "sbcs      x10, x10, x8\n\t"
11795         "stp       x11, x10, [%[a], 272]\n\t"
11796         "ldp       x5, x6, [%[m], 288]\n\t"
11797         "ldp       x7, x8, [%[m], 304]\n\t"
11798         "ldp       x12, x13, [x9, 288]\n\t"
11799         "and       x5, x5, x3\n\t"
11800         "ldp       x11, x10, [x9, 304]\n\t"
11801         "and       x6, x6, x3\n\t"
11802         "sbcs      x12, x12, x5\n\t"
11803         "and       x7, x7, x3\n\t"
11804         "sbcs      x13, x13, x6\n\t"
11805         "and       x8, x8, x3\n\t"
11806         "sbcs      x11, x11, x7\n\t"
11807         "stp       x12, x13, [%[a], 288]\n\t"
11808         "sbcs      x10, x10, x8\n\t"
11809         "stp       x11, x10, [%[a], 304]\n\t"
11810         "ldp       x5, x6, [%[m], 320]\n\t"
11811         "ldp       x7, x8, [%[m], 336]\n\t"
11812         "ldp       x12, x13, [x9, 320]\n\t"
11813         "and       x5, x5, x3\n\t"
11814         "ldp       x11, x10, [x9, 336]\n\t"
11815         "and       x6, x6, x3\n\t"
11816         "sbcs      x12, x12, x5\n\t"
11817         "and       x7, x7, x3\n\t"
11818         "sbcs      x13, x13, x6\n\t"
11819         "and       x8, x8, x3\n\t"
11820         "sbcs      x11, x11, x7\n\t"
11821         "stp       x12, x13, [%[a], 320]\n\t"
11822         "sbcs      x10, x10, x8\n\t"
11823         "stp       x11, x10, [%[a], 336]\n\t"
11824         "ldp       x5, x6, [%[m], 352]\n\t"
11825         "ldp       x7, x8, [%[m], 368]\n\t"
11826         "ldp       x12, x13, [x9, 352]\n\t"
11827         "and       x5, x5, x3\n\t"
11828         "ldp       x11, x10, [x9, 368]\n\t"
11829         "and       x6, x6, x3\n\t"
11830         "sbcs      x12, x12, x5\n\t"
11831         "and       x7, x7, x3\n\t"
11832         "sbcs      x13, x13, x6\n\t"
11833         "and       x8, x8, x3\n\t"
11834         "sbcs      x11, x11, x7\n\t"
11835         "stp       x12, x13, [%[a], 352]\n\t"
11836         "sbcs      x10, x10, x8\n\t"
11837         "stp       x11, x10, [%[a], 368]\n\t"
11838         : [a] "+r" (a)
11839         : [m] "r" (m), [mp] "r" (mp)
11840         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
11841     );
11842 
11843 }
11844 
11845 /* Multiply two Montgomery form numbers mod the modulus (prime).
11846  * (r = a * b mod m)
11847  *
11848  * r   Result of multiplication.
11849  * a   First number to multiply in Montgomery form.
11850  * b   Second number to multiply in Montgomery form.
11851  * m   Modulus (prime).
11852  * mp  Montgomery mulitplier.
11853  */
sp_3072_mont_mul_48(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m,sp_digit mp)11854 static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a,
11855         const sp_digit* b, const sp_digit* m, sp_digit mp)
11856 {
11857     sp_3072_mul_48(r, a, b);
11858     sp_3072_mont_reduce_48(r, m, mp);
11859 }
11860 
11861 /* Square the Montgomery form number. (r = a * a mod m)
11862  *
11863  * r   Result of squaring.
11864  * a   Number to square in Montgomery form.
11865  * m   Modulus (prime).
11866  * mp  Montgomery mulitplier.
11867  */
sp_3072_mont_sqr_48(sp_digit * r,const sp_digit * a,const sp_digit * m,sp_digit mp)11868 static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a,
11869         const sp_digit* m, sp_digit mp)
11870 {
11871     sp_3072_sqr_48(r, a);
11872     sp_3072_mont_reduce_48(r, m, mp);
11873 }
11874 
11875 #ifdef WOLFSSL_SP_SMALL
11876 /* Sub b from a into r. (r = a - b)
11877  *
11878  * r  A single precision integer.
11879  * a  A single precision integer.
11880  * b  A single precision integer.
11881  */
sp_3072_sub_48(sp_digit * r,const sp_digit * a,const sp_digit * b)11882 static sp_digit sp_3072_sub_48(sp_digit* r, const sp_digit* a,
11883         const sp_digit* b)
11884 {
11885     sp_digit c = 0;
11886 
11887     __asm__ __volatile__ (
11888         "add	x11, %[a], 384\n\t"
11889         "\n1:\n\t"
11890         "subs	%[c], xzr, %[c]\n\t"
11891         "ldp	x3, x4, [%[a]], #16\n\t"
11892         "ldp	x5, x6, [%[a]], #16\n\t"
11893         "ldp	x7, x8, [%[b]], #16\n\t"
11894         "sbcs	x3, x3, x7\n\t"
11895         "ldp	x9, x10, [%[b]], #16\n\t"
11896         "sbcs	x4, x4, x8\n\t"
11897         "sbcs	x5, x5, x9\n\t"
11898         "stp	x3, x4, [%[r]], #16\n\t"
11899         "sbcs	x6, x6, x10\n\t"
11900         "stp	x5, x6, [%[r]], #16\n\t"
11901         "csetm	%[c], cc\n\t"
11902         "cmp	%[a], x11\n\t"
11903         "b.ne	1b\n\t"
11904         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
11905         :
11906         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
11907     );
11908 
11909     return c;
11910 }
11911 
11912 #else
11913 /* Sub b from a into r. (r = a - b)
11914  *
11915  * r  A single precision integer.
11916  * a  A single precision integer.
11917  * b  A single precision integer.
11918  */
sp_3072_sub_48(sp_digit * r,const sp_digit * a,const sp_digit * b)11919 static sp_digit sp_3072_sub_48(sp_digit* r, const sp_digit* a,
11920         const sp_digit* b)
11921 {
11922     __asm__ __volatile__ (
11923         "ldp	x3, x4, [%[a], 0]\n\t"
11924         "ldp	x7, x8, [%[b], 0]\n\t"
11925         "subs	x3, x3, x7\n\t"
11926         "ldp	x5, x6, [%[a], 16]\n\t"
11927         "sbcs	x4, x4, x8\n\t"
11928         "ldp	x9, x10, [%[b], 16]\n\t"
11929         "sbcs	x5, x5, x9\n\t"
11930         "stp	x3, x4, [%[r], 0]\n\t"
11931         "sbcs	x6, x6, x10\n\t"
11932         "stp	x5, x6, [%[r], 16]\n\t"
11933         "ldp	x3, x4, [%[a], 32]\n\t"
11934         "ldp	x7, x8, [%[b], 32]\n\t"
11935         "sbcs	x3, x3, x7\n\t"
11936         "ldp	x5, x6, [%[a], 48]\n\t"
11937         "sbcs	x4, x4, x8\n\t"
11938         "ldp	x9, x10, [%[b], 48]\n\t"
11939         "sbcs	x5, x5, x9\n\t"
11940         "stp	x3, x4, [%[r], 32]\n\t"
11941         "sbcs	x6, x6, x10\n\t"
11942         "stp	x5, x6, [%[r], 48]\n\t"
11943         "ldp	x3, x4, [%[a], 64]\n\t"
11944         "ldp	x7, x8, [%[b], 64]\n\t"
11945         "sbcs	x3, x3, x7\n\t"
11946         "ldp	x5, x6, [%[a], 80]\n\t"
11947         "sbcs	x4, x4, x8\n\t"
11948         "ldp	x9, x10, [%[b], 80]\n\t"
11949         "sbcs	x5, x5, x9\n\t"
11950         "stp	x3, x4, [%[r], 64]\n\t"
11951         "sbcs	x6, x6, x10\n\t"
11952         "stp	x5, x6, [%[r], 80]\n\t"
11953         "ldp	x3, x4, [%[a], 96]\n\t"
11954         "ldp	x7, x8, [%[b], 96]\n\t"
11955         "sbcs	x3, x3, x7\n\t"
11956         "ldp	x5, x6, [%[a], 112]\n\t"
11957         "sbcs	x4, x4, x8\n\t"
11958         "ldp	x9, x10, [%[b], 112]\n\t"
11959         "sbcs	x5, x5, x9\n\t"
11960         "stp	x3, x4, [%[r], 96]\n\t"
11961         "sbcs	x6, x6, x10\n\t"
11962         "stp	x5, x6, [%[r], 112]\n\t"
11963         "ldp	x3, x4, [%[a], 128]\n\t"
11964         "ldp	x7, x8, [%[b], 128]\n\t"
11965         "sbcs	x3, x3, x7\n\t"
11966         "ldp	x5, x6, [%[a], 144]\n\t"
11967         "sbcs	x4, x4, x8\n\t"
11968         "ldp	x9, x10, [%[b], 144]\n\t"
11969         "sbcs	x5, x5, x9\n\t"
11970         "stp	x3, x4, [%[r], 128]\n\t"
11971         "sbcs	x6, x6, x10\n\t"
11972         "stp	x5, x6, [%[r], 144]\n\t"
11973         "ldp	x3, x4, [%[a], 160]\n\t"
11974         "ldp	x7, x8, [%[b], 160]\n\t"
11975         "sbcs	x3, x3, x7\n\t"
11976         "ldp	x5, x6, [%[a], 176]\n\t"
11977         "sbcs	x4, x4, x8\n\t"
11978         "ldp	x9, x10, [%[b], 176]\n\t"
11979         "sbcs	x5, x5, x9\n\t"
11980         "stp	x3, x4, [%[r], 160]\n\t"
11981         "sbcs	x6, x6, x10\n\t"
11982         "stp	x5, x6, [%[r], 176]\n\t"
11983         "ldp	x3, x4, [%[a], 192]\n\t"
11984         "ldp	x7, x8, [%[b], 192]\n\t"
11985         "sbcs	x3, x3, x7\n\t"
11986         "ldp	x5, x6, [%[a], 208]\n\t"
11987         "sbcs	x4, x4, x8\n\t"
11988         "ldp	x9, x10, [%[b], 208]\n\t"
11989         "sbcs	x5, x5, x9\n\t"
11990         "stp	x3, x4, [%[r], 192]\n\t"
11991         "sbcs	x6, x6, x10\n\t"
11992         "stp	x5, x6, [%[r], 208]\n\t"
11993         "ldp	x3, x4, [%[a], 224]\n\t"
11994         "ldp	x7, x8, [%[b], 224]\n\t"
11995         "sbcs	x3, x3, x7\n\t"
11996         "ldp	x5, x6, [%[a], 240]\n\t"
11997         "sbcs	x4, x4, x8\n\t"
11998         "ldp	x9, x10, [%[b], 240]\n\t"
11999         "sbcs	x5, x5, x9\n\t"
12000         "stp	x3, x4, [%[r], 224]\n\t"
12001         "sbcs	x6, x6, x10\n\t"
12002         "stp	x5, x6, [%[r], 240]\n\t"
12003         "ldp	x3, x4, [%[a], 256]\n\t"
12004         "ldp	x7, x8, [%[b], 256]\n\t"
12005         "sbcs	x3, x3, x7\n\t"
12006         "ldp	x5, x6, [%[a], 272]\n\t"
12007         "sbcs	x4, x4, x8\n\t"
12008         "ldp	x9, x10, [%[b], 272]\n\t"
12009         "sbcs	x5, x5, x9\n\t"
12010         "stp	x3, x4, [%[r], 256]\n\t"
12011         "sbcs	x6, x6, x10\n\t"
12012         "stp	x5, x6, [%[r], 272]\n\t"
12013         "ldp	x3, x4, [%[a], 288]\n\t"
12014         "ldp	x7, x8, [%[b], 288]\n\t"
12015         "sbcs	x3, x3, x7\n\t"
12016         "ldp	x5, x6, [%[a], 304]\n\t"
12017         "sbcs	x4, x4, x8\n\t"
12018         "ldp	x9, x10, [%[b], 304]\n\t"
12019         "sbcs	x5, x5, x9\n\t"
12020         "stp	x3, x4, [%[r], 288]\n\t"
12021         "sbcs	x6, x6, x10\n\t"
12022         "stp	x5, x6, [%[r], 304]\n\t"
12023         "ldp	x3, x4, [%[a], 320]\n\t"
12024         "ldp	x7, x8, [%[b], 320]\n\t"
12025         "sbcs	x3, x3, x7\n\t"
12026         "ldp	x5, x6, [%[a], 336]\n\t"
12027         "sbcs	x4, x4, x8\n\t"
12028         "ldp	x9, x10, [%[b], 336]\n\t"
12029         "sbcs	x5, x5, x9\n\t"
12030         "stp	x3, x4, [%[r], 320]\n\t"
12031         "sbcs	x6, x6, x10\n\t"
12032         "stp	x5, x6, [%[r], 336]\n\t"
12033         "ldp	x3, x4, [%[a], 352]\n\t"
12034         "ldp	x7, x8, [%[b], 352]\n\t"
12035         "sbcs	x3, x3, x7\n\t"
12036         "ldp	x5, x6, [%[a], 368]\n\t"
12037         "sbcs	x4, x4, x8\n\t"
12038         "ldp	x9, x10, [%[b], 368]\n\t"
12039         "sbcs	x5, x5, x9\n\t"
12040         "stp	x3, x4, [%[r], 352]\n\t"
12041         "sbcs	x6, x6, x10\n\t"
12042         "stp	x5, x6, [%[r], 368]\n\t"
12043         "csetm	%[r], cc\n\t"
12044         : [r] "+r" (r)
12045         : [a] "r" (a), [b] "r" (b)
12046         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
12047     );
12048 
12049     return (sp_digit)r;
12050 }
12051 
12052 #endif /* WOLFSSL_SP_SMALL */
12053 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
12054  *
12055  * d1   The high order half of the number to divide.
12056  * d0   The low order half of the number to divide.
12057  * div  The dividend.
12058  * returns the result of the division.
12059  */
div_3072_word_48(sp_digit d1,sp_digit d0,sp_digit div)12060 static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0, sp_digit div)
12061 {
12062     sp_digit r;
12063 
12064     __asm__ __volatile__ (
12065         "lsr	x5, %[div], 32\n\t"
12066         "add	x5, x5, 1\n\t"
12067 
12068         "udiv	x3, %[d1], x5\n\t"
12069         "lsl	x6, x3, 32\n\t"
12070         "mul	x4, %[div], x6\n\t"
12071         "umulh	x3, %[div], x6\n\t"
12072         "subs	%[d0], %[d0], x4\n\t"
12073         "sbc	%[d1], %[d1], x3\n\t"
12074 
12075         "udiv	x3, %[d1], x5\n\t"
12076         "lsl	x3, x3, 32\n\t"
12077         "add	x6, x6, x3\n\t"
12078         "mul	x4, %[div], x3\n\t"
12079         "umulh	x3, %[div], x3\n\t"
12080         "subs	%[d0], %[d0], x4\n\t"
12081         "sbc	%[d1], %[d1], x3\n\t"
12082 
12083         "lsr	x3, %[d0], 32\n\t"
12084         "orr	x3, x3, %[d1], lsl 32\n\t"
12085 
12086         "udiv	x3, x3, x5\n\t"
12087         "add	x6, x6, x3\n\t"
12088         "mul	x4, %[div], x3\n\t"
12089         "umulh	x3, %[div], x3\n\t"
12090         "subs	%[d0], %[d0], x4\n\t"
12091         "sbc	%[d1], %[d1], x3\n\t"
12092 
12093         "lsr	x3, %[d0], 32\n\t"
12094         "orr	x3, x3, %[d1], lsl 32\n\t"
12095 
12096         "udiv	x3, x3, x5\n\t"
12097         "add	x6, x6, x3\n\t"
12098         "mul	x4, %[div], x3\n\t"
12099         "sub	%[d0], %[d0], x4\n\t"
12100 
12101         "udiv	x3, %[d0], %[div]\n\t"
12102         "add	%[r], x6, x3\n\t"
12103 
12104         : [r] "=r" (r)
12105         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
12106         : "x3", "x4", "x5", "x6"
12107     );
12108 
12109     return r;
12110 }
12111 
12112 /* Divide d in a and put remainder into r (m*d + r = a)
12113  * m is not calculated as it is not needed at this time.
12114  *
12115  * a  Number to be divided.
12116  * d  Number to divide with.
12117  * m  Multiplier result.
12118  * r  Remainder from the division.
12119  * returns MP_OKAY indicating success.
12120  */
sp_3072_div_48_cond(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)12121 static WC_INLINE int sp_3072_div_48_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
12122         sp_digit* r)
12123 {
12124     sp_digit t1[96], t2[49];
12125     sp_digit div, r1;
12126     int i;
12127 
12128     (void)m;
12129 
12130     div = d[47];
12131     XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
12132     for (i=47; i>=0; i--) {
12133         sp_digit hi = t1[48 + i] - (t1[48 + i] == div);
12134         r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
12135 
12136         sp_3072_mul_d_48(t2, d, r1);
12137         t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
12138         t1[48 + i] -= t2[48];
12139         if (t1[48 + i] != 0) {
12140             t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], d);
12141             if (t1[48 + i] != 0)
12142                 t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], d);
12143         }
12144     }
12145 
12146     for (i = 47; i > 0; i--) {
12147         if (t1[i] != d[i])
12148             break;
12149     }
12150     if (t1[i] >= d[i]) {
12151         sp_3072_sub_48(r, t1, d);
12152     }
12153     else {
12154         XMEMCPY(r, t1, sizeof(*t1) * 48);
12155     }
12156 
12157     return MP_OKAY;
12158 }
12159 
12160 /* Reduce a modulo m into r. (r = a mod m)
12161  *
12162  * r  A single precision number that is the reduced result.
12163  * a  A single precision number that is to be reduced.
12164  * m  A single precision number that is the modulus to reduce with.
12165  * returns MP_OKAY indicating success.
12166  */
sp_3072_mod_48_cond(sp_digit * r,const sp_digit * a,const sp_digit * m)12167 static WC_INLINE int sp_3072_mod_48_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
12168 {
12169     return sp_3072_div_48_cond(a, m, NULL, r);
12170 }
12171 
12172 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
12173 /* Conditionally subtract b from a using the mask m.
12174  * m is -1 to subtract and 0 when not copying.
12175  *
12176  * r  A single precision number representing condition subtract result.
12177  * a  A single precision number to subtract from.
12178  * b  A single precision number to subtract.
12179  * m  Mask value to apply.
12180  */
sp_3072_cond_sub_48(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)12181 static sp_digit sp_3072_cond_sub_48(sp_digit* r, const sp_digit* a, const sp_digit* b,
12182         sp_digit m)
12183 {
12184 #ifdef WOLFSSL_SP_SMALL
12185     sp_digit c = 0;
12186 
12187     __asm__ __volatile__ (
12188         "mov	x8, #0\n\t"
12189         "1:\n\t"
12190         "subs	%[c], xzr, %[c]\n\t"
12191         "ldr	x4, [%[a], x8]\n\t"
12192         "ldr	x5, [%[b], x8]\n\t"
12193         "and	x5, x5, %[m]\n\t"
12194         "sbcs	x4, x4, x5\n\t"
12195         "csetm	%[c], cc\n\t"
12196         "str	x4, [%[r], x8]\n\t"
12197         "add	x8, x8, #8\n\t"
12198         "cmp	x8, 384\n\t"
12199         "b.lt	1b\n\t"
12200         : [c] "+r" (c)
12201         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
12202         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
12203     );
12204 
12205     return c;
12206 #else
12207     __asm__ __volatile__ (
12208 
12209         "ldp	x5, x7, [%[b], 0]\n\t"
12210         "ldp	x11, x12, [%[b], 16]\n\t"
12211         "ldp	x4, x6, [%[a], 0]\n\t"
12212         "and	x5, x5, %[m]\n\t"
12213         "ldp	x9, x10, [%[a], 16]\n\t"
12214         "and	x7, x7, %[m]\n\t"
12215         "subs	x4, x4, x5\n\t"
12216         "and	x11, x11, %[m]\n\t"
12217         "sbcs	x6, x6, x7\n\t"
12218         "and	x12, x12, %[m]\n\t"
12219         "sbcs	x9, x9, x11\n\t"
12220         "stp	x4, x6, [%[r], 0]\n\t"
12221         "sbcs	x10, x10, x12\n\t"
12222         "stp	x9, x10, [%[r], 16]\n\t"
12223         "ldp	x5, x7, [%[b], 32]\n\t"
12224         "ldp	x11, x12, [%[b], 48]\n\t"
12225         "ldp	x4, x6, [%[a], 32]\n\t"
12226         "and	x5, x5, %[m]\n\t"
12227         "ldp	x9, x10, [%[a], 48]\n\t"
12228         "and	x7, x7, %[m]\n\t"
12229         "sbcs	x4, x4, x5\n\t"
12230         "and	x11, x11, %[m]\n\t"
12231         "sbcs	x6, x6, x7\n\t"
12232         "and	x12, x12, %[m]\n\t"
12233         "sbcs	x9, x9, x11\n\t"
12234         "stp	x4, x6, [%[r], 32]\n\t"
12235         "sbcs	x10, x10, x12\n\t"
12236         "stp	x9, x10, [%[r], 48]\n\t"
12237         "ldp	x5, x7, [%[b], 64]\n\t"
12238         "ldp	x11, x12, [%[b], 80]\n\t"
12239         "ldp	x4, x6, [%[a], 64]\n\t"
12240         "and	x5, x5, %[m]\n\t"
12241         "ldp	x9, x10, [%[a], 80]\n\t"
12242         "and	x7, x7, %[m]\n\t"
12243         "sbcs	x4, x4, x5\n\t"
12244         "and	x11, x11, %[m]\n\t"
12245         "sbcs	x6, x6, x7\n\t"
12246         "and	x12, x12, %[m]\n\t"
12247         "sbcs	x9, x9, x11\n\t"
12248         "stp	x4, x6, [%[r], 64]\n\t"
12249         "sbcs	x10, x10, x12\n\t"
12250         "stp	x9, x10, [%[r], 80]\n\t"
12251         "ldp	x5, x7, [%[b], 96]\n\t"
12252         "ldp	x11, x12, [%[b], 112]\n\t"
12253         "ldp	x4, x6, [%[a], 96]\n\t"
12254         "and	x5, x5, %[m]\n\t"
12255         "ldp	x9, x10, [%[a], 112]\n\t"
12256         "and	x7, x7, %[m]\n\t"
12257         "sbcs	x4, x4, x5\n\t"
12258         "and	x11, x11, %[m]\n\t"
12259         "sbcs	x6, x6, x7\n\t"
12260         "and	x12, x12, %[m]\n\t"
12261         "sbcs	x9, x9, x11\n\t"
12262         "stp	x4, x6, [%[r], 96]\n\t"
12263         "sbcs	x10, x10, x12\n\t"
12264         "stp	x9, x10, [%[r], 112]\n\t"
12265         "ldp	x5, x7, [%[b], 128]\n\t"
12266         "ldp	x11, x12, [%[b], 144]\n\t"
12267         "ldp	x4, x6, [%[a], 128]\n\t"
12268         "and	x5, x5, %[m]\n\t"
12269         "ldp	x9, x10, [%[a], 144]\n\t"
12270         "and	x7, x7, %[m]\n\t"
12271         "sbcs	x4, x4, x5\n\t"
12272         "and	x11, x11, %[m]\n\t"
12273         "sbcs	x6, x6, x7\n\t"
12274         "and	x12, x12, %[m]\n\t"
12275         "sbcs	x9, x9, x11\n\t"
12276         "stp	x4, x6, [%[r], 128]\n\t"
12277         "sbcs	x10, x10, x12\n\t"
12278         "stp	x9, x10, [%[r], 144]\n\t"
12279         "ldp	x5, x7, [%[b], 160]\n\t"
12280         "ldp	x11, x12, [%[b], 176]\n\t"
12281         "ldp	x4, x6, [%[a], 160]\n\t"
12282         "and	x5, x5, %[m]\n\t"
12283         "ldp	x9, x10, [%[a], 176]\n\t"
12284         "and	x7, x7, %[m]\n\t"
12285         "sbcs	x4, x4, x5\n\t"
12286         "and	x11, x11, %[m]\n\t"
12287         "sbcs	x6, x6, x7\n\t"
12288         "and	x12, x12, %[m]\n\t"
12289         "sbcs	x9, x9, x11\n\t"
12290         "stp	x4, x6, [%[r], 160]\n\t"
12291         "sbcs	x10, x10, x12\n\t"
12292         "stp	x9, x10, [%[r], 176]\n\t"
12293         "ldp	x5, x7, [%[b], 192]\n\t"
12294         "ldp	x11, x12, [%[b], 208]\n\t"
12295         "ldp	x4, x6, [%[a], 192]\n\t"
12296         "and	x5, x5, %[m]\n\t"
12297         "ldp	x9, x10, [%[a], 208]\n\t"
12298         "and	x7, x7, %[m]\n\t"
12299         "sbcs	x4, x4, x5\n\t"
12300         "and	x11, x11, %[m]\n\t"
12301         "sbcs	x6, x6, x7\n\t"
12302         "and	x12, x12, %[m]\n\t"
12303         "sbcs	x9, x9, x11\n\t"
12304         "stp	x4, x6, [%[r], 192]\n\t"
12305         "sbcs	x10, x10, x12\n\t"
12306         "stp	x9, x10, [%[r], 208]\n\t"
12307         "ldp	x5, x7, [%[b], 224]\n\t"
12308         "ldp	x11, x12, [%[b], 240]\n\t"
12309         "ldp	x4, x6, [%[a], 224]\n\t"
12310         "and	x5, x5, %[m]\n\t"
12311         "ldp	x9, x10, [%[a], 240]\n\t"
12312         "and	x7, x7, %[m]\n\t"
12313         "sbcs	x4, x4, x5\n\t"
12314         "and	x11, x11, %[m]\n\t"
12315         "sbcs	x6, x6, x7\n\t"
12316         "and	x12, x12, %[m]\n\t"
12317         "sbcs	x9, x9, x11\n\t"
12318         "stp	x4, x6, [%[r], 224]\n\t"
12319         "sbcs	x10, x10, x12\n\t"
12320         "stp	x9, x10, [%[r], 240]\n\t"
12321         "ldp	x5, x7, [%[b], 256]\n\t"
12322         "ldp	x11, x12, [%[b], 272]\n\t"
12323         "ldp	x4, x6, [%[a], 256]\n\t"
12324         "and	x5, x5, %[m]\n\t"
12325         "ldp	x9, x10, [%[a], 272]\n\t"
12326         "and	x7, x7, %[m]\n\t"
12327         "sbcs	x4, x4, x5\n\t"
12328         "and	x11, x11, %[m]\n\t"
12329         "sbcs	x6, x6, x7\n\t"
12330         "and	x12, x12, %[m]\n\t"
12331         "sbcs	x9, x9, x11\n\t"
12332         "stp	x4, x6, [%[r], 256]\n\t"
12333         "sbcs	x10, x10, x12\n\t"
12334         "stp	x9, x10, [%[r], 272]\n\t"
12335         "ldp	x5, x7, [%[b], 288]\n\t"
12336         "ldp	x11, x12, [%[b], 304]\n\t"
12337         "ldp	x4, x6, [%[a], 288]\n\t"
12338         "and	x5, x5, %[m]\n\t"
12339         "ldp	x9, x10, [%[a], 304]\n\t"
12340         "and	x7, x7, %[m]\n\t"
12341         "sbcs	x4, x4, x5\n\t"
12342         "and	x11, x11, %[m]\n\t"
12343         "sbcs	x6, x6, x7\n\t"
12344         "and	x12, x12, %[m]\n\t"
12345         "sbcs	x9, x9, x11\n\t"
12346         "stp	x4, x6, [%[r], 288]\n\t"
12347         "sbcs	x10, x10, x12\n\t"
12348         "stp	x9, x10, [%[r], 304]\n\t"
12349         "ldp	x5, x7, [%[b], 320]\n\t"
12350         "ldp	x11, x12, [%[b], 336]\n\t"
12351         "ldp	x4, x6, [%[a], 320]\n\t"
12352         "and	x5, x5, %[m]\n\t"
12353         "ldp	x9, x10, [%[a], 336]\n\t"
12354         "and	x7, x7, %[m]\n\t"
12355         "sbcs	x4, x4, x5\n\t"
12356         "and	x11, x11, %[m]\n\t"
12357         "sbcs	x6, x6, x7\n\t"
12358         "and	x12, x12, %[m]\n\t"
12359         "sbcs	x9, x9, x11\n\t"
12360         "stp	x4, x6, [%[r], 320]\n\t"
12361         "sbcs	x10, x10, x12\n\t"
12362         "stp	x9, x10, [%[r], 336]\n\t"
12363         "ldp	x5, x7, [%[b], 352]\n\t"
12364         "ldp	x11, x12, [%[b], 368]\n\t"
12365         "ldp	x4, x6, [%[a], 352]\n\t"
12366         "and	x5, x5, %[m]\n\t"
12367         "ldp	x9, x10, [%[a], 368]\n\t"
12368         "and	x7, x7, %[m]\n\t"
12369         "sbcs	x4, x4, x5\n\t"
12370         "and	x11, x11, %[m]\n\t"
12371         "sbcs	x6, x6, x7\n\t"
12372         "and	x12, x12, %[m]\n\t"
12373         "sbcs	x9, x9, x11\n\t"
12374         "stp	x4, x6, [%[r], 352]\n\t"
12375         "sbcs	x10, x10, x12\n\t"
12376         "stp	x9, x10, [%[r], 368]\n\t"
12377         "csetm	%[r], cc\n\t"
12378         : [r] "+r" (r)
12379         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
12380         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
12381     );
12382 
12383     return (sp_digit)r;
12384 #endif /* WOLFSSL_SP_SMALL */
12385 }
12386 
12387 /* AND m into each word of a and store in r.
12388  *
12389  * r  A single precision integer.
12390  * a  A single precision integer.
12391  * m  Mask to AND against each digit.
12392  */
sp_3072_mask_48(sp_digit * r,const sp_digit * a,sp_digit m)12393 static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
12394 {
12395 #ifdef WOLFSSL_SP_SMALL
12396     int i;
12397 
12398     for (i=0; i<48; i++) {
12399         r[i] = a[i] & m;
12400     }
12401 #else
12402     int i;
12403 
12404     for (i = 0; i < 48; i += 8) {
12405         r[i+0] = a[i+0] & m;
12406         r[i+1] = a[i+1] & m;
12407         r[i+2] = a[i+2] & m;
12408         r[i+3] = a[i+3] & m;
12409         r[i+4] = a[i+4] & m;
12410         r[i+5] = a[i+5] & m;
12411         r[i+6] = a[i+6] & m;
12412         r[i+7] = a[i+7] & m;
12413     }
12414 #endif
12415 }
12416 
12417 /* Compare a with b in constant time.
12418  *
12419  * a  A single precision integer.
12420  * b  A single precision integer.
12421  * return -ve, 0 or +ve if a is less than, equal to or greater than b
12422  * respectively.
12423  */
sp_3072_cmp_48(const sp_digit * a,const sp_digit * b)12424 static sp_int64 sp_3072_cmp_48(const sp_digit* a, const sp_digit* b)
12425 {
12426 #ifdef WOLFSSL_SP_SMALL
12427     __asm__ __volatile__ (
12428         "mov	x2, -1\n\t"
12429         "mov	x3, 1\n\t"
12430         "mov	x4, -1\n\t"
12431         "mov	x5, 376\n\t"
12432         "1:\n\t"
12433         "ldr	x6, [%[a], x5]\n\t"
12434         "ldr	x7, [%[b], x5]\n\t"
12435         "and	x6, x6, x4\n\t"
12436         "and	x7, x7, x4\n\t"
12437         "subs	x6, x6, x7\n\t"
12438         "csel	x2, x3, x2, hi\n\t"
12439         "csel	x2, x4, x2, lo\n\t"
12440         "csel	x4, x4, xzr, eq\n\t"
12441         "subs	x5, x5, #8\n\t"
12442         "b.cs	1b\n\t"
12443         "eor	%[a], x2, x4\n\t"
12444         : [a] "+r" (a)
12445         : [b] "r" (b)
12446         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
12447     );
12448 #else
12449     __asm__ __volatile__ (
12450         "mov	x2, -1\n\t"
12451         "mov	x3, 1\n\t"
12452         "mov  x4, -1\n\t"
12453         "ldp	x5, x6, [%[a], 368]\n\t"
12454         "ldp	x7, x8, [%[b], 368]\n\t"
12455         "and	x6, x6, x4\n\t"
12456         "and	x8, x8, x4\n\t"
12457         "subs	x6, x6, x8\n\t"
12458         "csel	x2, x4, x2, lo\n\t"
12459         "csel	x4, x4, xzr, eq\n\t"
12460         "csel	x2, x3, x2, hi\n\t"
12461         "and	x5, x5, x4\n\t"
12462         "and	x7, x7, x4\n\t"
12463         "subs	x5, x5, x7\n\t"
12464         "csel	x2, x4, x2, lo\n\t"
12465         "csel	x4, x4, xzr, eq\n\t"
12466         "csel	x2, x3, x2, hi\n\t"
12467         "ldp	x5, x6, [%[a], 352]\n\t"
12468         "ldp	x7, x8, [%[b], 352]\n\t"
12469         "and	x6, x6, x4\n\t"
12470         "and	x8, x8, x4\n\t"
12471         "subs	x6, x6, x8\n\t"
12472         "csel	x2, x4, x2, lo\n\t"
12473         "csel	x4, x4, xzr, eq\n\t"
12474         "csel	x2, x3, x2, hi\n\t"
12475         "and	x5, x5, x4\n\t"
12476         "and	x7, x7, x4\n\t"
12477         "subs	x5, x5, x7\n\t"
12478         "csel	x2, x4, x2, lo\n\t"
12479         "csel	x4, x4, xzr, eq\n\t"
12480         "csel	x2, x3, x2, hi\n\t"
12481         "ldp	x5, x6, [%[a], 336]\n\t"
12482         "ldp	x7, x8, [%[b], 336]\n\t"
12483         "and	x6, x6, x4\n\t"
12484         "and	x8, x8, x4\n\t"
12485         "subs	x6, x6, x8\n\t"
12486         "csel	x2, x4, x2, lo\n\t"
12487         "csel	x4, x4, xzr, eq\n\t"
12488         "csel	x2, x3, x2, hi\n\t"
12489         "and	x5, x5, x4\n\t"
12490         "and	x7, x7, x4\n\t"
12491         "subs	x5, x5, x7\n\t"
12492         "csel	x2, x4, x2, lo\n\t"
12493         "csel	x4, x4, xzr, eq\n\t"
12494         "csel	x2, x3, x2, hi\n\t"
12495         "ldp	x5, x6, [%[a], 320]\n\t"
12496         "ldp	x7, x8, [%[b], 320]\n\t"
12497         "and	x6, x6, x4\n\t"
12498         "and	x8, x8, x4\n\t"
12499         "subs	x6, x6, x8\n\t"
12500         "csel	x2, x4, x2, lo\n\t"
12501         "csel	x4, x4, xzr, eq\n\t"
12502         "csel	x2, x3, x2, hi\n\t"
12503         "and	x5, x5, x4\n\t"
12504         "and	x7, x7, x4\n\t"
12505         "subs	x5, x5, x7\n\t"
12506         "csel	x2, x4, x2, lo\n\t"
12507         "csel	x4, x4, xzr, eq\n\t"
12508         "csel	x2, x3, x2, hi\n\t"
12509         "ldp	x5, x6, [%[a], 304]\n\t"
12510         "ldp	x7, x8, [%[b], 304]\n\t"
12511         "and	x6, x6, x4\n\t"
12512         "and	x8, x8, x4\n\t"
12513         "subs	x6, x6, x8\n\t"
12514         "csel	x2, x4, x2, lo\n\t"
12515         "csel	x4, x4, xzr, eq\n\t"
12516         "csel	x2, x3, x2, hi\n\t"
12517         "and	x5, x5, x4\n\t"
12518         "and	x7, x7, x4\n\t"
12519         "subs	x5, x5, x7\n\t"
12520         "csel	x2, x4, x2, lo\n\t"
12521         "csel	x4, x4, xzr, eq\n\t"
12522         "csel	x2, x3, x2, hi\n\t"
12523         "ldp	x5, x6, [%[a], 288]\n\t"
12524         "ldp	x7, x8, [%[b], 288]\n\t"
12525         "and	x6, x6, x4\n\t"
12526         "and	x8, x8, x4\n\t"
12527         "subs	x6, x6, x8\n\t"
12528         "csel	x2, x4, x2, lo\n\t"
12529         "csel	x4, x4, xzr, eq\n\t"
12530         "csel	x2, x3, x2, hi\n\t"
12531         "and	x5, x5, x4\n\t"
12532         "and	x7, x7, x4\n\t"
12533         "subs	x5, x5, x7\n\t"
12534         "csel	x2, x4, x2, lo\n\t"
12535         "csel	x4, x4, xzr, eq\n\t"
12536         "csel	x2, x3, x2, hi\n\t"
12537         "ldp	x5, x6, [%[a], 272]\n\t"
12538         "ldp	x7, x8, [%[b], 272]\n\t"
12539         "and	x6, x6, x4\n\t"
12540         "and	x8, x8, x4\n\t"
12541         "subs	x6, x6, x8\n\t"
12542         "csel	x2, x4, x2, lo\n\t"
12543         "csel	x4, x4, xzr, eq\n\t"
12544         "csel	x2, x3, x2, hi\n\t"
12545         "and	x5, x5, x4\n\t"
12546         "and	x7, x7, x4\n\t"
12547         "subs	x5, x5, x7\n\t"
12548         "csel	x2, x4, x2, lo\n\t"
12549         "csel	x4, x4, xzr, eq\n\t"
12550         "csel	x2, x3, x2, hi\n\t"
12551         "ldp	x5, x6, [%[a], 256]\n\t"
12552         "ldp	x7, x8, [%[b], 256]\n\t"
12553         "and	x6, x6, x4\n\t"
12554         "and	x8, x8, x4\n\t"
12555         "subs	x6, x6, x8\n\t"
12556         "csel	x2, x4, x2, lo\n\t"
12557         "csel	x4, x4, xzr, eq\n\t"
12558         "csel	x2, x3, x2, hi\n\t"
12559         "and	x5, x5, x4\n\t"
12560         "and	x7, x7, x4\n\t"
12561         "subs	x5, x5, x7\n\t"
12562         "csel	x2, x4, x2, lo\n\t"
12563         "csel	x4, x4, xzr, eq\n\t"
12564         "csel	x2, x3, x2, hi\n\t"
12565         "ldp	x5, x6, [%[a], 240]\n\t"
12566         "ldp	x7, x8, [%[b], 240]\n\t"
12567         "and	x6, x6, x4\n\t"
12568         "and	x8, x8, x4\n\t"
12569         "subs	x6, x6, x8\n\t"
12570         "csel	x2, x4, x2, lo\n\t"
12571         "csel	x4, x4, xzr, eq\n\t"
12572         "csel	x2, x3, x2, hi\n\t"
12573         "and	x5, x5, x4\n\t"
12574         "and	x7, x7, x4\n\t"
12575         "subs	x5, x5, x7\n\t"
12576         "csel	x2, x4, x2, lo\n\t"
12577         "csel	x4, x4, xzr, eq\n\t"
12578         "csel	x2, x3, x2, hi\n\t"
12579         "ldp	x5, x6, [%[a], 224]\n\t"
12580         "ldp	x7, x8, [%[b], 224]\n\t"
12581         "and	x6, x6, x4\n\t"
12582         "and	x8, x8, x4\n\t"
12583         "subs	x6, x6, x8\n\t"
12584         "csel	x2, x4, x2, lo\n\t"
12585         "csel	x4, x4, xzr, eq\n\t"
12586         "csel	x2, x3, x2, hi\n\t"
12587         "and	x5, x5, x4\n\t"
12588         "and	x7, x7, x4\n\t"
12589         "subs	x5, x5, x7\n\t"
12590         "csel	x2, x4, x2, lo\n\t"
12591         "csel	x4, x4, xzr, eq\n\t"
12592         "csel	x2, x3, x2, hi\n\t"
12593         "ldp	x5, x6, [%[a], 208]\n\t"
12594         "ldp	x7, x8, [%[b], 208]\n\t"
12595         "and	x6, x6, x4\n\t"
12596         "and	x8, x8, x4\n\t"
12597         "subs	x6, x6, x8\n\t"
12598         "csel	x2, x4, x2, lo\n\t"
12599         "csel	x4, x4, xzr, eq\n\t"
12600         "csel	x2, x3, x2, hi\n\t"
12601         "and	x5, x5, x4\n\t"
12602         "and	x7, x7, x4\n\t"
12603         "subs	x5, x5, x7\n\t"
12604         "csel	x2, x4, x2, lo\n\t"
12605         "csel	x4, x4, xzr, eq\n\t"
12606         "csel	x2, x3, x2, hi\n\t"
12607         "ldp	x5, x6, [%[a], 192]\n\t"
12608         "ldp	x7, x8, [%[b], 192]\n\t"
12609         "and	x6, x6, x4\n\t"
12610         "and	x8, x8, x4\n\t"
12611         "subs	x6, x6, x8\n\t"
12612         "csel	x2, x4, x2, lo\n\t"
12613         "csel	x4, x4, xzr, eq\n\t"
12614         "csel	x2, x3, x2, hi\n\t"
12615         "and	x5, x5, x4\n\t"
12616         "and	x7, x7, x4\n\t"
12617         "subs	x5, x5, x7\n\t"
12618         "csel	x2, x4, x2, lo\n\t"
12619         "csel	x4, x4, xzr, eq\n\t"
12620         "csel	x2, x3, x2, hi\n\t"
12621         "ldp	x5, x6, [%[a], 176]\n\t"
12622         "ldp	x7, x8, [%[b], 176]\n\t"
12623         "and	x6, x6, x4\n\t"
12624         "and	x8, x8, x4\n\t"
12625         "subs	x6, x6, x8\n\t"
12626         "csel	x2, x4, x2, lo\n\t"
12627         "csel	x4, x4, xzr, eq\n\t"
12628         "csel	x2, x3, x2, hi\n\t"
12629         "and	x5, x5, x4\n\t"
12630         "and	x7, x7, x4\n\t"
12631         "subs	x5, x5, x7\n\t"
12632         "csel	x2, x4, x2, lo\n\t"
12633         "csel	x4, x4, xzr, eq\n\t"
12634         "csel	x2, x3, x2, hi\n\t"
12635         "ldp	x5, x6, [%[a], 160]\n\t"
12636         "ldp	x7, x8, [%[b], 160]\n\t"
12637         "and	x6, x6, x4\n\t"
12638         "and	x8, x8, x4\n\t"
12639         "subs	x6, x6, x8\n\t"
12640         "csel	x2, x4, x2, lo\n\t"
12641         "csel	x4, x4, xzr, eq\n\t"
12642         "csel	x2, x3, x2, hi\n\t"
12643         "and	x5, x5, x4\n\t"
12644         "and	x7, x7, x4\n\t"
12645         "subs	x5, x5, x7\n\t"
12646         "csel	x2, x4, x2, lo\n\t"
12647         "csel	x4, x4, xzr, eq\n\t"
12648         "csel	x2, x3, x2, hi\n\t"
12649         "ldp	x5, x6, [%[a], 144]\n\t"
12650         "ldp	x7, x8, [%[b], 144]\n\t"
12651         "and	x6, x6, x4\n\t"
12652         "and	x8, x8, x4\n\t"
12653         "subs	x6, x6, x8\n\t"
12654         "csel	x2, x4, x2, lo\n\t"
12655         "csel	x4, x4, xzr, eq\n\t"
12656         "csel	x2, x3, x2, hi\n\t"
12657         "and	x5, x5, x4\n\t"
12658         "and	x7, x7, x4\n\t"
12659         "subs	x5, x5, x7\n\t"
12660         "csel	x2, x4, x2, lo\n\t"
12661         "csel	x4, x4, xzr, eq\n\t"
12662         "csel	x2, x3, x2, hi\n\t"
12663         "ldp	x5, x6, [%[a], 128]\n\t"
12664         "ldp	x7, x8, [%[b], 128]\n\t"
12665         "and	x6, x6, x4\n\t"
12666         "and	x8, x8, x4\n\t"
12667         "subs	x6, x6, x8\n\t"
12668         "csel	x2, x4, x2, lo\n\t"
12669         "csel	x4, x4, xzr, eq\n\t"
12670         "csel	x2, x3, x2, hi\n\t"
12671         "and	x5, x5, x4\n\t"
12672         "and	x7, x7, x4\n\t"
12673         "subs	x5, x5, x7\n\t"
12674         "csel	x2, x4, x2, lo\n\t"
12675         "csel	x4, x4, xzr, eq\n\t"
12676         "csel	x2, x3, x2, hi\n\t"
12677         "ldp	x5, x6, [%[a], 112]\n\t"
12678         "ldp	x7, x8, [%[b], 112]\n\t"
12679         "and	x6, x6, x4\n\t"
12680         "and	x8, x8, x4\n\t"
12681         "subs	x6, x6, x8\n\t"
12682         "csel	x2, x4, x2, lo\n\t"
12683         "csel	x4, x4, xzr, eq\n\t"
12684         "csel	x2, x3, x2, hi\n\t"
12685         "and	x5, x5, x4\n\t"
12686         "and	x7, x7, x4\n\t"
12687         "subs	x5, x5, x7\n\t"
12688         "csel	x2, x4, x2, lo\n\t"
12689         "csel	x4, x4, xzr, eq\n\t"
12690         "csel	x2, x3, x2, hi\n\t"
12691         "ldp	x5, x6, [%[a], 96]\n\t"
12692         "ldp	x7, x8, [%[b], 96]\n\t"
12693         "and	x6, x6, x4\n\t"
12694         "and	x8, x8, x4\n\t"
12695         "subs	x6, x6, x8\n\t"
12696         "csel	x2, x4, x2, lo\n\t"
12697         "csel	x4, x4, xzr, eq\n\t"
12698         "csel	x2, x3, x2, hi\n\t"
12699         "and	x5, x5, x4\n\t"
12700         "and	x7, x7, x4\n\t"
12701         "subs	x5, x5, x7\n\t"
12702         "csel	x2, x4, x2, lo\n\t"
12703         "csel	x4, x4, xzr, eq\n\t"
12704         "csel	x2, x3, x2, hi\n\t"
12705         "ldp	x5, x6, [%[a], 80]\n\t"
12706         "ldp	x7, x8, [%[b], 80]\n\t"
12707         "and	x6, x6, x4\n\t"
12708         "and	x8, x8, x4\n\t"
12709         "subs	x6, x6, x8\n\t"
12710         "csel	x2, x4, x2, lo\n\t"
12711         "csel	x4, x4, xzr, eq\n\t"
12712         "csel	x2, x3, x2, hi\n\t"
12713         "and	x5, x5, x4\n\t"
12714         "and	x7, x7, x4\n\t"
12715         "subs	x5, x5, x7\n\t"
12716         "csel	x2, x4, x2, lo\n\t"
12717         "csel	x4, x4, xzr, eq\n\t"
12718         "csel	x2, x3, x2, hi\n\t"
12719         "ldp	x5, x6, [%[a], 64]\n\t"
12720         "ldp	x7, x8, [%[b], 64]\n\t"
12721         "and	x6, x6, x4\n\t"
12722         "and	x8, x8, x4\n\t"
12723         "subs	x6, x6, x8\n\t"
12724         "csel	x2, x4, x2, lo\n\t"
12725         "csel	x4, x4, xzr, eq\n\t"
12726         "csel	x2, x3, x2, hi\n\t"
12727         "and	x5, x5, x4\n\t"
12728         "and	x7, x7, x4\n\t"
12729         "subs	x5, x5, x7\n\t"
12730         "csel	x2, x4, x2, lo\n\t"
12731         "csel	x4, x4, xzr, eq\n\t"
12732         "csel	x2, x3, x2, hi\n\t"
12733         "ldp	x5, x6, [%[a], 48]\n\t"
12734         "ldp	x7, x8, [%[b], 48]\n\t"
12735         "and	x6, x6, x4\n\t"
12736         "and	x8, x8, x4\n\t"
12737         "subs	x6, x6, x8\n\t"
12738         "csel	x2, x4, x2, lo\n\t"
12739         "csel	x4, x4, xzr, eq\n\t"
12740         "csel	x2, x3, x2, hi\n\t"
12741         "and	x5, x5, x4\n\t"
12742         "and	x7, x7, x4\n\t"
12743         "subs	x5, x5, x7\n\t"
12744         "csel	x2, x4, x2, lo\n\t"
12745         "csel	x4, x4, xzr, eq\n\t"
12746         "csel	x2, x3, x2, hi\n\t"
12747         "ldp	x5, x6, [%[a], 32]\n\t"
12748         "ldp	x7, x8, [%[b], 32]\n\t"
12749         "and	x6, x6, x4\n\t"
12750         "and	x8, x8, x4\n\t"
12751         "subs	x6, x6, x8\n\t"
12752         "csel	x2, x4, x2, lo\n\t"
12753         "csel	x4, x4, xzr, eq\n\t"
12754         "csel	x2, x3, x2, hi\n\t"
12755         "and	x5, x5, x4\n\t"
12756         "and	x7, x7, x4\n\t"
12757         "subs	x5, x5, x7\n\t"
12758         "csel	x2, x4, x2, lo\n\t"
12759         "csel	x4, x4, xzr, eq\n\t"
12760         "csel	x2, x3, x2, hi\n\t"
12761         "ldp	x5, x6, [%[a], 16]\n\t"
12762         "ldp	x7, x8, [%[b], 16]\n\t"
12763         "and	x6, x6, x4\n\t"
12764         "and	x8, x8, x4\n\t"
12765         "subs	x6, x6, x8\n\t"
12766         "csel	x2, x4, x2, lo\n\t"
12767         "csel	x4, x4, xzr, eq\n\t"
12768         "csel	x2, x3, x2, hi\n\t"
12769         "and	x5, x5, x4\n\t"
12770         "and	x7, x7, x4\n\t"
12771         "subs	x5, x5, x7\n\t"
12772         "csel	x2, x4, x2, lo\n\t"
12773         "csel	x4, x4, xzr, eq\n\t"
12774         "csel	x2, x3, x2, hi\n\t"
12775         "ldp	x5, x6, [%[a], 0]\n\t"
12776         "ldp	x7, x8, [%[b], 0]\n\t"
12777         "and	x6, x6, x4\n\t"
12778         "and	x8, x8, x4\n\t"
12779         "subs	x6, x6, x8\n\t"
12780         "csel	x2, x4, x2, lo\n\t"
12781         "csel	x4, x4, xzr, eq\n\t"
12782         "csel	x2, x3, x2, hi\n\t"
12783         "and	x5, x5, x4\n\t"
12784         "and	x7, x7, x4\n\t"
12785         "subs	x5, x5, x7\n\t"
12786         "csel	x2, x4, x2, lo\n\t"
12787         "csel	x4, x4, xzr, eq\n\t"
12788         "csel	x2, x3, x2, hi\n\t"
12789         "eor	%[a], x2, x4\n\t"
12790         : [a] "+r" (a)
12791         : [b] "r" (b)
12792         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
12793     );
12794 #endif
12795 
12796     return (sp_int64)a;
12797 }
12798 
12799 /* Divide d in a and put remainder into r (m*d + r = a)
12800  * m is not calculated as it is not needed at this time.
12801  *
12802  * a  Number to be divided.
12803  * d  Number to divide with.
12804  * m  Multiplier result.
12805  * r  Remainder from the division.
12806  * returns MP_OKAY indicating success.
12807  */
sp_3072_div_48(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)12808 static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m,
12809         sp_digit* r)
12810 {
12811     sp_digit t1[96], t2[49];
12812     sp_digit div, r1;
12813     int i;
12814 
12815     (void)m;
12816 
12817     div = d[47];
12818     XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
12819     for (i=47; i>=0; i--) {
12820         sp_digit hi = t1[48 + i] - (t1[48 + i] == div);
12821         r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
12822 
12823         sp_3072_mul_d_48(t2, d, r1);
12824         t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
12825         t1[48 + i] -= t2[48];
12826         sp_3072_mask_48(t2, d, t1[48 + i]);
12827         t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
12828         sp_3072_mask_48(t2, d, t1[48 + i]);
12829         t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
12830     }
12831 
12832     r1 = sp_3072_cmp_48(t1, d) >= 0;
12833     sp_3072_cond_sub_48(r, t1, d, (sp_digit)0 - r1);
12834 
12835     return MP_OKAY;
12836 }
12837 
12838 /* Reduce a modulo m into r. (r = a mod m)
12839  *
12840  * r  A single precision number that is the reduced result.
12841  * a  A single precision number that is to be reduced.
12842  * m  A single precision number that is the modulus to reduce with.
12843  * returns MP_OKAY indicating success.
12844  */
sp_3072_mod_48(sp_digit * r,const sp_digit * a,const sp_digit * m)12845 static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_digit* m)
12846 {
12847     return sp_3072_div_48(a, m, NULL, r);
12848 }
12849 
12850 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
12851                                                      defined(WOLFSSL_HAVE_SP_DH)
12852 #ifdef WOLFSSL_SP_SMALL
12853 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
12854  *
12855  * r     A single precision number that is the result of the operation.
12856  * a     A single precision number being exponentiated.
12857  * e     A single precision number that is the exponent.
12858  * bits  The number of bits in the exponent.
12859  * m     A single precision number that is the modulus.
12860  * returns  0 on success.
12861  * returns  MEMORY_E on dynamic memory allocation failure.
12862  * returns  MP_VAL when base is even or exponent is 0.
12863  */
sp_3072_mod_exp_48(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)12864 static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
12865         int bits, const sp_digit* m, int reduceA)
12866 {
12867 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
12868     sp_digit* td = NULL;
12869 #else
12870     sp_digit td[8 * 96];
12871 #endif
12872     sp_digit* t[8];
12873     sp_digit* norm = NULL;
12874     sp_digit mp = 1;
12875     sp_digit n;
12876     sp_digit mask;
12877     int i;
12878     int c;
12879     byte y;
12880     int err = MP_OKAY;
12881 
12882     if ((m[0] & 1) == 0) {
12883         err = MP_VAL;
12884     }
12885     else if (bits == 0) {
12886         err = MP_VAL;
12887     }
12888 
12889 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
12890     if (err == MP_OKAY) {
12891         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 96), NULL,
12892                                 DYNAMIC_TYPE_TMP_BUFFER);
12893         if (td == NULL)
12894             err = MEMORY_E;
12895     }
12896 #endif
12897 
12898     if (err == MP_OKAY) {
12899         norm = td;
12900         for (i=0; i<8; i++) {
12901             t[i] = td + i * 96;
12902         }
12903 
12904         sp_3072_mont_setup(m, &mp);
12905         sp_3072_mont_norm_48(norm, m);
12906 
12907         XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
12908         if (reduceA != 0) {
12909             err = sp_3072_mod_48(t[1] + 48, a, m);
12910             if (err == MP_OKAY) {
12911                 err = sp_3072_mod_48(t[1], t[1], m);
12912             }
12913         }
12914         else {
12915             XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
12916             err = sp_3072_mod_48(t[1], t[1], m);
12917         }
12918     }
12919 
12920     if (err == MP_OKAY) {
12921         sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
12922         sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
12923         sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
12924         sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
12925         sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
12926         sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
12927 
12928         i = (bits - 1) / 64;
12929         n = e[i--];
12930         c = bits & 63;
12931         if (c == 0) {
12932             c = 64;
12933         }
12934         c -= bits % 3;
12935         if (c == 64) {
12936             c = 61;
12937         }
12938         if (c < 0) {
12939             /* Number of bits in top word is less than number needed. */
12940             c = -c;
12941             y = (byte)(n << c);
12942             n = e[i--];
12943             y |= (byte)(n >> (64 - c));
12944             n <<= c;
12945             c = 64 - c;
12946         }
12947         else {
12948             y = (byte)(n >> c);
12949             n <<= 64 - c;
12950         }
12951         XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
12952         for (; i>=0 || c>=3; ) {
12953             if (c == 0) {
12954                 n = e[i--];
12955                 y = (byte)(n >> 61);
12956                 n <<= 3;
12957                 c = 61;
12958             }
12959             else if (c < 3) {
12960                 y = (byte)(n >> 61);
12961                 n = e[i--];
12962                 c = 3 - c;
12963                 y |= (byte)(n >> (64 - c));
12964                 n <<= c;
12965                 c = 64 - c;
12966             }
12967             else {
12968                 y = (byte)((n >> 61) & 0x7);
12969                 n <<= 3;
12970                 c -= 3;
12971             }
12972 
12973             sp_3072_mont_sqr_48(r, r, m, mp);
12974             sp_3072_mont_sqr_48(r, r, m, mp);
12975             sp_3072_mont_sqr_48(r, r, m, mp);
12976 
12977             sp_3072_mont_mul_48(r, r, t[y], m, mp);
12978         }
12979 
12980         XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
12981         sp_3072_mont_reduce_48(r, m, mp);
12982 
12983         mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
12984         sp_3072_cond_sub_48(r, r, m, mask);
12985     }
12986 
12987 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
12988     if (td != NULL)
12989         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
12990 #endif
12991 
12992     return err;
12993 }
12994 #else
12995 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
12996  *
12997  * r     A single precision number that is the result of the operation.
12998  * a     A single precision number being exponentiated.
12999  * e     A single precision number that is the exponent.
13000  * bits  The number of bits in the exponent.
13001  * m     A single precision number that is the modulus.
13002  * returns  0 on success.
13003  * returns  MEMORY_E on dynamic memory allocation failure.
13004  * returns  MP_VAL when base is even or exponent is 0.
13005  */
sp_3072_mod_exp_48(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)13006 static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
13007         int bits, const sp_digit* m, int reduceA)
13008 {
13009 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13010     sp_digit* td = NULL;
13011 #else
13012     sp_digit td[16 * 96];
13013 #endif
13014     sp_digit* t[16];
13015     sp_digit* norm = NULL;
13016     sp_digit mp = 1;
13017     sp_digit n;
13018     sp_digit mask;
13019     int i;
13020     int c;
13021     byte y;
13022     int err = MP_OKAY;
13023 
13024     if ((m[0] & 1) == 0) {
13025         err = MP_VAL;
13026     }
13027     else if (bits == 0) {
13028         err = MP_VAL;
13029     }
13030 
13031 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13032     if (err == MP_OKAY) {
13033         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL,
13034                                 DYNAMIC_TYPE_TMP_BUFFER);
13035         if (td == NULL)
13036             err = MEMORY_E;
13037     }
13038 #endif
13039 
13040     if (err == MP_OKAY) {
13041         norm = td;
13042         for (i=0; i<16; i++) {
13043             t[i] = td + i * 96;
13044         }
13045 
13046         sp_3072_mont_setup(m, &mp);
13047         sp_3072_mont_norm_48(norm, m);
13048 
13049         XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
13050         if (reduceA != 0) {
13051             err = sp_3072_mod_48(t[1] + 48, a, m);
13052             if (err == MP_OKAY) {
13053                 err = sp_3072_mod_48(t[1], t[1], m);
13054             }
13055         }
13056         else {
13057             XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
13058             err = sp_3072_mod_48(t[1], t[1], m);
13059         }
13060     }
13061 
13062     if (err == MP_OKAY) {
13063         sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
13064         sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
13065         sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
13066         sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
13067         sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
13068         sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
13069         sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
13070         sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
13071         sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
13072         sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
13073         sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
13074         sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
13075         sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
13076         sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
13077 
13078         i = (bits - 1) / 64;
13079         n = e[i--];
13080         c = bits & 63;
13081         if (c == 0) {
13082             c = 64;
13083         }
13084         c -= bits % 4;
13085         if (c == 64) {
13086             c = 60;
13087         }
13088         if (c < 0) {
13089             /* Number of bits in top word is less than number needed. */
13090             c = -c;
13091             y = (byte)(n << c);
13092             n = e[i--];
13093             y |= (byte)(n >> (64 - c));
13094             n <<= c;
13095             c = 64 - c;
13096         }
13097         else {
13098             y = (byte)(n >> c);
13099             n <<= 64 - c;
13100         }
13101         XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
13102         for (; i>=0 || c>=4; ) {
13103             if (c == 0) {
13104                 n = e[i--];
13105                 y = (byte)(n >> 60);
13106                 n <<= 4;
13107                 c = 60;
13108             }
13109             else if (c < 4) {
13110                 y = (byte)(n >> 60);
13111                 n = e[i--];
13112                 c = 4 - c;
13113                 y |= (byte)(n >> (64 - c));
13114                 n <<= c;
13115                 c = 64 - c;
13116             }
13117             else {
13118                 y = (byte)((n >> 60) & 0xf);
13119                 n <<= 4;
13120                 c -= 4;
13121             }
13122 
13123             sp_3072_mont_sqr_48(r, r, m, mp);
13124             sp_3072_mont_sqr_48(r, r, m, mp);
13125             sp_3072_mont_sqr_48(r, r, m, mp);
13126             sp_3072_mont_sqr_48(r, r, m, mp);
13127 
13128             sp_3072_mont_mul_48(r, r, t[y], m, mp);
13129         }
13130 
13131         XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
13132         sp_3072_mont_reduce_48(r, m, mp);
13133 
13134         mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
13135         sp_3072_cond_sub_48(r, r, m, mask);
13136     }
13137 
13138 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13139     if (td != NULL)
13140         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
13141 #endif
13142 
13143     return err;
13144 }
13145 #endif /* WOLFSSL_SP_SMALL */
13146 #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
13147 
13148 #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
13149 #ifdef WOLFSSL_HAVE_SP_RSA
13150 /* RSA public key operation.
13151  *
13152  * in      Array of bytes representing the number to exponentiate, base.
13153  * inLen   Number of bytes in base.
13154  * em      Public exponent.
13155  * mm      Modulus.
13156  * out     Buffer to hold big-endian bytes of exponentiation result.
13157  *         Must be at least 384 bytes long.
13158  * outLen  Number of bytes in result.
13159  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
13160  * an array is too long and MEMORY_E when dynamic memory allocation fails.
13161  */
sp_RsaPublic_3072(const byte * in,word32 inLen,const mp_int * em,const mp_int * mm,byte * out,word32 * outLen)13162 int sp_RsaPublic_3072(const byte* in, word32 inLen, const mp_int* em,
13163     const mp_int* mm, byte* out, word32* outLen)
13164 {
13165 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13166     sp_digit* a = NULL;
13167 #else
13168     sp_digit a[48 * 5];
13169 #endif
13170     sp_digit* m = NULL;
13171     sp_digit* r = NULL;
13172     sp_digit *ah = NULL;
13173     sp_digit e[1] = {0};
13174     int err = MP_OKAY;
13175 
13176     if (*outLen < 384) {
13177         err = MP_TO_E;
13178     }
13179     else if (mp_count_bits(em) > 64 || inLen > 384 ||
13180                                                      mp_count_bits(mm) != 3072) {
13181         err = MP_READ_E;
13182     }
13183     else if (mp_iseven(mm)) {
13184         err = MP_VAL;
13185     }
13186 
13187 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13188     if (err == MP_OKAY) {
13189         a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 5, NULL,
13190                                                               DYNAMIC_TYPE_RSA);
13191         if (a == NULL)
13192             err = MEMORY_E;
13193     }
13194 #endif
13195 
13196     if (err == MP_OKAY) {
13197         r = a + 48 * 2;
13198         m = r + 48 * 2;
13199         ah = a + 48;
13200 
13201         sp_3072_from_bin(ah, 48, in, inLen);
13202 #if DIGIT_BIT >= 64
13203         e[0] = em->dp[0];
13204 #else
13205         e[0] = em->dp[0];
13206         if (em->used > 1) {
13207             e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
13208         }
13209 #endif
13210         if (e[0] == 0) {
13211             err = MP_EXPTMOD_E;
13212         }
13213     }
13214     if (err == MP_OKAY) {
13215         sp_3072_from_mp(m, 48, mm);
13216 
13217         if (e[0] == 0x3) {
13218             if (err == MP_OKAY) {
13219                 sp_3072_sqr_48(r, ah);
13220                 err = sp_3072_mod_48_cond(r, r, m);
13221             }
13222             if (err == MP_OKAY) {
13223                 sp_3072_mul_48(r, ah, r);
13224                 err = sp_3072_mod_48_cond(r, r, m);
13225             }
13226         }
13227         else {
13228             int i;
13229             sp_digit mp;
13230 
13231             sp_3072_mont_setup(m, &mp);
13232 
13233             /* Convert to Montgomery form. */
13234             XMEMSET(a, 0, sizeof(sp_digit) * 48);
13235             err = sp_3072_mod_48_cond(a, a, m);
13236 
13237             if (err == MP_OKAY) {
13238                 for (i = 63; i >= 0; i--) {
13239                     if (e[0] >> i) {
13240                         break;
13241                     }
13242                 }
13243 
13244                 XMEMCPY(r, a, sizeof(sp_digit) * 48);
13245                 for (i--; i>=0; i--) {
13246                     sp_3072_mont_sqr_48(r, r, m, mp);
13247                     if (((e[0] >> i) & 1) == 1) {
13248                         sp_3072_mont_mul_48(r, r, a, m, mp);
13249                     }
13250                 }
13251                 XMEMSET(&r[48], 0, sizeof(sp_digit) * 48);
13252                 sp_3072_mont_reduce_48(r, m, mp);
13253 
13254                 for (i = 47; i > 0; i--) {
13255                     if (r[i] != m[i]) {
13256                         break;
13257                     }
13258                 }
13259                 if (r[i] >= m[i]) {
13260                     sp_3072_sub_in_place_48(r, m);
13261                 }
13262             }
13263         }
13264     }
13265 
13266     if (err == MP_OKAY) {
13267         sp_3072_to_bin_48(r, out);
13268         *outLen = 384;
13269     }
13270 
13271 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13272     if (a != NULL)
13273         XFREE(a, NULL, DYNAMIC_TYPE_RSA);
13274 #endif
13275 
13276     return err;
13277 }
13278 
13279 #ifndef WOLFSSL_RSA_PUBLIC_ONLY
13280 /* Conditionally add a and b using the mask m.
13281  * m is -1 to add and 0 when not.
13282  *
13283  * r  A single precision number representing conditional add result.
13284  * a  A single precision number to add with.
13285  * b  A single precision number to add.
13286  * m  Mask value to apply.
13287  */
sp_3072_cond_add_24(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)13288 static sp_digit sp_3072_cond_add_24(sp_digit* r, const sp_digit* a, const sp_digit* b,
13289         sp_digit m)
13290 {
13291 #ifdef WOLFSSL_SP_SMALL
13292     sp_digit c = 0;
13293 
13294     __asm__ __volatile__ (
13295         "mov	x8, #0\n\t"
13296         "1:\n\t"
13297         "adds	%[c], %[c], #-1\n\t"
13298         "ldr	x4, [%[a], x8]\n\t"
13299         "ldr	x5, [%[b], x8]\n\t"
13300         "and	x5, x5, %[m]\n\t"
13301         "adcs	x4, x4, x5\n\t"
13302         "cset	%[c], cs\n\t"
13303         "str	x4, [%[r], x8]\n\t"
13304         "add	x8, x8, #8\n\t"
13305         "cmp	x8, 192\n\t"
13306         "b.lt	1b\n\t"
13307         : [c] "+r" (c)
13308         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
13309         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
13310     );
13311 
13312     return c;
13313 #else
13314     __asm__ __volatile__ (
13315 
13316         "ldp	x5, x7, [%[b], 0]\n\t"
13317         "ldp	x11, x12, [%[b], 16]\n\t"
13318         "ldp	x4, x6, [%[a], 0]\n\t"
13319         "and	x5, x5, %[m]\n\t"
13320         "ldp	x9, x10, [%[a], 16]\n\t"
13321         "and	x7, x7, %[m]\n\t"
13322         "adds	x4, x4, x5\n\t"
13323         "and	x11, x11, %[m]\n\t"
13324         "adcs	x6, x6, x7\n\t"
13325         "and	x12, x12, %[m]\n\t"
13326         "adcs	x9, x9, x11\n\t"
13327         "stp	x4, x6, [%[r], 0]\n\t"
13328         "adcs	x10, x10, x12\n\t"
13329         "stp	x9, x10, [%[r], 16]\n\t"
13330         "ldp	x5, x7, [%[b], 32]\n\t"
13331         "ldp	x11, x12, [%[b], 48]\n\t"
13332         "ldp	x4, x6, [%[a], 32]\n\t"
13333         "and	x5, x5, %[m]\n\t"
13334         "ldp	x9, x10, [%[a], 48]\n\t"
13335         "and	x7, x7, %[m]\n\t"
13336         "adcs	x4, x4, x5\n\t"
13337         "and	x11, x11, %[m]\n\t"
13338         "adcs	x6, x6, x7\n\t"
13339         "and	x12, x12, %[m]\n\t"
13340         "adcs	x9, x9, x11\n\t"
13341         "stp	x4, x6, [%[r], 32]\n\t"
13342         "adcs	x10, x10, x12\n\t"
13343         "stp	x9, x10, [%[r], 48]\n\t"
13344         "ldp	x5, x7, [%[b], 64]\n\t"
13345         "ldp	x11, x12, [%[b], 80]\n\t"
13346         "ldp	x4, x6, [%[a], 64]\n\t"
13347         "and	x5, x5, %[m]\n\t"
13348         "ldp	x9, x10, [%[a], 80]\n\t"
13349         "and	x7, x7, %[m]\n\t"
13350         "adcs	x4, x4, x5\n\t"
13351         "and	x11, x11, %[m]\n\t"
13352         "adcs	x6, x6, x7\n\t"
13353         "and	x12, x12, %[m]\n\t"
13354         "adcs	x9, x9, x11\n\t"
13355         "stp	x4, x6, [%[r], 64]\n\t"
13356         "adcs	x10, x10, x12\n\t"
13357         "stp	x9, x10, [%[r], 80]\n\t"
13358         "ldp	x5, x7, [%[b], 96]\n\t"
13359         "ldp	x11, x12, [%[b], 112]\n\t"
13360         "ldp	x4, x6, [%[a], 96]\n\t"
13361         "and	x5, x5, %[m]\n\t"
13362         "ldp	x9, x10, [%[a], 112]\n\t"
13363         "and	x7, x7, %[m]\n\t"
13364         "adcs	x4, x4, x5\n\t"
13365         "and	x11, x11, %[m]\n\t"
13366         "adcs	x6, x6, x7\n\t"
13367         "and	x12, x12, %[m]\n\t"
13368         "adcs	x9, x9, x11\n\t"
13369         "stp	x4, x6, [%[r], 96]\n\t"
13370         "adcs	x10, x10, x12\n\t"
13371         "stp	x9, x10, [%[r], 112]\n\t"
13372         "ldp	x5, x7, [%[b], 128]\n\t"
13373         "ldp	x11, x12, [%[b], 144]\n\t"
13374         "ldp	x4, x6, [%[a], 128]\n\t"
13375         "and	x5, x5, %[m]\n\t"
13376         "ldp	x9, x10, [%[a], 144]\n\t"
13377         "and	x7, x7, %[m]\n\t"
13378         "adcs	x4, x4, x5\n\t"
13379         "and	x11, x11, %[m]\n\t"
13380         "adcs	x6, x6, x7\n\t"
13381         "and	x12, x12, %[m]\n\t"
13382         "adcs	x9, x9, x11\n\t"
13383         "stp	x4, x6, [%[r], 128]\n\t"
13384         "adcs	x10, x10, x12\n\t"
13385         "stp	x9, x10, [%[r], 144]\n\t"
13386         "ldp	x5, x7, [%[b], 160]\n\t"
13387         "ldp	x11, x12, [%[b], 176]\n\t"
13388         "ldp	x4, x6, [%[a], 160]\n\t"
13389         "and	x5, x5, %[m]\n\t"
13390         "ldp	x9, x10, [%[a], 176]\n\t"
13391         "and	x7, x7, %[m]\n\t"
13392         "adcs	x4, x4, x5\n\t"
13393         "and	x11, x11, %[m]\n\t"
13394         "adcs	x6, x6, x7\n\t"
13395         "and	x12, x12, %[m]\n\t"
13396         "adcs	x9, x9, x11\n\t"
13397         "stp	x4, x6, [%[r], 160]\n\t"
13398         "adcs	x10, x10, x12\n\t"
13399         "stp	x9, x10, [%[r], 176]\n\t"
13400         "cset	%[r], cs\n\t"
13401         : [r] "+r" (r)
13402         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
13403         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
13404     );
13405 
13406     return (sp_digit)r;
13407 #endif /* WOLFSSL_SP_SMALL */
13408 }
13409 
13410 /* RSA private key operation.
13411  *
13412  * in      Array of bytes representing the number to exponentiate, base.
13413  * inLen   Number of bytes in base.
13414  * dm      Private exponent.
13415  * pm      First prime.
13416  * qm      Second prime.
13417  * dpm     First prime's CRT exponent.
13418  * dqm     Second prime's CRT exponent.
13419  * qim     Inverse of second prime mod p.
13420  * mm      Modulus.
13421  * out     Buffer to hold big-endian bytes of exponentiation result.
13422  *         Must be at least 384 bytes long.
13423  * outLen  Number of bytes in result.
13424  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
13425  * an array is too long and MEMORY_E when dynamic memory allocation fails.
13426  */
sp_RsaPrivate_3072(const byte * in,word32 inLen,const mp_int * dm,const mp_int * pm,const mp_int * qm,const mp_int * dpm,const mp_int * dqm,const mp_int * qim,const mp_int * mm,byte * out,word32 * outLen)13427 int sp_RsaPrivate_3072(const byte* in, word32 inLen, const mp_int* dm,
13428     const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
13429     const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
13430 {
13431 #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
13432 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13433     sp_digit* d = NULL;
13434 #else
13435     sp_digit  d[48 * 4];
13436 #endif
13437     sp_digit* a = NULL;
13438     sp_digit* m = NULL;
13439     sp_digit* r = NULL;
13440     int err = MP_OKAY;
13441 
13442     (void)pm;
13443     (void)qm;
13444     (void)dpm;
13445     (void)dqm;
13446     (void)qim;
13447 
13448     if (*outLen < 384U) {
13449         err = MP_TO_E;
13450     }
13451     if (err == MP_OKAY) {
13452         if (mp_count_bits(dm) > 3072) {
13453            err = MP_READ_E;
13454         }
13455         else if (inLen > 384) {
13456             err = MP_READ_E;
13457         }
13458         else if (mp_count_bits(mm) != 3072) {
13459             err = MP_READ_E;
13460         }
13461         else if (mp_iseven(mm)) {
13462             err = MP_VAL;
13463         }
13464     }
13465 
13466 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13467     if (err == MP_OKAY) {
13468         d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 4, NULL,
13469                                                               DYNAMIC_TYPE_RSA);
13470         if (d == NULL)
13471             err = MEMORY_E;
13472     }
13473 #endif
13474 
13475     if (err == MP_OKAY) {
13476         a = d + 48;
13477         m = a + 96;
13478         r = a;
13479 
13480         sp_3072_from_bin(a, 48, in, inLen);
13481         sp_3072_from_mp(d, 48, dm);
13482         sp_3072_from_mp(m, 48, mm);
13483         err = sp_3072_mod_exp_48(r, a, d, 3072, m, 0);
13484     }
13485 
13486     if (err == MP_OKAY) {
13487         sp_3072_to_bin_48(r, out);
13488         *outLen = 384;
13489     }
13490 
13491 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13492     if (d != NULL)
13493 #endif
13494     {
13495         /* only "a" and "r" are sensitive and need zeroized (same pointer) */
13496         if (a != NULL)
13497             ForceZero(a, sizeof(sp_digit) * 48);
13498 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13499         XFREE(d, NULL, DYNAMIC_TYPE_RSA);
13500 #endif
13501     }
13502 
13503     return err;
13504 #else
13505 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13506     sp_digit* a = NULL;
13507 #else
13508     sp_digit a[24 * 11];
13509 #endif
13510     sp_digit* p = NULL;
13511     sp_digit* q = NULL;
13512     sp_digit* dp = NULL;
13513     sp_digit* tmpa = NULL;
13514     sp_digit* tmpb = NULL;
13515     sp_digit* r = NULL;
13516     sp_digit* qi = NULL;
13517     sp_digit* dq = NULL;
13518     sp_digit c;
13519     int err = MP_OKAY;
13520 
13521     (void)dm;
13522     (void)mm;
13523 
13524     if (*outLen < 384) {
13525         err = MP_TO_E;
13526     }
13527     else if (inLen > 384 || mp_count_bits(mm) != 3072) {
13528         err = MP_READ_E;
13529     }
13530     else if (mp_iseven(mm)) {
13531         err = MP_VAL;
13532     }
13533 
13534 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13535     if (err == MP_OKAY) {
13536         a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 24 * 11, NULL,
13537                                                               DYNAMIC_TYPE_RSA);
13538         if (a == NULL)
13539             err = MEMORY_E;
13540     }
13541 #endif
13542 
13543     if (err == MP_OKAY) {
13544         p = a + 48 * 2;
13545         q = p + 24;
13546         qi = dq = dp = q + 24;
13547         tmpa = qi + 24;
13548         tmpb = tmpa + 48;
13549         r = a;
13550 
13551         sp_3072_from_bin(a, 48, in, inLen);
13552         sp_3072_from_mp(p, 24, pm);
13553         sp_3072_from_mp(q, 24, qm);
13554         sp_3072_from_mp(dp, 24, dpm);
13555 
13556         err = sp_3072_mod_exp_24(tmpa, a, dp, 1536, p, 1);
13557     }
13558     if (err == MP_OKAY) {
13559         sp_3072_from_mp(dq, 24, dqm);
13560         err = sp_3072_mod_exp_24(tmpb, a, dq, 1536, q, 1);
13561     }
13562 
13563     if (err == MP_OKAY) {
13564         c = sp_3072_sub_in_place_24(tmpa, tmpb);
13565         c += sp_3072_cond_add_24(tmpa, tmpa, p, c);
13566         sp_3072_cond_add_24(tmpa, tmpa, p, c);
13567 
13568         sp_3072_from_mp(qi, 24, qim);
13569         sp_3072_mul_24(tmpa, tmpa, qi);
13570         err = sp_3072_mod_24(tmpa, tmpa, p);
13571     }
13572 
13573     if (err == MP_OKAY) {
13574         sp_3072_mul_24(tmpa, q, tmpa);
13575         XMEMSET(&tmpb[24], 0, sizeof(sp_digit) * 24);
13576         sp_3072_add_48(r, tmpb, tmpa);
13577 
13578         sp_3072_to_bin_48(r, out);
13579         *outLen = 384;
13580     }
13581 
13582 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13583     if (a != NULL)
13584 #endif
13585     {
13586         ForceZero(a, sizeof(sp_digit) * 24 * 11);
13587     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
13588         XFREE(a, NULL, DYNAMIC_TYPE_RSA);
13589     #endif
13590     }
13591 #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
13592     return err;
13593 }
13594 #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
13595 #endif /* WOLFSSL_HAVE_SP_RSA */
13596 #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
13597                                               !defined(WOLFSSL_RSA_PUBLIC_ONLY))
13598 /* Convert an array of sp_digit to an mp_int.
13599  *
13600  * a  A single precision integer.
13601  * r  A multi-precision integer.
13602  */
sp_3072_to_mp(const sp_digit * a,mp_int * r)13603 static int sp_3072_to_mp(const sp_digit* a, mp_int* r)
13604 {
13605     int err;
13606 
13607     err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
13608     if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
13609 #if DIGIT_BIT == 64
13610         XMEMCPY(r->dp, a, sizeof(sp_digit) * 48);
13611         r->used = 48;
13612         mp_clamp(r);
13613 #elif DIGIT_BIT < 64
13614         int i;
13615         int j = 0;
13616         int s = 0;
13617 
13618         r->dp[0] = 0;
13619         for (i = 0; i < 48; i++) {
13620             r->dp[j] |= (mp_digit)(a[i] << s);
13621             r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
13622             s = DIGIT_BIT - s;
13623             r->dp[++j] = (mp_digit)(a[i] >> s);
13624             while (s + DIGIT_BIT <= 64) {
13625                 s += DIGIT_BIT;
13626                 r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
13627                 if (s == SP_WORD_SIZE) {
13628                     r->dp[j] = 0;
13629                 }
13630                 else {
13631                     r->dp[j] = (mp_digit)(a[i] >> s);
13632                 }
13633             }
13634             s = 64 - s;
13635         }
13636         r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
13637         mp_clamp(r);
13638 #else
13639         int i;
13640         int j = 0;
13641         int s = 0;
13642 
13643         r->dp[0] = 0;
13644         for (i = 0; i < 48; i++) {
13645             r->dp[j] |= ((mp_digit)a[i]) << s;
13646             if (s + 64 >= DIGIT_BIT) {
13647     #if DIGIT_BIT != 32 && DIGIT_BIT != 64
13648                 r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
13649     #endif
13650                 s = DIGIT_BIT - s;
13651                 r->dp[++j] = a[i] >> s;
13652                 s = 64 - s;
13653             }
13654             else {
13655                 s += 64;
13656             }
13657         }
13658         r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
13659         mp_clamp(r);
13660 #endif
13661     }
13662 
13663     return err;
13664 }
13665 
13666 /* Perform the modular exponentiation for Diffie-Hellman.
13667  *
13668  * base  Base. MP integer.
13669  * exp   Exponent. MP integer.
13670  * mod   Modulus. MP integer.
13671  * res   Result. MP integer.
13672  * returns 0 on success, MP_READ_E if there are too many bytes in an array
13673  * and MEMORY_E if memory allocation fails.
13674  */
sp_ModExp_3072(const mp_int * base,const mp_int * exp,const mp_int * mod,mp_int * res)13675 int sp_ModExp_3072(const mp_int* base, const mp_int* exp, const mp_int* mod,
13676     mp_int* res)
13677 {
13678     int err = MP_OKAY;
13679     sp_digit b[96];
13680     sp_digit e[48];
13681     sp_digit m[48];
13682     sp_digit* r = b;
13683     int expBits = mp_count_bits(exp);
13684 
13685     if (mp_count_bits(base) > 3072) {
13686         err = MP_READ_E;
13687     }
13688     else if (expBits > 3072) {
13689         err = MP_READ_E;
13690     }
13691     else if (mp_count_bits(mod) != 3072) {
13692         err = MP_READ_E;
13693     }
13694     else if (mp_iseven(mod)) {
13695         err = MP_VAL;
13696     }
13697 
13698     if (err == MP_OKAY) {
13699         sp_3072_from_mp(b, 48, base);
13700         sp_3072_from_mp(e, 48, exp);
13701         sp_3072_from_mp(m, 48, mod);
13702 
13703         err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
13704     }
13705 
13706     if (err == MP_OKAY) {
13707         err = sp_3072_to_mp(r, res);
13708     }
13709 
13710     XMEMSET(e, 0, sizeof(e));
13711 
13712     return err;
13713 }
13714 
13715 #ifdef WOLFSSL_HAVE_SP_DH
13716 
13717 #ifdef HAVE_FFDHE_3072
sp_3072_lshift_48(sp_digit * r,sp_digit * a,byte n)13718 static void sp_3072_lshift_48(sp_digit* r, sp_digit* a, byte n)
13719 {
13720     word64 n64 = n;
13721     __asm__ __volatile__ (
13722         "mov	x6, 63\n\t"
13723         "sub	x6, x6, %[n]\n\t"
13724         "ldr	x3, [%[a], 376]\n\t"
13725         "lsr	x4, x3, 1\n\t"
13726         "lsl	x3, x3, %[n]\n\t"
13727         "lsr	x4, x4, x6\n\t"
13728         "ldr	x2, [%[a], 368]\n\t"
13729         "str	x4, [%[r], 384]\n\t"
13730         "lsr	x5, x2, 1\n\t"
13731         "lsl	x2, x2, %[n]\n\t"
13732         "lsr	x5, x5, x6\n\t"
13733         "orr	x3, x3, x5\n\t"
13734         "ldr	x4, [%[a], 360]\n\t"
13735         "str	x3, [%[r], 376]\n\t"
13736         "lsr	x5, x4, 1\n\t"
13737         "lsl	x4, x4, %[n]\n\t"
13738         "lsr	x5, x5, x6\n\t"
13739         "orr	x2, x2, x5\n\t"
13740         "ldr	x3, [%[a], 352]\n\t"
13741         "str	x2, [%[r], 368]\n\t"
13742         "lsr	x5, x3, 1\n\t"
13743         "lsl	x3, x3, %[n]\n\t"
13744         "lsr	x5, x5, x6\n\t"
13745         "orr	x4, x4, x5\n\t"
13746         "ldr	x2, [%[a], 344]\n\t"
13747         "str	x4, [%[r], 360]\n\t"
13748         "lsr	x5, x2, 1\n\t"
13749         "lsl	x2, x2, %[n]\n\t"
13750         "lsr	x5, x5, x6\n\t"
13751         "orr	x3, x3, x5\n\t"
13752         "ldr	x4, [%[a], 336]\n\t"
13753         "str	x3, [%[r], 352]\n\t"
13754         "lsr	x5, x4, 1\n\t"
13755         "lsl	x4, x4, %[n]\n\t"
13756         "lsr	x5, x5, x6\n\t"
13757         "orr	x2, x2, x5\n\t"
13758         "ldr	x3, [%[a], 328]\n\t"
13759         "str	x2, [%[r], 344]\n\t"
13760         "lsr	x5, x3, 1\n\t"
13761         "lsl	x3, x3, %[n]\n\t"
13762         "lsr	x5, x5, x6\n\t"
13763         "orr	x4, x4, x5\n\t"
13764         "ldr	x2, [%[a], 320]\n\t"
13765         "str	x4, [%[r], 336]\n\t"
13766         "lsr	x5, x2, 1\n\t"
13767         "lsl	x2, x2, %[n]\n\t"
13768         "lsr	x5, x5, x6\n\t"
13769         "orr	x3, x3, x5\n\t"
13770         "ldr	x4, [%[a], 312]\n\t"
13771         "str	x3, [%[r], 328]\n\t"
13772         "lsr	x5, x4, 1\n\t"
13773         "lsl	x4, x4, %[n]\n\t"
13774         "lsr	x5, x5, x6\n\t"
13775         "orr	x2, x2, x5\n\t"
13776         "ldr	x3, [%[a], 304]\n\t"
13777         "str	x2, [%[r], 320]\n\t"
13778         "lsr	x5, x3, 1\n\t"
13779         "lsl	x3, x3, %[n]\n\t"
13780         "lsr	x5, x5, x6\n\t"
13781         "orr	x4, x4, x5\n\t"
13782         "ldr	x2, [%[a], 296]\n\t"
13783         "str	x4, [%[r], 312]\n\t"
13784         "lsr	x5, x2, 1\n\t"
13785         "lsl	x2, x2, %[n]\n\t"
13786         "lsr	x5, x5, x6\n\t"
13787         "orr	x3, x3, x5\n\t"
13788         "ldr	x4, [%[a], 288]\n\t"
13789         "str	x3, [%[r], 304]\n\t"
13790         "lsr	x5, x4, 1\n\t"
13791         "lsl	x4, x4, %[n]\n\t"
13792         "lsr	x5, x5, x6\n\t"
13793         "orr	x2, x2, x5\n\t"
13794         "ldr	x3, [%[a], 280]\n\t"
13795         "str	x2, [%[r], 296]\n\t"
13796         "lsr	x5, x3, 1\n\t"
13797         "lsl	x3, x3, %[n]\n\t"
13798         "lsr	x5, x5, x6\n\t"
13799         "orr	x4, x4, x5\n\t"
13800         "ldr	x2, [%[a], 272]\n\t"
13801         "str	x4, [%[r], 288]\n\t"
13802         "lsr	x5, x2, 1\n\t"
13803         "lsl	x2, x2, %[n]\n\t"
13804         "lsr	x5, x5, x6\n\t"
13805         "orr	x3, x3, x5\n\t"
13806         "ldr	x4, [%[a], 264]\n\t"
13807         "str	x3, [%[r], 280]\n\t"
13808         "lsr	x5, x4, 1\n\t"
13809         "lsl	x4, x4, %[n]\n\t"
13810         "lsr	x5, x5, x6\n\t"
13811         "orr	x2, x2, x5\n\t"
13812         "ldr	x3, [%[a], 256]\n\t"
13813         "str	x2, [%[r], 272]\n\t"
13814         "lsr	x5, x3, 1\n\t"
13815         "lsl	x3, x3, %[n]\n\t"
13816         "lsr	x5, x5, x6\n\t"
13817         "orr	x4, x4, x5\n\t"
13818         "ldr	x2, [%[a], 248]\n\t"
13819         "str	x4, [%[r], 264]\n\t"
13820         "lsr	x5, x2, 1\n\t"
13821         "lsl	x2, x2, %[n]\n\t"
13822         "lsr	x5, x5, x6\n\t"
13823         "orr	x3, x3, x5\n\t"
13824         "ldr	x4, [%[a], 240]\n\t"
13825         "str	x3, [%[r], 256]\n\t"
13826         "lsr	x5, x4, 1\n\t"
13827         "lsl	x4, x4, %[n]\n\t"
13828         "lsr	x5, x5, x6\n\t"
13829         "orr	x2, x2, x5\n\t"
13830         "ldr	x3, [%[a], 232]\n\t"
13831         "str	x2, [%[r], 248]\n\t"
13832         "lsr	x5, x3, 1\n\t"
13833         "lsl	x3, x3, %[n]\n\t"
13834         "lsr	x5, x5, x6\n\t"
13835         "orr	x4, x4, x5\n\t"
13836         "ldr	x2, [%[a], 224]\n\t"
13837         "str	x4, [%[r], 240]\n\t"
13838         "lsr	x5, x2, 1\n\t"
13839         "lsl	x2, x2, %[n]\n\t"
13840         "lsr	x5, x5, x6\n\t"
13841         "orr	x3, x3, x5\n\t"
13842         "ldr	x4, [%[a], 216]\n\t"
13843         "str	x3, [%[r], 232]\n\t"
13844         "lsr	x5, x4, 1\n\t"
13845         "lsl	x4, x4, %[n]\n\t"
13846         "lsr	x5, x5, x6\n\t"
13847         "orr	x2, x2, x5\n\t"
13848         "ldr	x3, [%[a], 208]\n\t"
13849         "str	x2, [%[r], 224]\n\t"
13850         "lsr	x5, x3, 1\n\t"
13851         "lsl	x3, x3, %[n]\n\t"
13852         "lsr	x5, x5, x6\n\t"
13853         "orr	x4, x4, x5\n\t"
13854         "ldr	x2, [%[a], 200]\n\t"
13855         "str	x4, [%[r], 216]\n\t"
13856         "lsr	x5, x2, 1\n\t"
13857         "lsl	x2, x2, %[n]\n\t"
13858         "lsr	x5, x5, x6\n\t"
13859         "orr	x3, x3, x5\n\t"
13860         "ldr	x4, [%[a], 192]\n\t"
13861         "str	x3, [%[r], 208]\n\t"
13862         "lsr	x5, x4, 1\n\t"
13863         "lsl	x4, x4, %[n]\n\t"
13864         "lsr	x5, x5, x6\n\t"
13865         "orr	x2, x2, x5\n\t"
13866         "ldr	x3, [%[a], 184]\n\t"
13867         "str	x2, [%[r], 200]\n\t"
13868         "lsr	x5, x3, 1\n\t"
13869         "lsl	x3, x3, %[n]\n\t"
13870         "lsr	x5, x5, x6\n\t"
13871         "orr	x4, x4, x5\n\t"
13872         "ldr	x2, [%[a], 176]\n\t"
13873         "str	x4, [%[r], 192]\n\t"
13874         "lsr	x5, x2, 1\n\t"
13875         "lsl	x2, x2, %[n]\n\t"
13876         "lsr	x5, x5, x6\n\t"
13877         "orr	x3, x3, x5\n\t"
13878         "ldr	x4, [%[a], 168]\n\t"
13879         "str	x3, [%[r], 184]\n\t"
13880         "lsr	x5, x4, 1\n\t"
13881         "lsl	x4, x4, %[n]\n\t"
13882         "lsr	x5, x5, x6\n\t"
13883         "orr	x2, x2, x5\n\t"
13884         "ldr	x3, [%[a], 160]\n\t"
13885         "str	x2, [%[r], 176]\n\t"
13886         "lsr	x5, x3, 1\n\t"
13887         "lsl	x3, x3, %[n]\n\t"
13888         "lsr	x5, x5, x6\n\t"
13889         "orr	x4, x4, x5\n\t"
13890         "ldr	x2, [%[a], 152]\n\t"
13891         "str	x4, [%[r], 168]\n\t"
13892         "lsr	x5, x2, 1\n\t"
13893         "lsl	x2, x2, %[n]\n\t"
13894         "lsr	x5, x5, x6\n\t"
13895         "orr	x3, x3, x5\n\t"
13896         "ldr	x4, [%[a], 144]\n\t"
13897         "str	x3, [%[r], 160]\n\t"
13898         "lsr	x5, x4, 1\n\t"
13899         "lsl	x4, x4, %[n]\n\t"
13900         "lsr	x5, x5, x6\n\t"
13901         "orr	x2, x2, x5\n\t"
13902         "ldr	x3, [%[a], 136]\n\t"
13903         "str	x2, [%[r], 152]\n\t"
13904         "lsr	x5, x3, 1\n\t"
13905         "lsl	x3, x3, %[n]\n\t"
13906         "lsr	x5, x5, x6\n\t"
13907         "orr	x4, x4, x5\n\t"
13908         "ldr	x2, [%[a], 128]\n\t"
13909         "str	x4, [%[r], 144]\n\t"
13910         "lsr	x5, x2, 1\n\t"
13911         "lsl	x2, x2, %[n]\n\t"
13912         "lsr	x5, x5, x6\n\t"
13913         "orr	x3, x3, x5\n\t"
13914         "ldr	x4, [%[a], 120]\n\t"
13915         "str	x3, [%[r], 136]\n\t"
13916         "lsr	x5, x4, 1\n\t"
13917         "lsl	x4, x4, %[n]\n\t"
13918         "lsr	x5, x5, x6\n\t"
13919         "orr	x2, x2, x5\n\t"
13920         "ldr	x3, [%[a], 112]\n\t"
13921         "str	x2, [%[r], 128]\n\t"
13922         "lsr	x5, x3, 1\n\t"
13923         "lsl	x3, x3, %[n]\n\t"
13924         "lsr	x5, x5, x6\n\t"
13925         "orr	x4, x4, x5\n\t"
13926         "ldr	x2, [%[a], 104]\n\t"
13927         "str	x4, [%[r], 120]\n\t"
13928         "lsr	x5, x2, 1\n\t"
13929         "lsl	x2, x2, %[n]\n\t"
13930         "lsr	x5, x5, x6\n\t"
13931         "orr	x3, x3, x5\n\t"
13932         "ldr	x4, [%[a], 96]\n\t"
13933         "str	x3, [%[r], 112]\n\t"
13934         "lsr	x5, x4, 1\n\t"
13935         "lsl	x4, x4, %[n]\n\t"
13936         "lsr	x5, x5, x6\n\t"
13937         "orr	x2, x2, x5\n\t"
13938         "ldr	x3, [%[a], 88]\n\t"
13939         "str	x2, [%[r], 104]\n\t"
13940         "lsr	x5, x3, 1\n\t"
13941         "lsl	x3, x3, %[n]\n\t"
13942         "lsr	x5, x5, x6\n\t"
13943         "orr	x4, x4, x5\n\t"
13944         "ldr	x2, [%[a], 80]\n\t"
13945         "str	x4, [%[r], 96]\n\t"
13946         "lsr	x5, x2, 1\n\t"
13947         "lsl	x2, x2, %[n]\n\t"
13948         "lsr	x5, x5, x6\n\t"
13949         "orr	x3, x3, x5\n\t"
13950         "ldr	x4, [%[a], 72]\n\t"
13951         "str	x3, [%[r], 88]\n\t"
13952         "lsr	x5, x4, 1\n\t"
13953         "lsl	x4, x4, %[n]\n\t"
13954         "lsr	x5, x5, x6\n\t"
13955         "orr	x2, x2, x5\n\t"
13956         "ldr	x3, [%[a], 64]\n\t"
13957         "str	x2, [%[r], 80]\n\t"
13958         "lsr	x5, x3, 1\n\t"
13959         "lsl	x3, x3, %[n]\n\t"
13960         "lsr	x5, x5, x6\n\t"
13961         "orr	x4, x4, x5\n\t"
13962         "ldr	x2, [%[a], 56]\n\t"
13963         "str	x4, [%[r], 72]\n\t"
13964         "lsr	x5, x2, 1\n\t"
13965         "lsl	x2, x2, %[n]\n\t"
13966         "lsr	x5, x5, x6\n\t"
13967         "orr	x3, x3, x5\n\t"
13968         "ldr	x4, [%[a], 48]\n\t"
13969         "str	x3, [%[r], 64]\n\t"
13970         "lsr	x5, x4, 1\n\t"
13971         "lsl	x4, x4, %[n]\n\t"
13972         "lsr	x5, x5, x6\n\t"
13973         "orr	x2, x2, x5\n\t"
13974         "ldr	x3, [%[a], 40]\n\t"
13975         "str	x2, [%[r], 56]\n\t"
13976         "lsr	x5, x3, 1\n\t"
13977         "lsl	x3, x3, %[n]\n\t"
13978         "lsr	x5, x5, x6\n\t"
13979         "orr	x4, x4, x5\n\t"
13980         "ldr	x2, [%[a], 32]\n\t"
13981         "str	x4, [%[r], 48]\n\t"
13982         "lsr	x5, x2, 1\n\t"
13983         "lsl	x2, x2, %[n]\n\t"
13984         "lsr	x5, x5, x6\n\t"
13985         "orr	x3, x3, x5\n\t"
13986         "ldr	x4, [%[a], 24]\n\t"
13987         "str	x3, [%[r], 40]\n\t"
13988         "lsr	x5, x4, 1\n\t"
13989         "lsl	x4, x4, %[n]\n\t"
13990         "lsr	x5, x5, x6\n\t"
13991         "orr	x2, x2, x5\n\t"
13992         "ldr	x3, [%[a], 16]\n\t"
13993         "str	x2, [%[r], 32]\n\t"
13994         "lsr	x5, x3, 1\n\t"
13995         "lsl	x3, x3, %[n]\n\t"
13996         "lsr	x5, x5, x6\n\t"
13997         "orr	x4, x4, x5\n\t"
13998         "ldr	x2, [%[a], 8]\n\t"
13999         "str	x4, [%[r], 24]\n\t"
14000         "lsr	x5, x2, 1\n\t"
14001         "lsl	x2, x2, %[n]\n\t"
14002         "lsr	x5, x5, x6\n\t"
14003         "orr	x3, x3, x5\n\t"
14004         "ldr	x4, [%[a], 0]\n\t"
14005         "str	x3, [%[r], 16]\n\t"
14006         "lsr	x5, x4, 1\n\t"
14007         "lsl	x4, x4, %[n]\n\t"
14008         "lsr	x5, x5, x6\n\t"
14009         "orr	x2, x2, x5\n\t"
14010         "str	x4, [%[r]]\n\t"
14011         "str	x2, [%[r], 8]\n\t"
14012         :
14013         : [r] "r" (r), [a] "r" (a), [n] "r" (n64)
14014         : "memory", "x2", "x3", "x4", "x5", "x6"
14015     );
14016 }
14017 
14018 /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
14019  *
14020  * r     A single precision number that is the result of the operation.
14021  * e     A single precision number that is the exponent.
14022  * bits  The number of bits in the exponent.
14023  * m     A single precision number that is the modulus.
14024  * returns  0 on success.
14025  * returns  MEMORY_E on dynamic memory allocation failure.
14026  * returns  MP_VAL when base is even.
14027  */
sp_3072_mod_exp_2_48(sp_digit * r,const sp_digit * e,int bits,const sp_digit * m)14028 static int sp_3072_mod_exp_2_48(sp_digit* r, const sp_digit* e, int bits,
14029         const sp_digit* m)
14030 {
14031 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
14032     sp_digit* td = NULL;
14033 #else
14034     sp_digit td[145];
14035 #endif
14036     sp_digit* norm = NULL;
14037     sp_digit* tmp = NULL;
14038     sp_digit mp = 1;
14039     sp_digit n;
14040     sp_digit o;
14041     sp_digit mask;
14042     int i;
14043     int c;
14044     byte y;
14045     int err = MP_OKAY;
14046 
14047     if ((m[0] & 1) == 0) {
14048         err = MP_VAL;
14049     }
14050 
14051 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
14052     if (err == MP_OKAY) {
14053         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 145, NULL,
14054                                 DYNAMIC_TYPE_TMP_BUFFER);
14055         if (td == NULL)
14056             err = MEMORY_E;
14057     }
14058 #endif
14059 
14060     if (err == MP_OKAY) {
14061         norm = td;
14062         tmp = td + 96;
14063 
14064         sp_3072_mont_setup(m, &mp);
14065         sp_3072_mont_norm_48(norm, m);
14066 
14067         i = (bits - 1) / 64;
14068         n = e[i--];
14069         c = bits & 63;
14070         if (c == 0) {
14071             c = 64;
14072         }
14073         c -= bits % 6;
14074         if (c == 64) {
14075             c = 58;
14076         }
14077         if (c < 0) {
14078             /* Number of bits in top word is less than number needed. */
14079             c = -c;
14080             y = (byte)(n << c);
14081             n = e[i--];
14082             y |= (byte)(n >> (64 - c));
14083             n <<= c;
14084             c = 64 - c;
14085         }
14086         else {
14087             y = (byte)(n >> c);
14088             n <<= 64 - c;
14089         }
14090         sp_3072_lshift_48(r, norm, y);
14091         for (; i>=0 || c>=6; ) {
14092             if (c == 0) {
14093                 n = e[i--];
14094                 y = (byte)(n >> 58);
14095                 n <<= 6;
14096                 c = 58;
14097             }
14098             else if (c < 6) {
14099                 y = (byte)(n >> 58);
14100                 n = e[i--];
14101                 c = 6 - c;
14102                 y |= (byte)(n >> (64 - c));
14103                 n <<= c;
14104                 c = 64 - c;
14105             }
14106             else {
14107                 y = (byte)((n >> 58) & 0x3f);
14108                 n <<= 6;
14109                 c -= 6;
14110             }
14111 
14112             sp_3072_mont_sqr_48(r, r, m, mp);
14113             sp_3072_mont_sqr_48(r, r, m, mp);
14114             sp_3072_mont_sqr_48(r, r, m, mp);
14115             sp_3072_mont_sqr_48(r, r, m, mp);
14116             sp_3072_mont_sqr_48(r, r, m, mp);
14117             sp_3072_mont_sqr_48(r, r, m, mp);
14118 
14119             sp_3072_lshift_48(r, r, y);
14120             sp_3072_mul_d_48(tmp, norm, r[48]);
14121             r[48] = 0;
14122             o = sp_3072_add_48(r, r, tmp);
14123             sp_3072_cond_sub_48(r, r, m, (sp_digit)0 - o);
14124         }
14125 
14126         XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
14127         sp_3072_mont_reduce_48(r, m, mp);
14128 
14129         mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
14130         sp_3072_cond_sub_48(r, r, m, mask);
14131     }
14132 
14133 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
14134     if (td != NULL)
14135         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
14136 #endif
14137 
14138     return err;
14139 }
14140 #endif /* HAVE_FFDHE_3072 */
14141 
14142 /* Perform the modular exponentiation for Diffie-Hellman.
14143  *
14144  * base     Base.
14145  * exp      Array of bytes that is the exponent.
14146  * expLen   Length of data, in bytes, in exponent.
14147  * mod      Modulus.
14148  * out      Buffer to hold big-endian bytes of exponentiation result.
14149  *          Must be at least 384 bytes long.
14150  * outLen   Length, in bytes, of exponentiation result.
14151  * returns 0 on success, MP_READ_E if there are too many bytes in an array
14152  * and MEMORY_E if memory allocation fails.
14153  */
sp_DhExp_3072(const mp_int * base,const byte * exp,word32 expLen,const mp_int * mod,byte * out,word32 * outLen)14154 int sp_DhExp_3072(const mp_int* base, const byte* exp, word32 expLen,
14155     const mp_int* mod, byte* out, word32* outLen)
14156 {
14157     int err = MP_OKAY;
14158     sp_digit b[96];
14159     sp_digit e[48];
14160     sp_digit m[48];
14161     sp_digit* r = b;
14162     word32 i;
14163 
14164     if (mp_count_bits(base) > 3072) {
14165         err = MP_READ_E;
14166     }
14167     else if (expLen > 384) {
14168         err = MP_READ_E;
14169     }
14170     else if (mp_count_bits(mod) != 3072) {
14171         err = MP_READ_E;
14172     }
14173     else if (mp_iseven(mod)) {
14174         err = MP_VAL;
14175     }
14176 
14177     if (err == MP_OKAY) {
14178         sp_3072_from_mp(b, 48, base);
14179         sp_3072_from_bin(e, 48, exp, expLen);
14180         sp_3072_from_mp(m, 48, mod);
14181 
14182     #ifdef HAVE_FFDHE_3072
14183         if (base->used == 1 && base->dp[0] == 2 && m[47] == (sp_digit)-1)
14184             err = sp_3072_mod_exp_2_48(r, e, expLen * 8, m);
14185         else
14186     #endif
14187             err = sp_3072_mod_exp_48(r, b, e, expLen * 8, m, 0);
14188 
14189     }
14190 
14191     if (err == MP_OKAY) {
14192         sp_3072_to_bin_48(r, out);
14193         *outLen = 384;
14194         for (i=0; i<384 && out[i] == 0; i++) {
14195             /* Search for first non-zero. */
14196         }
14197         *outLen -= i;
14198         XMEMMOVE(out, out + i, *outLen);
14199 
14200     }
14201 
14202     XMEMSET(e, 0, sizeof(e));
14203 
14204     return err;
14205 }
14206 #endif /* WOLFSSL_HAVE_SP_DH */
14207 
14208 /* Perform the modular exponentiation for Diffie-Hellman.
14209  *
14210  * base  Base. MP integer.
14211  * exp   Exponent. MP integer.
14212  * mod   Modulus. MP integer.
14213  * res   Result. MP integer.
14214  * returns 0 on success, MP_READ_E if there are too many bytes in an array
14215  * and MEMORY_E if memory allocation fails.
14216  */
sp_ModExp_1536(const mp_int * base,const mp_int * exp,const mp_int * mod,mp_int * res)14217 int sp_ModExp_1536(const mp_int* base, const mp_int* exp, const mp_int* mod,
14218     mp_int* res)
14219 {
14220     int err = MP_OKAY;
14221     sp_digit b[48];
14222     sp_digit e[24];
14223     sp_digit m[24];
14224     sp_digit* r = b;
14225     int expBits = mp_count_bits(exp);
14226 
14227     if (mp_count_bits(base) > 1536) {
14228         err = MP_READ_E;
14229     }
14230     else if (expBits > 1536) {
14231         err = MP_READ_E;
14232     }
14233     else if (mp_count_bits(mod) != 1536) {
14234         err = MP_READ_E;
14235     }
14236     else if (mp_iseven(mod)) {
14237         err = MP_VAL;
14238     }
14239 
14240     if (err == MP_OKAY) {
14241         sp_3072_from_mp(b, 24, base);
14242         sp_3072_from_mp(e, 24, exp);
14243         sp_3072_from_mp(m, 24, mod);
14244 
14245         err = sp_3072_mod_exp_24(r, b, e, expBits, m, 0);
14246     }
14247 
14248     if (err == MP_OKAY) {
14249         XMEMSET(r + 24, 0, sizeof(*r) * 24U);
14250         err = sp_3072_to_mp(r, res);
14251         res->used = mod->used;
14252         mp_clamp(res);
14253     }
14254 
14255     XMEMSET(e, 0, sizeof(e));
14256 
14257     return err;
14258 }
14259 
14260 #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
14261 
14262 #endif /* !WOLFSSL_SP_NO_3072 */
14263 
14264 #ifdef WOLFSSL_SP_4096
14265 /* Read big endian unsigned byte array into r.
14266  *
14267  * r  A single precision integer.
14268  * size  Maximum number of bytes to convert
14269  * a  Byte array.
14270  * n  Number of bytes in array to read.
14271  */
sp_4096_from_bin(sp_digit * r,int size,const byte * a,int n)14272 static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n)
14273 {
14274     int i;
14275     int j;
14276     byte* d;
14277 
14278     for (i = n - 1,j = 0; i >= 7; i -= 8) {
14279         r[j]  = ((sp_digit)a[i - 0] <<  0) |
14280                 ((sp_digit)a[i - 1] <<  8) |
14281                 ((sp_digit)a[i - 2] << 16) |
14282                 ((sp_digit)a[i - 3] << 24) |
14283                 ((sp_digit)a[i - 4] << 32) |
14284                 ((sp_digit)a[i - 5] << 40) |
14285                 ((sp_digit)a[i - 6] << 48) |
14286                 ((sp_digit)a[i - 7] << 56);
14287         j++;
14288     }
14289 
14290     if (i >= 0) {
14291         r[j] = 0;
14292 
14293         d = (byte*)r;
14294         switch (i) {
14295             case 6: d[n - 1 - 6] = a[6]; //fallthrough
14296             case 5: d[n - 1 - 5] = a[5]; //fallthrough
14297             case 4: d[n - 1 - 4] = a[4]; //fallthrough
14298             case 3: d[n - 1 - 3] = a[3]; //fallthrough
14299             case 2: d[n - 1 - 2] = a[2]; //fallthrough
14300             case 1: d[n - 1 - 1] = a[1]; //fallthrough
14301             case 0: d[n - 1 - 0] = a[0]; //fallthrough
14302         }
14303         j++;
14304     }
14305 
14306     for (; j < size; j++) {
14307         r[j] = 0;
14308     }
14309 }
14310 
14311 /* Convert an mp_int to an array of sp_digit.
14312  *
14313  * r  A single precision integer.
14314  * size  Maximum number of bytes to convert
14315  * a  A multi-precision integer.
14316  */
sp_4096_from_mp(sp_digit * r,int size,const mp_int * a)14317 static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a)
14318 {
14319 #if DIGIT_BIT == 64
14320     int j;
14321 
14322     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
14323 
14324     for (j = a->used; j < size; j++) {
14325         r[j] = 0;
14326     }
14327 #elif DIGIT_BIT > 64
14328     int i;
14329     int j = 0;
14330     word32 s = 0;
14331 
14332     r[0] = 0;
14333     for (i = 0; i < a->used && j < size; i++) {
14334         r[j] |= ((sp_digit)a->dp[i] << s);
14335         r[j] &= 0xffffffffffffffffl;
14336         s = 64U - s;
14337         if (j + 1 >= size) {
14338             break;
14339         }
14340         /* lint allow cast of mismatch word32 and mp_digit */
14341         r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
14342         while ((s + 64U) <= (word32)DIGIT_BIT) {
14343             s += 64U;
14344             r[j] &= 0xffffffffffffffffl;
14345             if (j + 1 >= size) {
14346                 break;
14347             }
14348             if (s < (word32)DIGIT_BIT) {
14349                 /* lint allow cast of mismatch word32 and mp_digit */
14350                 r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
14351             }
14352             else {
14353                 r[++j] = (sp_digit)0;
14354             }
14355         }
14356         s = (word32)DIGIT_BIT - s;
14357     }
14358 
14359     for (j++; j < size; j++) {
14360         r[j] = 0;
14361     }
14362 #else
14363     int i;
14364     int j = 0;
14365     int s = 0;
14366 
14367     r[0] = 0;
14368     for (i = 0; i < a->used && j < size; i++) {
14369         r[j] |= ((sp_digit)a->dp[i]) << s;
14370         if (s + DIGIT_BIT >= 64) {
14371             r[j] &= 0xffffffffffffffffl;
14372             if (j + 1 >= size) {
14373                 break;
14374             }
14375             s = 64 - s;
14376             if (s == DIGIT_BIT) {
14377                 r[++j] = 0;
14378                 s = 0;
14379             }
14380             else {
14381                 r[++j] = a->dp[i] >> s;
14382                 s = DIGIT_BIT - s;
14383             }
14384         }
14385         else {
14386             s += DIGIT_BIT;
14387         }
14388     }
14389 
14390     for (j++; j < size; j++) {
14391         r[j] = 0;
14392     }
14393 #endif
14394 }
14395 
14396 /* Write r as big endian to byte array.
14397  * Fixed length number of bytes written: 512
14398  *
14399  * r  A single precision integer.
14400  * a  Byte array.
14401  */
sp_4096_to_bin_64(sp_digit * r,byte * a)14402 static void sp_4096_to_bin_64(sp_digit* r, byte* a)
14403 {
14404     int i;
14405     int j;
14406 
14407     for (i = 63, j = 0; i >= 0; i--) {
14408         a[j++] = r[i] >> 56;
14409         a[j++] = r[i] >> 48;
14410         a[j++] = r[i] >> 40;
14411         a[j++] = r[i] >> 32;
14412         a[j++] = r[i] >> 24;
14413         a[j++] = r[i] >> 16;
14414         a[j++] = r[i] >> 8;
14415         a[j++] = r[i] >> 0;
14416     }
14417 }
14418 
14419 #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
14420 /* Normalize the values in each word to 64.
14421  *
14422  * a  Array of sp_digit to normalize.
14423  */
14424 #define sp_4096_norm_64(a)
14425 
14426 #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
14427 /* Normalize the values in each word to 64.
14428  *
14429  * a  Array of sp_digit to normalize.
14430  */
14431 #define sp_4096_norm_64(a)
14432 
14433 #ifndef WOLFSSL_SP_SMALL
14434 /* Add b to a into r. (r = a + b)
14435  *
14436  * r  A single precision integer.
14437  * a  A single precision integer.
14438  * b  A single precision integer.
14439  */
sp_4096_add_32(sp_digit * r,const sp_digit * a,const sp_digit * b)14440 static sp_digit sp_4096_add_32(sp_digit* r, const sp_digit* a,
14441         const sp_digit* b)
14442 {
14443     __asm__ __volatile__ (
14444         "ldp	x3, x4, [%[a], 0]\n\t"
14445         "ldp	x7, x8, [%[b], 0]\n\t"
14446         "adds	x3, x3, x7\n\t"
14447         "ldp	x5, x6, [%[a], 16]\n\t"
14448         "adcs	x4, x4, x8\n\t"
14449         "ldp	x9, x10, [%[b], 16]\n\t"
14450         "adcs	x5, x5, x9\n\t"
14451         "stp	x3, x4, [%[r], 0]\n\t"
14452         "adcs	x6, x6, x10\n\t"
14453         "stp	x5, x6, [%[r], 16]\n\t"
14454         "ldp	x3, x4, [%[a], 32]\n\t"
14455         "ldp	x7, x8, [%[b], 32]\n\t"
14456         "adcs	x3, x3, x7\n\t"
14457         "ldp	x5, x6, [%[a], 48]\n\t"
14458         "adcs	x4, x4, x8\n\t"
14459         "ldp	x9, x10, [%[b], 48]\n\t"
14460         "adcs	x5, x5, x9\n\t"
14461         "stp	x3, x4, [%[r], 32]\n\t"
14462         "adcs	x6, x6, x10\n\t"
14463         "stp	x5, x6, [%[r], 48]\n\t"
14464         "ldp	x3, x4, [%[a], 64]\n\t"
14465         "ldp	x7, x8, [%[b], 64]\n\t"
14466         "adcs	x3, x3, x7\n\t"
14467         "ldp	x5, x6, [%[a], 80]\n\t"
14468         "adcs	x4, x4, x8\n\t"
14469         "ldp	x9, x10, [%[b], 80]\n\t"
14470         "adcs	x5, x5, x9\n\t"
14471         "stp	x3, x4, [%[r], 64]\n\t"
14472         "adcs	x6, x6, x10\n\t"
14473         "stp	x5, x6, [%[r], 80]\n\t"
14474         "ldp	x3, x4, [%[a], 96]\n\t"
14475         "ldp	x7, x8, [%[b], 96]\n\t"
14476         "adcs	x3, x3, x7\n\t"
14477         "ldp	x5, x6, [%[a], 112]\n\t"
14478         "adcs	x4, x4, x8\n\t"
14479         "ldp	x9, x10, [%[b], 112]\n\t"
14480         "adcs	x5, x5, x9\n\t"
14481         "stp	x3, x4, [%[r], 96]\n\t"
14482         "adcs	x6, x6, x10\n\t"
14483         "stp	x5, x6, [%[r], 112]\n\t"
14484         "ldp	x3, x4, [%[a], 128]\n\t"
14485         "ldp	x7, x8, [%[b], 128]\n\t"
14486         "adcs	x3, x3, x7\n\t"
14487         "ldp	x5, x6, [%[a], 144]\n\t"
14488         "adcs	x4, x4, x8\n\t"
14489         "ldp	x9, x10, [%[b], 144]\n\t"
14490         "adcs	x5, x5, x9\n\t"
14491         "stp	x3, x4, [%[r], 128]\n\t"
14492         "adcs	x6, x6, x10\n\t"
14493         "stp	x5, x6, [%[r], 144]\n\t"
14494         "ldp	x3, x4, [%[a], 160]\n\t"
14495         "ldp	x7, x8, [%[b], 160]\n\t"
14496         "adcs	x3, x3, x7\n\t"
14497         "ldp	x5, x6, [%[a], 176]\n\t"
14498         "adcs	x4, x4, x8\n\t"
14499         "ldp	x9, x10, [%[b], 176]\n\t"
14500         "adcs	x5, x5, x9\n\t"
14501         "stp	x3, x4, [%[r], 160]\n\t"
14502         "adcs	x6, x6, x10\n\t"
14503         "stp	x5, x6, [%[r], 176]\n\t"
14504         "ldp	x3, x4, [%[a], 192]\n\t"
14505         "ldp	x7, x8, [%[b], 192]\n\t"
14506         "adcs	x3, x3, x7\n\t"
14507         "ldp	x5, x6, [%[a], 208]\n\t"
14508         "adcs	x4, x4, x8\n\t"
14509         "ldp	x9, x10, [%[b], 208]\n\t"
14510         "adcs	x5, x5, x9\n\t"
14511         "stp	x3, x4, [%[r], 192]\n\t"
14512         "adcs	x6, x6, x10\n\t"
14513         "stp	x5, x6, [%[r], 208]\n\t"
14514         "ldp	x3, x4, [%[a], 224]\n\t"
14515         "ldp	x7, x8, [%[b], 224]\n\t"
14516         "adcs	x3, x3, x7\n\t"
14517         "ldp	x5, x6, [%[a], 240]\n\t"
14518         "adcs	x4, x4, x8\n\t"
14519         "ldp	x9, x10, [%[b], 240]\n\t"
14520         "adcs	x5, x5, x9\n\t"
14521         "stp	x3, x4, [%[r], 224]\n\t"
14522         "adcs	x6, x6, x10\n\t"
14523         "stp	x5, x6, [%[r], 240]\n\t"
14524         "cset	%[r], cs\n\t"
14525         : [r] "+r" (r)
14526         : [a] "r" (a), [b] "r" (b)
14527         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
14528     );
14529 
14530     return (sp_digit)r;
14531 }
14532 
14533 /* Sub b from a into a. (a -= b)
14534  *
14535  * a  A single precision integer and result.
14536  * b  A single precision integer.
14537  */
sp_4096_sub_in_place_64(sp_digit * a,const sp_digit * b)14538 static sp_digit sp_4096_sub_in_place_64(sp_digit* a, const sp_digit* b)
14539 {
14540     __asm__ __volatile__ (
14541         "ldp	x2, x3, [%[a], 0]\n\t"
14542         "ldp	x6, x7, [%[b], 0]\n\t"
14543         "subs	x2, x2, x6\n\t"
14544         "ldp	x4, x5, [%[a], 16]\n\t"
14545         "sbcs	x3, x3, x7\n\t"
14546         "ldp	x8, x9, [%[b], 16]\n\t"
14547         "sbcs	x4, x4, x8\n\t"
14548         "stp	x2, x3, [%[a], 0]\n\t"
14549         "sbcs	x5, x5, x9\n\t"
14550         "stp	x4, x5, [%[a], 16]\n\t"
14551         "ldp	x2, x3, [%[a], 32]\n\t"
14552         "ldp	x6, x7, [%[b], 32]\n\t"
14553         "sbcs	x2, x2, x6\n\t"
14554         "ldp	x4, x5, [%[a], 48]\n\t"
14555         "sbcs	x3, x3, x7\n\t"
14556         "ldp	x8, x9, [%[b], 48]\n\t"
14557         "sbcs	x4, x4, x8\n\t"
14558         "stp	x2, x3, [%[a], 32]\n\t"
14559         "sbcs	x5, x5, x9\n\t"
14560         "stp	x4, x5, [%[a], 48]\n\t"
14561         "ldp	x2, x3, [%[a], 64]\n\t"
14562         "ldp	x6, x7, [%[b], 64]\n\t"
14563         "sbcs	x2, x2, x6\n\t"
14564         "ldp	x4, x5, [%[a], 80]\n\t"
14565         "sbcs	x3, x3, x7\n\t"
14566         "ldp	x8, x9, [%[b], 80]\n\t"
14567         "sbcs	x4, x4, x8\n\t"
14568         "stp	x2, x3, [%[a], 64]\n\t"
14569         "sbcs	x5, x5, x9\n\t"
14570         "stp	x4, x5, [%[a], 80]\n\t"
14571         "ldp	x2, x3, [%[a], 96]\n\t"
14572         "ldp	x6, x7, [%[b], 96]\n\t"
14573         "sbcs	x2, x2, x6\n\t"
14574         "ldp	x4, x5, [%[a], 112]\n\t"
14575         "sbcs	x3, x3, x7\n\t"
14576         "ldp	x8, x9, [%[b], 112]\n\t"
14577         "sbcs	x4, x4, x8\n\t"
14578         "stp	x2, x3, [%[a], 96]\n\t"
14579         "sbcs	x5, x5, x9\n\t"
14580         "stp	x4, x5, [%[a], 112]\n\t"
14581         "ldp	x2, x3, [%[a], 128]\n\t"
14582         "ldp	x6, x7, [%[b], 128]\n\t"
14583         "sbcs	x2, x2, x6\n\t"
14584         "ldp	x4, x5, [%[a], 144]\n\t"
14585         "sbcs	x3, x3, x7\n\t"
14586         "ldp	x8, x9, [%[b], 144]\n\t"
14587         "sbcs	x4, x4, x8\n\t"
14588         "stp	x2, x3, [%[a], 128]\n\t"
14589         "sbcs	x5, x5, x9\n\t"
14590         "stp	x4, x5, [%[a], 144]\n\t"
14591         "ldp	x2, x3, [%[a], 160]\n\t"
14592         "ldp	x6, x7, [%[b], 160]\n\t"
14593         "sbcs	x2, x2, x6\n\t"
14594         "ldp	x4, x5, [%[a], 176]\n\t"
14595         "sbcs	x3, x3, x7\n\t"
14596         "ldp	x8, x9, [%[b], 176]\n\t"
14597         "sbcs	x4, x4, x8\n\t"
14598         "stp	x2, x3, [%[a], 160]\n\t"
14599         "sbcs	x5, x5, x9\n\t"
14600         "stp	x4, x5, [%[a], 176]\n\t"
14601         "ldp	x2, x3, [%[a], 192]\n\t"
14602         "ldp	x6, x7, [%[b], 192]\n\t"
14603         "sbcs	x2, x2, x6\n\t"
14604         "ldp	x4, x5, [%[a], 208]\n\t"
14605         "sbcs	x3, x3, x7\n\t"
14606         "ldp	x8, x9, [%[b], 208]\n\t"
14607         "sbcs	x4, x4, x8\n\t"
14608         "stp	x2, x3, [%[a], 192]\n\t"
14609         "sbcs	x5, x5, x9\n\t"
14610         "stp	x4, x5, [%[a], 208]\n\t"
14611         "ldp	x2, x3, [%[a], 224]\n\t"
14612         "ldp	x6, x7, [%[b], 224]\n\t"
14613         "sbcs	x2, x2, x6\n\t"
14614         "ldp	x4, x5, [%[a], 240]\n\t"
14615         "sbcs	x3, x3, x7\n\t"
14616         "ldp	x8, x9, [%[b], 240]\n\t"
14617         "sbcs	x4, x4, x8\n\t"
14618         "stp	x2, x3, [%[a], 224]\n\t"
14619         "sbcs	x5, x5, x9\n\t"
14620         "stp	x4, x5, [%[a], 240]\n\t"
14621         "ldp	x2, x3, [%[a], 256]\n\t"
14622         "ldp	x6, x7, [%[b], 256]\n\t"
14623         "sbcs	x2, x2, x6\n\t"
14624         "ldp	x4, x5, [%[a], 272]\n\t"
14625         "sbcs	x3, x3, x7\n\t"
14626         "ldp	x8, x9, [%[b], 272]\n\t"
14627         "sbcs	x4, x4, x8\n\t"
14628         "stp	x2, x3, [%[a], 256]\n\t"
14629         "sbcs	x5, x5, x9\n\t"
14630         "stp	x4, x5, [%[a], 272]\n\t"
14631         "ldp	x2, x3, [%[a], 288]\n\t"
14632         "ldp	x6, x7, [%[b], 288]\n\t"
14633         "sbcs	x2, x2, x6\n\t"
14634         "ldp	x4, x5, [%[a], 304]\n\t"
14635         "sbcs	x3, x3, x7\n\t"
14636         "ldp	x8, x9, [%[b], 304]\n\t"
14637         "sbcs	x4, x4, x8\n\t"
14638         "stp	x2, x3, [%[a], 288]\n\t"
14639         "sbcs	x5, x5, x9\n\t"
14640         "stp	x4, x5, [%[a], 304]\n\t"
14641         "ldp	x2, x3, [%[a], 320]\n\t"
14642         "ldp	x6, x7, [%[b], 320]\n\t"
14643         "sbcs	x2, x2, x6\n\t"
14644         "ldp	x4, x5, [%[a], 336]\n\t"
14645         "sbcs	x3, x3, x7\n\t"
14646         "ldp	x8, x9, [%[b], 336]\n\t"
14647         "sbcs	x4, x4, x8\n\t"
14648         "stp	x2, x3, [%[a], 320]\n\t"
14649         "sbcs	x5, x5, x9\n\t"
14650         "stp	x4, x5, [%[a], 336]\n\t"
14651         "ldp	x2, x3, [%[a], 352]\n\t"
14652         "ldp	x6, x7, [%[b], 352]\n\t"
14653         "sbcs	x2, x2, x6\n\t"
14654         "ldp	x4, x5, [%[a], 368]\n\t"
14655         "sbcs	x3, x3, x7\n\t"
14656         "ldp	x8, x9, [%[b], 368]\n\t"
14657         "sbcs	x4, x4, x8\n\t"
14658         "stp	x2, x3, [%[a], 352]\n\t"
14659         "sbcs	x5, x5, x9\n\t"
14660         "stp	x4, x5, [%[a], 368]\n\t"
14661         "ldp	x2, x3, [%[a], 384]\n\t"
14662         "ldp	x6, x7, [%[b], 384]\n\t"
14663         "sbcs	x2, x2, x6\n\t"
14664         "ldp	x4, x5, [%[a], 400]\n\t"
14665         "sbcs	x3, x3, x7\n\t"
14666         "ldp	x8, x9, [%[b], 400]\n\t"
14667         "sbcs	x4, x4, x8\n\t"
14668         "stp	x2, x3, [%[a], 384]\n\t"
14669         "sbcs	x5, x5, x9\n\t"
14670         "stp	x4, x5, [%[a], 400]\n\t"
14671         "ldp	x2, x3, [%[a], 416]\n\t"
14672         "ldp	x6, x7, [%[b], 416]\n\t"
14673         "sbcs	x2, x2, x6\n\t"
14674         "ldp	x4, x5, [%[a], 432]\n\t"
14675         "sbcs	x3, x3, x7\n\t"
14676         "ldp	x8, x9, [%[b], 432]\n\t"
14677         "sbcs	x4, x4, x8\n\t"
14678         "stp	x2, x3, [%[a], 416]\n\t"
14679         "sbcs	x5, x5, x9\n\t"
14680         "stp	x4, x5, [%[a], 432]\n\t"
14681         "ldp	x2, x3, [%[a], 448]\n\t"
14682         "ldp	x6, x7, [%[b], 448]\n\t"
14683         "sbcs	x2, x2, x6\n\t"
14684         "ldp	x4, x5, [%[a], 464]\n\t"
14685         "sbcs	x3, x3, x7\n\t"
14686         "ldp	x8, x9, [%[b], 464]\n\t"
14687         "sbcs	x4, x4, x8\n\t"
14688         "stp	x2, x3, [%[a], 448]\n\t"
14689         "sbcs	x5, x5, x9\n\t"
14690         "stp	x4, x5, [%[a], 464]\n\t"
14691         "ldp	x2, x3, [%[a], 480]\n\t"
14692         "ldp	x6, x7, [%[b], 480]\n\t"
14693         "sbcs	x2, x2, x6\n\t"
14694         "ldp	x4, x5, [%[a], 496]\n\t"
14695         "sbcs	x3, x3, x7\n\t"
14696         "ldp	x8, x9, [%[b], 496]\n\t"
14697         "sbcs	x4, x4, x8\n\t"
14698         "stp	x2, x3, [%[a], 480]\n\t"
14699         "sbcs	x5, x5, x9\n\t"
14700         "stp	x4, x5, [%[a], 496]\n\t"
14701         "csetm	%[a], cc\n\t"
14702         : [a] "+r" (a)
14703         : [b] "r" (b)
14704         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
14705     );
14706 
14707     return (sp_digit)a;
14708 }
14709 
14710 /* Add b to a into r. (r = a + b)
14711  *
14712  * r  A single precision integer.
14713  * a  A single precision integer.
14714  * b  A single precision integer.
14715  */
sp_4096_add_64(sp_digit * r,const sp_digit * a,const sp_digit * b)14716 static sp_digit sp_4096_add_64(sp_digit* r, const sp_digit* a,
14717         const sp_digit* b)
14718 {
14719     __asm__ __volatile__ (
14720         "ldp	x3, x4, [%[a], 0]\n\t"
14721         "ldp	x7, x8, [%[b], 0]\n\t"
14722         "adds	x3, x3, x7\n\t"
14723         "ldp	x5, x6, [%[a], 16]\n\t"
14724         "adcs	x4, x4, x8\n\t"
14725         "ldp	x9, x10, [%[b], 16]\n\t"
14726         "adcs	x5, x5, x9\n\t"
14727         "stp	x3, x4, [%[r], 0]\n\t"
14728         "adcs	x6, x6, x10\n\t"
14729         "stp	x5, x6, [%[r], 16]\n\t"
14730         "ldp	x3, x4, [%[a], 32]\n\t"
14731         "ldp	x7, x8, [%[b], 32]\n\t"
14732         "adcs	x3, x3, x7\n\t"
14733         "ldp	x5, x6, [%[a], 48]\n\t"
14734         "adcs	x4, x4, x8\n\t"
14735         "ldp	x9, x10, [%[b], 48]\n\t"
14736         "adcs	x5, x5, x9\n\t"
14737         "stp	x3, x4, [%[r], 32]\n\t"
14738         "adcs	x6, x6, x10\n\t"
14739         "stp	x5, x6, [%[r], 48]\n\t"
14740         "ldp	x3, x4, [%[a], 64]\n\t"
14741         "ldp	x7, x8, [%[b], 64]\n\t"
14742         "adcs	x3, x3, x7\n\t"
14743         "ldp	x5, x6, [%[a], 80]\n\t"
14744         "adcs	x4, x4, x8\n\t"
14745         "ldp	x9, x10, [%[b], 80]\n\t"
14746         "adcs	x5, x5, x9\n\t"
14747         "stp	x3, x4, [%[r], 64]\n\t"
14748         "adcs	x6, x6, x10\n\t"
14749         "stp	x5, x6, [%[r], 80]\n\t"
14750         "ldp	x3, x4, [%[a], 96]\n\t"
14751         "ldp	x7, x8, [%[b], 96]\n\t"
14752         "adcs	x3, x3, x7\n\t"
14753         "ldp	x5, x6, [%[a], 112]\n\t"
14754         "adcs	x4, x4, x8\n\t"
14755         "ldp	x9, x10, [%[b], 112]\n\t"
14756         "adcs	x5, x5, x9\n\t"
14757         "stp	x3, x4, [%[r], 96]\n\t"
14758         "adcs	x6, x6, x10\n\t"
14759         "stp	x5, x6, [%[r], 112]\n\t"
14760         "ldp	x3, x4, [%[a], 128]\n\t"
14761         "ldp	x7, x8, [%[b], 128]\n\t"
14762         "adcs	x3, x3, x7\n\t"
14763         "ldp	x5, x6, [%[a], 144]\n\t"
14764         "adcs	x4, x4, x8\n\t"
14765         "ldp	x9, x10, [%[b], 144]\n\t"
14766         "adcs	x5, x5, x9\n\t"
14767         "stp	x3, x4, [%[r], 128]\n\t"
14768         "adcs	x6, x6, x10\n\t"
14769         "stp	x5, x6, [%[r], 144]\n\t"
14770         "ldp	x3, x4, [%[a], 160]\n\t"
14771         "ldp	x7, x8, [%[b], 160]\n\t"
14772         "adcs	x3, x3, x7\n\t"
14773         "ldp	x5, x6, [%[a], 176]\n\t"
14774         "adcs	x4, x4, x8\n\t"
14775         "ldp	x9, x10, [%[b], 176]\n\t"
14776         "adcs	x5, x5, x9\n\t"
14777         "stp	x3, x4, [%[r], 160]\n\t"
14778         "adcs	x6, x6, x10\n\t"
14779         "stp	x5, x6, [%[r], 176]\n\t"
14780         "ldp	x3, x4, [%[a], 192]\n\t"
14781         "ldp	x7, x8, [%[b], 192]\n\t"
14782         "adcs	x3, x3, x7\n\t"
14783         "ldp	x5, x6, [%[a], 208]\n\t"
14784         "adcs	x4, x4, x8\n\t"
14785         "ldp	x9, x10, [%[b], 208]\n\t"
14786         "adcs	x5, x5, x9\n\t"
14787         "stp	x3, x4, [%[r], 192]\n\t"
14788         "adcs	x6, x6, x10\n\t"
14789         "stp	x5, x6, [%[r], 208]\n\t"
14790         "ldp	x3, x4, [%[a], 224]\n\t"
14791         "ldp	x7, x8, [%[b], 224]\n\t"
14792         "adcs	x3, x3, x7\n\t"
14793         "ldp	x5, x6, [%[a], 240]\n\t"
14794         "adcs	x4, x4, x8\n\t"
14795         "ldp	x9, x10, [%[b], 240]\n\t"
14796         "adcs	x5, x5, x9\n\t"
14797         "stp	x3, x4, [%[r], 224]\n\t"
14798         "adcs	x6, x6, x10\n\t"
14799         "stp	x5, x6, [%[r], 240]\n\t"
14800         "ldp	x3, x4, [%[a], 256]\n\t"
14801         "ldp	x7, x8, [%[b], 256]\n\t"
14802         "adcs	x3, x3, x7\n\t"
14803         "ldp	x5, x6, [%[a], 272]\n\t"
14804         "adcs	x4, x4, x8\n\t"
14805         "ldp	x9, x10, [%[b], 272]\n\t"
14806         "adcs	x5, x5, x9\n\t"
14807         "stp	x3, x4, [%[r], 256]\n\t"
14808         "adcs	x6, x6, x10\n\t"
14809         "stp	x5, x6, [%[r], 272]\n\t"
14810         "ldp	x3, x4, [%[a], 288]\n\t"
14811         "ldp	x7, x8, [%[b], 288]\n\t"
14812         "adcs	x3, x3, x7\n\t"
14813         "ldp	x5, x6, [%[a], 304]\n\t"
14814         "adcs	x4, x4, x8\n\t"
14815         "ldp	x9, x10, [%[b], 304]\n\t"
14816         "adcs	x5, x5, x9\n\t"
14817         "stp	x3, x4, [%[r], 288]\n\t"
14818         "adcs	x6, x6, x10\n\t"
14819         "stp	x5, x6, [%[r], 304]\n\t"
14820         "ldp	x3, x4, [%[a], 320]\n\t"
14821         "ldp	x7, x8, [%[b], 320]\n\t"
14822         "adcs	x3, x3, x7\n\t"
14823         "ldp	x5, x6, [%[a], 336]\n\t"
14824         "adcs	x4, x4, x8\n\t"
14825         "ldp	x9, x10, [%[b], 336]\n\t"
14826         "adcs	x5, x5, x9\n\t"
14827         "stp	x3, x4, [%[r], 320]\n\t"
14828         "adcs	x6, x6, x10\n\t"
14829         "stp	x5, x6, [%[r], 336]\n\t"
14830         "ldp	x3, x4, [%[a], 352]\n\t"
14831         "ldp	x7, x8, [%[b], 352]\n\t"
14832         "adcs	x3, x3, x7\n\t"
14833         "ldp	x5, x6, [%[a], 368]\n\t"
14834         "adcs	x4, x4, x8\n\t"
14835         "ldp	x9, x10, [%[b], 368]\n\t"
14836         "adcs	x5, x5, x9\n\t"
14837         "stp	x3, x4, [%[r], 352]\n\t"
14838         "adcs	x6, x6, x10\n\t"
14839         "stp	x5, x6, [%[r], 368]\n\t"
14840         "ldp	x3, x4, [%[a], 384]\n\t"
14841         "ldp	x7, x8, [%[b], 384]\n\t"
14842         "adcs	x3, x3, x7\n\t"
14843         "ldp	x5, x6, [%[a], 400]\n\t"
14844         "adcs	x4, x4, x8\n\t"
14845         "ldp	x9, x10, [%[b], 400]\n\t"
14846         "adcs	x5, x5, x9\n\t"
14847         "stp	x3, x4, [%[r], 384]\n\t"
14848         "adcs	x6, x6, x10\n\t"
14849         "stp	x5, x6, [%[r], 400]\n\t"
14850         "ldp	x3, x4, [%[a], 416]\n\t"
14851         "ldp	x7, x8, [%[b], 416]\n\t"
14852         "adcs	x3, x3, x7\n\t"
14853         "ldp	x5, x6, [%[a], 432]\n\t"
14854         "adcs	x4, x4, x8\n\t"
14855         "ldp	x9, x10, [%[b], 432]\n\t"
14856         "adcs	x5, x5, x9\n\t"
14857         "stp	x3, x4, [%[r], 416]\n\t"
14858         "adcs	x6, x6, x10\n\t"
14859         "stp	x5, x6, [%[r], 432]\n\t"
14860         "ldp	x3, x4, [%[a], 448]\n\t"
14861         "ldp	x7, x8, [%[b], 448]\n\t"
14862         "adcs	x3, x3, x7\n\t"
14863         "ldp	x5, x6, [%[a], 464]\n\t"
14864         "adcs	x4, x4, x8\n\t"
14865         "ldp	x9, x10, [%[b], 464]\n\t"
14866         "adcs	x5, x5, x9\n\t"
14867         "stp	x3, x4, [%[r], 448]\n\t"
14868         "adcs	x6, x6, x10\n\t"
14869         "stp	x5, x6, [%[r], 464]\n\t"
14870         "ldp	x3, x4, [%[a], 480]\n\t"
14871         "ldp	x7, x8, [%[b], 480]\n\t"
14872         "adcs	x3, x3, x7\n\t"
14873         "ldp	x5, x6, [%[a], 496]\n\t"
14874         "adcs	x4, x4, x8\n\t"
14875         "ldp	x9, x10, [%[b], 496]\n\t"
14876         "adcs	x5, x5, x9\n\t"
14877         "stp	x3, x4, [%[r], 480]\n\t"
14878         "adcs	x6, x6, x10\n\t"
14879         "stp	x5, x6, [%[r], 496]\n\t"
14880         "cset	%[r], cs\n\t"
14881         : [r] "+r" (r)
14882         : [a] "r" (a), [b] "r" (b)
14883         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
14884     );
14885 
14886     return (sp_digit)r;
14887 }
14888 
14889 /* Add digit to a into r. (r = a + b)
14890  *
14891  * r  A single precision integer.
14892  * a  A single precision integer.
14893  * b  A single precision integer.
14894  */
sp_4096_add_zero_32(sp_digit * r,const sp_digit * a,const sp_digit d)14895 static void sp_4096_add_zero_32(sp_digit* r, const sp_digit* a,
14896         const sp_digit d)
14897 {
14898     __asm__ __volatile__ (
14899         "ldp	x3, x4, [%[a], 0]\n\t"
14900         "ldp	x5, x6, [%[a], 16]\n\t"
14901         "adds	x3, x3, %[d]\n\t"
14902         "adcs	x4, x4, xzr\n\t"
14903         "adcs	x5, x5, xzr\n\t"
14904         "stp	x3, x4, [%[r], 0]\n\t"
14905         "adcs	x6, x6, xzr\n\t"
14906         "stp	x5, x6, [%[r], 16]\n\t"
14907         "ldp	x3, x4, [%[a], 32]\n\t"
14908         "ldp	x5, x6, [%[a], 48]\n\t"
14909         "adcs	x3, x3, xzr\n\t"
14910         "adcs	x4, x4, xzr\n\t"
14911         "adcs	x5, x5, xzr\n\t"
14912         "stp	x3, x4, [%[r], 32]\n\t"
14913         "adcs	x6, x6, xzr\n\t"
14914         "stp	x5, x6, [%[r], 48]\n\t"
14915         "ldp	x3, x4, [%[a], 64]\n\t"
14916         "ldp	x5, x6, [%[a], 80]\n\t"
14917         "adcs	x3, x3, xzr\n\t"
14918         "adcs	x4, x4, xzr\n\t"
14919         "adcs	x5, x5, xzr\n\t"
14920         "stp	x3, x4, [%[r], 64]\n\t"
14921         "adcs	x6, x6, xzr\n\t"
14922         "stp	x5, x6, [%[r], 80]\n\t"
14923         "ldp	x3, x4, [%[a], 96]\n\t"
14924         "ldp	x5, x6, [%[a], 112]\n\t"
14925         "adcs	x3, x3, xzr\n\t"
14926         "adcs	x4, x4, xzr\n\t"
14927         "adcs	x5, x5, xzr\n\t"
14928         "stp	x3, x4, [%[r], 96]\n\t"
14929         "adcs	x6, x6, xzr\n\t"
14930         "stp	x5, x6, [%[r], 112]\n\t"
14931         "ldp	x3, x4, [%[a], 128]\n\t"
14932         "ldp	x5, x6, [%[a], 144]\n\t"
14933         "adcs	x3, x3, xzr\n\t"
14934         "adcs	x4, x4, xzr\n\t"
14935         "adcs	x5, x5, xzr\n\t"
14936         "stp	x3, x4, [%[r], 128]\n\t"
14937         "adcs	x6, x6, xzr\n\t"
14938         "stp	x5, x6, [%[r], 144]\n\t"
14939         "ldp	x3, x4, [%[a], 160]\n\t"
14940         "ldp	x5, x6, [%[a], 176]\n\t"
14941         "adcs	x3, x3, xzr\n\t"
14942         "adcs	x4, x4, xzr\n\t"
14943         "adcs	x5, x5, xzr\n\t"
14944         "stp	x3, x4, [%[r], 160]\n\t"
14945         "adcs	x6, x6, xzr\n\t"
14946         "stp	x5, x6, [%[r], 176]\n\t"
14947         "ldp	x3, x4, [%[a], 192]\n\t"
14948         "ldp	x5, x6, [%[a], 208]\n\t"
14949         "adcs	x3, x3, xzr\n\t"
14950         "adcs	x4, x4, xzr\n\t"
14951         "adcs	x5, x5, xzr\n\t"
14952         "stp	x3, x4, [%[r], 192]\n\t"
14953         "adcs	x6, x6, xzr\n\t"
14954         "stp	x5, x6, [%[r], 208]\n\t"
14955         "ldp	x3, x4, [%[a], 224]\n\t"
14956         "ldp	x5, x6, [%[a], 240]\n\t"
14957         "adcs	x3, x3, xzr\n\t"
14958         "adcs	x4, x4, xzr\n\t"
14959         "adcs	x5, x5, xzr\n\t"
14960         "stp	x3, x4, [%[r], 224]\n\t"
14961         "adcs	x6, x6, xzr\n\t"
14962         "stp	x5, x6, [%[r], 240]\n\t"
14963         :
14964         : [r] "r" (r), [a] "r" (a), [d] "r" (d)
14965         : "memory", "x3", "x4", "x5", "x6"
14966     );
14967 }
14968 
14969 /* Multiply a and b into r. (r = a * b)
14970  *
14971  * r  A single precision integer.
14972  * a  A single precision integer.
14973  * b  A single precision integer.
14974  */
sp_4096_mul_64(sp_digit * r,const sp_digit * a,const sp_digit * b)14975 SP_NOINLINE static void sp_4096_mul_64(sp_digit* r, const sp_digit* a,
14976         const sp_digit* b)
14977 {
14978     sp_digit* z0 = r;
14979     sp_digit z1[64];
14980     sp_digit a1[32];
14981     sp_digit b1[32];
14982     sp_digit z2[64];
14983     sp_digit u, ca, cb;
14984 
14985     ca = sp_2048_add_32(a1, a, &a[32]);
14986     cb = sp_2048_add_32(b1, b, &b[32]);
14987     u  = ca & cb;
14988     sp_2048_mul_32(z1, a1, b1);
14989     sp_2048_mul_32(z2, &a[32], &b[32]);
14990     sp_2048_mul_32(z0, a, b);
14991     sp_2048_mask_32(r + 64, a1, 0 - cb);
14992     sp_2048_mask_32(b1, b1, 0 - ca);
14993     u += sp_2048_add_32(r + 64, r + 64, b1);
14994     u += sp_4096_sub_in_place_64(z1, z2);
14995     u += sp_4096_sub_in_place_64(z1, z0);
14996     u += sp_4096_add_64(r + 32, r + 32, z1);
14997     u += sp_4096_add_32(r + 64, r + 64, z2);
14998     sp_4096_add_zero_32(r + 96, z2 + 32, u);
14999 }
15000 
15001 #ifdef WOLFSSL_SP_SMALL
15002 /* Double a into r. (r = a + a)
15003  *
15004  * r  A single precision integer.
15005  * a  A single precision integer.
15006  */
sp_2048_dbl_32(sp_digit * r,const sp_digit * a)15007 static sp_digit sp_2048_dbl_32(sp_digit* r, const sp_digit* a)
15008 {
15009     sp_digit c = 0;
15010 
15011     __asm__ __volatile__ (
15012         "add	x11, %[a], 256\n\t"
15013         "\n1:\n\t"
15014         "adds	%[c], %[c], #-1\n\t"
15015         "ldp	x3, x4, [%[a]], #16\n\t"
15016         "ldp	x5, x6, [%[a]], #16\n\t"
15017         "adcs	x3, x3, x3\n\t"
15018         "adcs	x4, x4, x4\n\t"
15019         "adcs	x5, x5, x5\n\t"
15020         "stp	x3, x4, [%[r]], #16\n\t"
15021         "adcs	x6, x6, x6\n\t"
15022         "stp	x5, x6, [%[r]], #16\n\t"
15023         "cset	%[c], cs\n\t"
15024         "cmp	%[a], x11\n\t"
15025         "b.ne	1b\n\t"
15026         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a)
15027         :
15028         : "memory", "x3", "x4", "x5", "x6", "x11"
15029     );
15030 
15031     return c;
15032 }
15033 
15034 #else
15035 /* Double a into r. (r = a + a)
15036  *
15037  * r  A single precision integer.
15038  * a  A single precision integer.
15039  */
sp_2048_dbl_32(sp_digit * r,const sp_digit * a)15040 static sp_digit sp_2048_dbl_32(sp_digit* r, const sp_digit* a)
15041 {
15042     __asm__ __volatile__ (
15043         "ldp	x3, x4, [%[a], 0]\n\t"
15044         "adds	x3, x3, x3\n\t"
15045         "ldr	x5, [%[a], 16]\n\t"
15046         "adcs	x4, x4, x4\n\t"
15047         "ldr	x6, [%[a], 24]\n\t"
15048         "adcs	x5, x5, x5\n\t"
15049         "stp	x3, x4, [%[r], 0]\n\t"
15050         "adcs	x6, x6, x6\n\t"
15051         "stp	x5, x6, [%[r], 16]\n\t"
15052         "ldp	x3, x4, [%[a], 32]\n\t"
15053         "adcs	x3, x3, x3\n\t"
15054         "ldr	x5, [%[a], 48]\n\t"
15055         "adcs	x4, x4, x4\n\t"
15056         "ldr	x6, [%[a], 56]\n\t"
15057         "adcs	x5, x5, x5\n\t"
15058         "stp	x3, x4, [%[r], 32]\n\t"
15059         "adcs	x6, x6, x6\n\t"
15060         "stp	x5, x6, [%[r], 48]\n\t"
15061         "ldp	x3, x4, [%[a], 64]\n\t"
15062         "adcs	x3, x3, x3\n\t"
15063         "ldr	x5, [%[a], 80]\n\t"
15064         "adcs	x4, x4, x4\n\t"
15065         "ldr	x6, [%[a], 88]\n\t"
15066         "adcs	x5, x5, x5\n\t"
15067         "stp	x3, x4, [%[r], 64]\n\t"
15068         "adcs	x6, x6, x6\n\t"
15069         "stp	x5, x6, [%[r], 80]\n\t"
15070         "ldp	x3, x4, [%[a], 96]\n\t"
15071         "adcs	x3, x3, x3\n\t"
15072         "ldr	x5, [%[a], 112]\n\t"
15073         "adcs	x4, x4, x4\n\t"
15074         "ldr	x6, [%[a], 120]\n\t"
15075         "adcs	x5, x5, x5\n\t"
15076         "stp	x3, x4, [%[r], 96]\n\t"
15077         "adcs	x6, x6, x6\n\t"
15078         "stp	x5, x6, [%[r], 112]\n\t"
15079         "ldp	x3, x4, [%[a], 128]\n\t"
15080         "adcs	x3, x3, x3\n\t"
15081         "ldr	x5, [%[a], 144]\n\t"
15082         "adcs	x4, x4, x4\n\t"
15083         "ldr	x6, [%[a], 152]\n\t"
15084         "adcs	x5, x5, x5\n\t"
15085         "stp	x3, x4, [%[r], 128]\n\t"
15086         "adcs	x6, x6, x6\n\t"
15087         "stp	x5, x6, [%[r], 144]\n\t"
15088         "ldp	x3, x4, [%[a], 160]\n\t"
15089         "adcs	x3, x3, x3\n\t"
15090         "ldr	x5, [%[a], 176]\n\t"
15091         "adcs	x4, x4, x4\n\t"
15092         "ldr	x6, [%[a], 184]\n\t"
15093         "adcs	x5, x5, x5\n\t"
15094         "stp	x3, x4, [%[r], 160]\n\t"
15095         "adcs	x6, x6, x6\n\t"
15096         "stp	x5, x6, [%[r], 176]\n\t"
15097         "ldp	x3, x4, [%[a], 192]\n\t"
15098         "adcs	x3, x3, x3\n\t"
15099         "ldr	x5, [%[a], 208]\n\t"
15100         "adcs	x4, x4, x4\n\t"
15101         "ldr	x6, [%[a], 216]\n\t"
15102         "adcs	x5, x5, x5\n\t"
15103         "stp	x3, x4, [%[r], 192]\n\t"
15104         "adcs	x6, x6, x6\n\t"
15105         "stp	x5, x6, [%[r], 208]\n\t"
15106         "ldp	x3, x4, [%[a], 224]\n\t"
15107         "adcs	x3, x3, x3\n\t"
15108         "ldr	x5, [%[a], 240]\n\t"
15109         "adcs	x4, x4, x4\n\t"
15110         "ldr	x6, [%[a], 248]\n\t"
15111         "adcs	x5, x5, x5\n\t"
15112         "stp	x3, x4, [%[r], 224]\n\t"
15113         "adcs	x6, x6, x6\n\t"
15114         "stp	x5, x6, [%[r], 240]\n\t"
15115         "cset	%[r], cs\n\t"
15116         : [r] "+r" (r)
15117         : [a] "r" (a)
15118         : "memory", "x3", "x4", "x5", "x6"
15119     );
15120 
15121     return (sp_digit)r;
15122 }
15123 
15124 #endif /* WOLFSSL_SP_SMALL */
15125 /* Square a and put result in r. (r = a * a)
15126  *
15127  * r  A single precision integer.
15128  * a  A single precision integer.
15129  */
sp_4096_sqr_64(sp_digit * r,const sp_digit * a)15130 SP_NOINLINE static void sp_4096_sqr_64(sp_digit* r, const sp_digit* a)
15131 {
15132     sp_digit* z0 = r;
15133     sp_digit z2[64];
15134     sp_digit z1[64];
15135     sp_digit a1[32];
15136     sp_digit u;
15137 
15138     u = sp_2048_add_32(a1, a, &a[32]);
15139     sp_2048_sqr_32(z1, a1);
15140     sp_2048_sqr_32(z2, &a[32]);
15141     sp_2048_sqr_32(z0, a);
15142     sp_2048_mask_32(r + 64, a1, 0 - u);
15143     u += sp_2048_dbl_32(r + 64, r + 64);
15144     u += sp_4096_sub_in_place_64(z1, z2);
15145     u += sp_4096_sub_in_place_64(z1, z0);
15146     u += sp_4096_add_64(r + 32, r + 32, z1);
15147     u += sp_4096_add_32(r + 64, r + 64, z2);
15148     sp_4096_add_zero_32(r + 96, z2 + 32, u);
15149 }
15150 
15151 #endif /* !WOLFSSL_SP_SMALL */
15152 #ifdef WOLFSSL_SP_SMALL
15153 /* Add b to a into r. (r = a + b)
15154  *
15155  * r  A single precision integer.
15156  * a  A single precision integer.
15157  * b  A single precision integer.
15158  */
sp_4096_add_64(sp_digit * r,const sp_digit * a,const sp_digit * b)15159 static sp_digit sp_4096_add_64(sp_digit* r, const sp_digit* a,
15160         const sp_digit* b)
15161 {
15162     sp_digit c = 0;
15163 
15164     __asm__ __volatile__ (
15165         "add	x11, %[a], 512\n\t"
15166         "\n1:\n\t"
15167         "adds	%[c], %[c], #-1\n\t"
15168         "ldp	x3, x4, [%[a]], #16\n\t"
15169         "ldp	x5, x6, [%[a]], #16\n\t"
15170         "ldp	x7, x8, [%[b]], #16\n\t"
15171         "adcs	x3, x3, x7\n\t"
15172         "ldp	x9, x10, [%[b]], #16\n\t"
15173         "adcs	x4, x4, x8\n\t"
15174         "adcs	x5, x5, x9\n\t"
15175         "stp	x3, x4, [%[r]], #16\n\t"
15176         "adcs	x6, x6, x10\n\t"
15177         "stp	x5, x6, [%[r]], #16\n\t"
15178         "cset	%[c], cs\n\t"
15179         "cmp	%[a], x11\n\t"
15180         "b.ne	1b\n\t"
15181         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
15182         :
15183         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
15184     );
15185 
15186     return c;
15187 }
15188 
15189 #endif /* WOLFSSL_SP_SMALL */
15190 #ifdef WOLFSSL_SP_SMALL
15191 /* Sub b from a into a. (a -= b)
15192  *
15193  * a  A single precision integer.
15194  * b  A single precision integer.
15195  */
sp_4096_sub_in_place_64(sp_digit * a,const sp_digit * b)15196 static sp_digit sp_4096_sub_in_place_64(sp_digit* a, const sp_digit* b)
15197 {
15198     sp_digit c = 0;
15199 
15200     __asm__ __volatile__ (
15201         "add	x10, %[a], 512\n\t"
15202         "\n1:\n\t"
15203         "subs	%[c], xzr, %[c]\n\t"
15204         "ldp	x2, x3, [%[a]]\n\t"
15205         "ldp	x4, x5, [%[a], #16]\n\t"
15206         "ldp	x6, x7, [%[b]], #16\n\t"
15207         "sbcs	x2, x2, x6\n\t"
15208         "ldp	x8, x9, [%[b]], #16\n\t"
15209         "sbcs	x3, x3, x7\n\t"
15210         "sbcs	x4, x4, x8\n\t"
15211         "stp	x2, x3, [%[a]], #16\n\t"
15212         "sbcs	x5, x5, x9\n\t"
15213         "stp	x4, x5, [%[a]], #16\n\t"
15214         "csetm	%[c], cc\n\t"
15215         "cmp	%[a], x10\n\t"
15216         "b.ne	1b\n\t"
15217         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
15218         :
15219         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
15220     );
15221 
15222     return c;
15223 }
15224 
15225 #endif /* WOLFSSL_SP_SMALL */
15226 #ifdef WOLFSSL_SP_SMALL
15227 /* Multiply a and b into r. (r = a * b)
15228  *
15229  * r  A single precision integer.
15230  * a  A single precision integer.
15231  * b  A single precision integer.
15232  */
sp_4096_mul_64(sp_digit * r,const sp_digit * a,const sp_digit * b)15233 static void sp_4096_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b)
15234 {
15235     sp_digit tmp[128];
15236 
15237     __asm__ __volatile__ (
15238         "mov	x5, 0\n\t"
15239         "mov	x6, 0\n\t"
15240         "mov	x7, 0\n\t"
15241         "mov	x8, 0\n\t"
15242         "\n1:\n\t"
15243         "subs	x3, x5, 504\n\t"
15244         "csel	x3, xzr, x3, cc\n\t"
15245         "sub	x4, x5, x3\n\t"
15246         "\n2:\n\t"
15247         "ldr	x10, [%[a], x3]\n\t"
15248         "ldr	x11, [%[b], x4]\n\t"
15249         "mul	x9, x10, x11\n\t"
15250         "umulh	x10, x10, x11\n\t"
15251         "adds	x6, x6, x9\n\t"
15252         "adcs	x7, x7, x10\n\t"
15253         "adc	x8, x8, xzr\n\t"
15254         "add	x3, x3, #8\n\t"
15255         "sub	x4, x4, #8\n\t"
15256         "cmp	x3, 512\n\t"
15257         "b.eq	3f\n\t"
15258         "cmp	x3, x5\n\t"
15259         "b.le	2b\n\t"
15260         "\n3:\n\t"
15261         "str	x6, [%[r], x5]\n\t"
15262         "mov	x6, x7\n\t"
15263         "mov	x7, x8\n\t"
15264         "mov	x8, #0\n\t"
15265         "add	x5, x5, #8\n\t"
15266         "cmp	x5, 1008\n\t"
15267         "b.le	1b\n\t"
15268         "str	x6, [%[r], x5]\n\t"
15269         :
15270         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
15271         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
15272     );
15273 
15274     XMEMCPY(r, tmp, sizeof(tmp));
15275 }
15276 
15277 /* Square a and put result in r. (r = a * a)
15278  *
15279  * r  A single precision integer.
15280  * a  A single precision integer.
15281  */
sp_4096_sqr_64(sp_digit * r,const sp_digit * a)15282 static void sp_4096_sqr_64(sp_digit* r, const sp_digit* a)
15283 {
15284     sp_digit tmp[128];
15285 
15286     __asm__ __volatile__ (
15287         "mov	x6, 0\n\t"
15288         "mov	x7, 0\n\t"
15289         "mov	x8, 0\n\t"
15290         "mov	x5, 0\n\t"
15291         "\n1:\n\t"
15292         "subs	x3, x5, 504\n\t"
15293         "csel	x3, xzr, x3, cc\n\t"
15294         "sub	x4, x5, x3\n\t"
15295         "\n2:\n\t"
15296         "cmp	x4, x3\n\t"
15297         "b.eq	4f\n\t"
15298         "ldr	x10, [%[a], x3]\n\t"
15299         "ldr	x11, [%[a], x4]\n\t"
15300         "mul	x9, x10, x11\n\t"
15301         "umulh	x10, x10, x11\n\t"
15302         "adds	x6, x6, x9\n\t"
15303         "adcs	x7, x7, x10\n\t"
15304         "adc	x8, x8, xzr\n\t"
15305         "adds	x6, x6, x9\n\t"
15306         "adcs	x7, x7, x10\n\t"
15307         "adc	x8, x8, xzr\n\t"
15308         "b.al	5f\n\t"
15309         "\n4:\n\t"
15310         "ldr	x10, [%[a], x3]\n\t"
15311         "mul	x9, x10, x10\n\t"
15312         "umulh	x10, x10, x10\n\t"
15313         "adds	x6, x6, x9\n\t"
15314         "adcs	x7, x7, x10\n\t"
15315         "adc	x8, x8, xzr\n\t"
15316         "\n5:\n\t"
15317         "add	x3, x3, #8\n\t"
15318         "sub	x4, x4, #8\n\t"
15319         "cmp	x3, 512\n\t"
15320         "b.eq	3f\n\t"
15321         "cmp	x3, x4\n\t"
15322         "b.gt	3f\n\t"
15323         "cmp	x3, x5\n\t"
15324         "b.le	2b\n\t"
15325         "\n3:\n\t"
15326         "str	x6, [%[r], x5]\n\t"
15327         "mov	x6, x7\n\t"
15328         "mov	x7, x8\n\t"
15329         "mov	x8, #0\n\t"
15330         "add	x5, x5, #8\n\t"
15331         "cmp	x5, 1008\n\t"
15332         "b.le	1b\n\t"
15333         "str	x6, [%[r], x5]\n\t"
15334         :
15335         : [r] "r" (tmp), [a] "r" (a)
15336         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
15337     );
15338 
15339     XMEMCPY(r, tmp, sizeof(tmp));
15340 }
15341 
15342 #endif /* WOLFSSL_SP_SMALL */
15343 /* Caclulate the bottom digit of -1/a mod 2^n.
15344  *
15345  * a    A single precision number.
15346  * rho  Bottom word of inverse.
15347  */
sp_4096_mont_setup(const sp_digit * a,sp_digit * rho)15348 static void sp_4096_mont_setup(const sp_digit* a, sp_digit* rho)
15349 {
15350     sp_digit x;
15351     sp_digit b;
15352 
15353     b = a[0];
15354     x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
15355     x *= 2 - b * x;               /* here x*a==1 mod 2**8 */
15356     x *= 2 - b * x;               /* here x*a==1 mod 2**16 */
15357     x *= 2 - b * x;               /* here x*a==1 mod 2**32 */
15358     x *= 2 - b * x;               /* here x*a==1 mod 2**64 */
15359 
15360     /* rho = -1/m mod b */
15361     *rho = (sp_digit)0 - x;
15362 }
15363 
15364 /* Mul a by digit b into r. (r = a * b)
15365  *
15366  * r  A single precision integer.
15367  * a  A single precision integer.
15368  * b  A single precision digit.
15369  */
sp_4096_mul_d_64(sp_digit * r,const sp_digit * a,sp_digit b)15370 static void sp_4096_mul_d_64(sp_digit* r, const sp_digit* a,
15371         sp_digit b)
15372 {
15373 #ifdef WOLFSSL_SP_SMALL
15374     __asm__ __volatile__ (
15375         "# A[0] * B\n\t"
15376         "ldr	x8, [%[a]]\n\t"
15377         "mul	x5, %[b], x8\n\t"
15378         "umulh	x3, %[b], x8\n\t"
15379         "mov	x4, 0\n\t"
15380         "str	x5, [%[r]]\n\t"
15381         "mov	x5, 0\n\t"
15382         "mov	x9, #8\n\t"
15383         "1:\n\t"
15384         "ldr	x8, [%[a], x9]\n\t"
15385         "mul	x6, %[b], x8\n\t"
15386         "umulh	x7, %[b], x8\n\t"
15387         "adds	x3, x3, x6\n\t"
15388         "adcs	x4, x4, x7\n\t"
15389         "adc	x5, xzr, xzr\n\t"
15390         "str	x3, [%[r], x9]\n\t"
15391         "mov	x3, x4\n\t"
15392         "mov	x4, x5\n\t"
15393         "mov	x5, #0\n\t"
15394         "add	x9, x9, #8\n\t"
15395         "cmp	x9, 512\n\t"
15396         "b.lt	1b\n\t"
15397         "str	x3, [%[r], 512]\n\t"
15398         :
15399         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
15400         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
15401     );
15402 #else
15403     __asm__ __volatile__ (
15404         "# A[0] * B\n\t"
15405         "ldp	x8, x9, [%[a]]\n\t"
15406         "mul	x3, %[b], x8\n\t"
15407         "umulh	x4, %[b], x8\n\t"
15408         "mov	x5, 0\n\t"
15409         "# A[1] * B\n\t"
15410         "str	x3, [%[r]]\n\t"
15411         "mov	x3, 0\n\t"
15412         "mul	x6, %[b], x9\n\t"
15413         "umulh	x7, %[b], x9\n\t"
15414         "adds	x4, x4, x6\n\t"
15415         "# A[2] * B\n\t"
15416         "ldp	x8, x9, [%[a], 16]\n\t"
15417         "str	x4, [%[r], 8]\n\t"
15418         "mov	x4, 0\n\t"
15419         "mul	x6, %[b], x8\n\t"
15420         "adcs	x5, x5, x7\n\t"
15421         "umulh	x7, %[b], x8\n\t"
15422         "adc	x3, xzr, xzr\n\t"
15423         "adds	x5, x5, x6\n\t"
15424         "# A[3] * B\n\t"
15425         "str	x5, [%[r], 16]\n\t"
15426         "mov	x5, 0\n\t"
15427         "mul	x6, %[b], x9\n\t"
15428         "adcs	x3, x3, x7\n\t"
15429         "umulh	x7, %[b], x9\n\t"
15430         "adc	x4, xzr, xzr\n\t"
15431         "adds	x3, x3, x6\n\t"
15432         "# A[4] * B\n\t"
15433         "ldp	x8, x9, [%[a], 32]\n\t"
15434         "str	x3, [%[r], 24]\n\t"
15435         "mov	x3, 0\n\t"
15436         "mul	x6, %[b], x8\n\t"
15437         "adcs	x4, x4, x7\n\t"
15438         "umulh	x7, %[b], x8\n\t"
15439         "adc	x5, xzr, xzr\n\t"
15440         "adds	x4, x4, x6\n\t"
15441         "# A[5] * B\n\t"
15442         "str	x4, [%[r], 32]\n\t"
15443         "mov	x4, 0\n\t"
15444         "mul	x6, %[b], x9\n\t"
15445         "adcs	x5, x5, x7\n\t"
15446         "umulh	x7, %[b], x9\n\t"
15447         "adc	x3, xzr, xzr\n\t"
15448         "adds	x5, x5, x6\n\t"
15449         "# A[6] * B\n\t"
15450         "ldp	x8, x9, [%[a], 48]\n\t"
15451         "str	x5, [%[r], 40]\n\t"
15452         "mov	x5, 0\n\t"
15453         "mul	x6, %[b], x8\n\t"
15454         "adcs	x3, x3, x7\n\t"
15455         "umulh	x7, %[b], x8\n\t"
15456         "adc	x4, xzr, xzr\n\t"
15457         "adds	x3, x3, x6\n\t"
15458         "# A[7] * B\n\t"
15459         "str	x3, [%[r], 48]\n\t"
15460         "mov	x3, 0\n\t"
15461         "mul	x6, %[b], x9\n\t"
15462         "adcs	x4, x4, x7\n\t"
15463         "umulh	x7, %[b], x9\n\t"
15464         "adc	x5, xzr, xzr\n\t"
15465         "adds	x4, x4, x6\n\t"
15466         "# A[8] * B\n\t"
15467         "ldp	x8, x9, [%[a], 64]\n\t"
15468         "str	x4, [%[r], 56]\n\t"
15469         "mov	x4, 0\n\t"
15470         "mul	x6, %[b], x8\n\t"
15471         "adcs	x5, x5, x7\n\t"
15472         "umulh	x7, %[b], x8\n\t"
15473         "adc	x3, xzr, xzr\n\t"
15474         "adds	x5, x5, x6\n\t"
15475         "# A[9] * B\n\t"
15476         "str	x5, [%[r], 64]\n\t"
15477         "mov	x5, 0\n\t"
15478         "mul	x6, %[b], x9\n\t"
15479         "adcs	x3, x3, x7\n\t"
15480         "umulh	x7, %[b], x9\n\t"
15481         "adc	x4, xzr, xzr\n\t"
15482         "adds	x3, x3, x6\n\t"
15483         "# A[10] * B\n\t"
15484         "ldp	x8, x9, [%[a], 80]\n\t"
15485         "str	x3, [%[r], 72]\n\t"
15486         "mov	x3, 0\n\t"
15487         "mul	x6, %[b], x8\n\t"
15488         "adcs	x4, x4, x7\n\t"
15489         "umulh	x7, %[b], x8\n\t"
15490         "adc	x5, xzr, xzr\n\t"
15491         "adds	x4, x4, x6\n\t"
15492         "# A[11] * B\n\t"
15493         "str	x4, [%[r], 80]\n\t"
15494         "mov	x4, 0\n\t"
15495         "mul	x6, %[b], x9\n\t"
15496         "adcs	x5, x5, x7\n\t"
15497         "umulh	x7, %[b], x9\n\t"
15498         "adc	x3, xzr, xzr\n\t"
15499         "adds	x5, x5, x6\n\t"
15500         "# A[12] * B\n\t"
15501         "ldp	x8, x9, [%[a], 96]\n\t"
15502         "str	x5, [%[r], 88]\n\t"
15503         "mov	x5, 0\n\t"
15504         "mul	x6, %[b], x8\n\t"
15505         "adcs	x3, x3, x7\n\t"
15506         "umulh	x7, %[b], x8\n\t"
15507         "adc	x4, xzr, xzr\n\t"
15508         "adds	x3, x3, x6\n\t"
15509         "# A[13] * B\n\t"
15510         "str	x3, [%[r], 96]\n\t"
15511         "mov	x3, 0\n\t"
15512         "mul	x6, %[b], x9\n\t"
15513         "adcs	x4, x4, x7\n\t"
15514         "umulh	x7, %[b], x9\n\t"
15515         "adc	x5, xzr, xzr\n\t"
15516         "adds	x4, x4, x6\n\t"
15517         "# A[14] * B\n\t"
15518         "ldp	x8, x9, [%[a], 112]\n\t"
15519         "str	x4, [%[r], 104]\n\t"
15520         "mov	x4, 0\n\t"
15521         "mul	x6, %[b], x8\n\t"
15522         "adcs	x5, x5, x7\n\t"
15523         "umulh	x7, %[b], x8\n\t"
15524         "adc	x3, xzr, xzr\n\t"
15525         "adds	x5, x5, x6\n\t"
15526         "# A[15] * B\n\t"
15527         "str	x5, [%[r], 112]\n\t"
15528         "mov	x5, 0\n\t"
15529         "mul	x6, %[b], x9\n\t"
15530         "adcs	x3, x3, x7\n\t"
15531         "umulh	x7, %[b], x9\n\t"
15532         "adc	x4, xzr, xzr\n\t"
15533         "adds	x3, x3, x6\n\t"
15534         "# A[16] * B\n\t"
15535         "ldp	x8, x9, [%[a], 128]\n\t"
15536         "str	x3, [%[r], 120]\n\t"
15537         "mov	x3, 0\n\t"
15538         "mul	x6, %[b], x8\n\t"
15539         "adcs	x4, x4, x7\n\t"
15540         "umulh	x7, %[b], x8\n\t"
15541         "adc	x5, xzr, xzr\n\t"
15542         "adds	x4, x4, x6\n\t"
15543         "# A[17] * B\n\t"
15544         "str	x4, [%[r], 128]\n\t"
15545         "mov	x4, 0\n\t"
15546         "mul	x6, %[b], x9\n\t"
15547         "adcs	x5, x5, x7\n\t"
15548         "umulh	x7, %[b], x9\n\t"
15549         "adc	x3, xzr, xzr\n\t"
15550         "adds	x5, x5, x6\n\t"
15551         "# A[18] * B\n\t"
15552         "ldp	x8, x9, [%[a], 144]\n\t"
15553         "str	x5, [%[r], 136]\n\t"
15554         "mov	x5, 0\n\t"
15555         "mul	x6, %[b], x8\n\t"
15556         "adcs	x3, x3, x7\n\t"
15557         "umulh	x7, %[b], x8\n\t"
15558         "adc	x4, xzr, xzr\n\t"
15559         "adds	x3, x3, x6\n\t"
15560         "# A[19] * B\n\t"
15561         "str	x3, [%[r], 144]\n\t"
15562         "mov	x3, 0\n\t"
15563         "mul	x6, %[b], x9\n\t"
15564         "adcs	x4, x4, x7\n\t"
15565         "umulh	x7, %[b], x9\n\t"
15566         "adc	x5, xzr, xzr\n\t"
15567         "adds	x4, x4, x6\n\t"
15568         "# A[20] * B\n\t"
15569         "ldp	x8, x9, [%[a], 160]\n\t"
15570         "str	x4, [%[r], 152]\n\t"
15571         "mov	x4, 0\n\t"
15572         "mul	x6, %[b], x8\n\t"
15573         "adcs	x5, x5, x7\n\t"
15574         "umulh	x7, %[b], x8\n\t"
15575         "adc	x3, xzr, xzr\n\t"
15576         "adds	x5, x5, x6\n\t"
15577         "# A[21] * B\n\t"
15578         "str	x5, [%[r], 160]\n\t"
15579         "mov	x5, 0\n\t"
15580         "mul	x6, %[b], x9\n\t"
15581         "adcs	x3, x3, x7\n\t"
15582         "umulh	x7, %[b], x9\n\t"
15583         "adc	x4, xzr, xzr\n\t"
15584         "adds	x3, x3, x6\n\t"
15585         "# A[22] * B\n\t"
15586         "ldp	x8, x9, [%[a], 176]\n\t"
15587         "str	x3, [%[r], 168]\n\t"
15588         "mov	x3, 0\n\t"
15589         "mul	x6, %[b], x8\n\t"
15590         "adcs	x4, x4, x7\n\t"
15591         "umulh	x7, %[b], x8\n\t"
15592         "adc	x5, xzr, xzr\n\t"
15593         "adds	x4, x4, x6\n\t"
15594         "# A[23] * B\n\t"
15595         "str	x4, [%[r], 176]\n\t"
15596         "mov	x4, 0\n\t"
15597         "mul	x6, %[b], x9\n\t"
15598         "adcs	x5, x5, x7\n\t"
15599         "umulh	x7, %[b], x9\n\t"
15600         "adc	x3, xzr, xzr\n\t"
15601         "adds	x5, x5, x6\n\t"
15602         "# A[24] * B\n\t"
15603         "ldp	x8, x9, [%[a], 192]\n\t"
15604         "str	x5, [%[r], 184]\n\t"
15605         "mov	x5, 0\n\t"
15606         "mul	x6, %[b], x8\n\t"
15607         "adcs	x3, x3, x7\n\t"
15608         "umulh	x7, %[b], x8\n\t"
15609         "adc	x4, xzr, xzr\n\t"
15610         "adds	x3, x3, x6\n\t"
15611         "# A[25] * B\n\t"
15612         "str	x3, [%[r], 192]\n\t"
15613         "mov	x3, 0\n\t"
15614         "mul	x6, %[b], x9\n\t"
15615         "adcs	x4, x4, x7\n\t"
15616         "umulh	x7, %[b], x9\n\t"
15617         "adc	x5, xzr, xzr\n\t"
15618         "adds	x4, x4, x6\n\t"
15619         "# A[26] * B\n\t"
15620         "ldp	x8, x9, [%[a], 208]\n\t"
15621         "str	x4, [%[r], 200]\n\t"
15622         "mov	x4, 0\n\t"
15623         "mul	x6, %[b], x8\n\t"
15624         "adcs	x5, x5, x7\n\t"
15625         "umulh	x7, %[b], x8\n\t"
15626         "adc	x3, xzr, xzr\n\t"
15627         "adds	x5, x5, x6\n\t"
15628         "# A[27] * B\n\t"
15629         "str	x5, [%[r], 208]\n\t"
15630         "mov	x5, 0\n\t"
15631         "mul	x6, %[b], x9\n\t"
15632         "adcs	x3, x3, x7\n\t"
15633         "umulh	x7, %[b], x9\n\t"
15634         "adc	x4, xzr, xzr\n\t"
15635         "adds	x3, x3, x6\n\t"
15636         "# A[28] * B\n\t"
15637         "ldp	x8, x9, [%[a], 224]\n\t"
15638         "str	x3, [%[r], 216]\n\t"
15639         "mov	x3, 0\n\t"
15640         "mul	x6, %[b], x8\n\t"
15641         "adcs	x4, x4, x7\n\t"
15642         "umulh	x7, %[b], x8\n\t"
15643         "adc	x5, xzr, xzr\n\t"
15644         "adds	x4, x4, x6\n\t"
15645         "# A[29] * B\n\t"
15646         "str	x4, [%[r], 224]\n\t"
15647         "mov	x4, 0\n\t"
15648         "mul	x6, %[b], x9\n\t"
15649         "adcs	x5, x5, x7\n\t"
15650         "umulh	x7, %[b], x9\n\t"
15651         "adc	x3, xzr, xzr\n\t"
15652         "adds	x5, x5, x6\n\t"
15653         "# A[30] * B\n\t"
15654         "ldp	x8, x9, [%[a], 240]\n\t"
15655         "str	x5, [%[r], 232]\n\t"
15656         "mov	x5, 0\n\t"
15657         "mul	x6, %[b], x8\n\t"
15658         "adcs	x3, x3, x7\n\t"
15659         "umulh	x7, %[b], x8\n\t"
15660         "adc	x4, xzr, xzr\n\t"
15661         "adds	x3, x3, x6\n\t"
15662         "# A[31] * B\n\t"
15663         "str	x3, [%[r], 240]\n\t"
15664         "mov	x3, 0\n\t"
15665         "mul	x6, %[b], x9\n\t"
15666         "adcs	x4, x4, x7\n\t"
15667         "umulh	x7, %[b], x9\n\t"
15668         "adc	x5, xzr, xzr\n\t"
15669         "adds	x4, x4, x6\n\t"
15670         "# A[32] * B\n\t"
15671         "ldp	x8, x9, [%[a], 256]\n\t"
15672         "str	x4, [%[r], 248]\n\t"
15673         "mov	x4, 0\n\t"
15674         "mul	x6, %[b], x8\n\t"
15675         "adcs	x5, x5, x7\n\t"
15676         "umulh	x7, %[b], x8\n\t"
15677         "adc	x3, xzr, xzr\n\t"
15678         "adds	x5, x5, x6\n\t"
15679         "# A[33] * B\n\t"
15680         "str	x5, [%[r], 256]\n\t"
15681         "mov	x5, 0\n\t"
15682         "mul	x6, %[b], x9\n\t"
15683         "adcs	x3, x3, x7\n\t"
15684         "umulh	x7, %[b], x9\n\t"
15685         "adc	x4, xzr, xzr\n\t"
15686         "adds	x3, x3, x6\n\t"
15687         "# A[34] * B\n\t"
15688         "ldp	x8, x9, [%[a], 272]\n\t"
15689         "str	x3, [%[r], 264]\n\t"
15690         "mov	x3, 0\n\t"
15691         "mul	x6, %[b], x8\n\t"
15692         "adcs	x4, x4, x7\n\t"
15693         "umulh	x7, %[b], x8\n\t"
15694         "adc	x5, xzr, xzr\n\t"
15695         "adds	x4, x4, x6\n\t"
15696         "# A[35] * B\n\t"
15697         "str	x4, [%[r], 272]\n\t"
15698         "mov	x4, 0\n\t"
15699         "mul	x6, %[b], x9\n\t"
15700         "adcs	x5, x5, x7\n\t"
15701         "umulh	x7, %[b], x9\n\t"
15702         "adc	x3, xzr, xzr\n\t"
15703         "adds	x5, x5, x6\n\t"
15704         "# A[36] * B\n\t"
15705         "ldp	x8, x9, [%[a], 288]\n\t"
15706         "str	x5, [%[r], 280]\n\t"
15707         "mov	x5, 0\n\t"
15708         "mul	x6, %[b], x8\n\t"
15709         "adcs	x3, x3, x7\n\t"
15710         "umulh	x7, %[b], x8\n\t"
15711         "adc	x4, xzr, xzr\n\t"
15712         "adds	x3, x3, x6\n\t"
15713         "# A[37] * B\n\t"
15714         "str	x3, [%[r], 288]\n\t"
15715         "mov	x3, 0\n\t"
15716         "mul	x6, %[b], x9\n\t"
15717         "adcs	x4, x4, x7\n\t"
15718         "umulh	x7, %[b], x9\n\t"
15719         "adc	x5, xzr, xzr\n\t"
15720         "adds	x4, x4, x6\n\t"
15721         "# A[38] * B\n\t"
15722         "ldp	x8, x9, [%[a], 304]\n\t"
15723         "str	x4, [%[r], 296]\n\t"
15724         "mov	x4, 0\n\t"
15725         "mul	x6, %[b], x8\n\t"
15726         "adcs	x5, x5, x7\n\t"
15727         "umulh	x7, %[b], x8\n\t"
15728         "adc	x3, xzr, xzr\n\t"
15729         "adds	x5, x5, x6\n\t"
15730         "# A[39] * B\n\t"
15731         "str	x5, [%[r], 304]\n\t"
15732         "mov	x5, 0\n\t"
15733         "mul	x6, %[b], x9\n\t"
15734         "adcs	x3, x3, x7\n\t"
15735         "umulh	x7, %[b], x9\n\t"
15736         "adc	x4, xzr, xzr\n\t"
15737         "adds	x3, x3, x6\n\t"
15738         "# A[40] * B\n\t"
15739         "ldp	x8, x9, [%[a], 320]\n\t"
15740         "str	x3, [%[r], 312]\n\t"
15741         "mov	x3, 0\n\t"
15742         "mul	x6, %[b], x8\n\t"
15743         "adcs	x4, x4, x7\n\t"
15744         "umulh	x7, %[b], x8\n\t"
15745         "adc	x5, xzr, xzr\n\t"
15746         "adds	x4, x4, x6\n\t"
15747         "# A[41] * B\n\t"
15748         "str	x4, [%[r], 320]\n\t"
15749         "mov	x4, 0\n\t"
15750         "mul	x6, %[b], x9\n\t"
15751         "adcs	x5, x5, x7\n\t"
15752         "umulh	x7, %[b], x9\n\t"
15753         "adc	x3, xzr, xzr\n\t"
15754         "adds	x5, x5, x6\n\t"
15755         "# A[42] * B\n\t"
15756         "ldp	x8, x9, [%[a], 336]\n\t"
15757         "str	x5, [%[r], 328]\n\t"
15758         "mov	x5, 0\n\t"
15759         "mul	x6, %[b], x8\n\t"
15760         "adcs	x3, x3, x7\n\t"
15761         "umulh	x7, %[b], x8\n\t"
15762         "adc	x4, xzr, xzr\n\t"
15763         "adds	x3, x3, x6\n\t"
15764         "# A[43] * B\n\t"
15765         "str	x3, [%[r], 336]\n\t"
15766         "mov	x3, 0\n\t"
15767         "mul	x6, %[b], x9\n\t"
15768         "adcs	x4, x4, x7\n\t"
15769         "umulh	x7, %[b], x9\n\t"
15770         "adc	x5, xzr, xzr\n\t"
15771         "adds	x4, x4, x6\n\t"
15772         "# A[44] * B\n\t"
15773         "ldp	x8, x9, [%[a], 352]\n\t"
15774         "str	x4, [%[r], 344]\n\t"
15775         "mov	x4, 0\n\t"
15776         "mul	x6, %[b], x8\n\t"
15777         "adcs	x5, x5, x7\n\t"
15778         "umulh	x7, %[b], x8\n\t"
15779         "adc	x3, xzr, xzr\n\t"
15780         "adds	x5, x5, x6\n\t"
15781         "# A[45] * B\n\t"
15782         "str	x5, [%[r], 352]\n\t"
15783         "mov	x5, 0\n\t"
15784         "mul	x6, %[b], x9\n\t"
15785         "adcs	x3, x3, x7\n\t"
15786         "umulh	x7, %[b], x9\n\t"
15787         "adc	x4, xzr, xzr\n\t"
15788         "adds	x3, x3, x6\n\t"
15789         "# A[46] * B\n\t"
15790         "ldp	x8, x9, [%[a], 368]\n\t"
15791         "str	x3, [%[r], 360]\n\t"
15792         "mov	x3, 0\n\t"
15793         "mul	x6, %[b], x8\n\t"
15794         "adcs	x4, x4, x7\n\t"
15795         "umulh	x7, %[b], x8\n\t"
15796         "adc	x5, xzr, xzr\n\t"
15797         "adds	x4, x4, x6\n\t"
15798         "# A[47] * B\n\t"
15799         "str	x4, [%[r], 368]\n\t"
15800         "mov	x4, 0\n\t"
15801         "mul	x6, %[b], x9\n\t"
15802         "adcs	x5, x5, x7\n\t"
15803         "umulh	x7, %[b], x9\n\t"
15804         "adc	x3, xzr, xzr\n\t"
15805         "adds	x5, x5, x6\n\t"
15806         "# A[48] * B\n\t"
15807         "ldp	x8, x9, [%[a], 384]\n\t"
15808         "str	x5, [%[r], 376]\n\t"
15809         "mov	x5, 0\n\t"
15810         "mul	x6, %[b], x8\n\t"
15811         "adcs	x3, x3, x7\n\t"
15812         "umulh	x7, %[b], x8\n\t"
15813         "adc	x4, xzr, xzr\n\t"
15814         "adds	x3, x3, x6\n\t"
15815         "# A[49] * B\n\t"
15816         "str	x3, [%[r], 384]\n\t"
15817         "mov	x3, 0\n\t"
15818         "mul	x6, %[b], x9\n\t"
15819         "adcs	x4, x4, x7\n\t"
15820         "umulh	x7, %[b], x9\n\t"
15821         "adc	x5, xzr, xzr\n\t"
15822         "adds	x4, x4, x6\n\t"
15823         "# A[50] * B\n\t"
15824         "ldp	x8, x9, [%[a], 400]\n\t"
15825         "str	x4, [%[r], 392]\n\t"
15826         "mov	x4, 0\n\t"
15827         "mul	x6, %[b], x8\n\t"
15828         "adcs	x5, x5, x7\n\t"
15829         "umulh	x7, %[b], x8\n\t"
15830         "adc	x3, xzr, xzr\n\t"
15831         "adds	x5, x5, x6\n\t"
15832         "# A[51] * B\n\t"
15833         "str	x5, [%[r], 400]\n\t"
15834         "mov	x5, 0\n\t"
15835         "mul	x6, %[b], x9\n\t"
15836         "adcs	x3, x3, x7\n\t"
15837         "umulh	x7, %[b], x9\n\t"
15838         "adc	x4, xzr, xzr\n\t"
15839         "adds	x3, x3, x6\n\t"
15840         "# A[52] * B\n\t"
15841         "ldp	x8, x9, [%[a], 416]\n\t"
15842         "str	x3, [%[r], 408]\n\t"
15843         "mov	x3, 0\n\t"
15844         "mul	x6, %[b], x8\n\t"
15845         "adcs	x4, x4, x7\n\t"
15846         "umulh	x7, %[b], x8\n\t"
15847         "adc	x5, xzr, xzr\n\t"
15848         "adds	x4, x4, x6\n\t"
15849         "# A[53] * B\n\t"
15850         "str	x4, [%[r], 416]\n\t"
15851         "mov	x4, 0\n\t"
15852         "mul	x6, %[b], x9\n\t"
15853         "adcs	x5, x5, x7\n\t"
15854         "umulh	x7, %[b], x9\n\t"
15855         "adc	x3, xzr, xzr\n\t"
15856         "adds	x5, x5, x6\n\t"
15857         "# A[54] * B\n\t"
15858         "ldp	x8, x9, [%[a], 432]\n\t"
15859         "str	x5, [%[r], 424]\n\t"
15860         "mov	x5, 0\n\t"
15861         "mul	x6, %[b], x8\n\t"
15862         "adcs	x3, x3, x7\n\t"
15863         "umulh	x7, %[b], x8\n\t"
15864         "adc	x4, xzr, xzr\n\t"
15865         "adds	x3, x3, x6\n\t"
15866         "# A[55] * B\n\t"
15867         "str	x3, [%[r], 432]\n\t"
15868         "mov	x3, 0\n\t"
15869         "mul	x6, %[b], x9\n\t"
15870         "adcs	x4, x4, x7\n\t"
15871         "umulh	x7, %[b], x9\n\t"
15872         "adc	x5, xzr, xzr\n\t"
15873         "adds	x4, x4, x6\n\t"
15874         "# A[56] * B\n\t"
15875         "ldp	x8, x9, [%[a], 448]\n\t"
15876         "str	x4, [%[r], 440]\n\t"
15877         "mov	x4, 0\n\t"
15878         "mul	x6, %[b], x8\n\t"
15879         "adcs	x5, x5, x7\n\t"
15880         "umulh	x7, %[b], x8\n\t"
15881         "adc	x3, xzr, xzr\n\t"
15882         "adds	x5, x5, x6\n\t"
15883         "# A[57] * B\n\t"
15884         "str	x5, [%[r], 448]\n\t"
15885         "mov	x5, 0\n\t"
15886         "mul	x6, %[b], x9\n\t"
15887         "adcs	x3, x3, x7\n\t"
15888         "umulh	x7, %[b], x9\n\t"
15889         "adc	x4, xzr, xzr\n\t"
15890         "adds	x3, x3, x6\n\t"
15891         "# A[58] * B\n\t"
15892         "ldp	x8, x9, [%[a], 464]\n\t"
15893         "str	x3, [%[r], 456]\n\t"
15894         "mov	x3, 0\n\t"
15895         "mul	x6, %[b], x8\n\t"
15896         "adcs	x4, x4, x7\n\t"
15897         "umulh	x7, %[b], x8\n\t"
15898         "adc	x5, xzr, xzr\n\t"
15899         "adds	x4, x4, x6\n\t"
15900         "# A[59] * B\n\t"
15901         "str	x4, [%[r], 464]\n\t"
15902         "mov	x4, 0\n\t"
15903         "mul	x6, %[b], x9\n\t"
15904         "adcs	x5, x5, x7\n\t"
15905         "umulh	x7, %[b], x9\n\t"
15906         "adc	x3, xzr, xzr\n\t"
15907         "adds	x5, x5, x6\n\t"
15908         "# A[60] * B\n\t"
15909         "ldp	x8, x9, [%[a], 480]\n\t"
15910         "str	x5, [%[r], 472]\n\t"
15911         "mov	x5, 0\n\t"
15912         "mul	x6, %[b], x8\n\t"
15913         "adcs	x3, x3, x7\n\t"
15914         "umulh	x7, %[b], x8\n\t"
15915         "adc	x4, xzr, xzr\n\t"
15916         "adds	x3, x3, x6\n\t"
15917         "# A[61] * B\n\t"
15918         "str	x3, [%[r], 480]\n\t"
15919         "mov	x3, 0\n\t"
15920         "mul	x6, %[b], x9\n\t"
15921         "adcs	x4, x4, x7\n\t"
15922         "umulh	x7, %[b], x9\n\t"
15923         "adc	x5, xzr, xzr\n\t"
15924         "adds	x4, x4, x6\n\t"
15925         "# A[62] * B\n\t"
15926         "ldp	x8, x9, [%[a], 496]\n\t"
15927         "str	x4, [%[r], 488]\n\t"
15928         "mov	x4, 0\n\t"
15929         "mul	x6, %[b], x8\n\t"
15930         "adcs	x5, x5, x7\n\t"
15931         "umulh	x7, %[b], x8\n\t"
15932         "adc	x3, xzr, xzr\n\t"
15933         "adds	x5, x5, x6\n\t"
15934         "# A[63] * B\n\t"
15935         "str	x5, [%[r], 496]\n\t"
15936         "mul	x6, %[b], x9\n\t"
15937         "adcs	x3, x3, x7\n\t"
15938         "umulh	x7, %[b], x9\n\t"
15939         "adc	x4, xzr, xzr\n\t"
15940         "adds	x3, x3, x6\n\t"
15941         "adc	x4, x4, x7\n\t"
15942         "stp	x3, x4, [%[r], 504]\n\t"
15943         :
15944         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
15945         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
15946     );
15947 #endif
15948 }
15949 
15950 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
15951 /* r = 2^n mod m where n is the number of bits to reduce by.
15952  * Given m must be 4096 bits, just need to subtract.
15953  *
15954  * r  A single precision number.
15955  * m  A single precision number.
15956  */
sp_4096_mont_norm_64(sp_digit * r,const sp_digit * m)15957 static void sp_4096_mont_norm_64(sp_digit* r, const sp_digit* m)
15958 {
15959     XMEMSET(r, 0, sizeof(sp_digit) * 64);
15960 
15961     /* r = 2^n mod m */
15962     sp_4096_sub_in_place_64(r, m);
15963 }
15964 
15965 #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
15966 /* Reduce the number back to 4096 bits using Montgomery reduction.
15967  *
15968  * a   A single precision number to reduce in place.
15969  * m   The single precision number representing the modulus.
15970  * mp  The digit representing the negative inverse of m mod 2^n.
15971  */
sp_4096_mont_reduce_64(sp_digit * a,const sp_digit * m,sp_digit mp)15972 SP_NOINLINE static void sp_4096_mont_reduce_64(sp_digit* a, const sp_digit* m,
15973         sp_digit mp)
15974 {
15975 
15976     __asm__ __volatile__ (
15977         "ldp	x14, x15, [%[m], 0]\n\t"
15978         "ldp	x16, x17, [%[m], 16]\n\t"
15979         "ldp	x19, x20, [%[m], 32]\n\t"
15980         "ldp	x21, x22, [%[m], 48]\n\t"
15981         "ldp	x23, x24, [%[m], 64]\n\t"
15982         "ldp	x25, x26, [%[m], 80]\n\t"
15983         "ldp	x27, x28, [%[m], 96]\n\t"
15984         "mov	x3, xzr\n\t"
15985         "# i = 64\n\t"
15986         "mov	x4, 64\n\t"
15987         "ldp	x12, x13, [%[a], 0]\n\t"
15988         "\n1:\n\t"
15989         "# mu = a[i] * mp\n\t"
15990         "mul	x9, %[mp], x12\n\t"
15991         "# a[i+0] += m[0] * mu\n\t"
15992         "mul	x7, x14, x9\n\t"
15993         "umulh	x8, x14, x9\n\t"
15994         "adds	x12, x12, x7\n\t"
15995         "# a[i+1] += m[1] * mu\n\t"
15996         "mul	x7, x15, x9\n\t"
15997         "adc	x6, x8, xzr\n\t"
15998         "umulh	x8, x15, x9\n\t"
15999         "adds	x12, x13, x7\n\t"
16000         "# a[i+2] += m[2] * mu\n\t"
16001         "ldr	x13, [%[a], 16]\n\t"
16002         "adc	x5, x8, xzr\n\t"
16003         "mul	x7, x16, x9\n\t"
16004         "adds	x12, x12, x6\n\t"
16005         "umulh	x8, x16, x9\n\t"
16006         "adc	x5, x5, xzr\n\t"
16007         "adds	x13, x13, x7\n\t"
16008         "# a[i+3] += m[3] * mu\n\t"
16009         "ldr	x10, [%[a], 24]\n\t"
16010         "adc	x6, x8, xzr\n\t"
16011         "mul	x7, x17, x9\n\t"
16012         "adds	x13, x13, x5\n\t"
16013         "umulh	x8, x17, x9\n\t"
16014         "adc	x6, x6, xzr\n\t"
16015         "adds	x10, x10, x7\n\t"
16016         "# a[i+4] += m[4] * mu\n\t"
16017         "ldr	x11, [%[a], 32]\n\t"
16018         "adc	x5, x8, xzr\n\t"
16019         "adds	x10, x10, x6\n\t"
16020         "mul	x7, x19, x9\n\t"
16021         "adc	x5, x5, xzr\n\t"
16022         "umulh	x8, x19, x9\n\t"
16023         "str	x10, [%[a], 24]\n\t"
16024         "adds	x11, x11, x7\n\t"
16025         "# a[i+5] += m[5] * mu\n\t"
16026         "ldr	x10, [%[a], 40]\n\t"
16027         "adc	x6, x8, xzr\n\t"
16028         "adds	x11, x11, x5\n\t"
16029         "mul	x7, x20, x9\n\t"
16030         "adc	x6, x6, xzr\n\t"
16031         "umulh	x8, x20, x9\n\t"
16032         "str	x11, [%[a], 32]\n\t"
16033         "adds	x10, x10, x7\n\t"
16034         "# a[i+6] += m[6] * mu\n\t"
16035         "ldr	x11, [%[a], 48]\n\t"
16036         "adc	x5, x8, xzr\n\t"
16037         "adds	x10, x10, x6\n\t"
16038         "mul	x7, x21, x9\n\t"
16039         "adc	x5, x5, xzr\n\t"
16040         "umulh	x8, x21, x9\n\t"
16041         "str	x10, [%[a], 40]\n\t"
16042         "adds	x11, x11, x7\n\t"
16043         "# a[i+7] += m[7] * mu\n\t"
16044         "ldr	x10, [%[a], 56]\n\t"
16045         "adc	x6, x8, xzr\n\t"
16046         "adds	x11, x11, x5\n\t"
16047         "mul	x7, x22, x9\n\t"
16048         "adc	x6, x6, xzr\n\t"
16049         "umulh	x8, x22, x9\n\t"
16050         "str	x11, [%[a], 48]\n\t"
16051         "adds	x10, x10, x7\n\t"
16052         "# a[i+8] += m[8] * mu\n\t"
16053         "ldr	x11, [%[a], 64]\n\t"
16054         "adc	x5, x8, xzr\n\t"
16055         "adds	x10, x10, x6\n\t"
16056         "mul	x7, x23, x9\n\t"
16057         "adc	x5, x5, xzr\n\t"
16058         "umulh	x8, x23, x9\n\t"
16059         "str	x10, [%[a], 56]\n\t"
16060         "adds	x11, x11, x7\n\t"
16061         "# a[i+9] += m[9] * mu\n\t"
16062         "ldr	x10, [%[a], 72]\n\t"
16063         "adc	x6, x8, xzr\n\t"
16064         "adds	x11, x11, x5\n\t"
16065         "mul	x7, x24, x9\n\t"
16066         "adc	x6, x6, xzr\n\t"
16067         "umulh	x8, x24, x9\n\t"
16068         "str	x11, [%[a], 64]\n\t"
16069         "adds	x10, x10, x7\n\t"
16070         "# a[i+10] += m[10] * mu\n\t"
16071         "ldr	x11, [%[a], 80]\n\t"
16072         "adc	x5, x8, xzr\n\t"
16073         "adds	x10, x10, x6\n\t"
16074         "mul	x7, x25, x9\n\t"
16075         "adc	x5, x5, xzr\n\t"
16076         "umulh	x8, x25, x9\n\t"
16077         "str	x10, [%[a], 72]\n\t"
16078         "adds	x11, x11, x7\n\t"
16079         "# a[i+11] += m[11] * mu\n\t"
16080         "ldr	x10, [%[a], 88]\n\t"
16081         "adc	x6, x8, xzr\n\t"
16082         "adds	x11, x11, x5\n\t"
16083         "mul	x7, x26, x9\n\t"
16084         "adc	x6, x6, xzr\n\t"
16085         "umulh	x8, x26, x9\n\t"
16086         "str	x11, [%[a], 80]\n\t"
16087         "adds	x10, x10, x7\n\t"
16088         "# a[i+12] += m[12] * mu\n\t"
16089         "ldr	x11, [%[a], 96]\n\t"
16090         "adc	x5, x8, xzr\n\t"
16091         "adds	x10, x10, x6\n\t"
16092         "mul	x7, x27, x9\n\t"
16093         "adc	x5, x5, xzr\n\t"
16094         "umulh	x8, x27, x9\n\t"
16095         "str	x10, [%[a], 88]\n\t"
16096         "adds	x11, x11, x7\n\t"
16097         "# a[i+13] += m[13] * mu\n\t"
16098         "ldr	x10, [%[a], 104]\n\t"
16099         "adc	x6, x8, xzr\n\t"
16100         "adds	x11, x11, x5\n\t"
16101         "mul	x7, x28, x9\n\t"
16102         "adc	x6, x6, xzr\n\t"
16103         "umulh	x8, x28, x9\n\t"
16104         "str	x11, [%[a], 96]\n\t"
16105         "adds	x10, x10, x7\n\t"
16106         "# a[i+14] += m[14] * mu\n\t"
16107         "ldr	x11, [%[a], 112]\n\t"
16108         "adc	x5, x8, xzr\n\t"
16109         "ldr	x8, [%[m], 112]\n\t"
16110         "adds	x10, x10, x6\n\t"
16111         "mul	x7, x8, x9\n\t"
16112         "adc	x5, x5, xzr\n\t"
16113         "umulh	x8, x8, x9\n\t"
16114         "str	x10, [%[a], 104]\n\t"
16115         "adds	x11, x11, x7\n\t"
16116         "# a[i+15] += m[15] * mu\n\t"
16117         "ldr	x10, [%[a], 120]\n\t"
16118         "adc	x6, x8, xzr\n\t"
16119         "ldr	x8, [%[m], 120]\n\t"
16120         "adds	x11, x11, x5\n\t"
16121         "mul	x7, x8, x9\n\t"
16122         "adc	x6, x6, xzr\n\t"
16123         "umulh	x8, x8, x9\n\t"
16124         "str	x11, [%[a], 112]\n\t"
16125         "adds	x10, x10, x7\n\t"
16126         "# a[i+16] += m[16] * mu\n\t"
16127         "ldr	x11, [%[a], 128]\n\t"
16128         "adc	x5, x8, xzr\n\t"
16129         "ldr	x8, [%[m], 128]\n\t"
16130         "adds	x10, x10, x6\n\t"
16131         "mul	x7, x8, x9\n\t"
16132         "adc	x5, x5, xzr\n\t"
16133         "umulh	x8, x8, x9\n\t"
16134         "str	x10, [%[a], 120]\n\t"
16135         "adds	x11, x11, x7\n\t"
16136         "# a[i+17] += m[17] * mu\n\t"
16137         "ldr	x10, [%[a], 136]\n\t"
16138         "adc	x6, x8, xzr\n\t"
16139         "ldr	x8, [%[m], 136]\n\t"
16140         "adds	x11, x11, x5\n\t"
16141         "mul	x7, x8, x9\n\t"
16142         "adc	x6, x6, xzr\n\t"
16143         "umulh	x8, x8, x9\n\t"
16144         "str	x11, [%[a], 128]\n\t"
16145         "adds	x10, x10, x7\n\t"
16146         "# a[i+18] += m[18] * mu\n\t"
16147         "ldr	x11, [%[a], 144]\n\t"
16148         "adc	x5, x8, xzr\n\t"
16149         "ldr	x8, [%[m], 144]\n\t"
16150         "adds	x10, x10, x6\n\t"
16151         "mul	x7, x8, x9\n\t"
16152         "adc	x5, x5, xzr\n\t"
16153         "umulh	x8, x8, x9\n\t"
16154         "str	x10, [%[a], 136]\n\t"
16155         "adds	x11, x11, x7\n\t"
16156         "# a[i+19] += m[19] * mu\n\t"
16157         "ldr	x10, [%[a], 152]\n\t"
16158         "adc	x6, x8, xzr\n\t"
16159         "ldr	x8, [%[m], 152]\n\t"
16160         "adds	x11, x11, x5\n\t"
16161         "mul	x7, x8, x9\n\t"
16162         "adc	x6, x6, xzr\n\t"
16163         "umulh	x8, x8, x9\n\t"
16164         "str	x11, [%[a], 144]\n\t"
16165         "adds	x10, x10, x7\n\t"
16166         "# a[i+20] += m[20] * mu\n\t"
16167         "ldr	x11, [%[a], 160]\n\t"
16168         "adc	x5, x8, xzr\n\t"
16169         "ldr	x8, [%[m], 160]\n\t"
16170         "adds	x10, x10, x6\n\t"
16171         "mul	x7, x8, x9\n\t"
16172         "adc	x5, x5, xzr\n\t"
16173         "umulh	x8, x8, x9\n\t"
16174         "str	x10, [%[a], 152]\n\t"
16175         "adds	x11, x11, x7\n\t"
16176         "# a[i+21] += m[21] * mu\n\t"
16177         "ldr	x10, [%[a], 168]\n\t"
16178         "adc	x6, x8, xzr\n\t"
16179         "ldr	x8, [%[m], 168]\n\t"
16180         "adds	x11, x11, x5\n\t"
16181         "mul	x7, x8, x9\n\t"
16182         "adc	x6, x6, xzr\n\t"
16183         "umulh	x8, x8, x9\n\t"
16184         "str	x11, [%[a], 160]\n\t"
16185         "adds	x10, x10, x7\n\t"
16186         "# a[i+22] += m[22] * mu\n\t"
16187         "ldr	x11, [%[a], 176]\n\t"
16188         "adc	x5, x8, xzr\n\t"
16189         "ldr	x8, [%[m], 176]\n\t"
16190         "adds	x10, x10, x6\n\t"
16191         "mul	x7, x8, x9\n\t"
16192         "adc	x5, x5, xzr\n\t"
16193         "umulh	x8, x8, x9\n\t"
16194         "str	x10, [%[a], 168]\n\t"
16195         "adds	x11, x11, x7\n\t"
16196         "# a[i+23] += m[23] * mu\n\t"
16197         "ldr	x10, [%[a], 184]\n\t"
16198         "adc	x6, x8, xzr\n\t"
16199         "ldr	x8, [%[m], 184]\n\t"
16200         "adds	x11, x11, x5\n\t"
16201         "mul	x7, x8, x9\n\t"
16202         "adc	x6, x6, xzr\n\t"
16203         "umulh	x8, x8, x9\n\t"
16204         "str	x11, [%[a], 176]\n\t"
16205         "adds	x10, x10, x7\n\t"
16206         "# a[i+24] += m[24] * mu\n\t"
16207         "ldr	x11, [%[a], 192]\n\t"
16208         "adc	x5, x8, xzr\n\t"
16209         "ldr	x8, [%[m], 192]\n\t"
16210         "adds	x10, x10, x6\n\t"
16211         "mul	x7, x8, x9\n\t"
16212         "adc	x5, x5, xzr\n\t"
16213         "umulh	x8, x8, x9\n\t"
16214         "str	x10, [%[a], 184]\n\t"
16215         "adds	x11, x11, x7\n\t"
16216         "# a[i+25] += m[25] * mu\n\t"
16217         "ldr	x10, [%[a], 200]\n\t"
16218         "adc	x6, x8, xzr\n\t"
16219         "ldr	x8, [%[m], 200]\n\t"
16220         "adds	x11, x11, x5\n\t"
16221         "mul	x7, x8, x9\n\t"
16222         "adc	x6, x6, xzr\n\t"
16223         "umulh	x8, x8, x9\n\t"
16224         "str	x11, [%[a], 192]\n\t"
16225         "adds	x10, x10, x7\n\t"
16226         "# a[i+26] += m[26] * mu\n\t"
16227         "ldr	x11, [%[a], 208]\n\t"
16228         "adc	x5, x8, xzr\n\t"
16229         "ldr	x8, [%[m], 208]\n\t"
16230         "adds	x10, x10, x6\n\t"
16231         "mul	x7, x8, x9\n\t"
16232         "adc	x5, x5, xzr\n\t"
16233         "umulh	x8, x8, x9\n\t"
16234         "str	x10, [%[a], 200]\n\t"
16235         "adds	x11, x11, x7\n\t"
16236         "# a[i+27] += m[27] * mu\n\t"
16237         "ldr	x10, [%[a], 216]\n\t"
16238         "adc	x6, x8, xzr\n\t"
16239         "ldr	x8, [%[m], 216]\n\t"
16240         "adds	x11, x11, x5\n\t"
16241         "mul	x7, x8, x9\n\t"
16242         "adc	x6, x6, xzr\n\t"
16243         "umulh	x8, x8, x9\n\t"
16244         "str	x11, [%[a], 208]\n\t"
16245         "adds	x10, x10, x7\n\t"
16246         "# a[i+28] += m[28] * mu\n\t"
16247         "ldr	x11, [%[a], 224]\n\t"
16248         "adc	x5, x8, xzr\n\t"
16249         "ldr	x8, [%[m], 224]\n\t"
16250         "adds	x10, x10, x6\n\t"
16251         "mul	x7, x8, x9\n\t"
16252         "adc	x5, x5, xzr\n\t"
16253         "umulh	x8, x8, x9\n\t"
16254         "str	x10, [%[a], 216]\n\t"
16255         "adds	x11, x11, x7\n\t"
16256         "# a[i+29] += m[29] * mu\n\t"
16257         "ldr	x10, [%[a], 232]\n\t"
16258         "adc	x6, x8, xzr\n\t"
16259         "ldr	x8, [%[m], 232]\n\t"
16260         "adds	x11, x11, x5\n\t"
16261         "mul	x7, x8, x9\n\t"
16262         "adc	x6, x6, xzr\n\t"
16263         "umulh	x8, x8, x9\n\t"
16264         "str	x11, [%[a], 224]\n\t"
16265         "adds	x10, x10, x7\n\t"
16266         "# a[i+30] += m[30] * mu\n\t"
16267         "ldr	x11, [%[a], 240]\n\t"
16268         "adc	x5, x8, xzr\n\t"
16269         "ldr	x8, [%[m], 240]\n\t"
16270         "adds	x10, x10, x6\n\t"
16271         "mul	x7, x8, x9\n\t"
16272         "adc	x5, x5, xzr\n\t"
16273         "umulh	x8, x8, x9\n\t"
16274         "str	x10, [%[a], 232]\n\t"
16275         "adds	x11, x11, x7\n\t"
16276         "# a[i+31] += m[31] * mu\n\t"
16277         "ldr	x10, [%[a], 248]\n\t"
16278         "adc	x6, x8, xzr\n\t"
16279         "ldr	x8, [%[m], 248]\n\t"
16280         "adds	x11, x11, x5\n\t"
16281         "mul	x7, x8, x9\n\t"
16282         "adc	x6, x6, xzr\n\t"
16283         "umulh	x8, x8, x9\n\t"
16284         "str	x11, [%[a], 240]\n\t"
16285         "adds	x10, x10, x7\n\t"
16286         "# a[i+32] += m[32] * mu\n\t"
16287         "ldr	x11, [%[a], 256]\n\t"
16288         "adc	x5, x8, xzr\n\t"
16289         "ldr	x8, [%[m], 256]\n\t"
16290         "adds	x10, x10, x6\n\t"
16291         "mul	x7, x8, x9\n\t"
16292         "adc	x5, x5, xzr\n\t"
16293         "umulh	x8, x8, x9\n\t"
16294         "str	x10, [%[a], 248]\n\t"
16295         "adds	x11, x11, x7\n\t"
16296         "# a[i+33] += m[33] * mu\n\t"
16297         "ldr	x10, [%[a], 264]\n\t"
16298         "adc	x6, x8, xzr\n\t"
16299         "ldr	x8, [%[m], 264]\n\t"
16300         "adds	x11, x11, x5\n\t"
16301         "mul	x7, x8, x9\n\t"
16302         "adc	x6, x6, xzr\n\t"
16303         "umulh	x8, x8, x9\n\t"
16304         "str	x11, [%[a], 256]\n\t"
16305         "adds	x10, x10, x7\n\t"
16306         "# a[i+34] += m[34] * mu\n\t"
16307         "ldr	x11, [%[a], 272]\n\t"
16308         "adc	x5, x8, xzr\n\t"
16309         "ldr	x8, [%[m], 272]\n\t"
16310         "adds	x10, x10, x6\n\t"
16311         "mul	x7, x8, x9\n\t"
16312         "adc	x5, x5, xzr\n\t"
16313         "umulh	x8, x8, x9\n\t"
16314         "str	x10, [%[a], 264]\n\t"
16315         "adds	x11, x11, x7\n\t"
16316         "# a[i+35] += m[35] * mu\n\t"
16317         "ldr	x10, [%[a], 280]\n\t"
16318         "adc	x6, x8, xzr\n\t"
16319         "ldr	x8, [%[m], 280]\n\t"
16320         "adds	x11, x11, x5\n\t"
16321         "mul	x7, x8, x9\n\t"
16322         "adc	x6, x6, xzr\n\t"
16323         "umulh	x8, x8, x9\n\t"
16324         "str	x11, [%[a], 272]\n\t"
16325         "adds	x10, x10, x7\n\t"
16326         "# a[i+36] += m[36] * mu\n\t"
16327         "ldr	x11, [%[a], 288]\n\t"
16328         "adc	x5, x8, xzr\n\t"
16329         "ldr	x8, [%[m], 288]\n\t"
16330         "adds	x10, x10, x6\n\t"
16331         "mul	x7, x8, x9\n\t"
16332         "adc	x5, x5, xzr\n\t"
16333         "umulh	x8, x8, x9\n\t"
16334         "str	x10, [%[a], 280]\n\t"
16335         "adds	x11, x11, x7\n\t"
16336         "# a[i+37] += m[37] * mu\n\t"
16337         "ldr	x10, [%[a], 296]\n\t"
16338         "adc	x6, x8, xzr\n\t"
16339         "ldr	x8, [%[m], 296]\n\t"
16340         "adds	x11, x11, x5\n\t"
16341         "mul	x7, x8, x9\n\t"
16342         "adc	x6, x6, xzr\n\t"
16343         "umulh	x8, x8, x9\n\t"
16344         "str	x11, [%[a], 288]\n\t"
16345         "adds	x10, x10, x7\n\t"
16346         "# a[i+38] += m[38] * mu\n\t"
16347         "ldr	x11, [%[a], 304]\n\t"
16348         "adc	x5, x8, xzr\n\t"
16349         "ldr	x8, [%[m], 304]\n\t"
16350         "adds	x10, x10, x6\n\t"
16351         "mul	x7, x8, x9\n\t"
16352         "adc	x5, x5, xzr\n\t"
16353         "umulh	x8, x8, x9\n\t"
16354         "str	x10, [%[a], 296]\n\t"
16355         "adds	x11, x11, x7\n\t"
16356         "# a[i+39] += m[39] * mu\n\t"
16357         "ldr	x10, [%[a], 312]\n\t"
16358         "adc	x6, x8, xzr\n\t"
16359         "ldr	x8, [%[m], 312]\n\t"
16360         "adds	x11, x11, x5\n\t"
16361         "mul	x7, x8, x9\n\t"
16362         "adc	x6, x6, xzr\n\t"
16363         "umulh	x8, x8, x9\n\t"
16364         "str	x11, [%[a], 304]\n\t"
16365         "adds	x10, x10, x7\n\t"
16366         "# a[i+40] += m[40] * mu\n\t"
16367         "ldr	x11, [%[a], 320]\n\t"
16368         "adc	x5, x8, xzr\n\t"
16369         "ldr	x8, [%[m], 320]\n\t"
16370         "adds	x10, x10, x6\n\t"
16371         "mul	x7, x8, x9\n\t"
16372         "adc	x5, x5, xzr\n\t"
16373         "umulh	x8, x8, x9\n\t"
16374         "str	x10, [%[a], 312]\n\t"
16375         "adds	x11, x11, x7\n\t"
16376         "# a[i+41] += m[41] * mu\n\t"
16377         "ldr	x10, [%[a], 328]\n\t"
16378         "adc	x6, x8, xzr\n\t"
16379         "ldr	x8, [%[m], 328]\n\t"
16380         "adds	x11, x11, x5\n\t"
16381         "mul	x7, x8, x9\n\t"
16382         "adc	x6, x6, xzr\n\t"
16383         "umulh	x8, x8, x9\n\t"
16384         "str	x11, [%[a], 320]\n\t"
16385         "adds	x10, x10, x7\n\t"
16386         "# a[i+42] += m[42] * mu\n\t"
16387         "ldr	x11, [%[a], 336]\n\t"
16388         "adc	x5, x8, xzr\n\t"
16389         "ldr	x8, [%[m], 336]\n\t"
16390         "adds	x10, x10, x6\n\t"
16391         "mul	x7, x8, x9\n\t"
16392         "adc	x5, x5, xzr\n\t"
16393         "umulh	x8, x8, x9\n\t"
16394         "str	x10, [%[a], 328]\n\t"
16395         "adds	x11, x11, x7\n\t"
16396         "# a[i+43] += m[43] * mu\n\t"
16397         "ldr	x10, [%[a], 344]\n\t"
16398         "adc	x6, x8, xzr\n\t"
16399         "ldr	x8, [%[m], 344]\n\t"
16400         "adds	x11, x11, x5\n\t"
16401         "mul	x7, x8, x9\n\t"
16402         "adc	x6, x6, xzr\n\t"
16403         "umulh	x8, x8, x9\n\t"
16404         "str	x11, [%[a], 336]\n\t"
16405         "adds	x10, x10, x7\n\t"
16406         "# a[i+44] += m[44] * mu\n\t"
16407         "ldr	x11, [%[a], 352]\n\t"
16408         "adc	x5, x8, xzr\n\t"
16409         "ldr	x8, [%[m], 352]\n\t"
16410         "adds	x10, x10, x6\n\t"
16411         "mul	x7, x8, x9\n\t"
16412         "adc	x5, x5, xzr\n\t"
16413         "umulh	x8, x8, x9\n\t"
16414         "str	x10, [%[a], 344]\n\t"
16415         "adds	x11, x11, x7\n\t"
16416         "# a[i+45] += m[45] * mu\n\t"
16417         "ldr	x10, [%[a], 360]\n\t"
16418         "adc	x6, x8, xzr\n\t"
16419         "ldr	x8, [%[m], 360]\n\t"
16420         "adds	x11, x11, x5\n\t"
16421         "mul	x7, x8, x9\n\t"
16422         "adc	x6, x6, xzr\n\t"
16423         "umulh	x8, x8, x9\n\t"
16424         "str	x11, [%[a], 352]\n\t"
16425         "adds	x10, x10, x7\n\t"
16426         "# a[i+46] += m[46] * mu\n\t"
16427         "ldr	x11, [%[a], 368]\n\t"
16428         "adc	x5, x8, xzr\n\t"
16429         "ldr	x8, [%[m], 368]\n\t"
16430         "adds	x10, x10, x6\n\t"
16431         "mul	x7, x8, x9\n\t"
16432         "adc	x5, x5, xzr\n\t"
16433         "umulh	x8, x8, x9\n\t"
16434         "str	x10, [%[a], 360]\n\t"
16435         "adds	x11, x11, x7\n\t"
16436         "# a[i+47] += m[47] * mu\n\t"
16437         "ldr	x10, [%[a], 376]\n\t"
16438         "adc	x6, x8, xzr\n\t"
16439         "ldr	x8, [%[m], 376]\n\t"
16440         "adds	x11, x11, x5\n\t"
16441         "mul	x7, x8, x9\n\t"
16442         "adc	x6, x6, xzr\n\t"
16443         "umulh	x8, x8, x9\n\t"
16444         "str	x11, [%[a], 368]\n\t"
16445         "adds	x10, x10, x7\n\t"
16446         "# a[i+48] += m[48] * mu\n\t"
16447         "ldr	x11, [%[a], 384]\n\t"
16448         "adc	x5, x8, xzr\n\t"
16449         "ldr	x8, [%[m], 384]\n\t"
16450         "adds	x10, x10, x6\n\t"
16451         "mul	x7, x8, x9\n\t"
16452         "adc	x5, x5, xzr\n\t"
16453         "umulh	x8, x8, x9\n\t"
16454         "str	x10, [%[a], 376]\n\t"
16455         "adds	x11, x11, x7\n\t"
16456         "# a[i+49] += m[49] * mu\n\t"
16457         "ldr	x10, [%[a], 392]\n\t"
16458         "adc	x6, x8, xzr\n\t"
16459         "ldr	x8, [%[m], 392]\n\t"
16460         "adds	x11, x11, x5\n\t"
16461         "mul	x7, x8, x9\n\t"
16462         "adc	x6, x6, xzr\n\t"
16463         "umulh	x8, x8, x9\n\t"
16464         "str	x11, [%[a], 384]\n\t"
16465         "adds	x10, x10, x7\n\t"
16466         "# a[i+50] += m[50] * mu\n\t"
16467         "ldr	x11, [%[a], 400]\n\t"
16468         "adc	x5, x8, xzr\n\t"
16469         "ldr	x8, [%[m], 400]\n\t"
16470         "adds	x10, x10, x6\n\t"
16471         "mul	x7, x8, x9\n\t"
16472         "adc	x5, x5, xzr\n\t"
16473         "umulh	x8, x8, x9\n\t"
16474         "str	x10, [%[a], 392]\n\t"
16475         "adds	x11, x11, x7\n\t"
16476         "# a[i+51] += m[51] * mu\n\t"
16477         "ldr	x10, [%[a], 408]\n\t"
16478         "adc	x6, x8, xzr\n\t"
16479         "ldr	x8, [%[m], 408]\n\t"
16480         "adds	x11, x11, x5\n\t"
16481         "mul	x7, x8, x9\n\t"
16482         "adc	x6, x6, xzr\n\t"
16483         "umulh	x8, x8, x9\n\t"
16484         "str	x11, [%[a], 400]\n\t"
16485         "adds	x10, x10, x7\n\t"
16486         "# a[i+52] += m[52] * mu\n\t"
16487         "ldr	x11, [%[a], 416]\n\t"
16488         "adc	x5, x8, xzr\n\t"
16489         "ldr	x8, [%[m], 416]\n\t"
16490         "adds	x10, x10, x6\n\t"
16491         "mul	x7, x8, x9\n\t"
16492         "adc	x5, x5, xzr\n\t"
16493         "umulh	x8, x8, x9\n\t"
16494         "str	x10, [%[a], 408]\n\t"
16495         "adds	x11, x11, x7\n\t"
16496         "# a[i+53] += m[53] * mu\n\t"
16497         "ldr	x10, [%[a], 424]\n\t"
16498         "adc	x6, x8, xzr\n\t"
16499         "ldr	x8, [%[m], 424]\n\t"
16500         "adds	x11, x11, x5\n\t"
16501         "mul	x7, x8, x9\n\t"
16502         "adc	x6, x6, xzr\n\t"
16503         "umulh	x8, x8, x9\n\t"
16504         "str	x11, [%[a], 416]\n\t"
16505         "adds	x10, x10, x7\n\t"
16506         "# a[i+54] += m[54] * mu\n\t"
16507         "ldr	x11, [%[a], 432]\n\t"
16508         "adc	x5, x8, xzr\n\t"
16509         "ldr	x8, [%[m], 432]\n\t"
16510         "adds	x10, x10, x6\n\t"
16511         "mul	x7, x8, x9\n\t"
16512         "adc	x5, x5, xzr\n\t"
16513         "umulh	x8, x8, x9\n\t"
16514         "str	x10, [%[a], 424]\n\t"
16515         "adds	x11, x11, x7\n\t"
16516         "# a[i+55] += m[55] * mu\n\t"
16517         "ldr	x10, [%[a], 440]\n\t"
16518         "adc	x6, x8, xzr\n\t"
16519         "ldr	x8, [%[m], 440]\n\t"
16520         "adds	x11, x11, x5\n\t"
16521         "mul	x7, x8, x9\n\t"
16522         "adc	x6, x6, xzr\n\t"
16523         "umulh	x8, x8, x9\n\t"
16524         "str	x11, [%[a], 432]\n\t"
16525         "adds	x10, x10, x7\n\t"
16526         "# a[i+56] += m[56] * mu\n\t"
16527         "ldr	x11, [%[a], 448]\n\t"
16528         "adc	x5, x8, xzr\n\t"
16529         "ldr	x8, [%[m], 448]\n\t"
16530         "adds	x10, x10, x6\n\t"
16531         "mul	x7, x8, x9\n\t"
16532         "adc	x5, x5, xzr\n\t"
16533         "umulh	x8, x8, x9\n\t"
16534         "str	x10, [%[a], 440]\n\t"
16535         "adds	x11, x11, x7\n\t"
16536         "# a[i+57] += m[57] * mu\n\t"
16537         "ldr	x10, [%[a], 456]\n\t"
16538         "adc	x6, x8, xzr\n\t"
16539         "ldr	x8, [%[m], 456]\n\t"
16540         "adds	x11, x11, x5\n\t"
16541         "mul	x7, x8, x9\n\t"
16542         "adc	x6, x6, xzr\n\t"
16543         "umulh	x8, x8, x9\n\t"
16544         "str	x11, [%[a], 448]\n\t"
16545         "adds	x10, x10, x7\n\t"
16546         "# a[i+58] += m[58] * mu\n\t"
16547         "ldr	x11, [%[a], 464]\n\t"
16548         "adc	x5, x8, xzr\n\t"
16549         "ldr	x8, [%[m], 464]\n\t"
16550         "adds	x10, x10, x6\n\t"
16551         "mul	x7, x8, x9\n\t"
16552         "adc	x5, x5, xzr\n\t"
16553         "umulh	x8, x8, x9\n\t"
16554         "str	x10, [%[a], 456]\n\t"
16555         "adds	x11, x11, x7\n\t"
16556         "# a[i+59] += m[59] * mu\n\t"
16557         "ldr	x10, [%[a], 472]\n\t"
16558         "adc	x6, x8, xzr\n\t"
16559         "ldr	x8, [%[m], 472]\n\t"
16560         "adds	x11, x11, x5\n\t"
16561         "mul	x7, x8, x9\n\t"
16562         "adc	x6, x6, xzr\n\t"
16563         "umulh	x8, x8, x9\n\t"
16564         "str	x11, [%[a], 464]\n\t"
16565         "adds	x10, x10, x7\n\t"
16566         "# a[i+60] += m[60] * mu\n\t"
16567         "ldr	x11, [%[a], 480]\n\t"
16568         "adc	x5, x8, xzr\n\t"
16569         "ldr	x8, [%[m], 480]\n\t"
16570         "adds	x10, x10, x6\n\t"
16571         "mul	x7, x8, x9\n\t"
16572         "adc	x5, x5, xzr\n\t"
16573         "umulh	x8, x8, x9\n\t"
16574         "str	x10, [%[a], 472]\n\t"
16575         "adds	x11, x11, x7\n\t"
16576         "# a[i+61] += m[61] * mu\n\t"
16577         "ldr	x10, [%[a], 488]\n\t"
16578         "adc	x6, x8, xzr\n\t"
16579         "ldr	x8, [%[m], 488]\n\t"
16580         "adds	x11, x11, x5\n\t"
16581         "mul	x7, x8, x9\n\t"
16582         "adc	x6, x6, xzr\n\t"
16583         "umulh	x8, x8, x9\n\t"
16584         "str	x11, [%[a], 480]\n\t"
16585         "adds	x10, x10, x7\n\t"
16586         "# a[i+62] += m[62] * mu\n\t"
16587         "ldr	x11, [%[a], 496]\n\t"
16588         "adc	x5, x8, xzr\n\t"
16589         "ldr	x8, [%[m], 496]\n\t"
16590         "adds	x10, x10, x6\n\t"
16591         "mul	x7, x8, x9\n\t"
16592         "adc	x5, x5, xzr\n\t"
16593         "umulh	x8, x8, x9\n\t"
16594         "str	x10, [%[a], 488]\n\t"
16595         "adds	x11, x11, x7\n\t"
16596         "# a[i+63] += m[63] * mu\n\t"
16597         "ldr	x10, [%[a], 504]\n\t"
16598         "adc	x6, x8, xzr\n\t"
16599         "ldr	x8, [%[m], 504]\n\t"
16600         "adds	x11, x11, x5\n\t"
16601         "mul	x7, x8, x9\n\t"
16602         "adc	x6, x6, xzr\n\t"
16603         "umulh	x8, x8, x9\n\t"
16604         "adds	x6, x6, x7\n\t"
16605         "adcs	x8, x8, x3\n\t"
16606         "str	x11, [%[a], 496]\n\t"
16607         "cset  x3, cs\n\t"
16608         "adds	x10, x10, x6\n\t"
16609         "ldr	x11, [%[a], 512]\n\t"
16610         "str	x10, [%[a], 504]\n\t"
16611         "adcs	x11, x11, x8\n\t"
16612         "str	x11, [%[a], 512]\n\t"
16613         "adc	x3, x3, xzr\n\t"
16614         "subs	x4, x4, 1\n\t"
16615         "add	%[a], %[a], 8\n\t"
16616         "bne	1b\n\t"
16617         "# x12 and x13 hold a[0] and a[1]\n\t"
16618         "# Create mask\n\t"
16619         "neg       x3, x3\n\t"
16620         "mov   x9, %[a]\n\t"
16621         "sub   %[a], %[a], 512\n\t"
16622         "# Subtract masked modulus\n\t"
16623         "# x12 and x13 hold a[0] and a[1]\n\t"
16624         "and       x14, x14, x3\n\t"
16625         "ldp       x11, x10, [x9, 16]\n\t"
16626         "and       x15, x15, x3\n\t"
16627         "subs      x12, x12, x14\n\t"
16628         "and       x16, x16, x3\n\t"
16629         "sbcs      x13, x13, x15\n\t"
16630         "and       x17, x17, x3\n\t"
16631         "sbcs      x11, x11, x16\n\t"
16632         "stp       x12, x13, [%[a], 0]\n\t"
16633         "sbcs      x10, x10, x17\n\t"
16634         "stp       x11, x10, [%[a], 16]\n\t"
16635         "ldp       x12, x13, [x9, 32]\n\t"
16636         "and       x19, x19, x3\n\t"
16637         "ldp       x11, x10, [x9, 48]\n\t"
16638         "and       x20, x20, x3\n\t"
16639         "sbcs      x12, x12, x19\n\t"
16640         "and       x21, x21, x3\n\t"
16641         "sbcs      x13, x13, x20\n\t"
16642         "and       x22, x22, x3\n\t"
16643         "sbcs      x11, x11, x21\n\t"
16644         "stp       x12, x13, [%[a], 32]\n\t"
16645         "sbcs      x10, x10, x22\n\t"
16646         "stp       x11, x10, [%[a], 48]\n\t"
16647         "ldp       x12, x13, [x9, 64]\n\t"
16648         "and       x23, x23, x3\n\t"
16649         "ldp       x11, x10, [x9, 80]\n\t"
16650         "and       x24, x24, x3\n\t"
16651         "sbcs      x12, x12, x23\n\t"
16652         "and       x25, x25, x3\n\t"
16653         "sbcs      x13, x13, x24\n\t"
16654         "and       x26, x26, x3\n\t"
16655         "sbcs      x11, x11, x25\n\t"
16656         "stp       x12, x13, [%[a], 64]\n\t"
16657         "sbcs      x10, x10, x26\n\t"
16658         "stp       x11, x10, [%[a], 80]\n\t"
16659         "ldp       x7, x8, [%[m], 112]\n\t"
16660         "ldp       x12, x13, [x9, 96]\n\t"
16661         "and       x27, x27, x3\n\t"
16662         "ldp       x11, x10, [x9, 112]\n\t"
16663         "and       x28, x28, x3\n\t"
16664         "sbcs      x12, x12, x27\n\t"
16665         "and       x7, x7, x3\n\t"
16666         "sbcs      x13, x13, x28\n\t"
16667         "and       x8, x8, x3\n\t"
16668         "sbcs      x11, x11, x7\n\t"
16669         "stp       x12, x13, [%[a], 96]\n\t"
16670         "sbcs      x10, x10, x8\n\t"
16671         "stp       x11, x10, [%[a], 112]\n\t"
16672         "ldp       x5, x6, [%[m], 128]\n\t"
16673         "ldp       x7, x8, [%[m], 144]\n\t"
16674         "ldp       x12, x13, [x9, 128]\n\t"
16675         "and       x5, x5, x3\n\t"
16676         "ldp       x11, x10, [x9, 144]\n\t"
16677         "and       x6, x6, x3\n\t"
16678         "sbcs      x12, x12, x5\n\t"
16679         "and       x7, x7, x3\n\t"
16680         "sbcs      x13, x13, x6\n\t"
16681         "and       x8, x8, x3\n\t"
16682         "sbcs      x11, x11, x7\n\t"
16683         "stp       x12, x13, [%[a], 128]\n\t"
16684         "sbcs      x10, x10, x8\n\t"
16685         "stp       x11, x10, [%[a], 144]\n\t"
16686         "ldp       x5, x6, [%[m], 160]\n\t"
16687         "ldp       x7, x8, [%[m], 176]\n\t"
16688         "ldp       x12, x13, [x9, 160]\n\t"
16689         "and       x5, x5, x3\n\t"
16690         "ldp       x11, x10, [x9, 176]\n\t"
16691         "and       x6, x6, x3\n\t"
16692         "sbcs      x12, x12, x5\n\t"
16693         "and       x7, x7, x3\n\t"
16694         "sbcs      x13, x13, x6\n\t"
16695         "and       x8, x8, x3\n\t"
16696         "sbcs      x11, x11, x7\n\t"
16697         "stp       x12, x13, [%[a], 160]\n\t"
16698         "sbcs      x10, x10, x8\n\t"
16699         "stp       x11, x10, [%[a], 176]\n\t"
16700         "ldp       x5, x6, [%[m], 192]\n\t"
16701         "ldp       x7, x8, [%[m], 208]\n\t"
16702         "ldp       x12, x13, [x9, 192]\n\t"
16703         "and       x5, x5, x3\n\t"
16704         "ldp       x11, x10, [x9, 208]\n\t"
16705         "and       x6, x6, x3\n\t"
16706         "sbcs      x12, x12, x5\n\t"
16707         "and       x7, x7, x3\n\t"
16708         "sbcs      x13, x13, x6\n\t"
16709         "and       x8, x8, x3\n\t"
16710         "sbcs      x11, x11, x7\n\t"
16711         "stp       x12, x13, [%[a], 192]\n\t"
16712         "sbcs      x10, x10, x8\n\t"
16713         "stp       x11, x10, [%[a], 208]\n\t"
16714         "ldp       x5, x6, [%[m], 224]\n\t"
16715         "ldp       x7, x8, [%[m], 240]\n\t"
16716         "ldp       x12, x13, [x9, 224]\n\t"
16717         "and       x5, x5, x3\n\t"
16718         "ldp       x11, x10, [x9, 240]\n\t"
16719         "and       x6, x6, x3\n\t"
16720         "sbcs      x12, x12, x5\n\t"
16721         "and       x7, x7, x3\n\t"
16722         "sbcs      x13, x13, x6\n\t"
16723         "and       x8, x8, x3\n\t"
16724         "sbcs      x11, x11, x7\n\t"
16725         "stp       x12, x13, [%[a], 224]\n\t"
16726         "sbcs      x10, x10, x8\n\t"
16727         "stp       x11, x10, [%[a], 240]\n\t"
16728         "ldp       x5, x6, [%[m], 256]\n\t"
16729         "ldp       x7, x8, [%[m], 272]\n\t"
16730         "ldp       x12, x13, [x9, 256]\n\t"
16731         "and       x5, x5, x3\n\t"
16732         "ldp       x11, x10, [x9, 272]\n\t"
16733         "and       x6, x6, x3\n\t"
16734         "sbcs      x12, x12, x5\n\t"
16735         "and       x7, x7, x3\n\t"
16736         "sbcs      x13, x13, x6\n\t"
16737         "and       x8, x8, x3\n\t"
16738         "sbcs      x11, x11, x7\n\t"
16739         "stp       x12, x13, [%[a], 256]\n\t"
16740         "sbcs      x10, x10, x8\n\t"
16741         "stp       x11, x10, [%[a], 272]\n\t"
16742         "ldp       x5, x6, [%[m], 288]\n\t"
16743         "ldp       x7, x8, [%[m], 304]\n\t"
16744         "ldp       x12, x13, [x9, 288]\n\t"
16745         "and       x5, x5, x3\n\t"
16746         "ldp       x11, x10, [x9, 304]\n\t"
16747         "and       x6, x6, x3\n\t"
16748         "sbcs      x12, x12, x5\n\t"
16749         "and       x7, x7, x3\n\t"
16750         "sbcs      x13, x13, x6\n\t"
16751         "and       x8, x8, x3\n\t"
16752         "sbcs      x11, x11, x7\n\t"
16753         "stp       x12, x13, [%[a], 288]\n\t"
16754         "sbcs      x10, x10, x8\n\t"
16755         "stp       x11, x10, [%[a], 304]\n\t"
16756         "ldp       x5, x6, [%[m], 320]\n\t"
16757         "ldp       x7, x8, [%[m], 336]\n\t"
16758         "ldp       x12, x13, [x9, 320]\n\t"
16759         "and       x5, x5, x3\n\t"
16760         "ldp       x11, x10, [x9, 336]\n\t"
16761         "and       x6, x6, x3\n\t"
16762         "sbcs      x12, x12, x5\n\t"
16763         "and       x7, x7, x3\n\t"
16764         "sbcs      x13, x13, x6\n\t"
16765         "and       x8, x8, x3\n\t"
16766         "sbcs      x11, x11, x7\n\t"
16767         "stp       x12, x13, [%[a], 320]\n\t"
16768         "sbcs      x10, x10, x8\n\t"
16769         "stp       x11, x10, [%[a], 336]\n\t"
16770         "ldp       x5, x6, [%[m], 352]\n\t"
16771         "ldp       x7, x8, [%[m], 368]\n\t"
16772         "ldp       x12, x13, [x9, 352]\n\t"
16773         "and       x5, x5, x3\n\t"
16774         "ldp       x11, x10, [x9, 368]\n\t"
16775         "and       x6, x6, x3\n\t"
16776         "sbcs      x12, x12, x5\n\t"
16777         "and       x7, x7, x3\n\t"
16778         "sbcs      x13, x13, x6\n\t"
16779         "and       x8, x8, x3\n\t"
16780         "sbcs      x11, x11, x7\n\t"
16781         "stp       x12, x13, [%[a], 352]\n\t"
16782         "sbcs      x10, x10, x8\n\t"
16783         "stp       x11, x10, [%[a], 368]\n\t"
16784         "ldp       x5, x6, [%[m], 384]\n\t"
16785         "ldp       x7, x8, [%[m], 400]\n\t"
16786         "ldp       x12, x13, [x9, 384]\n\t"
16787         "and       x5, x5, x3\n\t"
16788         "ldp       x11, x10, [x9, 400]\n\t"
16789         "and       x6, x6, x3\n\t"
16790         "sbcs      x12, x12, x5\n\t"
16791         "and       x7, x7, x3\n\t"
16792         "sbcs      x13, x13, x6\n\t"
16793         "and       x8, x8, x3\n\t"
16794         "sbcs      x11, x11, x7\n\t"
16795         "stp       x12, x13, [%[a], 384]\n\t"
16796         "sbcs      x10, x10, x8\n\t"
16797         "stp       x11, x10, [%[a], 400]\n\t"
16798         "ldp       x5, x6, [%[m], 416]\n\t"
16799         "ldp       x7, x8, [%[m], 432]\n\t"
16800         "ldp       x12, x13, [x9, 416]\n\t"
16801         "and       x5, x5, x3\n\t"
16802         "ldp       x11, x10, [x9, 432]\n\t"
16803         "and       x6, x6, x3\n\t"
16804         "sbcs      x12, x12, x5\n\t"
16805         "and       x7, x7, x3\n\t"
16806         "sbcs      x13, x13, x6\n\t"
16807         "and       x8, x8, x3\n\t"
16808         "sbcs      x11, x11, x7\n\t"
16809         "stp       x12, x13, [%[a], 416]\n\t"
16810         "sbcs      x10, x10, x8\n\t"
16811         "stp       x11, x10, [%[a], 432]\n\t"
16812         "ldp       x5, x6, [%[m], 448]\n\t"
16813         "ldp       x7, x8, [%[m], 464]\n\t"
16814         "ldp       x12, x13, [x9, 448]\n\t"
16815         "and       x5, x5, x3\n\t"
16816         "ldp       x11, x10, [x9, 464]\n\t"
16817         "and       x6, x6, x3\n\t"
16818         "sbcs      x12, x12, x5\n\t"
16819         "and       x7, x7, x3\n\t"
16820         "sbcs      x13, x13, x6\n\t"
16821         "and       x8, x8, x3\n\t"
16822         "sbcs      x11, x11, x7\n\t"
16823         "stp       x12, x13, [%[a], 448]\n\t"
16824         "sbcs      x10, x10, x8\n\t"
16825         "stp       x11, x10, [%[a], 464]\n\t"
16826         "ldp       x5, x6, [%[m], 480]\n\t"
16827         "ldp       x7, x8, [%[m], 496]\n\t"
16828         "ldp       x12, x13, [x9, 480]\n\t"
16829         "and       x5, x5, x3\n\t"
16830         "ldp       x11, x10, [x9, 496]\n\t"
16831         "and       x6, x6, x3\n\t"
16832         "sbcs      x12, x12, x5\n\t"
16833         "and       x7, x7, x3\n\t"
16834         "sbcs      x13, x13, x6\n\t"
16835         "and       x8, x8, x3\n\t"
16836         "sbcs      x11, x11, x7\n\t"
16837         "stp       x12, x13, [%[a], 480]\n\t"
16838         "sbcs      x10, x10, x8\n\t"
16839         "stp       x11, x10, [%[a], 496]\n\t"
16840         : [a] "+r" (a)
16841         : [m] "r" (m), [mp] "r" (mp)
16842         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
16843     );
16844 
16845 }
16846 
16847 /* Multiply two Montgomery form numbers mod the modulus (prime).
16848  * (r = a * b mod m)
16849  *
16850  * r   Result of multiplication.
16851  * a   First number to multiply in Montgomery form.
16852  * b   Second number to multiply in Montgomery form.
16853  * m   Modulus (prime).
16854  * mp  Montgomery mulitplier.
16855  */
sp_4096_mont_mul_64(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m,sp_digit mp)16856 static void sp_4096_mont_mul_64(sp_digit* r, const sp_digit* a,
16857         const sp_digit* b, const sp_digit* m, sp_digit mp)
16858 {
16859     sp_4096_mul_64(r, a, b);
16860     sp_4096_mont_reduce_64(r, m, mp);
16861 }
16862 
16863 /* Square the Montgomery form number. (r = a * a mod m)
16864  *
16865  * r   Result of squaring.
16866  * a   Number to square in Montgomery form.
16867  * m   Modulus (prime).
16868  * mp  Montgomery mulitplier.
16869  */
sp_4096_mont_sqr_64(sp_digit * r,const sp_digit * a,const sp_digit * m,sp_digit mp)16870 static void sp_4096_mont_sqr_64(sp_digit* r, const sp_digit* a,
16871         const sp_digit* m, sp_digit mp)
16872 {
16873     sp_4096_sqr_64(r, a);
16874     sp_4096_mont_reduce_64(r, m, mp);
16875 }
16876 
16877 #ifdef WOLFSSL_SP_SMALL
16878 /* Sub b from a into r. (r = a - b)
16879  *
16880  * r  A single precision integer.
16881  * a  A single precision integer.
16882  * b  A single precision integer.
16883  */
sp_4096_sub_64(sp_digit * r,const sp_digit * a,const sp_digit * b)16884 static sp_digit sp_4096_sub_64(sp_digit* r, const sp_digit* a,
16885         const sp_digit* b)
16886 {
16887     sp_digit c = 0;
16888 
16889     __asm__ __volatile__ (
16890         "add	x11, %[a], 512\n\t"
16891         "\n1:\n\t"
16892         "subs	%[c], xzr, %[c]\n\t"
16893         "ldp	x3, x4, [%[a]], #16\n\t"
16894         "ldp	x5, x6, [%[a]], #16\n\t"
16895         "ldp	x7, x8, [%[b]], #16\n\t"
16896         "sbcs	x3, x3, x7\n\t"
16897         "ldp	x9, x10, [%[b]], #16\n\t"
16898         "sbcs	x4, x4, x8\n\t"
16899         "sbcs	x5, x5, x9\n\t"
16900         "stp	x3, x4, [%[r]], #16\n\t"
16901         "sbcs	x6, x6, x10\n\t"
16902         "stp	x5, x6, [%[r]], #16\n\t"
16903         "csetm	%[c], cc\n\t"
16904         "cmp	%[a], x11\n\t"
16905         "b.ne	1b\n\t"
16906         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
16907         :
16908         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
16909     );
16910 
16911     return c;
16912 }
16913 
16914 #else
16915 /* Sub b from a into r. (r = a - b)
16916  *
16917  * r  A single precision integer.
16918  * a  A single precision integer.
16919  * b  A single precision integer.
16920  */
sp_4096_sub_64(sp_digit * r,const sp_digit * a,const sp_digit * b)16921 static sp_digit sp_4096_sub_64(sp_digit* r, const sp_digit* a,
16922         const sp_digit* b)
16923 {
16924     __asm__ __volatile__ (
16925         "ldp	x3, x4, [%[a], 0]\n\t"
16926         "ldp	x7, x8, [%[b], 0]\n\t"
16927         "subs	x3, x3, x7\n\t"
16928         "ldp	x5, x6, [%[a], 16]\n\t"
16929         "sbcs	x4, x4, x8\n\t"
16930         "ldp	x9, x10, [%[b], 16]\n\t"
16931         "sbcs	x5, x5, x9\n\t"
16932         "stp	x3, x4, [%[r], 0]\n\t"
16933         "sbcs	x6, x6, x10\n\t"
16934         "stp	x5, x6, [%[r], 16]\n\t"
16935         "ldp	x3, x4, [%[a], 32]\n\t"
16936         "ldp	x7, x8, [%[b], 32]\n\t"
16937         "sbcs	x3, x3, x7\n\t"
16938         "ldp	x5, x6, [%[a], 48]\n\t"
16939         "sbcs	x4, x4, x8\n\t"
16940         "ldp	x9, x10, [%[b], 48]\n\t"
16941         "sbcs	x5, x5, x9\n\t"
16942         "stp	x3, x4, [%[r], 32]\n\t"
16943         "sbcs	x6, x6, x10\n\t"
16944         "stp	x5, x6, [%[r], 48]\n\t"
16945         "ldp	x3, x4, [%[a], 64]\n\t"
16946         "ldp	x7, x8, [%[b], 64]\n\t"
16947         "sbcs	x3, x3, x7\n\t"
16948         "ldp	x5, x6, [%[a], 80]\n\t"
16949         "sbcs	x4, x4, x8\n\t"
16950         "ldp	x9, x10, [%[b], 80]\n\t"
16951         "sbcs	x5, x5, x9\n\t"
16952         "stp	x3, x4, [%[r], 64]\n\t"
16953         "sbcs	x6, x6, x10\n\t"
16954         "stp	x5, x6, [%[r], 80]\n\t"
16955         "ldp	x3, x4, [%[a], 96]\n\t"
16956         "ldp	x7, x8, [%[b], 96]\n\t"
16957         "sbcs	x3, x3, x7\n\t"
16958         "ldp	x5, x6, [%[a], 112]\n\t"
16959         "sbcs	x4, x4, x8\n\t"
16960         "ldp	x9, x10, [%[b], 112]\n\t"
16961         "sbcs	x5, x5, x9\n\t"
16962         "stp	x3, x4, [%[r], 96]\n\t"
16963         "sbcs	x6, x6, x10\n\t"
16964         "stp	x5, x6, [%[r], 112]\n\t"
16965         "ldp	x3, x4, [%[a], 128]\n\t"
16966         "ldp	x7, x8, [%[b], 128]\n\t"
16967         "sbcs	x3, x3, x7\n\t"
16968         "ldp	x5, x6, [%[a], 144]\n\t"
16969         "sbcs	x4, x4, x8\n\t"
16970         "ldp	x9, x10, [%[b], 144]\n\t"
16971         "sbcs	x5, x5, x9\n\t"
16972         "stp	x3, x4, [%[r], 128]\n\t"
16973         "sbcs	x6, x6, x10\n\t"
16974         "stp	x5, x6, [%[r], 144]\n\t"
16975         "ldp	x3, x4, [%[a], 160]\n\t"
16976         "ldp	x7, x8, [%[b], 160]\n\t"
16977         "sbcs	x3, x3, x7\n\t"
16978         "ldp	x5, x6, [%[a], 176]\n\t"
16979         "sbcs	x4, x4, x8\n\t"
16980         "ldp	x9, x10, [%[b], 176]\n\t"
16981         "sbcs	x5, x5, x9\n\t"
16982         "stp	x3, x4, [%[r], 160]\n\t"
16983         "sbcs	x6, x6, x10\n\t"
16984         "stp	x5, x6, [%[r], 176]\n\t"
16985         "ldp	x3, x4, [%[a], 192]\n\t"
16986         "ldp	x7, x8, [%[b], 192]\n\t"
16987         "sbcs	x3, x3, x7\n\t"
16988         "ldp	x5, x6, [%[a], 208]\n\t"
16989         "sbcs	x4, x4, x8\n\t"
16990         "ldp	x9, x10, [%[b], 208]\n\t"
16991         "sbcs	x5, x5, x9\n\t"
16992         "stp	x3, x4, [%[r], 192]\n\t"
16993         "sbcs	x6, x6, x10\n\t"
16994         "stp	x5, x6, [%[r], 208]\n\t"
16995         "ldp	x3, x4, [%[a], 224]\n\t"
16996         "ldp	x7, x8, [%[b], 224]\n\t"
16997         "sbcs	x3, x3, x7\n\t"
16998         "ldp	x5, x6, [%[a], 240]\n\t"
16999         "sbcs	x4, x4, x8\n\t"
17000         "ldp	x9, x10, [%[b], 240]\n\t"
17001         "sbcs	x5, x5, x9\n\t"
17002         "stp	x3, x4, [%[r], 224]\n\t"
17003         "sbcs	x6, x6, x10\n\t"
17004         "stp	x5, x6, [%[r], 240]\n\t"
17005         "ldp	x3, x4, [%[a], 256]\n\t"
17006         "ldp	x7, x8, [%[b], 256]\n\t"
17007         "sbcs	x3, x3, x7\n\t"
17008         "ldp	x5, x6, [%[a], 272]\n\t"
17009         "sbcs	x4, x4, x8\n\t"
17010         "ldp	x9, x10, [%[b], 272]\n\t"
17011         "sbcs	x5, x5, x9\n\t"
17012         "stp	x3, x4, [%[r], 256]\n\t"
17013         "sbcs	x6, x6, x10\n\t"
17014         "stp	x5, x6, [%[r], 272]\n\t"
17015         "ldp	x3, x4, [%[a], 288]\n\t"
17016         "ldp	x7, x8, [%[b], 288]\n\t"
17017         "sbcs	x3, x3, x7\n\t"
17018         "ldp	x5, x6, [%[a], 304]\n\t"
17019         "sbcs	x4, x4, x8\n\t"
17020         "ldp	x9, x10, [%[b], 304]\n\t"
17021         "sbcs	x5, x5, x9\n\t"
17022         "stp	x3, x4, [%[r], 288]\n\t"
17023         "sbcs	x6, x6, x10\n\t"
17024         "stp	x5, x6, [%[r], 304]\n\t"
17025         "ldp	x3, x4, [%[a], 320]\n\t"
17026         "ldp	x7, x8, [%[b], 320]\n\t"
17027         "sbcs	x3, x3, x7\n\t"
17028         "ldp	x5, x6, [%[a], 336]\n\t"
17029         "sbcs	x4, x4, x8\n\t"
17030         "ldp	x9, x10, [%[b], 336]\n\t"
17031         "sbcs	x5, x5, x9\n\t"
17032         "stp	x3, x4, [%[r], 320]\n\t"
17033         "sbcs	x6, x6, x10\n\t"
17034         "stp	x5, x6, [%[r], 336]\n\t"
17035         "ldp	x3, x4, [%[a], 352]\n\t"
17036         "ldp	x7, x8, [%[b], 352]\n\t"
17037         "sbcs	x3, x3, x7\n\t"
17038         "ldp	x5, x6, [%[a], 368]\n\t"
17039         "sbcs	x4, x4, x8\n\t"
17040         "ldp	x9, x10, [%[b], 368]\n\t"
17041         "sbcs	x5, x5, x9\n\t"
17042         "stp	x3, x4, [%[r], 352]\n\t"
17043         "sbcs	x6, x6, x10\n\t"
17044         "stp	x5, x6, [%[r], 368]\n\t"
17045         "ldp	x3, x4, [%[a], 384]\n\t"
17046         "ldp	x7, x8, [%[b], 384]\n\t"
17047         "sbcs	x3, x3, x7\n\t"
17048         "ldp	x5, x6, [%[a], 400]\n\t"
17049         "sbcs	x4, x4, x8\n\t"
17050         "ldp	x9, x10, [%[b], 400]\n\t"
17051         "sbcs	x5, x5, x9\n\t"
17052         "stp	x3, x4, [%[r], 384]\n\t"
17053         "sbcs	x6, x6, x10\n\t"
17054         "stp	x5, x6, [%[r], 400]\n\t"
17055         "ldp	x3, x4, [%[a], 416]\n\t"
17056         "ldp	x7, x8, [%[b], 416]\n\t"
17057         "sbcs	x3, x3, x7\n\t"
17058         "ldp	x5, x6, [%[a], 432]\n\t"
17059         "sbcs	x4, x4, x8\n\t"
17060         "ldp	x9, x10, [%[b], 432]\n\t"
17061         "sbcs	x5, x5, x9\n\t"
17062         "stp	x3, x4, [%[r], 416]\n\t"
17063         "sbcs	x6, x6, x10\n\t"
17064         "stp	x5, x6, [%[r], 432]\n\t"
17065         "ldp	x3, x4, [%[a], 448]\n\t"
17066         "ldp	x7, x8, [%[b], 448]\n\t"
17067         "sbcs	x3, x3, x7\n\t"
17068         "ldp	x5, x6, [%[a], 464]\n\t"
17069         "sbcs	x4, x4, x8\n\t"
17070         "ldp	x9, x10, [%[b], 464]\n\t"
17071         "sbcs	x5, x5, x9\n\t"
17072         "stp	x3, x4, [%[r], 448]\n\t"
17073         "sbcs	x6, x6, x10\n\t"
17074         "stp	x5, x6, [%[r], 464]\n\t"
17075         "ldp	x3, x4, [%[a], 480]\n\t"
17076         "ldp	x7, x8, [%[b], 480]\n\t"
17077         "sbcs	x3, x3, x7\n\t"
17078         "ldp	x5, x6, [%[a], 496]\n\t"
17079         "sbcs	x4, x4, x8\n\t"
17080         "ldp	x9, x10, [%[b], 496]\n\t"
17081         "sbcs	x5, x5, x9\n\t"
17082         "stp	x3, x4, [%[r], 480]\n\t"
17083         "sbcs	x6, x6, x10\n\t"
17084         "stp	x5, x6, [%[r], 496]\n\t"
17085         "csetm	%[r], cc\n\t"
17086         : [r] "+r" (r)
17087         : [a] "r" (a), [b] "r" (b)
17088         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
17089     );
17090 
17091     return (sp_digit)r;
17092 }
17093 
17094 #endif /* WOLFSSL_SP_SMALL */
17095 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
17096  *
17097  * d1   The high order half of the number to divide.
17098  * d0   The low order half of the number to divide.
17099  * div  The dividend.
17100  * returns the result of the division.
17101  */
div_4096_word_64(sp_digit d1,sp_digit d0,sp_digit div)17102 static sp_digit div_4096_word_64(sp_digit d1, sp_digit d0, sp_digit div)
17103 {
17104     sp_digit r;
17105 
17106     __asm__ __volatile__ (
17107         "lsr	x5, %[div], 32\n\t"
17108         "add	x5, x5, 1\n\t"
17109 
17110         "udiv	x3, %[d1], x5\n\t"
17111         "lsl	x6, x3, 32\n\t"
17112         "mul	x4, %[div], x6\n\t"
17113         "umulh	x3, %[div], x6\n\t"
17114         "subs	%[d0], %[d0], x4\n\t"
17115         "sbc	%[d1], %[d1], x3\n\t"
17116 
17117         "udiv	x3, %[d1], x5\n\t"
17118         "lsl	x3, x3, 32\n\t"
17119         "add	x6, x6, x3\n\t"
17120         "mul	x4, %[div], x3\n\t"
17121         "umulh	x3, %[div], x3\n\t"
17122         "subs	%[d0], %[d0], x4\n\t"
17123         "sbc	%[d1], %[d1], x3\n\t"
17124 
17125         "lsr	x3, %[d0], 32\n\t"
17126         "orr	x3, x3, %[d1], lsl 32\n\t"
17127 
17128         "udiv	x3, x3, x5\n\t"
17129         "add	x6, x6, x3\n\t"
17130         "mul	x4, %[div], x3\n\t"
17131         "umulh	x3, %[div], x3\n\t"
17132         "subs	%[d0], %[d0], x4\n\t"
17133         "sbc	%[d1], %[d1], x3\n\t"
17134 
17135         "lsr	x3, %[d0], 32\n\t"
17136         "orr	x3, x3, %[d1], lsl 32\n\t"
17137 
17138         "udiv	x3, x3, x5\n\t"
17139         "add	x6, x6, x3\n\t"
17140         "mul	x4, %[div], x3\n\t"
17141         "sub	%[d0], %[d0], x4\n\t"
17142 
17143         "udiv	x3, %[d0], %[div]\n\t"
17144         "add	%[r], x6, x3\n\t"
17145 
17146         : [r] "=r" (r)
17147         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
17148         : "x3", "x4", "x5", "x6"
17149     );
17150 
17151     return r;
17152 }
17153 
17154 /* Divide d in a and put remainder into r (m*d + r = a)
17155  * m is not calculated as it is not needed at this time.
17156  *
17157  * a  Number to be divided.
17158  * d  Number to divide with.
17159  * m  Multiplier result.
17160  * r  Remainder from the division.
17161  * returns MP_OKAY indicating success.
17162  */
sp_4096_div_64_cond(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)17163 static WC_INLINE int sp_4096_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
17164         sp_digit* r)
17165 {
17166     sp_digit t1[128], t2[65];
17167     sp_digit div, r1;
17168     int i;
17169 
17170     (void)m;
17171 
17172     div = d[63];
17173     XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
17174     for (i=63; i>=0; i--) {
17175         sp_digit hi = t1[64 + i] - (t1[64 + i] == div);
17176         r1 = div_4096_word_64(hi, t1[64 + i - 1], div);
17177 
17178         sp_4096_mul_d_64(t2, d, r1);
17179         t1[64 + i] += sp_4096_sub_in_place_64(&t1[i], t2);
17180         t1[64 + i] -= t2[64];
17181         if (t1[64 + i] != 0) {
17182             t1[64 + i] += sp_4096_add_64(&t1[i], &t1[i], d);
17183             if (t1[64 + i] != 0)
17184                 t1[64 + i] += sp_4096_add_64(&t1[i], &t1[i], d);
17185         }
17186     }
17187 
17188     for (i = 63; i > 0; i--) {
17189         if (t1[i] != d[i])
17190             break;
17191     }
17192     if (t1[i] >= d[i]) {
17193         sp_4096_sub_64(r, t1, d);
17194     }
17195     else {
17196         XMEMCPY(r, t1, sizeof(*t1) * 64);
17197     }
17198 
17199     return MP_OKAY;
17200 }
17201 
17202 /* Reduce a modulo m into r. (r = a mod m)
17203  *
17204  * r  A single precision number that is the reduced result.
17205  * a  A single precision number that is to be reduced.
17206  * m  A single precision number that is the modulus to reduce with.
17207  * returns MP_OKAY indicating success.
17208  */
sp_4096_mod_64_cond(sp_digit * r,const sp_digit * a,const sp_digit * m)17209 static WC_INLINE int sp_4096_mod_64_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
17210 {
17211     return sp_4096_div_64_cond(a, m, NULL, r);
17212 }
17213 
17214 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
17215 /* Conditionally subtract b from a using the mask m.
17216  * m is -1 to subtract and 0 when not copying.
17217  *
17218  * r  A single precision number representing condition subtract result.
17219  * a  A single precision number to subtract from.
17220  * b  A single precision number to subtract.
17221  * m  Mask value to apply.
17222  */
sp_4096_cond_sub_64(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)17223 static sp_digit sp_4096_cond_sub_64(sp_digit* r, const sp_digit* a, const sp_digit* b,
17224         sp_digit m)
17225 {
17226 #ifdef WOLFSSL_SP_SMALL
17227     sp_digit c = 0;
17228 
17229     __asm__ __volatile__ (
17230         "mov	x8, #0\n\t"
17231         "1:\n\t"
17232         "subs	%[c], xzr, %[c]\n\t"
17233         "ldr	x4, [%[a], x8]\n\t"
17234         "ldr	x5, [%[b], x8]\n\t"
17235         "and	x5, x5, %[m]\n\t"
17236         "sbcs	x4, x4, x5\n\t"
17237         "csetm	%[c], cc\n\t"
17238         "str	x4, [%[r], x8]\n\t"
17239         "add	x8, x8, #8\n\t"
17240         "cmp	x8, 512\n\t"
17241         "b.lt	1b\n\t"
17242         : [c] "+r" (c)
17243         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
17244         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
17245     );
17246 
17247     return c;
17248 #else
17249     __asm__ __volatile__ (
17250 
17251         "ldp	x5, x7, [%[b], 0]\n\t"
17252         "ldp	x11, x12, [%[b], 16]\n\t"
17253         "ldp	x4, x6, [%[a], 0]\n\t"
17254         "and	x5, x5, %[m]\n\t"
17255         "ldp	x9, x10, [%[a], 16]\n\t"
17256         "and	x7, x7, %[m]\n\t"
17257         "subs	x4, x4, x5\n\t"
17258         "and	x11, x11, %[m]\n\t"
17259         "sbcs	x6, x6, x7\n\t"
17260         "and	x12, x12, %[m]\n\t"
17261         "sbcs	x9, x9, x11\n\t"
17262         "stp	x4, x6, [%[r], 0]\n\t"
17263         "sbcs	x10, x10, x12\n\t"
17264         "stp	x9, x10, [%[r], 16]\n\t"
17265         "ldp	x5, x7, [%[b], 32]\n\t"
17266         "ldp	x11, x12, [%[b], 48]\n\t"
17267         "ldp	x4, x6, [%[a], 32]\n\t"
17268         "and	x5, x5, %[m]\n\t"
17269         "ldp	x9, x10, [%[a], 48]\n\t"
17270         "and	x7, x7, %[m]\n\t"
17271         "sbcs	x4, x4, x5\n\t"
17272         "and	x11, x11, %[m]\n\t"
17273         "sbcs	x6, x6, x7\n\t"
17274         "and	x12, x12, %[m]\n\t"
17275         "sbcs	x9, x9, x11\n\t"
17276         "stp	x4, x6, [%[r], 32]\n\t"
17277         "sbcs	x10, x10, x12\n\t"
17278         "stp	x9, x10, [%[r], 48]\n\t"
17279         "ldp	x5, x7, [%[b], 64]\n\t"
17280         "ldp	x11, x12, [%[b], 80]\n\t"
17281         "ldp	x4, x6, [%[a], 64]\n\t"
17282         "and	x5, x5, %[m]\n\t"
17283         "ldp	x9, x10, [%[a], 80]\n\t"
17284         "and	x7, x7, %[m]\n\t"
17285         "sbcs	x4, x4, x5\n\t"
17286         "and	x11, x11, %[m]\n\t"
17287         "sbcs	x6, x6, x7\n\t"
17288         "and	x12, x12, %[m]\n\t"
17289         "sbcs	x9, x9, x11\n\t"
17290         "stp	x4, x6, [%[r], 64]\n\t"
17291         "sbcs	x10, x10, x12\n\t"
17292         "stp	x9, x10, [%[r], 80]\n\t"
17293         "ldp	x5, x7, [%[b], 96]\n\t"
17294         "ldp	x11, x12, [%[b], 112]\n\t"
17295         "ldp	x4, x6, [%[a], 96]\n\t"
17296         "and	x5, x5, %[m]\n\t"
17297         "ldp	x9, x10, [%[a], 112]\n\t"
17298         "and	x7, x7, %[m]\n\t"
17299         "sbcs	x4, x4, x5\n\t"
17300         "and	x11, x11, %[m]\n\t"
17301         "sbcs	x6, x6, x7\n\t"
17302         "and	x12, x12, %[m]\n\t"
17303         "sbcs	x9, x9, x11\n\t"
17304         "stp	x4, x6, [%[r], 96]\n\t"
17305         "sbcs	x10, x10, x12\n\t"
17306         "stp	x9, x10, [%[r], 112]\n\t"
17307         "ldp	x5, x7, [%[b], 128]\n\t"
17308         "ldp	x11, x12, [%[b], 144]\n\t"
17309         "ldp	x4, x6, [%[a], 128]\n\t"
17310         "and	x5, x5, %[m]\n\t"
17311         "ldp	x9, x10, [%[a], 144]\n\t"
17312         "and	x7, x7, %[m]\n\t"
17313         "sbcs	x4, x4, x5\n\t"
17314         "and	x11, x11, %[m]\n\t"
17315         "sbcs	x6, x6, x7\n\t"
17316         "and	x12, x12, %[m]\n\t"
17317         "sbcs	x9, x9, x11\n\t"
17318         "stp	x4, x6, [%[r], 128]\n\t"
17319         "sbcs	x10, x10, x12\n\t"
17320         "stp	x9, x10, [%[r], 144]\n\t"
17321         "ldp	x5, x7, [%[b], 160]\n\t"
17322         "ldp	x11, x12, [%[b], 176]\n\t"
17323         "ldp	x4, x6, [%[a], 160]\n\t"
17324         "and	x5, x5, %[m]\n\t"
17325         "ldp	x9, x10, [%[a], 176]\n\t"
17326         "and	x7, x7, %[m]\n\t"
17327         "sbcs	x4, x4, x5\n\t"
17328         "and	x11, x11, %[m]\n\t"
17329         "sbcs	x6, x6, x7\n\t"
17330         "and	x12, x12, %[m]\n\t"
17331         "sbcs	x9, x9, x11\n\t"
17332         "stp	x4, x6, [%[r], 160]\n\t"
17333         "sbcs	x10, x10, x12\n\t"
17334         "stp	x9, x10, [%[r], 176]\n\t"
17335         "ldp	x5, x7, [%[b], 192]\n\t"
17336         "ldp	x11, x12, [%[b], 208]\n\t"
17337         "ldp	x4, x6, [%[a], 192]\n\t"
17338         "and	x5, x5, %[m]\n\t"
17339         "ldp	x9, x10, [%[a], 208]\n\t"
17340         "and	x7, x7, %[m]\n\t"
17341         "sbcs	x4, x4, x5\n\t"
17342         "and	x11, x11, %[m]\n\t"
17343         "sbcs	x6, x6, x7\n\t"
17344         "and	x12, x12, %[m]\n\t"
17345         "sbcs	x9, x9, x11\n\t"
17346         "stp	x4, x6, [%[r], 192]\n\t"
17347         "sbcs	x10, x10, x12\n\t"
17348         "stp	x9, x10, [%[r], 208]\n\t"
17349         "ldp	x5, x7, [%[b], 224]\n\t"
17350         "ldp	x11, x12, [%[b], 240]\n\t"
17351         "ldp	x4, x6, [%[a], 224]\n\t"
17352         "and	x5, x5, %[m]\n\t"
17353         "ldp	x9, x10, [%[a], 240]\n\t"
17354         "and	x7, x7, %[m]\n\t"
17355         "sbcs	x4, x4, x5\n\t"
17356         "and	x11, x11, %[m]\n\t"
17357         "sbcs	x6, x6, x7\n\t"
17358         "and	x12, x12, %[m]\n\t"
17359         "sbcs	x9, x9, x11\n\t"
17360         "stp	x4, x6, [%[r], 224]\n\t"
17361         "sbcs	x10, x10, x12\n\t"
17362         "stp	x9, x10, [%[r], 240]\n\t"
17363         "ldp	x5, x7, [%[b], 256]\n\t"
17364         "ldp	x11, x12, [%[b], 272]\n\t"
17365         "ldp	x4, x6, [%[a], 256]\n\t"
17366         "and	x5, x5, %[m]\n\t"
17367         "ldp	x9, x10, [%[a], 272]\n\t"
17368         "and	x7, x7, %[m]\n\t"
17369         "sbcs	x4, x4, x5\n\t"
17370         "and	x11, x11, %[m]\n\t"
17371         "sbcs	x6, x6, x7\n\t"
17372         "and	x12, x12, %[m]\n\t"
17373         "sbcs	x9, x9, x11\n\t"
17374         "stp	x4, x6, [%[r], 256]\n\t"
17375         "sbcs	x10, x10, x12\n\t"
17376         "stp	x9, x10, [%[r], 272]\n\t"
17377         "ldp	x5, x7, [%[b], 288]\n\t"
17378         "ldp	x11, x12, [%[b], 304]\n\t"
17379         "ldp	x4, x6, [%[a], 288]\n\t"
17380         "and	x5, x5, %[m]\n\t"
17381         "ldp	x9, x10, [%[a], 304]\n\t"
17382         "and	x7, x7, %[m]\n\t"
17383         "sbcs	x4, x4, x5\n\t"
17384         "and	x11, x11, %[m]\n\t"
17385         "sbcs	x6, x6, x7\n\t"
17386         "and	x12, x12, %[m]\n\t"
17387         "sbcs	x9, x9, x11\n\t"
17388         "stp	x4, x6, [%[r], 288]\n\t"
17389         "sbcs	x10, x10, x12\n\t"
17390         "stp	x9, x10, [%[r], 304]\n\t"
17391         "ldp	x5, x7, [%[b], 320]\n\t"
17392         "ldp	x11, x12, [%[b], 336]\n\t"
17393         "ldp	x4, x6, [%[a], 320]\n\t"
17394         "and	x5, x5, %[m]\n\t"
17395         "ldp	x9, x10, [%[a], 336]\n\t"
17396         "and	x7, x7, %[m]\n\t"
17397         "sbcs	x4, x4, x5\n\t"
17398         "and	x11, x11, %[m]\n\t"
17399         "sbcs	x6, x6, x7\n\t"
17400         "and	x12, x12, %[m]\n\t"
17401         "sbcs	x9, x9, x11\n\t"
17402         "stp	x4, x6, [%[r], 320]\n\t"
17403         "sbcs	x10, x10, x12\n\t"
17404         "stp	x9, x10, [%[r], 336]\n\t"
17405         "ldp	x5, x7, [%[b], 352]\n\t"
17406         "ldp	x11, x12, [%[b], 368]\n\t"
17407         "ldp	x4, x6, [%[a], 352]\n\t"
17408         "and	x5, x5, %[m]\n\t"
17409         "ldp	x9, x10, [%[a], 368]\n\t"
17410         "and	x7, x7, %[m]\n\t"
17411         "sbcs	x4, x4, x5\n\t"
17412         "and	x11, x11, %[m]\n\t"
17413         "sbcs	x6, x6, x7\n\t"
17414         "and	x12, x12, %[m]\n\t"
17415         "sbcs	x9, x9, x11\n\t"
17416         "stp	x4, x6, [%[r], 352]\n\t"
17417         "sbcs	x10, x10, x12\n\t"
17418         "stp	x9, x10, [%[r], 368]\n\t"
17419         "ldp	x5, x7, [%[b], 384]\n\t"
17420         "ldp	x11, x12, [%[b], 400]\n\t"
17421         "ldp	x4, x6, [%[a], 384]\n\t"
17422         "and	x5, x5, %[m]\n\t"
17423         "ldp	x9, x10, [%[a], 400]\n\t"
17424         "and	x7, x7, %[m]\n\t"
17425         "sbcs	x4, x4, x5\n\t"
17426         "and	x11, x11, %[m]\n\t"
17427         "sbcs	x6, x6, x7\n\t"
17428         "and	x12, x12, %[m]\n\t"
17429         "sbcs	x9, x9, x11\n\t"
17430         "stp	x4, x6, [%[r], 384]\n\t"
17431         "sbcs	x10, x10, x12\n\t"
17432         "stp	x9, x10, [%[r], 400]\n\t"
17433         "ldp	x5, x7, [%[b], 416]\n\t"
17434         "ldp	x11, x12, [%[b], 432]\n\t"
17435         "ldp	x4, x6, [%[a], 416]\n\t"
17436         "and	x5, x5, %[m]\n\t"
17437         "ldp	x9, x10, [%[a], 432]\n\t"
17438         "and	x7, x7, %[m]\n\t"
17439         "sbcs	x4, x4, x5\n\t"
17440         "and	x11, x11, %[m]\n\t"
17441         "sbcs	x6, x6, x7\n\t"
17442         "and	x12, x12, %[m]\n\t"
17443         "sbcs	x9, x9, x11\n\t"
17444         "stp	x4, x6, [%[r], 416]\n\t"
17445         "sbcs	x10, x10, x12\n\t"
17446         "stp	x9, x10, [%[r], 432]\n\t"
17447         "ldp	x5, x7, [%[b], 448]\n\t"
17448         "ldp	x11, x12, [%[b], 464]\n\t"
17449         "ldp	x4, x6, [%[a], 448]\n\t"
17450         "and	x5, x5, %[m]\n\t"
17451         "ldp	x9, x10, [%[a], 464]\n\t"
17452         "and	x7, x7, %[m]\n\t"
17453         "sbcs	x4, x4, x5\n\t"
17454         "and	x11, x11, %[m]\n\t"
17455         "sbcs	x6, x6, x7\n\t"
17456         "and	x12, x12, %[m]\n\t"
17457         "sbcs	x9, x9, x11\n\t"
17458         "stp	x4, x6, [%[r], 448]\n\t"
17459         "sbcs	x10, x10, x12\n\t"
17460         "stp	x9, x10, [%[r], 464]\n\t"
17461         "ldp	x5, x7, [%[b], 480]\n\t"
17462         "ldp	x11, x12, [%[b], 496]\n\t"
17463         "ldp	x4, x6, [%[a], 480]\n\t"
17464         "and	x5, x5, %[m]\n\t"
17465         "ldp	x9, x10, [%[a], 496]\n\t"
17466         "and	x7, x7, %[m]\n\t"
17467         "sbcs	x4, x4, x5\n\t"
17468         "and	x11, x11, %[m]\n\t"
17469         "sbcs	x6, x6, x7\n\t"
17470         "and	x12, x12, %[m]\n\t"
17471         "sbcs	x9, x9, x11\n\t"
17472         "stp	x4, x6, [%[r], 480]\n\t"
17473         "sbcs	x10, x10, x12\n\t"
17474         "stp	x9, x10, [%[r], 496]\n\t"
17475         "csetm	%[r], cc\n\t"
17476         : [r] "+r" (r)
17477         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
17478         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
17479     );
17480 
17481     return (sp_digit)r;
17482 #endif /* WOLFSSL_SP_SMALL */
17483 }
17484 
17485 /* AND m into each word of a and store in r.
17486  *
17487  * r  A single precision integer.
17488  * a  A single precision integer.
17489  * m  Mask to AND against each digit.
17490  */
sp_4096_mask_64(sp_digit * r,const sp_digit * a,sp_digit m)17491 static void sp_4096_mask_64(sp_digit* r, const sp_digit* a, sp_digit m)
17492 {
17493 #ifdef WOLFSSL_SP_SMALL
17494     int i;
17495 
17496     for (i=0; i<64; i++) {
17497         r[i] = a[i] & m;
17498     }
17499 #else
17500     int i;
17501 
17502     for (i = 0; i < 64; i += 8) {
17503         r[i+0] = a[i+0] & m;
17504         r[i+1] = a[i+1] & m;
17505         r[i+2] = a[i+2] & m;
17506         r[i+3] = a[i+3] & m;
17507         r[i+4] = a[i+4] & m;
17508         r[i+5] = a[i+5] & m;
17509         r[i+6] = a[i+6] & m;
17510         r[i+7] = a[i+7] & m;
17511     }
17512 #endif
17513 }
17514 
17515 /* Compare a with b in constant time.
17516  *
17517  * a  A single precision integer.
17518  * b  A single precision integer.
17519  * return -ve, 0 or +ve if a is less than, equal to or greater than b
17520  * respectively.
17521  */
sp_4096_cmp_64(const sp_digit * a,const sp_digit * b)17522 static sp_int64 sp_4096_cmp_64(const sp_digit* a, const sp_digit* b)
17523 {
17524 #ifdef WOLFSSL_SP_SMALL
17525     __asm__ __volatile__ (
17526         "mov	x2, -1\n\t"
17527         "mov	x3, 1\n\t"
17528         "mov	x4, -1\n\t"
17529         "mov	x5, 504\n\t"
17530         "1:\n\t"
17531         "ldr	x6, [%[a], x5]\n\t"
17532         "ldr	x7, [%[b], x5]\n\t"
17533         "and	x6, x6, x4\n\t"
17534         "and	x7, x7, x4\n\t"
17535         "subs	x6, x6, x7\n\t"
17536         "csel	x2, x3, x2, hi\n\t"
17537         "csel	x2, x4, x2, lo\n\t"
17538         "csel	x4, x4, xzr, eq\n\t"
17539         "subs	x5, x5, #8\n\t"
17540         "b.cs	1b\n\t"
17541         "eor	%[a], x2, x4\n\t"
17542         : [a] "+r" (a)
17543         : [b] "r" (b)
17544         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
17545     );
17546 #else
17547     __asm__ __volatile__ (
17548         "mov	x2, -1\n\t"
17549         "mov	x3, 1\n\t"
17550         "mov  x4, -1\n\t"
17551         "ldp	x5, x6, [%[a], 496]\n\t"
17552         "ldp	x7, x8, [%[b], 496]\n\t"
17553         "and	x6, x6, x4\n\t"
17554         "and	x8, x8, x4\n\t"
17555         "subs	x6, x6, x8\n\t"
17556         "csel	x2, x4, x2, lo\n\t"
17557         "csel	x4, x4, xzr, eq\n\t"
17558         "csel	x2, x3, x2, hi\n\t"
17559         "and	x5, x5, x4\n\t"
17560         "and	x7, x7, x4\n\t"
17561         "subs	x5, x5, x7\n\t"
17562         "csel	x2, x4, x2, lo\n\t"
17563         "csel	x4, x4, xzr, eq\n\t"
17564         "csel	x2, x3, x2, hi\n\t"
17565         "ldp	x5, x6, [%[a], 480]\n\t"
17566         "ldp	x7, x8, [%[b], 480]\n\t"
17567         "and	x6, x6, x4\n\t"
17568         "and	x8, x8, x4\n\t"
17569         "subs	x6, x6, x8\n\t"
17570         "csel	x2, x4, x2, lo\n\t"
17571         "csel	x4, x4, xzr, eq\n\t"
17572         "csel	x2, x3, x2, hi\n\t"
17573         "and	x5, x5, x4\n\t"
17574         "and	x7, x7, x4\n\t"
17575         "subs	x5, x5, x7\n\t"
17576         "csel	x2, x4, x2, lo\n\t"
17577         "csel	x4, x4, xzr, eq\n\t"
17578         "csel	x2, x3, x2, hi\n\t"
17579         "ldp	x5, x6, [%[a], 464]\n\t"
17580         "ldp	x7, x8, [%[b], 464]\n\t"
17581         "and	x6, x6, x4\n\t"
17582         "and	x8, x8, x4\n\t"
17583         "subs	x6, x6, x8\n\t"
17584         "csel	x2, x4, x2, lo\n\t"
17585         "csel	x4, x4, xzr, eq\n\t"
17586         "csel	x2, x3, x2, hi\n\t"
17587         "and	x5, x5, x4\n\t"
17588         "and	x7, x7, x4\n\t"
17589         "subs	x5, x5, x7\n\t"
17590         "csel	x2, x4, x2, lo\n\t"
17591         "csel	x4, x4, xzr, eq\n\t"
17592         "csel	x2, x3, x2, hi\n\t"
17593         "ldp	x5, x6, [%[a], 448]\n\t"
17594         "ldp	x7, x8, [%[b], 448]\n\t"
17595         "and	x6, x6, x4\n\t"
17596         "and	x8, x8, x4\n\t"
17597         "subs	x6, x6, x8\n\t"
17598         "csel	x2, x4, x2, lo\n\t"
17599         "csel	x4, x4, xzr, eq\n\t"
17600         "csel	x2, x3, x2, hi\n\t"
17601         "and	x5, x5, x4\n\t"
17602         "and	x7, x7, x4\n\t"
17603         "subs	x5, x5, x7\n\t"
17604         "csel	x2, x4, x2, lo\n\t"
17605         "csel	x4, x4, xzr, eq\n\t"
17606         "csel	x2, x3, x2, hi\n\t"
17607         "ldp	x5, x6, [%[a], 432]\n\t"
17608         "ldp	x7, x8, [%[b], 432]\n\t"
17609         "and	x6, x6, x4\n\t"
17610         "and	x8, x8, x4\n\t"
17611         "subs	x6, x6, x8\n\t"
17612         "csel	x2, x4, x2, lo\n\t"
17613         "csel	x4, x4, xzr, eq\n\t"
17614         "csel	x2, x3, x2, hi\n\t"
17615         "and	x5, x5, x4\n\t"
17616         "and	x7, x7, x4\n\t"
17617         "subs	x5, x5, x7\n\t"
17618         "csel	x2, x4, x2, lo\n\t"
17619         "csel	x4, x4, xzr, eq\n\t"
17620         "csel	x2, x3, x2, hi\n\t"
17621         "ldp	x5, x6, [%[a], 416]\n\t"
17622         "ldp	x7, x8, [%[b], 416]\n\t"
17623         "and	x6, x6, x4\n\t"
17624         "and	x8, x8, x4\n\t"
17625         "subs	x6, x6, x8\n\t"
17626         "csel	x2, x4, x2, lo\n\t"
17627         "csel	x4, x4, xzr, eq\n\t"
17628         "csel	x2, x3, x2, hi\n\t"
17629         "and	x5, x5, x4\n\t"
17630         "and	x7, x7, x4\n\t"
17631         "subs	x5, x5, x7\n\t"
17632         "csel	x2, x4, x2, lo\n\t"
17633         "csel	x4, x4, xzr, eq\n\t"
17634         "csel	x2, x3, x2, hi\n\t"
17635         "ldp	x5, x6, [%[a], 400]\n\t"
17636         "ldp	x7, x8, [%[b], 400]\n\t"
17637         "and	x6, x6, x4\n\t"
17638         "and	x8, x8, x4\n\t"
17639         "subs	x6, x6, x8\n\t"
17640         "csel	x2, x4, x2, lo\n\t"
17641         "csel	x4, x4, xzr, eq\n\t"
17642         "csel	x2, x3, x2, hi\n\t"
17643         "and	x5, x5, x4\n\t"
17644         "and	x7, x7, x4\n\t"
17645         "subs	x5, x5, x7\n\t"
17646         "csel	x2, x4, x2, lo\n\t"
17647         "csel	x4, x4, xzr, eq\n\t"
17648         "csel	x2, x3, x2, hi\n\t"
17649         "ldp	x5, x6, [%[a], 384]\n\t"
17650         "ldp	x7, x8, [%[b], 384]\n\t"
17651         "and	x6, x6, x4\n\t"
17652         "and	x8, x8, x4\n\t"
17653         "subs	x6, x6, x8\n\t"
17654         "csel	x2, x4, x2, lo\n\t"
17655         "csel	x4, x4, xzr, eq\n\t"
17656         "csel	x2, x3, x2, hi\n\t"
17657         "and	x5, x5, x4\n\t"
17658         "and	x7, x7, x4\n\t"
17659         "subs	x5, x5, x7\n\t"
17660         "csel	x2, x4, x2, lo\n\t"
17661         "csel	x4, x4, xzr, eq\n\t"
17662         "csel	x2, x3, x2, hi\n\t"
17663         "ldp	x5, x6, [%[a], 368]\n\t"
17664         "ldp	x7, x8, [%[b], 368]\n\t"
17665         "and	x6, x6, x4\n\t"
17666         "and	x8, x8, x4\n\t"
17667         "subs	x6, x6, x8\n\t"
17668         "csel	x2, x4, x2, lo\n\t"
17669         "csel	x4, x4, xzr, eq\n\t"
17670         "csel	x2, x3, x2, hi\n\t"
17671         "and	x5, x5, x4\n\t"
17672         "and	x7, x7, x4\n\t"
17673         "subs	x5, x5, x7\n\t"
17674         "csel	x2, x4, x2, lo\n\t"
17675         "csel	x4, x4, xzr, eq\n\t"
17676         "csel	x2, x3, x2, hi\n\t"
17677         "ldp	x5, x6, [%[a], 352]\n\t"
17678         "ldp	x7, x8, [%[b], 352]\n\t"
17679         "and	x6, x6, x4\n\t"
17680         "and	x8, x8, x4\n\t"
17681         "subs	x6, x6, x8\n\t"
17682         "csel	x2, x4, x2, lo\n\t"
17683         "csel	x4, x4, xzr, eq\n\t"
17684         "csel	x2, x3, x2, hi\n\t"
17685         "and	x5, x5, x4\n\t"
17686         "and	x7, x7, x4\n\t"
17687         "subs	x5, x5, x7\n\t"
17688         "csel	x2, x4, x2, lo\n\t"
17689         "csel	x4, x4, xzr, eq\n\t"
17690         "csel	x2, x3, x2, hi\n\t"
17691         "ldp	x5, x6, [%[a], 336]\n\t"
17692         "ldp	x7, x8, [%[b], 336]\n\t"
17693         "and	x6, x6, x4\n\t"
17694         "and	x8, x8, x4\n\t"
17695         "subs	x6, x6, x8\n\t"
17696         "csel	x2, x4, x2, lo\n\t"
17697         "csel	x4, x4, xzr, eq\n\t"
17698         "csel	x2, x3, x2, hi\n\t"
17699         "and	x5, x5, x4\n\t"
17700         "and	x7, x7, x4\n\t"
17701         "subs	x5, x5, x7\n\t"
17702         "csel	x2, x4, x2, lo\n\t"
17703         "csel	x4, x4, xzr, eq\n\t"
17704         "csel	x2, x3, x2, hi\n\t"
17705         "ldp	x5, x6, [%[a], 320]\n\t"
17706         "ldp	x7, x8, [%[b], 320]\n\t"
17707         "and	x6, x6, x4\n\t"
17708         "and	x8, x8, x4\n\t"
17709         "subs	x6, x6, x8\n\t"
17710         "csel	x2, x4, x2, lo\n\t"
17711         "csel	x4, x4, xzr, eq\n\t"
17712         "csel	x2, x3, x2, hi\n\t"
17713         "and	x5, x5, x4\n\t"
17714         "and	x7, x7, x4\n\t"
17715         "subs	x5, x5, x7\n\t"
17716         "csel	x2, x4, x2, lo\n\t"
17717         "csel	x4, x4, xzr, eq\n\t"
17718         "csel	x2, x3, x2, hi\n\t"
17719         "ldp	x5, x6, [%[a], 304]\n\t"
17720         "ldp	x7, x8, [%[b], 304]\n\t"
17721         "and	x6, x6, x4\n\t"
17722         "and	x8, x8, x4\n\t"
17723         "subs	x6, x6, x8\n\t"
17724         "csel	x2, x4, x2, lo\n\t"
17725         "csel	x4, x4, xzr, eq\n\t"
17726         "csel	x2, x3, x2, hi\n\t"
17727         "and	x5, x5, x4\n\t"
17728         "and	x7, x7, x4\n\t"
17729         "subs	x5, x5, x7\n\t"
17730         "csel	x2, x4, x2, lo\n\t"
17731         "csel	x4, x4, xzr, eq\n\t"
17732         "csel	x2, x3, x2, hi\n\t"
17733         "ldp	x5, x6, [%[a], 288]\n\t"
17734         "ldp	x7, x8, [%[b], 288]\n\t"
17735         "and	x6, x6, x4\n\t"
17736         "and	x8, x8, x4\n\t"
17737         "subs	x6, x6, x8\n\t"
17738         "csel	x2, x4, x2, lo\n\t"
17739         "csel	x4, x4, xzr, eq\n\t"
17740         "csel	x2, x3, x2, hi\n\t"
17741         "and	x5, x5, x4\n\t"
17742         "and	x7, x7, x4\n\t"
17743         "subs	x5, x5, x7\n\t"
17744         "csel	x2, x4, x2, lo\n\t"
17745         "csel	x4, x4, xzr, eq\n\t"
17746         "csel	x2, x3, x2, hi\n\t"
17747         "ldp	x5, x6, [%[a], 272]\n\t"
17748         "ldp	x7, x8, [%[b], 272]\n\t"
17749         "and	x6, x6, x4\n\t"
17750         "and	x8, x8, x4\n\t"
17751         "subs	x6, x6, x8\n\t"
17752         "csel	x2, x4, x2, lo\n\t"
17753         "csel	x4, x4, xzr, eq\n\t"
17754         "csel	x2, x3, x2, hi\n\t"
17755         "and	x5, x5, x4\n\t"
17756         "and	x7, x7, x4\n\t"
17757         "subs	x5, x5, x7\n\t"
17758         "csel	x2, x4, x2, lo\n\t"
17759         "csel	x4, x4, xzr, eq\n\t"
17760         "csel	x2, x3, x2, hi\n\t"
17761         "ldp	x5, x6, [%[a], 256]\n\t"
17762         "ldp	x7, x8, [%[b], 256]\n\t"
17763         "and	x6, x6, x4\n\t"
17764         "and	x8, x8, x4\n\t"
17765         "subs	x6, x6, x8\n\t"
17766         "csel	x2, x4, x2, lo\n\t"
17767         "csel	x4, x4, xzr, eq\n\t"
17768         "csel	x2, x3, x2, hi\n\t"
17769         "and	x5, x5, x4\n\t"
17770         "and	x7, x7, x4\n\t"
17771         "subs	x5, x5, x7\n\t"
17772         "csel	x2, x4, x2, lo\n\t"
17773         "csel	x4, x4, xzr, eq\n\t"
17774         "csel	x2, x3, x2, hi\n\t"
17775         "ldp	x5, x6, [%[a], 240]\n\t"
17776         "ldp	x7, x8, [%[b], 240]\n\t"
17777         "and	x6, x6, x4\n\t"
17778         "and	x8, x8, x4\n\t"
17779         "subs	x6, x6, x8\n\t"
17780         "csel	x2, x4, x2, lo\n\t"
17781         "csel	x4, x4, xzr, eq\n\t"
17782         "csel	x2, x3, x2, hi\n\t"
17783         "and	x5, x5, x4\n\t"
17784         "and	x7, x7, x4\n\t"
17785         "subs	x5, x5, x7\n\t"
17786         "csel	x2, x4, x2, lo\n\t"
17787         "csel	x4, x4, xzr, eq\n\t"
17788         "csel	x2, x3, x2, hi\n\t"
17789         "ldp	x5, x6, [%[a], 224]\n\t"
17790         "ldp	x7, x8, [%[b], 224]\n\t"
17791         "and	x6, x6, x4\n\t"
17792         "and	x8, x8, x4\n\t"
17793         "subs	x6, x6, x8\n\t"
17794         "csel	x2, x4, x2, lo\n\t"
17795         "csel	x4, x4, xzr, eq\n\t"
17796         "csel	x2, x3, x2, hi\n\t"
17797         "and	x5, x5, x4\n\t"
17798         "and	x7, x7, x4\n\t"
17799         "subs	x5, x5, x7\n\t"
17800         "csel	x2, x4, x2, lo\n\t"
17801         "csel	x4, x4, xzr, eq\n\t"
17802         "csel	x2, x3, x2, hi\n\t"
17803         "ldp	x5, x6, [%[a], 208]\n\t"
17804         "ldp	x7, x8, [%[b], 208]\n\t"
17805         "and	x6, x6, x4\n\t"
17806         "and	x8, x8, x4\n\t"
17807         "subs	x6, x6, x8\n\t"
17808         "csel	x2, x4, x2, lo\n\t"
17809         "csel	x4, x4, xzr, eq\n\t"
17810         "csel	x2, x3, x2, hi\n\t"
17811         "and	x5, x5, x4\n\t"
17812         "and	x7, x7, x4\n\t"
17813         "subs	x5, x5, x7\n\t"
17814         "csel	x2, x4, x2, lo\n\t"
17815         "csel	x4, x4, xzr, eq\n\t"
17816         "csel	x2, x3, x2, hi\n\t"
17817         "ldp	x5, x6, [%[a], 192]\n\t"
17818         "ldp	x7, x8, [%[b], 192]\n\t"
17819         "and	x6, x6, x4\n\t"
17820         "and	x8, x8, x4\n\t"
17821         "subs	x6, x6, x8\n\t"
17822         "csel	x2, x4, x2, lo\n\t"
17823         "csel	x4, x4, xzr, eq\n\t"
17824         "csel	x2, x3, x2, hi\n\t"
17825         "and	x5, x5, x4\n\t"
17826         "and	x7, x7, x4\n\t"
17827         "subs	x5, x5, x7\n\t"
17828         "csel	x2, x4, x2, lo\n\t"
17829         "csel	x4, x4, xzr, eq\n\t"
17830         "csel	x2, x3, x2, hi\n\t"
17831         "ldp	x5, x6, [%[a], 176]\n\t"
17832         "ldp	x7, x8, [%[b], 176]\n\t"
17833         "and	x6, x6, x4\n\t"
17834         "and	x8, x8, x4\n\t"
17835         "subs	x6, x6, x8\n\t"
17836         "csel	x2, x4, x2, lo\n\t"
17837         "csel	x4, x4, xzr, eq\n\t"
17838         "csel	x2, x3, x2, hi\n\t"
17839         "and	x5, x5, x4\n\t"
17840         "and	x7, x7, x4\n\t"
17841         "subs	x5, x5, x7\n\t"
17842         "csel	x2, x4, x2, lo\n\t"
17843         "csel	x4, x4, xzr, eq\n\t"
17844         "csel	x2, x3, x2, hi\n\t"
17845         "ldp	x5, x6, [%[a], 160]\n\t"
17846         "ldp	x7, x8, [%[b], 160]\n\t"
17847         "and	x6, x6, x4\n\t"
17848         "and	x8, x8, x4\n\t"
17849         "subs	x6, x6, x8\n\t"
17850         "csel	x2, x4, x2, lo\n\t"
17851         "csel	x4, x4, xzr, eq\n\t"
17852         "csel	x2, x3, x2, hi\n\t"
17853         "and	x5, x5, x4\n\t"
17854         "and	x7, x7, x4\n\t"
17855         "subs	x5, x5, x7\n\t"
17856         "csel	x2, x4, x2, lo\n\t"
17857         "csel	x4, x4, xzr, eq\n\t"
17858         "csel	x2, x3, x2, hi\n\t"
17859         "ldp	x5, x6, [%[a], 144]\n\t"
17860         "ldp	x7, x8, [%[b], 144]\n\t"
17861         "and	x6, x6, x4\n\t"
17862         "and	x8, x8, x4\n\t"
17863         "subs	x6, x6, x8\n\t"
17864         "csel	x2, x4, x2, lo\n\t"
17865         "csel	x4, x4, xzr, eq\n\t"
17866         "csel	x2, x3, x2, hi\n\t"
17867         "and	x5, x5, x4\n\t"
17868         "and	x7, x7, x4\n\t"
17869         "subs	x5, x5, x7\n\t"
17870         "csel	x2, x4, x2, lo\n\t"
17871         "csel	x4, x4, xzr, eq\n\t"
17872         "csel	x2, x3, x2, hi\n\t"
17873         "ldp	x5, x6, [%[a], 128]\n\t"
17874         "ldp	x7, x8, [%[b], 128]\n\t"
17875         "and	x6, x6, x4\n\t"
17876         "and	x8, x8, x4\n\t"
17877         "subs	x6, x6, x8\n\t"
17878         "csel	x2, x4, x2, lo\n\t"
17879         "csel	x4, x4, xzr, eq\n\t"
17880         "csel	x2, x3, x2, hi\n\t"
17881         "and	x5, x5, x4\n\t"
17882         "and	x7, x7, x4\n\t"
17883         "subs	x5, x5, x7\n\t"
17884         "csel	x2, x4, x2, lo\n\t"
17885         "csel	x4, x4, xzr, eq\n\t"
17886         "csel	x2, x3, x2, hi\n\t"
17887         "ldp	x5, x6, [%[a], 112]\n\t"
17888         "ldp	x7, x8, [%[b], 112]\n\t"
17889         "and	x6, x6, x4\n\t"
17890         "and	x8, x8, x4\n\t"
17891         "subs	x6, x6, x8\n\t"
17892         "csel	x2, x4, x2, lo\n\t"
17893         "csel	x4, x4, xzr, eq\n\t"
17894         "csel	x2, x3, x2, hi\n\t"
17895         "and	x5, x5, x4\n\t"
17896         "and	x7, x7, x4\n\t"
17897         "subs	x5, x5, x7\n\t"
17898         "csel	x2, x4, x2, lo\n\t"
17899         "csel	x4, x4, xzr, eq\n\t"
17900         "csel	x2, x3, x2, hi\n\t"
17901         "ldp	x5, x6, [%[a], 96]\n\t"
17902         "ldp	x7, x8, [%[b], 96]\n\t"
17903         "and	x6, x6, x4\n\t"
17904         "and	x8, x8, x4\n\t"
17905         "subs	x6, x6, x8\n\t"
17906         "csel	x2, x4, x2, lo\n\t"
17907         "csel	x4, x4, xzr, eq\n\t"
17908         "csel	x2, x3, x2, hi\n\t"
17909         "and	x5, x5, x4\n\t"
17910         "and	x7, x7, x4\n\t"
17911         "subs	x5, x5, x7\n\t"
17912         "csel	x2, x4, x2, lo\n\t"
17913         "csel	x4, x4, xzr, eq\n\t"
17914         "csel	x2, x3, x2, hi\n\t"
17915         "ldp	x5, x6, [%[a], 80]\n\t"
17916         "ldp	x7, x8, [%[b], 80]\n\t"
17917         "and	x6, x6, x4\n\t"
17918         "and	x8, x8, x4\n\t"
17919         "subs	x6, x6, x8\n\t"
17920         "csel	x2, x4, x2, lo\n\t"
17921         "csel	x4, x4, xzr, eq\n\t"
17922         "csel	x2, x3, x2, hi\n\t"
17923         "and	x5, x5, x4\n\t"
17924         "and	x7, x7, x4\n\t"
17925         "subs	x5, x5, x7\n\t"
17926         "csel	x2, x4, x2, lo\n\t"
17927         "csel	x4, x4, xzr, eq\n\t"
17928         "csel	x2, x3, x2, hi\n\t"
17929         "ldp	x5, x6, [%[a], 64]\n\t"
17930         "ldp	x7, x8, [%[b], 64]\n\t"
17931         "and	x6, x6, x4\n\t"
17932         "and	x8, x8, x4\n\t"
17933         "subs	x6, x6, x8\n\t"
17934         "csel	x2, x4, x2, lo\n\t"
17935         "csel	x4, x4, xzr, eq\n\t"
17936         "csel	x2, x3, x2, hi\n\t"
17937         "and	x5, x5, x4\n\t"
17938         "and	x7, x7, x4\n\t"
17939         "subs	x5, x5, x7\n\t"
17940         "csel	x2, x4, x2, lo\n\t"
17941         "csel	x4, x4, xzr, eq\n\t"
17942         "csel	x2, x3, x2, hi\n\t"
17943         "ldp	x5, x6, [%[a], 48]\n\t"
17944         "ldp	x7, x8, [%[b], 48]\n\t"
17945         "and	x6, x6, x4\n\t"
17946         "and	x8, x8, x4\n\t"
17947         "subs	x6, x6, x8\n\t"
17948         "csel	x2, x4, x2, lo\n\t"
17949         "csel	x4, x4, xzr, eq\n\t"
17950         "csel	x2, x3, x2, hi\n\t"
17951         "and	x5, x5, x4\n\t"
17952         "and	x7, x7, x4\n\t"
17953         "subs	x5, x5, x7\n\t"
17954         "csel	x2, x4, x2, lo\n\t"
17955         "csel	x4, x4, xzr, eq\n\t"
17956         "csel	x2, x3, x2, hi\n\t"
17957         "ldp	x5, x6, [%[a], 32]\n\t"
17958         "ldp	x7, x8, [%[b], 32]\n\t"
17959         "and	x6, x6, x4\n\t"
17960         "and	x8, x8, x4\n\t"
17961         "subs	x6, x6, x8\n\t"
17962         "csel	x2, x4, x2, lo\n\t"
17963         "csel	x4, x4, xzr, eq\n\t"
17964         "csel	x2, x3, x2, hi\n\t"
17965         "and	x5, x5, x4\n\t"
17966         "and	x7, x7, x4\n\t"
17967         "subs	x5, x5, x7\n\t"
17968         "csel	x2, x4, x2, lo\n\t"
17969         "csel	x4, x4, xzr, eq\n\t"
17970         "csel	x2, x3, x2, hi\n\t"
17971         "ldp	x5, x6, [%[a], 16]\n\t"
17972         "ldp	x7, x8, [%[b], 16]\n\t"
17973         "and	x6, x6, x4\n\t"
17974         "and	x8, x8, x4\n\t"
17975         "subs	x6, x6, x8\n\t"
17976         "csel	x2, x4, x2, lo\n\t"
17977         "csel	x4, x4, xzr, eq\n\t"
17978         "csel	x2, x3, x2, hi\n\t"
17979         "and	x5, x5, x4\n\t"
17980         "and	x7, x7, x4\n\t"
17981         "subs	x5, x5, x7\n\t"
17982         "csel	x2, x4, x2, lo\n\t"
17983         "csel	x4, x4, xzr, eq\n\t"
17984         "csel	x2, x3, x2, hi\n\t"
17985         "ldp	x5, x6, [%[a], 0]\n\t"
17986         "ldp	x7, x8, [%[b], 0]\n\t"
17987         "and	x6, x6, x4\n\t"
17988         "and	x8, x8, x4\n\t"
17989         "subs	x6, x6, x8\n\t"
17990         "csel	x2, x4, x2, lo\n\t"
17991         "csel	x4, x4, xzr, eq\n\t"
17992         "csel	x2, x3, x2, hi\n\t"
17993         "and	x5, x5, x4\n\t"
17994         "and	x7, x7, x4\n\t"
17995         "subs	x5, x5, x7\n\t"
17996         "csel	x2, x4, x2, lo\n\t"
17997         "csel	x4, x4, xzr, eq\n\t"
17998         "csel	x2, x3, x2, hi\n\t"
17999         "eor	%[a], x2, x4\n\t"
18000         : [a] "+r" (a)
18001         : [b] "r" (b)
18002         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
18003     );
18004 #endif
18005 
18006     return (sp_int64)a;
18007 }
18008 
18009 /* Divide d in a and put remainder into r (m*d + r = a)
18010  * m is not calculated as it is not needed at this time.
18011  *
18012  * a  Number to be divided.
18013  * d  Number to divide with.
18014  * m  Multiplier result.
18015  * r  Remainder from the division.
18016  * returns MP_OKAY indicating success.
18017  */
sp_4096_div_64(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)18018 static WC_INLINE int sp_4096_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m,
18019         sp_digit* r)
18020 {
18021     sp_digit t1[128], t2[65];
18022     sp_digit div, r1;
18023     int i;
18024 
18025     (void)m;
18026 
18027     div = d[63];
18028     XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
18029     for (i=63; i>=0; i--) {
18030         sp_digit hi = t1[64 + i] - (t1[64 + i] == div);
18031         r1 = div_4096_word_64(hi, t1[64 + i - 1], div);
18032 
18033         sp_4096_mul_d_64(t2, d, r1);
18034         t1[64 + i] += sp_4096_sub_in_place_64(&t1[i], t2);
18035         t1[64 + i] -= t2[64];
18036         sp_4096_mask_64(t2, d, t1[64 + i]);
18037         t1[64 + i] += sp_4096_add_64(&t1[i], &t1[i], t2);
18038         sp_4096_mask_64(t2, d, t1[64 + i]);
18039         t1[64 + i] += sp_4096_add_64(&t1[i], &t1[i], t2);
18040     }
18041 
18042     r1 = sp_4096_cmp_64(t1, d) >= 0;
18043     sp_4096_cond_sub_64(r, t1, d, (sp_digit)0 - r1);
18044 
18045     return MP_OKAY;
18046 }
18047 
18048 /* Reduce a modulo m into r. (r = a mod m)
18049  *
18050  * r  A single precision number that is the reduced result.
18051  * a  A single precision number that is to be reduced.
18052  * m  A single precision number that is the modulus to reduce with.
18053  * returns MP_OKAY indicating success.
18054  */
sp_4096_mod_64(sp_digit * r,const sp_digit * a,const sp_digit * m)18055 static WC_INLINE int sp_4096_mod_64(sp_digit* r, const sp_digit* a, const sp_digit* m)
18056 {
18057     return sp_4096_div_64(a, m, NULL, r);
18058 }
18059 
18060 #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
18061                                                      defined(WOLFSSL_HAVE_SP_DH)
18062 #ifdef WOLFSSL_SP_SMALL
18063 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
18064  *
18065  * r     A single precision number that is the result of the operation.
18066  * a     A single precision number being exponentiated.
18067  * e     A single precision number that is the exponent.
18068  * bits  The number of bits in the exponent.
18069  * m     A single precision number that is the modulus.
18070  * returns  0 on success.
18071  * returns  MEMORY_E on dynamic memory allocation failure.
18072  * returns  MP_VAL when base is even or exponent is 0.
18073  */
sp_4096_mod_exp_64(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)18074 static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
18075         int bits, const sp_digit* m, int reduceA)
18076 {
18077 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18078     sp_digit* td = NULL;
18079 #else
18080     sp_digit td[8 * 128];
18081 #endif
18082     sp_digit* t[8];
18083     sp_digit* norm = NULL;
18084     sp_digit mp = 1;
18085     sp_digit n;
18086     sp_digit mask;
18087     int i;
18088     int c;
18089     byte y;
18090     int err = MP_OKAY;
18091 
18092     if ((m[0] & 1) == 0) {
18093         err = MP_VAL;
18094     }
18095     else if (bits == 0) {
18096         err = MP_VAL;
18097     }
18098 
18099 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18100     if (err == MP_OKAY) {
18101         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 128), NULL,
18102                                 DYNAMIC_TYPE_TMP_BUFFER);
18103         if (td == NULL)
18104             err = MEMORY_E;
18105     }
18106 #endif
18107 
18108     if (err == MP_OKAY) {
18109         norm = td;
18110         for (i=0; i<8; i++) {
18111             t[i] = td + i * 128;
18112         }
18113 
18114         sp_4096_mont_setup(m, &mp);
18115         sp_4096_mont_norm_64(norm, m);
18116 
18117         XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
18118         if (reduceA != 0) {
18119             err = sp_4096_mod_64(t[1] + 64, a, m);
18120             if (err == MP_OKAY) {
18121                 err = sp_4096_mod_64(t[1], t[1], m);
18122             }
18123         }
18124         else {
18125             XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
18126             err = sp_4096_mod_64(t[1], t[1], m);
18127         }
18128     }
18129 
18130     if (err == MP_OKAY) {
18131         sp_4096_mont_sqr_64(t[ 2], t[ 1], m, mp);
18132         sp_4096_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
18133         sp_4096_mont_sqr_64(t[ 4], t[ 2], m, mp);
18134         sp_4096_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
18135         sp_4096_mont_sqr_64(t[ 6], t[ 3], m, mp);
18136         sp_4096_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
18137 
18138         i = (bits - 1) / 64;
18139         n = e[i--];
18140         c = bits & 63;
18141         if (c == 0) {
18142             c = 64;
18143         }
18144         c -= bits % 3;
18145         if (c == 64) {
18146             c = 61;
18147         }
18148         if (c < 0) {
18149             /* Number of bits in top word is less than number needed. */
18150             c = -c;
18151             y = (byte)(n << c);
18152             n = e[i--];
18153             y |= (byte)(n >> (64 - c));
18154             n <<= c;
18155             c = 64 - c;
18156         }
18157         else {
18158             y = (byte)(n >> c);
18159             n <<= 64 - c;
18160         }
18161         XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
18162         for (; i>=0 || c>=3; ) {
18163             if (c == 0) {
18164                 n = e[i--];
18165                 y = (byte)(n >> 61);
18166                 n <<= 3;
18167                 c = 61;
18168             }
18169             else if (c < 3) {
18170                 y = (byte)(n >> 61);
18171                 n = e[i--];
18172                 c = 3 - c;
18173                 y |= (byte)(n >> (64 - c));
18174                 n <<= c;
18175                 c = 64 - c;
18176             }
18177             else {
18178                 y = (byte)((n >> 61) & 0x7);
18179                 n <<= 3;
18180                 c -= 3;
18181             }
18182 
18183             sp_4096_mont_sqr_64(r, r, m, mp);
18184             sp_4096_mont_sqr_64(r, r, m, mp);
18185             sp_4096_mont_sqr_64(r, r, m, mp);
18186 
18187             sp_4096_mont_mul_64(r, r, t[y], m, mp);
18188         }
18189 
18190         XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
18191         sp_4096_mont_reduce_64(r, m, mp);
18192 
18193         mask = 0 - (sp_4096_cmp_64(r, m) >= 0);
18194         sp_4096_cond_sub_64(r, r, m, mask);
18195     }
18196 
18197 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18198     if (td != NULL)
18199         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
18200 #endif
18201 
18202     return err;
18203 }
18204 #else
18205 /* Modular exponentiate a to the e mod m. (r = a^e mod m)
18206  *
18207  * r     A single precision number that is the result of the operation.
18208  * a     A single precision number being exponentiated.
18209  * e     A single precision number that is the exponent.
18210  * bits  The number of bits in the exponent.
18211  * m     A single precision number that is the modulus.
18212  * returns  0 on success.
18213  * returns  MEMORY_E on dynamic memory allocation failure.
18214  * returns  MP_VAL when base is even or exponent is 0.
18215  */
sp_4096_mod_exp_64(sp_digit * r,const sp_digit * a,const sp_digit * e,int bits,const sp_digit * m,int reduceA)18216 static int sp_4096_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
18217         int bits, const sp_digit* m, int reduceA)
18218 {
18219 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18220     sp_digit* td = NULL;
18221 #else
18222     sp_digit td[16 * 128];
18223 #endif
18224     sp_digit* t[16];
18225     sp_digit* norm = NULL;
18226     sp_digit mp = 1;
18227     sp_digit n;
18228     sp_digit mask;
18229     int i;
18230     int c;
18231     byte y;
18232     int err = MP_OKAY;
18233 
18234     if ((m[0] & 1) == 0) {
18235         err = MP_VAL;
18236     }
18237     else if (bits == 0) {
18238         err = MP_VAL;
18239     }
18240 
18241 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18242     if (err == MP_OKAY) {
18243         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL,
18244                                 DYNAMIC_TYPE_TMP_BUFFER);
18245         if (td == NULL)
18246             err = MEMORY_E;
18247     }
18248 #endif
18249 
18250     if (err == MP_OKAY) {
18251         norm = td;
18252         for (i=0; i<16; i++) {
18253             t[i] = td + i * 128;
18254         }
18255 
18256         sp_4096_mont_setup(m, &mp);
18257         sp_4096_mont_norm_64(norm, m);
18258 
18259         XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
18260         if (reduceA != 0) {
18261             err = sp_4096_mod_64(t[1] + 64, a, m);
18262             if (err == MP_OKAY) {
18263                 err = sp_4096_mod_64(t[1], t[1], m);
18264             }
18265         }
18266         else {
18267             XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
18268             err = sp_4096_mod_64(t[1], t[1], m);
18269         }
18270     }
18271 
18272     if (err == MP_OKAY) {
18273         sp_4096_mont_sqr_64(t[ 2], t[ 1], m, mp);
18274         sp_4096_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
18275         sp_4096_mont_sqr_64(t[ 4], t[ 2], m, mp);
18276         sp_4096_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
18277         sp_4096_mont_sqr_64(t[ 6], t[ 3], m, mp);
18278         sp_4096_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
18279         sp_4096_mont_sqr_64(t[ 8], t[ 4], m, mp);
18280         sp_4096_mont_mul_64(t[ 9], t[ 5], t[ 4], m, mp);
18281         sp_4096_mont_sqr_64(t[10], t[ 5], m, mp);
18282         sp_4096_mont_mul_64(t[11], t[ 6], t[ 5], m, mp);
18283         sp_4096_mont_sqr_64(t[12], t[ 6], m, mp);
18284         sp_4096_mont_mul_64(t[13], t[ 7], t[ 6], m, mp);
18285         sp_4096_mont_sqr_64(t[14], t[ 7], m, mp);
18286         sp_4096_mont_mul_64(t[15], t[ 8], t[ 7], m, mp);
18287 
18288         i = (bits - 1) / 64;
18289         n = e[i--];
18290         c = bits & 63;
18291         if (c == 0) {
18292             c = 64;
18293         }
18294         c -= bits % 4;
18295         if (c == 64) {
18296             c = 60;
18297         }
18298         if (c < 0) {
18299             /* Number of bits in top word is less than number needed. */
18300             c = -c;
18301             y = (byte)(n << c);
18302             n = e[i--];
18303             y |= (byte)(n >> (64 - c));
18304             n <<= c;
18305             c = 64 - c;
18306         }
18307         else {
18308             y = (byte)(n >> c);
18309             n <<= 64 - c;
18310         }
18311         XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
18312         for (; i>=0 || c>=4; ) {
18313             if (c == 0) {
18314                 n = e[i--];
18315                 y = (byte)(n >> 60);
18316                 n <<= 4;
18317                 c = 60;
18318             }
18319             else if (c < 4) {
18320                 y = (byte)(n >> 60);
18321                 n = e[i--];
18322                 c = 4 - c;
18323                 y |= (byte)(n >> (64 - c));
18324                 n <<= c;
18325                 c = 64 - c;
18326             }
18327             else {
18328                 y = (byte)((n >> 60) & 0xf);
18329                 n <<= 4;
18330                 c -= 4;
18331             }
18332 
18333             sp_4096_mont_sqr_64(r, r, m, mp);
18334             sp_4096_mont_sqr_64(r, r, m, mp);
18335             sp_4096_mont_sqr_64(r, r, m, mp);
18336             sp_4096_mont_sqr_64(r, r, m, mp);
18337 
18338             sp_4096_mont_mul_64(r, r, t[y], m, mp);
18339         }
18340 
18341         XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
18342         sp_4096_mont_reduce_64(r, m, mp);
18343 
18344         mask = 0 - (sp_4096_cmp_64(r, m) >= 0);
18345         sp_4096_cond_sub_64(r, r, m, mask);
18346     }
18347 
18348 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18349     if (td != NULL)
18350         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
18351 #endif
18352 
18353     return err;
18354 }
18355 #endif /* WOLFSSL_SP_SMALL */
18356 #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
18357 
18358 #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
18359 #ifdef WOLFSSL_HAVE_SP_RSA
18360 /* RSA public key operation.
18361  *
18362  * in      Array of bytes representing the number to exponentiate, base.
18363  * inLen   Number of bytes in base.
18364  * em      Public exponent.
18365  * mm      Modulus.
18366  * out     Buffer to hold big-endian bytes of exponentiation result.
18367  *         Must be at least 512 bytes long.
18368  * outLen  Number of bytes in result.
18369  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
18370  * an array is too long and MEMORY_E when dynamic memory allocation fails.
18371  */
sp_RsaPublic_4096(const byte * in,word32 inLen,const mp_int * em,const mp_int * mm,byte * out,word32 * outLen)18372 int sp_RsaPublic_4096(const byte* in, word32 inLen, const mp_int* em,
18373     const mp_int* mm, byte* out, word32* outLen)
18374 {
18375 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18376     sp_digit* a = NULL;
18377 #else
18378     sp_digit a[64 * 5];
18379 #endif
18380     sp_digit* m = NULL;
18381     sp_digit* r = NULL;
18382     sp_digit *ah = NULL;
18383     sp_digit e[1] = {0};
18384     int err = MP_OKAY;
18385 
18386     if (*outLen < 512) {
18387         err = MP_TO_E;
18388     }
18389     else if (mp_count_bits(em) > 64 || inLen > 512 ||
18390                                                      mp_count_bits(mm) != 4096) {
18391         err = MP_READ_E;
18392     }
18393     else if (mp_iseven(mm)) {
18394         err = MP_VAL;
18395     }
18396 
18397 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18398     if (err == MP_OKAY) {
18399         a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 5, NULL,
18400                                                               DYNAMIC_TYPE_RSA);
18401         if (a == NULL)
18402             err = MEMORY_E;
18403     }
18404 #endif
18405 
18406     if (err == MP_OKAY) {
18407         r = a + 64 * 2;
18408         m = r + 64 * 2;
18409         ah = a + 64;
18410 
18411         sp_4096_from_bin(ah, 64, in, inLen);
18412 #if DIGIT_BIT >= 64
18413         e[0] = em->dp[0];
18414 #else
18415         e[0] = em->dp[0];
18416         if (em->used > 1) {
18417             e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
18418         }
18419 #endif
18420         if (e[0] == 0) {
18421             err = MP_EXPTMOD_E;
18422         }
18423     }
18424     if (err == MP_OKAY) {
18425         sp_4096_from_mp(m, 64, mm);
18426 
18427         if (e[0] == 0x3) {
18428             if (err == MP_OKAY) {
18429                 sp_4096_sqr_64(r, ah);
18430                 err = sp_4096_mod_64_cond(r, r, m);
18431             }
18432             if (err == MP_OKAY) {
18433                 sp_4096_mul_64(r, ah, r);
18434                 err = sp_4096_mod_64_cond(r, r, m);
18435             }
18436         }
18437         else {
18438             int i;
18439             sp_digit mp;
18440 
18441             sp_4096_mont_setup(m, &mp);
18442 
18443             /* Convert to Montgomery form. */
18444             XMEMSET(a, 0, sizeof(sp_digit) * 64);
18445             err = sp_4096_mod_64_cond(a, a, m);
18446 
18447             if (err == MP_OKAY) {
18448                 for (i = 63; i >= 0; i--) {
18449                     if (e[0] >> i) {
18450                         break;
18451                     }
18452                 }
18453 
18454                 XMEMCPY(r, a, sizeof(sp_digit) * 64);
18455                 for (i--; i>=0; i--) {
18456                     sp_4096_mont_sqr_64(r, r, m, mp);
18457                     if (((e[0] >> i) & 1) == 1) {
18458                         sp_4096_mont_mul_64(r, r, a, m, mp);
18459                     }
18460                 }
18461                 XMEMSET(&r[64], 0, sizeof(sp_digit) * 64);
18462                 sp_4096_mont_reduce_64(r, m, mp);
18463 
18464                 for (i = 63; i > 0; i--) {
18465                     if (r[i] != m[i]) {
18466                         break;
18467                     }
18468                 }
18469                 if (r[i] >= m[i]) {
18470                     sp_4096_sub_in_place_64(r, m);
18471                 }
18472             }
18473         }
18474     }
18475 
18476     if (err == MP_OKAY) {
18477         sp_4096_to_bin_64(r, out);
18478         *outLen = 512;
18479     }
18480 
18481 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18482     if (a != NULL)
18483         XFREE(a, NULL, DYNAMIC_TYPE_RSA);
18484 #endif
18485 
18486     return err;
18487 }
18488 
18489 #ifndef WOLFSSL_RSA_PUBLIC_ONLY
18490 /* Conditionally add a and b using the mask m.
18491  * m is -1 to add and 0 when not.
18492  *
18493  * r  A single precision number representing conditional add result.
18494  * a  A single precision number to add with.
18495  * b  A single precision number to add.
18496  * m  Mask value to apply.
18497  */
sp_4096_cond_add_32(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)18498 static sp_digit sp_4096_cond_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b,
18499         sp_digit m)
18500 {
18501 #ifdef WOLFSSL_SP_SMALL
18502     sp_digit c = 0;
18503 
18504     __asm__ __volatile__ (
18505         "mov	x8, #0\n\t"
18506         "1:\n\t"
18507         "adds	%[c], %[c], #-1\n\t"
18508         "ldr	x4, [%[a], x8]\n\t"
18509         "ldr	x5, [%[b], x8]\n\t"
18510         "and	x5, x5, %[m]\n\t"
18511         "adcs	x4, x4, x5\n\t"
18512         "cset	%[c], cs\n\t"
18513         "str	x4, [%[r], x8]\n\t"
18514         "add	x8, x8, #8\n\t"
18515         "cmp	x8, 256\n\t"
18516         "b.lt	1b\n\t"
18517         : [c] "+r" (c)
18518         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
18519         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
18520     );
18521 
18522     return c;
18523 #else
18524     __asm__ __volatile__ (
18525 
18526         "ldp	x5, x7, [%[b], 0]\n\t"
18527         "ldp	x11, x12, [%[b], 16]\n\t"
18528         "ldp	x4, x6, [%[a], 0]\n\t"
18529         "and	x5, x5, %[m]\n\t"
18530         "ldp	x9, x10, [%[a], 16]\n\t"
18531         "and	x7, x7, %[m]\n\t"
18532         "adds	x4, x4, x5\n\t"
18533         "and	x11, x11, %[m]\n\t"
18534         "adcs	x6, x6, x7\n\t"
18535         "and	x12, x12, %[m]\n\t"
18536         "adcs	x9, x9, x11\n\t"
18537         "stp	x4, x6, [%[r], 0]\n\t"
18538         "adcs	x10, x10, x12\n\t"
18539         "stp	x9, x10, [%[r], 16]\n\t"
18540         "ldp	x5, x7, [%[b], 32]\n\t"
18541         "ldp	x11, x12, [%[b], 48]\n\t"
18542         "ldp	x4, x6, [%[a], 32]\n\t"
18543         "and	x5, x5, %[m]\n\t"
18544         "ldp	x9, x10, [%[a], 48]\n\t"
18545         "and	x7, x7, %[m]\n\t"
18546         "adcs	x4, x4, x5\n\t"
18547         "and	x11, x11, %[m]\n\t"
18548         "adcs	x6, x6, x7\n\t"
18549         "and	x12, x12, %[m]\n\t"
18550         "adcs	x9, x9, x11\n\t"
18551         "stp	x4, x6, [%[r], 32]\n\t"
18552         "adcs	x10, x10, x12\n\t"
18553         "stp	x9, x10, [%[r], 48]\n\t"
18554         "ldp	x5, x7, [%[b], 64]\n\t"
18555         "ldp	x11, x12, [%[b], 80]\n\t"
18556         "ldp	x4, x6, [%[a], 64]\n\t"
18557         "and	x5, x5, %[m]\n\t"
18558         "ldp	x9, x10, [%[a], 80]\n\t"
18559         "and	x7, x7, %[m]\n\t"
18560         "adcs	x4, x4, x5\n\t"
18561         "and	x11, x11, %[m]\n\t"
18562         "adcs	x6, x6, x7\n\t"
18563         "and	x12, x12, %[m]\n\t"
18564         "adcs	x9, x9, x11\n\t"
18565         "stp	x4, x6, [%[r], 64]\n\t"
18566         "adcs	x10, x10, x12\n\t"
18567         "stp	x9, x10, [%[r], 80]\n\t"
18568         "ldp	x5, x7, [%[b], 96]\n\t"
18569         "ldp	x11, x12, [%[b], 112]\n\t"
18570         "ldp	x4, x6, [%[a], 96]\n\t"
18571         "and	x5, x5, %[m]\n\t"
18572         "ldp	x9, x10, [%[a], 112]\n\t"
18573         "and	x7, x7, %[m]\n\t"
18574         "adcs	x4, x4, x5\n\t"
18575         "and	x11, x11, %[m]\n\t"
18576         "adcs	x6, x6, x7\n\t"
18577         "and	x12, x12, %[m]\n\t"
18578         "adcs	x9, x9, x11\n\t"
18579         "stp	x4, x6, [%[r], 96]\n\t"
18580         "adcs	x10, x10, x12\n\t"
18581         "stp	x9, x10, [%[r], 112]\n\t"
18582         "ldp	x5, x7, [%[b], 128]\n\t"
18583         "ldp	x11, x12, [%[b], 144]\n\t"
18584         "ldp	x4, x6, [%[a], 128]\n\t"
18585         "and	x5, x5, %[m]\n\t"
18586         "ldp	x9, x10, [%[a], 144]\n\t"
18587         "and	x7, x7, %[m]\n\t"
18588         "adcs	x4, x4, x5\n\t"
18589         "and	x11, x11, %[m]\n\t"
18590         "adcs	x6, x6, x7\n\t"
18591         "and	x12, x12, %[m]\n\t"
18592         "adcs	x9, x9, x11\n\t"
18593         "stp	x4, x6, [%[r], 128]\n\t"
18594         "adcs	x10, x10, x12\n\t"
18595         "stp	x9, x10, [%[r], 144]\n\t"
18596         "ldp	x5, x7, [%[b], 160]\n\t"
18597         "ldp	x11, x12, [%[b], 176]\n\t"
18598         "ldp	x4, x6, [%[a], 160]\n\t"
18599         "and	x5, x5, %[m]\n\t"
18600         "ldp	x9, x10, [%[a], 176]\n\t"
18601         "and	x7, x7, %[m]\n\t"
18602         "adcs	x4, x4, x5\n\t"
18603         "and	x11, x11, %[m]\n\t"
18604         "adcs	x6, x6, x7\n\t"
18605         "and	x12, x12, %[m]\n\t"
18606         "adcs	x9, x9, x11\n\t"
18607         "stp	x4, x6, [%[r], 160]\n\t"
18608         "adcs	x10, x10, x12\n\t"
18609         "stp	x9, x10, [%[r], 176]\n\t"
18610         "ldp	x5, x7, [%[b], 192]\n\t"
18611         "ldp	x11, x12, [%[b], 208]\n\t"
18612         "ldp	x4, x6, [%[a], 192]\n\t"
18613         "and	x5, x5, %[m]\n\t"
18614         "ldp	x9, x10, [%[a], 208]\n\t"
18615         "and	x7, x7, %[m]\n\t"
18616         "adcs	x4, x4, x5\n\t"
18617         "and	x11, x11, %[m]\n\t"
18618         "adcs	x6, x6, x7\n\t"
18619         "and	x12, x12, %[m]\n\t"
18620         "adcs	x9, x9, x11\n\t"
18621         "stp	x4, x6, [%[r], 192]\n\t"
18622         "adcs	x10, x10, x12\n\t"
18623         "stp	x9, x10, [%[r], 208]\n\t"
18624         "ldp	x5, x7, [%[b], 224]\n\t"
18625         "ldp	x11, x12, [%[b], 240]\n\t"
18626         "ldp	x4, x6, [%[a], 224]\n\t"
18627         "and	x5, x5, %[m]\n\t"
18628         "ldp	x9, x10, [%[a], 240]\n\t"
18629         "and	x7, x7, %[m]\n\t"
18630         "adcs	x4, x4, x5\n\t"
18631         "and	x11, x11, %[m]\n\t"
18632         "adcs	x6, x6, x7\n\t"
18633         "and	x12, x12, %[m]\n\t"
18634         "adcs	x9, x9, x11\n\t"
18635         "stp	x4, x6, [%[r], 224]\n\t"
18636         "adcs	x10, x10, x12\n\t"
18637         "stp	x9, x10, [%[r], 240]\n\t"
18638         "cset	%[r], cs\n\t"
18639         : [r] "+r" (r)
18640         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
18641         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
18642     );
18643 
18644     return (sp_digit)r;
18645 #endif /* WOLFSSL_SP_SMALL */
18646 }
18647 
18648 /* RSA private key operation.
18649  *
18650  * in      Array of bytes representing the number to exponentiate, base.
18651  * inLen   Number of bytes in base.
18652  * dm      Private exponent.
18653  * pm      First prime.
18654  * qm      Second prime.
18655  * dpm     First prime's CRT exponent.
18656  * dqm     Second prime's CRT exponent.
18657  * qim     Inverse of second prime mod p.
18658  * mm      Modulus.
18659  * out     Buffer to hold big-endian bytes of exponentiation result.
18660  *         Must be at least 512 bytes long.
18661  * outLen  Number of bytes in result.
18662  * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
18663  * an array is too long and MEMORY_E when dynamic memory allocation fails.
18664  */
sp_RsaPrivate_4096(const byte * in,word32 inLen,const mp_int * dm,const mp_int * pm,const mp_int * qm,const mp_int * dpm,const mp_int * dqm,const mp_int * qim,const mp_int * mm,byte * out,word32 * outLen)18665 int sp_RsaPrivate_4096(const byte* in, word32 inLen, const mp_int* dm,
18666     const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
18667     const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
18668 {
18669 #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
18670 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18671     sp_digit* d = NULL;
18672 #else
18673     sp_digit  d[64 * 4];
18674 #endif
18675     sp_digit* a = NULL;
18676     sp_digit* m = NULL;
18677     sp_digit* r = NULL;
18678     int err = MP_OKAY;
18679 
18680     (void)pm;
18681     (void)qm;
18682     (void)dpm;
18683     (void)dqm;
18684     (void)qim;
18685 
18686     if (*outLen < 512U) {
18687         err = MP_TO_E;
18688     }
18689     if (err == MP_OKAY) {
18690         if (mp_count_bits(dm) > 4096) {
18691            err = MP_READ_E;
18692         }
18693         else if (inLen > 512) {
18694             err = MP_READ_E;
18695         }
18696         else if (mp_count_bits(mm) != 4096) {
18697             err = MP_READ_E;
18698         }
18699         else if (mp_iseven(mm)) {
18700             err = MP_VAL;
18701         }
18702     }
18703 
18704 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18705     if (err == MP_OKAY) {
18706         d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL,
18707                                                               DYNAMIC_TYPE_RSA);
18708         if (d == NULL)
18709             err = MEMORY_E;
18710     }
18711 #endif
18712 
18713     if (err == MP_OKAY) {
18714         a = d + 64;
18715         m = a + 128;
18716         r = a;
18717 
18718         sp_4096_from_bin(a, 64, in, inLen);
18719         sp_4096_from_mp(d, 64, dm);
18720         sp_4096_from_mp(m, 64, mm);
18721         err = sp_4096_mod_exp_64(r, a, d, 4096, m, 0);
18722     }
18723 
18724     if (err == MP_OKAY) {
18725         sp_4096_to_bin_64(r, out);
18726         *outLen = 512;
18727     }
18728 
18729 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18730     if (d != NULL)
18731 #endif
18732     {
18733         /* only "a" and "r" are sensitive and need zeroized (same pointer) */
18734         if (a != NULL)
18735             ForceZero(a, sizeof(sp_digit) * 64);
18736 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18737         XFREE(d, NULL, DYNAMIC_TYPE_RSA);
18738 #endif
18739     }
18740 
18741     return err;
18742 #else
18743 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18744     sp_digit* a = NULL;
18745 #else
18746     sp_digit a[32 * 11];
18747 #endif
18748     sp_digit* p = NULL;
18749     sp_digit* q = NULL;
18750     sp_digit* dp = NULL;
18751     sp_digit* tmpa = NULL;
18752     sp_digit* tmpb = NULL;
18753     sp_digit* r = NULL;
18754     sp_digit* qi = NULL;
18755     sp_digit* dq = NULL;
18756     sp_digit c;
18757     int err = MP_OKAY;
18758 
18759     (void)dm;
18760     (void)mm;
18761 
18762     if (*outLen < 512) {
18763         err = MP_TO_E;
18764     }
18765     else if (inLen > 512 || mp_count_bits(mm) != 4096) {
18766         err = MP_READ_E;
18767     }
18768     else if (mp_iseven(mm)) {
18769         err = MP_VAL;
18770     }
18771 
18772 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18773     if (err == MP_OKAY) {
18774         a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 11, NULL,
18775                                                               DYNAMIC_TYPE_RSA);
18776         if (a == NULL)
18777             err = MEMORY_E;
18778     }
18779 #endif
18780 
18781     if (err == MP_OKAY) {
18782         p = a + 64 * 2;
18783         q = p + 32;
18784         qi = dq = dp = q + 32;
18785         tmpa = qi + 32;
18786         tmpb = tmpa + 64;
18787         r = a;
18788 
18789         sp_4096_from_bin(a, 64, in, inLen);
18790         sp_4096_from_mp(p, 32, pm);
18791         sp_4096_from_mp(q, 32, qm);
18792         sp_4096_from_mp(dp, 32, dpm);
18793 
18794         err = sp_2048_mod_exp_32(tmpa, a, dp, 2048, p, 1);
18795     }
18796     if (err == MP_OKAY) {
18797         sp_4096_from_mp(dq, 32, dqm);
18798         err = sp_2048_mod_exp_32(tmpb, a, dq, 2048, q, 1);
18799     }
18800 
18801     if (err == MP_OKAY) {
18802         c = sp_2048_sub_in_place_32(tmpa, tmpb);
18803         c += sp_4096_cond_add_32(tmpa, tmpa, p, c);
18804         sp_4096_cond_add_32(tmpa, tmpa, p, c);
18805 
18806         sp_2048_from_mp(qi, 32, qim);
18807         sp_2048_mul_32(tmpa, tmpa, qi);
18808         err = sp_2048_mod_32(tmpa, tmpa, p);
18809     }
18810 
18811     if (err == MP_OKAY) {
18812         sp_2048_mul_32(tmpa, q, tmpa);
18813         XMEMSET(&tmpb[32], 0, sizeof(sp_digit) * 32);
18814         sp_4096_add_64(r, tmpb, tmpa);
18815 
18816         sp_4096_to_bin_64(r, out);
18817         *outLen = 512;
18818     }
18819 
18820 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18821     if (a != NULL)
18822 #endif
18823     {
18824         ForceZero(a, sizeof(sp_digit) * 32 * 11);
18825     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
18826         XFREE(a, NULL, DYNAMIC_TYPE_RSA);
18827     #endif
18828     }
18829 #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
18830     return err;
18831 }
18832 #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
18833 #endif /* WOLFSSL_HAVE_SP_RSA */
18834 #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
18835                                               !defined(WOLFSSL_RSA_PUBLIC_ONLY))
18836 /* Convert an array of sp_digit to an mp_int.
18837  *
18838  * a  A single precision integer.
18839  * r  A multi-precision integer.
18840  */
sp_4096_to_mp(const sp_digit * a,mp_int * r)18841 static int sp_4096_to_mp(const sp_digit* a, mp_int* r)
18842 {
18843     int err;
18844 
18845     err = mp_grow(r, (4096 + DIGIT_BIT - 1) / DIGIT_BIT);
18846     if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
18847 #if DIGIT_BIT == 64
18848         XMEMCPY(r->dp, a, sizeof(sp_digit) * 64);
18849         r->used = 64;
18850         mp_clamp(r);
18851 #elif DIGIT_BIT < 64
18852         int i;
18853         int j = 0;
18854         int s = 0;
18855 
18856         r->dp[0] = 0;
18857         for (i = 0; i < 64; i++) {
18858             r->dp[j] |= (mp_digit)(a[i] << s);
18859             r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
18860             s = DIGIT_BIT - s;
18861             r->dp[++j] = (mp_digit)(a[i] >> s);
18862             while (s + DIGIT_BIT <= 64) {
18863                 s += DIGIT_BIT;
18864                 r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
18865                 if (s == SP_WORD_SIZE) {
18866                     r->dp[j] = 0;
18867                 }
18868                 else {
18869                     r->dp[j] = (mp_digit)(a[i] >> s);
18870                 }
18871             }
18872             s = 64 - s;
18873         }
18874         r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
18875         mp_clamp(r);
18876 #else
18877         int i;
18878         int j = 0;
18879         int s = 0;
18880 
18881         r->dp[0] = 0;
18882         for (i = 0; i < 64; i++) {
18883             r->dp[j] |= ((mp_digit)a[i]) << s;
18884             if (s + 64 >= DIGIT_BIT) {
18885     #if DIGIT_BIT != 32 && DIGIT_BIT != 64
18886                 r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
18887     #endif
18888                 s = DIGIT_BIT - s;
18889                 r->dp[++j] = a[i] >> s;
18890                 s = 64 - s;
18891             }
18892             else {
18893                 s += 64;
18894             }
18895         }
18896         r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
18897         mp_clamp(r);
18898 #endif
18899     }
18900 
18901     return err;
18902 }
18903 
18904 /* Perform the modular exponentiation for Diffie-Hellman.
18905  *
18906  * base  Base. MP integer.
18907  * exp   Exponent. MP integer.
18908  * mod   Modulus. MP integer.
18909  * res   Result. MP integer.
18910  * returns 0 on success, MP_READ_E if there are too many bytes in an array
18911  * and MEMORY_E if memory allocation fails.
18912  */
sp_ModExp_4096(const mp_int * base,const mp_int * exp,const mp_int * mod,mp_int * res)18913 int sp_ModExp_4096(const mp_int* base, const mp_int* exp, const mp_int* mod,
18914     mp_int* res)
18915 {
18916     int err = MP_OKAY;
18917     sp_digit b[128];
18918     sp_digit e[64];
18919     sp_digit m[64];
18920     sp_digit* r = b;
18921     int expBits = mp_count_bits(exp);
18922 
18923     if (mp_count_bits(base) > 4096) {
18924         err = MP_READ_E;
18925     }
18926     else if (expBits > 4096) {
18927         err = MP_READ_E;
18928     }
18929     else if (mp_count_bits(mod) != 4096) {
18930         err = MP_READ_E;
18931     }
18932     else if (mp_iseven(mod)) {
18933         err = MP_VAL;
18934     }
18935 
18936     if (err == MP_OKAY) {
18937         sp_4096_from_mp(b, 64, base);
18938         sp_4096_from_mp(e, 64, exp);
18939         sp_4096_from_mp(m, 64, mod);
18940 
18941         err = sp_4096_mod_exp_64(r, b, e, expBits, m, 0);
18942     }
18943 
18944     if (err == MP_OKAY) {
18945         err = sp_4096_to_mp(r, res);
18946     }
18947 
18948     XMEMSET(e, 0, sizeof(e));
18949 
18950     return err;
18951 }
18952 
18953 #ifdef WOLFSSL_HAVE_SP_DH
18954 
18955 #ifdef HAVE_FFDHE_4096
sp_4096_lshift_64(sp_digit * r,sp_digit * a,byte n)18956 static void sp_4096_lshift_64(sp_digit* r, sp_digit* a, byte n)
18957 {
18958     word64 n64 = n;
18959     __asm__ __volatile__ (
18960         "mov	x6, 63\n\t"
18961         "sub	x6, x6, %[n]\n\t"
18962         "ldr	x3, [%[a], 504]\n\t"
18963         "lsr	x4, x3, 1\n\t"
18964         "lsl	x3, x3, %[n]\n\t"
18965         "lsr	x4, x4, x6\n\t"
18966         "ldr	x2, [%[a], 496]\n\t"
18967         "str	x4, [%[r], 512]\n\t"
18968         "lsr	x5, x2, 1\n\t"
18969         "lsl	x2, x2, %[n]\n\t"
18970         "lsr	x5, x5, x6\n\t"
18971         "orr	x3, x3, x5\n\t"
18972         "ldr	x4, [%[a], 488]\n\t"
18973         "str	x3, [%[r], 504]\n\t"
18974         "lsr	x5, x4, 1\n\t"
18975         "lsl	x4, x4, %[n]\n\t"
18976         "lsr	x5, x5, x6\n\t"
18977         "orr	x2, x2, x5\n\t"
18978         "ldr	x3, [%[a], 480]\n\t"
18979         "str	x2, [%[r], 496]\n\t"
18980         "lsr	x5, x3, 1\n\t"
18981         "lsl	x3, x3, %[n]\n\t"
18982         "lsr	x5, x5, x6\n\t"
18983         "orr	x4, x4, x5\n\t"
18984         "ldr	x2, [%[a], 472]\n\t"
18985         "str	x4, [%[r], 488]\n\t"
18986         "lsr	x5, x2, 1\n\t"
18987         "lsl	x2, x2, %[n]\n\t"
18988         "lsr	x5, x5, x6\n\t"
18989         "orr	x3, x3, x5\n\t"
18990         "ldr	x4, [%[a], 464]\n\t"
18991         "str	x3, [%[r], 480]\n\t"
18992         "lsr	x5, x4, 1\n\t"
18993         "lsl	x4, x4, %[n]\n\t"
18994         "lsr	x5, x5, x6\n\t"
18995         "orr	x2, x2, x5\n\t"
18996         "ldr	x3, [%[a], 456]\n\t"
18997         "str	x2, [%[r], 472]\n\t"
18998         "lsr	x5, x3, 1\n\t"
18999         "lsl	x3, x3, %[n]\n\t"
19000         "lsr	x5, x5, x6\n\t"
19001         "orr	x4, x4, x5\n\t"
19002         "ldr	x2, [%[a], 448]\n\t"
19003         "str	x4, [%[r], 464]\n\t"
19004         "lsr	x5, x2, 1\n\t"
19005         "lsl	x2, x2, %[n]\n\t"
19006         "lsr	x5, x5, x6\n\t"
19007         "orr	x3, x3, x5\n\t"
19008         "ldr	x4, [%[a], 440]\n\t"
19009         "str	x3, [%[r], 456]\n\t"
19010         "lsr	x5, x4, 1\n\t"
19011         "lsl	x4, x4, %[n]\n\t"
19012         "lsr	x5, x5, x6\n\t"
19013         "orr	x2, x2, x5\n\t"
19014         "ldr	x3, [%[a], 432]\n\t"
19015         "str	x2, [%[r], 448]\n\t"
19016         "lsr	x5, x3, 1\n\t"
19017         "lsl	x3, x3, %[n]\n\t"
19018         "lsr	x5, x5, x6\n\t"
19019         "orr	x4, x4, x5\n\t"
19020         "ldr	x2, [%[a], 424]\n\t"
19021         "str	x4, [%[r], 440]\n\t"
19022         "lsr	x5, x2, 1\n\t"
19023         "lsl	x2, x2, %[n]\n\t"
19024         "lsr	x5, x5, x6\n\t"
19025         "orr	x3, x3, x5\n\t"
19026         "ldr	x4, [%[a], 416]\n\t"
19027         "str	x3, [%[r], 432]\n\t"
19028         "lsr	x5, x4, 1\n\t"
19029         "lsl	x4, x4, %[n]\n\t"
19030         "lsr	x5, x5, x6\n\t"
19031         "orr	x2, x2, x5\n\t"
19032         "ldr	x3, [%[a], 408]\n\t"
19033         "str	x2, [%[r], 424]\n\t"
19034         "lsr	x5, x3, 1\n\t"
19035         "lsl	x3, x3, %[n]\n\t"
19036         "lsr	x5, x5, x6\n\t"
19037         "orr	x4, x4, x5\n\t"
19038         "ldr	x2, [%[a], 400]\n\t"
19039         "str	x4, [%[r], 416]\n\t"
19040         "lsr	x5, x2, 1\n\t"
19041         "lsl	x2, x2, %[n]\n\t"
19042         "lsr	x5, x5, x6\n\t"
19043         "orr	x3, x3, x5\n\t"
19044         "ldr	x4, [%[a], 392]\n\t"
19045         "str	x3, [%[r], 408]\n\t"
19046         "lsr	x5, x4, 1\n\t"
19047         "lsl	x4, x4, %[n]\n\t"
19048         "lsr	x5, x5, x6\n\t"
19049         "orr	x2, x2, x5\n\t"
19050         "ldr	x3, [%[a], 384]\n\t"
19051         "str	x2, [%[r], 400]\n\t"
19052         "lsr	x5, x3, 1\n\t"
19053         "lsl	x3, x3, %[n]\n\t"
19054         "lsr	x5, x5, x6\n\t"
19055         "orr	x4, x4, x5\n\t"
19056         "ldr	x2, [%[a], 376]\n\t"
19057         "str	x4, [%[r], 392]\n\t"
19058         "lsr	x5, x2, 1\n\t"
19059         "lsl	x2, x2, %[n]\n\t"
19060         "lsr	x5, x5, x6\n\t"
19061         "orr	x3, x3, x5\n\t"
19062         "ldr	x4, [%[a], 368]\n\t"
19063         "str	x3, [%[r], 384]\n\t"
19064         "lsr	x5, x4, 1\n\t"
19065         "lsl	x4, x4, %[n]\n\t"
19066         "lsr	x5, x5, x6\n\t"
19067         "orr	x2, x2, x5\n\t"
19068         "ldr	x3, [%[a], 360]\n\t"
19069         "str	x2, [%[r], 376]\n\t"
19070         "lsr	x5, x3, 1\n\t"
19071         "lsl	x3, x3, %[n]\n\t"
19072         "lsr	x5, x5, x6\n\t"
19073         "orr	x4, x4, x5\n\t"
19074         "ldr	x2, [%[a], 352]\n\t"
19075         "str	x4, [%[r], 368]\n\t"
19076         "lsr	x5, x2, 1\n\t"
19077         "lsl	x2, x2, %[n]\n\t"
19078         "lsr	x5, x5, x6\n\t"
19079         "orr	x3, x3, x5\n\t"
19080         "ldr	x4, [%[a], 344]\n\t"
19081         "str	x3, [%[r], 360]\n\t"
19082         "lsr	x5, x4, 1\n\t"
19083         "lsl	x4, x4, %[n]\n\t"
19084         "lsr	x5, x5, x6\n\t"
19085         "orr	x2, x2, x5\n\t"
19086         "ldr	x3, [%[a], 336]\n\t"
19087         "str	x2, [%[r], 352]\n\t"
19088         "lsr	x5, x3, 1\n\t"
19089         "lsl	x3, x3, %[n]\n\t"
19090         "lsr	x5, x5, x6\n\t"
19091         "orr	x4, x4, x5\n\t"
19092         "ldr	x2, [%[a], 328]\n\t"
19093         "str	x4, [%[r], 344]\n\t"
19094         "lsr	x5, x2, 1\n\t"
19095         "lsl	x2, x2, %[n]\n\t"
19096         "lsr	x5, x5, x6\n\t"
19097         "orr	x3, x3, x5\n\t"
19098         "ldr	x4, [%[a], 320]\n\t"
19099         "str	x3, [%[r], 336]\n\t"
19100         "lsr	x5, x4, 1\n\t"
19101         "lsl	x4, x4, %[n]\n\t"
19102         "lsr	x5, x5, x6\n\t"
19103         "orr	x2, x2, x5\n\t"
19104         "ldr	x3, [%[a], 312]\n\t"
19105         "str	x2, [%[r], 328]\n\t"
19106         "lsr	x5, x3, 1\n\t"
19107         "lsl	x3, x3, %[n]\n\t"
19108         "lsr	x5, x5, x6\n\t"
19109         "orr	x4, x4, x5\n\t"
19110         "ldr	x2, [%[a], 304]\n\t"
19111         "str	x4, [%[r], 320]\n\t"
19112         "lsr	x5, x2, 1\n\t"
19113         "lsl	x2, x2, %[n]\n\t"
19114         "lsr	x5, x5, x6\n\t"
19115         "orr	x3, x3, x5\n\t"
19116         "ldr	x4, [%[a], 296]\n\t"
19117         "str	x3, [%[r], 312]\n\t"
19118         "lsr	x5, x4, 1\n\t"
19119         "lsl	x4, x4, %[n]\n\t"
19120         "lsr	x5, x5, x6\n\t"
19121         "orr	x2, x2, x5\n\t"
19122         "ldr	x3, [%[a], 288]\n\t"
19123         "str	x2, [%[r], 304]\n\t"
19124         "lsr	x5, x3, 1\n\t"
19125         "lsl	x3, x3, %[n]\n\t"
19126         "lsr	x5, x5, x6\n\t"
19127         "orr	x4, x4, x5\n\t"
19128         "ldr	x2, [%[a], 280]\n\t"
19129         "str	x4, [%[r], 296]\n\t"
19130         "lsr	x5, x2, 1\n\t"
19131         "lsl	x2, x2, %[n]\n\t"
19132         "lsr	x5, x5, x6\n\t"
19133         "orr	x3, x3, x5\n\t"
19134         "ldr	x4, [%[a], 272]\n\t"
19135         "str	x3, [%[r], 288]\n\t"
19136         "lsr	x5, x4, 1\n\t"
19137         "lsl	x4, x4, %[n]\n\t"
19138         "lsr	x5, x5, x6\n\t"
19139         "orr	x2, x2, x5\n\t"
19140         "ldr	x3, [%[a], 264]\n\t"
19141         "str	x2, [%[r], 280]\n\t"
19142         "lsr	x5, x3, 1\n\t"
19143         "lsl	x3, x3, %[n]\n\t"
19144         "lsr	x5, x5, x6\n\t"
19145         "orr	x4, x4, x5\n\t"
19146         "ldr	x2, [%[a], 256]\n\t"
19147         "str	x4, [%[r], 272]\n\t"
19148         "lsr	x5, x2, 1\n\t"
19149         "lsl	x2, x2, %[n]\n\t"
19150         "lsr	x5, x5, x6\n\t"
19151         "orr	x3, x3, x5\n\t"
19152         "ldr	x4, [%[a], 248]\n\t"
19153         "str	x3, [%[r], 264]\n\t"
19154         "lsr	x5, x4, 1\n\t"
19155         "lsl	x4, x4, %[n]\n\t"
19156         "lsr	x5, x5, x6\n\t"
19157         "orr	x2, x2, x5\n\t"
19158         "ldr	x3, [%[a], 240]\n\t"
19159         "str	x2, [%[r], 256]\n\t"
19160         "lsr	x5, x3, 1\n\t"
19161         "lsl	x3, x3, %[n]\n\t"
19162         "lsr	x5, x5, x6\n\t"
19163         "orr	x4, x4, x5\n\t"
19164         "ldr	x2, [%[a], 232]\n\t"
19165         "str	x4, [%[r], 248]\n\t"
19166         "lsr	x5, x2, 1\n\t"
19167         "lsl	x2, x2, %[n]\n\t"
19168         "lsr	x5, x5, x6\n\t"
19169         "orr	x3, x3, x5\n\t"
19170         "ldr	x4, [%[a], 224]\n\t"
19171         "str	x3, [%[r], 240]\n\t"
19172         "lsr	x5, x4, 1\n\t"
19173         "lsl	x4, x4, %[n]\n\t"
19174         "lsr	x5, x5, x6\n\t"
19175         "orr	x2, x2, x5\n\t"
19176         "ldr	x3, [%[a], 216]\n\t"
19177         "str	x2, [%[r], 232]\n\t"
19178         "lsr	x5, x3, 1\n\t"
19179         "lsl	x3, x3, %[n]\n\t"
19180         "lsr	x5, x5, x6\n\t"
19181         "orr	x4, x4, x5\n\t"
19182         "ldr	x2, [%[a], 208]\n\t"
19183         "str	x4, [%[r], 224]\n\t"
19184         "lsr	x5, x2, 1\n\t"
19185         "lsl	x2, x2, %[n]\n\t"
19186         "lsr	x5, x5, x6\n\t"
19187         "orr	x3, x3, x5\n\t"
19188         "ldr	x4, [%[a], 200]\n\t"
19189         "str	x3, [%[r], 216]\n\t"
19190         "lsr	x5, x4, 1\n\t"
19191         "lsl	x4, x4, %[n]\n\t"
19192         "lsr	x5, x5, x6\n\t"
19193         "orr	x2, x2, x5\n\t"
19194         "ldr	x3, [%[a], 192]\n\t"
19195         "str	x2, [%[r], 208]\n\t"
19196         "lsr	x5, x3, 1\n\t"
19197         "lsl	x3, x3, %[n]\n\t"
19198         "lsr	x5, x5, x6\n\t"
19199         "orr	x4, x4, x5\n\t"
19200         "ldr	x2, [%[a], 184]\n\t"
19201         "str	x4, [%[r], 200]\n\t"
19202         "lsr	x5, x2, 1\n\t"
19203         "lsl	x2, x2, %[n]\n\t"
19204         "lsr	x5, x5, x6\n\t"
19205         "orr	x3, x3, x5\n\t"
19206         "ldr	x4, [%[a], 176]\n\t"
19207         "str	x3, [%[r], 192]\n\t"
19208         "lsr	x5, x4, 1\n\t"
19209         "lsl	x4, x4, %[n]\n\t"
19210         "lsr	x5, x5, x6\n\t"
19211         "orr	x2, x2, x5\n\t"
19212         "ldr	x3, [%[a], 168]\n\t"
19213         "str	x2, [%[r], 184]\n\t"
19214         "lsr	x5, x3, 1\n\t"
19215         "lsl	x3, x3, %[n]\n\t"
19216         "lsr	x5, x5, x6\n\t"
19217         "orr	x4, x4, x5\n\t"
19218         "ldr	x2, [%[a], 160]\n\t"
19219         "str	x4, [%[r], 176]\n\t"
19220         "lsr	x5, x2, 1\n\t"
19221         "lsl	x2, x2, %[n]\n\t"
19222         "lsr	x5, x5, x6\n\t"
19223         "orr	x3, x3, x5\n\t"
19224         "ldr	x4, [%[a], 152]\n\t"
19225         "str	x3, [%[r], 168]\n\t"
19226         "lsr	x5, x4, 1\n\t"
19227         "lsl	x4, x4, %[n]\n\t"
19228         "lsr	x5, x5, x6\n\t"
19229         "orr	x2, x2, x5\n\t"
19230         "ldr	x3, [%[a], 144]\n\t"
19231         "str	x2, [%[r], 160]\n\t"
19232         "lsr	x5, x3, 1\n\t"
19233         "lsl	x3, x3, %[n]\n\t"
19234         "lsr	x5, x5, x6\n\t"
19235         "orr	x4, x4, x5\n\t"
19236         "ldr	x2, [%[a], 136]\n\t"
19237         "str	x4, [%[r], 152]\n\t"
19238         "lsr	x5, x2, 1\n\t"
19239         "lsl	x2, x2, %[n]\n\t"
19240         "lsr	x5, x5, x6\n\t"
19241         "orr	x3, x3, x5\n\t"
19242         "ldr	x4, [%[a], 128]\n\t"
19243         "str	x3, [%[r], 144]\n\t"
19244         "lsr	x5, x4, 1\n\t"
19245         "lsl	x4, x4, %[n]\n\t"
19246         "lsr	x5, x5, x6\n\t"
19247         "orr	x2, x2, x5\n\t"
19248         "ldr	x3, [%[a], 120]\n\t"
19249         "str	x2, [%[r], 136]\n\t"
19250         "lsr	x5, x3, 1\n\t"
19251         "lsl	x3, x3, %[n]\n\t"
19252         "lsr	x5, x5, x6\n\t"
19253         "orr	x4, x4, x5\n\t"
19254         "ldr	x2, [%[a], 112]\n\t"
19255         "str	x4, [%[r], 128]\n\t"
19256         "lsr	x5, x2, 1\n\t"
19257         "lsl	x2, x2, %[n]\n\t"
19258         "lsr	x5, x5, x6\n\t"
19259         "orr	x3, x3, x5\n\t"
19260         "ldr	x4, [%[a], 104]\n\t"
19261         "str	x3, [%[r], 120]\n\t"
19262         "lsr	x5, x4, 1\n\t"
19263         "lsl	x4, x4, %[n]\n\t"
19264         "lsr	x5, x5, x6\n\t"
19265         "orr	x2, x2, x5\n\t"
19266         "ldr	x3, [%[a], 96]\n\t"
19267         "str	x2, [%[r], 112]\n\t"
19268         "lsr	x5, x3, 1\n\t"
19269         "lsl	x3, x3, %[n]\n\t"
19270         "lsr	x5, x5, x6\n\t"
19271         "orr	x4, x4, x5\n\t"
19272         "ldr	x2, [%[a], 88]\n\t"
19273         "str	x4, [%[r], 104]\n\t"
19274         "lsr	x5, x2, 1\n\t"
19275         "lsl	x2, x2, %[n]\n\t"
19276         "lsr	x5, x5, x6\n\t"
19277         "orr	x3, x3, x5\n\t"
19278         "ldr	x4, [%[a], 80]\n\t"
19279         "str	x3, [%[r], 96]\n\t"
19280         "lsr	x5, x4, 1\n\t"
19281         "lsl	x4, x4, %[n]\n\t"
19282         "lsr	x5, x5, x6\n\t"
19283         "orr	x2, x2, x5\n\t"
19284         "ldr	x3, [%[a], 72]\n\t"
19285         "str	x2, [%[r], 88]\n\t"
19286         "lsr	x5, x3, 1\n\t"
19287         "lsl	x3, x3, %[n]\n\t"
19288         "lsr	x5, x5, x6\n\t"
19289         "orr	x4, x4, x5\n\t"
19290         "ldr	x2, [%[a], 64]\n\t"
19291         "str	x4, [%[r], 80]\n\t"
19292         "lsr	x5, x2, 1\n\t"
19293         "lsl	x2, x2, %[n]\n\t"
19294         "lsr	x5, x5, x6\n\t"
19295         "orr	x3, x3, x5\n\t"
19296         "ldr	x4, [%[a], 56]\n\t"
19297         "str	x3, [%[r], 72]\n\t"
19298         "lsr	x5, x4, 1\n\t"
19299         "lsl	x4, x4, %[n]\n\t"
19300         "lsr	x5, x5, x6\n\t"
19301         "orr	x2, x2, x5\n\t"
19302         "ldr	x3, [%[a], 48]\n\t"
19303         "str	x2, [%[r], 64]\n\t"
19304         "lsr	x5, x3, 1\n\t"
19305         "lsl	x3, x3, %[n]\n\t"
19306         "lsr	x5, x5, x6\n\t"
19307         "orr	x4, x4, x5\n\t"
19308         "ldr	x2, [%[a], 40]\n\t"
19309         "str	x4, [%[r], 56]\n\t"
19310         "lsr	x5, x2, 1\n\t"
19311         "lsl	x2, x2, %[n]\n\t"
19312         "lsr	x5, x5, x6\n\t"
19313         "orr	x3, x3, x5\n\t"
19314         "ldr	x4, [%[a], 32]\n\t"
19315         "str	x3, [%[r], 48]\n\t"
19316         "lsr	x5, x4, 1\n\t"
19317         "lsl	x4, x4, %[n]\n\t"
19318         "lsr	x5, x5, x6\n\t"
19319         "orr	x2, x2, x5\n\t"
19320         "ldr	x3, [%[a], 24]\n\t"
19321         "str	x2, [%[r], 40]\n\t"
19322         "lsr	x5, x3, 1\n\t"
19323         "lsl	x3, x3, %[n]\n\t"
19324         "lsr	x5, x5, x6\n\t"
19325         "orr	x4, x4, x5\n\t"
19326         "ldr	x2, [%[a], 16]\n\t"
19327         "str	x4, [%[r], 32]\n\t"
19328         "lsr	x5, x2, 1\n\t"
19329         "lsl	x2, x2, %[n]\n\t"
19330         "lsr	x5, x5, x6\n\t"
19331         "orr	x3, x3, x5\n\t"
19332         "ldr	x4, [%[a], 8]\n\t"
19333         "str	x3, [%[r], 24]\n\t"
19334         "lsr	x5, x4, 1\n\t"
19335         "lsl	x4, x4, %[n]\n\t"
19336         "lsr	x5, x5, x6\n\t"
19337         "orr	x2, x2, x5\n\t"
19338         "ldr	x3, [%[a], 0]\n\t"
19339         "str	x2, [%[r], 16]\n\t"
19340         "lsr	x5, x3, 1\n\t"
19341         "lsl	x3, x3, %[n]\n\t"
19342         "lsr	x5, x5, x6\n\t"
19343         "orr	x4, x4, x5\n\t"
19344         "str	x3, [%[r]]\n\t"
19345         "str	x4, [%[r], 8]\n\t"
19346         :
19347         : [r] "r" (r), [a] "r" (a), [n] "r" (n64)
19348         : "memory", "x2", "x3", "x4", "x5", "x6"
19349     );
19350 }
19351 
19352 /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
19353  *
19354  * r     A single precision number that is the result of the operation.
19355  * e     A single precision number that is the exponent.
19356  * bits  The number of bits in the exponent.
19357  * m     A single precision number that is the modulus.
19358  * returns  0 on success.
19359  * returns  MEMORY_E on dynamic memory allocation failure.
19360  * returns  MP_VAL when base is even.
19361  */
sp_4096_mod_exp_2_64(sp_digit * r,const sp_digit * e,int bits,const sp_digit * m)19362 static int sp_4096_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits,
19363         const sp_digit* m)
19364 {
19365 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
19366     sp_digit* td = NULL;
19367 #else
19368     sp_digit td[193];
19369 #endif
19370     sp_digit* norm = NULL;
19371     sp_digit* tmp = NULL;
19372     sp_digit mp = 1;
19373     sp_digit n;
19374     sp_digit o;
19375     sp_digit mask;
19376     int i;
19377     int c;
19378     byte y;
19379     int err = MP_OKAY;
19380 
19381     if ((m[0] & 1) == 0) {
19382         err = MP_VAL;
19383     }
19384 
19385 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
19386     if (err == MP_OKAY) {
19387         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL,
19388                                 DYNAMIC_TYPE_TMP_BUFFER);
19389         if (td == NULL)
19390             err = MEMORY_E;
19391     }
19392 #endif
19393 
19394     if (err == MP_OKAY) {
19395         norm = td;
19396         tmp = td + 128;
19397 
19398         sp_4096_mont_setup(m, &mp);
19399         sp_4096_mont_norm_64(norm, m);
19400 
19401         i = (bits - 1) / 64;
19402         n = e[i--];
19403         c = bits & 63;
19404         if (c == 0) {
19405             c = 64;
19406         }
19407         c -= bits % 6;
19408         if (c == 64) {
19409             c = 58;
19410         }
19411         if (c < 0) {
19412             /* Number of bits in top word is less than number needed. */
19413             c = -c;
19414             y = (byte)(n << c);
19415             n = e[i--];
19416             y |= (byte)(n >> (64 - c));
19417             n <<= c;
19418             c = 64 - c;
19419         }
19420         else {
19421             y = (byte)(n >> c);
19422             n <<= 64 - c;
19423         }
19424         sp_4096_lshift_64(r, norm, y);
19425         for (; i>=0 || c>=6; ) {
19426             if (c == 0) {
19427                 n = e[i--];
19428                 y = (byte)(n >> 58);
19429                 n <<= 6;
19430                 c = 58;
19431             }
19432             else if (c < 6) {
19433                 y = (byte)(n >> 58);
19434                 n = e[i--];
19435                 c = 6 - c;
19436                 y |= (byte)(n >> (64 - c));
19437                 n <<= c;
19438                 c = 64 - c;
19439             }
19440             else {
19441                 y = (byte)((n >> 58) & 0x3f);
19442                 n <<= 6;
19443                 c -= 6;
19444             }
19445 
19446             sp_4096_mont_sqr_64(r, r, m, mp);
19447             sp_4096_mont_sqr_64(r, r, m, mp);
19448             sp_4096_mont_sqr_64(r, r, m, mp);
19449             sp_4096_mont_sqr_64(r, r, m, mp);
19450             sp_4096_mont_sqr_64(r, r, m, mp);
19451             sp_4096_mont_sqr_64(r, r, m, mp);
19452 
19453             sp_4096_lshift_64(r, r, y);
19454             sp_4096_mul_d_64(tmp, norm, r[64]);
19455             r[64] = 0;
19456             o = sp_4096_add_64(r, r, tmp);
19457             sp_4096_cond_sub_64(r, r, m, (sp_digit)0 - o);
19458         }
19459 
19460         XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
19461         sp_4096_mont_reduce_64(r, m, mp);
19462 
19463         mask = 0 - (sp_4096_cmp_64(r, m) >= 0);
19464         sp_4096_cond_sub_64(r, r, m, mask);
19465     }
19466 
19467 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
19468     if (td != NULL)
19469         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
19470 #endif
19471 
19472     return err;
19473 }
19474 #endif /* HAVE_FFDHE_4096 */
19475 
19476 /* Perform the modular exponentiation for Diffie-Hellman.
19477  *
19478  * base     Base.
19479  * exp      Array of bytes that is the exponent.
19480  * expLen   Length of data, in bytes, in exponent.
19481  * mod      Modulus.
19482  * out      Buffer to hold big-endian bytes of exponentiation result.
19483  *          Must be at least 512 bytes long.
19484  * outLen   Length, in bytes, of exponentiation result.
19485  * returns 0 on success, MP_READ_E if there are too many bytes in an array
19486  * and MEMORY_E if memory allocation fails.
19487  */
sp_DhExp_4096(const mp_int * base,const byte * exp,word32 expLen,const mp_int * mod,byte * out,word32 * outLen)19488 int sp_DhExp_4096(const mp_int* base, const byte* exp, word32 expLen,
19489     const mp_int* mod, byte* out, word32* outLen)
19490 {
19491     int err = MP_OKAY;
19492     sp_digit b[128];
19493     sp_digit e[64];
19494     sp_digit m[64];
19495     sp_digit* r = b;
19496     word32 i;
19497 
19498     if (mp_count_bits(base) > 4096) {
19499         err = MP_READ_E;
19500     }
19501     else if (expLen > 512) {
19502         err = MP_READ_E;
19503     }
19504     else if (mp_count_bits(mod) != 4096) {
19505         err = MP_READ_E;
19506     }
19507     else if (mp_iseven(mod)) {
19508         err = MP_VAL;
19509     }
19510 
19511     if (err == MP_OKAY) {
19512         sp_4096_from_mp(b, 64, base);
19513         sp_4096_from_bin(e, 64, exp, expLen);
19514         sp_4096_from_mp(m, 64, mod);
19515 
19516     #ifdef HAVE_FFDHE_4096
19517         if (base->used == 1 && base->dp[0] == 2 && m[63] == (sp_digit)-1)
19518             err = sp_4096_mod_exp_2_64(r, e, expLen * 8, m);
19519         else
19520     #endif
19521             err = sp_4096_mod_exp_64(r, b, e, expLen * 8, m, 0);
19522 
19523     }
19524 
19525     if (err == MP_OKAY) {
19526         sp_4096_to_bin_64(r, out);
19527         *outLen = 512;
19528         for (i=0; i<512 && out[i] == 0; i++) {
19529             /* Search for first non-zero. */
19530         }
19531         *outLen -= i;
19532         XMEMMOVE(out, out + i, *outLen);
19533 
19534     }
19535 
19536     XMEMSET(e, 0, sizeof(e));
19537 
19538     return err;
19539 }
19540 #endif /* WOLFSSL_HAVE_SP_DH */
19541 
19542 #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
19543 
19544 #endif /* WOLFSSL_SP_4096 */
19545 
19546 #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH */
19547 #ifdef WOLFSSL_HAVE_SP_ECC
19548 #ifndef WOLFSSL_SP_NO_256
19549 
19550 /* Point structure to use. */
19551 typedef struct sp_point_256 {
19552     /* X ordinate of point. */
19553     sp_digit x[2 * 4];
19554     /* Y ordinate of point. */
19555     sp_digit y[2 * 4];
19556     /* Z ordinate of point. */
19557     sp_digit z[2 * 4];
19558     /* Indicates point is at infinity. */
19559     int infinity;
19560 } sp_point_256;
19561 
19562 /* The modulus (prime) of the curve P256. */
19563 static const sp_digit p256_mod[4] = {
19564     0xffffffffffffffffL,0x00000000ffffffffL,0x0000000000000000L,
19565     0xffffffff00000001L
19566 };
19567 /* The Montgomery normalizer for modulus of the curve P256. */
19568 static const sp_digit p256_norm_mod[4] = {
19569     0x0000000000000001L,0xffffffff00000000L,0xffffffffffffffffL,
19570     0x00000000fffffffeL
19571 };
19572 /* The Montgomery multiplier for modulus of the curve P256. */
19573 static const sp_digit p256_mp_mod = 0x0000000000000001;
19574 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
19575                                             defined(HAVE_ECC_VERIFY)
19576 /* The order of the curve P256. */
19577 static const sp_digit p256_order[4] = {
19578     0xf3b9cac2fc632551L,0xbce6faada7179e84L,0xffffffffffffffffL,
19579     0xffffffff00000000L
19580 };
19581 #endif
19582 /* The order of the curve P256 minus 2. */
19583 static const sp_digit p256_order2[4] = {
19584     0xf3b9cac2fc63254fL,0xbce6faada7179e84L,0xffffffffffffffffL,
19585     0xffffffff00000000L
19586 };
19587 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
19588 /* The Montgomery normalizer for order of the curve P256. */
19589 static const sp_digit p256_norm_order[4] = {
19590     0x0c46353d039cdaafL,0x4319055258e8617bL,0x0000000000000000L,
19591     0x00000000ffffffffL
19592 };
19593 #endif
19594 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
19595 /* The Montgomery multiplier for order of the curve P256. */
19596 static const sp_digit p256_mp_order = 0xccd1c8aaee00bc4fL;
19597 #endif
19598 #ifdef WOLFSSL_SP_SMALL
19599 /* The base point of curve P256. */
19600 static const sp_point_256 p256_base = {
19601     /* X ordinate */
19602     {
19603         0xf4a13945d898c296L,0x77037d812deb33a0L,0xf8bce6e563a440f2L,
19604         0x6b17d1f2e12c4247L,
19605         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0
19606     },
19607     /* Y ordinate */
19608     {
19609         0xcbb6406837bf51f5L,0x2bce33576b315eceL,0x8ee7eb4a7c0f9e16L,
19610         0x4fe342e2fe1a7f9bL,
19611         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0
19612     },
19613     /* Z ordinate */
19614     {
19615         0x0000000000000001L,0x0000000000000000L,0x0000000000000000L,
19616         0x0000000000000000L,
19617         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0
19618     },
19619     /* infinity */
19620     0
19621 };
19622 #endif /* WOLFSSL_SP_SMALL */
19623 #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
19624 static const sp_digit p256_b[4] = {
19625     0x3bce3c3e27d2604bL,0x651d06b0cc53b0f6L,0xb3ebbd55769886bcL,
19626     0x5ac635d8aa3a93e7L
19627 };
19628 #endif
19629 
19630 #ifdef WOLFSSL_SP_SMALL
19631 /* Multiply a and b into r. (r = a * b)
19632  *
19633  * r  A single precision integer.
19634  * a  A single precision integer.
19635  * b  A single precision integer.
19636  */
sp_256_mul_4(sp_digit * r,const sp_digit * a,const sp_digit * b)19637 static void sp_256_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b)
19638 {
19639     sp_digit tmp[8];
19640 
19641     __asm__ __volatile__ (
19642         "mov	x5, 0\n\t"
19643         "mov	x6, 0\n\t"
19644         "mov	x7, 0\n\t"
19645         "mov	x8, 0\n\t"
19646         "\n1:\n\t"
19647         "subs	x3, x5, 24\n\t"
19648         "csel	x3, xzr, x3, cc\n\t"
19649         "sub	x4, x5, x3\n\t"
19650         "\n2:\n\t"
19651         "ldr	x10, [%[a], x3]\n\t"
19652         "ldr	x11, [%[b], x4]\n\t"
19653         "mul	x9, x10, x11\n\t"
19654         "umulh	x10, x10, x11\n\t"
19655         "adds	x6, x6, x9\n\t"
19656         "adcs	x7, x7, x10\n\t"
19657         "adc	x8, x8, xzr\n\t"
19658         "add	x3, x3, #8\n\t"
19659         "sub	x4, x4, #8\n\t"
19660         "cmp	x3, 32\n\t"
19661         "b.eq	3f\n\t"
19662         "cmp	x3, x5\n\t"
19663         "b.le	2b\n\t"
19664         "\n3:\n\t"
19665         "str	x6, [%[r], x5]\n\t"
19666         "mov	x6, x7\n\t"
19667         "mov	x7, x8\n\t"
19668         "mov	x8, #0\n\t"
19669         "add	x5, x5, #8\n\t"
19670         "cmp	x5, 48\n\t"
19671         "b.le	1b\n\t"
19672         "str	x6, [%[r], x5]\n\t"
19673         :
19674         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
19675         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
19676     );
19677 
19678     XMEMCPY(r, tmp, sizeof(tmp));
19679 }
19680 
19681 #else
19682 /* Multiply a and b into r. (r = a * b)
19683  *
19684  * r  A single precision integer.
19685  * a  A single precision integer.
19686  * b  A single precision integer.
19687  */
sp_256_mul_4(sp_digit * r,const sp_digit * a,const sp_digit * b)19688 static void sp_256_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b)
19689 {
19690     sp_digit tmp[4];
19691 
19692     __asm__ __volatile__ (
19693         "ldp       x16, x17, [%[a], 0]\n\t"
19694         "ldp       x21, x22, [%[b], 0]\n\t"
19695         "#  A[0] * B[0]\n\t"
19696         "mul       x8, x16, x21\n\t"
19697         "ldr       x19, [%[a], 16]\n\t"
19698         "umulh     x9, x16, x21\n\t"
19699         "ldr       x23, [%[b], 16]\n\t"
19700         "#  A[0] * B[1]\n\t"
19701         "mul       x4, x16, x22\n\t"
19702         "ldr       x20, [%[a], 24]\n\t"
19703         "umulh     x5, x16, x22\n\t"
19704         "ldr       x24, [%[b], 24]\n\t"
19705         "adds  x9, x9, x4\n\t"
19706         "#  A[1] * B[0]\n\t"
19707         "mul       x4, x17, x21\n\t"
19708         "adc   x10, xzr, x5\n\t"
19709         "umulh     x5, x17, x21\n\t"
19710         "adds  x9, x9, x4\n\t"
19711         "#  A[0] * B[2]\n\t"
19712         "mul       x4, x16, x23\n\t"
19713         "adcs   x10, x10, x5\n\t"
19714         "umulh     x5, x16, x23\n\t"
19715         "adc     x11, xzr, xzr\n\t"
19716         "adds  x10, x10, x4\n\t"
19717         "#  A[1] * B[1]\n\t"
19718         "mul       x4, x17, x22\n\t"
19719         "adc   x11, x11, x5\n\t"
19720         "umulh     x5, x17, x22\n\t"
19721         "adds  x10, x10, x4\n\t"
19722         "#  A[2] * B[0]\n\t"
19723         "mul       x4, x19, x21\n\t"
19724         "adcs   x11, x11, x5\n\t"
19725         "umulh     x5, x19, x21\n\t"
19726         "adc     x12, xzr, xzr\n\t"
19727         "adds  x10, x10, x4\n\t"
19728         "#  A[0] * B[3]\n\t"
19729         "mul       x4, x16, x24\n\t"
19730         "adcs   x11, x11, x5\n\t"
19731         "umulh     x5, x16, x24\n\t"
19732         "adc     x12, x12, xzr\n\t"
19733         "adds  x11, x11, x4\n\t"
19734         "#  A[1] * B[2]\n\t"
19735         "mul       x4, x17, x23\n\t"
19736         "adcs   x12, x12, x5\n\t"
19737         "umulh     x5, x17, x23\n\t"
19738         "adc     x13, xzr, xzr\n\t"
19739         "adds  x11, x11, x4\n\t"
19740         "#  A[2] * B[1]\n\t"
19741         "mul       x4, x19, x22\n\t"
19742         "adcs   x12, x12, x5\n\t"
19743         "umulh     x5, x19, x22\n\t"
19744         "adc     x13, x13, xzr\n\t"
19745         "adds  x11, x11, x4\n\t"
19746         "#  A[3] * B[0]\n\t"
19747         "mul       x4, x20, x21\n\t"
19748         "adcs   x12, x12, x5\n\t"
19749         "umulh     x5, x20, x21\n\t"
19750         "adc     x13, x13, xzr\n\t"
19751         "adds  x11, x11, x4\n\t"
19752         "#  A[1] * B[3]\n\t"
19753         "mul       x4, x17, x24\n\t"
19754         "adcs   x12, x12, x5\n\t"
19755         "umulh     x5, x17, x24\n\t"
19756         "adc     x13, x13, xzr\n\t"
19757         "adds  x12, x12, x4\n\t"
19758         "#  A[2] * B[2]\n\t"
19759         "mul       x4, x19, x23\n\t"
19760         "adcs   x13, x13, x5\n\t"
19761         "umulh     x5, x19, x23\n\t"
19762         "adc     x14, xzr, xzr\n\t"
19763         "adds  x12, x12, x4\n\t"
19764         "#  A[3] * B[1]\n\t"
19765         "mul       x4, x20, x22\n\t"
19766         "adcs   x13, x13, x5\n\t"
19767         "umulh     x5, x20, x22\n\t"
19768         "adc     x14, x14, xzr\n\t"
19769         "adds  x12, x12, x4\n\t"
19770         "#  A[2] * B[3]\n\t"
19771         "mul       x4, x19, x24\n\t"
19772         "adcs   x13, x13, x5\n\t"
19773         "umulh     x5, x19, x24\n\t"
19774         "adc     x14, x14, xzr\n\t"
19775         "adds  x13, x13, x4\n\t"
19776         "#  A[3] * B[2]\n\t"
19777         "mul       x4, x20, x23\n\t"
19778         "adcs   x14, x14, x5\n\t"
19779         "umulh     x5, x20, x23\n\t"
19780         "adc     x15, xzr, xzr\n\t"
19781         "adds  x13, x13, x4\n\t"
19782         "#  A[3] * B[3]\n\t"
19783         "mul       x4, x20, x24\n\t"
19784         "adcs   x14, x14, x5\n\t"
19785         "umulh     x5, x20, x24\n\t"
19786         "adc     x15, x15, xzr\n\t"
19787         "adds  x14, x14, x4\n\t"
19788         "adc   x15, x15, x5\n\t"
19789         "stp	x8, x9, [%[r], 0]\n\t"
19790         "stp	x10, x11, [%[r], 16]\n\t"
19791         "stp	x12, x13, [%[r], 32]\n\t"
19792         "stp	x14, x15, [%[r], 48]\n\t"
19793         :
19794         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp)
19795         : "memory", "x4", "x5", "x6", "x7", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15"
19796     );
19797 }
19798 
19799 #endif /* WOLFSSL_SP_SMALL */
19800 /* Square a and put result in r. (r = a * a)
19801  *
19802  * r  A single precision integer.
19803  * a  A single precision integer.
19804  */
sp_256_sqr_4(sp_digit * r,const sp_digit * a)19805 static void sp_256_sqr_4(sp_digit* r, const sp_digit* a)
19806 {
19807     __asm__ __volatile__ (
19808         "ldp       x16, x17, [%[a], 0]\n\t"
19809         "#  A[0] * A[1]\n\t"
19810         "mul	x9, x16, x17\n\t"
19811         "ldr       x19, [%[a], 16]\n\t"
19812         "umulh	x10, x16, x17\n\t"
19813         "ldr       x20, [%[a], 24]\n\t"
19814         "#  A[0] * A[2]\n\t"
19815         "mul	x4, x16, x19\n\t"
19816         "umulh	x5, x16, x19\n\t"
19817         "adds	x10, x10, x4\n\t"
19818         "#  A[0] * A[3]\n\t"
19819         "mul	x4, x16, x20\n\t"
19820         "adc	x11, xzr, x5\n\t"
19821         "umulh	x5, x16, x20\n\t"
19822         "adds	x11, x11, x4\n\t"
19823         "#  A[1] * A[2]\n\t"
19824         "mul	x4, x17, x19\n\t"
19825         "adc	x12, xzr, x5\n\t"
19826         "umulh	x5, x17, x19\n\t"
19827         "adds	x11, x11, x4\n\t"
19828         "#  A[1] * A[3]\n\t"
19829         "mul	x4, x17, x20\n\t"
19830         "adcs	x12, x12, x5\n\t"
19831         "umulh	x5, x17, x20\n\t"
19832         "adc	x13, xzr, xzr\n\t"
19833         "adds	x12, x12, x4\n\t"
19834         "#  A[2] * A[3]\n\t"
19835         "mul	x4, x19, x20\n\t"
19836         "adc	x13, x13, x5\n\t"
19837         "umulh	x5, x19, x20\n\t"
19838         "adds	x13, x13, x4\n\t"
19839         "adc	x14, xzr, x5\n\t"
19840         "# Double\n\t"
19841         "adds	x9, x9, x9\n\t"
19842         "adcs	x10, x10, x10\n\t"
19843         "adcs	x11, x11, x11\n\t"
19844         "adcs	x12, x12, x12\n\t"
19845         "adcs	x13, x13, x13\n\t"
19846         "#  A[0] * A[0]\n\t"
19847         "mul	x8, x16, x16\n\t"
19848         "adcs	x14, x14, x14\n\t"
19849         "umulh	x3, x16, x16\n\t"
19850         "cset	x15, cs\n\t"
19851         "#  A[1] * A[1]\n\t"
19852         "mul	x4, x17, x17\n\t"
19853         "adds	x9, x9, x3\n\t"
19854         "umulh	x5, x17, x17\n\t"
19855         "adcs	x10, x10, x4\n\t"
19856         "#  A[2] * A[2]\n\t"
19857         "mul	x6, x19, x19\n\t"
19858         "adcs	x11, x11, x5\n\t"
19859         "umulh	x7, x19, x19\n\t"
19860         "adcs	x12, x12, x6\n\t"
19861         "#  A[3] * A[3]\n\t"
19862         "mul	x16, x20, x20\n\t"
19863         "adcs	x13, x13, x7\n\t"
19864         "umulh	x17, x20, x20\n\t"
19865         "adcs	x14, x14, x16\n\t"
19866         "adc	x15, x15, x17\n\t"
19867         "stp	x8, x9, [%[r], 0]\n\t"
19868         "stp	x10, x11, [%[r], 16]\n\t"
19869         "stp	x12, x13, [%[r], 32]\n\t"
19870         "stp	x14, x15, [%[r], 48]\n\t"
19871         :
19872         : [r] "r" (r), [a] "r" (a)
19873         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20"
19874     );
19875 }
19876 
19877 /* Add b to a into r. (r = a + b)
19878  *
19879  * r  A single precision integer.
19880  * a  A single precision integer.
19881  * b  A single precision integer.
19882  */
sp_256_add_4(sp_digit * r,const sp_digit * a,const sp_digit * b)19883 static sp_digit sp_256_add_4(sp_digit* r, const sp_digit* a,
19884         const sp_digit* b)
19885 {
19886     __asm__ __volatile__ (
19887         "ldp	x3, x4, [%[a], 0]\n\t"
19888         "ldp	x7, x8, [%[b], 0]\n\t"
19889         "adds	x3, x3, x7\n\t"
19890         "ldp	x5, x6, [%[a], 16]\n\t"
19891         "adcs	x4, x4, x8\n\t"
19892         "ldp	x9, x10, [%[b], 16]\n\t"
19893         "adcs	x5, x5, x9\n\t"
19894         "stp	x3, x4, [%[r], 0]\n\t"
19895         "adcs	x6, x6, x10\n\t"
19896         "stp	x5, x6, [%[r], 16]\n\t"
19897         "cset	%[r], cs\n\t"
19898         : [r] "+r" (r)
19899         : [a] "r" (a), [b] "r" (b)
19900         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
19901     );
19902 
19903     return (sp_digit)r;
19904 }
19905 
19906 /* Sub b from a into r. (r = a - b)
19907  *
19908  * r  A single precision integer.
19909  * a  A single precision integer.
19910  * b  A single precision integer.
19911  */
sp_256_sub_4(sp_digit * r,const sp_digit * a,const sp_digit * b)19912 static sp_digit sp_256_sub_4(sp_digit* r, const sp_digit* a,
19913         const sp_digit* b)
19914 {
19915     __asm__ __volatile__ (
19916         "ldp	x3, x4, [%[a], 0]\n\t"
19917         "ldp	x7, x8, [%[b], 0]\n\t"
19918         "subs	x3, x3, x7\n\t"
19919         "ldp	x5, x6, [%[a], 16]\n\t"
19920         "sbcs	x4, x4, x8\n\t"
19921         "ldp	x9, x10, [%[b], 16]\n\t"
19922         "sbcs	x5, x5, x9\n\t"
19923         "stp	x3, x4, [%[r], 0]\n\t"
19924         "sbcs	x6, x6, x10\n\t"
19925         "stp	x5, x6, [%[r], 16]\n\t"
19926         "csetm	%[r], cc\n\t"
19927         : [r] "+r" (r)
19928         : [a] "r" (a), [b] "r" (b)
19929         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
19930     );
19931 
19932     return (sp_digit)r;
19933 }
19934 
19935 /* Multiply a number by Montgomery normalizer mod modulus (prime).
19936  *
19937  * r  The resulting Montgomery form number.
19938  * a  The number to convert.
19939  * m  The modulus (prime).
19940  */
sp_256_mod_mul_norm_4(sp_digit * r,const sp_digit * a,const sp_digit * m)19941 static int sp_256_mod_mul_norm_4(sp_digit* r, const sp_digit* a, const sp_digit* m)
19942 {
19943     int64_t t[8];
19944     int64_t a32[8];
19945     int64_t o;
19946 
19947     (void)m;
19948 
19949     a32[0] = a[0] & 0xffffffff;
19950     a32[1] = a[0] >> 32;
19951     a32[2] = a[1] & 0xffffffff;
19952     a32[3] = a[1] >> 32;
19953     a32[4] = a[2] & 0xffffffff;
19954     a32[5] = a[2] >> 32;
19955     a32[6] = a[3] & 0xffffffff;
19956     a32[7] = a[3] >> 32;
19957 
19958     /*  1  1  0 -1 -1 -1 -1  0 */
19959     t[0] = 0 + a32[0] + a32[1] - a32[3] - a32[4] - a32[5] - a32[6];
19960     /*  0  1  1  0 -1 -1 -1 -1 */
19961     t[1] = 0 + a32[1] + a32[2] - a32[4] - a32[5] - a32[6] - a32[7];
19962     /*  0  0  1  1  0 -1 -1 -1 */
19963     t[2] = 0 + a32[2] + a32[3] - a32[5] - a32[6] - a32[7];
19964     /* -1 -1  0  2  2  1  0 -1 */
19965     t[3] = 0 - a32[0] - a32[1] + 2 * a32[3] + 2 * a32[4] + a32[5] - a32[7];
19966     /*  0 -1 -1  0  2  2  1  0 */
19967     t[4] = 0 - a32[1] - a32[2] + 2 * a32[4] + 2 * a32[5] + a32[6];
19968     /*  0  0 -1 -1  0  2  2  1 */
19969     t[5] = 0 - a32[2] - a32[3] + 2 * a32[5] + 2 * a32[6] + a32[7];
19970     /* -1 -1  0  0  0  1  3  2 */
19971     t[6] = 0 - a32[0] - a32[1] + a32[5] + 3 * a32[6] + 2 * a32[7];
19972     /*  1  0 -1 -1 -1 -1  0  3 */
19973     t[7] = 0 + a32[0] - a32[2] - a32[3] - a32[4] - a32[5] + 3 * a32[7];
19974 
19975     t[1] += t[0] >> 32; t[0] &= 0xffffffff;
19976     t[2] += t[1] >> 32; t[1] &= 0xffffffff;
19977     t[3] += t[2] >> 32; t[2] &= 0xffffffff;
19978     t[4] += t[3] >> 32; t[3] &= 0xffffffff;
19979     t[5] += t[4] >> 32; t[4] &= 0xffffffff;
19980     t[6] += t[5] >> 32; t[5] &= 0xffffffff;
19981     t[7] += t[6] >> 32; t[6] &= 0xffffffff;
19982     o     = t[7] >> 32; t[7] &= 0xffffffff;
19983     t[0] += o;
19984     t[3] -= o;
19985     t[6] -= o;
19986     t[7] += o;
19987     t[1] += t[0] >> 32; t[0] &= 0xffffffff;
19988     t[2] += t[1] >> 32; t[1] &= 0xffffffff;
19989     t[3] += t[2] >> 32; t[2] &= 0xffffffff;
19990     t[4] += t[3] >> 32; t[3] &= 0xffffffff;
19991     t[5] += t[4] >> 32; t[4] &= 0xffffffff;
19992     t[6] += t[5] >> 32; t[5] &= 0xffffffff;
19993     t[7] += t[6] >> 32; t[6] &= 0xffffffff;
19994     r[0] = (t[1] << 32) | t[0];
19995     r[1] = (t[3] << 32) | t[2];
19996     r[2] = (t[5] << 32) | t[4];
19997     r[3] = (t[7] << 32) | t[6];
19998 
19999     return MP_OKAY;
20000 }
20001 
20002 /* Convert an mp_int to an array of sp_digit.
20003  *
20004  * r  A single precision integer.
20005  * size  Maximum number of bytes to convert
20006  * a  A multi-precision integer.
20007  */
sp_256_from_mp(sp_digit * r,int size,const mp_int * a)20008 static void sp_256_from_mp(sp_digit* r, int size, const mp_int* a)
20009 {
20010 #if DIGIT_BIT == 64
20011     int j;
20012 
20013     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
20014 
20015     for (j = a->used; j < size; j++) {
20016         r[j] = 0;
20017     }
20018 #elif DIGIT_BIT > 64
20019     int i;
20020     int j = 0;
20021     word32 s = 0;
20022 
20023     r[0] = 0;
20024     for (i = 0; i < a->used && j < size; i++) {
20025         r[j] |= ((sp_digit)a->dp[i] << s);
20026         r[j] &= 0xffffffffffffffffl;
20027         s = 64U - s;
20028         if (j + 1 >= size) {
20029             break;
20030         }
20031         /* lint allow cast of mismatch word32 and mp_digit */
20032         r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
20033         while ((s + 64U) <= (word32)DIGIT_BIT) {
20034             s += 64U;
20035             r[j] &= 0xffffffffffffffffl;
20036             if (j + 1 >= size) {
20037                 break;
20038             }
20039             if (s < (word32)DIGIT_BIT) {
20040                 /* lint allow cast of mismatch word32 and mp_digit */
20041                 r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
20042             }
20043             else {
20044                 r[++j] = (sp_digit)0;
20045             }
20046         }
20047         s = (word32)DIGIT_BIT - s;
20048     }
20049 
20050     for (j++; j < size; j++) {
20051         r[j] = 0;
20052     }
20053 #else
20054     int i;
20055     int j = 0;
20056     int s = 0;
20057 
20058     r[0] = 0;
20059     for (i = 0; i < a->used && j < size; i++) {
20060         r[j] |= ((sp_digit)a->dp[i]) << s;
20061         if (s + DIGIT_BIT >= 64) {
20062             r[j] &= 0xffffffffffffffffl;
20063             if (j + 1 >= size) {
20064                 break;
20065             }
20066             s = 64 - s;
20067             if (s == DIGIT_BIT) {
20068                 r[++j] = 0;
20069                 s = 0;
20070             }
20071             else {
20072                 r[++j] = a->dp[i] >> s;
20073                 s = DIGIT_BIT - s;
20074             }
20075         }
20076         else {
20077             s += DIGIT_BIT;
20078         }
20079     }
20080 
20081     for (j++; j < size; j++) {
20082         r[j] = 0;
20083     }
20084 #endif
20085 }
20086 
20087 /* Convert a point of type ecc_point to type sp_point_256.
20088  *
20089  * p   Point of type sp_point_256 (result).
20090  * pm  Point of type ecc_point.
20091  */
sp_256_point_from_ecc_point_4(sp_point_256 * p,const ecc_point * pm)20092 static void sp_256_point_from_ecc_point_4(sp_point_256* p,
20093         const ecc_point* pm)
20094 {
20095     XMEMSET(p->x, 0, sizeof(p->x));
20096     XMEMSET(p->y, 0, sizeof(p->y));
20097     XMEMSET(p->z, 0, sizeof(p->z));
20098     sp_256_from_mp(p->x, 4, pm->x);
20099     sp_256_from_mp(p->y, 4, pm->y);
20100     sp_256_from_mp(p->z, 4, pm->z);
20101     p->infinity = 0;
20102 }
20103 
20104 /* Convert an array of sp_digit to an mp_int.
20105  *
20106  * a  A single precision integer.
20107  * r  A multi-precision integer.
20108  */
sp_256_to_mp(const sp_digit * a,mp_int * r)20109 static int sp_256_to_mp(const sp_digit* a, mp_int* r)
20110 {
20111     int err;
20112 
20113     err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
20114     if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
20115 #if DIGIT_BIT == 64
20116         XMEMCPY(r->dp, a, sizeof(sp_digit) * 4);
20117         r->used = 4;
20118         mp_clamp(r);
20119 #elif DIGIT_BIT < 64
20120         int i;
20121         int j = 0;
20122         int s = 0;
20123 
20124         r->dp[0] = 0;
20125         for (i = 0; i < 4; i++) {
20126             r->dp[j] |= (mp_digit)(a[i] << s);
20127             r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
20128             s = DIGIT_BIT - s;
20129             r->dp[++j] = (mp_digit)(a[i] >> s);
20130             while (s + DIGIT_BIT <= 64) {
20131                 s += DIGIT_BIT;
20132                 r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
20133                 if (s == SP_WORD_SIZE) {
20134                     r->dp[j] = 0;
20135                 }
20136                 else {
20137                     r->dp[j] = (mp_digit)(a[i] >> s);
20138                 }
20139             }
20140             s = 64 - s;
20141         }
20142         r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
20143         mp_clamp(r);
20144 #else
20145         int i;
20146         int j = 0;
20147         int s = 0;
20148 
20149         r->dp[0] = 0;
20150         for (i = 0; i < 4; i++) {
20151             r->dp[j] |= ((mp_digit)a[i]) << s;
20152             if (s + 64 >= DIGIT_BIT) {
20153     #if DIGIT_BIT != 32 && DIGIT_BIT != 64
20154                 r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
20155     #endif
20156                 s = DIGIT_BIT - s;
20157                 r->dp[++j] = a[i] >> s;
20158                 s = 64 - s;
20159             }
20160             else {
20161                 s += 64;
20162             }
20163         }
20164         r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
20165         mp_clamp(r);
20166 #endif
20167     }
20168 
20169     return err;
20170 }
20171 
20172 /* Convert a point of type sp_point_256 to type ecc_point.
20173  *
20174  * p   Point of type sp_point_256.
20175  * pm  Point of type ecc_point (result).
20176  * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
20177  * MP_OKAY.
20178  */
sp_256_point_to_ecc_point_4(const sp_point_256 * p,ecc_point * pm)20179 static int sp_256_point_to_ecc_point_4(const sp_point_256* p, ecc_point* pm)
20180 {
20181     int err;
20182 
20183     err = sp_256_to_mp(p->x, pm->x);
20184     if (err == MP_OKAY) {
20185         err = sp_256_to_mp(p->y, pm->y);
20186     }
20187     if (err == MP_OKAY) {
20188         err = sp_256_to_mp(p->z, pm->z);
20189     }
20190 
20191     return err;
20192 }
20193 
20194 /* Conditionally copy a into r using the mask m.
20195  * m is -1 to copy and 0 when not.
20196  *
20197  * r  A single precision number to copy over.
20198  * a  A single precision number to copy.
20199  * m  Mask value to apply.
20200  */
sp_256_cond_copy_4(sp_digit * r,const sp_digit * a,sp_digit m)20201 static void sp_256_cond_copy_4(sp_digit* r, const sp_digit* a, sp_digit m)
20202 {
20203     __asm__ __volatile__ (
20204         "ldp	x3, x4, [%[r], 0]\n\t"
20205         "ldp	x7, x8, [%[a], 0]\n\t"
20206         "eor	x7, x7, x3\n\t"
20207         "ldp	x5, x6, [%[r], 16]\n\t"
20208         "eor	x8, x8, x4\n\t"
20209         "ldp	x9, x10, [%[a], 16]\n\t"
20210         "eor	x9, x9, x5\n\t"
20211         "eor	x10, x10, x6\n\t"
20212         "and	x7, x7, %[m]\n\t"
20213         "and	x8, x8, %[m]\n\t"
20214         "and	x9, x9, %[m]\n\t"
20215         "and	x10, x10, %[m]\n\t"
20216         "eor	x3, x3, x7\n\t"
20217         "eor	x4, x4, x8\n\t"
20218         "eor	x5, x5, x9\n\t"
20219         "stp	x3, x4, [%[r], 0]\n\t"
20220         "eor	x6, x6, x10\n\t"
20221         "stp	x5, x6, [%[r], 16]\n\t"
20222         :
20223         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
20224         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
20225     );
20226 }
20227 
20228 /* Multiply two Montgomery form numbers mod the modulus (prime).
20229  * (r = a * b mod m)
20230  *
20231  * r   Result of multiplication.
20232  * a   First number to multiply in Montgomery form.
20233  * b   Second number to multiply in Montgomery form.
20234  * m   Modulus (prime).
20235  * mp  Montgomery mulitplier.
20236  */
sp_256_mont_mul_4(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m,sp_digit mp)20237 SP_NOINLINE static void sp_256_mont_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b,
20238         const sp_digit* m, sp_digit mp)
20239 {
20240     (void)m;
20241     (void)mp;
20242 
20243     __asm__ __volatile__ (
20244         "ldp       x16, x17, [%[a], 0]\n\t"
20245         "ldp       x21, x22, [%[b], 0]\n\t"
20246         "#  A[0] * B[0]\n\t"
20247         "mul       x8, x16, x21\n\t"
20248         "ldr       x19, [%[a], 16]\n\t"
20249         "umulh     x9, x16, x21\n\t"
20250         "ldr       x23, [%[b], 16]\n\t"
20251         "#  A[0] * B[1]\n\t"
20252         "mul       x4, x16, x22\n\t"
20253         "ldr       x20, [%[a], 24]\n\t"
20254         "umulh     x5, x16, x22\n\t"
20255         "ldr       x24, [%[b], 24]\n\t"
20256         "adds  x9, x9, x4\n\t"
20257         "#  A[1] * B[0]\n\t"
20258         "mul       x4, x17, x21\n\t"
20259         "adc   x10, xzr, x5\n\t"
20260         "umulh     x5, x17, x21\n\t"
20261         "adds  x9, x9, x4\n\t"
20262         "#  A[0] * B[2]\n\t"
20263         "mul       x4, x16, x23\n\t"
20264         "adcs   x10, x10, x5\n\t"
20265         "umulh     x5, x16, x23\n\t"
20266         "adc     x11, xzr, xzr\n\t"
20267         "adds  x10, x10, x4\n\t"
20268         "#  A[1] * B[1]\n\t"
20269         "mul       x4, x17, x22\n\t"
20270         "adc   x11, x11, x5\n\t"
20271         "umulh     x5, x17, x22\n\t"
20272         "adds  x10, x10, x4\n\t"
20273         "#  A[2] * B[0]\n\t"
20274         "mul       x4, x19, x21\n\t"
20275         "adcs   x11, x11, x5\n\t"
20276         "umulh     x5, x19, x21\n\t"
20277         "adc     x12, xzr, xzr\n\t"
20278         "adds  x10, x10, x4\n\t"
20279         "#  A[0] * B[3]\n\t"
20280         "mul       x4, x16, x24\n\t"
20281         "adcs   x11, x11, x5\n\t"
20282         "umulh     x5, x16, x24\n\t"
20283         "adc     x12, x12, xzr\n\t"
20284         "adds  x11, x11, x4\n\t"
20285         "#  A[1] * B[2]\n\t"
20286         "mul       x4, x17, x23\n\t"
20287         "adcs   x12, x12, x5\n\t"
20288         "umulh     x5, x17, x23\n\t"
20289         "adc     x13, xzr, xzr\n\t"
20290         "adds  x11, x11, x4\n\t"
20291         "#  A[2] * B[1]\n\t"
20292         "mul       x4, x19, x22\n\t"
20293         "adcs   x12, x12, x5\n\t"
20294         "umulh     x5, x19, x22\n\t"
20295         "adc     x13, x13, xzr\n\t"
20296         "adds  x11, x11, x4\n\t"
20297         "#  A[3] * B[0]\n\t"
20298         "mul       x4, x20, x21\n\t"
20299         "adcs   x12, x12, x5\n\t"
20300         "umulh     x5, x20, x21\n\t"
20301         "adc     x13, x13, xzr\n\t"
20302         "adds  x11, x11, x4\n\t"
20303         "#  A[1] * B[3]\n\t"
20304         "mul       x4, x17, x24\n\t"
20305         "adcs   x12, x12, x5\n\t"
20306         "umulh     x5, x17, x24\n\t"
20307         "adc     x13, x13, xzr\n\t"
20308         "adds  x12, x12, x4\n\t"
20309         "#  A[2] * B[2]\n\t"
20310         "mul       x4, x19, x23\n\t"
20311         "adcs   x13, x13, x5\n\t"
20312         "umulh     x5, x19, x23\n\t"
20313         "adc     x14, xzr, xzr\n\t"
20314         "adds  x12, x12, x4\n\t"
20315         "#  A[3] * B[1]\n\t"
20316         "mul       x4, x20, x22\n\t"
20317         "adcs   x13, x13, x5\n\t"
20318         "umulh     x5, x20, x22\n\t"
20319         "adc     x14, x14, xzr\n\t"
20320         "adds  x12, x12, x4\n\t"
20321         "#  A[2] * B[3]\n\t"
20322         "mul       x4, x19, x24\n\t"
20323         "adcs   x13, x13, x5\n\t"
20324         "umulh     x5, x19, x24\n\t"
20325         "adc     x14, x14, xzr\n\t"
20326         "adds  x13, x13, x4\n\t"
20327         "#  A[3] * B[2]\n\t"
20328         "mul       x4, x20, x23\n\t"
20329         "adcs   x14, x14, x5\n\t"
20330         "umulh     x5, x20, x23\n\t"
20331         "adc     x15, xzr, xzr\n\t"
20332         "adds  x13, x13, x4\n\t"
20333         "#  A[3] * B[3]\n\t"
20334         "mul       x4, x20, x24\n\t"
20335         "adcs   x14, x14, x5\n\t"
20336         "umulh     x5, x20, x24\n\t"
20337         "adc     x15, x15, xzr\n\t"
20338         "adds  x14, x14, x4\n\t"
20339         "mov	x4, x8\n\t"
20340         "adc   x15, x15, x5\n\t"
20341         "# Start Reduction\n\t"
20342         "mov	x5, x9\n\t"
20343         "mov	x6, x10\n\t"
20344         "# mu = a[0]-a[3] + a[0]-a[2] << 32 << 64 + (a[0] * 2) << 192\n\t"
20345         "#    - a[0] << 32 << 192\n\t"
20346         "#   + (a[0] * 2) << 192\n\t"
20347         "#   a[0]-a[2] << 32\n\t"
20348         "lsl	x10, x10, 32\n\t"
20349         "add	x7, x11, x8\n\t"
20350         "eor	x10, x10, x9, lsr #32\n\t"
20351         "lsl	x9, x9, 32\n\t"
20352         "add	x7, x7, x8\n\t"
20353         "eor	x9, x9, x8, lsr #32\n\t"
20354         "#   + a[0]-a[2] << 32 << 64\n\t"
20355         "#   - a[0] << 32 << 192\n\t"
20356         "adds	x5, x5, x8, lsl #32\n\t"
20357         "sub	x7, x7, x8, lsl #32\n\t"
20358         "adcs	x6, x6, x9\n\t"
20359         "adc	x7, x7, x10\n\t"
20360         "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t"
20361         "#   a += mu << 256\n\t"
20362         "adds	x12, x12, x4\n\t"
20363         "adcs	x13, x13, x5\n\t"
20364         "adcs	x14, x14, x6\n\t"
20365         "adcs	x15, x15, x7\n\t"
20366         "cset	x8, cs\n\t"
20367         "#   a += mu << 192\n\t"
20368         "# mu <<= 32\n\t"
20369         "#   a += (mu << 32) << 64\n\t"
20370         "adds	x11, x11, x4\n\t"
20371         "adcs	x12, x12, x5\n\t"
20372         "adcs	x13, x13, x6\n\t"
20373         "lsr	x16, x7, 32\n\t"
20374         "adcs	x14, x14, x7\n\t"
20375         "lsl	x7, x7, 32\n\t"
20376         "adcs	x15, x15, xzr\n\t"
20377         "eor	x7, x7, x6, lsr #32\n\t"
20378         "adc	x8, x8, xzr\n\t"
20379         "lsl	x6, x6, 32\n\t"
20380         "eor	x6, x6, x5, lsr #32\n\t"
20381         "adds	x11, x11, x6\n\t"
20382         "lsl	x5, x5, 32\n\t"
20383         "adcs	x12, x12, x7\n\t"
20384         "eor	x5, x5, x4, lsr #32\n\t"
20385         "adcs	x13, x13, x16\n\t"
20386         "lsl	x4, x4, 32\n\t"
20387         "adcs	x14, x14, xzr\n\t"
20388         "adcs	x15, x15, xzr\n\t"
20389         "adc	x8, x8, xzr\n\t"
20390         "#   a -= (mu << 32) << 192\n\t"
20391         "subs	x11, x11, x4\n\t"
20392         "sbcs	x12, x12, x5\n\t"
20393         "sbcs	x13, x13, x6\n\t"
20394         "sub	x8, xzr, x8\n\t"
20395         "sbcs	x14, x14, x7\n\t"
20396         "sub	x8, x8, #1\n\t"
20397         "sbcs	x15, x15, x16\n\t"
20398         "mov	x19, 0xffffffff00000001\n\t"
20399         "adc	x8, x8, xzr\n\t"
20400         "# mask m and sub from result if overflow\n\t"
20401         "#  m[0] = -1 & mask = mask\n\t"
20402         "subs	x12, x12, x8\n\t"
20403         "#  m[1] = 0xffffffff & mask = mask >> 32 as mask is all 1s or 0s\n\t"
20404         "lsr	x17, x8, 32\n\t"
20405         "sbcs	x13, x13, x17\n\t"
20406         "and	x19, x19, x8\n\t"
20407         "#  m[2] =  0 & mask = 0\n\t"
20408         "sbcs	x14, x14, xzr\n\t"
20409         "stp	x12, x13, [%[r], 0]\n\t"
20410         "#  m[3] =  0xffffffff00000001 & mask\n\t"
20411         "sbc	x15, x15, x19\n\t"
20412         "stp	x14, x15, [%[r], 16]\n\t"
20413         : [a] "+r" (a), [b] "+r" (b)
20414         : [r] "r" (r)
20415         : "memory", "x4", "x5", "x6", "x7", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15"
20416     );
20417 }
20418 
20419 /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m)
20420  *
20421  * r   Result of squaring.
20422  * a   Number to square in Montgomery form.
20423  * m   Modulus (prime).
20424  * mp  Montgomery mulitplier.
20425  */
sp_256_mont_sqr_4(sp_digit * r,const sp_digit * a,const sp_digit * m,sp_digit mp)20426 SP_NOINLINE static void sp_256_mont_sqr_4(sp_digit* r, const sp_digit* a, const sp_digit* m,
20427         sp_digit mp)
20428 {
20429     (void)m;
20430     (void)mp;
20431 
20432     __asm__ __volatile__ (
20433         "ldp       x16, x17, [%[a], 0]\n\t"
20434         "#  A[0] * A[1]\n\t"
20435         "mul	x9, x16, x17\n\t"
20436         "ldr       x19, [%[a], 16]\n\t"
20437         "umulh	x10, x16, x17\n\t"
20438         "ldr       x20, [%[a], 24]\n\t"
20439         "#  A[0] * A[2]\n\t"
20440         "mul	x4, x16, x19\n\t"
20441         "umulh	x5, x16, x19\n\t"
20442         "adds	x10, x10, x4\n\t"
20443         "#  A[0] * A[3]\n\t"
20444         "mul	x4, x16, x20\n\t"
20445         "adc	x11, xzr, x5\n\t"
20446         "umulh	x5, x16, x20\n\t"
20447         "adds	x11, x11, x4\n\t"
20448         "#  A[1] * A[2]\n\t"
20449         "mul	x4, x17, x19\n\t"
20450         "adc	x12, xzr, x5\n\t"
20451         "umulh	x5, x17, x19\n\t"
20452         "adds	x11, x11, x4\n\t"
20453         "#  A[1] * A[3]\n\t"
20454         "mul	x4, x17, x20\n\t"
20455         "adcs	x12, x12, x5\n\t"
20456         "umulh	x5, x17, x20\n\t"
20457         "adc	x13, xzr, xzr\n\t"
20458         "adds	x12, x12, x4\n\t"
20459         "#  A[2] * A[3]\n\t"
20460         "mul	x4, x19, x20\n\t"
20461         "adc	x13, x13, x5\n\t"
20462         "umulh	x5, x19, x20\n\t"
20463         "adds	x13, x13, x4\n\t"
20464         "adc	x14, xzr, x5\n\t"
20465         "# Double\n\t"
20466         "adds	x9, x9, x9\n\t"
20467         "adcs	x10, x10, x10\n\t"
20468         "adcs	x11, x11, x11\n\t"
20469         "adcs	x12, x12, x12\n\t"
20470         "adcs	x13, x13, x13\n\t"
20471         "#  A[0] * A[0]\n\t"
20472         "mul	x8, x16, x16\n\t"
20473         "adcs	x14, x14, x14\n\t"
20474         "umulh	x3, x16, x16\n\t"
20475         "cset	x15, cs\n\t"
20476         "#  A[1] * A[1]\n\t"
20477         "mul	x4, x17, x17\n\t"
20478         "adds	x9, x9, x3\n\t"
20479         "umulh	x5, x17, x17\n\t"
20480         "adcs	x10, x10, x4\n\t"
20481         "#  A[2] * A[2]\n\t"
20482         "mul	x6, x19, x19\n\t"
20483         "adcs	x11, x11, x5\n\t"
20484         "umulh	x7, x19, x19\n\t"
20485         "adcs	x12, x12, x6\n\t"
20486         "#  A[3] * A[3]\n\t"
20487         "mul	x16, x20, x20\n\t"
20488         "adcs	x13, x13, x7\n\t"
20489         "umulh	x17, x20, x20\n\t"
20490         "adcs	x14, x14, x16\n\t"
20491         "mov	x3, x8\n\t"
20492         "adc	x15, x15, x17\n\t"
20493         "# Start Reduction\n\t"
20494         "mov	x4, x9\n\t"
20495         "mov	x5, x10\n\t"
20496         "# mu = a[0]-a[3] + a[0]-a[2] << 32 << 64 + (a[0] * 2) << 192\n\t"
20497         "#    - a[0] << 32 << 192\n\t"
20498         "#   + (a[0] * 2) << 192\n\t"
20499         "#   a[0]-a[2] << 32\n\t"
20500         "lsl	x10, x10, 32\n\t"
20501         "add	x6, x11, x8\n\t"
20502         "eor	x10, x10, x9, lsr #32\n\t"
20503         "lsl	x9, x9, 32\n\t"
20504         "add	x6, x6, x8\n\t"
20505         "eor	x9, x9, x8, lsr #32\n\t"
20506         "#   + a[0]-a[2] << 32 << 64\n\t"
20507         "#   - a[0] << 32 << 192\n\t"
20508         "adds	x4, x4, x8, lsl #32\n\t"
20509         "sub	x6, x6, x8, lsl #32\n\t"
20510         "adcs	x5, x5, x9\n\t"
20511         "adc	x6, x6, x10\n\t"
20512         "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t"
20513         "#   a += mu << 256\n\t"
20514         "adds	x12, x12, x3\n\t"
20515         "adcs	x13, x13, x4\n\t"
20516         "adcs	x14, x14, x5\n\t"
20517         "adcs	x15, x15, x6\n\t"
20518         "cset	x8, cs\n\t"
20519         "#   a += mu << 192\n\t"
20520         "# mu <<= 32\n\t"
20521         "#   a += (mu << 32) << 64\n\t"
20522         "adds	x11, x11, x3\n\t"
20523         "adcs	x12, x12, x4\n\t"
20524         "adcs	x13, x13, x5\n\t"
20525         "lsr	x7, x6, 32\n\t"
20526         "adcs	x14, x14, x6\n\t"
20527         "lsl	x6, x6, 32\n\t"
20528         "adcs	x15, x15, xzr\n\t"
20529         "eor	x6, x6, x5, lsr #32\n\t"
20530         "adc	x8, x8, xzr\n\t"
20531         "lsl	x5, x5, 32\n\t"
20532         "eor	x5, x5, x4, lsr #32\n\t"
20533         "adds	x11, x11, x5\n\t"
20534         "lsl	x4, x4, 32\n\t"
20535         "adcs	x12, x12, x6\n\t"
20536         "eor	x4, x4, x3, lsr #32\n\t"
20537         "adcs	x13, x13, x7\n\t"
20538         "lsl	x3, x3, 32\n\t"
20539         "adcs	x14, x14, xzr\n\t"
20540         "adcs	x15, x15, xzr\n\t"
20541         "adc	x8, x8, xzr\n\t"
20542         "#   a -= (mu << 32) << 192\n\t"
20543         "subs	x11, x11, x3\n\t"
20544         "sbcs	x12, x12, x4\n\t"
20545         "sbcs	x13, x13, x5\n\t"
20546         "sub	x8, xzr, x8\n\t"
20547         "sbcs	x14, x14, x6\n\t"
20548         "sub	x8, x8, #1\n\t"
20549         "sbcs	x15, x15, x7\n\t"
20550         "mov	x17, 0xffffffff00000001\n\t"
20551         "adc	x8, x8, xzr\n\t"
20552         "# mask m and sub from result if overflow\n\t"
20553         "#  m[0] = -1 & mask = mask\n\t"
20554         "subs	x12, x12, x8\n\t"
20555         "#  m[1] = 0xffffffff & mask = mask >> 32 as mask is all 1s or 0s\n\t"
20556         "lsr	x16, x8, 32\n\t"
20557         "sbcs	x13, x13, x16\n\t"
20558         "and	x17, x17, x8\n\t"
20559         "#  m[2] =  0 & mask = 0\n\t"
20560         "sbcs	x14, x14, xzr\n\t"
20561         "stp	x12, x13, [%[r], 0]\n\t"
20562         "#  m[3] =  0xffffffff00000001 & mask\n\t"
20563         "sbc	x15, x15, x17\n\t"
20564         "stp	x14, x15, [%[r], 16]\n\t"
20565         :
20566         : [r] "r" (r), [a] "r" (a)
20567         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20"
20568     );
20569 }
20570 
20571 #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
20572 /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
20573  *
20574  * r   Result of squaring.
20575  * a   Number to square in Montgomery form.
20576  * n   Number of times to square.
20577  * m   Modulus (prime).
20578  * mp  Montgomery mulitplier.
20579  */
sp_256_mont_sqr_n_4(sp_digit * r,const sp_digit * a,int n,const sp_digit * m,sp_digit mp)20580 static void sp_256_mont_sqr_n_4(sp_digit* r, const sp_digit* a, int n,
20581         const sp_digit* m, sp_digit mp)
20582 {
20583     sp_256_mont_sqr_4(r, a, m, mp);
20584     for (; n > 1; n--) {
20585         sp_256_mont_sqr_4(r, r, m, mp);
20586     }
20587 }
20588 
20589 #endif /* !WOLFSSL_SP_SMALL | HAVE_COMP_KEY */
20590 #ifdef WOLFSSL_SP_SMALL
20591 /* Mod-2 for the P256 curve. */
20592 static const uint64_t p256_mod_minus_2[4] = {
20593     0xfffffffffffffffdU,0x00000000ffffffffU,0x0000000000000000U,
20594     0xffffffff00000001U
20595 };
20596 #endif /* !WOLFSSL_SP_SMALL */
20597 
20598 /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
20599  * P256 curve. (r = 1 / a mod m)
20600  *
20601  * r   Inverse result.
20602  * a   Number to invert.
20603  * td  Temporary data.
20604  */
sp_256_mont_inv_4(sp_digit * r,const sp_digit * a,sp_digit * td)20605 static void sp_256_mont_inv_4(sp_digit* r, const sp_digit* a, sp_digit* td)
20606 {
20607 #ifdef WOLFSSL_SP_SMALL
20608     sp_digit* t = td;
20609     int i;
20610 
20611     XMEMCPY(t, a, sizeof(sp_digit) * 4);
20612     for (i=254; i>=0; i--) {
20613         sp_256_mont_sqr_4(t, t, p256_mod, p256_mp_mod);
20614         if (p256_mod_minus_2[i / 64] & ((sp_digit)1 << (i % 64)))
20615             sp_256_mont_mul_4(t, t, a, p256_mod, p256_mp_mod);
20616     }
20617     XMEMCPY(r, t, sizeof(sp_digit) * 4);
20618 #else
20619     sp_digit* t1 = td;
20620     sp_digit* t2 = td + 2 * 4;
20621     sp_digit* t3 = td + 4 * 4;
20622     /* 0x2 */
20623     sp_256_mont_sqr_4(t1, a, p256_mod, p256_mp_mod);
20624     /* 0x3 */
20625     sp_256_mont_mul_4(t2, t1, a, p256_mod, p256_mp_mod);
20626     /* 0xc */
20627     sp_256_mont_sqr_n_4(t1, t2, 2, p256_mod, p256_mp_mod);
20628     /* 0xd */
20629     sp_256_mont_mul_4(t3, t1, a, p256_mod, p256_mp_mod);
20630     /* 0xf */
20631     sp_256_mont_mul_4(t2, t2, t1, p256_mod, p256_mp_mod);
20632     /* 0xf0 */
20633     sp_256_mont_sqr_n_4(t1, t2, 4, p256_mod, p256_mp_mod);
20634     /* 0xfd */
20635     sp_256_mont_mul_4(t3, t3, t1, p256_mod, p256_mp_mod);
20636     /* 0xff */
20637     sp_256_mont_mul_4(t2, t2, t1, p256_mod, p256_mp_mod);
20638     /* 0xff00 */
20639     sp_256_mont_sqr_n_4(t1, t2, 8, p256_mod, p256_mp_mod);
20640     /* 0xfffd */
20641     sp_256_mont_mul_4(t3, t3, t1, p256_mod, p256_mp_mod);
20642     /* 0xffff */
20643     sp_256_mont_mul_4(t2, t2, t1, p256_mod, p256_mp_mod);
20644     /* 0xffff0000 */
20645     sp_256_mont_sqr_n_4(t1, t2, 16, p256_mod, p256_mp_mod);
20646     /* 0xfffffffd */
20647     sp_256_mont_mul_4(t3, t3, t1, p256_mod, p256_mp_mod);
20648     /* 0xffffffff */
20649     sp_256_mont_mul_4(t2, t2, t1, p256_mod, p256_mp_mod);
20650     /* 0xffffffff00000000 */
20651     sp_256_mont_sqr_n_4(t1, t2, 32, p256_mod, p256_mp_mod);
20652     /* 0xffffffffffffffff */
20653     sp_256_mont_mul_4(t2, t2, t1, p256_mod, p256_mp_mod);
20654     /* 0xffffffff00000001 */
20655     sp_256_mont_mul_4(r, t1, a, p256_mod, p256_mp_mod);
20656     /* 0xffffffff000000010000000000000000000000000000000000000000 */
20657     sp_256_mont_sqr_n_4(r, r, 160, p256_mod, p256_mp_mod);
20658     /* 0xffffffff00000001000000000000000000000000ffffffffffffffff */
20659     sp_256_mont_mul_4(r, r, t2, p256_mod, p256_mp_mod);
20660     /* 0xffffffff00000001000000000000000000000000ffffffffffffffff00000000 */
20661     sp_256_mont_sqr_n_4(r, r, 32, p256_mod, p256_mp_mod);
20662     /* 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffd */
20663     sp_256_mont_mul_4(r, r, t3, p256_mod, p256_mp_mod);
20664 #endif /* WOLFSSL_SP_SMALL */
20665 }
20666 
20667 /* Compare a with b in constant time.
20668  *
20669  * a  A single precision integer.
20670  * b  A single precision integer.
20671  * return -ve, 0 or +ve if a is less than, equal to or greater than b
20672  * respectively.
20673  */
sp_256_cmp_4(const sp_digit * a,const sp_digit * b)20674 static sp_int64 sp_256_cmp_4(const sp_digit* a, const sp_digit* b)
20675 {
20676 #ifdef WOLFSSL_SP_SMALL
20677     __asm__ __volatile__ (
20678         "mov	x2, -1\n\t"
20679         "mov	x3, 1\n\t"
20680         "mov	x4, -1\n\t"
20681         "mov	x5, 24\n\t"
20682         "1:\n\t"
20683         "ldr	x6, [%[a], x5]\n\t"
20684         "ldr	x7, [%[b], x5]\n\t"
20685         "and	x6, x6, x4\n\t"
20686         "and	x7, x7, x4\n\t"
20687         "subs	x6, x6, x7\n\t"
20688         "csel	x2, x3, x2, hi\n\t"
20689         "csel	x2, x4, x2, lo\n\t"
20690         "csel	x4, x4, xzr, eq\n\t"
20691         "subs	x5, x5, #8\n\t"
20692         "b.cs	1b\n\t"
20693         "eor	%[a], x2, x4\n\t"
20694         : [a] "+r" (a)
20695         : [b] "r" (b)
20696         : "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12"
20697     );
20698 #else
20699     __asm__ __volatile__ (
20700         "mov	x2, -1\n\t"
20701         "mov	x3, 1\n\t"
20702         "mov	x4, -1\n\t"
20703         "ldp	x5, x6, [%[a], 0]\n\t"
20704         "ldp	x7, x8, [%[a], 16]\n\t"
20705         "ldp	x9, x10, [%[b], 0]\n\t"
20706         "ldp	x11, x12, [%[b], 16]\n\t"
20707         "and	x8, x8, x4\n\t"
20708         "and	x12, x12, x4\n\t"
20709         "subs	x8, x8, x12\n\t"
20710         "csel	x2, x4, x2, lo\n\t"
20711         "csel	x4, x4, xzr, eq\n\t"
20712         "csel	x2, x3, x2, hi\n\t"
20713         "and	x7, x7, x4\n\t"
20714         "and	x11, x11, x4\n\t"
20715         "subs	x7, x7, x11\n\t"
20716         "csel	x2, x4, x2, lo\n\t"
20717         "csel	x4, x4, xzr, eq\n\t"
20718         "csel	x2, x3, x2, hi\n\t"
20719         "and	x6, x6, x4\n\t"
20720         "and	x10, x10, x4\n\t"
20721         "subs	x6, x6, x10\n\t"
20722         "csel	x2, x4, x2, lo\n\t"
20723         "csel	x4, x4, xzr, eq\n\t"
20724         "csel	x2, x3, x2, hi\n\t"
20725         "and	x5, x5, x4\n\t"
20726         "and	x9, x9, x4\n\t"
20727         "subs	x5, x5, x9\n\t"
20728         "csel	x2, x4, x2, lo\n\t"
20729         "csel	x4, x4, xzr, eq\n\t"
20730         "csel	x2, x3, x2, hi\n\t"
20731         "eor	%[a], x2, x4\n\t"
20732         : [a] "+r" (a)
20733         : [b] "r" (b)
20734         : "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12"
20735     );
20736 #endif
20737 
20738     return (sp_int64)a;
20739 }
20740 
20741 /* Normalize the values in each word to 64.
20742  *
20743  * a  Array of sp_digit to normalize.
20744  */
20745 #define sp_256_norm_4(a)
20746 
20747 /* Conditionally subtract b from a using the mask m.
20748  * m is -1 to subtract and 0 when not copying.
20749  *
20750  * r  A single precision number representing condition subtract result.
20751  * a  A single precision number to subtract from.
20752  * b  A single precision number to subtract.
20753  * m  Mask value to apply.
20754  */
sp_256_cond_sub_4(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)20755 static sp_digit sp_256_cond_sub_4(sp_digit* r, const sp_digit* a, const sp_digit* b,
20756         sp_digit m)
20757 {
20758     __asm__ __volatile__ (
20759 
20760         "ldp	x5, x7, [%[b], 0]\n\t"
20761         "ldp	x11, x12, [%[b], 16]\n\t"
20762         "ldp	x4, x6, [%[a], 0]\n\t"
20763         "and	x5, x5, %[m]\n\t"
20764         "ldp	x9, x10, [%[a], 16]\n\t"
20765         "and	x7, x7, %[m]\n\t"
20766         "subs	x4, x4, x5\n\t"
20767         "and	x11, x11, %[m]\n\t"
20768         "sbcs	x6, x6, x7\n\t"
20769         "and	x12, x12, %[m]\n\t"
20770         "sbcs	x9, x9, x11\n\t"
20771         "stp	x4, x6, [%[r], 0]\n\t"
20772         "sbcs	x10, x10, x12\n\t"
20773         "stp	x9, x10, [%[r], 16]\n\t"
20774         "csetm	%[r], cc\n\t"
20775         : [r] "+r" (r)
20776         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
20777         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
20778     );
20779 
20780     return (sp_digit)r;
20781 }
20782 
20783 #define sp_256_mont_reduce_order_4    sp_256_mont_reduce_4
20784 
20785 /* Reduce the number back to 256 bits using Montgomery reduction.
20786  *
20787  * a   A single precision number to reduce in place.
20788  * m   The single precision number representing the modulus.
20789  * mp  The digit representing the negative inverse of m mod 2^n.
20790  */
sp_256_mont_reduce_4(sp_digit * a,const sp_digit * m,sp_digit mp)20791 SP_NOINLINE static void sp_256_mont_reduce_4(sp_digit* a, const sp_digit* m,
20792         sp_digit mp)
20793 {
20794     __asm__ __volatile__ (
20795         "ldp	x9, x10, [%[a], 0]\n\t"
20796         "ldp	x11, x12, [%[a], 16]\n\t"
20797         "ldp	x17, x19, [%[m], 0]\n\t"
20798         "ldp	x20, x21, [%[m], 16]\n\t"
20799         "mov	x8, xzr\n\t"
20800         "# mu = a[0] * mp\n\t"
20801         "mul	x5, %[mp], x9\n\t"
20802         "ldr	x13, [%[a], 32]\n\t"
20803         "# a[0+0] += m[0] * mu\n\t"
20804         "mul	x3, x17, x5\n\t"
20805         "ldr	x14, [%[a], 40]\n\t"
20806         "umulh	x6, x17, x5\n\t"
20807         "ldr	x15, [%[a], 48]\n\t"
20808         "adds	x9, x9, x3\n\t"
20809         "ldr	x16, [%[a], 56]\n\t"
20810         "adc	x6, x6, xzr\n\t"
20811         "# a[0+1] += m[1] * mu\n\t"
20812         "mul	x3, x19, x5\n\t"
20813         "umulh	x7, x19, x5\n\t"
20814         "adds	x3, x3, x6\n\t"
20815         "adc	x7, x7, xzr\n\t"
20816         "adds	x10, x10, x3\n\t"
20817         "adc	x7, x7, xzr\n\t"
20818         "# a[0+2] += m[2] * mu\n\t"
20819         "mul	x3, x20, x5\n\t"
20820         "umulh	x6, x20, x5\n\t"
20821         "adds	x3, x3, x7\n\t"
20822         "adc	x6, x6, xzr\n\t"
20823         "adds	x11, x11, x3\n\t"
20824         "adc	x6, x6, xzr\n\t"
20825         "# a[0+3] += m[3] * mu\n\t"
20826         "mul	x3, x21, x5\n\t"
20827         "umulh	x4, x21, x5\n\t"
20828         "adds	x3, x3, x6\n\t"
20829         "adcs	x4, x4, x8\n\t"
20830         "cset	x8, cs\n\t"
20831         "adds	x12, x12, x3\n\t"
20832         "adcs	x13, x13, x4\n\t"
20833         "adc	x8, x8, xzr\n\t"
20834         "# mu = a[1] * mp\n\t"
20835         "mul	x5, %[mp], x10\n\t"
20836         "# a[1+0] += m[0] * mu\n\t"
20837         "mul	x3, x17, x5\n\t"
20838         "umulh	x6, x17, x5\n\t"
20839         "adds	x10, x10, x3\n\t"
20840         "adc	x6, x6, xzr\n\t"
20841         "# a[1+1] += m[1] * mu\n\t"
20842         "mul	x3, x19, x5\n\t"
20843         "umulh	x7, x19, x5\n\t"
20844         "adds	x3, x3, x6\n\t"
20845         "adc	x7, x7, xzr\n\t"
20846         "adds	x11, x11, x3\n\t"
20847         "adc	x7, x7, xzr\n\t"
20848         "# a[1+2] += m[2] * mu\n\t"
20849         "mul	x3, x20, x5\n\t"
20850         "umulh	x6, x20, x5\n\t"
20851         "adds	x3, x3, x7\n\t"
20852         "adc	x6, x6, xzr\n\t"
20853         "adds	x12, x12, x3\n\t"
20854         "adc	x6, x6, xzr\n\t"
20855         "# a[1+3] += m[3] * mu\n\t"
20856         "mul	x3, x21, x5\n\t"
20857         "umulh	x4, x21, x5\n\t"
20858         "adds	x3, x3, x6\n\t"
20859         "adcs	x4, x4, x8\n\t"
20860         "cset	x8, cs\n\t"
20861         "adds	x13, x13, x3\n\t"
20862         "adcs	x14, x14, x4\n\t"
20863         "adc	x8, x8, xzr\n\t"
20864         "# mu = a[2] * mp\n\t"
20865         "mul	x5, %[mp], x11\n\t"
20866         "# a[2+0] += m[0] * mu\n\t"
20867         "mul	x3, x17, x5\n\t"
20868         "umulh	x6, x17, x5\n\t"
20869         "adds	x11, x11, x3\n\t"
20870         "adc	x6, x6, xzr\n\t"
20871         "# a[2+1] += m[1] * mu\n\t"
20872         "mul	x3, x19, x5\n\t"
20873         "umulh	x7, x19, x5\n\t"
20874         "adds	x3, x3, x6\n\t"
20875         "adc	x7, x7, xzr\n\t"
20876         "adds	x12, x12, x3\n\t"
20877         "adc	x7, x7, xzr\n\t"
20878         "# a[2+2] += m[2] * mu\n\t"
20879         "mul	x3, x20, x5\n\t"
20880         "umulh	x6, x20, x5\n\t"
20881         "adds	x3, x3, x7\n\t"
20882         "adc	x6, x6, xzr\n\t"
20883         "adds	x13, x13, x3\n\t"
20884         "adc	x6, x6, xzr\n\t"
20885         "# a[2+3] += m[3] * mu\n\t"
20886         "mul	x3, x21, x5\n\t"
20887         "umulh	x4, x21, x5\n\t"
20888         "adds	x3, x3, x6\n\t"
20889         "adcs	x4, x4, x8\n\t"
20890         "cset	x8, cs\n\t"
20891         "adds	x14, x14, x3\n\t"
20892         "adcs	x15, x15, x4\n\t"
20893         "adc	x8, x8, xzr\n\t"
20894         "# mu = a[3] * mp\n\t"
20895         "mul	x5, %[mp], x12\n\t"
20896         "# a[3+0] += m[0] * mu\n\t"
20897         "mul	x3, x17, x5\n\t"
20898         "umulh	x6, x17, x5\n\t"
20899         "adds	x12, x12, x3\n\t"
20900         "adc	x6, x6, xzr\n\t"
20901         "# a[3+1] += m[1] * mu\n\t"
20902         "mul	x3, x19, x5\n\t"
20903         "umulh	x7, x19, x5\n\t"
20904         "adds	x3, x3, x6\n\t"
20905         "adc	x7, x7, xzr\n\t"
20906         "adds	x13, x13, x3\n\t"
20907         "adc	x7, x7, xzr\n\t"
20908         "# a[3+2] += m[2] * mu\n\t"
20909         "mul	x3, x20, x5\n\t"
20910         "umulh	x6, x20, x5\n\t"
20911         "adds	x3, x3, x7\n\t"
20912         "adc	x6, x6, xzr\n\t"
20913         "adds	x14, x14, x3\n\t"
20914         "adc	x6, x6, xzr\n\t"
20915         "# a[3+3] += m[3] * mu\n\t"
20916         "mul	x3, x21, x5\n\t"
20917         "umulh	x4, x21, x5\n\t"
20918         "adds	x3, x3, x6\n\t"
20919         "adcs	x4, x4, x8\n\t"
20920         "cset	x8, cs\n\t"
20921         "adds	x15, x15, x3\n\t"
20922         "adcs	x16, x16, x4\n\t"
20923         "adc	x8, x8, xzr\n\t"
20924         "sub	x3, xzr, x8\n\t"
20925         "and	x17, x17, x3\n\t"
20926         "and	x19, x19, x3\n\t"
20927         "and	x20, x20, x3\n\t"
20928         "and	x21, x21, x3\n\t"
20929         "subs	x13, x13, x17\n\t"
20930         "sbcs	x14, x14, x19\n\t"
20931         "sbcs	x15, x15, x20\n\t"
20932         "stp	x13, x14, [%[a], 0]\n\t"
20933         "sbc	x16, x16, x21\n\t"
20934         "stp	x15, x16, [%[a], 16]\n\t"
20935         :
20936         : [a] "r" (a), [m] "r" (m), [mp] "r" (mp)
20937         : "memory", "x3", "x4", "x5", "x8", "x6", "x7", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21"
20938     );
20939 }
20940 
20941 /* Map the Montgomery form projective coordinate point to an affine point.
20942  *
20943  * r  Resulting affine coordinate point.
20944  * p  Montgomery form projective coordinate point.
20945  * t  Temporary ordinate data.
20946  */
sp_256_map_4(sp_point_256 * r,const sp_point_256 * p,sp_digit * t)20947 static void sp_256_map_4(sp_point_256* r, const sp_point_256* p,
20948     sp_digit* t)
20949 {
20950     sp_digit* t1 = t;
20951     sp_digit* t2 = t + 2*4;
20952     sp_int64 n;
20953 
20954     sp_256_mont_inv_4(t1, p->z, t + 2*4);
20955 
20956     sp_256_mont_sqr_4(t2, t1, p256_mod, p256_mp_mod);
20957     sp_256_mont_mul_4(t1, t2, t1, p256_mod, p256_mp_mod);
20958 
20959     /* x /= z^2 */
20960     sp_256_mont_mul_4(r->x, p->x, t2, p256_mod, p256_mp_mod);
20961     XMEMSET(r->x + 4, 0, sizeof(r->x) / 2U);
20962     sp_256_mont_reduce_4(r->x, p256_mod, p256_mp_mod);
20963     /* Reduce x to less than modulus */
20964     n = sp_256_cmp_4(r->x, p256_mod);
20965     sp_256_cond_sub_4(r->x, r->x, p256_mod, 0 - ((n >= 0) ?
20966                 (sp_digit)1 : (sp_digit)0));
20967     sp_256_norm_4(r->x);
20968 
20969     /* y /= z^3 */
20970     sp_256_mont_mul_4(r->y, p->y, t1, p256_mod, p256_mp_mod);
20971     XMEMSET(r->y + 4, 0, sizeof(r->y) / 2U);
20972     sp_256_mont_reduce_4(r->y, p256_mod, p256_mp_mod);
20973     /* Reduce y to less than modulus */
20974     n = sp_256_cmp_4(r->y, p256_mod);
20975     sp_256_cond_sub_4(r->y, r->y, p256_mod, 0 - ((n >= 0) ?
20976                 (sp_digit)1 : (sp_digit)0));
20977     sp_256_norm_4(r->y);
20978 
20979     XMEMSET(r->z, 0, sizeof(r->z));
20980     r->z[0] = 1;
20981 
20982 }
20983 
20984 /* Add two Montgomery form numbers (r = a + b % m).
20985  *
20986  * r   Result of addition.
20987  * a   First number to add in Montgomery form.
20988  * b   Second number to add in Montgomery form.
20989  * m   Modulus (prime).
20990  */
sp_256_mont_add_4(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m)20991 static void sp_256_mont_add_4(sp_digit* r, const sp_digit* a, const sp_digit* b,
20992         const sp_digit* m)
20993 {
20994     __asm__ __volatile__ (
20995         "ldp	x4, x5, [%[a], 0]\n\t"
20996         "ldp	x8, x9, [%[b], 0]\n\t"
20997         "adds	x4, x4, x8\n\t"
20998         "ldp	x6, x7, [%[a], 16]\n\t"
20999         "adcs	x5, x5, x9\n\t"
21000         "ldp	x10, x11, [%[b], 16]\n\t"
21001         "adcs	x6, x6, x10\n\t"
21002         "adcs	x7, x7, x11\n\t"
21003         "mov	x13, 0xffffffff00000001\n\t"
21004         "csetm	x14, cs\n\t"
21005         "subs	x4, x4, x14\n\t"
21006         "lsr	x12, x14, 32\n\t"
21007         "sbcs	x5, x5, x12\n\t"
21008         "and	x13, x13, x14\n\t"
21009         "sbcs	x6, x6, xzr\n\t"
21010         "stp	x4, x5, [%[r],0]\n\t"
21011         "sbc	x7, x7, x13\n\t"
21012         "stp	x6, x7, [%[r],16]\n\t"
21013         :
21014         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
21015         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14"
21016     );
21017 }
21018 
21019 /* Double a Montgomery form number (r = a + a % m).
21020  *
21021  * r   Result of doubling.
21022  * a   Number to double in Montgomery form.
21023  * m   Modulus (prime).
21024  */
sp_256_mont_dbl_4(sp_digit * r,const sp_digit * a,const sp_digit * m)21025 static void sp_256_mont_dbl_4(sp_digit* r, const sp_digit* a, const sp_digit* m)
21026 {
21027     __asm__ __volatile__ (
21028         "ldp	x3, x4, [%[a]]\n\t"
21029         "ldp	x5, x6, [%[a],16]\n\t"
21030         "adds	x3, x3, x3\n\t"
21031         "adcs	x4, x4, x4\n\t"
21032         "adcs	x5, x5, x5\n\t"
21033         "adcs	x6, x6, x6\n\t"
21034         "mov	x8, 0xffffffff00000001\n\t"
21035         "csetm	x9, cs\n\t"
21036         "subs	x3, x3, x9\n\t"
21037         "lsr	x7, x9, 32\n\t"
21038         "sbcs	x4, x4, x7\n\t"
21039         "and	x8, x8, x9\n\t"
21040         "sbcs	x5, x5, xzr\n\t"
21041         "stp	x3, x4, [%[r],0]\n\t"
21042         "sbc	x6, x6, x8\n\t"
21043         "stp	x5, x6, [%[r],16]\n\t"
21044         :
21045         : [r] "r" (r), [a] "r" (a)
21046         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
21047     );
21048 
21049     (void)m;
21050 }
21051 
21052 /* Triple a Montgomery form number (r = a + a + a % m).
21053  *
21054  * r   Result of Tripling.
21055  * a   Number to triple in Montgomery form.
21056  * m   Modulus (prime).
21057  */
sp_256_mont_tpl_4(sp_digit * r,const sp_digit * a,const sp_digit * m)21058 static void sp_256_mont_tpl_4(sp_digit* r, const sp_digit* a, const sp_digit* m)
21059 {
21060     __asm__ __volatile__ (
21061         "ldp	x10, x11, [%[a]]\n\t"
21062         "adds	x3, x10, x10\n\t"
21063         "ldr	x12, [%[a], 16]\n\t"
21064         "adcs	x4, x11, x11\n\t"
21065         "ldr	x13, [%[a], 24]\n\t"
21066         "adcs	x5, x12, x12\n\t"
21067         "adcs	x6, x13, x13\n\t"
21068         "mov	x8, 0xffffffff00000001\n\t"
21069         "csetm	x9, cs\n\t"
21070         "subs	x3, x3, x9\n\t"
21071         "lsr	x7, x9, 32\n\t"
21072         "sbcs	x4, x4, x7\n\t"
21073         "and	x8, x8, x9\n\t"
21074         "sbcs	x5, x5, xzr\n\t"
21075         "sbc	x6, x6, x8\n\t"
21076         "adds	x3, x3, x10\n\t"
21077         "adcs	x4, x4, x11\n\t"
21078         "adcs	x5, x5, x12\n\t"
21079         "adcs	x6, x6, x13\n\t"
21080         "mov	x8, 0xffffffff00000001\n\t"
21081         "csetm	x9, cs\n\t"
21082         "subs	x3, x3, x9\n\t"
21083         "lsr	x7, x9, 32\n\t"
21084         "sbcs	x4, x4, x7\n\t"
21085         "and	x8, x8, x9\n\t"
21086         "sbcs	x5, x5, xzr\n\t"
21087         "stp	x3, x4, [%[r], 0]\n\t"
21088         "sbc	x6, x6, x8\n\t"
21089         "stp	x5, x6, [%[r], 16]\n\t"
21090         :
21091         : [r] "r" (r), [a] "r" (a)
21092         : "memory", "x10", "x11", "x12", "x13", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
21093     );
21094 
21095     (void)m;
21096 }
21097 
21098 /* Subtract two Montgomery form numbers (r = a - b % m).
21099  *
21100  * r   Result of subtration.
21101  * a   Number to subtract from in Montgomery form.
21102  * b   Number to subtract with in Montgomery form.
21103  * m   Modulus (prime).
21104  */
sp_256_mont_sub_4(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m)21105 static void sp_256_mont_sub_4(sp_digit* r, const sp_digit* a, const sp_digit* b,
21106         const sp_digit* m)
21107 {
21108     __asm__ __volatile__ (
21109         "ldp	x4, x5, [%[a], 0]\n\t"
21110         "ldp	x8, x9, [%[b], 0]\n\t"
21111         "subs	x4, x4, x8\n\t"
21112         "ldp	x6, x7, [%[a], 16]\n\t"
21113         "sbcs	x5, x5, x9\n\t"
21114         "ldp	x10, x11, [%[b], 16]\n\t"
21115         "sbcs	x6, x6, x10\n\t"
21116         "sbcs	x7, x7, x11\n\t"
21117         "mov	x13, 0xffffffff00000001\n\t"
21118         "csetm	x14, cc\n\t"
21119         "adds	x4, x4, x14\n\t"
21120         "lsr	x12, x14, 32\n\t"
21121         "adcs	x5, x5, x12\n\t"
21122         "and	x13, x13, x14\n\t"
21123         "adcs	x6, x6, xzr\n\t"
21124         "stp	x4, x5, [%[r],0]\n\t"
21125         "adc	x7, x7, x13\n\t"
21126         "stp	x6, x7, [%[r],16]\n\t"
21127         :
21128         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
21129         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14"
21130     );
21131 }
21132 
21133 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
21134  *
21135  * r  Result of division by 2.
21136  * a  Number to divide.
21137  * m  Modulus (prime).
21138  */
sp_256_div2_4(sp_digit * r,const sp_digit * a,const sp_digit * m)21139 static void sp_256_div2_4(sp_digit* r, const sp_digit* a, const sp_digit* m)
21140 {
21141     __asm__ __volatile__ (
21142         "ldp	x3, x4, [%[a], 0]\n\t"
21143         "and	x9, x3, 1\n\t"
21144         "ldp	x5, x6, [%[a], 16]\n\t"
21145         "sub	x10, xzr, x9\n\t"
21146         "lsr	x7, x10, 32\n\t"
21147         "adds	x3, x3, x10\n\t"
21148         "and	x8, x10, 0xffffffff00000001\n\t"
21149         "adcs	x4, x4, x7\n\t"
21150         "lsr	x3, x3, 1\n\t"
21151         "adcs	x5, x5, xzr\n\t"
21152         "lsr	x7, x4, 1\n\t"
21153         "adcs	x6, x6, x8\n\t"
21154         "lsr	x8, x5, 1\n\t"
21155         "cset	x9, cs\n\t"
21156         "lsr	x10, x6, 1\n\t"
21157         "orr	x3, x3, x4, lsl 63\n\t"
21158         "orr	x4, x7, x5, lsl 63\n\t"
21159         "orr	x5, x8, x6, lsl 63\n\t"
21160         "stp	x3, x4, [%[r], 0]\n\t"
21161         "orr	x6, x10, x9, lsl 63\n\t"
21162         "stp	x5, x6, [%[r], 16]\n\t"
21163         :
21164         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
21165         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
21166     );
21167 
21168 }
21169 
21170 /* Double the Montgomery form projective point p.
21171  *
21172  * r  Result of doubling point.
21173  * p  Point to double.
21174  * t  Temporary ordinate data.
21175  */
21176 #ifdef WOLFSSL_SP_NONBLOCK
21177 typedef struct sp_256_proj_point_dbl_4_ctx {
21178     int state;
21179     sp_digit* t1;
21180     sp_digit* t2;
21181     sp_digit* x;
21182     sp_digit* y;
21183     sp_digit* z;
21184 } sp_256_proj_point_dbl_4_ctx;
21185 
sp_256_proj_point_dbl_4_nb(sp_ecc_ctx_t * sp_ctx,sp_point_256 * r,const sp_point_256 * p,sp_digit * t)21186 static int sp_256_proj_point_dbl_4_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t)
21187 {
21188     int err = FP_WOULDBLOCK;
21189     sp_256_proj_point_dbl_4_ctx* ctx = (sp_256_proj_point_dbl_4_ctx*)sp_ctx->data;
21190 
21191     typedef char ctx_size_test[sizeof(sp_256_proj_point_dbl_4_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
21192     (void)sizeof(ctx_size_test);
21193 
21194     switch (ctx->state) {
21195     case 0:
21196         ctx->t1 = t;
21197         ctx->t2 = t + 2*4;
21198         ctx->x = r->x;
21199         ctx->y = r->y;
21200         ctx->z = r->z;
21201 
21202         /* Put infinity into result. */
21203         if (r != p) {
21204             r->infinity = p->infinity;
21205         }
21206         ctx->state = 1;
21207         break;
21208     case 1:
21209         /* T1 = Z * Z */
21210         sp_256_mont_sqr_4(ctx->t1, p->z, p256_mod, p256_mp_mod);
21211         ctx->state = 2;
21212         break;
21213     case 2:
21214         /* Z = Y * Z */
21215         sp_256_mont_mul_4(ctx->z, p->y, p->z, p256_mod, p256_mp_mod);
21216         ctx->state = 3;
21217         break;
21218     case 3:
21219         /* Z = 2Z */
21220         sp_256_mont_dbl_4(ctx->z, ctx->z, p256_mod);
21221         ctx->state = 4;
21222         break;
21223     case 4:
21224         /* T2 = X - T1 */
21225         sp_256_mont_sub_4(ctx->t2, p->x, ctx->t1, p256_mod);
21226         ctx->state = 5;
21227         break;
21228     case 5:
21229         /* T1 = X + T1 */
21230         sp_256_mont_add_4(ctx->t1, p->x, ctx->t1, p256_mod);
21231         ctx->state = 6;
21232         break;
21233     case 6:
21234         /* T2 = T1 * T2 */
21235         sp_256_mont_mul_4(ctx->t2, ctx->t1, ctx->t2, p256_mod, p256_mp_mod);
21236         ctx->state = 7;
21237         break;
21238     case 7:
21239         /* T1 = 3T2 */
21240         sp_256_mont_tpl_4(ctx->t1, ctx->t2, p256_mod);
21241         ctx->state = 8;
21242         break;
21243     case 8:
21244         /* Y = 2Y */
21245         sp_256_mont_dbl_4(ctx->y, p->y, p256_mod);
21246         ctx->state = 9;
21247         break;
21248     case 9:
21249         /* Y = Y * Y */
21250         sp_256_mont_sqr_4(ctx->y, ctx->y, p256_mod, p256_mp_mod);
21251         ctx->state = 10;
21252         break;
21253     case 10:
21254         /* T2 = Y * Y */
21255         sp_256_mont_sqr_4(ctx->t2, ctx->y, p256_mod, p256_mp_mod);
21256         ctx->state = 11;
21257         break;
21258     case 11:
21259         /* T2 = T2/2 */
21260         sp_256_div2_4(ctx->t2, ctx->t2, p256_mod);
21261         ctx->state = 12;
21262         break;
21263     case 12:
21264         /* Y = Y * X */
21265         sp_256_mont_mul_4(ctx->y, ctx->y, p->x, p256_mod, p256_mp_mod);
21266         ctx->state = 13;
21267         break;
21268     case 13:
21269         /* X = T1 * T1 */
21270         sp_256_mont_sqr_4(ctx->x, ctx->t1, p256_mod, p256_mp_mod);
21271         ctx->state = 14;
21272         break;
21273     case 14:
21274         /* X = X - Y */
21275         sp_256_mont_sub_4(ctx->x, ctx->x, ctx->y, p256_mod);
21276         ctx->state = 15;
21277         break;
21278     case 15:
21279         /* X = X - Y */
21280         sp_256_mont_sub_4(ctx->x, ctx->x, ctx->y, p256_mod);
21281         ctx->state = 16;
21282         break;
21283     case 16:
21284         /* Y = Y - X */
21285         sp_256_mont_sub_4(ctx->y, ctx->y, ctx->x, p256_mod);
21286         ctx->state = 17;
21287         break;
21288     case 17:
21289         /* Y = Y * T1 */
21290         sp_256_mont_mul_4(ctx->y, ctx->y, ctx->t1, p256_mod, p256_mp_mod);
21291         ctx->state = 18;
21292         break;
21293     case 18:
21294         /* Y = Y - T2 */
21295         sp_256_mont_sub_4(ctx->y, ctx->y, ctx->t2, p256_mod);
21296         ctx->state = 19;
21297         /* fall-through */
21298     case 19:
21299         err = MP_OKAY;
21300         break;
21301     }
21302 
21303     if (err == MP_OKAY && ctx->state != 19) {
21304         err = FP_WOULDBLOCK;
21305     }
21306 
21307     return err;
21308 }
21309 #endif /* WOLFSSL_SP_NONBLOCK */
21310 
sp_256_proj_point_dbl_4(sp_point_256 * r,const sp_point_256 * p,sp_digit * t)21311 static void sp_256_proj_point_dbl_4(sp_point_256* r, const sp_point_256* p, sp_digit* t)
21312 {
21313     sp_digit* t1 = t;
21314     sp_digit* t2 = t + 2*4;
21315     sp_digit* x;
21316     sp_digit* y;
21317     sp_digit* z;
21318 
21319     x = r->x;
21320     y = r->y;
21321     z = r->z;
21322     /* Put infinity into result. */
21323     if (r != p) {
21324         r->infinity = p->infinity;
21325     }
21326 
21327     /* T1 = Z * Z */
21328     sp_256_mont_sqr_4(t1, p->z, p256_mod, p256_mp_mod);
21329     /* Z = Y * Z */
21330     sp_256_mont_mul_4(z, p->y, p->z, p256_mod, p256_mp_mod);
21331     /* Z = 2Z */
21332     sp_256_mont_dbl_4(z, z, p256_mod);
21333     /* T2 = X - T1 */
21334     sp_256_mont_sub_4(t2, p->x, t1, p256_mod);
21335     /* T1 = X + T1 */
21336     sp_256_mont_add_4(t1, p->x, t1, p256_mod);
21337     /* T2 = T1 * T2 */
21338     sp_256_mont_mul_4(t2, t1, t2, p256_mod, p256_mp_mod);
21339     /* T1 = 3T2 */
21340     sp_256_mont_tpl_4(t1, t2, p256_mod);
21341     /* Y = 2Y */
21342     sp_256_mont_dbl_4(y, p->y, p256_mod);
21343     /* Y = Y * Y */
21344     sp_256_mont_sqr_4(y, y, p256_mod, p256_mp_mod);
21345     /* T2 = Y * Y */
21346     sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod);
21347     /* T2 = T2/2 */
21348     sp_256_div2_4(t2, t2, p256_mod);
21349     /* Y = Y * X */
21350     sp_256_mont_mul_4(y, y, p->x, p256_mod, p256_mp_mod);
21351     /* X = T1 * T1 */
21352     sp_256_mont_sqr_4(x, t1, p256_mod, p256_mp_mod);
21353     /* X = X - Y */
21354     sp_256_mont_sub_4(x, x, y, p256_mod);
21355     /* X = X - Y */
21356     sp_256_mont_sub_4(x, x, y, p256_mod);
21357     /* Y = Y - X */
21358     sp_256_mont_sub_4(y, y, x, p256_mod);
21359     /* Y = Y * T1 */
21360     sp_256_mont_mul_4(y, y, t1, p256_mod, p256_mp_mod);
21361     /* Y = Y - T2 */
21362     sp_256_mont_sub_4(y, y, t2, p256_mod);
21363 }
21364 
21365 /* Subtract two Montgomery form numbers (r = a - b % m).
21366  *
21367  * r   Result of subtration.
21368  * a   Number to subtract from in Montgomery form.
21369  * b   Number to subtract with in Montgomery form.
21370  * m   Modulus (prime).
21371  */
sp_256_mont_sub_dbl_4(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m)21372 static void sp_256_mont_sub_dbl_4(sp_digit* r, const sp_digit* a, const sp_digit* b,
21373         const sp_digit* m)
21374 {
21375     __asm__ __volatile__ (
21376         "ldp	x8, x9, [%[b]]\n\t"
21377         "ldp	x10, x11, [%[b],16]\n\t"
21378         "adds	x8, x8, x8\n\t"
21379         "ldp	x4, x5, [%[a]]\n\t"
21380         "adcs	x9, x9, x9\n\t"
21381         "ldp	x6, x7, [%[a],16]\n\t"
21382         "adcs	x10, x10, x10\n\t"
21383         "adcs	x11, x11, x11\n\t"
21384         "mov	x13, 0xffffffff00000001\n\t"
21385         "csetm	x14, cs\n\t"
21386         "subs	x8, x8, x14\n\t"
21387         "lsr	x12, x14, 32\n\t"
21388         "sbcs	x9, x9, x12\n\t"
21389         "and	x13, x13, x14\n\t"
21390         "sbcs	x10, x10, xzr\n\t"
21391         "sbc	x11, x11, x13\n\t"
21392         "subs	x4, x4, x8\n\t"
21393         "sbcs	x5, x5, x9\n\t"
21394         "sbcs	x6, x6, x10\n\t"
21395         "sbcs	x7, x7, x11\n\t"
21396         "mov	x13, 0xffffffff00000001\n\t"
21397         "csetm	x14, cc\n\t"
21398         "adds	x4, x4, x14\n\t"
21399         "lsr	x12, x14, 32\n\t"
21400         "adcs	x5, x5, x12\n\t"
21401         "and	x13, x13, x14\n\t"
21402         "adcs	x6, x6, xzr\n\t"
21403         "stp	x4, x5, [%[r],0]\n\t"
21404         "adc	x7, x7, x13\n\t"
21405         "stp	x6, x7, [%[r],16]\n\t"
21406         :
21407         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
21408         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14"
21409     );
21410 }
21411 
21412 /* Subtract two Montgomery form numbers (r = a - b % m).
21413  *
21414  * r   Result of subtration.
21415  * a   Number to subtract from in Montgomery form.
21416  * b   Number to subtract with in Montgomery form.
21417  * m   Modulus (prime).
21418  */
sp_256_mont_dbl_sub_4(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m)21419 static void sp_256_mont_dbl_sub_4(sp_digit* r, const sp_digit* a, const sp_digit* b,
21420         const sp_digit* m)
21421 {
21422     __asm__ __volatile__ (
21423         "ldp	x4, x5, [%[a]]\n\t"
21424         "ldp	x6, x7, [%[a],16]\n\t"
21425         "adds	x4, x4, x4\n\t"
21426         "ldp	x8, x9, [%[b]]\n\t"
21427         "adcs	x5, x5, x5\n\t"
21428         "ldp	x10, x11, [%[b],16]\n\t"
21429         "adcs	x6, x6, x6\n\t"
21430         "adcs	x7, x7, x7\n\t"
21431         "mov	x13, 0xffffffff00000001\n\t"
21432         "csetm	x14, cs\n\t"
21433         "subs	x4, x4, x14\n\t"
21434         "lsr	x12, x14, 32\n\t"
21435         "sbcs	x5, x5, x12\n\t"
21436         "and	x13, x13, x14\n\t"
21437         "sbcs	x6, x6, xzr\n\t"
21438         "sbc	x7, x7, x13\n\t"
21439         "subs	x4, x4, x8\n\t"
21440         "sbcs	x5, x5, x9\n\t"
21441         "sbcs	x6, x6, x10\n\t"
21442         "sbcs	x7, x7, x11\n\t"
21443         "mov	x13, 0xffffffff00000001\n\t"
21444         "csetm	x14, cc\n\t"
21445         "adds	x4, x4, x14\n\t"
21446         "lsr	x12, x14, 32\n\t"
21447         "adcs	x5, x5, x12\n\t"
21448         "and	x13, x13, x14\n\t"
21449         "adcs	x6, x6, xzr\n\t"
21450         "stp	x4, x5, [%[r],0]\n\t"
21451         "adc	x7, x7, x13\n\t"
21452         "stp	x6, x7, [%[r],16]\n\t"
21453         :
21454         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
21455         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14"
21456     );
21457 }
21458 
21459 /* Double the Montgomery form projective point p a number of times.
21460  *
21461  * r  Result of repeated doubling of point.
21462  * p  Point to double.
21463  * n  Number of times to double
21464  * t  Temporary ordinate data.
21465  */
sp_256_proj_point_dbl_n_4(sp_point_256 * p,int n,sp_digit * t)21466 static void sp_256_proj_point_dbl_n_4(sp_point_256* p, int n,
21467     sp_digit* t)
21468 {
21469     sp_digit* w = t;
21470     sp_digit* a = t + 2*4;
21471     sp_digit* b = t + 4*4;
21472     sp_digit* t1 = t + 6*4;
21473     sp_digit* x;
21474     sp_digit* y;
21475     sp_digit* z;
21476 
21477     x = p->x;
21478     y = p->y;
21479     z = p->z;
21480 
21481     /* Y = 2*Y */
21482     sp_256_mont_dbl_4(y, y, p256_mod);
21483     /* W = Z^4 */
21484     sp_256_mont_sqr_4(w, z, p256_mod, p256_mp_mod);
21485     sp_256_mont_sqr_4(w, w, p256_mod, p256_mp_mod);
21486 
21487 #ifndef WOLFSSL_SP_SMALL
21488     while (--n > 0)
21489 #else
21490     while (--n >= 0)
21491 #endif
21492     {
21493         /* A = 3*(X^2 - W) */
21494         sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod);
21495         sp_256_mont_sub_4(t1, t1, w, p256_mod);
21496         sp_256_mont_tpl_4(a, t1, p256_mod);
21497         /* B = X*Y^2 */
21498         sp_256_mont_sqr_4(t1, y, p256_mod, p256_mp_mod);
21499         sp_256_mont_mul_4(b, t1, x, p256_mod, p256_mp_mod);
21500         /* X = A^2 - 2B */
21501         sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod);
21502         sp_256_mont_sub_dbl_4(x, x, b, p256_mod);
21503         /* Z = Z*Y */
21504         sp_256_mont_mul_4(z, z, y, p256_mod, p256_mp_mod);
21505         /* t2 = Y^4 */
21506         sp_256_mont_sqr_4(t1, t1, p256_mod, p256_mp_mod);
21507 #ifdef WOLFSSL_SP_SMALL
21508         if (n != 0)
21509 #endif
21510         {
21511             /* W = W*Y^4 */
21512             sp_256_mont_mul_4(w, w, t1, p256_mod, p256_mp_mod);
21513         }
21514         /* y = 2*A*(B - X) - Y^4 */
21515         sp_256_mont_sub_4(y, b, x, p256_mod);
21516         sp_256_mont_mul_4(y, y, a, p256_mod, p256_mp_mod);
21517         sp_256_mont_dbl_sub_4(y, y, t1, p256_mod);
21518     }
21519 #ifndef WOLFSSL_SP_SMALL
21520     /* A = 3*(X^2 - W) */
21521     sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod);
21522     sp_256_mont_sub_4(t1, t1, w, p256_mod);
21523     sp_256_mont_tpl_4(a, t1, p256_mod);
21524     /* B = X*Y^2 */
21525     sp_256_mont_sqr_4(t1, y, p256_mod, p256_mp_mod);
21526     sp_256_mont_mul_4(b, t1, x, p256_mod, p256_mp_mod);
21527     /* X = A^2 - 2B */
21528     sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod);
21529     sp_256_mont_sub_dbl_4(x, x, b, p256_mod);
21530     /* Z = Z*Y */
21531     sp_256_mont_mul_4(z, z, y, p256_mod, p256_mp_mod);
21532     /* t2 = Y^4 */
21533     sp_256_mont_sqr_4(t1, t1, p256_mod, p256_mp_mod);
21534     /* y = 2*A*(B - X) - Y^4 */
21535     sp_256_mont_sub_4(y, b, x, p256_mod);
21536     sp_256_mont_mul_4(y, y, a, p256_mod, p256_mp_mod);
21537     sp_256_mont_dbl_sub_4(y, y, t1, p256_mod);
21538 #endif
21539     /* Y = Y/2 */
21540     sp_256_div2_4(y, y, p256_mod);
21541 }
21542 
21543 /* Compare two numbers to determine if they are equal.
21544  * Constant time implementation.
21545  *
21546  * a  First number to compare.
21547  * b  Second number to compare.
21548  * returns 1 when equal and 0 otherwise.
21549  */
sp_256_cmp_equal_4(const sp_digit * a,const sp_digit * b)21550 static int sp_256_cmp_equal_4(const sp_digit* a, const sp_digit* b)
21551 {
21552     return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
21553             (a[3] ^ b[3])) == 0;
21554 }
21555 
21556 /* Add two Montgomery form projective points.
21557  *
21558  * r  Result of addition.
21559  * p  First point to add.
21560  * q  Second point to add.
21561  * t  Temporary ordinate data.
21562  */
21563 
21564 #ifdef WOLFSSL_SP_NONBLOCK
21565 typedef struct sp_256_proj_point_add_4_ctx {
21566     int state;
21567     sp_256_proj_point_dbl_4_ctx dbl_ctx;
21568     const sp_point_256* ap[2];
21569     sp_point_256* rp[2];
21570     sp_digit* t1;
21571     sp_digit* t2;
21572     sp_digit* t3;
21573     sp_digit* t4;
21574     sp_digit* t5;
21575     sp_digit* x;
21576     sp_digit* y;
21577     sp_digit* z;
21578 } sp_256_proj_point_add_4_ctx;
21579 
sp_256_proj_point_add_4_nb(sp_ecc_ctx_t * sp_ctx,sp_point_256 * r,const sp_point_256 * p,const sp_point_256 * q,sp_digit * t)21580 static int sp_256_proj_point_add_4_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
21581     const sp_point_256* p, const sp_point_256* q, sp_digit* t)
21582 {
21583     int err = FP_WOULDBLOCK;
21584     sp_256_proj_point_add_4_ctx* ctx = (sp_256_proj_point_add_4_ctx*)sp_ctx->data;
21585 
21586     /* Ensure only the first point is the same as the result. */
21587     if (q == r) {
21588         const sp_point_256* a = p;
21589         p = q;
21590         q = a;
21591     }
21592 
21593     typedef char ctx_size_test[sizeof(sp_256_proj_point_add_4_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
21594     (void)sizeof(ctx_size_test);
21595 
21596     switch (ctx->state) {
21597     case 0: /* INIT */
21598         ctx->t1 = t;
21599         ctx->t2 = t + 2*4;
21600         ctx->t3 = t + 4*4;
21601         ctx->t4 = t + 6*4;
21602         ctx->t5 = t + 8*4;
21603 
21604         ctx->state = 1;
21605         break;
21606     case 1:
21607         /* Check double */
21608         (void)sp_256_sub_4(ctx->t1, p256_mod, q->y);
21609         sp_256_norm_4(ctx->t1);
21610         if ((sp_256_cmp_equal_4(p->x, q->x) & sp_256_cmp_equal_4(p->z, q->z) &
21611             (sp_256_cmp_equal_4(p->y, q->y) | sp_256_cmp_equal_4(p->y, ctx->t1))) != 0)
21612         {
21613             XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
21614             ctx->state = 2;
21615         }
21616         else {
21617             ctx->state = 3;
21618         }
21619         break;
21620     case 2:
21621         err = sp_256_proj_point_dbl_4_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
21622         if (err == MP_OKAY)
21623             ctx->state = 27; /* done */
21624         break;
21625     case 3:
21626     {
21627         int i;
21628         ctx->rp[0] = r;
21629 
21630         /*lint allow cast to different type of pointer*/
21631         ctx->rp[1] = (sp_point_256*)t; /*lint !e9087 !e740*/
21632         XMEMSET(ctx->rp[1], 0, sizeof(sp_point_256));
21633         ctx->x = ctx->rp[p->infinity | q->infinity]->x;
21634         ctx->y = ctx->rp[p->infinity | q->infinity]->y;
21635         ctx->z = ctx->rp[p->infinity | q->infinity]->z;
21636 
21637         ctx->ap[0] = p;
21638         ctx->ap[1] = q;
21639         for (i=0; i<4; i++) {
21640             r->x[i] = ctx->ap[p->infinity]->x[i];
21641         }
21642         for (i=0; i<4; i++) {
21643             r->y[i] = ctx->ap[p->infinity]->y[i];
21644         }
21645         for (i=0; i<4; i++) {
21646             r->z[i] = ctx->ap[p->infinity]->z[i];
21647         }
21648         r->infinity = ctx->ap[p->infinity]->infinity;
21649 
21650         ctx->state = 4;
21651         break;
21652     }
21653     case 4:
21654         /* U1 = X1*Z2^2 */
21655         sp_256_mont_sqr_4(ctx->t1, q->z, p256_mod, p256_mp_mod);
21656         ctx->state = 5;
21657         break;
21658     case 5:
21659         sp_256_mont_mul_4(ctx->t3, ctx->t1, q->z, p256_mod, p256_mp_mod);
21660         ctx->state = 6;
21661         break;
21662     case 6:
21663         sp_256_mont_mul_4(ctx->t1, ctx->t1, ctx->x, p256_mod, p256_mp_mod);
21664         ctx->state = 7;
21665         break;
21666     case 7:
21667         /* U2 = X2*Z1^2 */
21668         sp_256_mont_sqr_4(ctx->t2, ctx->z, p256_mod, p256_mp_mod);
21669         ctx->state = 8;
21670         break;
21671     case 8:
21672         sp_256_mont_mul_4(ctx->t4, ctx->t2, ctx->z, p256_mod, p256_mp_mod);
21673         ctx->state = 9;
21674         break;
21675     case 9:
21676         sp_256_mont_mul_4(ctx->t2, ctx->t2, q->x, p256_mod, p256_mp_mod);
21677         ctx->state = 10;
21678         break;
21679     case 10:
21680         /* S1 = Y1*Z2^3 */
21681         sp_256_mont_mul_4(ctx->t3, ctx->t3, ctx->y, p256_mod, p256_mp_mod);
21682         ctx->state = 11;
21683         break;
21684     case 11:
21685         /* S2 = Y2*Z1^3 */
21686         sp_256_mont_mul_4(ctx->t4, ctx->t4, q->y, p256_mod, p256_mp_mod);
21687         ctx->state = 12;
21688         break;
21689     case 12:
21690         /* H = U2 - U1 */
21691         sp_256_mont_sub_4(ctx->t2, ctx->t2, ctx->t1, p256_mod);
21692         ctx->state = 13;
21693         break;
21694     case 13:
21695         /* R = S2 - S1 */
21696         sp_256_mont_sub_4(ctx->t4, ctx->t4, ctx->t3, p256_mod);
21697         ctx->state = 14;
21698         break;
21699     case 14:
21700         /* Z3 = H*Z1*Z2 */
21701         sp_256_mont_mul_4(ctx->z, ctx->z, q->z, p256_mod, p256_mp_mod);
21702         ctx->state = 15;
21703         break;
21704     case 15:
21705         sp_256_mont_mul_4(ctx->z, ctx->z, ctx->t2, p256_mod, p256_mp_mod);
21706         ctx->state = 16;
21707         break;
21708     case 16:
21709         /* X3 = R^2 - H^3 - 2*U1*H^2 */
21710         sp_256_mont_sqr_4(ctx->x, ctx->t4, p256_mod, p256_mp_mod);
21711         ctx->state = 17;
21712         break;
21713     case 17:
21714         sp_256_mont_sqr_4(ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
21715         ctx->state = 18;
21716         break;
21717     case 18:
21718         sp_256_mont_mul_4(ctx->y, ctx->t1, ctx->t5, p256_mod, p256_mp_mod);
21719         ctx->state = 19;
21720         break;
21721     case 19:
21722         sp_256_mont_mul_4(ctx->t5, ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
21723         ctx->state = 20;
21724         break;
21725     case 20:
21726         sp_256_mont_sub_4(ctx->x, ctx->x, ctx->t5, p256_mod);
21727         ctx->state = 21;
21728         break;
21729     case 21:
21730         sp_256_mont_dbl_4(ctx->t1, ctx->y, p256_mod);
21731         ctx->state = 22;
21732         break;
21733     case 22:
21734         sp_256_mont_sub_4(ctx->x, ctx->x, ctx->t1, p256_mod);
21735         ctx->state = 23;
21736         break;
21737     case 23:
21738         /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
21739         sp_256_mont_sub_4(ctx->y, ctx->y, ctx->x, p256_mod);
21740         ctx->state = 24;
21741         break;
21742     case 24:
21743         sp_256_mont_mul_4(ctx->y, ctx->y, ctx->t4, p256_mod, p256_mp_mod);
21744         ctx->state = 25;
21745         break;
21746     case 25:
21747         sp_256_mont_mul_4(ctx->t5, ctx->t5, ctx->t3, p256_mod, p256_mp_mod);
21748         ctx->state = 26;
21749         break;
21750     case 26:
21751         sp_256_mont_sub_4(ctx->y, ctx->y, ctx->t5, p256_mod);
21752         ctx->state = 27;
21753         /* fall-through */
21754     case 27:
21755         err = MP_OKAY;
21756         break;
21757     }
21758 
21759     if (err == MP_OKAY && ctx->state != 27) {
21760         err = FP_WOULDBLOCK;
21761     }
21762     return err;
21763 }
21764 #endif /* WOLFSSL_SP_NONBLOCK */
21765 
sp_256_proj_point_add_4(sp_point_256 * r,const sp_point_256 * p,const sp_point_256 * q,sp_digit * t)21766 static void sp_256_proj_point_add_4(sp_point_256* r,
21767         const sp_point_256* p, const sp_point_256* q, sp_digit* t)
21768 {
21769     const sp_point_256* ap[2];
21770     sp_point_256* rp[2];
21771     sp_digit* t1 = t;
21772     sp_digit* t2 = t + 2*4;
21773     sp_digit* t3 = t + 4*4;
21774     sp_digit* t4 = t + 6*4;
21775     sp_digit* t5 = t + 8*4;
21776     sp_digit* x;
21777     sp_digit* y;
21778     sp_digit* z;
21779     int i;
21780 
21781     /* Ensure only the first point is the same as the result. */
21782     if (q == r) {
21783         const sp_point_256* a = p;
21784         p = q;
21785         q = a;
21786     }
21787 
21788     /* Check double */
21789     (void)sp_256_sub_4(t1, p256_mod, q->y);
21790     sp_256_norm_4(t1);
21791     if ((sp_256_cmp_equal_4(p->x, q->x) & sp_256_cmp_equal_4(p->z, q->z) &
21792         (sp_256_cmp_equal_4(p->y, q->y) | sp_256_cmp_equal_4(p->y, t1))) != 0) {
21793         sp_256_proj_point_dbl_4(r, p, t);
21794     }
21795     else {
21796         rp[0] = r;
21797 
21798         /*lint allow cast to different type of pointer*/
21799         rp[1] = (sp_point_256*)t; /*lint !e9087 !e740*/
21800         XMEMSET(rp[1], 0, sizeof(sp_point_256));
21801         x = rp[p->infinity | q->infinity]->x;
21802         y = rp[p->infinity | q->infinity]->y;
21803         z = rp[p->infinity | q->infinity]->z;
21804 
21805         ap[0] = p;
21806         ap[1] = q;
21807         for (i=0; i<4; i++) {
21808             r->x[i] = ap[p->infinity]->x[i];
21809         }
21810         for (i=0; i<4; i++) {
21811             r->y[i] = ap[p->infinity]->y[i];
21812         }
21813         for (i=0; i<4; i++) {
21814             r->z[i] = ap[p->infinity]->z[i];
21815         }
21816         r->infinity = ap[p->infinity]->infinity;
21817 
21818         /* U1 = X1*Z2^2 */
21819         sp_256_mont_sqr_4(t1, q->z, p256_mod, p256_mp_mod);
21820         sp_256_mont_mul_4(t3, t1, q->z, p256_mod, p256_mp_mod);
21821         sp_256_mont_mul_4(t1, t1, x, p256_mod, p256_mp_mod);
21822         /* U2 = X2*Z1^2 */
21823         sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod);
21824         sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod);
21825         sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod);
21826         /* S1 = Y1*Z2^3 */
21827         sp_256_mont_mul_4(t3, t3, y, p256_mod, p256_mp_mod);
21828         /* S2 = Y2*Z1^3 */
21829         sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod);
21830         /* H = U2 - U1 */
21831         sp_256_mont_sub_4(t2, t2, t1, p256_mod);
21832         /* R = S2 - S1 */
21833         sp_256_mont_sub_4(t4, t4, t3, p256_mod);
21834         /* Z3 = H*Z1*Z2 */
21835         sp_256_mont_mul_4(z, z, q->z, p256_mod, p256_mp_mod);
21836         sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod);
21837         /* X3 = R^2 - H^3 - 2*U1*H^2 */
21838         sp_256_mont_sqr_4(x, t4, p256_mod, p256_mp_mod);
21839         sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod);
21840         sp_256_mont_mul_4(y, t1, t5, p256_mod, p256_mp_mod);
21841         sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod);
21842         sp_256_mont_sub_4(x, x, t5, p256_mod);
21843         sp_256_mont_dbl_4(t1, y, p256_mod);
21844         sp_256_mont_sub_4(x, x, t1, p256_mod);
21845         /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
21846         sp_256_mont_sub_4(y, y, x, p256_mod);
21847         sp_256_mont_mul_4(y, y, t4, p256_mod, p256_mp_mod);
21848         sp_256_mont_mul_4(t5, t5, t3, p256_mod, p256_mp_mod);
21849         sp_256_mont_sub_4(y, y, t5, p256_mod);
21850     }
21851 }
21852 
21853 /* Double the Montgomery form projective point p a number of times.
21854  *
21855  * r  Result of repeated doubling of point.
21856  * p  Point to double.
21857  * n  Number of times to double
21858  * t  Temporary ordinate data.
21859  */
sp_256_proj_point_dbl_n_store_4(sp_point_256 * r,const sp_point_256 * p,int n,int m,sp_digit * t)21860 static void sp_256_proj_point_dbl_n_store_4(sp_point_256* r,
21861         const sp_point_256* p, int n, int m, sp_digit* t)
21862 {
21863     sp_digit* w = t;
21864     sp_digit* a = t + 2*4;
21865     sp_digit* b = t + 4*4;
21866     sp_digit* t1 = t + 6*4;
21867     sp_digit* t2 = t + 8*4;
21868     sp_digit* x = r[2*m].x;
21869     sp_digit* y = r[(1<<n)*m].y;
21870     sp_digit* z = r[2*m].z;
21871     int i;
21872     int j;
21873 
21874     for (i=0; i<4; i++) {
21875         x[i] = p->x[i];
21876     }
21877     for (i=0; i<4; i++) {
21878         y[i] = p->y[i];
21879     }
21880     for (i=0; i<4; i++) {
21881         z[i] = p->z[i];
21882     }
21883 
21884     /* Y = 2*Y */
21885     sp_256_mont_dbl_4(y, y, p256_mod);
21886     /* W = Z^4 */
21887     sp_256_mont_sqr_4(w, z, p256_mod, p256_mp_mod);
21888     sp_256_mont_sqr_4(w, w, p256_mod, p256_mp_mod);
21889     j = m;
21890     for (i=1; i<=n; i++) {
21891         j *= 2;
21892 
21893         /* A = 3*(X^2 - W) */
21894         sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod);
21895         sp_256_mont_sub_4(t1, t1, w, p256_mod);
21896         sp_256_mont_tpl_4(a, t1, p256_mod);
21897         /* B = X*Y^2 */
21898         sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod);
21899         sp_256_mont_mul_4(b, t2, x, p256_mod, p256_mp_mod);
21900         x = r[j].x;
21901         /* X = A^2 - 2B */
21902         sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod);
21903         sp_256_mont_dbl_4(t1, b, p256_mod);
21904         sp_256_mont_sub_4(x, x, t1, p256_mod);
21905         /* Z = Z*Y */
21906         sp_256_mont_mul_4(r[j].z, z, y, p256_mod, p256_mp_mod);
21907         z = r[j].z;
21908         /* t2 = Y^4 */
21909         sp_256_mont_sqr_4(t2, t2, p256_mod, p256_mp_mod);
21910         if (i != n) {
21911             /* W = W*Y^4 */
21912             sp_256_mont_mul_4(w, w, t2, p256_mod, p256_mp_mod);
21913         }
21914         /* y = 2*A*(B - X) - Y^4 */
21915         sp_256_mont_sub_4(y, b, x, p256_mod);
21916         sp_256_mont_mul_4(y, y, a, p256_mod, p256_mp_mod);
21917         sp_256_mont_dbl_4(y, y, p256_mod);
21918         sp_256_mont_sub_4(y, y, t2, p256_mod);
21919 
21920         /* Y = Y/2 */
21921         sp_256_div2_4(r[j].y, y, p256_mod);
21922         r[j].infinity = 0;
21923     }
21924 }
21925 
21926 /* Add two Montgomery form projective points.
21927  *
21928  * ra  Result of addition.
21929  * rs  Result of subtraction.
21930  * p   First point to add.
21931  * q   Second point to add.
21932  * t   Temporary ordinate data.
21933  */
sp_256_proj_point_add_sub_4(sp_point_256 * ra,sp_point_256 * rs,const sp_point_256 * p,const sp_point_256 * q,sp_digit * t)21934 static void sp_256_proj_point_add_sub_4(sp_point_256* ra,
21935         sp_point_256* rs, const sp_point_256* p, const sp_point_256* q,
21936         sp_digit* t)
21937 {
21938     sp_digit* t1 = t;
21939     sp_digit* t2 = t + 2*4;
21940     sp_digit* t3 = t + 4*4;
21941     sp_digit* t4 = t + 6*4;
21942     sp_digit* t5 = t + 8*4;
21943     sp_digit* t6 = t + 10*4;
21944     sp_digit* x = ra->x;
21945     sp_digit* y = ra->y;
21946     sp_digit* z = ra->z;
21947     sp_digit* xs = rs->x;
21948     sp_digit* ys = rs->y;
21949     sp_digit* zs = rs->z;
21950 
21951 
21952     XMEMCPY(x, p->x, sizeof(p->x) / 2);
21953     XMEMCPY(y, p->y, sizeof(p->y) / 2);
21954     XMEMCPY(z, p->z, sizeof(p->z) / 2);
21955     ra->infinity = 0;
21956     rs->infinity = 0;
21957 
21958     /* U1 = X1*Z2^2 */
21959     sp_256_mont_sqr_4(t1, q->z, p256_mod, p256_mp_mod);
21960     sp_256_mont_mul_4(t3, t1, q->z, p256_mod, p256_mp_mod);
21961     sp_256_mont_mul_4(t1, t1, x, p256_mod, p256_mp_mod);
21962     /* U2 = X2*Z1^2 */
21963     sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod);
21964     sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod);
21965     sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod);
21966     /* S1 = Y1*Z2^3 */
21967     sp_256_mont_mul_4(t3, t3, y, p256_mod, p256_mp_mod);
21968     /* S2 = Y2*Z1^3 */
21969     sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod);
21970     /* H = U2 - U1 */
21971     sp_256_mont_sub_4(t2, t2, t1, p256_mod);
21972     /* RS = S2 + S1 */
21973     sp_256_mont_add_4(t6, t4, t3, p256_mod);
21974     /* R = S2 - S1 */
21975     sp_256_mont_sub_4(t4, t4, t3, p256_mod);
21976     /* Z3 = H*Z1*Z2 */
21977     /* ZS = H*Z1*Z2 */
21978     sp_256_mont_mul_4(z, z, q->z, p256_mod, p256_mp_mod);
21979     sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod);
21980     XMEMCPY(zs, z, sizeof(p->z)/2);
21981     /* X3 = R^2 - H^3 - 2*U1*H^2 */
21982     /* XS = RS^2 - H^3 - 2*U1*H^2 */
21983     sp_256_mont_sqr_4(x, t4, p256_mod, p256_mp_mod);
21984     sp_256_mont_sqr_4(xs, t6, p256_mod, p256_mp_mod);
21985     sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod);
21986     sp_256_mont_mul_4(y, t1, t5, p256_mod, p256_mp_mod);
21987     sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod);
21988     sp_256_mont_sub_4(x, x, t5, p256_mod);
21989     sp_256_mont_sub_4(xs, xs, t5, p256_mod);
21990     sp_256_mont_dbl_4(t1, y, p256_mod);
21991     sp_256_mont_sub_4(x, x, t1, p256_mod);
21992     sp_256_mont_sub_4(xs, xs, t1, p256_mod);
21993     /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
21994     /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */
21995     sp_256_mont_sub_4(ys, y, xs, p256_mod);
21996     sp_256_mont_sub_4(y, y, x, p256_mod);
21997     sp_256_mont_mul_4(y, y, t4, p256_mod, p256_mp_mod);
21998     sp_256_sub_4(t6, p256_mod, t6);
21999     sp_256_mont_mul_4(ys, ys, t6, p256_mod, p256_mp_mod);
22000     sp_256_mont_mul_4(t5, t5, t3, p256_mod, p256_mp_mod);
22001     sp_256_mont_sub_4(y, y, t5, p256_mod);
22002     sp_256_mont_sub_4(ys, ys, t5, p256_mod);
22003 }
22004 
22005 /* Structure used to describe recoding of scalar multiplication. */
22006 typedef struct ecc_recode_256 {
22007     /* Index into pre-computation table. */
22008     uint8_t i;
22009     /* Use the negative of the point. */
22010     uint8_t neg;
22011 } ecc_recode_256;
22012 
22013 /* The index into pre-computation table to use. */
22014 static const uint8_t recode_index_4_6[66] = {
22015      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
22016     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
22017     32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
22018     16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
22019      0,  1,
22020 };
22021 
22022 /* Whether to negate y-ordinate. */
22023 static const uint8_t recode_neg_4_6[66] = {
22024      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
22025      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
22026      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
22027      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
22028      0,  0,
22029 };
22030 
22031 /* Recode the scalar for multiplication using pre-computed values and
22032  * subtraction.
22033  *
22034  * k  Scalar to multiply by.
22035  * v  Vector of operations to perform.
22036  */
sp_256_ecc_recode_6_4(const sp_digit * k,ecc_recode_256 * v)22037 static void sp_256_ecc_recode_6_4(const sp_digit* k, ecc_recode_256* v)
22038 {
22039     int i;
22040     int j;
22041     uint8_t y;
22042     int carry = 0;
22043     int o;
22044     sp_digit n;
22045 
22046     j = 0;
22047     n = k[j];
22048     o = 0;
22049     for (i=0; i<43; i++) {
22050         y = (int8_t)n;
22051         if (o + 6 < 64) {
22052             y &= 0x3f;
22053             n >>= 6;
22054             o += 6;
22055         }
22056         else if (o + 6 == 64) {
22057             n >>= 6;
22058             if (++j < 4)
22059                 n = k[j];
22060             o = 0;
22061         }
22062         else if (++j < 4) {
22063             n = k[j];
22064             y |= (uint8_t)((n << (64 - o)) & 0x3f);
22065             o -= 58;
22066             n >>= o;
22067         }
22068 
22069         y += (uint8_t)carry;
22070         v[i].i = recode_index_4_6[y];
22071         v[i].neg = recode_neg_4_6[y];
22072         carry = (y >> 6) + v[i].neg;
22073     }
22074 }
22075 
22076 #ifndef WC_NO_CACHE_RESISTANT
22077 /* Touch each possible point that could be being copied.
22078  *
22079  * r      Point to copy into.
22080  * table  Table - start of the entires to access
22081  * idx    Index of entry to retrieve.
22082  */
sp_256_get_point_33_4(sp_point_256 * r,const sp_point_256 * table,int idx)22083 static void sp_256_get_point_33_4(sp_point_256* r, const sp_point_256* table,
22084     int idx)
22085 {
22086     int i;
22087     sp_digit mask;
22088 
22089     r->x[0] = 0;
22090     r->x[1] = 0;
22091     r->x[2] = 0;
22092     r->x[3] = 0;
22093     r->y[0] = 0;
22094     r->y[1] = 0;
22095     r->y[2] = 0;
22096     r->y[3] = 0;
22097     r->z[0] = 0;
22098     r->z[1] = 0;
22099     r->z[2] = 0;
22100     r->z[3] = 0;
22101     for (i = 1; i < 33; i++) {
22102         mask = 0 - (i == idx);
22103         r->x[0] |= mask & table[i].x[0];
22104         r->x[1] |= mask & table[i].x[1];
22105         r->x[2] |= mask & table[i].x[2];
22106         r->x[3] |= mask & table[i].x[3];
22107         r->y[0] |= mask & table[i].y[0];
22108         r->y[1] |= mask & table[i].y[1];
22109         r->y[2] |= mask & table[i].y[2];
22110         r->y[3] |= mask & table[i].y[3];
22111         r->z[0] |= mask & table[i].z[0];
22112         r->z[1] |= mask & table[i].z[1];
22113         r->z[2] |= mask & table[i].z[2];
22114         r->z[3] |= mask & table[i].z[3];
22115     }
22116 }
22117 #endif /* !WC_NO_CACHE_RESISTANT */
22118 /* Multiply the point by the scalar and return the result.
22119  * If map is true then convert result to affine coordinates.
22120  *
22121  * Window technique of 6 bits. (Add-Sub variation.)
22122  * Calculate 0..32 times the point. Use function that adds and
22123  * subtracts the same two points.
22124  * Recode to add or subtract one of the computed points.
22125  * Double to push up.
22126  * NOT a sliding window.
22127  *
22128  * r     Resulting point.
22129  * g     Point to multiply.
22130  * k     Scalar to multiply by.
22131  * map   Indicates whether to convert result to affine.
22132  * ct    Constant time required.
22133  * heap  Heap to use for allocation.
22134  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
22135  */
sp_256_ecc_mulmod_win_add_sub_4(sp_point_256 * r,const sp_point_256 * g,const sp_digit * k,int map,int ct,void * heap)22136 static int sp_256_ecc_mulmod_win_add_sub_4(sp_point_256* r, const sp_point_256* g,
22137         const sp_digit* k, int map, int ct, void* heap)
22138 {
22139 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22140     sp_point_256* t = NULL;
22141     sp_digit* tmp = NULL;
22142 #else
22143     sp_point_256 t[33+2];
22144     sp_digit tmp[2 * 4 * 6];
22145 #endif
22146     sp_point_256* rt = NULL;
22147     sp_point_256* p = NULL;
22148     sp_digit* negy;
22149     int i;
22150     ecc_recode_256 v[43];
22151     int err = MP_OKAY;
22152 
22153     /* Constant time used for cache attack resistance implementation. */
22154     (void)ct;
22155     (void)heap;
22156 
22157 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22158     t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) *
22159         (33+2), heap, DYNAMIC_TYPE_ECC);
22160     if (t == NULL)
22161         err = MEMORY_E;
22162     if (err == MP_OKAY) {
22163         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6,
22164                                  heap, DYNAMIC_TYPE_ECC);
22165         if (tmp == NULL)
22166             err = MEMORY_E;
22167     }
22168 #endif
22169 
22170     if (err == MP_OKAY) {
22171         rt = t + 33;
22172         p  = t + 33+1;
22173 
22174         /* t[0] = {0, 0, 1} * norm */
22175         XMEMSET(&t[0], 0, sizeof(t[0]));
22176         t[0].infinity = 1;
22177         /* t[1] = {g->x, g->y, g->z} * norm */
22178         err = sp_256_mod_mul_norm_4(t[1].x, g->x, p256_mod);
22179     }
22180     if (err == MP_OKAY) {
22181         err = sp_256_mod_mul_norm_4(t[1].y, g->y, p256_mod);
22182     }
22183     if (err == MP_OKAY) {
22184         err = sp_256_mod_mul_norm_4(t[1].z, g->z, p256_mod);
22185     }
22186 
22187     if (err == MP_OKAY) {
22188         t[1].infinity = 0;
22189         /* t[2] ... t[32]  */
22190         sp_256_proj_point_dbl_n_store_4(t, &t[ 1], 5, 1, tmp);
22191         sp_256_proj_point_add_4(&t[ 3], &t[ 2], &t[ 1], tmp);
22192         sp_256_proj_point_dbl_4(&t[ 6], &t[ 3], tmp);
22193         sp_256_proj_point_add_sub_4(&t[ 7], &t[ 5], &t[ 6], &t[ 1], tmp);
22194         sp_256_proj_point_dbl_4(&t[10], &t[ 5], tmp);
22195         sp_256_proj_point_add_sub_4(&t[11], &t[ 9], &t[10], &t[ 1], tmp);
22196         sp_256_proj_point_dbl_4(&t[12], &t[ 6], tmp);
22197         sp_256_proj_point_dbl_4(&t[14], &t[ 7], tmp);
22198         sp_256_proj_point_add_sub_4(&t[15], &t[13], &t[14], &t[ 1], tmp);
22199         sp_256_proj_point_dbl_4(&t[18], &t[ 9], tmp);
22200         sp_256_proj_point_add_sub_4(&t[19], &t[17], &t[18], &t[ 1], tmp);
22201         sp_256_proj_point_dbl_4(&t[20], &t[10], tmp);
22202         sp_256_proj_point_dbl_4(&t[22], &t[11], tmp);
22203         sp_256_proj_point_add_sub_4(&t[23], &t[21], &t[22], &t[ 1], tmp);
22204         sp_256_proj_point_dbl_4(&t[24], &t[12], tmp);
22205         sp_256_proj_point_dbl_4(&t[26], &t[13], tmp);
22206         sp_256_proj_point_add_sub_4(&t[27], &t[25], &t[26], &t[ 1], tmp);
22207         sp_256_proj_point_dbl_4(&t[28], &t[14], tmp);
22208         sp_256_proj_point_dbl_4(&t[30], &t[15], tmp);
22209         sp_256_proj_point_add_sub_4(&t[31], &t[29], &t[30], &t[ 1], tmp);
22210 
22211         negy = t[0].y;
22212 
22213         sp_256_ecc_recode_6_4(k, v);
22214 
22215         i = 42;
22216     #ifndef WC_NO_CACHE_RESISTANT
22217         if (ct) {
22218             sp_256_get_point_33_4(rt, t, v[i].i);
22219             rt->infinity = !v[i].i;
22220         }
22221         else
22222     #endif
22223         {
22224             XMEMCPY(rt, &t[v[i].i], sizeof(sp_point_256));
22225         }
22226         for (--i; i>=0; i--) {
22227             sp_256_proj_point_dbl_n_4(rt, 6, tmp);
22228 
22229         #ifndef WC_NO_CACHE_RESISTANT
22230             if (ct) {
22231                 sp_256_get_point_33_4(p, t, v[i].i);
22232                 p->infinity = !v[i].i;
22233             }
22234             else
22235         #endif
22236             {
22237                 XMEMCPY(p, &t[v[i].i], sizeof(sp_point_256));
22238             }
22239             sp_256_sub_4(negy, p256_mod, p->y);
22240             sp_256_norm_4(negy);
22241             sp_256_cond_copy_4(p->y, negy, (sp_digit)0 - v[i].neg);
22242             sp_256_proj_point_add_4(rt, rt, p, tmp);
22243         }
22244 
22245         if (map != 0) {
22246             sp_256_map_4(r, rt, tmp);
22247         }
22248         else {
22249             XMEMCPY(r, rt, sizeof(sp_point_256));
22250         }
22251     }
22252 
22253 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22254     if (t != NULL)
22255         XFREE(t, heap, DYNAMIC_TYPE_ECC);
22256     if (tmp != NULL)
22257         XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
22258 #endif
22259 
22260     return err;
22261 }
22262 
22263 #ifndef WC_NO_CACHE_RESISTANT
22264 /* A table entry for pre-computed points. */
22265 typedef struct sp_table_entry_256 {
22266     sp_digit x[4];
22267     sp_digit y[4];
22268 } sp_table_entry_256;
22269 
22270 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
22271 #endif /* FP_ECC | WOLFSSL_SP_SMALL */
22272 /* Add two Montgomery form projective points. The second point has a q value of
22273  * one.
22274  * Only the first point can be the same pointer as the result point.
22275  *
22276  * r  Result of addition.
22277  * p  First point to add.
22278  * q  Second point to add.
22279  * t  Temporary ordinate data.
22280  */
sp_256_proj_point_add_qz1_4(sp_point_256 * r,const sp_point_256 * p,const sp_point_256 * q,sp_digit * t)22281 static void sp_256_proj_point_add_qz1_4(sp_point_256* r, const sp_point_256* p,
22282         const sp_point_256* q, sp_digit* t)
22283 {
22284     const sp_point_256* ap[2];
22285     sp_point_256* rp[2];
22286     sp_digit* t1 = t;
22287     sp_digit* t2 = t + 2*4;
22288     sp_digit* t3 = t + 4*4;
22289     sp_digit* t4 = t + 6*4;
22290     sp_digit* t5 = t + 8*4;
22291     sp_digit* x;
22292     sp_digit* y;
22293     sp_digit* z;
22294     int i;
22295 
22296     /* Check double */
22297     (void)sp_256_sub_4(t1, p256_mod, q->y);
22298     sp_256_norm_4(t1);
22299     if ((sp_256_cmp_equal_4(p->x, q->x) & sp_256_cmp_equal_4(p->z, q->z) &
22300         (sp_256_cmp_equal_4(p->y, q->y) | sp_256_cmp_equal_4(p->y, t1))) != 0) {
22301         sp_256_proj_point_dbl_4(r, p, t);
22302     }
22303     else {
22304         rp[0] = r;
22305 
22306         /*lint allow cast to different type of pointer*/
22307         rp[1] = (sp_point_256*)t; /*lint !e9087 !e740*/
22308         XMEMSET(rp[1], 0, sizeof(sp_point_256));
22309         x = rp[p->infinity | q->infinity]->x;
22310         y = rp[p->infinity | q->infinity]->y;
22311         z = rp[p->infinity | q->infinity]->z;
22312 
22313         ap[0] = p;
22314         ap[1] = q;
22315         for (i=0; i<4; i++) {
22316             r->x[i] = ap[p->infinity]->x[i];
22317         }
22318         for (i=0; i<4; i++) {
22319             r->y[i] = ap[p->infinity]->y[i];
22320         }
22321         for (i=0; i<4; i++) {
22322             r->z[i] = ap[p->infinity]->z[i];
22323         }
22324         r->infinity = ap[p->infinity]->infinity;
22325 
22326         /* U2 = X2*Z1^2 */
22327         sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod);
22328         sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod);
22329         sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod);
22330         /* S2 = Y2*Z1^3 */
22331         sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod);
22332         /* H = U2 - X1 */
22333         sp_256_mont_sub_4(t2, t2, x, p256_mod);
22334         /* R = S2 - Y1 */
22335         sp_256_mont_sub_4(t4, t4, y, p256_mod);
22336         /* Z3 = H*Z1 */
22337         sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod);
22338         /* X3 = R^2 - H^3 - 2*X1*H^2 */
22339         sp_256_mont_sqr_4(t1, t4, p256_mod, p256_mp_mod);
22340         sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod);
22341         sp_256_mont_mul_4(t3, x, t5, p256_mod, p256_mp_mod);
22342         sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod);
22343         sp_256_mont_sub_4(x, t1, t5, p256_mod);
22344         sp_256_mont_dbl_4(t1, t3, p256_mod);
22345         sp_256_mont_sub_4(x, x, t1, p256_mod);
22346         /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
22347         sp_256_mont_sub_4(t3, t3, x, p256_mod);
22348         sp_256_mont_mul_4(t3, t3, t4, p256_mod, p256_mp_mod);
22349         sp_256_mont_mul_4(t5, t5, y, p256_mod, p256_mp_mod);
22350         sp_256_mont_sub_4(y, t3, t5, p256_mod);
22351     }
22352 }
22353 
22354 #ifdef FP_ECC
22355 /* Convert the projective point to affine.
22356  * Ordinates are in Montgomery form.
22357  *
22358  * a  Point to convert.
22359  * t  Temporary data.
22360  */
sp_256_proj_to_affine_4(sp_point_256 * a,sp_digit * t)22361 static void sp_256_proj_to_affine_4(sp_point_256* a, sp_digit* t)
22362 {
22363     sp_digit* t1 = t;
22364     sp_digit* t2 = t + 2 * 4;
22365     sp_digit* tmp = t + 4 * 4;
22366 
22367     sp_256_mont_inv_4(t1, a->z, tmp);
22368 
22369     sp_256_mont_sqr_4(t2, t1, p256_mod, p256_mp_mod);
22370     sp_256_mont_mul_4(t1, t2, t1, p256_mod, p256_mp_mod);
22371 
22372     sp_256_mont_mul_4(a->x, a->x, t2, p256_mod, p256_mp_mod);
22373     sp_256_mont_mul_4(a->y, a->y, t1, p256_mod, p256_mp_mod);
22374     XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
22375 }
22376 
22377 /* Generate the pre-computed table of points for the base point.
22378  *
22379  * width = 6
22380  * 64 entries
22381  * 42 bits between
22382  *
22383  * a      The base point.
22384  * table  Place to store generated point data.
22385  * tmp    Temporary data.
22386  * heap  Heap to use for allocation.
22387  */
sp_256_gen_stripe_table_4(const sp_point_256 * a,sp_table_entry_256 * table,sp_digit * tmp,void * heap)22388 static int sp_256_gen_stripe_table_4(const sp_point_256* a,
22389         sp_table_entry_256* table, sp_digit* tmp, void* heap)
22390 {
22391 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22392     sp_point_256* t = NULL;
22393 #else
22394     sp_point_256 t[3];
22395 #endif
22396     sp_point_256* s1 = NULL;
22397     sp_point_256* s2 = NULL;
22398     int i;
22399     int j;
22400     int err = MP_OKAY;
22401 
22402     (void)heap;
22403 
22404 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22405     t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
22406                                      DYNAMIC_TYPE_ECC);
22407     if (t == NULL)
22408         err = MEMORY_E;
22409 #endif
22410 
22411     if (err == MP_OKAY) {
22412         s1 = t + 1;
22413         s2 = t + 2;
22414 
22415         err = sp_256_mod_mul_norm_4(t->x, a->x, p256_mod);
22416     }
22417     if (err == MP_OKAY) {
22418         err = sp_256_mod_mul_norm_4(t->y, a->y, p256_mod);
22419     }
22420     if (err == MP_OKAY) {
22421         err = sp_256_mod_mul_norm_4(t->z, a->z, p256_mod);
22422     }
22423     if (err == MP_OKAY) {
22424         t->infinity = 0;
22425         sp_256_proj_to_affine_4(t, tmp);
22426 
22427         XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
22428         s1->infinity = 0;
22429         XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
22430         s2->infinity = 0;
22431 
22432         /* table[0] = {0, 0, infinity} */
22433         XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
22434         /* table[1] = Affine version of 'a' in Montgomery form */
22435         XMEMCPY(table[1].x, t->x, sizeof(table->x));
22436         XMEMCPY(table[1].y, t->y, sizeof(table->y));
22437 
22438         for (i=1; i<6; i++) {
22439             sp_256_proj_point_dbl_n_4(t, 43, tmp);
22440             sp_256_proj_to_affine_4(t, tmp);
22441             XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
22442             XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
22443         }
22444 
22445         for (i=1; i<6; i++) {
22446             XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
22447             XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
22448             for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
22449                 XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
22450                 XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
22451                 sp_256_proj_point_add_qz1_4(t, s1, s2, tmp);
22452                 sp_256_proj_to_affine_4(t, tmp);
22453                 XMEMCPY(table[j].x, t->x, sizeof(table->x));
22454                 XMEMCPY(table[j].y, t->y, sizeof(table->y));
22455             }
22456         }
22457     }
22458 
22459 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22460     if (t != NULL)
22461         XFREE(t, heap, DYNAMIC_TYPE_ECC);
22462 #endif
22463 
22464     return err;
22465 }
22466 
22467 #endif /* FP_ECC */
22468 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
22469 #ifndef WC_NO_CACHE_RESISTANT
22470 /* Touch each possible entry that could be being copied.
22471  *
22472  * r      Point to copy into.
22473  * table  Table - start of the entires to access
22474  * idx    Index of entry to retrieve.
22475  */
sp_256_get_entry_64_4(sp_point_256 * r,const sp_table_entry_256 * table,int idx)22476 static void sp_256_get_entry_64_4(sp_point_256* r,
22477     const sp_table_entry_256* table, int idx)
22478 {
22479     int i;
22480     sp_digit mask;
22481 
22482     r->x[0] = 0;
22483     r->x[1] = 0;
22484     r->x[2] = 0;
22485     r->x[3] = 0;
22486     r->y[0] = 0;
22487     r->y[1] = 0;
22488     r->y[2] = 0;
22489     r->y[3] = 0;
22490     for (i = 1; i < 64; i++) {
22491         mask = 0 - (i == idx);
22492         r->x[0] |= mask & table[i].x[0];
22493         r->x[1] |= mask & table[i].x[1];
22494         r->x[2] |= mask & table[i].x[2];
22495         r->x[3] |= mask & table[i].x[3];
22496         r->y[0] |= mask & table[i].y[0];
22497         r->y[1] |= mask & table[i].y[1];
22498         r->y[2] |= mask & table[i].y[2];
22499         r->y[3] |= mask & table[i].y[3];
22500     }
22501 }
22502 #endif /* !WC_NO_CACHE_RESISTANT */
22503 /* Multiply the point by the scalar and return the result.
22504  * If map is true then convert result to affine coordinates.
22505  *
22506  * Stripe implementation.
22507  * Pre-generated: 2^0, 2^42, ...
22508  * Pre-generated: products of all combinations of above.
22509  * 6 doubles and adds (with qz=1)
22510  *
22511  * r      Resulting point.
22512  * k      Scalar to multiply by.
22513  * table  Pre-computed table.
22514  * map    Indicates whether to convert result to affine.
22515  * ct     Constant time required.
22516  * heap   Heap to use for allocation.
22517  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
22518  */
sp_256_ecc_mulmod_stripe_4(sp_point_256 * r,const sp_point_256 * g,const sp_table_entry_256 * table,const sp_digit * k,int map,int ct,void * heap)22519 static int sp_256_ecc_mulmod_stripe_4(sp_point_256* r, const sp_point_256* g,
22520         const sp_table_entry_256* table, const sp_digit* k, int map,
22521         int ct, void* heap)
22522 {
22523 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22524     sp_point_256* rt = NULL;
22525     sp_digit* t = NULL;
22526 #else
22527     sp_point_256 rt[2];
22528     sp_digit t[2 * 4 * 5];
22529 #endif
22530     sp_point_256* p = NULL;
22531     int i;
22532     int j;
22533     int y;
22534     int x;
22535     int err = MP_OKAY;
22536 
22537     (void)g;
22538     /* Constant time used for cache attack resistance implementation. */
22539     (void)ct;
22540     (void)heap;
22541 
22542 
22543 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22544     rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
22545                                       DYNAMIC_TYPE_ECC);
22546     if (rt == NULL)
22547         err = MEMORY_E;
22548     if (err == MP_OKAY) {
22549         t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap,
22550                                DYNAMIC_TYPE_ECC);
22551         if (t == NULL)
22552             err = MEMORY_E;
22553     }
22554 #endif
22555 
22556     if (err == MP_OKAY) {
22557         p = rt + 1;
22558 
22559         XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
22560         XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
22561 
22562         y = 0;
22563         x = 42;
22564         for (j=0; j<6 && x<256; j++) {
22565             y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
22566             x += 43;
22567         }
22568     #ifndef WC_NO_CACHE_RESISTANT
22569         if (ct) {
22570             sp_256_get_entry_64_4(rt, table, y);
22571         } else
22572     #endif
22573         {
22574             XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
22575             XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
22576         }
22577         rt->infinity = !y;
22578         for (i=41; i>=0; i--) {
22579             y = 0;
22580             x = i;
22581             for (j=0; j<6 && x<256; j++) {
22582                 y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
22583                 x += 43;
22584             }
22585 
22586             sp_256_proj_point_dbl_4(rt, rt, t);
22587         #ifndef WC_NO_CACHE_RESISTANT
22588             if (ct) {
22589                 sp_256_get_entry_64_4(p, table, y);
22590             }
22591             else
22592         #endif
22593             {
22594                 XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
22595                 XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
22596             }
22597             p->infinity = !y;
22598             sp_256_proj_point_add_qz1_4(rt, rt, p, t);
22599         }
22600 
22601         if (map != 0) {
22602             sp_256_map_4(r, rt, t);
22603         }
22604         else {
22605             XMEMCPY(r, rt, sizeof(sp_point_256));
22606         }
22607     }
22608 
22609 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22610     if (t != NULL)
22611         XFREE(t, heap, DYNAMIC_TYPE_ECC);
22612     if (rt != NULL)
22613         XFREE(rt, heap, DYNAMIC_TYPE_ECC);
22614 #endif
22615 
22616     return err;
22617 }
22618 
22619 #endif /* FP_ECC | WOLFSSL_SP_SMALL */
22620 #ifdef FP_ECC
22621 #ifndef FP_ENTRIES
22622     #define FP_ENTRIES 16
22623 #endif
22624 
22625 /* Cache entry - holds precomputation tables for a point. */
22626 typedef struct sp_cache_256_t {
22627     /* X ordinate of point that table was generated from. */
22628     sp_digit x[4];
22629     /* Y ordinate of point that table was generated from. */
22630     sp_digit y[4];
22631     /* Precomputation table for point. */
22632     sp_table_entry_256 table[64];
22633     /* Count of entries in table. */
22634     uint32_t cnt;
22635     /* Point and table set in entry. */
22636     int set;
22637 } sp_cache_256_t;
22638 
22639 /* Cache of tables. */
22640 static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
22641 /* Index of last entry in cache. */
22642 static THREAD_LS_T int sp_cache_256_last = -1;
22643 /* Cache has been initialized. */
22644 static THREAD_LS_T int sp_cache_256_inited = 0;
22645 
22646 #ifndef HAVE_THREAD_LS
22647     static volatile int initCacheMutex_256 = 0;
22648     static wolfSSL_Mutex sp_cache_256_lock;
22649 #endif
22650 
22651 /* Get the cache entry for the point.
22652  *
22653  * g      [in]   Point scalar multipling.
22654  * cache  [out]  Cache table to use.
22655  */
sp_ecc_get_cache_256(const sp_point_256 * g,sp_cache_256_t ** cache)22656 static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
22657 {
22658     int i;
22659     int j;
22660     uint32_t least;
22661 
22662     if (sp_cache_256_inited == 0) {
22663         for (i=0; i<FP_ENTRIES; i++) {
22664             sp_cache_256[i].set = 0;
22665         }
22666         sp_cache_256_inited = 1;
22667     }
22668 
22669     /* Compare point with those in cache. */
22670     for (i=0; i<FP_ENTRIES; i++) {
22671         if (!sp_cache_256[i].set)
22672             continue;
22673 
22674         if (sp_256_cmp_equal_4(g->x, sp_cache_256[i].x) &
22675                            sp_256_cmp_equal_4(g->y, sp_cache_256[i].y)) {
22676             sp_cache_256[i].cnt++;
22677             break;
22678         }
22679     }
22680 
22681     /* No match. */
22682     if (i == FP_ENTRIES) {
22683         /* Find empty entry. */
22684         i = (sp_cache_256_last + 1) % FP_ENTRIES;
22685         for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
22686             if (!sp_cache_256[i].set) {
22687                 break;
22688             }
22689         }
22690 
22691         /* Evict least used. */
22692         if (i == sp_cache_256_last) {
22693             least = sp_cache_256[0].cnt;
22694             for (j=1; j<FP_ENTRIES; j++) {
22695                 if (sp_cache_256[j].cnt < least) {
22696                     i = j;
22697                     least = sp_cache_256[i].cnt;
22698                 }
22699             }
22700         }
22701 
22702         XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
22703         XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
22704         sp_cache_256[i].set = 1;
22705         sp_cache_256[i].cnt = 1;
22706     }
22707 
22708     *cache = &sp_cache_256[i];
22709     sp_cache_256_last = i;
22710 }
22711 #endif /* FP_ECC */
22712 
22713 /* Multiply the base point of P256 by the scalar and return the result.
22714  * If map is true then convert result to affine coordinates.
22715  *
22716  * r     Resulting point.
22717  * g     Point to multiply.
22718  * k     Scalar to multiply by.
22719  * map   Indicates whether to convert result to affine.
22720  * ct    Constant time required.
22721  * heap  Heap to use for allocation.
22722  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
22723  */
sp_256_ecc_mulmod_4(sp_point_256 * r,const sp_point_256 * g,const sp_digit * k,int map,int ct,void * heap)22724 static int sp_256_ecc_mulmod_4(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
22725         int map, int ct, void* heap)
22726 {
22727 #ifndef FP_ECC
22728     return sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, ct, heap);
22729 #else
22730     sp_digit tmp[2 * 4 * 5];
22731     sp_cache_256_t* cache;
22732     int err = MP_OKAY;
22733 
22734 #ifndef HAVE_THREAD_LS
22735     if (initCacheMutex_256 == 0) {
22736          wc_InitMutex(&sp_cache_256_lock);
22737          initCacheMutex_256 = 1;
22738     }
22739     if (wc_LockMutex(&sp_cache_256_lock) != 0)
22740        err = BAD_MUTEX_E;
22741 #endif /* HAVE_THREAD_LS */
22742 
22743     if (err == MP_OKAY) {
22744         sp_ecc_get_cache_256(g, &cache);
22745         if (cache->cnt == 2)
22746             sp_256_gen_stripe_table_4(g, cache->table, tmp, heap);
22747 
22748 #ifndef HAVE_THREAD_LS
22749         wc_UnLockMutex(&sp_cache_256_lock);
22750 #endif /* HAVE_THREAD_LS */
22751 
22752         if (cache->cnt < 2) {
22753             err = sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, ct, heap);
22754         }
22755         else {
22756             err = sp_256_ecc_mulmod_stripe_4(r, g, cache->table, k,
22757                     map, ct, heap);
22758         }
22759     }
22760 
22761     return err;
22762 #endif
22763 }
22764 
22765 #else
22766 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
22767 #endif /* FP_ECC | WOLFSSL_SP_SMALL */
22768 #ifdef FP_ECC
22769 /* Generate the pre-computed table of points for the base point.
22770  *
22771  * width = 8
22772  * 256 entries
22773  * 32 bits between
22774  *
22775  * a      The base point.
22776  * table  Place to store generated point data.
22777  * tmp    Temporary data.
22778  * heap  Heap to use for allocation.
22779  */
sp_256_gen_stripe_table_4(const sp_point_256 * a,sp_table_entry_256 * table,sp_digit * tmp,void * heap)22780 static int sp_256_gen_stripe_table_4(const sp_point_256* a,
22781         sp_table_entry_256* table, sp_digit* tmp, void* heap)
22782 {
22783 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22784     sp_point_256* t = NULL;
22785 #else
22786     sp_point_256 t[3];
22787 #endif
22788     sp_point_256* s1 = NULL;
22789     sp_point_256* s2 = NULL;
22790     int i;
22791     int j;
22792     int err = MP_OKAY;
22793 
22794     (void)heap;
22795 
22796 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22797     t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
22798                                      DYNAMIC_TYPE_ECC);
22799     if (t == NULL)
22800         err = MEMORY_E;
22801 #endif
22802 
22803     if (err == MP_OKAY) {
22804         s1 = t + 1;
22805         s2 = t + 2;
22806 
22807         err = sp_256_mod_mul_norm_4(t->x, a->x, p256_mod);
22808     }
22809     if (err == MP_OKAY) {
22810         err = sp_256_mod_mul_norm_4(t->y, a->y, p256_mod);
22811     }
22812     if (err == MP_OKAY) {
22813         err = sp_256_mod_mul_norm_4(t->z, a->z, p256_mod);
22814     }
22815     if (err == MP_OKAY) {
22816         t->infinity = 0;
22817         sp_256_proj_to_affine_4(t, tmp);
22818 
22819         XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
22820         s1->infinity = 0;
22821         XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
22822         s2->infinity = 0;
22823 
22824         /* table[0] = {0, 0, infinity} */
22825         XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
22826         /* table[1] = Affine version of 'a' in Montgomery form */
22827         XMEMCPY(table[1].x, t->x, sizeof(table->x));
22828         XMEMCPY(table[1].y, t->y, sizeof(table->y));
22829 
22830         for (i=1; i<8; i++) {
22831             sp_256_proj_point_dbl_n_4(t, 32, tmp);
22832             sp_256_proj_to_affine_4(t, tmp);
22833             XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
22834             XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
22835         }
22836 
22837         for (i=1; i<8; i++) {
22838             XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
22839             XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
22840             for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
22841                 XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
22842                 XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
22843                 sp_256_proj_point_add_qz1_4(t, s1, s2, tmp);
22844                 sp_256_proj_to_affine_4(t, tmp);
22845                 XMEMCPY(table[j].x, t->x, sizeof(table->x));
22846                 XMEMCPY(table[j].y, t->y, sizeof(table->y));
22847             }
22848         }
22849     }
22850 
22851 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22852     if (t != NULL)
22853         XFREE(t, heap, DYNAMIC_TYPE_ECC);
22854 #endif
22855 
22856     return err;
22857 }
22858 
22859 #endif /* FP_ECC */
22860 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
22861 #ifndef WC_NO_CACHE_RESISTANT
22862 /* Touch each possible entry that could be being copied.
22863  *
22864  * r      Point to copy into.
22865  * table  Table - start of the entires to access
22866  * idx    Index of entry to retrieve.
22867  */
sp_256_get_entry_256_4(sp_point_256 * r,const sp_table_entry_256 * table,int idx)22868 static void sp_256_get_entry_256_4(sp_point_256* r,
22869     const sp_table_entry_256* table, int idx)
22870 {
22871     int i;
22872     sp_digit mask;
22873 
22874     r->x[0] = 0;
22875     r->x[1] = 0;
22876     r->x[2] = 0;
22877     r->x[3] = 0;
22878     r->y[0] = 0;
22879     r->y[1] = 0;
22880     r->y[2] = 0;
22881     r->y[3] = 0;
22882     for (i = 1; i < 256; i++) {
22883         mask = 0 - (i == idx);
22884         r->x[0] |= mask & table[i].x[0];
22885         r->x[1] |= mask & table[i].x[1];
22886         r->x[2] |= mask & table[i].x[2];
22887         r->x[3] |= mask & table[i].x[3];
22888         r->y[0] |= mask & table[i].y[0];
22889         r->y[1] |= mask & table[i].y[1];
22890         r->y[2] |= mask & table[i].y[2];
22891         r->y[3] |= mask & table[i].y[3];
22892     }
22893 }
22894 #endif /* !WC_NO_CACHE_RESISTANT */
22895 /* Multiply the point by the scalar and return the result.
22896  * If map is true then convert result to affine coordinates.
22897  *
22898  * Stripe implementation.
22899  * Pre-generated: 2^0, 2^32, ...
22900  * Pre-generated: products of all combinations of above.
22901  * 8 doubles and adds (with qz=1)
22902  *
22903  * r      Resulting point.
22904  * k      Scalar to multiply by.
22905  * table  Pre-computed table.
22906  * map    Indicates whether to convert result to affine.
22907  * ct     Constant time required.
22908  * heap   Heap to use for allocation.
22909  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
22910  */
sp_256_ecc_mulmod_stripe_4(sp_point_256 * r,const sp_point_256 * g,const sp_table_entry_256 * table,const sp_digit * k,int map,int ct,void * heap)22911 static int sp_256_ecc_mulmod_stripe_4(sp_point_256* r, const sp_point_256* g,
22912         const sp_table_entry_256* table, const sp_digit* k, int map,
22913         int ct, void* heap)
22914 {
22915 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22916     sp_point_256* rt = NULL;
22917     sp_digit* t = NULL;
22918 #else
22919     sp_point_256 rt[2];
22920     sp_digit t[2 * 4 * 5];
22921 #endif
22922     sp_point_256* p = NULL;
22923     int i;
22924     int j;
22925     int y;
22926     int x;
22927     int err = MP_OKAY;
22928 
22929     (void)g;
22930     /* Constant time used for cache attack resistance implementation. */
22931     (void)ct;
22932     (void)heap;
22933 
22934 
22935 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
22936     rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
22937                                       DYNAMIC_TYPE_ECC);
22938     if (rt == NULL)
22939         err = MEMORY_E;
22940     if (err == MP_OKAY) {
22941         t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap,
22942                                DYNAMIC_TYPE_ECC);
22943         if (t == NULL)
22944             err = MEMORY_E;
22945     }
22946 #endif
22947 
22948     if (err == MP_OKAY) {
22949         p = rt + 1;
22950 
22951         XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
22952         XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
22953 
22954         y = 0;
22955         x = 31;
22956         for (j=0; j<8; j++) {
22957             y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
22958             x += 32;
22959         }
22960     #ifndef WC_NO_CACHE_RESISTANT
22961         if (ct) {
22962             sp_256_get_entry_256_4(rt, table, y);
22963         } else
22964     #endif
22965         {
22966             XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
22967             XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
22968         }
22969         rt->infinity = !y;
22970         for (i=30; i>=0; i--) {
22971             y = 0;
22972             x = i;
22973             for (j=0; j<8; j++) {
22974                 y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
22975                 x += 32;
22976             }
22977 
22978             sp_256_proj_point_dbl_4(rt, rt, t);
22979         #ifndef WC_NO_CACHE_RESISTANT
22980             if (ct) {
22981                 sp_256_get_entry_256_4(p, table, y);
22982             }
22983             else
22984         #endif
22985             {
22986                 XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
22987                 XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
22988             }
22989             p->infinity = !y;
22990             sp_256_proj_point_add_qz1_4(rt, rt, p, t);
22991         }
22992 
22993         if (map != 0) {
22994             sp_256_map_4(r, rt, t);
22995         }
22996         else {
22997             XMEMCPY(r, rt, sizeof(sp_point_256));
22998         }
22999     }
23000 
23001 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
23002     if (t != NULL)
23003         XFREE(t, heap, DYNAMIC_TYPE_ECC);
23004     if (rt != NULL)
23005         XFREE(rt, heap, DYNAMIC_TYPE_ECC);
23006 #endif
23007 
23008     return err;
23009 }
23010 
23011 #endif /* FP_ECC | WOLFSSL_SP_SMALL */
23012 #ifdef FP_ECC
23013 #ifndef FP_ENTRIES
23014     #define FP_ENTRIES 16
23015 #endif
23016 
23017 /* Cache entry - holds precomputation tables for a point. */
23018 typedef struct sp_cache_256_t {
23019     /* X ordinate of point that table was generated from. */
23020     sp_digit x[4];
23021     /* Y ordinate of point that table was generated from. */
23022     sp_digit y[4];
23023     /* Precomputation table for point. */
23024     sp_table_entry_256 table[256];
23025     /* Count of entries in table. */
23026     uint32_t cnt;
23027     /* Point and table set in entry. */
23028     int set;
23029 } sp_cache_256_t;
23030 
23031 /* Cache of tables. */
23032 static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
23033 /* Index of last entry in cache. */
23034 static THREAD_LS_T int sp_cache_256_last = -1;
23035 /* Cache has been initialized. */
23036 static THREAD_LS_T int sp_cache_256_inited = 0;
23037 
23038 #ifndef HAVE_THREAD_LS
23039     static volatile int initCacheMutex_256 = 0;
23040     static wolfSSL_Mutex sp_cache_256_lock;
23041 #endif
23042 
23043 /* Get the cache entry for the point.
23044  *
23045  * g      [in]   Point scalar multipling.
23046  * cache  [out]  Cache table to use.
23047  */
sp_ecc_get_cache_256(const sp_point_256 * g,sp_cache_256_t ** cache)23048 static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
23049 {
23050     int i;
23051     int j;
23052     uint32_t least;
23053 
23054     if (sp_cache_256_inited == 0) {
23055         for (i=0; i<FP_ENTRIES; i++) {
23056             sp_cache_256[i].set = 0;
23057         }
23058         sp_cache_256_inited = 1;
23059     }
23060 
23061     /* Compare point with those in cache. */
23062     for (i=0; i<FP_ENTRIES; i++) {
23063         if (!sp_cache_256[i].set)
23064             continue;
23065 
23066         if (sp_256_cmp_equal_4(g->x, sp_cache_256[i].x) &
23067                            sp_256_cmp_equal_4(g->y, sp_cache_256[i].y)) {
23068             sp_cache_256[i].cnt++;
23069             break;
23070         }
23071     }
23072 
23073     /* No match. */
23074     if (i == FP_ENTRIES) {
23075         /* Find empty entry. */
23076         i = (sp_cache_256_last + 1) % FP_ENTRIES;
23077         for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
23078             if (!sp_cache_256[i].set) {
23079                 break;
23080             }
23081         }
23082 
23083         /* Evict least used. */
23084         if (i == sp_cache_256_last) {
23085             least = sp_cache_256[0].cnt;
23086             for (j=1; j<FP_ENTRIES; j++) {
23087                 if (sp_cache_256[j].cnt < least) {
23088                     i = j;
23089                     least = sp_cache_256[i].cnt;
23090                 }
23091             }
23092         }
23093 
23094         XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
23095         XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
23096         sp_cache_256[i].set = 1;
23097         sp_cache_256[i].cnt = 1;
23098     }
23099 
23100     *cache = &sp_cache_256[i];
23101     sp_cache_256_last = i;
23102 }
23103 #endif /* FP_ECC */
23104 
23105 /* Multiply the base point of P256 by the scalar and return the result.
23106  * If map is true then convert result to affine coordinates.
23107  *
23108  * r     Resulting point.
23109  * g     Point to multiply.
23110  * k     Scalar to multiply by.
23111  * map   Indicates whether to convert result to affine.
23112  * ct    Constant time required.
23113  * heap  Heap to use for allocation.
23114  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
23115  */
sp_256_ecc_mulmod_4(sp_point_256 * r,const sp_point_256 * g,const sp_digit * k,int map,int ct,void * heap)23116 static int sp_256_ecc_mulmod_4(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
23117         int map, int ct, void* heap)
23118 {
23119 #ifndef FP_ECC
23120     return sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, ct, heap);
23121 #else
23122     sp_digit tmp[2 * 4 * 5];
23123     sp_cache_256_t* cache;
23124     int err = MP_OKAY;
23125 
23126 #ifndef HAVE_THREAD_LS
23127     if (initCacheMutex_256 == 0) {
23128          wc_InitMutex(&sp_cache_256_lock);
23129          initCacheMutex_256 = 1;
23130     }
23131     if (wc_LockMutex(&sp_cache_256_lock) != 0)
23132        err = BAD_MUTEX_E;
23133 #endif /* HAVE_THREAD_LS */
23134 
23135     if (err == MP_OKAY) {
23136         sp_ecc_get_cache_256(g, &cache);
23137         if (cache->cnt == 2)
23138             sp_256_gen_stripe_table_4(g, cache->table, tmp, heap);
23139 
23140 #ifndef HAVE_THREAD_LS
23141         wc_UnLockMutex(&sp_cache_256_lock);
23142 #endif /* HAVE_THREAD_LS */
23143 
23144         if (cache->cnt < 2) {
23145             err = sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, ct, heap);
23146         }
23147         else {
23148             err = sp_256_ecc_mulmod_stripe_4(r, g, cache->table, k,
23149                     map, ct, heap);
23150         }
23151     }
23152 
23153     return err;
23154 #endif
23155 }
23156 
23157 #endif /* !WC_NO_CACHE_RESISTANT */
23158 /* Multiply the point by the scalar and return the result.
23159  * If map is true then convert result to affine coordinates.
23160  *
23161  * km    Scalar to multiply by.
23162  * p     Point to multiply.
23163  * r     Resulting point.
23164  * map   Indicates whether to convert result to affine.
23165  * heap  Heap to use for allocation.
23166  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
23167  */
sp_ecc_mulmod_256(const mp_int * km,const ecc_point * gm,ecc_point * r,int map,void * heap)23168 int sp_ecc_mulmod_256(const mp_int* km, const ecc_point* gm, ecc_point* r,
23169         int map, void* heap)
23170 {
23171 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
23172     sp_point_256* point = NULL;
23173     sp_digit* k = NULL;
23174 #else
23175     sp_point_256 point[1];
23176     sp_digit k[4];
23177 #endif
23178     int err = MP_OKAY;
23179 
23180 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
23181     point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
23182                                          DYNAMIC_TYPE_ECC);
23183     if (point == NULL)
23184         err = MEMORY_E;
23185     if (err == MP_OKAY) {
23186         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4, heap,
23187                                DYNAMIC_TYPE_ECC);
23188         if (k == NULL)
23189             err = MEMORY_E;
23190     }
23191 #endif
23192 
23193     if (err == MP_OKAY) {
23194         sp_256_from_mp(k, 4, km);
23195         sp_256_point_from_ecc_point_4(point, gm);
23196 
23197             err = sp_256_ecc_mulmod_4(point, point, k, map, 1, heap);
23198     }
23199     if (err == MP_OKAY) {
23200         err = sp_256_point_to_ecc_point_4(point, r);
23201     }
23202 
23203 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
23204     if (k != NULL)
23205         XFREE(k, heap, DYNAMIC_TYPE_ECC);
23206     if (point != NULL)
23207         XFREE(point, heap, DYNAMIC_TYPE_ECC);
23208 #endif
23209 
23210     return err;
23211 }
23212 
23213 /* Multiply the point by the scalar, add point a and return the result.
23214  * If map is true then convert result to affine coordinates.
23215  *
23216  * km      Scalar to multiply by.
23217  * p       Point to multiply.
23218  * am      Point to add to scalar mulitply result.
23219  * inMont  Point to add is in montgomery form.
23220  * r       Resulting point.
23221  * map     Indicates whether to convert result to affine.
23222  * heap    Heap to use for allocation.
23223  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
23224  */
sp_ecc_mulmod_add_256(const mp_int * km,const ecc_point * gm,const ecc_point * am,int inMont,ecc_point * r,int map,void * heap)23225 int sp_ecc_mulmod_add_256(const mp_int* km, const ecc_point* gm,
23226     const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
23227 {
23228 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
23229     sp_point_256* point = NULL;
23230     sp_digit* k = NULL;
23231 #else
23232     sp_point_256 point[2];
23233     sp_digit k[4 + 4 * 2 * 5];
23234 #endif
23235     sp_point_256* addP = NULL;
23236     sp_digit* tmp = NULL;
23237     int err = MP_OKAY;
23238 
23239 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
23240     point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
23241                                          DYNAMIC_TYPE_ECC);
23242     if (point == NULL)
23243         err = MEMORY_E;
23244     if (err == MP_OKAY) {
23245         k = (sp_digit*)XMALLOC(
23246             sizeof(sp_digit) * (4 + 4 * 2 * 5), heap,
23247             DYNAMIC_TYPE_ECC);
23248         if (k == NULL)
23249             err = MEMORY_E;
23250     }
23251 #endif
23252 
23253     if (err == MP_OKAY) {
23254         addP = point + 1;
23255         tmp = k + 4;
23256 
23257         sp_256_from_mp(k, 4, km);
23258         sp_256_point_from_ecc_point_4(point, gm);
23259         sp_256_point_from_ecc_point_4(addP, am);
23260     }
23261     if ((err == MP_OKAY) && (!inMont)) {
23262         err = sp_256_mod_mul_norm_4(addP->x, addP->x, p256_mod);
23263     }
23264     if ((err == MP_OKAY) && (!inMont)) {
23265         err = sp_256_mod_mul_norm_4(addP->y, addP->y, p256_mod);
23266     }
23267     if ((err == MP_OKAY) && (!inMont)) {
23268         err = sp_256_mod_mul_norm_4(addP->z, addP->z, p256_mod);
23269     }
23270     if (err == MP_OKAY) {
23271             err = sp_256_ecc_mulmod_4(point, point, k, 0, 0, heap);
23272     }
23273     if (err == MP_OKAY) {
23274             sp_256_proj_point_add_4(point, point, addP, tmp);
23275 
23276         if (map) {
23277                 sp_256_map_4(point, point, tmp);
23278         }
23279 
23280         err = sp_256_point_to_ecc_point_4(point, r);
23281     }
23282 
23283 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
23284     if (k != NULL)
23285         XFREE(k, heap, DYNAMIC_TYPE_ECC);
23286     if (point != NULL)
23287         XFREE(point, heap, DYNAMIC_TYPE_ECC);
23288 #endif
23289 
23290     return err;
23291 }
23292 
23293 #ifdef WOLFSSL_SP_SMALL
23294 #ifndef WC_NO_CACHE_RESISTANT
23295 /* Striping precomputation table.
23296  * 6 points combined into a table of 64 points.
23297  * Distance of 43 between points.
23298  */
23299 static const sp_table_entry_256 p256_table[64] = {
23300     /* 0 */
23301     { { 0x00, 0x00, 0x00, 0x00 },
23302       { 0x00, 0x00, 0x00, 0x00 } },
23303     /* 1 */
23304     { { 0x79e730d418a9143cL,0x75ba95fc5fedb601L,0x79fb732b77622510L,
23305         0x18905f76a53755c6L },
23306       { 0xddf25357ce95560aL,0x8b4ab8e4ba19e45cL,0xd2e88688dd21f325L,
23307         0x8571ff1825885d85L } },
23308     /* 2 */
23309     { { 0x8910507903605c39L,0xf0843d9ea142c96cL,0xf374493416923684L,
23310         0x732caa2ffa0a2893L },
23311       { 0xb2e8c27061160170L,0xc32788cc437fbaa3L,0x39cd818ea6eda3acL,
23312         0xe2e942399e2b2e07L } },
23313     /* 3 */
23314     { { 0xb9c0d276abc3e190L,0x610e3d4dcb55b9caL,0xd16dbd025720f50aL,
23315         0xd0ed73dca607de84L },
23316       { 0x3bbde5bf49219fb5L,0x698e12c057771843L,0xdb606a9763470a5eL,
23317         0x61c71975853635d5L } },
23318     /* 4 */
23319     { { 0xeb5ddcb6ec7fae9fL,0x995f2714efb66e5aL,0xdee95d8e69445d52L,
23320         0x1b6c2d4609e27620L },
23321       { 0x32621c318129d716L,0xb03909f10958c1aaL,0x8c468ef91af4af63L,
23322         0x162c429ffba5cdf6L } },
23323     /* 5 */
23324     { { 0x4615d912c1d85f12L,0x1f0880b0e1f4e302L,0x336bcc896f1fca13L,
23325         0xda59ad0dc70dedbcL },
23326       { 0x3897efaeb0f62eceL,0xbaed81cdf4990cfdL,0xa3b1c2f260321bbbL,
23327         0x2aefd95addc84f79L } },
23328     /* 6 */
23329     { { 0x2d427e3cee9e92e6L,0x43d40da0437fe629L,0x0006e4e06ab72b31L,
23330         0x21ccfbb46f5c8e02L },
23331       { 0x53a2f1a753e821ecL,0x5d72d201e209d591L,0xfd84a26445e8ad41L,
23332         0x86ee0e684059cc6eL } },
23333     /* 7 */
23334     { { 0x3d8242d09248fce2L,0x32d4bf827f49f33dL,0x78807beb29d41fd1L,
23335         0xfce48b99f8f562cbL },
23336       { 0x72a7d4849f38f097L,0x1b482c10a37059adL,0xc1aa8284472e5ed3L,
23337         0xc5d6f3bbef23e9c9L } },
23338     /* 8 */
23339     { { 0x23f949feb8a24a20L,0x17ebfed1f52ca53fL,0x9b691bbebcfb4853L,
23340         0x5617ff6b6278a05dL },
23341       { 0x241b34c5e3c99ebdL,0xfc64242e1784156aL,0x4206482f695d67dfL,
23342         0xb967ce0eee27c011L } },
23343     /* 9 */
23344     { { 0x569aacdf9fc3df19L,0x0c6782c7c34c6fb2L,0xbb5f98b2c4ec873dL,
23345         0x5578433b9fe9e475L },
23346       { 0xfa14f3869ca84821L,0xb8ef658d39589501L,0x4022c48e07127b8eL,
23347         0xcbc4dfe35402ea12L } },
23348     /* 10 */
23349     { { 0x092ef96a2ad408a3L,0xf1e1a4c4cfbc45a3L,0x966b2676efeecdeeL,
23350         0xa0e2c6713a6216c5L },
23351       { 0xcd6e22a292c4bf61L,0x56d99a11d830dfc7L,0xb8c612bd259de547L,
23352         0x3d8e9a72e91f8ff7L } },
23353     /* 11 */
23354     { { 0x0b885e962352b4ffL,0x6be320d2a6545766L,0xbd22a444b9a59e72L,
23355         0x2f2d32d6ccc55d7dL },
23356       { 0xd86e4c4cddcec70bL,0x19cdb0e97a25c934L,0x542ade069ca97e28L,
23357         0x58c5927c746517f7L } },
23358     /* 12 */
23359     { { 0x24abb0f08d087091L,0x6aa2c2ef51add8deL,0xc3e1cb4ccc2a2134L,
23360         0x3563112895589212L },
23361       { 0x3bf17d2a7984344bL,0xbcb6f7b2f8a142ccL,0xd6057d8a08ec9266L,
23362         0x75c150d22852405aL } },
23363     /* 13 */
23364     { { 0xa8f88eb5a9fee73eL,0x72a84174576ea39bL,0x671fa0ade2692e7dL,
23365         0x2556288596769f9eL },
23366       { 0x254323bce850a6b0L,0x74b61c18fff6c89aL,0x2e7c563fcfae2690L,
23367         0x2cf454b7164afb0fL } },
23368     /* 14 */
23369     { { 0xe312a5618f10f423L,0x59a1f1fff2b85df4L,0x56c5991941c48122L,
23370         0x74953c1eae3d175fL },
23371       { 0x4d767fc78859244cL,0xc486bc00719a4cc1L,0xdd282985df1c1787L,
23372         0x1143301aae93c719L } },
23373     /* 15 */
23374     { { 0x7201a1d61fab7d71L,0x65931f5432cbbee8L,0x202955d3dcb387eeL,
23375         0xa5045ba5c4678432L },
23376       { 0xcfb5ee87dca85ff6L,0xdd25a7c6dfec0f67L,0xfee47169356a87c6L,
23377         0x20a8f159c3d7ece9L } },
23378     /* 16 */
23379     { { 0xe4ac8b33070d3aabL,0x2643672b9a2cd5e5L,0x52eff79b1cfc9173L,
23380         0x665ca49b90a7c13fL },
23381       { 0x5a8dda59b3efb998L,0x8a5b922d052f1341L,0xae9ebbab3cf9a530L,
23382         0x35986e7bf56da4d7L } },
23383     /* 17 */
23384     { { 0x21e07f9abc0a70c0L,0xecfdb3a2989a0182L,0x360682c0e40e8125L,
23385         0x73a637952f837f32L },
23386       { 0xf4eb8cef9c0d326bL,0xefb97fecebf4c7a5L,0xf9352123af3d5d7eL,
23387         0xb71ef4ef34e22ab1L } },
23388     /* 18 */
23389     { { 0xd6bd0d810d488032L,0x1676df9971f0b92eL,0xa7acdcfcb6d215acL,
23390         0x82461a26cd0ff939L },
23391       { 0x827189c0b635d2e5L,0x18f3b6dda92f1622L,0x10d738aa05cef325L,
23392         0x12c2a13f39bb0aa6L } },
23393     /* 19 */
23394     { { 0x5f94d8deb50b4e82L,0xbcd9144e34bd93e9L,0x61c3392107c08623L,
23395         0xedec947e7e3de8eeL },
23396       { 0x9d2da51d2f21b202L,0xc0c885cd96692a89L,0x4a613462a5e7309cL,
23397         0x227788550f28dee6L } },
23398     /* 20 */
23399     { { 0x1ff0bd527695447aL,0x63534a4a42ae2627L,0xd96af0dad0cc09f2L,
23400         0xb59ea545412d3e1aL },
23401       { 0xd10518cf6a759072L,0xffeec37c10475dfdL,0xacbc29ccb25089c4L,
23402         0xbf3dfc8521b6d4eeL } },
23403     /* 21 */
23404     { { 0x8f2eacfe49388995L,0x000fc8d4841be9edL,0x2ed8085a6955c290L,
23405         0x1929cf606d8e176fL },
23406       { 0x2efd26a5fd1a09dbL,0x58d767ad6cb626cdL,0x13a81b95b26c6e05L,
23407         0x68fe61078f61832bL } },
23408     /* 22 */
23409     { { 0x4ad7de2e2d85c2f6L,0xcd552fcb510101a1L,0x638d122b02acdabfL,
23410         0x117221e850bfd921L },
23411       { 0x08571ee199a99129L,0xebd046d1ba2f03a9L,0x035ed7baa6f8a181L,
23412         0x8aabf98d3187c6f3L } },
23413     /* 23 */
23414     { { 0xaf8e65cae3ab5f4eL,0x8b0b8b897561a69cL,0x37e83aa0b17c1e66L,
23415         0xe894d84cf8d80edcL },
23416       { 0xf1e465e7ce514e22L,0xc7fa324ca72340efL,0x08297fcae7370673L,
23417         0x4f799682b119ae5eL } },
23418     /* 24 */
23419     { { 0x014d6bd8f180f206L,0x56640c8b7ab44f55L,0x9a39660d93f9a5b8L,
23420         0xcac069e9959b68f1L },
23421       { 0x2bf6b65e208d9918L,0xb7e45dfb3f943291L,0xad5770f0d439c712L,
23422         0xfec635e17654d805L } },
23423     /* 25 */
23424     { { 0x37221cd13f031a88L,0xe4d53d2f0b5558d4L,0x2ede8e8fdafc51cdL,
23425         0xb587284ca8a883eaL },
23426       { 0xfa37674044fa5251L,0x5e5e18f95c5e3528L,0x8af51fac6e10b958L,
23427         0x09be79032c429b30L } },
23428     /* 26 */
23429     { { 0x7a468ba47f29936dL,0xacbbe3657cfb8176L,0xe892c10a4db9cd5dL,
23430         0xcb2f29d7a1aade8bL },
23431       { 0x3087eef4efffcb14L,0x92a7f3ec2afe8f2eL,0x199d89b8136f29d2L,
23432         0x3131604eb4836623L } },
23433     /* 27 */
23434     { { 0xf5cca5da31b5df76L,0x9431318676a4abc0L,0x5db8e6f71877c7c7L,
23435         0x3ce3f5f96031ac99L },
23436       { 0x585961d07e7cef80L,0x5ed6e841d424f16aL,0x18289cd056b16a49L,
23437         0x8008d03b2e5770faL } },
23438     /* 28 */
23439     { { 0xc8c2af64254e39deL,0x783cea738582571cL,0x2f2f55f1a6edd971L,
23440         0x7e00cc92c86bf30aL },
23441       { 0xa0db735447d7491fL,0xb3eb751ca5b12260L,0x3bc39a23297fb234L,
23442         0xd1330c20b8b4bfe4L } },
23443     /* 29 */
23444     { { 0xfb776af07824d53aL,0x04709096422dea35L,0x6f480b6b5fec3ac7L,
23445         0xdb2b1b62e27edda4L },
23446       { 0x0bba904cda78b494L,0x37ef59b691a147f7L,0xf880517726a4730aL,
23447         0xecc9d79aa8ab368eL } },
23448     /* 30 */
23449     { { 0x628e05c185a4bd0eL,0xebf7b67800e244e8L,0xf645947b8b176eebL,
23450         0xc92bf8301641ab35L },
23451       { 0x7a039c1a21be7a6fL,0x11e4354d2fd4bd92L,0x42552422886fd224L,
23452         0xdbf3194cc44ced37L } },
23453     /* 31 */
23454     { { 0x832da983c56f6b04L,0x7aaa84eb8ef098aeL,0x602e3eefa6a616a2L,
23455         0xc2824ddcb7b717a3L },
23456       { 0x19f50324ddb0a2e9L,0x04553a285bedfbbdL,0x37ea8b12aa1aee0aL,
23457         0xc1844e79945959a1L } },
23458     /* 32 */
23459     { { 0x5043dea7e0f222c2L,0x309d42ac72e65142L,0x94fe9ddd9216cd30L,
23460         0xd6539c7d0f87feecL },
23461       { 0x03c5a57c432ac7d7L,0x72692cf0327fda10L,0xec28c85f280698deL,
23462         0x2331fb467ec283b1L } },
23463     /* 33 */
23464     { { 0x651cfdeb43248e67L,0x2c3d72ceee561de8L,0xa48b8f33443dac8bL,
23465         0xe6b042fe7991f986L },
23466       { 0xd091636de810bcd2L,0xfc1e96aea97416d7L,0x2b6087cb2892694dL,
23467         0x0f8ac2459985a628L } },
23468     /* 34 */
23469     { { 0x54e908747f2326a2L,0xce43dd44fa9e1131L,0x4b2c740cd3d2d948L,
23470         0x9b0b126aa86e8b07L },
23471       { 0x228ef320b77f5af2L,0x14fc8a01ca07661cL,0x1d72509ed34f1a3aL,
23472         0xd169031729d9086eL } },
23473     /* 35 */
23474     { { 0x13e44acc03c5fe33L,0x13f4374e0105bbc6L,0x0cba5018cb4451b8L,
23475         0xa1a38e4afa29a4e1L },
23476       { 0x063fb9a8f4403917L,0x7afe108f996ea7f2L,0xec252363f93a1f87L,
23477         0xc029c8117e432609L } },
23478     /* 36 */
23479     { { 0x25080c29486e548eL,0xdaa411327868ab32L,0x46891511d61d1a3aL,
23480         0xc87f3f533efc8facL },
23481       { 0x984f613ff3e31393L,0x10bb15f67648f5d2L,0xe4990f2bdefaa440L,
23482         0xce647f03dd51c31dL } },
23483     /* 37 */
23484     { { 0x3161ebdd9c2c0abfL,0x48b7ee7bf497cf35L,0x9233e31d94dd9c97L,
23485         0x4aef9a62c5d2988fL },
23486       { 0x89a54161a03e6456L,0x9d25e003c1f02b47L,0x8784cdbfc1857782L,
23487         0x7928cafd0222b49cL } },
23488     /* 38 */
23489     { { 0x5a591abdecf4ea23L,0xb2725e8a80bd9b8aL,0xf569679f29ff348bL,
23490         0xa28163d36f22536aL },
23491       { 0x89e7a8f621c43971L,0x60cbe4a1c4a09567L,0x41046c8f5928b03dL,
23492         0x646feda7ef74a95aL } },
23493     /* 39 */
23494     { { 0x3aef6bc05d75d310L,0xf3e7f03c82476e5cL,0x9dcf3d508419b8a0L,
23495         0x221a3885eaf07f07L },
23496       { 0x16d533f337bdcb7dL,0xd778066bbb49550dL,0xf6f4540936c2600cL,
23497         0x7544396fc1c61709L } },
23498     /* 40 */
23499     { { 0xf79f556fde08cd42L,0x7d0aba1ee13cadc8L,0x841d9df6d4d81fefL,
23500         0x8f7ae1f2602d2043L },
23501       { 0x950c4de4b57ee181L,0xfe51e045c55cf490L,0xdb60b56a1efdd0a8L,
23502         0x276bccb3bf0fa497L } },
23503     /* 41 */
23504     { { 0x7926625b19e5a603L,0xf1b98e93e1bf712bL,0x933ecb52e33abeccL,
23505         0x9ebfc506f826619bL },
23506       { 0xd2965f67a1692c52L,0x8ac4012dfc4f9564L,0xa8af57036739f003L,
23507         0x7dd2282dbc715e13L } },
23508     /* 42 */
23509     { { 0x3ec01587cf2bb490L,0x5346082c3f1ea428L,0xf2c679e26739e506L,
23510         0xeab710d6930c28e4L },
23511       { 0xe9947ff8e043249aL,0x63640678ad54b0e6L,0x8cde42591854eaafL,
23512         0xf1feeaec6b25bdceL } },
23513     /* 43 */
23514     { { 0x49f7e8991bdd2aa2L,0x88fd273534e3cae9L,0x5ac0510182cbfea2L,
23515         0x324c9d414cf84578L },
23516       { 0xa242311719f13061L,0x69d67cf15f3b9932L,0x32ecdb3cdde2dfadL,
23517         0x2f74d995b916f7a6L } },
23518     /* 44 */
23519     { { 0x35f7ed423d14bc68L,0x32f63a0445574f91L,0xd04108335e8801e7L,
23520         0x63b6f13c1c9c1462L },
23521       { 0x180dcbcd9dc7201fL,0xa07b5b2c360350dfL,0x2582b2774236f5ccL,
23522         0x90163924a7ab06b9L } },
23523     /* 45 */
23524     { { 0x35e751b50767cdf2L,0x808372e69d8e2838L,0xcbad6b30646914d7L,
23525         0x4eeeb1de6c7b3cabL },
23526       { 0x3ef3af968c965004L,0xd162290fd281920bL,0x4626c313181f811bL,
23527         0x5fa42f4fbe61dd14L } },
23528     /* 46 */
23529     { { 0x1f5a9c53a185e98eL,0x13c28277ea9e83c3L,0xb566e4c0b693a226L,
23530         0x2ea3f1c001533e9eL },
23531       { 0xb4dbcc336215a21fL,0x7df608c3cb4e98f0L,0x677df928b4dd95ddL,
23532         0x4c1d7142eeed2934L } },
23533     /* 47 */
23534     { { 0x30bf236c86a2ee12L,0x74d5a12705ecb4c0L,0x9ef43b0f1601cca9L,
23535         0xbe1b1bf9ac4dd202L },
23536       { 0x84943e4717b6f93bL,0x6f789757cd5214b3L,0x5e0db1a97f313dfaL,
23537         0x0515efacece0b72bL } },
23538     /* 48 */
23539     { { 0x433a677ca78c3f8bL,0x204a9feaf376a9c1L,0xb6bfbea444baeadfL,
23540         0x5a43cafd2b48a3f4L },
23541       { 0xe25a7d0b67d1d226L,0xb2115844f6837985L,0x8c9cca3ed87c2b88L,
23542         0xecd4bc73894772e1L } },
23543     /* 49 */
23544     { { 0x368abec6783490e7L,0xf26da8bdd925c359L,0xf9b643e5e8fb0679L,
23545         0x7ab803d9b555d175L },
23546       { 0x1b4059994ebae595L,0x07fbbf25ba417a49L,0x02d7cf1cc617957aL,
23547         0x79070ea5565c1fbbL } },
23548     /* 50 */
23549     { { 0x70194602d9b028faL,0x9c49969d9ff06760L,0xbf4add816ad27b42L,
23550         0x7d1f226d8651524eL },
23551       { 0xb0779b40eecd7724L,0xd356077265938707L,0xe3a61fe5d054b903L,
23552         0xd6f5a3433365136bL } },
23553     /* 51 */
23554     { { 0x25c87c76d2970fcfL,0x7c9f60a04d5546a8L,0x7dab072f8dd8bf8cL,
23555         0x3d10907ce8ff9f28L },
23556       { 0xb08d6d0e34bb2a29L,0x5dfd4907c3fcfdafL,0xe4a2d4b147123ba6L,
23557         0x6e9eef0b42de6d8dL } },
23558     /* 52 */
23559     { { 0x81255af5cbb55f9dL,0x579f27055328d39eL,0xa7bfc9173e5ae663L,
23560         0xe9b55d57a1246e42L },
23561       { 0x240ecd9475629188L,0x8748d297457bd3c0L,0x50e215ef373c361cL,
23562         0xaf9d8a8618c967b9L } },
23563     /* 53 */
23564     { { 0x79a041040a04143fL,0x03f7410fc700c616L,0xe8f2a3f291108ca6L,
23565         0xa26d67e8f5ac679aL },
23566       { 0xa15dbfebb83fbd9aL,0xf1aaebd23a0b5587L,0x639a97ddce0ead44L,
23567         0xf253b00c71d12ee0L } },
23568     /* 54 */
23569     { { 0x7baecf4c9e35e57cL,0x522e26a16786e3a5L,0x600b538b8af829a2L,
23570         0x19fa80b72c6de44aL },
23571       { 0xb52364f0aaf0ff52L,0x2e4bc21a6714587fL,0x401377a3c245967dL,
23572         0x65178766a23cf3ebL } },
23573     /* 55 */
23574     { { 0xc1c81838923ac000L,0x42021f02c4abc0eeL,0xcde3bc9a47132a20L,
23575         0x6f52a864c69f55fbL },
23576       { 0x0bdfd3e4df89ff6aL,0x244c943bc88bd74eL,0x649e0b532612998bL,
23577         0xce61ebc3d3413d4aL } },
23578     /* 56 */
23579     { { 0xe31629042cba5a90L,0xa72710aedb6c224eL,0x51831390d87e44dbL,
23580         0xa687dc9848fe2ef3L },
23581       { 0x857e985516a21ca9L,0xe3428d8ec9a7bc12L,0x16d3bcd012b044a2L,
23582         0xe6fa0c69e85f6704L } },
23583     /* 57 */
23584     { { 0xe4cca34b8fd42692L,0xc86d49a6e15f3acfL,0xbfe1f263a6b18392L,
23585         0x0664c933dcd266f6L },
23586       { 0x86738cf519399d88L,0x1cbcc8c3749ce6bcL,0x28171f7bc773b884L,
23587         0x306fc95701acf19eL } },
23588     /* 58 */
23589     { { 0x0da7a737afb6a419L,0x637fc26a195fbc40L,0x0fc8f8769c64e8e7L,
23590         0x2a68579b208c0626L },
23591       { 0x82e823108628abc3L,0xe4e09313ab23ae94L,0x66bf9adbe5155cf1L,
23592         0x17909f6ce8a2dd0cL } },
23593     /* 59 */
23594     { { 0x767c359643d7ad31L,0x7ba3a1aa49ccef62L,0x5261c3160242bf5aL,
23595         0x85f452199eb82dfbL },
23596       { 0x554cb38237b42e47L,0xc9771ec14cf66133L,0xde70617a153905a3L,
23597         0x2cab26fcbc61316dL } },
23598     /* 60 */
23599     { { 0x7dababbd75c10315L,0x9a8fbe88a48df64eL,0x2b076fe5e1b8f912L,
23600         0x1a530ce9ccbd50dcL },
23601       { 0x47361ab76647d225L,0xf84e73be4d636a15L,0xd58fcaaf5904a2faL,
23602         0x73747d4b38523a19L } },
23603     /* 61 */
23604     { { 0x6e6b0fb8b6864cc0L,0x5d8a0027ab3b623cL,0x5e6665389a1cfc9cL,
23605         0x816b19de521e4ff3L },
23606       { 0x56709ad00bc447f8L,0x1d46cb1c8f1464d7L,0x49cef820a949873dL,
23607         0x02804692d9d3e65fL } },
23608     /* 62 */
23609     { { 0x1ae0ea28ad8b5976L,0x4e9ad48e869458fbL,0xe9437ec996cfedf8L,
23610         0xa4f924a22afa74d9L },
23611       { 0xcb5b1845aaf797c0L,0xe5d6dd0eba6f557fL,0xa1496fe691dc2e7cL,
23612         0xad31edac8c179fc7L } },
23613     /* 63 */
23614     { { 0xf9c5e9de44b06ed7L,0x6ce7c4f74a597159L,0xd02ec441833accb5L,
23615         0xf30205996296e8fcL },
23616       { 0x7df6c5c6c2afbe06L,0xff429dda9c849b09L,0x42170166f5dd78d6L,
23617         0x2403ea21830c388bL } },
23618 };
23619 
23620 /* Multiply the base point of P256 by the scalar and return the result.
23621  * If map is true then convert result to affine coordinates.
23622  *
23623  * Stripe implementation.
23624  * Pre-generated: 2^0, 2^42, ...
23625  * Pre-generated: products of all combinations of above.
23626  * 6 doubles and adds (with qz=1)
23627  *
23628  * r     Resulting point.
23629  * k     Scalar to multiply by.
23630  * map   Indicates whether to convert result to affine.
23631  * ct    Constant time required.
23632  * heap  Heap to use for allocation.
23633  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
23634  */
sp_256_ecc_mulmod_base_4(sp_point_256 * r,const sp_digit * k,int map,int ct,void * heap)23635 static int sp_256_ecc_mulmod_base_4(sp_point_256* r, const sp_digit* k,
23636         int map, int ct, void* heap)
23637 {
23638     return sp_256_ecc_mulmod_stripe_4(r, &p256_base, p256_table,
23639                                       k, map, ct, heap);
23640 }
23641 
23642 #else
23643 /* Striping precomputation table.
23644  * 8 points combined into a table of 256 points.
23645  * Distance of 32 between points.
23646  */
23647 static const sp_table_entry_256 p256_table[256] = {
23648     /* 0 */
23649     { { 0x00, 0x00, 0x00, 0x00 },
23650       { 0x00, 0x00, 0x00, 0x00 } },
23651     /* 1 */
23652     { { 0x79e730d418a9143cL,0x75ba95fc5fedb601L,0x79fb732b77622510L,
23653         0x18905f76a53755c6L },
23654       { 0xddf25357ce95560aL,0x8b4ab8e4ba19e45cL,0xd2e88688dd21f325L,
23655         0x8571ff1825885d85L } },
23656     /* 2 */
23657     { { 0x202886024147519aL,0xd0981eac26b372f0L,0xa9d4a7caa785ebc8L,
23658         0xd953c50ddbdf58e9L },
23659       { 0x9d6361ccfd590f8fL,0x72e9626b44e6c917L,0x7fd9611022eb64cfL,
23660         0x863ebb7e9eb288f3L } },
23661     /* 3 */
23662     { { 0x7856b6235cdb6485L,0x808f0ea22f0a2f97L,0x3e68d9544f7e300bL,
23663         0x00076055b5ff80a0L },
23664       { 0x7634eb9b838d2010L,0x54014fbb3243708aL,0xe0e47d39842a6606L,
23665         0x8308776134373ee0L } },
23666     /* 4 */
23667     { { 0x4f922fc516a0d2bbL,0x0d5cc16c1a623499L,0x9241cf3a57c62c8bL,
23668         0x2f5e6961fd1b667fL },
23669       { 0x5c15c70bf5a01797L,0x3d20b44d60956192L,0x04911b37071fdb52L,
23670         0xf648f9168d6f0f7bL } },
23671     /* 5 */
23672     { { 0x9e566847e137bbbcL,0xe434469e8a6a0becL,0xb1c4276179d73463L,
23673         0x5abe0285133d0015L },
23674       { 0x92aa837cc04c7dabL,0x573d9f4c43260c07L,0x0c93156278e6cc37L,
23675         0x94bb725b6b6f7383L } },
23676     /* 6 */
23677     { { 0xbbf9b48f720f141cL,0x6199b3cd2df5bc74L,0xdc3f6129411045c4L,
23678         0xcdd6bbcb2f7dc4efL },
23679       { 0xcca6700beaf436fdL,0x6f647f6db99326beL,0x0c0fa792014f2522L,
23680         0xa361bebd4bdae5f6L } },
23681     /* 7 */
23682     { { 0x28aa2558597c13c7L,0xc38d635f50b7c3e1L,0x07039aecf3c09d1dL,
23683         0xba12ca09c4b5292cL },
23684       { 0x9e408fa459f91dfdL,0x3af43b66ceea07fbL,0x1eceb0899d780b29L,
23685         0x53ebb99d701fef4bL } },
23686     /* 8 */
23687     { { 0x4fe7ee31b0e63d34L,0xf4600572a9e54fabL,0xc0493334d5e7b5a4L,
23688         0x8589fb9206d54831L },
23689       { 0xaa70f5cc6583553aL,0x0879094ae25649e5L,0xcc90450710044652L,
23690         0xebb0696d02541c4fL } },
23691     /* 9 */
23692     { { 0x4616ca15ac1647c5L,0xb8127d47c4cf5799L,0xdc666aa3764dfbacL,
23693         0xeb2820cbd1b27da3L },
23694       { 0x9406f8d86a87e008L,0xd87dfa9d922378f3L,0x56ed2e4280ccecb2L,
23695         0x1f28289b55a7da1dL } },
23696     /* 10 */
23697     { { 0xabbaa0c03b89da99L,0xa6f2d79eb8284022L,0x27847862b81c05e8L,
23698         0x337a4b5905e54d63L },
23699       { 0x3c67500d21f7794aL,0x207005b77d6d7f61L,0x0a5a378104cfd6e8L,
23700         0x0d65e0d5f4c2fbd6L } },
23701     /* 11 */
23702     { { 0xd9d09bbeb5275d38L,0x4268a7450be0a358L,0xf0762ff4973eb265L,
23703         0xc23da24252f4a232L },
23704       { 0x5da1b84f0b94520cL,0x09666763b05bd78eL,0x3a4dcb8694d29ea1L,
23705         0x19de3b8cc790cff1L } },
23706     /* 12 */
23707     { { 0x183a716c26c5fe04L,0x3b28de0b3bba1bdbL,0x7432c586a4cb712cL,
23708         0xe34dcbd491fccbfdL },
23709       { 0xb408d46baaa58403L,0x9a69748682e97a53L,0x9e39012736aaa8afL,
23710         0xe7641f447b4e0f7fL } },
23711     /* 13 */
23712     { { 0x7d753941df64ba59L,0xd33f10ec0b0242fcL,0x4f06dfc6a1581859L,
23713         0x4a12df57052a57bfL },
23714       { 0xbfa6338f9439dbd0L,0xd3c24bd4bde53e1fL,0xfd5e4ffa21f1b314L,
23715         0x6af5aa93bb5bea46L } },
23716     /* 14 */
23717     { { 0xda10b69910c91999L,0x0a24b4402a580491L,0x3e0094b4b8cc2090L,
23718         0x5fe3475a66a44013L },
23719       { 0xb0f8cabdf93e7b4bL,0x292b501a7c23f91aL,0x42e889aecd1e6263L,
23720         0xb544e308ecfea916L } },
23721     /* 15 */
23722     { { 0x6478c6e916ddfdceL,0x2c329166f89179e6L,0x4e8d6e764d4e67e1L,
23723         0xe0b6b2bda6b0c20bL },
23724       { 0x0d312df2bb7efb57L,0x1aac0dde790c4007L,0xf90336ad679bc944L,
23725         0x71c023de25a63774L } },
23726     /* 16 */
23727     { { 0x62a8c244bfe20925L,0x91c19ac38fdce867L,0x5a96a5d5dd387063L,
23728         0x61d587d421d324f6L },
23729       { 0xe87673a2a37173eaL,0x2384800853778b65L,0x10f8441e05bab43eL,
23730         0xfa11fe124621efbeL } },
23731     /* 17 */
23732     { { 0x1c891f2b2cb19ffdL,0x01ba8d5bb1923c23L,0xb6d03d678ac5ca8eL,
23733         0x586eb04c1f13bedcL },
23734       { 0x0c35c6e527e8ed09L,0x1e81a33c1819ede2L,0x278fd6c056c652faL,
23735         0x19d5ac0870864f11L } },
23736     /* 18 */
23737     { { 0x1e99f581309a4e1fL,0xab7de71be9270074L,0x26a5ef0befd28d20L,
23738         0xe7c0073f7f9c563fL },
23739       { 0x1f6d663a0ef59f76L,0x669b3b5420fcb050L,0xc08c1f7a7a6602d4L,
23740         0xe08504fec65b3c0aL } },
23741     /* 19 */
23742     { { 0xf098f68da031b3caL,0x6d1cab9ee6da6d66L,0x5bfd81fa94f246e8L,
23743         0x78f018825b0996b4L },
23744       { 0xb7eefde43a25787fL,0x8016f80d1dccac9bL,0x0cea4877b35bfc36L,
23745         0x43a773b87e94747aL } },
23746     /* 20 */
23747     { { 0x62577734d2b533d5L,0x673b8af6a1bdddc0L,0x577e7c9aa79ec293L,
23748         0xbb6de651c3b266b1L },
23749       { 0xe7e9303ab65259b3L,0xd6a0afd3d03a7480L,0xc5ac83d19b3cfc27L,
23750         0x60b4619a5d18b99bL } },
23751     /* 21 */
23752     { { 0xbd6a38e11ae5aa1cL,0xb8b7652b49e73658L,0x0b130014ee5f87edL,
23753         0x9d0f27b2aeebffcdL },
23754       { 0xca9246317a730a55L,0x9c955b2fddbbc83aL,0x07c1dfe0ac019a71L,
23755         0x244a566d356ec48dL } },
23756     /* 22 */
23757     { { 0x6db0394aeacf1f96L,0x9f2122a9024c271cL,0x2626ac1b82cbd3b9L,
23758         0x45e58c873581ef69L },
23759       { 0xd3ff479da38f9dbcL,0xa8aaf146e888a040L,0x945adfb246e0bed7L,
23760         0xc040e21cc1e4b7a4L } },
23761     /* 23 */
23762     { { 0x847af0006f8117b6L,0x651969ff73a35433L,0x482b35761d9475ebL,
23763         0x1cdf5c97682c6ec7L },
23764       { 0x7db775b411f04839L,0x7dbeacf448de1698L,0xb2921dd1b70b3219L,
23765         0x046755f8a92dff3dL } },
23766     /* 24 */
23767     { { 0xcc8ac5d2bce8ffcdL,0x0d53c48b2fe61a82L,0xf6f161727202d6c7L,
23768         0x046e5e113b83a5f3L },
23769       { 0xe7b8ff64d8007f01L,0x7fb1ef125af43183L,0x045c5ea635e1a03cL,
23770         0x6e0106c3303d005bL } },
23771     /* 25 */
23772     { { 0x48c7358488dd73b1L,0x7670708f995ed0d9L,0x38385ea8c56a2ab7L,
23773         0x442594ede901cf1fL },
23774       { 0xf8faa2c912d4b65bL,0x94c2343b96c90c37L,0xd326e4a15e978d1fL,
23775         0xa796fa514c2ee68eL } },
23776     /* 26 */
23777     { { 0x359fb604823addd7L,0x9e2a6183e56693b3L,0xf885b78e3cbf3c80L,
23778         0xe4ad2da9c69766e9L },
23779       { 0x357f7f428e048a61L,0x082d198cc092d9a0L,0xfc3a1af4c03ed8efL,
23780         0xc5e94046c37b5143L } },
23781     /* 27 */
23782     { { 0x476a538c2be75f9eL,0x6fd1a9e8cb123a78L,0xd85e4df0b109c04bL,
23783         0x63283dafdb464747L },
23784       { 0xce728cf7baf2df15L,0xe592c4550ad9a7f4L,0xfab226ade834bcc3L,
23785         0x68bd19ab1981a938L } },
23786     /* 28 */
23787     { { 0xc08ead511887d659L,0x3374d5f4b359305aL,0x96986981cfe74fe3L,
23788         0x495292f53c6fdfd6L },
23789       { 0x4a878c9e1acec896L,0xd964b210ec5b4484L,0x6696f7e2664d60a7L,
23790         0x0ec7530d26036837L } },
23791     /* 29 */
23792     { { 0x2da13a05ad2687bbL,0xa1f83b6af32e21faL,0x390f5ef51dd4607bL,
23793         0x0f6207a664863f0bL },
23794       { 0xbd67e3bb0f138233L,0xdd66b96c272aa718L,0x8ed0040726ec88aeL,
23795         0xff0db07208ed6dcfL } },
23796     /* 30 */
23797     { { 0x749fa1014c95d553L,0xa44052fd5d680a8aL,0x183b4317ff3b566fL,
23798         0x313b513c88740ea3L },
23799       { 0xb402e2ac08d11549L,0x071ee10bb4dee21cL,0x26b987dd47f2320eL,
23800         0x2d3abcf986f19f81L } },
23801     /* 31 */
23802     { { 0x4c288501815581a2L,0x9a0a6d56632211afL,0x19ba7a0f0cab2e99L,
23803         0xc036fa10ded98cdfL },
23804       { 0x29ae08bac1fbd009L,0x0b68b19006d15816L,0xc2eb32779b9e0d8fL,
23805         0xa6b2a2c4b6d40194L } },
23806     /* 32 */
23807     { { 0xd433e50f6d3549cfL,0x6f33696ffacd665eL,0x695bfdacce11fcb4L,
23808         0x810ee252af7c9860L },
23809       { 0x65450fe17159bb2cL,0xf7dfbebe758b357bL,0x2b057e74d69fea72L,
23810         0xd485717a92731745L } },
23811     /* 33 */
23812     { { 0x11741a8af0cb5a98L,0xd3da8f931f3110bfL,0x1994e2cbab382adfL,
23813         0x6a6045a72f9a604eL },
23814       { 0x170c0d3fa2b2411dL,0xbe0eb83e510e96e0L,0x3bcc9f738865b3ccL,
23815         0xd3e45cfaf9e15790L } },
23816     /* 34 */
23817     { { 0xce1f69bbe83f7669L,0x09f8ae8272877d6bL,0x9548ae543244278dL,
23818         0x207755dee3c2c19cL },
23819       { 0x87bd61d96fef1945L,0x18813cefb12d28c3L,0x9fbcd1d672df64aaL,
23820         0x48dc5ee57154b00dL } },
23821     /* 35 */
23822     { { 0x123790bff7e5a199L,0xe0efb8cf989ccbb7L,0xc27a2bfe0a519c79L,
23823         0xf2fb0aeddff6f445L },
23824       { 0x41c09575f0b5025fL,0x550543d740fa9f22L,0x8fa3c8ad380bfbd0L,
23825         0xa13e9015db28d525L } },
23826     /* 36 */
23827     { { 0xf9f7a350a2b65cbcL,0x0b04b9722a464226L,0x265ce241e23f07a1L,
23828         0x2bf0d6b01497526fL },
23829       { 0xd3d4dd3f4b216fb7L,0xf7d7b867fbdda26aL,0xaeb7b83f6708505cL,
23830         0x42a94a5a162fe89fL } },
23831     /* 37 */
23832     { { 0x5846ad0beaadf191L,0x0f8a489025a268d7L,0xe8603050494dc1f6L,
23833         0x2c2dd969c65ede3dL },
23834       { 0x6d02171d93849c17L,0x460488ba1da250ddL,0x4810c7063c3a5485L,
23835         0xf437fa1f42c56dbcL } },
23836     /* 38 */
23837     { { 0x6aa0d7144a0f7dabL,0x0f0497931776e9acL,0x52c0a050f5f39786L,
23838         0xaaf45b3354707aa8L },
23839       { 0x85e37c33c18d364aL,0xd40b9b063e497165L,0xf417168115ec5444L,
23840         0xcdf6310df4f272bcL } },
23841     /* 39 */
23842     { { 0x7473c6238ea8b7efL,0x08e9351885bc2287L,0x419567722bda8e34L,
23843         0xf0d008bada9e2ff2L },
23844       { 0x2912671d2414d3b1L,0xb3754985b019ea76L,0x5c61b96d453bcbdbL,
23845         0x5bd5c2f5ca887b8bL } },
23846     /* 40 */
23847     { { 0xef0f469ef49a3154L,0x3e85a5956e2b2e9aL,0x45aaec1eaa924a9cL,
23848         0xaa12dfc8a09e4719L },
23849       { 0x26f272274df69f1dL,0xe0e4c82ca2ff5e73L,0xb9d8ce73b7a9dd44L,
23850         0x6c036e73e48ca901L } },
23851     /* 41 */
23852     { { 0x5cfae12a0f6e3138L,0x6966ef0025ad345aL,0x8993c64b45672bc5L,
23853         0x292ff65896afbe24L },
23854       { 0xd5250d445e213402L,0xf6580e274392c9feL,0x097b397fda1c72e8L,
23855         0x644e0c90311b7276L } },
23856     /* 42 */
23857     { { 0xe1e421e1a47153f0L,0xb86c3b79920418c9L,0x93bdce87705d7672L,
23858         0xf25ae793cab79a77L },
23859       { 0x1f3194a36d869d0cL,0x9d55c8824986c264L,0x49fb5ea3096e945eL,
23860         0x39b8e65313db0a3eL } },
23861     /* 43 */
23862     { { 0x37754200b6fd2e59L,0x35e2c0669255c98fL,0xd9dab21a0e2a5739L,
23863         0x39122f2f0f19db06L },
23864       { 0xcfbce1e003cad53cL,0x225b2c0fe65c17e3L,0x72baf1d29aa13877L,
23865         0x8de80af8ce80ff8dL } },
23866     /* 44 */
23867     { { 0xafbea8d9207bbb76L,0x921c7e7c21782758L,0xdfa2b74b1c0436b1L,
23868         0x871949062e368c04L },
23869       { 0xb5f928bba3993df5L,0x639d75b5f3b3d26aL,0x011aa78a85b55050L,
23870         0xfc315e6a5b74fde1L } },
23871     /* 45 */
23872     { { 0x561fd41ae8d6ecfaL,0x5f8c44f61aec7f86L,0x98452a7b4924741dL,
23873         0xe6d4a7adee389088L },
23874       { 0x60552ed14593c75dL,0x70a70da4dd271162L,0xd2aede937ba2c7dbL,
23875         0x35dfaf9a9be2ae57L } },
23876     /* 46 */
23877     { { 0x6b956fcdaa736636L,0x09f51d97ae2cab7eL,0xfb10bf410f349966L,
23878         0x1da5c7d71c830d2bL },
23879       { 0x5c41e4833cce6825L,0x15ad118ff9573c3bL,0xa28552c7f23036b8L,
23880         0x7077c0fddbf4b9d6L } },
23881     /* 47 */
23882     { { 0xbf63ff8d46b9661cL,0xa1dfd36b0d2cfd71L,0x0373e140a847f8f7L,
23883         0x53a8632ee50efe44L },
23884       { 0x0976ff68696d8051L,0xdaec0c95c74f468aL,0x62994dc35e4e26bdL,
23885         0x028ca76d34e1fcc1L } },
23886     /* 48 */
23887     { { 0xd11d47dcfc9877eeL,0xc8b36210801d0002L,0xd002c11754c260b6L,
23888         0x04c17cd86962f046L },
23889       { 0x6d9bd094b0daddf5L,0xbea2357524ce55c0L,0x663356e672da03b5L,
23890         0xf7ba4de9fed97474L } },
23891     /* 49 */
23892     { { 0xd0dbfa34ebe1263fL,0x5576373571ae7ce6L,0xd244055382a6f523L,
23893         0xe31f960052131c41L },
23894       { 0xd1bb9216ea6b6ec6L,0x37a1d12e73c2fc44L,0xc10e7eac89d0a294L,
23895         0xaa3a6259ce34d47bL } },
23896     /* 50 */
23897     { { 0xfbcf9df536f3dcd3L,0x6ceded50d2bf7360L,0x491710fadf504f5bL,
23898         0x2398dd627e79daeeL },
23899       { 0xcf4705a36d09569eL,0xea0619bb5149f769L,0xff9c037735f6034cL,
23900         0x5717f5b21c046210L } },
23901     /* 51 */
23902     { { 0x9fe229c921dd895eL,0x8e51850040c28451L,0xfa13d2391d637ecdL,
23903         0x660a2c560e3c28deL },
23904       { 0x9cca88aed67fcbd0L,0xc84724780ea9f096L,0x32b2f48172e92b4dL,
23905         0x624ee54c4f522453L } },
23906     /* 52 */
23907     { { 0x09549ce4d897ecccL,0x4d49d1d93f9880aaL,0x723c2423043a7c20L,
23908         0x4f392afb92bdfbc0L },
23909       { 0x6969f8fa7de44fd9L,0xb66cfbe457b32156L,0xdb2fa803368ebc3cL,
23910         0x8a3e7977ccdb399cL } },
23911     /* 53 */
23912     { { 0xdde1881f06c4b125L,0xae34e300f6e3ca8cL,0xef6999de5c7a13e9L,
23913         0x3888d02370c24404L },
23914       { 0x7628035644f91081L,0x3d9fcf615f015504L,0x1827edc8632cd36eL,
23915         0xa5e62e4718102336L } },
23916     /* 54 */
23917     { { 0x1a825ee32facd6c8L,0x699c635454bcbc66L,0x0ce3edf798df9931L,
23918         0x2c4768e6466a5adcL },
23919       { 0xb346ff8c90a64bc9L,0x630a6020e4779f5cL,0xd949d064bc05e884L,
23920         0x7b5e6441f9e652a0L } },
23921     /* 55 */
23922     { { 0x2169422c1d28444aL,0xe996c5d8be136a39L,0x2387afe5fb0c7fceL,
23923         0xb8af73cb0c8d744aL },
23924       { 0x5fde83aa338b86fdL,0xfee3f158a58a5cffL,0xc9ee8f6f20ac9433L,
23925         0xa036395f7f3f0895L } },
23926     /* 56 */
23927     { { 0x8c73c6bba10f7770L,0xa6f16d81a12a0e24L,0x100df68251bc2b9fL,
23928         0x4be36b01875fb533L },
23929       { 0x9226086e9fb56dbbL,0x306fef8b07e7a4f8L,0xeeaccc0566d52f20L,
23930         0x8cbc9a871bdc00c0L } },
23931     /* 57 */
23932     { { 0xe131895cc0dac4abL,0xa874a440712ff112L,0x6332ae7c6a1cee57L,
23933         0x44e7553e0c0835f8L },
23934       { 0x6d503fff7734002dL,0x9d35cb8b0b34425cL,0x95f702760e8738b5L,
23935         0x470a683a5eb8fc18L } },
23936     /* 58 */
23937     { { 0x81b761dc90513482L,0x0287202a01e9276aL,0xcda441ee0ce73083L,
23938         0x16410690c63dc6efL },
23939       { 0xf5034a066d06a2edL,0xdd4d7745189b100bL,0xd914ae72ab8218c9L,
23940         0xd73479fd7abcbb4fL } },
23941     /* 59 */
23942     { { 0x7edefb165ad4c6e5L,0x262cf08f5b06d04dL,0x12ed5bb18575cb14L,
23943         0x816469e30771666bL },
23944       { 0xd7ab9d79561e291eL,0xeb9daf22c1de1661L,0xf49827eb135e0513L,
23945         0x0a36dd23f0dd3f9cL } },
23946     /* 60 */
23947     { { 0x098d32c741d5533cL,0x7c5f5a9e8684628fL,0x39a228ade349bd11L,
23948         0xe331dfd6fdbab118L },
23949       { 0x5100ab686bcc6ed8L,0x7160c3bdef7a260eL,0x9063d9a7bce850d7L,
23950         0xd3b4782a492e3389L } },
23951     /* 61 */
23952     { { 0xa149b6e8f3821f90L,0x92edd9ed66eb7aadL,0x0bb669531a013116L,
23953         0x7281275a4c86a5bdL },
23954       { 0x503858f7d3ff47e5L,0x5e1616bc61016441L,0x62b0f11a7dfd9bb1L,
23955         0x2c062e7ece145059L } },
23956     /* 62 */
23957     { { 0xa76f996f0159ac2eL,0x281e7736cbdb2713L,0x2ad6d28808e46047L,
23958         0x282a35f92c4e7ef1L },
23959       { 0x9c354b1ec0ce5cd2L,0xcf99efc91379c229L,0x992caf383e82c11eL,
23960         0xc71cd513554d2abdL } },
23961     /* 63 */
23962     { { 0x4885de9c09b578f4L,0x1884e258e3affa7aL,0x8f76b1b759182f1fL,
23963         0xc50f6740cf47f3a3L },
23964       { 0xa9c4adf3374b68eaL,0xa406f32369965fe2L,0x2f86a22285a53050L,
23965         0xb9ecb3a7212958dcL } },
23966     /* 64 */
23967     { { 0x56f8410ef4f8b16aL,0x97241afec47b266aL,0x0a406b8e6d9c87c1L,
23968         0x803f3e02cd42ab1bL },
23969       { 0x7f0309a804dbec69L,0xa83b85f73bbad05fL,0xc6097273ad8e197fL,
23970         0xc097440e5067adc1L } },
23971     /* 65 */
23972     { { 0x846a56f2c379ab34L,0xa8ee068b841df8d1L,0x20314459176c68efL,
23973         0xf1af32d5915f1f30L },
23974       { 0x99c375315d75bd50L,0x837cffbaf72f67bcL,0x0613a41848d7723fL,
23975         0x23d0f130e2d41c8bL } },
23976     /* 66 */
23977     { { 0x857ab6edf41500d9L,0x0d890ae5fcbeada8L,0x52fe864889725951L,
23978         0xb0288dd6c0a3faddL },
23979       { 0x85320f30650bcb08L,0x71af6313695d6e16L,0x31f520a7b989aa76L,
23980         0xffd3724ff408c8d2L } },
23981     /* 67 */
23982     { { 0x53968e64b458e6cbL,0x992dad20317a5d28L,0x3814ae0b7aa75f56L,
23983         0xf5590f4ad78c26dfL },
23984       { 0x0fc24bd3cf0ba55aL,0x0fc4724a0c778baeL,0x1ce9864f683b674aL,
23985         0x18d6da54f6f74a20L } },
23986     /* 68 */
23987     { { 0xed93e225d5be5a2bL,0x6fe799835934f3c6L,0x4314092622626ffcL,
23988         0x50bbb4d97990216aL },
23989       { 0x378191c6e57ec63eL,0x65422c40181dcdb2L,0x41a8099b0236e0f6L,
23990         0x2b10011801fe49c3L } },
23991     /* 69 */
23992     { { 0xfc68b5c59b391593L,0xc385f5a2598270fcL,0x7144f3aad19adcbbL,
23993         0xdd55899983fbae0cL },
23994       { 0x93b88b8e74b82ff4L,0xd2e03c4071e734c9L,0x9a7a9eaf43c0322aL,
23995         0xe6e4c551149d6041L } },
23996     /* 70 */
23997     { { 0x55f655bb1e9af288L,0x647e1a64f7ada931L,0x43697e4bcb2820e5L,
23998         0x51e00db107ed56ffL },
23999       { 0x43d169b8771c327eL,0x29cdb20b4a96c2adL,0xc07d51f53deb4779L,
24000         0xe22f424149829177L } },
24001     /* 71 */
24002     { { 0xcd45e8f4635f1abbL,0x7edc0cb568538874L,0xc9472c1fb5a8034dL,
24003         0xf709373d52dc48c9L },
24004       { 0x401966bba8af30d6L,0x95bf5f4af137b69cL,0x3966162a9361c47eL,
24005         0xbd52d288e7275b11L } },
24006     /* 72 */
24007     { { 0xab155c7a9c5fa877L,0x17dad6727d3a3d48L,0x43f43f9e73d189d8L,
24008         0xa0d0f8e4c8aa77a6L },
24009       { 0x0bbeafd8cc94f92dL,0xd818c8be0c4ddb3aL,0x22cc65f8b82eba14L,
24010         0xa56c78c7946d6a00L } },
24011     /* 73 */
24012     { { 0x2962391b0dd09529L,0x803e0ea63daddfcfL,0x2c77351f5b5bf481L,
24013         0xd8befdf8731a367aL },
24014       { 0xab919d42fc0157f4L,0xf51caed7fec8e650L,0xcdf9cb4002d48b0aL,
24015         0x854a68a5ce9f6478L } },
24016     /* 74 */
24017     { { 0xdc35f67b63506ea5L,0x9286c489a4fe0d66L,0x3f101d3bfe95cd4dL,
24018         0x5cacea0b98846a95L },
24019       { 0xa90df60c9ceac44dL,0x3db29af4354d1c3aL,0x08dd3de8ad5dbabeL,
24020         0xe4982d1235e4efa9L } },
24021     /* 75 */
24022     { { 0x23104a22c34cd55eL,0x58695bb32680d132L,0xfb345afa1fa1d943L,
24023         0x8046b7f616b20499L },
24024       { 0xb533581e38e7d098L,0xd7f61e8df46f0b70L,0x30dea9ea44cb78c4L,
24025         0xeb17ca7b9082af55L } },
24026     /* 76 */
24027     { { 0x1751b59876a145b9L,0xa5cf6b0fc1bc71ecL,0xd3e03565392715bbL,
24028         0x097b00bafab5e131L },
24029       { 0xaa66c8e9565f69e1L,0x77e8f75ab5be5199L,0x6033ba11da4fd984L,
24030         0xf95c747bafdbcc9eL } },
24031     /* 77 */
24032     { { 0x558f01d3bebae45eL,0xa8ebe9f0c4bc6955L,0xaeb705b1dbc64fc6L,
24033         0x3512601e566ed837L },
24034       { 0x9336f1e1fa1161cdL,0x328ab8d54c65ef87L,0x4757eee2724f21e5L,
24035         0x0ef971236068ab6bL } },
24036     /* 78 */
24037     { { 0x02598cf754ca4226L,0x5eede138f8642c8eL,0x48963f74468e1790L,
24038         0xfc16d9333b4fbc95L },
24039       { 0xbe96fb31e7c800caL,0x138063312678adaaL,0x3d6244976ff3e8b5L,
24040         0x14ca4af1b95d7a17L } },
24041     /* 79 */
24042     { { 0x7a4771babd2f81d5L,0x1a5f9d6901f7d196L,0xd898bef7cad9c907L,
24043         0x4057b063f59c231dL },
24044       { 0xbffd82fe89c05c0aL,0xe4911c6f1dc0df85L,0x3befccaea35a16dbL,
24045         0x1c3b5d64f1330b13L } },
24046     /* 80 */
24047     { { 0x5fe14bfe80ec21feL,0xf6ce116ac255be82L,0x98bc5a072f4a5d67L,
24048         0xfad27148db7e63afL },
24049       { 0x90c0b6ac29ab05b3L,0x37a9a83c4e251ae6L,0x0a7dc875c2aade7dL,
24050         0x77387de39f0e1a84L } },
24051     /* 81 */
24052     { { 0x1e9ecc49a56c0dd7L,0xa5cffcd846086c74L,0x8f7a1408f505aeceL,
24053         0xb37b85c0bef0c47eL },
24054       { 0x3596b6e4cc0e6a8fL,0xfd6d4bbf6b388f23L,0xaba453fac39cef4eL,
24055         0x9c135ac8f9f628d5L } },
24056     /* 82 */
24057     { { 0x32aa320284e35743L,0x320d6ab185a3cdefL,0xb821b1761df19819L,
24058         0x5721361fc433851fL },
24059       { 0x1f0db36a71fc9168L,0x5f98ba735e5c403cL,0xf64ca87e37bcd8f5L,
24060         0xdcbac3c9e6bb11bdL } },
24061     /* 83 */
24062     { { 0xf01d99684518cbe2L,0xd242fc189c9eb04eL,0x727663c7e47feebfL,
24063         0xb8c1c89e2d626862L },
24064       { 0x51a58bddc8e1d569L,0x563809c8b7d88cd0L,0x26c27fd9f11f31ebL,
24065         0x5d23bbda2f9422d4L } },
24066     /* 84 */
24067     { { 0x0a1c729495c8f8beL,0x2961c4803bf362bfL,0x9e418403df63d4acL,
24068         0xc109f9cb91ece900L },
24069       { 0xc2d095d058945705L,0xb9083d96ddeb85c0L,0x84692b8d7a40449bL,
24070         0x9bc3344f2eee1ee1L } },
24071     /* 85 */
24072     { { 0x0d5ae35642913074L,0x55491b2748a542b1L,0x469ca665b310732aL,
24073         0x29591d525f1a4cc1L },
24074       { 0xe76f5b6bb84f983fL,0xbe7eef419f5f84e1L,0x1200d49680baa189L,
24075         0x6376551f18ef332cL } },
24076     /* 86 */
24077     { { 0xbda5f14e562976ccL,0x22bca3e60ef12c38L,0xbbfa30646cca9852L,
24078         0xbdb79dc808e2987aL },
24079       { 0xfd2cb5c9cb06a772L,0x38f475aafe536dceL,0xc2a3e0227c2b5db8L,
24080         0x8ee86001add3c14aL } },
24081     /* 87 */
24082     { { 0xcbe96981a4ade873L,0x7ee9aa4dc4fba48cL,0x2cee28995a054ba5L,
24083         0x92e51d7a6f77aa4bL },
24084       { 0x948bafa87190a34dL,0xd698f75bf6bd1ed1L,0xd00ee6e30caf1144L,
24085         0x5182f86f0a56aaaaL } },
24086     /* 88 */
24087     { { 0xfba6212c7a4cc99cL,0xff609b683e6d9ca1L,0x5dbb27cb5ac98c5aL,
24088         0x91dcab5d4073a6f2L },
24089       { 0x01b6cc3d5f575a70L,0x0cb361396f8d87faL,0x165d4e8c89981736L,
24090         0x17a0cedb97974f2bL } },
24091     /* 89 */
24092     { { 0x38861e2a076c8d3aL,0x701aad39210f924bL,0x94d0eae413a835d9L,
24093         0x2e8ce36c7f4cdf41L },
24094       { 0x91273dab037a862bL,0x01ba9bb760e4c8faL,0xf964538833baf2ddL,
24095         0xf4ccc6cb34f668f3L } },
24096     /* 90 */
24097     { { 0x44ef525cf1f79687L,0x7c59549592efa815L,0xe1231741a5c78d29L,
24098         0xac0db4889a0df3c9L },
24099       { 0x86bfc711df01747fL,0x592b9358ef17df13L,0xe5880e4f5ccb6bb5L,
24100         0x95a64a6194c974a2L } },
24101     /* 91 */
24102     { { 0x72c1efdac15a4c93L,0x40269b7382585141L,0x6a8dfb1c16cb0badL,
24103         0x231e54ba29210677L },
24104       { 0xa70df9178ae6d2dcL,0x4d6aa63f39112918L,0xf627726b5e5b7223L,
24105         0xab0be032d8a731e1L } },
24106     /* 92 */
24107     { { 0x097ad0e98d131f2dL,0x637f09e33b04f101L,0x1ac86196d5e9a748L,
24108         0xf1bcc8802cf6a679L },
24109       { 0x25c69140e8daacb4L,0x3c4e405560f65009L,0x591cc8fc477937a6L,
24110         0x851694695aebb271L } },
24111     /* 93 */
24112     { { 0xde35c143f1dcf593L,0x78202b29b018be3bL,0xe9cdadc29bdd9d3dL,
24113         0x8f67d9d2daad55d8L },
24114       { 0x841116567481ea5fL,0xe7d2dde9e34c590cL,0xffdd43f405053fa8L,
24115         0xf84572b9c0728b5dL } },
24116     /* 94 */
24117     { { 0x5e1a7a7197af71c9L,0xa14494447a736565L,0xa1b4ae070e1d5063L,
24118         0xedee2710616b2c19L },
24119       { 0xb2f034f511734121L,0x1cac6e554a25e9f0L,0x8dc148f3a40c2ecfL,
24120         0x9fd27e9b44ebd7f4L } },
24121     /* 95 */
24122     { { 0x3cc7658af6e2cb16L,0xe3eb7d2cfe5919b6L,0x5a8c5816168d5583L,
24123         0xa40c2fb6958ff387L },
24124       { 0x8c9ec560fedcc158L,0x7ad804c655f23056L,0xd93967049a307e12L,
24125         0x99bc9bb87dc6decfL } },
24126     /* 96 */
24127     { { 0x84a9521d927dafc6L,0x52c1fb695c09cd19L,0x9d9581a0f9366ddeL,
24128         0x9abe210ba16d7e64L },
24129       { 0x480af84a48915220L,0xfa73176a4dd816c6L,0xc7d539871681ca5aL,
24130         0x7881c25787f344b0L } },
24131     /* 97 */
24132     { { 0x93399b51e0bcf3ffL,0x0d02cbc5127f74f6L,0x8fb465a2dd01d968L,
24133         0x15e6e319a30e8940L },
24134       { 0x646d6e0d3e0e05f4L,0xfad7bddc43588404L,0xbe61c7d1c4f850d3L,
24135         0x0e55facf191172ceL } },
24136     /* 98 */
24137     { { 0x7e9d9806f8787564L,0x1a33172131e85ce6L,0x6b0158cab819e8d6L,
24138         0xd73d09766fe96577L },
24139       { 0x424834251eb7206eL,0xa519290fc618bb42L,0x5dcbb8595e30a520L,
24140         0x9250a3748f15a50bL } },
24141     /* 99 */
24142     { { 0xcaff08f8be577410L,0xfd408a035077a8c6L,0xf1f63289ec0a63a4L,
24143         0x77414082c1cc8c0bL },
24144       { 0x05a40fa6eb0991cdL,0xc1ca086649fdc296L,0x3a68a3c7b324fd40L,
24145         0x8cb04f4d12eb20b9L } },
24146     /* 100 */
24147     { { 0xb1c2d0556906171cL,0x9073e9cdb0240c3fL,0xdb8e6b4fd8906841L,
24148         0xe4e429ef47123b51L },
24149       { 0x0b8dd53c38ec36f4L,0xf9d2dc01ff4b6a27L,0x5d066e07879a9a48L,
24150         0x37bca2ff3c6e6552L } },
24151     /* 101 */
24152     { { 0x4cd2e3c7df562470L,0x44f272a2c0964ac9L,0x7c6d5df980c793beL,
24153         0x59913edc3002b22aL },
24154       { 0x7a139a835750592aL,0x99e01d80e783de02L,0xcf8c0375ea05d64fL,
24155         0x43786e4ab013e226L } },
24156     /* 102 */
24157     { { 0xff32b0ed9e56b5a6L,0x0750d9a6d9fc68f9L,0xec15e845597846a7L,
24158         0x8638ca98b7e79e7aL },
24159       { 0x2f5ae0960afc24b2L,0x05398eaf4dace8f2L,0x3b765dd0aecba78fL,
24160         0x1ecdd36a7b3aa6f0L } },
24161     /* 103 */
24162     { { 0x5d3acd626c5ff2f3L,0xa2d516c02873a978L,0xad94c9fad2110d54L,
24163         0xd85d0f85d459f32dL },
24164       { 0x9f700b8d10b11da3L,0xd2c22c30a78318c4L,0x556988f49208decdL,
24165         0xa04f19c3b4ed3c62L } },
24166     /* 104 */
24167     { { 0x087924c8ed7f93bdL,0xcb64ac5d392f51f6L,0x7cae330a821b71afL,
24168         0x92b2eeea5c0950b0L },
24169       { 0x85ac4c9485b6e235L,0xab2ca4a92936c0f0L,0x80faa6b3e0508891L,
24170         0x1ee782215834276cL } },
24171     /* 105 */
24172     { { 0xa60a2e00e63e79f7L,0xf590e7b2f399d906L,0x9021054a6607c09dL,
24173         0xf3f2ced857a6e150L },
24174       { 0x200510f3f10d9b55L,0x9d2fcfacd8642648L,0xe5631aa7e8bd0e7cL,
24175         0x0f56a4543da3e210L } },
24176     /* 106 */
24177     { { 0x5b21bffa1043e0dfL,0x6c74b6cc9c007e6dL,0x1a656ec0d4a8517aL,
24178         0xbd8f17411969e263L },
24179       { 0x8a9bbb86beb7494aL,0x1567d46f45f3b838L,0xdf7a12a7a4e5a79aL,
24180         0x2d1a1c3530ccfa09L } },
24181     /* 107 */
24182     { { 0x192e3813506508daL,0x336180c4a1d795a7L,0xcddb59497a9944b3L,
24183         0xa107a65eb91fba46L },
24184       { 0xe6d1d1c50f94d639L,0x8b4af3758a58b7d7L,0x1a7c5584bd37ca1cL,
24185         0x183d760af87a9af2L } },
24186     /* 108 */
24187     { { 0x29d697110dde59a4L,0xf1ad8d070e8bef87L,0x229b49634f2ebe78L,
24188         0x1d44179dc269d754L },
24189       { 0xb32dc0cf8390d30eL,0x0a3b27530de8110cL,0x31af1dc52bc0339aL,
24190         0x771f9cc29606d262L } },
24191     /* 109 */
24192     { { 0x99993e7785040739L,0x44539db98026a939L,0xcf40f6f2f5f8fc26L,
24193         0x64427a310362718eL },
24194       { 0x4f4f2d8785428aa8L,0x7b7adc3febfb49a8L,0x201b2c6df23d01acL,
24195         0x49d9b7496ae90d6dL } },
24196     /* 110 */
24197     { { 0xcc78d8bc435d1099L,0x2adbcd4e8e8d1a08L,0x02c2e2a02cb68a41L,
24198         0x9037d81b3f605445L },
24199       { 0x7cdbac27074c7b61L,0xfe2031ab57bfd72eL,0x61ccec96596d5352L,
24200         0x08c3de6a7cc0639cL } },
24201     /* 111 */
24202     { { 0x20fdd020f6d552abL,0x56baff9805cd81f1L,0x06fb7c3e91351291L,
24203         0xc690944245796b2fL },
24204       { 0x17b3ae9c41231bd1L,0x1eac6e875cc58205L,0x208837abf9d6a122L,
24205         0x3fa3db02cafe3ac0L } },
24206     /* 112 */
24207     { { 0xd75a3e6505058880L,0x7da365ef643943f2L,0x4147861cfab24925L,
24208         0xc5c4bdb0fdb808ffL },
24209       { 0x73513e34b272b56bL,0xc8327e9511b9043aL,0xfd8ce37df8844969L,
24210         0x2d56db9446c2b6b5L } },
24211     /* 113 */
24212     { { 0x2461782fff46ac6bL,0xd19f792607a2e425L,0xfafea3c409a48de1L,
24213         0x0f56bd9de503ba42L },
24214       { 0x137d4ed1345cda49L,0x821158fc816f299dL,0xe7c6a54aaeb43402L,
24215         0x4003bb9d1173b5f1L } },
24216     /* 114 */
24217     { { 0x3b8e8189a0803387L,0xece115f539cbd404L,0x4297208dd2877f21L,
24218         0x53765522a07f2f9eL },
24219       { 0xa4980a21a8a4182dL,0xa2bbd07a3219df79L,0x674d0a2e1a19a2d4L,
24220         0x7a056f586c5d4549L } },
24221     /* 115 */
24222     { { 0x646b25589d8a2a47L,0x5b582948c3df2773L,0x51ec000eabf0d539L,
24223         0x77d482f17a1a2675L },
24224       { 0xb8a1bd9587853948L,0xa6f817bd6cfbffeeL,0xab6ec05780681e47L,
24225         0x4115012b2b38b0e4L } },
24226     /* 116 */
24227     { { 0x3c73f0f46de28cedL,0x1d5da7609b13ec47L,0x61b8ce9e6e5c6392L,
24228         0xcdf04572fbea0946L },
24229       { 0x1cb3c58b6c53c3b0L,0x97fe3c10447b843cL,0xfb2b8ae12cb9780eL,
24230         0xee703dda97383109L } },
24231     /* 117 */
24232     { { 0x34515140ff57e43aL,0xd44660d3b1b811b8L,0x2b3b5dff8f42b986L,
24233         0x2a0ad89da162ce21L },
24234       { 0x64e4a6946bc277baL,0xc788c954c141c276L,0x141aa64ccabf6274L,
24235         0xd62d0b67ac2b4659L } },
24236     /* 118 */
24237     { { 0x39c5d87b2c054ac4L,0x57005859f27df788L,0xedf7cbf3b18128d6L,
24238         0xb39a23f2991c2426L },
24239       { 0x95284a15f0b16ae5L,0x0c6a05b1a136f51bL,0x1d63c137f2700783L,
24240         0x04ed0092c0674cc5L } },
24241     /* 119 */
24242     { { 0x1f4185d19ae90393L,0x3047b4294a3d64e6L,0xae0001a69854fc14L,
24243         0xa0a91fc10177c387L },
24244       { 0xff0a3f01ae2c831eL,0xbb76ae822b727e16L,0x8f12c8a15a3075b4L,
24245         0x084cf9889ed20c41L } },
24246     /* 120 */
24247     { { 0xd98509defca6becfL,0x2fceae807dffb328L,0x5d8a15c44778e8b9L,
24248         0xd57955b273abf77eL },
24249       { 0x210da79e31b5d4f1L,0xaa52f04b3cfa7a1cL,0xd4d12089dc27c20bL,
24250         0x8e14ea4202d141f1L } },
24251     /* 121 */
24252     { { 0xeed50345f2897042L,0x8d05331f43402c4aL,0xc8d9c194c8bdfb21L,
24253         0x597e1a372aa4d158L },
24254       { 0x0327ec1acf0bd68cL,0x6d4be0dcab024945L,0x5b9c8d7ac9fe3e84L,
24255         0xca3f0236199b4deaL } },
24256     /* 122 */
24257     { { 0x592a10b56170bd20L,0x0ea897f16d3f5de7L,0xa3363ff144b2ade2L,
24258         0xbde7fd7e309c07e4L },
24259       { 0x516bb6d2b8f5432cL,0x210dc1cbe043444bL,0x3db01e6ff8f95b5aL,
24260         0xb623ad0e0a7dd198L } },
24261     /* 123 */
24262     { { 0xa75bd67560c7b65bL,0xab8c559023a4a289L,0xf8220fd0d7b26795L,
24263         0xd6aa2e4658ec137bL },
24264       { 0x10abc00b5138bb85L,0x8c31d121d833a95cL,0xb24ff00b1702a32eL,
24265         0x111662e02dcc513aL } },
24266     /* 124 */
24267     { { 0x78114015efb42b87L,0xbd9f5d701b6c4dffL,0x66ecccd7a7d7c129L,
24268         0xdb3ee1cb94b750f8L },
24269       { 0xb26f3db0f34837cfL,0xe7eed18bb9578d4fL,0x5d2cdf937c56657dL,
24270         0x886a644252206a59L } },
24271     /* 125 */
24272     { { 0x3c234cfb65b569eaL,0x20011141f72119c1L,0x8badc85da15a619eL,
24273         0xa70cf4eb018a17bcL },
24274       { 0x224f97ae8c4a6a65L,0x36e5cf270134378fL,0xbe3a609e4f7e0960L,
24275         0xaa4772abd1747b77L } },
24276     /* 126 */
24277     { { 0x676761317aa60cc0L,0xc79163610368115fL,0xded98bb4bbc1bb5aL,
24278         0x611a6ddc30faf974L },
24279       { 0x30e78cbcc15ee47aL,0x2e8962824e0d96a5L,0x36f35adf3dd9ed88L,
24280         0x5cfffaf816429c88L } },
24281     /* 127 */
24282     { { 0xc0d54cff9b7a99cdL,0x7bf3b99d843c45a1L,0x038a908f62c739e1L,
24283         0x6e5a6b237dc1994cL },
24284       { 0xef8b454e0ba5db77L,0xb7b8807facf60d63L,0xe591c0c676608378L,
24285         0x481a238d242dabccL } },
24286     /* 128 */
24287     { { 0xe3417bc035d0b34aL,0x440b386b8327c0a7L,0x8fb7262dac0362d1L,
24288         0x2c41114ce0cdf943L },
24289       { 0x2ba5cef1ad95a0b1L,0xc09b37a867d54362L,0x26d6cdd201e486c9L,
24290         0x20477abf42ff9297L } },
24291     /* 129 */
24292     { { 0x2f75173c18d65dbfL,0x77bf940e339edad8L,0x7022d26bdcf1001cL,
24293         0xac66409ac77396b6L },
24294       { 0x8b0bb36fc6261cc3L,0x213f7bc9190e7e90L,0x6541cebaa45e6c10L,
24295         0xce8e6975cc122f85L } },
24296     /* 130 */
24297     { { 0x0f121b41bc0a67d2L,0x62d4760a444d248aL,0x0e044f1d659b4737L,
24298         0x08fde365250bb4a8L },
24299       { 0xaceec3da848bf287L,0xc2a62182d3369d6eL,0x3582dfdc92449482L,
24300         0x2f7e2fd2565d6cd7L } },
24301     /* 131 */
24302     { { 0xae4b92dbc3770fa7L,0x095e8d5c379043f9L,0x54f34e9d17761171L,
24303         0xc65be92e907702aeL },
24304       { 0x2758a303f6fd0a40L,0xe7d822e3bcce784bL,0x7ae4f5854f9767bfL,
24305         0x4bff8e47d1193b3aL } },
24306     /* 132 */
24307     { { 0xcd41d21f00ff1480L,0x2ab8fb7d0754db16L,0xac81d2efbbe0f3eaL,
24308         0x3e4e4ae65772967dL },
24309       { 0x7e18f36d3c5303e6L,0x3bd9994b92262397L,0x9ed70e261324c3c0L,
24310         0x5388aefd58ec6028L } },
24311     /* 133 */
24312     { { 0xad1317eb5e5d7713L,0x09b985ee75de49daL,0x32f5bc4fc74fb261L,
24313         0x5cf908d14f75be0eL },
24314       { 0x760435108e657b12L,0xbfd421a5b96ed9e6L,0x0e29f51f8970ccc2L,
24315         0xa698ba4060f00ce2L } },
24316     /* 134 */
24317     { { 0x73db1686ef748fecL,0xe6e755a27e9d2cf9L,0x630b6544ce265effL,
24318         0xb142ef8a7aebad8dL },
24319       { 0xad31af9f17d5770aL,0x66af3b672cb3412fL,0x6bd60d1bdf3359deL,
24320         0xd1896a9658515075L } },
24321     /* 135 */
24322     { { 0xec5957ab33c41c08L,0x87de94ac5468e2e1L,0x18816b73ac472f6cL,
24323         0x267b0e0b7981da39L },
24324       { 0x6e554e5d8e62b988L,0xd8ddc755116d21e7L,0x4610faf03d2a6f99L,
24325         0xb54e287aa1119393L } },
24326     /* 136 */
24327     { { 0x0a0122b5178a876bL,0x51ff96ff085104b4L,0x050b31ab14f29f76L,
24328         0x84abb28b5f87d4e6L },
24329       { 0xd5ed439f8270790aL,0x2d6cb59d85e3f46bL,0x75f55c1b6c1e2212L,
24330         0xe5436f6717655640L } },
24331     /* 137 */
24332     { { 0x53f9025e2286e8d5L,0x353c95b4864453beL,0xd832f5bde408e3a0L,
24333         0x0404f68b5b9ce99eL },
24334       { 0xcad33bdea781e8e5L,0x3cdf5018163c2f5bL,0x575769600119caa3L,
24335         0x3a4263df0ac1c701L } },
24336     /* 138 */
24337     { { 0xc2965ecc9aeb596dL,0x01ea03e7023c92b4L,0x4704b4b62e013961L,
24338         0x0ca8fd3f905ea367L },
24339       { 0x92523a42551b2b61L,0x1eb7a89c390fcd06L,0xe7f1d2be0392a63eL,
24340         0x96dca2644ddb0c33L } },
24341     /* 139 */
24342     { { 0x203bb43a387510afL,0x846feaa8a9a36a01L,0xd23a57702f950378L,
24343         0x4363e2123aad59dcL },
24344       { 0xca43a1c740246a47L,0xb362b8d2e55dd24dL,0xf9b086045d8faf96L,
24345         0x840e115cd8bb98c4L } },
24346     /* 140 */
24347     { { 0xf12205e21023e8a7L,0xc808a8cdd8dc7a0bL,0xe292a272163a5ddfL,
24348         0x5e0d6abd30ded6d4L },
24349       { 0x07a721c27cfc0f64L,0x42eec01d0e55ed88L,0x26a7bef91d1f9db2L,
24350         0x7dea48f42945a25aL } },
24351     /* 141 */
24352     { { 0xabdf6f1ce5060a81L,0xe79f9c72f8f95615L,0xcfd36c5406ac268bL,
24353         0xabc2a2beebfd16d1L },
24354       { 0x8ac66f91d3e2eac7L,0x6f10ba63d2dd0466L,0x6790e3770282d31bL,
24355         0x4ea353946c7eefc1L } },
24356     /* 142 */
24357     { { 0xed8a2f8d5266309dL,0x0a51c6c081945a3eL,0xcecaf45a578c5dc1L,
24358         0x3a76e6891c94ffc3L },
24359       { 0x9aace8a47d7b0d0fL,0x963ace968f584a5fL,0x51a30c724e697fbeL,
24360         0x8212a10a465e6464L } },
24361     /* 143 */
24362     { { 0xef7c61c3cfab8caaL,0x18eb8e840e142390L,0xcd1dff677e9733caL,
24363         0xaa7cab71599cb164L },
24364       { 0x02fc9273bc837bd1L,0xc06407d0c36af5d7L,0x17621292f423da49L,
24365         0x40e38073fe0617c3L } },
24366     /* 144 */
24367     { { 0xf4f80824a7bf9b7cL,0x365d23203fbe30d0L,0xbfbe532097cf9ce3L,
24368         0xe3604700b3055526L },
24369       { 0x4dcb99116cc6c2c7L,0x72683708ba4cbee6L,0xdcded434637ad9ecL,
24370         0x6542d677a3dee15fL } },
24371     /* 145 */
24372     { { 0x3f32b6d07b6c377aL,0x6cb03847903448beL,0xd6fdd3a820da8af7L,
24373         0xa6534aee09bb6f21L },
24374       { 0x30a1780d1035facfL,0x35e55a339dcb47e6L,0x6ea50fe1c447f393L,
24375         0xf3cb672fdc9aef22L } },
24376     /* 146 */
24377     { { 0xeb3719fe3b55fd83L,0xe0d7a46c875ddd10L,0x33ac9fa905cea784L,
24378         0x7cafaa2eaae870e7L },
24379       { 0x9b814d041d53b338L,0xe0acc0a0ef87e6c6L,0xfb93d10811672b0fL,
24380         0x0aab13c1b9bd522eL } },
24381     /* 147 */
24382     { { 0xddcce278d2681297L,0xcb350eb1b509546aL,0x2dc431737661aaf2L,
24383         0x4b91a602847012e9L },
24384       { 0xdcff109572f8ddcfL,0x08ebf61e9a911af4L,0x48f4360ac372430eL,
24385         0x49534c5372321cabL } },
24386     /* 148 */
24387     { { 0x83df7d71f07b7e9dL,0xa478efa313cd516fL,0x78ef264b6c047ee3L,
24388         0xcaf46c4fd65ac5eeL },
24389       { 0xa04d0c7792aa8266L,0xedf45466913684bbL,0x56e65168ae4b16b0L,
24390         0x14ce9e5704c6770fL } },
24391     /* 149 */
24392     { { 0x99445e3e965e8f91L,0xd3aca1bacb0f2492L,0xd31cc70f90c8a0a0L,
24393         0x1bb708a53e4c9a71L },
24394       { 0xd5ca9e69558bdd7aL,0x734a0508018a26b1L,0xb093aa714c9cf1ecL,
24395         0xf9d126f2da300102L } },
24396     /* 150 */
24397     { { 0x749bca7aaff9563eL,0xdd077afeb49914a0L,0xe27a0311bf5f1671L,
24398         0x807afcb9729ecc69L },
24399       { 0x7f8a9337c9b08b77L,0x86c3a785443c7e38L,0x85fafa59476fd8baL,
24400         0x751adcd16568cd8cL } },
24401     /* 151 */
24402     { { 0x8aea38b410715c0dL,0xd113ea718f7697f7L,0x665eab1493fbf06dL,
24403         0x29ec44682537743fL },
24404       { 0x3d94719cb50bebbcL,0x399ee5bfe4505422L,0x90cd5b3a8d2dedb1L,
24405         0xff9370e392a4077dL } },
24406     /* 152 */
24407     { { 0x59a2d69bc6b75b65L,0x4188f8d5266651c5L,0x28a9f33e3de9d7d2L,
24408         0x9776478ba2a9d01aL },
24409       { 0x8852622d929af2c7L,0x334f5d6d4e690923L,0xce6cc7e5a89a51e9L,
24410         0x74a6313fac2f82faL } },
24411     /* 153 */
24412     { { 0xb2f4dfddb75f079cL,0x85b07c9518e36fbbL,0x1b6cfcf0e7cd36ddL,
24413         0xab75be150ff4863dL },
24414       { 0x81b367c0173fc9b7L,0xb90a7420d2594fd0L,0x15fdbf03c4091236L,
24415         0x4ebeac2e0b4459f6L } },
24416     /* 154 */
24417     { { 0xeb6c5fe75c9f2c53L,0xd25220118eae9411L,0xc8887633f95ac5d8L,
24418         0xdf99887b2c1baffcL },
24419       { 0xbb78eed2850aaecbL,0x9d49181b01d6a272L,0x978dd511b1cdbcacL,
24420         0x27b040a7779f4058L } },
24421     /* 155 */
24422     { { 0x90405db7f73b2eb2L,0xe0df85088e1b2118L,0x501b71525962327eL,
24423         0xb393dd37e4cfa3f5L },
24424       { 0xa1230e7b3fd75165L,0xd66344c2bcd33554L,0x6c36f1be0f7b5022L,
24425         0x09588c12d0463419L } },
24426     /* 156 */
24427     { { 0xe086093f02601c3bL,0xfb0252f8cf5c335fL,0x955cf280894aff28L,
24428         0x81c879a9db9f648bL },
24429       { 0x040e687cc6f56c51L,0xfed471693f17618cL,0x44f88a419059353bL,
24430         0xfa0d48f55fc11bc4L } },
24431     /* 157 */
24432     { { 0xbc6e1c9de1608e4dL,0x010dda113582822cL,0xf6b7ddc1157ec2d7L,
24433         0x8ea0e156b6a367d6L },
24434       { 0xa354e02f2383b3b4L,0x69966b943f01f53cL,0x4ff6632b2de03ca5L,
24435         0x3f5ab924fa00b5acL } },
24436     /* 158 */
24437     { { 0x337bb0d959739efbL,0xc751b0f4e7ebec0dL,0x2da52dd6411a67d1L,
24438         0x8bc768872b74256eL },
24439       { 0xa5be3b7282d3d253L,0xa9f679a1f58d779fL,0xa1cac168e16767bbL,
24440         0xb386f19060fcf34fL } },
24441     /* 159 */
24442     { { 0x31f3c1352fedcfc2L,0x5396bf6262f8af0dL,0x9a02b4eae57288c2L,
24443         0x4cb460f71b069c4dL },
24444       { 0xae67b4d35b8095eaL,0x92bbf8596fc07603L,0xe1475f66b614a165L,
24445         0x52c0d50895ef5223L } },
24446     /* 160 */
24447     { { 0x231c210e15339848L,0xe87a28e870778c8dL,0x9d1de6616956e170L,
24448         0x4ac3c9382bb09c0bL },
24449       { 0x19be05516998987dL,0x8b2376c4ae09f4d6L,0x1de0b7651a3f933dL,
24450         0x380d94c7e39705f4L } },
24451     /* 161 */
24452     { { 0x01a355aa81542e75L,0x96c724a1ee01b9b7L,0x6b3a2977624d7087L,
24453         0x2ce3e171de2637afL },
24454       { 0xcfefeb49f5d5bc1aL,0xa655607e2777e2b5L,0x4feaac2f9513756cL,
24455         0x2e6cd8520b624e4dL } },
24456     /* 162 */
24457     { { 0x3685954b8c31c31dL,0x68533d005bf21a0cL,0x0bd7626e75c79ec9L,
24458         0xca17754742c69d54L },
24459       { 0xcc6edafff6d2dbb2L,0xfd0d8cbd174a9d18L,0x875e8793aa4578e8L,
24460         0xa976a7139cab2ce6L } },
24461     /* 163 */
24462     { { 0x0a651f1b93fb353dL,0xd75cab8b57fcfa72L,0xaa88cfa731b15281L,
24463         0x8720a7170a1f4999L },
24464       { 0x8c3e8d37693e1b90L,0xd345dc0b16f6dfc3L,0x8ea8d00ab52a8742L,
24465         0x9719ef29c769893cL } },
24466     /* 164 */
24467     { { 0x820eed8d58e35909L,0x9366d8dc33ddc116L,0xd7f999d06e205026L,
24468         0xa5072976e15704c1L },
24469       { 0x002a37eac4e70b2eL,0x84dcf6576890aa8aL,0xcd71bf18645b2a5cL,
24470         0x99389c9df7b77725L } },
24471     /* 165 */
24472     { { 0x238c08f27ada7a4bL,0x3abe9d03fd389366L,0x6b672e89766f512cL,
24473         0xa88806aa202c82e4L },
24474       { 0x6602044ad380184eL,0xa8cb78c4126a8b85L,0x79d670c0ad844f17L,
24475         0x0043bffb4738dcfeL } },
24476     /* 166 */
24477     { { 0x8d59b5dc36d5192eL,0xacf885d34590b2afL,0x83566d0a11601781L,
24478         0x52f3ef01ba6c4866L },
24479       { 0x3986732a0edcb64dL,0x0a482c238068379fL,0x16cbe5fa7040f309L,
24480         0x3296bd899ef27e75L } },
24481     /* 167 */
24482     { { 0x476aba89454d81d7L,0x9eade7ef51eb9b3cL,0x619a21cd81c57986L,
24483         0x3b90febfaee571e9L },
24484       { 0x9393023e5496f7cbL,0x55be41d87fb51bc4L,0x03f1dd4899beb5ceL,
24485         0x6e88069d9f810b18L } },
24486     /* 168 */
24487     { { 0xce37ab11b43ea1dbL,0x0a7ff1a95259d292L,0x851b02218f84f186L,
24488         0xa7222beadefaad13L },
24489       { 0xa2ac78ec2b0a9144L,0x5a024051f2fa59c5L,0x91d1eca56147ce38L,
24490         0xbe94d523bc2ac690L } },
24491     /* 169 */
24492     { { 0x72f4945e0b226ce7L,0xb8afd747967e8b70L,0xedea46f185a6c63eL,
24493         0x7782defe9be8c766L },
24494       { 0x760d2aa43db38626L,0x460ae78776f67ad1L,0x341b86fc54499cdbL,
24495         0x03838567a2892e4bL } },
24496     /* 170 */
24497     { { 0x2d8daefd79ec1a0fL,0x3bbcd6fdceb39c97L,0xf5575ffc58f61a95L,
24498         0xdbd986c4adf7b420L },
24499       { 0x81aa881415f39eb7L,0x6ee2fcf5b98d976cL,0x5465475dcf2f717dL,
24500         0x8e24d3c46860bbd0L } },
24501     /* 171 */
24502     { { 0x749d8e549a587390L,0x12bb194f0cbec588L,0x46e07da4b25983c6L,
24503         0x541a99c4407bafc8L },
24504       { 0xdb241692624c8842L,0x6044c12ad86c05ffL,0xc59d14b44f7fcf62L,
24505         0xc0092c49f57d35d1L } },
24506     /* 172 */
24507     { { 0xd3cc75c3df2e61efL,0x7e8841c82e1b35caL,0xc62d30d1909f29f4L,
24508         0x75e406347286944dL },
24509       { 0xe7d41fc5bbc237d0L,0xc9537bf0ec4f01c9L,0x91c51a16282bd534L,
24510         0x5b7cb658c7848586L } },
24511     /* 173 */
24512     { { 0x964a70848a28ead1L,0x802dc508fd3b47f6L,0x9ae4bfd1767e5b39L,
24513         0x7ae13eba8df097a1L },
24514       { 0xfd216ef8eadd384eL,0x0361a2d9b6b2ff06L,0x204b98784bcdb5f3L,
24515         0x787d8074e2a8e3fdL } },
24516     /* 174 */
24517     { { 0xc5e25d6b757fbb1cL,0xe47bddb2ca201debL,0x4a55e9a36d2233ffL,
24518         0x5c2228199ef28484L },
24519       { 0x773d4a8588315250L,0x21b21a2b827097c1L,0xab7c4ea1def5d33fL,
24520         0xe45d37abbaf0f2b0L } },
24521     /* 175 */
24522     { { 0xd2df1e3428511c8aL,0xebb229c8bdca6cd3L,0x578a71a7627c39a7L,
24523         0xed7bc12284dfb9d3L },
24524       { 0xcf22a6df93dea561L,0x5443f18dd48f0ed1L,0xd8b861405bad23e8L,
24525         0xaac97cc945ca6d27L } },
24526     /* 176 */
24527     { { 0xeb54ea74a16bd00aL,0xd839e9adf5c0bcc1L,0x092bb7f11f9bfc06L,
24528         0x318f97b31163dc4eL },
24529       { 0xecc0c5bec30d7138L,0x44e8df23abc30220L,0x2bb7972fb0223606L,
24530         0xfa41faa19a84ff4dL } },
24531     /* 177 */
24532     { { 0x4402d974a6642269L,0xc81814ce9bb783bdL,0x398d38e47941e60bL,
24533         0x38bb6b2c1d26e9e2L },
24534       { 0xc64e4a256a577f87L,0x8b52d253dc11fe1cL,0xff336abf62280728L,
24535         0x94dd0905ce7601a5L } },
24536     /* 178 */
24537     { { 0x156cf7dcde93f92aL,0xa01333cb89b5f315L,0x02404df9c995e750L,
24538         0x92077867d25c2ae9L },
24539       { 0xe2471e010bf39d44L,0x5f2c902096bb53d7L,0x4c44b7b35c9c3d8fL,
24540         0x81e8428bd29beb51L } },
24541     /* 179 */
24542     { { 0x6dd9c2bac477199fL,0x8cb8eeee6b5ecdd9L,0x8af7db3fee40fd0eL,
24543         0x1b94ab62dbbfa4b1L },
24544       { 0x44f0d8b3ce47f143L,0x51e623fc63f46163L,0xf18f270fcc599383L,
24545         0x06a38e28055590eeL } },
24546     /* 180 */
24547     { { 0x2e5b0139b3355b49L,0x20e26560b4ebf99bL,0xc08ffa6bd269f3dcL,
24548         0xa7b36c2083d9d4f8L },
24549       { 0x64d15c3a1b3e8830L,0xd5fceae1a89f9c0bL,0xcfeee4a2e2d16930L,
24550         0xbe54c6b4a2822a20L } },
24551     /* 181 */
24552     { { 0xd6cdb3df8d91167cL,0x517c3f79e7a6625eL,0x7105648f346ac7f4L,
24553         0xbf30a5abeae022bbL },
24554       { 0x8e7785be93828a68L,0x5161c3327f3ef036L,0xe11b5feb592146b2L,
24555         0xd1c820de2732d13aL } },
24556     /* 182 */
24557     { { 0x043e13479038b363L,0x58c11f546b05e519L,0x4fe57abe6026cad1L,
24558         0xb7d17bed68a18da3L },
24559       { 0x44ca5891e29c2559L,0x4f7a03765bfffd84L,0x498de4af74e46948L,
24560         0x3997fd5e6412cc64L } },
24561     /* 183 */
24562     { { 0xf20746828bd61507L,0x29e132d534a64d2aL,0xffeddfb08a8a15e3L,
24563         0x0eeb89293c6c13e8L },
24564       { 0xe9b69a3ea7e259f8L,0xce1db7e6d13e7e67L,0x277318f6ad1fa685L,
24565         0x228916f8c922b6efL } },
24566     /* 184 */
24567     { { 0x959ae25b0a12ab5bL,0xcc11171f957bc136L,0x8058429ed16e2b0cL,
24568         0xec05ad1d6e93097eL },
24569       { 0x157ba5beac3f3708L,0x31baf93530b59d77L,0x47b55237118234e5L,
24570         0x7d3141567ff11b37L } },
24571     /* 185 */
24572     { { 0x7bd9c05cf6dfefabL,0xbe2f2268dcb37707L,0xe53ead973a38bb95L,
24573         0xe9ce66fc9bc1d7a3L },
24574       { 0x75aa15766f6a02a1L,0x38c087df60e600edL,0xf8947f3468cdc1b9L,
24575         0xd9650b0172280651L } },
24576     /* 186 */
24577     { { 0x504b4c4a5a057e60L,0xcbccc3be8def25e4L,0xa635320817c1ccbdL,
24578         0x14d6699a804eb7a2L },
24579       { 0x2c8a8415db1f411aL,0x09fbaf0bf80d769cL,0xb4deef901c2f77adL,
24580         0x6f4c68410d43598aL } },
24581     /* 187 */
24582     { { 0x8726df4e96c24a96L,0x534dbc85fcbd99a3L,0x3c466ef28b2ae30aL,
24583         0x4c4350fd61189abbL },
24584       { 0x2967f716f855b8daL,0x41a42394463c38a1L,0xc37e1413eae93343L,
24585         0xa726d2425a3118b5L } },
24586     /* 188 */
24587     { { 0xdae6b3ee948c1086L,0xf1de503dcbd3a2e1L,0x3f35ed3f03d022f3L,
24588         0x13639e82cc6cf392L },
24589       { 0x9ac938fbcdafaa86L,0xf45bc5fb2654a258L,0x1963b26e45051329L,
24590         0xca9365e1c1a335a3L } },
24591     /* 189 */
24592     { { 0x3615ac754c3b2d20L,0x742a5417904e241bL,0xb08521c4cc9d071dL,
24593         0x9ce29c34970b72a5L },
24594       { 0x8cc81f736d3e0ad6L,0x8060da9ef2f8434cL,0x35ed1d1a6ce862d9L,
24595         0x48c4abd7ab42af98L } },
24596     /* 190 */
24597     { { 0xd221b0cc40c7485aL,0xead455bbe5274dbfL,0x493c76989263d2e8L,
24598         0x78017c32f67b33cbL },
24599       { 0xb9d35769930cb5eeL,0xc0d14e940c408ed2L,0xf8b7bf55272f1a4dL,
24600         0x53cd0454de5c1c04L } },
24601     /* 191 */
24602     { { 0xbcd585fa5d28ccacL,0x5f823e56005b746eL,0x7c79f0a1cd0123aaL,
24603         0xeea465c1d3d7fa8fL },
24604       { 0x7810659f0551803bL,0x6c0b599f7ce6af70L,0x4195a77029288e70L,
24605         0x1b6e42a47ae69193L } },
24606     /* 192 */
24607     { { 0x2e80937cf67d04c3L,0x1e312be289eeb811L,0x56b5d88792594d60L,
24608         0x0224da14187fbd3dL },
24609       { 0x87abb8630c5fe36fL,0x580f3c604ef51f5fL,0x964fb1bfb3b429ecL,
24610         0x60838ef042bfff33L } },
24611     /* 193 */
24612     { { 0x432cb2f27e0bbe99L,0x7bda44f304aa39eeL,0x5f497c7a9fa93903L,
24613         0x636eb2022d331643L },
24614       { 0xfcfd0e6193ae00aaL,0x875a00fe31ae6d2fL,0xf43658a29f93901cL,
24615         0x8844eeb639218bacL } },
24616     /* 194 */
24617     { { 0x114171d26b3bae58L,0x7db3df7117e39f3eL,0xcd37bc7f81a8eadaL,
24618         0x27ba83dc51fb789eL },
24619       { 0xa7df439ffbf54de5L,0x7277030bb5fe1a71L,0x42ee8e35db297a48L,
24620         0xadb62d3487f3a4abL } },
24621     /* 195 */
24622     { { 0x9b1168a2a175df2aL,0x082aa04f618c32e9L,0xc9e4f2e7146b0916L,
24623         0xb990fd7675e7c8b2L },
24624       { 0x0829d96b4df37313L,0x1c205579d0b40789L,0x66c9ae4a78087711L,
24625         0x81707ef94d10d18dL } },
24626     /* 196 */
24627     { { 0x97d7cab203d6ff96L,0x5b851bfc0d843360L,0x268823c4d042db4bL,
24628         0x3792daead5a8aa5cL },
24629       { 0x52818865941afa0bL,0xf3e9e74142d83671L,0x17c825275be4e0a7L,
24630         0x5abd635e94b001baL } },
24631     /* 197 */
24632     { { 0x727fa84e0ac4927cL,0xe3886035a7c8cf23L,0xa4bcd5ea4adca0dfL,
24633         0x5995bf21846ab610L },
24634       { 0xe90f860b829dfa33L,0xcaafe2ae958fc18bL,0x9b3baf4478630366L,
24635         0x44c32ca2d483411eL } },
24636     /* 198 */
24637     { { 0xa74a97f1e40ed80cL,0x5f938cb131d2ca82L,0x53f2124b7c2d6ad9L,
24638         0x1f2162fb8082a54cL },
24639       { 0x7e467cc5720b173eL,0x40e8a666085f12f9L,0x8cebc20e4c9d65dcL,
24640         0x8f1d402bc3e907c9L } },
24641     /* 199 */
24642     { { 0x4f592f9cfbc4058aL,0xb15e14b6292f5670L,0xc55cfe37bc1d8c57L,
24643         0xb1980f43926edbf9L },
24644       { 0x98c33e0932c76b09L,0x1df5279d33b07f78L,0x6f08ead4863bb461L,
24645         0x2828ad9b37448e45L } },
24646     /* 200 */
24647     { { 0x696722c4c4cf4ac5L,0xf5ac1a3fdde64afbL,0x0551baa2e0890832L,
24648         0x4973f1275a14b390L },
24649       { 0xe59d8335322eac5dL,0x5e07eef50bd9b568L,0xab36720fa2588393L,
24650         0x6dac8ed0db168ac7L } },
24651     /* 201 */
24652     { { 0xf7b545aeeda835efL,0x4aa113d21d10ed51L,0x035a65e013741b09L,
24653         0x4b23ef5920b9de4cL },
24654       { 0xe82bb6803c4c7341L,0xd457706d3f58bc37L,0x73527863a51e3ee8L,
24655         0x4dd71534ddf49a4eL } },
24656     /* 202 */
24657     { { 0xbf94467295476cd9L,0x648d072fe31a725bL,0x1441c8b8fc4b67e0L,
24658         0xfd3170002f4a4dbbL },
24659       { 0x1cb43ff48995d0e1L,0x76e695d10ef729aaL,0xe0d5f97641798982L,
24660         0x14fac58c9569f365L } },
24661     /* 203 */
24662     { { 0xad9a0065f312ae18L,0x51958dc0fcc93fc9L,0xd9a142408a7d2846L,
24663         0xed7c765136abda50L },
24664       { 0x46270f1a25d4abbcL,0x9b5dd8f3f1a113eaL,0xc609b0755b51952fL,
24665         0xfefcb7f74d2e9f53L } },
24666     /* 204 */
24667     { { 0xbd09497aba119185L,0xd54e8c30aac45ba4L,0x492479deaa521179L,
24668         0x1801a57e87e0d80bL },
24669       { 0x073d3f8dfcafffb0L,0x6cf33c0bae255240L,0x781d763b5b5fdfbcL,
24670         0x9f8fc11e1ead1064L } },
24671     /* 205 */
24672     { { 0x1583a1715e69544cL,0x0eaf8567f04b7813L,0x1e22a8fd278a4c32L,
24673         0xa9d3809d3d3a69a9L },
24674       { 0x936c2c2c59a2da3bL,0x38ccbcf61895c847L,0x5e65244e63d50869L,
24675         0x3006b9aee1178ef7L } },
24676     /* 206 */
24677     { { 0x0bb1f2b0c9eead28L,0x7eef635d89f4dfbcL,0x074757fdb2ce8939L,
24678         0x0ab85fd745f8f761L },
24679       { 0xecda7c933e5b4549L,0x4be2bb5c97922f21L,0x261a1274b43b8040L,
24680         0xb122d67511e942c2L } },
24681     /* 207 */
24682     { { 0x3be607be66a5ae7aL,0x01e703fa76adcbe3L,0xaf9043014eb6e5c5L,
24683         0x9f599dc1097dbaecL },
24684       { 0x6d75b7180ff250edL,0x8eb91574349a20dcL,0x425605a410b227a3L,
24685         0x7d5528e08a294b78L } },
24686     /* 208 */
24687     { { 0xf0f58f6620c26defL,0x025585ea582b2d1eL,0xfbe7d79b01ce3881L,
24688         0x28ccea01303f1730L },
24689       { 0xd1dabcd179644ba5L,0x1fc643e806fff0b8L,0xa60a76fc66b3e17bL,
24690         0xc18baf48a1d013bfL } },
24691     /* 209 */
24692     { { 0x34e638c85dc4216dL,0x00c01067206142acL,0xd453a17195f5064aL,
24693         0x9def809db7a9596bL },
24694       { 0x41e8642e67ab8d2cL,0xb42404336237a2b6L,0x7d506a6d64c4218bL,
24695         0x0357f8b068808ce5L } },
24696     /* 210 */
24697     { { 0x8e9dbe644cd2cc88L,0xcc61c28df0b8f39dL,0x4a309874cd30a0c8L,
24698         0xe4a01add1b489887L },
24699       { 0x2ed1eeacf57cd8f9L,0x1b767d3ebd594c48L,0xa7295c717bd2f787L,
24700         0x466d7d79ce10cc30L } },
24701     /* 211 */
24702     { { 0x47d318929dada2c7L,0x4fa0a6c38f9aa27dL,0x90e4fd28820a59e1L,
24703         0xc672a522451ead1aL },
24704       { 0x30607cc85d86b655L,0xf0235d3bf9ad4af1L,0x99a08680571172a6L,
24705         0x5e3d64faf2a67513L } },
24706     /* 212 */
24707     { { 0xaa6410c79b3b4416L,0xcd8fcf85eab26d99L,0x5ebff74adb656a74L,
24708         0x6c8a7a95eb8e42fcL },
24709       { 0x10c60ba7b02a63bdL,0x6b2f23038b8f0047L,0x8c6c3738312d90b0L,
24710         0x348ae422ad82ca91L } },
24711     /* 213 */
24712     { { 0x7f4746635ccda2fbL,0x22accaa18e0726d2L,0x85adf782492b1f20L,
24713         0xc1074de0d9ef2d2eL },
24714       { 0xfcf3ce44ae9a65b3L,0xfd71e4ac05d7151bL,0xd4711f50ce6a9788L,
24715         0xfbadfbdbc9e54ffcL } },
24716     /* 214 */
24717     { { 0x1713f1cd20a99363L,0xb915658f6cf22775L,0x968175cd24d359b2L,
24718         0xb7f976b483716fcdL },
24719       { 0x5758e24d5d6dbf74L,0x8d23bafd71c3af36L,0x48f477600243dfe3L,
24720         0xf4d41b2ecafcc805L } },
24721     /* 215 */
24722     { { 0x51f1cf28fdabd48dL,0xce81be3632c078a4L,0x6ace2974117146e9L,
24723         0x180824eae0160f10L },
24724       { 0x0387698b66e58358L,0x63568752ce6ca358L,0x82380e345e41e6c5L,
24725         0x67e5f63983cf6d25L } },
24726     /* 216 */
24727     { { 0xf89ccb8dcf4899efL,0x949015f09ebb44c0L,0x546f9276b2598ec9L,
24728         0x9fef789a04c11fc6L },
24729       { 0x6d367ecf53d2a071L,0xb10e1a7fa4519b09L,0xca6b3fb0611e2eefL,
24730         0xbc80c181a99c4e20L } },
24731     /* 217 */
24732     { { 0x972536f8e5eb82e6L,0x1a484fc7f56cb920L,0xc78e217150b5da5eL,
24733         0x49270e629f8cdf10L },
24734       { 0x1a39b7bbea6b50adL,0x9a0284c1a2388ffcL,0x5403eb178107197bL,
24735         0xd2ee52f961372f7fL } },
24736     /* 218 */
24737     { { 0xd37cd28588e0362aL,0x442fa8a78fa5d94dL,0xaff836e5a434a526L,
24738         0xdfb478bee5abb733L },
24739       { 0xa91f1ce7673eede6L,0xa5390ad42b5b2f04L,0x5e66f7bf5530da2fL,
24740         0xd9a140b408df473aL } },
24741     /* 219 */
24742     { { 0x0e0221b56e8ea498L,0x623478293563ee09L,0xe06b8391335d2adeL,
24743         0x760c058d623f4b1aL },
24744       { 0x0b89b58cc198aa79L,0xf74890d2f07aba7fL,0x4e204110fde2556aL,
24745         0x7141982d8f190409L } },
24746     /* 220 */
24747     { { 0x6f0a0e334d4b0f45L,0xd9280b38392a94e1L,0x3af324c6b3c61d5eL,
24748         0x3af9d1ce89d54e47L },
24749       { 0xfd8f798120930371L,0xeda2664c21c17097L,0x0e9545dcdc42309bL,
24750         0xb1f815c373957dd6L } },
24751     /* 221 */
24752     { { 0x84faa78e89fec44aL,0xc8c2ae473caa4cafL,0x691c807dc1b6a624L,
24753         0xa41aed141543f052L },
24754       { 0x424353997d5ffe04L,0x8bacb2df625b6e20L,0x85d660be87817775L,
24755         0xd6e9c1dd86fb60efL } },
24756     /* 222 */
24757     { { 0x3aa2e97ec6853264L,0x771533b7e2304a0bL,0x1b912bb7b8eae9beL,
24758         0x9c9c6e10ae9bf8c2L },
24759       { 0xa2309a59e030b74cL,0x4ed7494d6a631e90L,0x89f44b23a49b79f2L,
24760         0x566bd59640fa61b6L } },
24761     /* 223 */
24762     { { 0x066c0118c18061f3L,0x190b25d37c83fc70L,0xf05fc8e027273245L,
24763         0xcf2c7390f525345eL },
24764       { 0xa09bceb410eb30cfL,0xcfd2ebba0d77703aL,0xe842c43a150ff255L,
24765         0x02f517558aa20979L } },
24766     /* 224 */
24767     { { 0x396ef794addb7d07L,0x0b4fc74224455500L,0xfaff8eacc78aa3ceL,
24768         0x14e9ada5e8d4d97dL },
24769       { 0xdaa480a12f7079e2L,0x45baa3cde4b0800eL,0x01765e2d7838157dL,
24770         0xa0ad4fab8e9d9ae8L } },
24771     /* 225 */
24772     { { 0x0bfb76214a653618L,0x1872813c31eaaa5fL,0x1553e73744949d5eL,
24773         0xbcd530b86e56ed1eL },
24774       { 0x169be85332e9c47bL,0xdc2776feb50059abL,0xcdba9761192bfbb4L,
24775         0x909283cf6979341dL } },
24776     /* 226 */
24777     { { 0x67b0032476e81a13L,0x9bee1a9962171239L,0x08ed361bd32e19d6L,
24778         0x35eeb7c9ace1549aL },
24779       { 0x1280ae5a7e4e5bdcL,0x2dcd2cd3b6ceec6eL,0x52e4224c6e266bc1L,
24780         0x9a8b2cf4448ae864L } },
24781     /* 227 */
24782     { { 0xf6471bf209d03b59L,0xc90e62a3b65af2abL,0xff7ff168ebd5eec9L,
24783         0x6bdb60f4d4491379L },
24784       { 0xdadafebc8a55bc30L,0xc79ead1610097fe0L,0x42e197414c1e3bddL,
24785         0x01ec3cfd94ba08a9L } },
24786     /* 228 */
24787     { { 0xba6277ebdc9485c2L,0x48cc9a7922fb10c7L,0x4f61d60f70a28d8aL,
24788         0xd1acb1c0475464f6L },
24789       { 0xd26902b126f36612L,0x59c3a44ee0618d8bL,0x4df8a813308357eeL,
24790         0x7dcd079d405626c2L } },
24791     /* 229 */
24792     { { 0x5ce7d4d3f05a4b48L,0xadcd295237230772L,0xd18f7971812a915aL,
24793         0x0bf53589377d19b8L },
24794       { 0x35ecd95a6c68ea73L,0xc7f3bbca823a584dL,0x9fb674c6f473a723L,
24795         0xd28be4d9e16686fcL } },
24796     /* 230 */
24797     { { 0x5d2b990638fa8e4bL,0x559f186e893fd8fcL,0x3a6de2aa436fb6fcL,
24798         0xd76007aa510f88ceL },
24799       { 0x2d10aab6523a4988L,0xb455cf4474dd0273L,0x7f467082a3407278L,
24800         0xf2b52f68b303bb01L } },
24801     /* 231 */
24802     { { 0x0d57eafa9835b4caL,0x2d2232fcbb669cbcL,0x8eeeb680c6643198L,
24803         0xd8dbe98ecc5aed3aL },
24804       { 0xcba9be3fc5a02709L,0x30be68e5f5ba1fa8L,0xfebd43cdf10ea852L,
24805         0xe01593a3ee559705L } },
24806     /* 232 */
24807     { { 0xd3e5af50ea75a0a6L,0x512226ac57858033L,0x6fe6d50fd0176406L,
24808         0xafec07b1aeb8ef06L },
24809       { 0x7fb9956780bb0a31L,0x6f1af3cc37309aaeL,0x9153a15a01abf389L,
24810         0xa71b93546e2dbfddL } },
24811     /* 233 */
24812     { { 0xbf8e12e018f593d2L,0xd1a90428a078122bL,0x150505db0ba4f2adL,
24813         0x53a2005c628523d9L },
24814       { 0x07c8b639e7f2b935L,0x2bff975ac182961aL,0x86bceea77518ca2cL,
24815         0xbf47d19b3d588e3dL } },
24816     /* 234 */
24817     { { 0x672967a7dd7665d5L,0x4e3030572f2f4de5L,0x144005ae80d4903fL,
24818         0x001c2c7f39c9a1b6L },
24819       { 0x143a801469efc6d6L,0xc810bdaa7bc7a724L,0x5f65670ba78150a4L,
24820         0xfdadf8e786ffb99bL } },
24821     /* 235 */
24822     { { 0xfd38cb88ffc00785L,0x77fa75913b48eb67L,0x0454d055bf368fbcL,
24823         0x3a838e4d5aa43c94L },
24824       { 0x561663293e97bb9aL,0x9eb93363441d94d9L,0x515591a60adb2a83L,
24825         0x3cdb8257873e1da3L } },
24826     /* 236 */
24827     { { 0x137140a97de77eabL,0xf7e1c50d41648109L,0x762dcad2ceb1d0dfL,
24828         0x5a60cc89f1f57fbaL },
24829       { 0x80b3638240d45673L,0x1b82be195913c655L,0x057284b8dd64b741L,
24830         0x922ff56fdbfd8fc0L } },
24831     /* 237 */
24832     { { 0x1b265deec9a129a1L,0xa5b1ce57cc284e04L,0x04380c46cebfbe3cL,
24833         0x72919a7df6c5cd62L },
24834       { 0x298f453a8fb90f9aL,0xd719c00b88e4031bL,0xe32c0e77796f1856L,
24835         0x5e7917803624089aL } },
24836     /* 238 */
24837     { { 0x5c16ec557f63cdfbL,0x8e6a3571f1cae4fdL,0xfce26bea560597caL,
24838         0x4e0a5371e24c2fabL },
24839       { 0x276a40d3a5765357L,0x3c89af440d73a2b4L,0xb8f370ae41d11a32L,
24840         0xf5ff7818d56604eeL } },
24841     /* 239 */
24842     { { 0xfbf3e3fe1a09df21L,0x26d5d28ee66e8e47L,0x2096bd0a29c89015L,
24843         0xe41df0e9533f5e64L },
24844       { 0x305fda40b3ba9e3fL,0xf2340ceb2604d895L,0x0866e1927f0367c7L,
24845         0x8edd7d6eac4f155fL } },
24846     /* 240 */
24847     { { 0xc9a1dc0e0bfc8ff3L,0x14efd82be936f42fL,0x67016f7ccca381efL,
24848         0x1432c1caed8aee96L },
24849       { 0xec68482970b23c26L,0xa64fe8730735b273L,0xe389f6e5eaef0f5aL,
24850         0xcaef480b5ac8d2c6L } },
24851     /* 241 */
24852     { { 0x5245c97875315922L,0xd82951713063cca5L,0xf3ce60d0b64ef2cbL,
24853         0xd0ba177e8efae236L },
24854       { 0x53a9ae8fb1b3af60L,0x1a796ae53d2da20eL,0x01d63605df9eef28L,
24855         0xf31c957c1c54ae16L } },
24856     /* 242 */
24857     { { 0xc0f58d5249cc4597L,0xdc5015b0bae0a028L,0xefc5fc55734a814aL,
24858         0x013404cb96e17c3aL },
24859       { 0xb29e2585c9a824bfL,0xd593185e001eaed7L,0x8d6ee68261ef68acL,
24860         0x6f377c4b91933e6cL } },
24861     /* 243 */
24862     { { 0x9f93bad1a8333fd2L,0xa89302025a2a95b8L,0x211e5037eaf75aceL,
24863         0x6dba3e4ed2d09506L },
24864       { 0xa48ef98cd04399cdL,0x1811c66ee6b73adeL,0x72f60752c17ecaf3L,
24865         0xf13cf3423becf4a7L } },
24866     /* 244 */
24867     { { 0xceeb9ec0a919e2ebL,0x83a9a195f62c0f68L,0xcfba3bb67aba2299L,
24868         0xc83fa9a9274bbad3L },
24869       { 0x0d7d1b0b62fa1ce0L,0xe58b60f53418efbfL,0xbfa8ef9e52706f04L,
24870         0xb49d70f45d702683L } },
24871     /* 245 */
24872     { { 0x914c7510fad5513bL,0x05f32eecb1751e2dL,0x6d850418d9fb9d59L,
24873         0x59cfadbb0c30f1cfL },
24874       { 0xe167ac2355cb7fd6L,0x249367b8820426a3L,0xeaeec58c90a78864L,
24875         0x5babf362354a4b67L } },
24876     /* 246 */
24877     { { 0x37c981d1ee424865L,0x8b002878f2e5577fL,0x702970f1b9e0c058L,
24878         0x6188c6a79026c8f0L },
24879       { 0x06f9a19bd0f244daL,0x1ecced5cfb080873L,0x35470f9b9f213637L,
24880         0x993fe475df50b9d9L } },
24881     /* 247 */
24882     { { 0x68e31cdf9b2c3609L,0x84eb19c02c46d4eaL,0x7ac9ec1a9a775101L,
24883         0x81f764664c80616bL },
24884       { 0x1d7c2a5a75fbe978L,0x6743fed3f183b356L,0x838d1f04501dd2bfL,
24885         0x564a812a5fe9060dL } },
24886     /* 248 */
24887     { { 0x7a5a64f4fa817d1dL,0x55f96844bea82e0fL,0xb5ff5a0fcd57f9aaL,
24888         0x226bf3cf00e51d6cL },
24889       { 0xd6d1a9f92f2833cfL,0x20a0a35a4f4f89a8L,0x11536c498f3f7f77L,
24890         0x68779f47ff257836L } },
24891     /* 249 */
24892     { { 0x79b0c1c173043d08L,0xa54467741fc020faL,0xd3767e289a6d26d0L,
24893         0x97bcb0d1eb092e0bL },
24894       { 0x2ab6eaa8f32ed3c3L,0xc8a4f151b281bc48L,0x4d1bf4f3bfa178f3L,
24895         0xa872ffe80a784655L } },
24896     /* 250 */
24897     { { 0xb1ab7935a32b2086L,0xe1eb710e8160f486L,0x9bd0cd913b6ae6beL,
24898         0x02812bfcb732a36aL },
24899       { 0xa63fd7cacf605318L,0x646e5d50fdfd6d1dL,0xa1d683982102d619L,
24900         0x07391cc9fe5396afL } },
24901     /* 251 */
24902     { { 0xc50157f08b80d02bL,0x6b8333d162877f7fL,0x7aca1af878d542aeL,
24903         0x355d2adc7e6d2a08L },
24904       { 0xb41f335a287386e1L,0xfd272a94f8e43275L,0x286ca2cde79989eaL,
24905         0x3dc2b1e37c2a3a79L } },
24906     /* 252 */
24907     { { 0xd689d21c04581352L,0x0a00c825376782beL,0x203bd5909fed701fL,
24908         0xc47869103ccd846bL },
24909       { 0x5dba770824c768edL,0x72feea026841f657L,0x73313ed56accce0eL,
24910         0xccc42968d5bb4d32L } },
24911     /* 253 */
24912     { { 0x94e50de13d7620b9L,0xd89a5c8a5992a56aL,0xdc007640675487c9L,
24913         0xe147eb42aa4871cfL },
24914       { 0x274ab4eeacf3ae46L,0xfd4936fb50350fbeL,0xdf2afe4748c840eaL,
24915         0x239ac047080e96e3L } },
24916     /* 254 */
24917     { { 0x481d1f352bfee8d4L,0xce80b5cffa7b0fecL,0x105c4c9e2ce9af3cL,
24918         0xc55fa1a3f5f7e59dL },
24919       { 0x3186f14e8257c227L,0xc5b1653f342be00bL,0x09afc998aa904fb2L,
24920         0x094cd99cd4f4b699L } },
24921     /* 255 */
24922     { { 0x8a981c84d703bebaL,0x8631d15032ceb291L,0xa445f2c9e3bd49ecL,
24923         0xb90a30b642abad33L },
24924       { 0xb465404fb4a5abf9L,0x004750c375db7603L,0x6f9a42ccca35d89fL,
24925         0x019f8b9a1b7924f7L } },
24926 };
24927 
24928 /* Multiply the base point of P256 by the scalar and return the result.
24929  * If map is true then convert result to affine coordinates.
24930  *
24931  * Stripe implementation.
24932  * Pre-generated: 2^0, 2^32, ...
24933  * Pre-generated: products of all combinations of above.
24934  * 8 doubles and adds (with qz=1)
24935  *
24936  * r     Resulting point.
24937  * k     Scalar to multiply by.
24938  * map   Indicates whether to convert result to affine.
24939  * ct    Constant time required.
24940  * heap  Heap to use for allocation.
24941  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
24942  */
sp_256_ecc_mulmod_base_4(sp_point_256 * r,const sp_digit * k,int map,int ct,void * heap)24943 static int sp_256_ecc_mulmod_base_4(sp_point_256* r, const sp_digit* k,
24944         int map, int ct, void* heap)
24945 {
24946     return sp_256_ecc_mulmod_stripe_4(r, &p256_base, p256_table,
24947                                       k, map, ct, heap);
24948 }
24949 
24950 #endif /* WC_NO_CACHE_RESISTANT */
24951 #else
24952 /* The index into pre-computation table to use. */
24953 static const uint8_t recode_index_4_7[130] = {
24954      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
24955     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
24956     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
24957     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
24958     64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49,
24959     48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33,
24960     32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
24961     16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
24962      0,  1,
24963 };
24964 
24965 /* Whether to negate y-ordinate. */
24966 static const uint8_t recode_neg_4_7[130] = {
24967      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
24968      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
24969      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
24970      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
24971      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
24972      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
24973      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
24974      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
24975      0,  0,
24976 };
24977 
24978 /* Recode the scalar for multiplication using pre-computed values and
24979  * subtraction.
24980  *
24981  * k  Scalar to multiply by.
24982  * v  Vector of operations to perform.
24983  */
sp_256_ecc_recode_7_4(const sp_digit * k,ecc_recode_256 * v)24984 static void sp_256_ecc_recode_7_4(const sp_digit* k, ecc_recode_256* v)
24985 {
24986     int i;
24987     int j;
24988     uint8_t y;
24989     int carry = 0;
24990     int o;
24991     sp_digit n;
24992 
24993     j = 0;
24994     n = k[j];
24995     o = 0;
24996     for (i=0; i<37; i++) {
24997         y = (int8_t)n;
24998         if (o + 7 < 64) {
24999             y &= 0x7f;
25000             n >>= 7;
25001             o += 7;
25002         }
25003         else if (o + 7 == 64) {
25004             n >>= 7;
25005             if (++j < 4)
25006                 n = k[j];
25007             o = 0;
25008         }
25009         else if (++j < 4) {
25010             n = k[j];
25011             y |= (uint8_t)((n << (64 - o)) & 0x7f);
25012             o -= 57;
25013             n >>= o;
25014         }
25015 
25016         y += (uint8_t)carry;
25017         v[i].i = recode_index_4_7[y];
25018         v[i].neg = recode_neg_4_7[y];
25019         carry = (y >> 7) + v[i].neg;
25020     }
25021 }
25022 
25023 #ifndef WC_NO_CACHE_RESISTANT
25024 /* Touch each possible entry that could be being copied.
25025  *
25026  * r      Point to copy into.
25027  * table  Table - start of the entires to access
25028  * idx    Index of entry to retrieve.
25029  */
sp_256_get_entry_65_4(sp_point_256 * r,const sp_table_entry_256 * table,int idx)25030 static void sp_256_get_entry_65_4(sp_point_256* r,
25031     const sp_table_entry_256* table, int idx)
25032 {
25033     int i;
25034     sp_digit mask;
25035 
25036     r->x[0] = 0;
25037     r->x[1] = 0;
25038     r->x[2] = 0;
25039     r->x[3] = 0;
25040     r->y[0] = 0;
25041     r->y[1] = 0;
25042     r->y[2] = 0;
25043     r->y[3] = 0;
25044     for (i = 1; i < 65; i++) {
25045         mask = 0 - (i == idx);
25046         r->x[0] |= mask & table[i].x[0];
25047         r->x[1] |= mask & table[i].x[1];
25048         r->x[2] |= mask & table[i].x[2];
25049         r->x[3] |= mask & table[i].x[3];
25050         r->y[0] |= mask & table[i].y[0];
25051         r->y[1] |= mask & table[i].y[1];
25052         r->y[2] |= mask & table[i].y[2];
25053         r->y[3] |= mask & table[i].y[3];
25054     }
25055 }
25056 #endif /* !WC_NO_CACHE_RESISTANT */
25057 static const sp_table_entry_256 p256_table[2405] = {
25058     /* 0 << 0 */
25059     { { 0x00, 0x00, 0x00, 0x00 },
25060       { 0x00, 0x00, 0x00, 0x00 } },
25061     /* 1 << 0 */
25062     { { 0x79e730d418a9143cL,0x75ba95fc5fedb601L,0x79fb732b77622510L,
25063         0x18905f76a53755c6L },
25064       { 0xddf25357ce95560aL,0x8b4ab8e4ba19e45cL,0xd2e88688dd21f325L,
25065         0x8571ff1825885d85L } },
25066     /* 2 << 0 */
25067     { { 0x850046d410ddd64dL,0xaa6ae3c1a433827dL,0x732205038d1490d9L,
25068         0xf6bb32e43dcf3a3bL },
25069       { 0x2f3648d361bee1a5L,0x152cd7cbeb236ff8L,0x19a8fb0e92042dbeL,
25070         0x78c577510a5b8a3bL } },
25071     /* 3 << 0 */
25072     { { 0xffac3f904eebc127L,0xb027f84a087d81fbL,0x66ad77dd87cbbc98L,
25073         0x26936a3fb6ff747eL },
25074       { 0xb04c5c1fc983a7ebL,0x583e47ad0861fe1aL,0x788208311a2ee98eL,
25075         0xd5f06a29e587cc07L } },
25076     /* 4 << 0 */
25077     { { 0x74b0b50d46918dccL,0x4650a6edc623c173L,0x0cdaacace8100af2L,
25078         0x577362f541b0176bL },
25079       { 0x2d96f24ce4cbaba6L,0x17628471fad6f447L,0x6b6c36dee5ddd22eL,
25080         0x84b14c394c5ab863L } },
25081     /* 5 << 0 */
25082     { { 0xbe1b8aaec45c61f5L,0x90ec649a94b9537dL,0x941cb5aad076c20cL,
25083         0xc9079605890523c8L },
25084       { 0xeb309b4ae7ba4f10L,0x73c568efe5eb882bL,0x3540a9877e7a1f68L,
25085         0x73a076bb2dd1e916L } },
25086     /* 6 << 0 */
25087     { { 0x403947373e77664aL,0x55ae744f346cee3eL,0xd50a961a5b17a3adL,
25088         0x13074b5954213673L },
25089       { 0x93d36220d377e44bL,0x299c2b53adff14b5L,0xf424d44cef639f11L,
25090         0xa4c9916d4a07f75fL } },
25091     /* 7 << 0 */
25092     { { 0x0746354ea0173b4fL,0x2bd20213d23c00f7L,0xf43eaab50c23bb08L,
25093         0x13ba5119c3123e03L },
25094       { 0x2847d0303f5b9d4dL,0x6742f2f25da67bddL,0xef933bdc77c94195L,
25095         0xeaedd9156e240867L } },
25096     /* 8 << 0 */
25097     { { 0x27f14cd19499a78fL,0x462ab5c56f9b3455L,0x8f90f02af02cfc6bL,
25098         0xb763891eb265230dL },
25099       { 0xf59da3a9532d4977L,0x21e3327dcf9eba15L,0x123c7b84be60bbf0L,
25100         0x56ec12f27706df76L } },
25101     /* 9 << 0 */
25102     { { 0x75c96e8f264e20e8L,0xabe6bfed59a7a841L,0x2cc09c0444c8eb00L,
25103         0xe05b3080f0c4e16bL },
25104       { 0x1eb7777aa45f3314L,0x56af7bedce5d45e3L,0x2b6e019a88b12f1aL,
25105         0x086659cdfd835f9bL } },
25106     /* 10 << 0 */
25107     { { 0x2c18dbd19dc21ec8L,0x98f9868a0fcf8139L,0x737d2cd648250b49L,
25108         0xcc61c94724b3428fL },
25109       { 0x0c2b407880dd9e76L,0xc43a8991383fbe08L,0x5f7d2d65779be5d2L,
25110         0x78719a54eb3b4ab5L } },
25111     /* 11 << 0 */
25112     { { 0xea7d260a6245e404L,0x9de407956e7fdfe0L,0x1ff3a4158dac1ab5L,
25113         0x3e7090f1649c9073L },
25114       { 0x1a7685612b944e88L,0x250f939ee57f61c8L,0x0c0daa891ead643dL,
25115         0x68930023e125b88eL } },
25116     /* 12 << 0 */
25117     { { 0x04b71aa7d2697768L,0xabdedef5ca345a33L,0x2409d29dee37385eL,
25118         0x4ee1df77cb83e156L },
25119       { 0x0cac12d91cbb5b43L,0x170ed2f6ca895637L,0x28228cfa8ade6d66L,
25120         0x7ff57c9553238acaL } },
25121     /* 13 << 0 */
25122     { { 0xccc425634b2ed709L,0x0e356769856fd30dL,0xbcbcd43f559e9811L,
25123         0x738477ac5395b759L },
25124       { 0x35752b90c00ee17fL,0x68748390742ed2e3L,0x7cd06422bd1f5bc1L,
25125         0xfbc08769c9e7b797L } },
25126     /* 14 << 0 */
25127     { { 0xa242a35bb0cf664aL,0x126e48f77f9707e3L,0x1717bf54c6832660L,
25128         0xfaae7332fd12c72eL },
25129       { 0x27b52db7995d586bL,0xbe29569e832237c2L,0xe8e4193e2a65e7dbL,
25130         0x152706dc2eaa1bbbL } },
25131     /* 15 << 0 */
25132     { { 0x72bcd8b7bc60055bL,0x03cc23ee56e27e4bL,0xee337424e4819370L,
25133         0xe2aa0e430ad3da09L },
25134       { 0x40b8524f6383c45dL,0xd766355442a41b25L,0x64efa6de778a4797L,
25135         0x2042170a7079adf4L } },
25136     /* 16 << 0 */
25137     { { 0x808b0b650bc6fb80L,0x5882e0753ffe2e6bL,0xd5ef2f7c2c83f549L,
25138         0x54d63c809103b723L },
25139       { 0xf2f11bd652a23f9bL,0x3670c3194b0b6587L,0x55c4623bb1580e9eL,
25140         0x64edf7b201efe220L } },
25141     /* 17 << 0 */
25142     { { 0x97091dcbd53c5c9dL,0xf17624b6ac0a177bL,0xb0f139752cfe2dffL,
25143         0xc1a35c0a6c7a574eL },
25144       { 0x227d314693e79987L,0x0575bf30e89cb80eL,0x2f4e247f0d1883bbL,
25145         0xebd512263274c3d0L } },
25146     /* 18 << 0 */
25147     { { 0x5f3e51c856ada97aL,0x4afc964d8f8b403eL,0xa6f247ab412e2979L,
25148         0x675abd1b6f80ebdaL },
25149       { 0x66a2bd725e485a1dL,0x4b2a5caf8f4f0b3cL,0x2626927f1b847bbaL,
25150         0x6c6fc7d90502394dL } },
25151     /* 19 << 0 */
25152     { { 0xfea912baa5659ae8L,0x68363aba25e1a16eL,0xb8842277752c41acL,
25153         0xfe545c282897c3fcL },
25154       { 0x2d36e9e7dc4c696bL,0x5806244afba977c5L,0x85665e9be39508c1L,
25155         0xf720ee256d12597bL } },
25156     /* 20 << 0 */
25157     { { 0x8a979129d2337a31L,0x5916868f0f862bdcL,0x048099d95dd283baL,
25158         0xe2d1eeb6fe5bfb4eL },
25159       { 0x82ef1c417884005dL,0xa2d4ec17ffffcbaeL,0x9161c53f8aa95e66L,
25160         0x5ee104e1c5fee0d0L } },
25161     /* 21 << 0 */
25162     { { 0x562e4cecc135b208L,0x74e1b2654783f47dL,0x6d2a506c5a3f3b30L,
25163         0xecead9f4c16762fcL },
25164       { 0xf29dd4b2e286e5b9L,0x1b0fadc083bb3c61L,0x7a75023e7fac29a4L,
25165         0xc086d5f1c9477fa3L } },
25166     /* 22 << 0 */
25167     { { 0x0fc611352f6f3076L,0xc99ffa23e3912a9aL,0x6a0b0685d2f8ba3dL,
25168         0xfdc777e8e93358a4L },
25169       { 0x94a787bb35415f04L,0x640c2d6a4d23fea4L,0x9de917da153a35b5L,
25170         0x793e8d075d5cd074L } },
25171     /* 23 << 0 */
25172     { { 0xf4f876532de45068L,0x37c7a7e89e2e1f6eL,0xd0825fa2a3584069L,
25173         0xaf2cea7c1727bf42L },
25174       { 0x0360a4fb9e4785a9L,0xe5fda49c27299f4aL,0x48068e1371ac2f71L,
25175         0x83d0687b9077666fL } },
25176     /* 24 << 0 */
25177     { { 0x6d3883b215d02819L,0x6d0d755040dd9a35L,0x61d7cbf91d2b469fL,
25178         0xf97b232f2efc3115L },
25179       { 0xa551d750b24bcbc7L,0x11ea494988a1e356L,0x7669f03193cb7501L,
25180         0x595dc55eca737b8aL } },
25181     /* 25 << 0 */
25182     { { 0xa4a319acd837879fL,0x6fc1b49eed6b67b0L,0xe395993332f1f3afL,
25183         0x966742eb65432a2eL },
25184       { 0x4b8dc9feb4966228L,0x96cc631243f43950L,0x12068859c9b731eeL,
25185         0x7b948dc356f79968L } },
25186     /* 26 << 0 */
25187     { { 0x61e4ad32ed1f8008L,0xe6c9267ad8b17538L,0x1ac7c5eb857ff6fbL,
25188         0x994baaa855f2fb10L },
25189       { 0x84cf14e11d248018L,0x5a39898b628ac508L,0x14fde97b5fa944f5L,
25190         0xed178030d12e5ac7L } },
25191     /* 27 << 0 */
25192     { { 0x042c2af497e2feb4L,0xd36a42d7aebf7313L,0x49d2c9eb084ffdd7L,
25193         0x9f8aa54b2ef7c76aL },
25194       { 0x9200b7ba09895e70L,0x3bd0c66fddb7fb58L,0x2d97d10878eb4cbbL,
25195         0x2d431068d84bde31L } },
25196     /* 28 << 0 */
25197     { { 0x4b523eb7172ccd1fL,0x7323cb2830a6a892L,0x97082ec0cfe153ebL,
25198         0xe97f6b6af2aadb97L },
25199       { 0x1d3d393ed1a83da1L,0xa6a7f9c7804b2a68L,0x4a688b482d0cb71eL,
25200         0xa9b4cc5f40585278L } },
25201     /* 29 << 0 */
25202     { { 0x5e5db46acb66e132L,0xf1be963a0d925880L,0x944a70270317b9e2L,
25203         0xe266f95948603d48L },
25204       { 0x98db66735c208899L,0x90472447a2fb18a3L,0x8a966939777c619fL,
25205         0x3798142a2a3be21bL } },
25206     /* 30 << 0 */
25207     { { 0xb4241cb13298b343L,0xa3a14e49b44f65a1L,0xc5f4d6cd3ac77acdL,
25208         0xd0288cb552b6fc3cL },
25209       { 0xd5cc8c2f1c040abcL,0xb675511e06bf9b4aL,0xd667da379b3aa441L,
25210         0x460d45ce51601f72L } },
25211     /* 31 << 0 */
25212     { { 0xe2f73c696755ff89L,0xdd3cf7e7473017e6L,0x8ef5689d3cf7600dL,
25213         0x948dc4f8b1fc87b4L },
25214       { 0xd9e9fe814ea53299L,0x2d921ca298eb6028L,0xfaecedfd0c9803fcL,
25215         0xf38ae8914d7b4745L } },
25216     /* 32 << 0 */
25217     { { 0xd8c5fccfc5e3a3d8L,0xbefd904c4079dfbfL,0xbc6d6a58fead0197L,
25218         0x39227077695532a4L },
25219       { 0x09e23e6ddbef42f5L,0x7e449b64480a9908L,0x7b969c1aad9a2e40L,
25220         0x6231d7929591c2a4L } },
25221     /* 33 << 0 */
25222     { { 0x871514560f664534L,0x85ceae7c4b68f103L,0xac09c4ae65578ab9L,
25223         0x33ec6868f044b10cL },
25224       { 0x6ac4832b3a8ec1f1L,0x5509d1285847d5efL,0xf909604f763f1574L,
25225         0xb16c4303c32f63c4L } },
25226     /* 34 << 0 */
25227     { { 0xb6ab20147ca23cd3L,0xcaa7a5c6a391849dL,0x5b0673a375678d94L,
25228         0xc982ddd4dd303e64L },
25229       { 0xfd7b000b5db6f971L,0xbba2cb1f6f876f92L,0xc77332a33c569426L,
25230         0xa159100c570d74f8L } },
25231     /* 35 << 0 */
25232     { { 0xfd16847fdec67ef5L,0x742ee464233e76b7L,0x0b8e4134efc2b4c8L,
25233         0xca640b8642a3e521L },
25234       { 0x653a01908ceb6aa9L,0x313c300c547852d5L,0x24e4ab126b237af7L,
25235         0x2ba901628bb47af8L } },
25236     /* 36 << 0 */
25237     { { 0x3d5e58d6a8219bb7L,0xc691d0bd1b06c57fL,0x0ae4cb10d257576eL,
25238         0x3569656cd54a3dc3L },
25239       { 0xe5ebaebd94cda03aL,0x934e82d3162bfe13L,0x450ac0bae251a0c6L,
25240         0x480b9e11dd6da526L } },
25241     /* 37 << 0 */
25242     { { 0x00467bc58cce08b5L,0xb636458c7f178d55L,0xc5748baea677d806L,
25243         0x2763a387dfa394ebL },
25244       { 0xa12b448a7d3cebb6L,0xe7adda3e6f20d850L,0xf63ebce51558462cL,
25245         0x58b36143620088a8L } },
25246     /* 38 << 0 */
25247     { { 0x8a2cc3ca4d63c0eeL,0x512331170fe948ceL,0x7463fd85222ef33bL,
25248         0xadf0c7dc7c603d6cL },
25249       { 0x0ec32d3bfe7765e5L,0xccaab359bf380409L,0xbdaa84d68e59319cL,
25250         0xd9a4c2809c80c34dL } },
25251     /* 39 << 0 */
25252     { { 0xa9d89488a059c142L,0x6f5ae714ff0b9346L,0x068f237d16fb3664L,
25253         0x5853e4c4363186acL },
25254       { 0xe2d87d2363c52f98L,0x2ec4a76681828876L,0x47b864fae14e7b1cL,
25255         0x0c0bc0e569192408L } },
25256     /* 40 << 0 */
25257     { { 0xe4d7681db82e9f3eL,0x83200f0bdf25e13cL,0x8909984c66f27280L,
25258         0x462d7b0075f73227L },
25259       { 0xd90ba188f2651798L,0x74c6e18c36ab1c34L,0xab256ea35ef54359L,
25260         0x03466612d1aa702fL } },
25261     /* 41 << 0 */
25262     { { 0x624d60492ed22e91L,0x6fdfe0b56f072822L,0xeeca111539ce2271L,
25263         0x98100a4fdb01614fL },
25264       { 0xb6b0daa2a35c628fL,0xb6f94d2ec87e9a47L,0xc67732591d57d9ceL,
25265         0xf70bfeec03884a7bL } },
25266     /* 42 << 0 */
25267     { { 0x5fb35ccfed2bad01L,0xa155cbe31da6a5c7L,0xc2e2594c30a92f8fL,
25268         0x649c89ce5bfafe43L },
25269       { 0xd158667de9ff257aL,0x9b359611f32c50aeL,0x4b00b20b906014cfL,
25270         0xf3a8cfe389bc7d3dL } },
25271     /* 43 << 0 */
25272     { { 0x4ff23ffd248a7d06L,0x80c5bfb4878873faL,0xb7d9ad9005745981L,
25273         0x179c85db3db01994L },
25274       { 0xba41b06261a6966cL,0x4d82d052eadce5a8L,0x9e91cd3ba5e6a318L,
25275         0x47795f4f95b2dda0L } },
25276     /* 44 << 0 */
25277     { { 0xecfd7c1fd55a897cL,0x009194abb29110fbL,0x5f0e2046e381d3b0L,
25278         0x5f3425f6a98dd291L },
25279       { 0xbfa06687730d50daL,0x0423446c4b083b7fL,0x397a247dd69d3417L,
25280         0xeb629f90387ba42aL } },
25281     /* 45 << 0 */
25282     { { 0x1ee426ccd5cd79bfL,0x0032940b946c6e18L,0x1b1e8ae057477f58L,
25283         0xe94f7d346d823278L },
25284       { 0xc747cb96782ba21aL,0xc5254469f72b33a5L,0x772ef6dec7f80c81L,
25285         0xd73acbfe2cd9e6b5L } },
25286     /* 46 << 0 */
25287     { { 0x4075b5b149ee90d9L,0x785c339aa06e9ebaL,0xa1030d5babf825e0L,
25288         0xcec684c3a42931dcL },
25289       { 0x42ab62c9c1586e63L,0x45431d665ab43f2bL,0x57c8b2c055f7835dL,
25290         0x033da338c1b7f865L } },
25291     /* 47 << 0 */
25292     { { 0x283c7513caa76097L,0x0a624fa936c83906L,0x6b20afec715af2c7L,
25293         0x4b969974eba78bfdL },
25294       { 0x220755ccd921d60eL,0x9b944e107baeca13L,0x04819d515ded93d4L,
25295         0x9bbff86e6dddfd27L } },
25296     /* 48 << 0 */
25297     { { 0x6b34413077adc612L,0xa7496529bbd803a0L,0x1a1baaa76d8805bdL,
25298         0xc8403902470343adL },
25299       { 0x39f59f66175adff1L,0x0b26d7fbb7d8c5b7L,0xa875f5ce529d75e3L,
25300         0x85efc7e941325cc2L } },
25301     /* 49 << 0 */
25302     { { 0x21950b421ff6acd3L,0xffe7048453dc6909L,0xff4cd0b228766127L,
25303         0xabdbe6084fb7db2bL },
25304       { 0x837c92285e1109e8L,0x26147d27f4645b5aL,0x4d78f592f7818ed8L,
25305         0xd394077ef247fa36L } },
25306     /* 50 << 0 */
25307     { { 0x0fb9c2d0488c171aL,0xa78bfbaa13685278L,0xedfbe268d5b1fa6aL,
25308         0x0dceb8db2b7eaba7L },
25309       { 0xbf9e80899ae2b710L,0xefde7ae6a4449c96L,0x43b7716bcc143a46L,
25310         0xd7d34194c3628c13L } },
25311     /* 51 << 0 */
25312     { { 0x508cec1c3b3f64c9L,0xe20bc0ba1e5edf3fL,0xda1deb852f4318d4L,
25313         0xd20ebe0d5c3fa443L },
25314       { 0x370b4ea773241ea3L,0x61f1511c5e1a5f65L,0x99a5e23d82681c62L,
25315         0xd731e383a2f54c2dL } },
25316     /* 52 << 0 */
25317     { { 0x2692f36e83445904L,0x2e0ec469af45f9c0L,0x905a3201c67528b7L,
25318         0x88f77f34d0e5e542L },
25319       { 0xf67a8d295864687cL,0x23b92eae22df3562L,0x5c27014b9bbec39eL,
25320         0x7ef2f2269c0f0f8dL } },
25321     /* 53 << 0 */
25322     { { 0x97359638546c4d8dL,0x5f9c3fc492f24679L,0x912e8beda8c8acd9L,
25323         0xec3a318d306634b0L },
25324       { 0x80167f41c31cb264L,0x3db82f6f522113f2L,0xb155bcd2dcafe197L,
25325         0xfba1da5943465283L } },
25326     /* 54 << 0 */
25327     { { 0xa0425b8eb212cf53L,0x4f2e512ef8557c5fL,0xc1286ff925c4d56cL,
25328         0xbb8a0feaee26c851L },
25329       { 0xc28f70d2e7d6107eL,0x7ee0c444e76265aaL,0x3df277a41d1936b1L,
25330         0x1a556e3fea9595ebL } },
25331     /* 55 << 0 */
25332     { { 0x258bbbf9e7305683L,0x31eea5bf07ef5be6L,0x0deb0e4a46c814c1L,
25333         0x5cee8449a7b730ddL },
25334       { 0xeab495c5a0182bdeL,0xee759f879e27a6b4L,0xc2cf6a6880e518caL,
25335         0x25e8013ff14cf3f4L } },
25336     /* 56 << 0 */
25337     { { 0x8fc441407e8d7a14L,0xbb1ff3ca9556f36aL,0x6a84438514600044L,
25338         0xba3f0c4a7451ae63L },
25339       { 0xdfcac25b1f9af32aL,0x01e0db86b1f2214bL,0x4e9a5bc2a4b596acL,
25340         0x83927681026c2c08L } },
25341     /* 57 << 0 */
25342     { { 0x3ec832e77acaca28L,0x1bfeea57c7385b29L,0x068212e3fd1eaf38L,
25343         0xc13298306acf8cccL },
25344       { 0xb909f2db2aac9e59L,0x5748060db661782aL,0xc5ab2632c79b7a01L,
25345         0xda44c6c600017626L } },
25346     /* 58 << 0 */
25347     { { 0xf26c00e8a7ea82f0L,0x99cac80de4299aafL,0xd66fe3b67ed78be1L,
25348         0x305f725f648d02cdL },
25349       { 0x33ed1bc4623fb21bL,0xfa70533e7a6319adL,0x17ab562dbe5ffb3eL,
25350         0x0637499456674741L } },
25351     /* 59 << 0 */
25352     { { 0x69d44ed65c46aa8eL,0x2100d5d3a8d063d1L,0xcb9727eaa2d17c36L,
25353         0x4c2bab1b8add53b7L },
25354       { 0xa084e90c15426704L,0x778afcd3a837ebeaL,0x6651f7017ce477f8L,
25355         0xa062499846fb7a8bL } },
25356     /* 60 << 0 */
25357     { { 0xdc1e6828ed8a6e19L,0x33fc23364189d9c7L,0x026f8fe2671c39bcL,
25358         0xd40c4ccdbc6f9915L },
25359       { 0xafa135bbf80e75caL,0x12c651a022adff2cL,0xc40a04bd4f51ad96L,
25360         0x04820109bbe4e832L } },
25361     /* 61 << 0 */
25362     { { 0x3667eb1a7f4c04ccL,0x59556621a9404f84L,0x71cdf6537eceb50aL,
25363         0x994a44a69b8335faL },
25364       { 0xd7faf819dbeb9b69L,0x473c5680eed4350dL,0xb6658466da44bba2L,
25365         0x0d1bc780872bdbf3L } },
25366     /* 62 << 0 */
25367     { { 0xe535f175a1962f91L,0x6ed7e061ed58f5a7L,0x177aa4c02089a233L,
25368         0x0dbcb03ae539b413L },
25369       { 0xe3dc424ebb32e38eL,0x6472e5ef6806701eL,0xdd47ff98814be9eeL,
25370         0x6b60cfff35ace009L } },
25371     /* 63 << 0 */
25372     { { 0xb8d3d9319ff91fe5L,0x039c4800f0518eedL,0x95c376329182cb26L,
25373         0x0763a43482fc568dL },
25374       { 0x707c04d5383e76baL,0xac98b930824e8197L,0x92bf7c8f91230de0L,
25375         0x90876a0140959b70L } },
25376     /* 64 << 0 */
25377     { { 0xdb6d96f305968b80L,0x380a0913089f73b9L,0x7da70b83c2c61e01L,
25378         0x95fb8394569b38c7L },
25379       { 0x9a3c651280edfe2fL,0x8f726bb98faeaf82L,0x8010a4a078424bf8L,
25380         0x296720440e844970L } },
25381     /* 0 << 7 */
25382     { { 0x00, 0x00, 0x00, 0x00 },
25383       { 0x00, 0x00, 0x00, 0x00 } },
25384     /* 1 << 7 */
25385     { { 0x63c5cb817a2ad62aL,0x7ef2b6b9ac62ff54L,0x3749bba4b3ad9db5L,
25386         0xad311f2c46d5a617L },
25387       { 0xb77a8087c2ff3b6dL,0xb46feaf3367834ffL,0xf8aa266d75d6b138L,
25388         0xfa38d320ec008188L } },
25389     /* 2 << 7 */
25390     { { 0x486d8ffa696946fcL,0x50fbc6d8b9cba56dL,0x7e3d423e90f35a15L,
25391         0x7c3da195c0dd962cL },
25392       { 0xe673fdb03cfd5d8bL,0x0704b7c2889dfca5L,0xf6ce581ff52305aaL,
25393         0x399d49eb914d5e53L } },
25394     /* 3 << 7 */
25395     { { 0x380a496d6ec293cdL,0x733dbda78e7051f5L,0x037e388db849140aL,
25396         0xee4b32b05946dbf6L },
25397       { 0xb1c4fda9cae368d1L,0x5001a7b0fdb0b2f3L,0x6df593742e3ac46eL,
25398         0x4af675f239b3e656L } },
25399     /* 4 << 7 */
25400     { { 0x44e3811039949296L,0x5b63827b361db1b5L,0x3e5323ed206eaff5L,
25401         0x942370d2c21f4290L },
25402       { 0xf2caaf2ee0d985a1L,0x192cc64b7239846dL,0x7c0b8f47ae6312f8L,
25403         0x7dc61f9196620108L } },
25404     /* 5 << 7 */
25405     { { 0xb830fb5bc2da7de9L,0xd0e643df0ff8d3beL,0x31ee77ba188a9641L,
25406         0x4e8aa3aabcf6d502L },
25407       { 0xf9fb65329a49110fL,0xd18317f62dd6b220L,0x7e3ced4152c3ea5aL,
25408         0x0d296a147d579c4aL } },
25409     /* 6 << 7 */
25410     { { 0x35d6a53eed4c3717L,0x9f8240cf3d0ed2a3L,0x8c0d4d05e5543aa5L,
25411         0x45d5bbfbdd33b4b4L },
25412       { 0xfa04cc73137fd28eL,0x862ac6efc73b3ffdL,0x403ff9f531f51ef2L,
25413         0x34d5e0fcbc73f5a2L } },
25414     /* 7 << 7 */
25415     { { 0xf252682008913f4fL,0xea20ed61eac93d95L,0x51ed38b46ca6b26cL,
25416         0x8662dcbcea4327b0L },
25417       { 0x6daf295c725d2aaaL,0xbad2752f8e52dcdaL,0x2210e7210b17daccL,
25418         0xa37f7912d51e8232L } },
25419     /* 8 << 7 */
25420     { { 0x4f7081e144cc3addL,0xd5ffa1d687be82cfL,0x89890b6c0edd6472L,
25421         0xada26e1a3ed17863L },
25422       { 0x276f271563483caaL,0xe6924cd92f6077fdL,0x05a7fe980a466e3cL,
25423         0xf1c794b0b1902d1fL } },
25424     /* 9 << 7 */
25425     { { 0xe521368882a8042cL,0xd931cfafcd278298L,0x069a0ae0f597a740L,
25426         0x0adbb3f3eb59107cL },
25427       { 0x983e951e5eaa8eb8L,0xe663a8b511b48e78L,0x1631cc0d8a03f2c5L,
25428         0x7577c11e11e271e2L } },
25429     /* 10 << 7 */
25430     { { 0x33b2385c08369a90L,0x2990c59b190eb4f8L,0x819a6145c68eac80L,
25431         0x7a786d622ec4a014L },
25432       { 0x33faadbe20ac3a8dL,0x31a217815aba2d30L,0x209d2742dba4f565L,
25433         0xdb2ce9e355aa0fbbL } },
25434     /* 11 << 7 */
25435     { { 0x8cef334b168984dfL,0xe81dce1733879638L,0xf6e6949c263720f0L,
25436         0x5c56feaff593cbecL },
25437       { 0x8bff5601fde58c84L,0x74e241172eccb314L,0xbcf01b614c9a8a78L,
25438         0xa233e35e544c9868L } },
25439     /* 12 << 7 */
25440     { { 0xb3156bf38bd7aff1L,0x1b5ee4cb1d81b146L,0x7ba1ac41d628a915L,
25441         0x8f3a8f9cfd89699eL },
25442       { 0x7329b9c9a0748be7L,0x1d391c95a92e621fL,0xe51e6b214d10a837L,
25443         0xd255f53a4947b435L } },
25444     /* 13 << 7 */
25445     { { 0x07669e04f1788ee3L,0xc14f27afa86938a2L,0x8b47a334e93a01c0L,
25446         0xff627438d9366808L },
25447       { 0x7a0985d8ca2a5965L,0x3d9a5542d6e9b9b3L,0xc23eb80b4cf972e8L,
25448         0x5c1c33bb4fdf72fdL } },
25449     /* 14 << 7 */
25450     { { 0x0c4a58d474a86108L,0xf8048a8fee4c5d90L,0xe3c7c924e86d4c80L,
25451         0x28c889de056a1e60L },
25452       { 0x57e2662eb214a040L,0xe8c48e9837e10347L,0x8774286280ac748aL,
25453         0xf1c24022186b06f2L } },
25454     /* 15 << 7 */
25455     { { 0xac2dd4c35f74040aL,0x409aeb71fceac957L,0x4fbad78255c4ec23L,
25456         0xb359ed618a7b76ecL },
25457       { 0x12744926ed6f4a60L,0xe21e8d7f4b912de3L,0xe2575a59fc705a59L,
25458         0x72f1d4deed2dbc0eL } },
25459     /* 16 << 7 */
25460     { { 0x3d2b24b9eb7926b8L,0xbff88cb3cdbe5509L,0xd0f399afe4dd640bL,
25461         0x3c5fe1302f76ed45L },
25462       { 0x6f3562f43764fb3dL,0x7b5af3183151b62dL,0xd5bd0bc7d79ce5f3L,
25463         0xfdaf6b20ec66890fL } },
25464     /* 17 << 7 */
25465     { { 0x735c67ec6063540cL,0x50b259c2e5f9cb8fL,0xb8734f9a3f99c6abL,
25466         0xf8cc13d5a3a7bc85L },
25467       { 0x80c1b305c5217659L,0xfe5364d44ec12a54L,0xbd87045e681345feL,
25468         0x7f8efeb1582f897fL } },
25469     /* 18 << 7 */
25470     { { 0xe8cbf1e5d5923359L,0xdb0cea9d539b9fb0L,0x0c5b34cf49859b98L,
25471         0x5e583c56a4403cc6L },
25472       { 0x11fc1a2dd48185b7L,0xc93fbc7e6e521787L,0x47e7a05805105b8bL,
25473         0x7b4d4d58db8260c8L } },
25474     /* 19 << 7 */
25475     { { 0xe33930b046eb842aL,0x8e844a9a7bdae56dL,0x34ef3a9e13f7fdfcL,
25476         0xb3768f82636ca176L },
25477       { 0x2821f4e04e09e61cL,0x414dc3a1a0c7cddcL,0xd537943754945fcdL,
25478         0x151b6eefb3555ff1L } },
25479     /* 20 << 7 */
25480     { { 0xb31bd6136339c083L,0x39ff8155dfb64701L,0x7c3388d2e29604abL,
25481         0x1e19084ba6b10442L },
25482       { 0x17cf54c0eccd47efL,0x896933854a5dfb30L,0x69d023fb47daf9f6L,
25483         0x9222840b7d91d959L } },
25484     /* 21 << 7 */
25485     { { 0x439108f5803bac62L,0x0b7dd91d379bd45fL,0xd651e827ca63c581L,
25486         0x5c5d75f6509c104fL },
25487       { 0x7d5fc7381f2dc308L,0x20faa7bfd98454beL,0x95374beea517b031L,
25488         0xf036b9b1642692acL } },
25489     /* 22 << 7 */
25490     { { 0xc510610939842194L,0xb7e2353e49d05295L,0xfc8c1d5cefb42ee0L,
25491         0xe04884eb08ce811cL },
25492       { 0xf1f75d817419f40eL,0x5b0ac162a995c241L,0x120921bbc4c55646L,
25493         0x713520c28d33cf97L } },
25494     /* 23 << 7 */
25495     { { 0xb4a65a5ce98c5100L,0x6cec871d2ddd0f5aL,0x251f0b7f9ba2e78bL,
25496         0x224a8434ce3a2a5fL },
25497       { 0x26827f6125f5c46fL,0x6a22bedc48545ec0L,0x25ae5fa0b1bb5cdcL,
25498         0xd693682ffcb9b98fL } },
25499     /* 24 << 7 */
25500     { { 0x32027fe891e5d7d3L,0xf14b7d1773a07678L,0xf88497b3c0dfdd61L,
25501         0xf7c2eec02a8c4f48L },
25502       { 0xaa5573f43756e621L,0xc013a2401825b948L,0x1c03b34563878572L,
25503         0xa0472bea653a4184L } },
25504     /* 25 << 7 */
25505     { { 0xf4222e270ac69a80L,0x34096d25f51e54f6L,0x00a648cb8fffa591L,
25506         0x4e87acdc69b6527fL },
25507       { 0x0575e037e285ccb4L,0x188089e450ddcf52L,0xaa96c9a8870ff719L,
25508         0x74a56cd81fc7e369L } },
25509     /* 26 << 7 */
25510     { { 0x41d04ee21726931aL,0x0bbbb2c83660ecfdL,0xa6ef6de524818e18L,
25511         0xe421cc51e7d57887L },
25512       { 0xf127d208bea87be6L,0x16a475d3b1cdd682L,0x9db1b684439b63f7L,
25513         0x5359b3dbf0f113b6L } },
25514     /* 27 << 7 */
25515     { { 0xdfccf1de8bf06e31L,0x1fdf8f44dd383901L,0x10775cad5017e7d2L,
25516         0xdfc3a59758d11eefL },
25517       { 0x6ec9c8a0b1ecff10L,0xee6ed6cc28400549L,0xb5ad7bae1b4f8d73L,
25518         0x61b4f11de00aaab9L } },
25519     /* 28 << 7 */
25520     { { 0x7b32d69bd4eff2d7L,0x88ae67714288b60fL,0x159461b437a1e723L,
25521         0x1f3d4789570aae8cL },
25522       { 0x869118c07f9871daL,0x35fbda78f635e278L,0x738f3641e1541dacL,
25523         0x6794b13ac0dae45fL } },
25524     /* 29 << 7 */
25525     { { 0x065064ac09cc0917L,0x27c53729c68540fdL,0x0d2d4c8eef227671L,
25526         0xd23a9f80a1785a04L },
25527       { 0x98c5952852650359L,0xfa09ad0174a1acadL,0x082d5a290b55bf5cL,
25528         0xa40f1c67419b8084L } },
25529     /* 30 << 7 */
25530     { { 0x3a5c752edcc18770L,0x4baf1f2f8825c3a5L,0xebd63f7421b153edL,
25531         0xa2383e47b2f64723L },
25532       { 0xe7bf620a2646d19aL,0x56cb44ec03c83ffdL,0xaf7267c94f6be9f1L,
25533         0x8b2dfd7bc06bb5e9L } },
25534     /* 31 << 7 */
25535     { { 0xb87072f2a672c5c7L,0xeacb11c80d53c5e2L,0x22dac29dff435932L,
25536         0x37bdb99d4408693cL },
25537       { 0xf6e62fb62899c20fL,0x3535d512447ece24L,0xfbdc6b88ff577ce3L,
25538         0x726693bd190575f2L } },
25539     /* 32 << 7 */
25540     { { 0x6772b0e5ab4b35a2L,0x1d8b6001f5eeaacfL,0x728f7ce4795b9580L,
25541         0x4a20ed2a41fb81daL },
25542       { 0x9f685cd44fec01e6L,0x3ed7ddcca7ff50adL,0x460fd2640c2d97fdL,
25543         0x3a241426eb82f4f9L } },
25544     /* 33 << 7 */
25545     { { 0x17d1df2c6a8ea820L,0xb2b50d3bf22cc254L,0x03856cbab7291426L,
25546         0x87fd26ae04f5ee39L },
25547       { 0x9cb696cc02bee4baL,0x5312180406820fd6L,0xa5dfc2690212e985L,
25548         0x666f7ffa160f9a09L } },
25549     /* 34 << 7 */
25550     { { 0xc503cd33bccd9617L,0x365dede4ba7730a3L,0x798c63555ddb0786L,
25551         0xa6c3200efc9cd3bcL },
25552       { 0x060ffb2ce5e35efdL,0x99a4e25b5555a1c1L,0x11d95375f70b3751L,
25553         0x0a57354a160e1bf6L } },
25554     /* 35 << 7 */
25555     { { 0xecb3ae4bf8e4b065L,0x07a834c42e53022bL,0x1cd300b38692ed96L,
25556         0x16a6f79261ee14ecL },
25557       { 0x8f1063c66a8649edL,0xfbcdfcfe869f3e14L,0x2cfb97c100a7b3ecL,
25558         0xcea49b3c7130c2f1L } },
25559     /* 36 << 7 */
25560     { { 0x462d044fe9d96488L,0x4b53d52e8182a0c1L,0x84b6ddd30391e9e9L,
25561         0x80ab7b48b1741a09L },
25562       { 0xec0e15d427d3317fL,0x8dfc1ddb1a64671eL,0x93cc5d5fd49c5b92L,
25563         0xc995d53d3674a331L } },
25564     /* 37 << 7 */
25565     { { 0x302e41ec090090aeL,0x2278a0ccedb06830L,0x1d025932fbc99690L,
25566         0x0c32fbd2b80d68daL },
25567       { 0xd79146daf341a6c1L,0xae0ba1391bef68a0L,0xc6b8a5638d774b3aL,
25568         0x1cf307bd880ba4d7L } },
25569     /* 38 << 7 */
25570     { { 0xc033bdc719803511L,0xa9f97b3b8888c3beL,0x3d68aebc85c6d05eL,
25571         0xc3b88a9d193919ebL },
25572       { 0x2d300748c48b0ee3L,0x7506bc7c07a746c1L,0xfc48437c6e6d57f3L,
25573         0x5bd71587cfeaa91aL } },
25574     /* 39 << 7 */
25575     { { 0xa4ed0408c1bc5225L,0xd0b946db2719226dL,0x109ecd62758d2d43L,
25576         0x75c8485a2751759bL },
25577       { 0xb0b75f499ce4177aL,0x4fa61a1e79c10c3dL,0xc062d300a167fcd7L,
25578         0x4df3874c750f0fa8L } },
25579     /* 40 << 7 */
25580     { { 0x29ae2cf983dfedc9L,0xf84371348d87631aL,0xaf5717117429c8d2L,
25581         0x18d15867146d9272L },
25582       { 0x83053ecf69769bb7L,0xc55eb856c479ab82L,0x5ef7791c21b0f4b2L,
25583         0xaa5956ba3d491525L } },
25584     /* 41 << 7 */
25585     { { 0x407a96c29fe20ebaL,0xf27168bbe52a5ad3L,0x43b60ab3bf1d9d89L,
25586         0xe45c51ef710e727aL },
25587       { 0xdfca5276099b4221L,0x8dc6407c2557a159L,0x0ead833591035895L,
25588         0x0a9db9579c55dc32L } },
25589     /* 42 << 7 */
25590     { { 0xe40736d3df61bc76L,0x13a619c03f778cdbL,0x6dd921a4c56ea28fL,
25591         0x76a524332fa647b4L },
25592       { 0x23591891ac5bdc5dL,0xff4a1a72bac7dc01L,0x9905e26162df8453L,
25593         0x3ac045dfe63b265fL } },
25594     /* 43 << 7 */
25595     { { 0x8a3f341bad53dba7L,0x8ec269cc837b625aL,0xd71a27823ae31189L,
25596         0x8fb4f9a355e96120L },
25597       { 0x804af823ff9875cfL,0x23224f575d442a9bL,0x1c4d3b9eecc62679L,
25598         0x91da22fba0e7ddb1L } },
25599     /* 44 << 7 */
25600     { { 0xa370324d6c04a661L,0x9710d3b65e376d17L,0xed8c98f03044e357L,
25601         0xc364ebbe6422701cL },
25602       { 0x347f5d517733d61cL,0xd55644b9cea826c3L,0x80c6e0ad55a25548L,
25603         0x0aa7641d844220a7L } },
25604     /* 45 << 7 */
25605     { { 0x1438ec8131810660L,0x9dfa6507de4b4043L,0x10b515d8cc3e0273L,
25606         0x1b6066dd28d8cfb2L },
25607       { 0xd3b045919c9efebdL,0x425d4bdfa21c1ff4L,0x5fe5af19d57607d3L,
25608         0xbbf773f754481084L } },
25609     /* 46 << 7 */
25610     { { 0x8435bd6994b03ed1L,0xd9ad1de3634cc546L,0x2cf423fc00e420caL,
25611         0xeed26d80a03096ddL },
25612       { 0xd7f60be7a4db09d2L,0xf47f569d960622f7L,0xe5925fd77296c729L,
25613         0xeff2db2626ca2715L } },
25614     /* 47 << 7 */
25615     { { 0xa6fcd014b913e759L,0x53da47868ff4de93L,0x14616d79c32068e1L,
25616         0xb187d664ccdf352eL },
25617       { 0xf7afb6501dc90b59L,0x8170e9437daa1b26L,0xc8e3bdd8700c0a84L,
25618         0x6e8d345f6482bdfaL } },
25619     /* 48 << 7 */
25620     { { 0x84cfbfa1c5c5ea50L,0xd3baf14c67960681L,0x263984030dd50942L,
25621         0xe4b7839c4716a663L },
25622       { 0xd5f1f794e7de6dc0L,0x5cd0f4d4622aa7ceL,0x5295f3f159acfeecL,
25623         0x8d933552953e0607L } },
25624     /* 49 << 7 */
25625     { { 0xc7db8ec5776c5722L,0xdc467e622b5f290cL,0xd4297e704ff425a9L,
25626         0x4be924c10cf7bb72L },
25627       { 0x0d5dc5aea1892131L,0x8bf8a8e3a705c992L,0x73a0b0647a305ac5L,
25628         0x00c9ca4e9a8c77a8L } },
25629     /* 50 << 7 */
25630     { { 0x5dfee80f83774bddL,0x6313160285734485L,0xa1b524ae914a69a9L,
25631         0xebc2ffafd4e300d7L },
25632       { 0x52c93db77cfa46a5L,0x71e6161f21653b50L,0x3574fc57a4bc580aL,
25633         0xc09015dde1bc1253L } },
25634     /* 51 << 7 */
25635     { { 0x4b7b47b2d174d7aaL,0x4072d8e8f3a15d04L,0xeeb7d47fd6fa07edL,
25636         0x6f2b9ff9edbdafb1L },
25637       { 0x18c516153760fe8aL,0x7a96e6bff06c6c13L,0x4d7a04100ea2d071L,
25638         0xa1914e9b0be2a5ceL } },
25639     /* 52 << 7 */
25640     { { 0x5726e357d8a3c5cfL,0x1197ecc32abb2b13L,0x6c0d7f7f31ae88ddL,
25641         0x15b20d1afdbb3efeL },
25642       { 0xcd06aa2670584039L,0x2277c969a7dc9747L,0xbca695877855d815L,
25643         0x899ea2385188b32aL } },
25644     /* 53 << 7 */
25645     { { 0x37d9228b760c1c9dL,0xc7efbb119b5c18daL,0x7f0d1bc819f6dbc5L,
25646         0x4875384b07e6905bL },
25647       { 0xc7c50baa3ba8cd86L,0xb0ce40fbc2905de0L,0x708406737a231952L,
25648         0xa912a262cf43de26L } },
25649     /* 54 << 7 */
25650     { { 0x9c38ddcceb5b76c1L,0x746f528526fc0ab4L,0x52a63a50d62c269fL,
25651         0x60049c5599458621L },
25652       { 0xe7f48f823c2f7c9eL,0x6bd99043917d5cf3L,0xeb1317a88701f469L,
25653         0xbd3fe2ed9a449fe0L } },
25654     /* 55 << 7 */
25655     { { 0x421e79ca12ef3d36L,0x9ee3c36c3e7ea5deL,0xe48198b5cdff36f7L,
25656         0xaff4f967c6b82228L },
25657       { 0x15e19dd0c47adb7eL,0x45699b23032e7dfaL,0x40680c8b1fae026aL,
25658         0x5a347a48550dbf4dL } },
25659     /* 56 << 7 */
25660     { { 0xe652533b3cef0d7dL,0xd94f7b182bbb4381L,0x838752be0e80f500L,
25661         0x8e6e24889e9c9bfbL },
25662       { 0xc975169716caca6aL,0x866c49d838531ad9L,0xc917e2397151ade1L,
25663         0x2d016ec16037c407L } },
25664     /* 57 << 7 */
25665     { { 0xa407ccc900eac3f9L,0x835f6280e2ed4748L,0xcc54c3471cc98e0dL,
25666         0x0e969937dcb572ebL },
25667       { 0x1b16c8e88f30c9cbL,0xa606ae75373c4661L,0x47aa689b35502cabL,
25668         0xf89014ae4d9bb64fL } },
25669     /* 58 << 7 */
25670     { { 0x202f6a9c31c71f7bL,0x01f95aa3296ffe5cL,0x5fc0601453cec3a3L,
25671         0xeb9912375f498a45L },
25672       { 0xae9a935e5d91ba87L,0xc6ac62810b564a19L,0x8a8fe81c3bd44e69L,
25673         0x7c8b467f9dd11d45L } },
25674     /* 59 << 7 */
25675     { { 0xf772251fea5b8e69L,0xaeecb3bdc5b75fbcL,0x1aca3331887ff0e5L,
25676         0xbe5d49ff19f0a131L },
25677       { 0x582c13aae5c8646fL,0xdbaa12e820e19980L,0x8f40f31af7abbd94L,
25678         0x1f13f5a81dfc7663L } },
25679     /* 60 << 7 */
25680     { { 0x5d81f1eeaceb4fc0L,0x362560025e6f0f42L,0x4b67d6d7751370c8L,
25681         0x2608b69803e80589L },
25682       { 0xcfc0d2fc05268301L,0xa6943d3940309212L,0x192a90c21fd0e1c2L,
25683         0xb209f11337f1dc76L } },
25684     /* 61 << 7 */
25685     { { 0xefcc5e0697bf1298L,0xcbdb6730219d639eL,0xd009c116b81e8c6fL,
25686         0xa3ffdde31a7ce2e5L },
25687       { 0xc53fbaaaa914d3baL,0x836d500f88df85eeL,0xd98dc71b66ee0751L,
25688         0x5a3d7005714516fdL } },
25689     /* 62 << 7 */
25690     { { 0x21d3634d39eedbbaL,0x35cd2e680455a46dL,0xc8cafe65f9d7eb0cL,
25691         0xbda3ce9e00cefb3eL },
25692       { 0xddc17a602c9cf7a4L,0x01572ee47bcb8773L,0xa92b2b018c7548dfL,
25693         0x732fd309a84600e3L } },
25694     /* 63 << 7 */
25695     { { 0xe22109c716543a40L,0x9acafd36fede3c6cL,0xfb2068526824e614L,
25696         0x2a4544a9da25dca0L },
25697       { 0x2598526291d60b06L,0x281b7be928753545L,0xec667b1a90f13b27L,
25698         0x33a83aff940e2eb4L } },
25699     /* 64 << 7 */
25700     { { 0x80009862d5d721d5L,0x0c3357a35bd3a182L,0x27f3a83b7aa2cda4L,
25701         0xb58ae74ef6f83085L },
25702       { 0x2a911a812e6dad6bL,0xde286051f43d6c5bL,0x4bdccc41f996c4d8L,
25703         0xe7312ec00ae1e24eL } },
25704     /* 0 << 14 */
25705     { { 0x00, 0x00, 0x00, 0x00 },
25706       { 0x00, 0x00, 0x00, 0x00 } },
25707     /* 1 << 14 */
25708     { { 0xf8d112e76e6485b3L,0x4d3e24db771c52f8L,0x48e3ee41684a2f6dL,
25709         0x7161957d21d95551L },
25710       { 0x19631283cdb12a6cL,0xbf3fa8822e50e164L,0xf6254b633166cc73L,
25711         0x3aefa7aeaee8cc38L } },
25712     /* 2 << 14 */
25713     { { 0x79b0fe623b36f9fdL,0x26543b23fde19fc0L,0x136e64a0958482efL,
25714         0x23f637719b095825L },
25715       { 0x14cfd596b6a1142eL,0x5ea6aac6335aac0bL,0x86a0e8bdf3081dd5L,
25716         0x5fb89d79003dc12aL } },
25717     /* 3 << 14 */
25718     { { 0xf615c33af72e34d4L,0x0bd9ea40110eec35L,0x1c12bc5bc1dea34eL,
25719         0x686584c949ae4699L },
25720       { 0x13ad95d38c97b942L,0x4609561a4e5c7562L,0x9e94a4aef2737f89L,
25721         0xf57594c6371c78b6L } },
25722     /* 4 << 14 */
25723     { { 0x0f0165fce3779ee3L,0xe00e7f9dbd495d9eL,0x1fa4efa220284e7aL,
25724         0x4564bade47ac6219L },
25725       { 0x90e6312ac4708e8eL,0x4f5725fba71e9adfL,0xe95f55ae3d684b9fL,
25726         0x47f7ccb11e94b415L } },
25727     /* 5 << 14 */
25728     { { 0x7322851b8d946581L,0xf0d13133bdf4a012L,0xa3510f696584dae0L,
25729         0x03a7c1713c9f6c6dL },
25730       { 0x5be97f38e475381aL,0xca1ba42285823334L,0xf83cc5c70be17ddaL,
25731         0x158b14940b918c0fL } },
25732     /* 6 << 14 */
25733     { { 0xda3a77e5522e6b69L,0x69c908c3bbcd6c18L,0x1f1b9e48d924fd56L,
25734         0x37c64e36aa4bb3f7L },
25735       { 0x5a4fdbdfee478d7dL,0xba75c8bc0193f7a0L,0x84bc1e8456cd16dfL,
25736         0x1fb08f0846fad151L } },
25737     /* 7 << 14 */
25738     { { 0x8a7cabf9842e9f30L,0xa331d4bf5eab83afL,0xd272cfba017f2a6aL,
25739         0x27560abc83aba0e3L },
25740       { 0x94b833870e3a6b75L,0x25c6aea26b9f50f5L,0x803d691db5fdf6d0L,
25741         0x03b77509e6333514L } },
25742     /* 8 << 14 */
25743     { { 0x3617890361a341c1L,0x3604dc600cfd6142L,0x022295eb8533316cL,
25744         0x3dbde4ac44af2922L },
25745       { 0x898afc5d1c7eef69L,0x58896805d14f4fa1L,0x05002160203c21caL,
25746         0x6f0d1f3040ef730bL } },
25747     /* 9 << 14 */
25748     { { 0x8e8c44d4196224f8L,0x75a4ab95374d079dL,0x79085ecc7d48f123L,
25749         0x56f04d311bf65ad8L },
25750       { 0xe220bf1cbda602b2L,0x73ee1742f9612c69L,0x76008fc8084fd06bL,
25751         0x4000ef9ff11380d1L } },
25752     /* 10 << 14 */
25753     { { 0x48201b4b12cfe297L,0x3eee129c292f74e5L,0xe1fe114ec9e874e8L,
25754         0x899b055c92c5fc41L },
25755       { 0x4e477a643a39c8cfL,0x82f09efe78963cc9L,0x6fd3fd8fd333f863L,
25756         0x85132b2adc949c63L } },
25757     /* 11 << 14 */
25758     { { 0x7e06a3ab516eb17bL,0x73bec06fd2c7372bL,0xe4f74f55ba896da6L,
25759         0xbb4afef88e9eb40fL },
25760       { 0x2d75bec8e61d66b0L,0x02bda4b4ef29300bL,0x8bbaa8de026baa5aL,
25761         0xff54befda07f4440L } },
25762     /* 12 << 14 */
25763     { { 0xbd9b8b1dbe7a2af3L,0xec51caa94fb74a72L,0xb9937a4b63879697L,
25764         0x7c9a9d20ec2687d5L },
25765       { 0x1773e44f6ef5f014L,0x8abcf412e90c6900L,0x387bd0228142161eL,
25766         0x50393755fcb6ff2aL } },
25767     /* 13 << 14 */
25768     { { 0x9813fd56ed6def63L,0x53cf64827d53106cL,0x991a35bd431f7ac1L,
25769         0xf1e274dd63e65fafL },
25770       { 0xf63ffa3c44cc7880L,0x411a426b7c256981L,0xb698b9fd93a420e0L,
25771         0x89fdddc0ae53f8feL } },
25772     /* 14 << 14 */
25773     { { 0x766e072232398baaL,0x205fee425cfca031L,0xa49f53417a029cf2L,
25774         0xa88c68b84023890dL },
25775       { 0xbc2750417337aaa8L,0x9ed364ad0eb384f4L,0xe0816f8529aba92fL,
25776         0x2e9e194104e38a88L } },
25777     /* 15 << 14 */
25778     { { 0x57eef44a3dafd2d5L,0x35d1fae597ed98d8L,0x50628c092307f9b1L,
25779         0x09d84aaed6cba5c6L },
25780       { 0x67071bc788aaa691L,0x2dea57a9afe6cb03L,0xdfe11bb43d78ac01L,
25781         0x7286418c7fd7aa51L } },
25782     /* 16 << 14 */
25783     { { 0xfabf770977f7195aL,0x8ec86167adeb838fL,0xea1285a8bb4f012dL,
25784         0xd68835039a3eab3fL },
25785       { 0xee5d24f8309004c2L,0xa96e4b7613ffe95eL,0x0cdffe12bd223ea4L,
25786         0x8f5c2ee5b6739a53L } },
25787     /* 17 << 14 */
25788     { { 0x5cb4aaa5dd968198L,0xfa131c5272413a6cL,0x53d46a909536d903L,
25789         0xb270f0d348606d8eL },
25790       { 0x518c7564a053a3bcL,0x088254b71a86caefL,0xb3ba8cb40ab5efd0L,
25791         0x5c59900e4605945dL } },
25792     /* 18 << 14 */
25793     { { 0xecace1dda1887395L,0x40960f36932a65deL,0x9611ff5c3aa95529L,
25794         0xc58215b07c1e5a36L },
25795       { 0xd48c9b58f0e1a524L,0xb406856bf590dfb8L,0xc7605e049cd95662L,
25796         0x0dd036eea33ecf82L } },
25797     /* 19 << 14 */
25798     { { 0xa50171acc33156b3L,0xf09d24ea4a80172eL,0x4e1f72c676dc8eefL,
25799         0xe60caadc5e3d44eeL },
25800       { 0x006ef8a6979b1d8fL,0x60908a1c97788d26L,0x6e08f95b266feec0L,
25801         0x618427c222e8c94eL } },
25802     /* 20 << 14 */
25803     { { 0x3d61333959145a65L,0xcd9bc368fa406337L,0x82d11be32d8a52a0L,
25804         0xf6877b2797a1c590L },
25805       { 0x837a819bf5cbdb25L,0x2a4fd1d8de090249L,0x622a7de774990e5fL,
25806         0x840fa5a07945511bL } },
25807     /* 21 << 14 */
25808     { { 0x30b974be6558842dL,0x70df8c6417f3d0a6L,0x7c8035207542e46dL,
25809         0x7251fe7fe4ecc823L },
25810       { 0xe59134cb5e9aac9aL,0x11bb0934f0045d71L,0x53e5d9b5dbcb1d4eL,
25811         0x8d97a90592defc91L } },
25812     /* 22 << 14 */
25813     { { 0xfe2893277946d3f9L,0xe132bd2407472273L,0xeeeb510c1eb6ae86L,
25814         0x777708c5f0595067L },
25815       { 0x18e2c8cd1297029eL,0x2c61095cbbf9305eL,0xe466c2586b85d6d9L,
25816         0x8ac06c36da1ea530L } },
25817     /* 23 << 14 */
25818     { { 0xa365dc39a1304668L,0xe4a9c88507f89606L,0x65a4898facc7228dL,
25819         0x3e2347ff84ca8303L },
25820       { 0xa5f6fb77ea7d23a3L,0x2fac257d672a71cdL,0x6908bef87e6a44d3L,
25821         0x8ff87566891d3d7aL } },
25822     /* 24 << 14 */
25823     { { 0xe58e90b36b0cf82eL,0x6438d2462615b5e7L,0x07b1f8fc669c145aL,
25824         0xb0d8b2da36f1e1cbL },
25825       { 0x54d5dadbd9184c4dL,0x3dbb18d5f93d9976L,0x0a3e0f56d1147d47L,
25826         0x2afa8c8da0a48609L } },
25827     /* 25 << 14 */
25828     { { 0x275353e8bc36742cL,0x898f427eeea0ed90L,0x26f4947e3e477b00L,
25829         0x8ad8848a308741e3L },
25830       { 0x6c703c38d74a2a46L,0x5e3e05a99ba17ba2L,0xc1fa6f664ab9a9e4L,
25831         0x474a2d9a3841d6ecL } },
25832     /* 26 << 14 */
25833     { { 0x871239ad653ae326L,0x14bcf72aa74cbb43L,0x8737650e20d4c083L,
25834         0x3df86536110ed4afL },
25835       { 0xd2d86fe7b53ca555L,0x688cb00dabd5d538L,0xcf81bda31ad38468L,
25836         0x7ccfe3ccf01167b6L } },
25837     /* 27 << 14 */
25838     { { 0xcf4f47e06c4c1fe6L,0x557e1f1a298bbb79L,0xf93b974f30d45a14L,
25839         0x174a1d2d0baf97c4L },
25840       { 0x7a003b30c51fbf53L,0xd8940991ee68b225L,0x5b0aa7b71c0f4173L,
25841         0x975797c9a20a7153L } },
25842     /* 28 << 14 */
25843     { { 0x26e08c07e3533d77L,0xd7222e6a2e341c99L,0x9d60ec3d8d2dc4edL,
25844         0xbdfe0d8f7c476cf8L },
25845       { 0x1fe59ab61d056605L,0xa9ea9df686a8551fL,0x8489941e47fb8d8cL,
25846         0xfeb874eb4a7f1b10L } },
25847     /* 29 << 14 */
25848     { { 0xfe5fea867ee0d98fL,0x201ad34bdbf61864L,0x45d8fe4737c031d4L,
25849         0xd5f49fae795f0822L },
25850       { 0xdb0fb291c7f4a40cL,0x2e69d9c1730ddd92L,0x754e105449d76987L,
25851         0x8a24911d7662db87L } },
25852     /* 30 << 14 */
25853     { { 0x61fc181060a71676L,0xe852d1a8f66a8ad1L,0x172bbd656417231eL,
25854         0x0d6de7bd3babb11fL },
25855       { 0x6fde6f88c8e347f8L,0x1c5875479bd99cc3L,0x78e54ed034076950L,
25856         0x97f0f334796e83baL } },
25857     /* 31 << 14 */
25858     { { 0xe4dbe1ce4924867aL,0xbd5f51b060b84917L,0x375300403cb09a79L,
25859         0xdb3fe0f8ff1743d8L },
25860       { 0xed7894d8556fa9dbL,0xfa26216923412fbfL,0x563be0dbba7b9291L,
25861         0x6ca8b8c00c9fb234L } },
25862     /* 32 << 14 */
25863     { { 0xed406aa9bd763802L,0xc21486a065303da1L,0x61ae291ec7e62ec4L,
25864         0x622a0492df99333eL },
25865       { 0x7fd80c9dbb7a8ee0L,0xdc2ed3bc6c01aedbL,0x35c35a1208be74ecL,
25866         0xd540cb1a469f671fL } },
25867     /* 33 << 14 */
25868     { { 0xd16ced4ecf84f6c7L,0x8561fb9c2d090f43L,0x7e693d796f239db4L,
25869         0xa736f92877bd0d94L },
25870       { 0x07b4d9292c1950eeL,0xda17754356dc11b3L,0xa5dfbbaa7a6a878eL,
25871         0x1c70cb294decb08aL } },
25872     /* 34 << 14 */
25873     { { 0xfba28c8b6f0f7c50L,0xa8eba2b8854dcc6dL,0x5ff8e89a36b78642L,
25874         0x070c1c8ef6873adfL },
25875       { 0xbbd3c3716484d2e4L,0xfb78318f0d414129L,0x2621a39c6ad93b0bL,
25876         0x979d74c2a9e917f7L } },
25877     /* 35 << 14 */
25878     { { 0xfc19564761fb0428L,0x4d78954abee624d4L,0xb94896e0b8ae86fdL,
25879         0x6667ac0cc91c8b13L },
25880       { 0x9f18051243bcf832L,0xfbadf8b7a0010137L,0xc69b4089b3ba8aa7L,
25881         0xfac4bacde687ce85L } },
25882     /* 36 << 14 */
25883     { { 0x9164088d977eab40L,0x51f4c5b62760b390L,0xd238238f340dd553L,
25884         0x358566c3db1d31c9L },
25885       { 0x3a5ad69e5068f5ffL,0xf31435fcdaff6b06L,0xae549a5bd6debff0L,
25886         0x59e5f0b775e01331L } },
25887     /* 37 << 14 */
25888     { { 0x5d492fb898559acfL,0x96018c2e4db79b50L,0x55f4a48f609f66aaL,
25889         0x1943b3af4900a14fL },
25890       { 0xc22496df15a40d39L,0xb2a446844c20f7c5L,0x76a35afa3b98404cL,
25891         0xbec75725ff5d1b77L } },
25892     /* 38 << 14 */
25893     { { 0xb67aa163bea06444L,0x27e95bb2f724b6f2L,0x3c20e3e9d238c8abL,
25894         0x1213754eddd6ae17L },
25895       { 0x8c431020716e0f74L,0x6679c82effc095c2L,0x2eb3adf4d0ac2932L,
25896         0x2cc970d301bb7a76L } },
25897     /* 39 << 14 */
25898     { { 0x70c71f2f740f0e66L,0x545c616b2b6b23ccL,0x4528cfcbb40a8bd7L,
25899         0xff8396332ab27722L },
25900       { 0x049127d9025ac99aL,0xd314d4a02b63e33bL,0xc8c310e728d84519L,
25901         0x0fcb8983b3bc84baL } },
25902     /* 40 << 14 */
25903     { { 0x2cc5226138634818L,0x501814f4b44c2e0bL,0xf7e181aa54dfdba3L,
25904         0xcfd58ff0e759718cL },
25905       { 0xf90cdb14d3b507a8L,0x57bd478ec50bdad8L,0x29c197e250e5f9aaL,
25906         0x4db6eef8e40bc855L } },
25907     /* 41 << 14 */
25908     { { 0x2cc8f21ad1fc0654L,0xc71cc96381269d73L,0xecfbb204077f49f9L,
25909         0xdde92571ca56b793L },
25910       { 0x9abed6a3f97ad8f7L,0xe6c19d3f924de3bdL,0x8dce92f4a140a800L,
25911         0x85f44d1e1337af07L } },
25912     /* 42 << 14 */
25913     { { 0x5953c08b09d64c52L,0xa1b5e49ff5df9749L,0x336a8fb852735f7dL,
25914         0xb332b6db9add676bL },
25915       { 0x558b88a0b4511aa4L,0x09788752dbd5cc55L,0x16b43b9cd8cd52bdL,
25916         0x7f0bc5a0c2a2696bL } },
25917     /* 43 << 14 */
25918     { { 0x146e12d4c11f61efL,0x9ce107543a83e79eL,0x08ec73d96cbfca15L,
25919         0x09ff29ad5b49653fL },
25920       { 0xe31b72bde7da946eL,0xebf9eb3bee80a4f2L,0xd1aabd0817598ce4L,
25921         0x18b5fef453f37e80L } },
25922     /* 44 << 14 */
25923     { { 0xd5d5cdd35958cd79L,0x3580a1b51d373114L,0xa36e4c91fa935726L,
25924         0xa38c534def20d760L },
25925       { 0x7088e40a2ff5845bL,0xe5bb40bdbd78177fL,0x4f06a7a8857f9920L,
25926         0xe3cc3e50e968f05dL } },
25927     /* 45 << 14 */
25928     { { 0x1d68b7fee5682d26L,0x5206f76faec7f87cL,0x41110530041951abL,
25929         0x58ec52c1d4b5a71aL },
25930       { 0xf3488f990f75cf9aL,0xf411951fba82d0d5L,0x27ee75be618895abL,
25931         0xeae060d46d8aab14L } },
25932     /* 46 << 14 */
25933     { { 0x9ae1df737fb54dc2L,0x1f3e391b25963649L,0x242ec32afe055081L,
25934         0x5bd450ef8491c9bdL },
25935       { 0x367efc67981eb389L,0xed7e19283a0550d5L,0x362e776bab3ce75cL,
25936         0xe890e3081f24c523L } },
25937     /* 47 << 14 */
25938     { { 0xb961b682feccef76L,0x8b8e11f58bba6d92L,0x8f2ccc4c2b2375c4L,
25939         0x0d7f7a52e2f86cfaL },
25940       { 0xfd94d30a9efe5633L,0x2d8d246b5451f934L,0x2234c6e3244e6a00L,
25941         0xde2b5b0dddec8c50L } },
25942     /* 48 << 14 */
25943     { { 0x2ce53c5abf776f5bL,0x6f72407160357b05L,0xb259371771bf3f7aL,
25944         0x87d2501c440c4a9fL },
25945       { 0x440552e187b05340L,0xb7bf7cc821624c32L,0x4155a6ce22facddbL,
25946         0x5a4228cb889837efL } },
25947     /* 49 << 14 */
25948     { { 0xef87d6d6fd4fd671L,0xa233687ec2daa10eL,0x7562224403c0eb96L,
25949         0x7632d1848bf19be6L },
25950       { 0x05d0f8e940735ff4L,0x3a3e6e13c00931f1L,0x31ccde6adafe3f18L,
25951         0xf381366acfe51207L } },
25952     /* 50 << 14 */
25953     { { 0x24c222a960167d92L,0x62f9d6f87529f18cL,0x412397c00353b114L,
25954         0x334d89dcef808043L },
25955       { 0xd9ec63ba2a4383ceL,0xcec8e9375cf92ba0L,0xfb8b4288c8be74c0L,
25956         0x67d6912f105d4391L } },
25957     /* 51 << 14 */
25958     { { 0x7b996c461b913149L,0x36aae2ef3a4e02daL,0xb68aa003972de594L,
25959         0x284ec70d4ec6d545L },
25960       { 0xf3d2b2d061391d54L,0x69c5d5d6fe114e92L,0xbe0f00b5b4482dffL,
25961         0xe1596fa5f5bf33c5L } },
25962     /* 52 << 14 */
25963     { { 0x10595b5696a71cbaL,0x944938b2fdcadeb7L,0xa282da4cfccd8471L,
25964         0x98ec05f30d37bfe1L },
25965       { 0xe171ce1b0698304aL,0x2d69144421bdf79bL,0xd0cd3b741b21dec1L,
25966         0x712ecd8b16a15f71L } },
25967     /* 53 << 14 */
25968     { { 0x8d4c00a700fd56e1L,0x02ec9692f9527c18L,0x21c449374a3e42e1L,
25969         0x9176fbab1392ae0aL },
25970       { 0x8726f1ba44b7b618L,0xb4d7aae9f1de491cL,0xf91df7b907b582c0L,
25971         0x7e116c30ef60aa3aL } },
25972     /* 54 << 14 */
25973     { { 0x99270f81466265d7L,0xb15b6fe24df7adf0L,0xfe33b2d3f9738f7fL,
25974         0x48553ab9d6d70f95L },
25975       { 0x2cc72ac8c21e94dbL,0x795ac38dbdc0bbeeL,0x0a1be4492e40478fL,
25976         0x81bd3394052bde55L } },
25977     /* 55 << 14 */
25978     { { 0x63c8dbe956b3c4f2L,0x017a99cf904177ccL,0x947bbddb4d010fc1L,
25979         0xacf9b00bbb2c9b21L },
25980       { 0x2970bc8d47173611L,0x1a4cbe08ac7d756fL,0x06d9f4aa67d541a2L,
25981         0xa3e8b68959c2cf44L } },
25982     /* 56 << 14 */
25983     { { 0xaad066da4d88f1ddL,0xc604f1657ad35deaL,0x7edc07204478ca67L,
25984         0xa10dfae0ba02ce06L },
25985       { 0xeceb1c76af36f4e4L,0x994b2292af3f8f48L,0xbf9ed77b77c8a68cL,
25986         0x74f544ea51744c9dL } },
25987     /* 57 << 14 */
25988     { { 0x82d05bb98113a757L,0x4ef2d2b48a9885e4L,0x1e332be51aa7865fL,
25989         0x22b76b18290d1a52L },
25990       { 0x308a231044351683L,0x9d861896a3f22840L,0x5959ddcd841ed947L,
25991         0x0def0c94154b73bfL } },
25992     /* 58 << 14 */
25993     { { 0xf01054174c7c15e0L,0x539bfb023a277c32L,0xe699268ef9dccf5fL,
25994         0x9f5796a50247a3bdL },
25995       { 0x8b839de84f157269L,0xc825c1e57a30196bL,0x6ef0aabcdc8a5a91L,
25996         0xf4a8ce6c498b7fe6L } },
25997     /* 59 << 14 */
25998     { { 0x1cce35a770cbac78L,0x83488e9bf6b23958L,0x0341a070d76cb011L,
25999         0xda6c9d06ae1b2658L },
26000       { 0xb701fb30dd648c52L,0x994ca02c52fb9fd1L,0x069331176f563086L,
26001         0x3d2b810017856babL } },
26002     /* 60 << 14 */
26003     { { 0xe89f48c85963a46eL,0x658ab875a99e61c7L,0x6e296f874b8517b4L,
26004         0x36c4fcdcfc1bc656L },
26005       { 0xde5227a1a3906defL,0x9fe95f5762418945L,0x20c91e81fdd96cdeL,
26006         0x5adbe47eda4480deL } },
26007     /* 61 << 14 */
26008     { { 0xa009370f396de2b6L,0x98583d4bf0ecc7bdL,0xf44f6b57e51d0672L,
26009         0x03d6b078556b1984L },
26010       { 0x27dbdd93b0b64912L,0x9b3a343415687b09L,0x0dba646151ec20a9L,
26011         0xec93db7fff28187cL } },
26012     /* 62 << 14 */
26013     { { 0x00ff8c2466e48bddL,0x2514f2f911ccd78eL,0xeba11f4fe1250603L,
26014         0x8a22cd41243fa156L },
26015       { 0xa4e58df4b283e4c6L,0x78c298598b39783fL,0x5235aee2a5259809L,
26016         0xc16284b50e0227ddL } },
26017     /* 63 << 14 */
26018     { { 0xa5f579161338830dL,0x6d4b8a6bd2123fcaL,0x236ea68af9c546f8L,
26019         0xc1d36873fa608d36L },
26020       { 0xcd76e4958d436d13L,0xd4d9c2218fb080afL,0x665c1728e8ad3fb5L,
26021         0xcf1ebe4db3d572e0L } },
26022     /* 64 << 14 */
26023     { { 0xa7a8746a584c5e20L,0x267e4ea1b9dc7035L,0x593a15cfb9548c9bL,
26024         0x5e6e21354bd012f3L },
26025       { 0xdf31cc6a8c8f936eL,0x8af84d04b5c241dcL,0x63990a6f345efb86L,
26026         0x6fef4e61b9b962cbL } },
26027     /* 0 << 21 */
26028     { { 0x00, 0x00, 0x00, 0x00 },
26029       { 0x00, 0x00, 0x00, 0x00 } },
26030     /* 1 << 21 */
26031     { { 0xf6368f0925722608L,0x131260db131cf5c6L,0x40eb353bfab4f7acL,
26032         0x85c7888037eee829L },
26033       { 0x4c1581ffc3bdf24eL,0x5bff75cbf5c3c5a8L,0x35e8c83fa14e6f40L,
26034         0xb81d1c0f0295e0caL } },
26035     /* 2 << 21 */
26036     { { 0xfcde7cc8f43a730fL,0xe89b6f3c33ab590eL,0xc823f529ad03240bL,
26037         0x82b79afe98bea5dbL },
26038       { 0x568f2856962fe5deL,0x0c590adb60c591f3L,0x1fc74a144a28a858L,
26039         0x3b662498b3203f4cL } },
26040     /* 3 << 21 */
26041     { { 0x91e3cf0d6c39765aL,0xa2db3acdac3cca0bL,0x288f2f08cb953b50L,
26042         0x2414582ccf43cf1aL },
26043       { 0x8dec8bbc60eee9a8L,0x54c79f02729aa042L,0xd81cd5ec6532f5d5L,
26044         0xa672303acf82e15fL } },
26045     /* 4 << 21 */
26046     { { 0x376aafa8719c0563L,0xcd8ad2dcbc5fc79fL,0x303fdb9fcb750cd3L,
26047         0x14ff052f4418b08eL },
26048       { 0xf75084cf3e2d6520L,0x7ebdf0f8144ed509L,0xf43bf0f2d3f25b98L,
26049         0x86ad71cfa354d837L } },
26050     /* 5 << 21 */
26051     { { 0xb827fe9226f43572L,0xdfd3ab5b5d824758L,0x315dd23a539094c1L,
26052         0x85c0e37a66623d68L },
26053       { 0x575c79727be19ae0L,0x616a3396df0d36b5L,0xa1ebb3c826b1ff7eL,
26054         0x635b9485140ad453L } },
26055     /* 6 << 21 */
26056     { { 0x92bf3cdada430c0bL,0x4702850e3a96dac6L,0xc91cf0a515ac326aL,
26057         0x95de4f49ab8c25e4L },
26058       { 0xb01bad09e265c17cL,0x24e45464087b3881L,0xd43e583ce1fac5caL,
26059         0xe17cb3186ead97a6L } },
26060     /* 7 << 21 */
26061     { { 0x6cc3924374dcec46L,0x33cfc02d54c2b73fL,0x82917844f26cd99cL,
26062         0x8819dd95d1773f89L },
26063       { 0x09572aa60871f427L,0x8e0cf365f6f01c34L,0x7fa52988bff1f5afL,
26064         0x4eb357eae75e8e50L } },
26065     /* 8 << 21 */
26066     { { 0xd9d0c8c4868af75dL,0xd7325cff45c8c7eaL,0xab471996cc81ecb0L,
26067         0xff5d55f3611824edL },
26068       { 0xbe3145411977a0eeL,0x5085c4c5722038c6L,0x2d5335bff94bb495L,
26069         0x894ad8a6c8e2a082L } },
26070     /* 9 << 21 */
26071     { { 0x5c3e2341ada35438L,0xf4a9fc89049b8c4eL,0xbeeb355a9f17cf34L,
26072         0x3f311e0e6c91fe10L },
26073       { 0xc2d2003892ab9891L,0x257bdcc13e8ce9a9L,0x1b2d978988c53beeL,
26074         0x927ce89acdba143aL } },
26075     /* 10 << 21 */
26076     { { 0xb0a32cca523db280L,0x5c889f8a50d43783L,0x503e04b34897d16fL,
26077         0x8cdb6e7808f5f2e8L },
26078       { 0x6ab91cf0179c8e74L,0xd8874e5248211d60L,0xf948d4d5ea851200L,
26079         0x4076d41ee6f9840aL } },
26080     /* 11 << 21 */
26081     { { 0xc20e263c47b517eaL,0x79a448fd30685e5eL,0xe55f6f78f90631a0L,
26082         0x88a790b1a79e6346L },
26083       { 0x62160c7d80969fe8L,0x54f92fd441491bb9L,0xa6645c235c957526L,
26084         0xf44cc5aebea3ce7bL } },
26085     /* 12 << 21 */
26086     { { 0xf76283278b1e68b7L,0xc731ad7a303f29d3L,0xfe5a9ca957d03ecbL,
26087         0x96c0d50c41bc97a7L },
26088       { 0xc4669fe79b4f7f24L,0xfdd781d83d9967efL,0x7892c7c35d2c208dL,
26089         0x8bf64f7cae545cb3L } },
26090     /* 13 << 21 */
26091     { { 0xc01f862c467be912L,0xf4c85ee9c73d30ccL,0x1fa6f4be6ab83ec7L,
26092         0xa07a3c1c4e3e3cf9L },
26093       { 0x87f8ef450c00beb3L,0x30e2c2b3000d4c3eL,0x1aa00b94fe08bf5bL,
26094         0x32c133aa9224ef52L } },
26095     /* 14 << 21 */
26096     { { 0x38df16bb32e5685dL,0x68a9e06958e6f544L,0x495aaff7cdc5ebc6L,
26097         0xf894a645378b135fL },
26098       { 0xf316350a09e27ecfL,0xeced201e58f7179dL,0x2eec273ce97861baL,
26099         0x47ec2caed693be2eL } },
26100     /* 15 << 21 */
26101     { { 0xfa4c97c4f68367ceL,0xe4f47d0bbe5a5755L,0x17de815db298a979L,
26102         0xd7eca659c177dc7dL },
26103       { 0x20fdbb7149ded0a3L,0x4cb2aad4fb34d3c5L,0x2cf31d2860858a33L,
26104         0x3b6873efa24aa40fL } },
26105     /* 16 << 21 */
26106     { { 0x540234b22c11bb37L,0x2d0366dded4c74a3L,0xf9a968daeec5f25dL,
26107         0x3660106867b63142L },
26108       { 0x07cd6d2c68d7b6d4L,0xa8f74f090c842942L,0xe27514047768b1eeL,
26109         0x4b5f7e89fe62aee4L } },
26110     /* 17 << 21 */
26111     { { 0xc6a7717789070d26L,0xa1f28e4edd1c8bc7L,0xea5f4f06469e1f17L,
26112         0x78fc242afbdb78e0L },
26113       { 0xc9c7c5928b0588f1L,0xb6b7a0fd1535921eL,0xcc5bdb91bde5ae35L,
26114         0xb42c485e12ff1864L } },
26115     /* 18 << 21 */
26116     { { 0xa1113e13dbab98aaL,0xde9d469ba17b1024L,0x23f48b37c0462d3aL,
26117         0x3752e5377c5c078dL },
26118       { 0xe3a86add15544eb9L,0xf013aea780fba279L,0x8b5bb76cf22001b5L,
26119         0xe617ba14f02891abL } },
26120     /* 19 << 21 */
26121     { { 0xd39182a6936219d3L,0x5ce1f194ae51cb19L,0xc78f8598bf07a74cL,
26122         0x6d7158f222cbf1bcL },
26123       { 0x3b846b21e300ce18L,0x35fba6302d11275dL,0x5fe25c36a0239b9bL,
26124         0xd8beb35ddf05d940L } },
26125     /* 20 << 21 */
26126     { { 0x4db02bb01f7e320dL,0x0641c3646da320eaL,0x6d95fa5d821389a3L,
26127         0x926997488fcd8e3dL },
26128       { 0x316fef17ceb6c143L,0x67fcb841d933762bL,0xbb837e35118b17f8L,
26129         0x4b92552f9fd24821L } },
26130     /* 21 << 21 */
26131     { { 0xae6bc70e46aca793L,0x1cf0b0e4e579311bL,0x8dc631be5802f716L,
26132         0x099bdc6fbddbee4dL },
26133       { 0xcc352bb20caf8b05L,0xf74d505a72d63df2L,0xb9876d4b91c4f408L,
26134         0x1ce184739e229b2dL } },
26135     /* 22 << 21 */
26136     { { 0x4950759783abdb4aL,0x850fbcb6dee84b18L,0x6325236e609e67dcL,
26137         0x04d831d99336c6d8L },
26138       { 0x8deaae3bfa12d45dL,0xe425f8ce4746e246L,0x8004c17524f5f31eL,
26139         0xaca16d8fad62c3b7L } },
26140     /* 23 << 21 */
26141     { { 0x0dc15a6a9152f934L,0xf1235e5ded0e12c1L,0xc33c06ecda477dacL,
26142         0x76be8732b2ea0006L },
26143       { 0xcf3f78310c0cd313L,0x3c524553a614260dL,0x31a756f8cab22d15L,
26144         0x03ee10d177827a20L } },
26145     /* 24 << 21 */
26146     { { 0xd1e059b21994ef20L,0x2a653b69638ae318L,0x70d5eb582f699010L,
26147         0x279739f709f5f84aL },
26148       { 0x5da4663c8b799336L,0xfdfdf14d203c37ebL,0x32d8a9dca1dbfb2dL,
26149         0xab40cff077d48f9bL } },
26150     /* 25 << 21 */
26151     { { 0xc018b383d20b42d5L,0xf9a810ef9f78845fL,0x40af3753bdba9df0L,
26152         0xb90bdcfc131dfdf9L },
26153       { 0x18720591f01ab782L,0xc823f2116af12a88L,0xa51b80f30dc14401L,
26154         0xde248f77fb2dfbe3L } },
26155     /* 26 << 21 */
26156     { { 0xef5a44e50cafe751L,0x73997c9cd4dcd221L,0x32fd86d1de854024L,
26157         0xd5b53adca09b84bbL },
26158       { 0x008d7a11dcedd8d1L,0x406bd1c874b32c84L,0x5d4472ff05dde8b1L,
26159         0x2e25f2cdfce2b32fL } },
26160     /* 27 << 21 */
26161     { { 0xbec0dd5e29dfc254L,0x4455fcf62b98b267L,0x0b4d43a5c72df2adL,
26162         0xea70e6be48a75397L },
26163       { 0x2aad61695820f3bfL,0xf410d2dd9e37f68fL,0x70fb7dba7be5ac83L,
26164         0x636bb64536ec3eecL } },
26165     /* 28 << 21 */
26166     { { 0x27104ea39754e21cL,0xbc87a3e68d63c373L,0x483351d74109db9aL,
26167         0x0fa724e360134da7L },
26168       { 0x9ff44c29b0720b16L,0x2dd0cf1306aceeadL,0x5942758ce26929a6L,
26169         0x96c5db92b766a92bL } },
26170     /* 29 << 21 */
26171     { { 0xcec7d4c05f18395eL,0xd3f227441f80d032L,0x7a68b37acb86075bL,
26172         0x074764ddafef92dbL },
26173       { 0xded1e9507bc7f389L,0xc580c850b9756460L,0xaeeec2a47da48157L,
26174         0x3f0b4e7f82c587b3L } },
26175     /* 30 << 21 */
26176     { { 0x231c6de8a9f19c53L,0x5717bd736974e34eL,0xd9e1d216f1508fa9L,
26177         0x9f112361dadaa124L },
26178       { 0x80145e31823b7348L,0x4dd8f0d5ac634069L,0xe3d82fc72297c258L,
26179         0x276fcfee9cee7431L } },
26180     /* 31 << 21 */
26181     { { 0x8eb61b5e2bc0aea9L,0x4f668fd5de329431L,0x03a32ab138e4b87eL,
26182         0xe137451773d0ef0bL },
26183       { 0x1a46f7e6853ac983L,0xc3bdf42e68e78a57L,0xacf207852ea96dd1L,
26184         0xa10649b9f1638460L } },
26185     /* 32 << 21 */
26186     { { 0xf2369f0b879fbbedL,0x0ff0ae86da9d1869L,0x5251d75956766f45L,
26187         0x4984d8c02be8d0fcL },
26188       { 0x7ecc95a6d21008f0L,0x29bd54a03a1a1c49L,0xab9828c5d26c50f3L,
26189         0x32c0087c51d0d251L } },
26190     /* 33 << 21 */
26191     { { 0x9bac3ce60c1cdb26L,0xcd94d947557ca205L,0x1b1bd5989db1fdcdL,
26192         0x0eda0108a3d8b149L },
26193       { 0x9506661056152fccL,0xc2f037e6e7192b33L,0xdeffb41ac92e05a4L,
26194         0x1105f6c2c2f6c62eL } },
26195     /* 34 << 21 */
26196     { { 0x68e735008733913cL,0xcce861633f3adc40L,0xf407a94238a278e9L,
26197         0xd13c1b9d2ab21292L },
26198       { 0x93ed7ec71c74cf5cL,0x8887dc48f1a4c1b4L,0x3830ff304b3a11f1L,
26199         0x358c5a3c58937cb6L } },
26200     /* 35 << 21 */
26201     { { 0x027dc40489022829L,0x40e939773b798f79L,0x90ad333738be6eadL,
26202         0x9c23f6bcf34c0a5dL },
26203       { 0xd1711a35fbffd8bbL,0x60fcfb491949d3ddL,0x09c8ef4b7825d93aL,
26204         0x24233cffa0a8c968L } },
26205     /* 36 << 21 */
26206     { { 0x67ade46ce6d982afL,0xebb6bf3ee7544d7cL,0xd6b9ba763d8bd087L,
26207         0x46fe382d4dc61280L },
26208       { 0xbd39a7e8b5bdbd75L,0xab381331b8f228feL,0x0709a77cce1c4300L,
26209         0x6a247e56f337ceacL } },
26210     /* 37 << 21 */
26211     { { 0x8f34f21b636288beL,0x9dfdca74c8a7c305L,0x6decfd1bea919e04L,
26212         0xcdf2688d8e1991f8L },
26213       { 0xe607df44d0f8a67eL,0xd985df4b0b58d010L,0x57f834c50c24f8f4L,
26214         0xe976ef56a0bf01aeL } },
26215     /* 38 << 21 */
26216     { { 0x536395aca1c32373L,0x351027aa734c0a13L,0xd2f1b5d65e6bd5bcL,
26217         0x2b539e24223debedL },
26218       { 0xd4994cec0eaa1d71L,0x2a83381d661dcf65L,0x5f1aed2f7b54c740L,
26219         0x0bea3fa5d6dda5eeL } },
26220     /* 39 << 21 */
26221     { { 0x9d4fb68436cc6134L,0x8eb9bbf3c0a443ddL,0xfc500e2e383b7d2aL,
26222         0x7aad621c5b775257L },
26223       { 0x69284d740a8f7cc0L,0xe820c2ce07562d65L,0xbf9531b9499758eeL,
26224         0x73e95ca56ee0cc2dL } },
26225     /* 40 << 21 */
26226     { { 0xf61790abfbaf50a5L,0xdf55e76b684e0750L,0xec516da7f176b005L,
26227         0x575553bb7a2dddc7L },
26228       { 0x37c87ca3553afa73L,0x315f3ffc4d55c251L,0xe846442aaf3e5d35L,
26229         0x61b911496495ff28L } },
26230     /* 41 << 21 */
26231     { { 0x23cc95d3fa326dc3L,0x1df4da1f18fc2ceaL,0x24bf9adcd0a37d59L,
26232         0xb6710053320d6e1eL },
26233       { 0x96f9667e618344d1L,0xcc7ce042a06445afL,0xa02d8514d68dbc3aL,
26234         0x4ea109e4280b5a5bL } },
26235     /* 42 << 21 */
26236     { { 0x5741a7acb40961bfL,0x4ada59376aa56bfaL,0x7feb914502b765d1L,
26237         0x561e97bee6ad1582L },
26238       { 0xbbc4a5b6da3982f5L,0x0c2659edb546f468L,0xb8e7e6aa59612d20L,
26239         0xd83dfe20ac19e8e0L } },
26240     /* 43 << 21 */
26241     { { 0x8530c45fb835398cL,0x6106a8bfb38a41c2L,0x21e8f9a635f5dcdbL,
26242         0x39707137cae498edL },
26243       { 0x70c23834d8249f00L,0x9f14b58fab2537a0L,0xd043c3655f61c0c2L,
26244         0xdc5926d609a194a7L } },
26245     /* 44 << 21 */
26246     { { 0xddec03398e77738aL,0xd07a63effba46426L,0x2e58e79cee7f6e86L,
26247         0xe59b0459ff32d241L },
26248       { 0xc5ec84e520fa0338L,0x97939ac8eaff5aceL,0x0310a4e3b4a38313L,
26249         0x9115fba28f9d9885L } },
26250     /* 45 << 21 */
26251     { { 0x8dd710c25fadf8c3L,0x66be38a2ce19c0e2L,0xd42a279c4cfe5022L,
26252         0x597bb5300e24e1b8L },
26253       { 0x3cde86b7c153ca7fL,0xa8d30fb3707d63bdL,0xac905f92bd60d21eL,
26254         0x98e7ffb67b9a54abL } },
26255     /* 46 << 21 */
26256     { { 0xd7147df8e9726a30L,0xb5e216ffafce3533L,0xb550b7992ff1ec40L,
26257         0x6b613b87a1e953fdL },
26258       { 0x87b88dba792d5610L,0x2ee1270aa190fbe1L,0x02f4e2dc2ef581daL,
26259         0x016530e4eff82a95L } },
26260     /* 47 << 21 */
26261     { { 0xcbb93dfd8fd6ee89L,0x16d3d98646848fffL,0x600eff241da47adfL,
26262         0x1b9754a00ad47a71L },
26263       { 0x8f9266df70c33b98L,0xaadc87aedf34186eL,0x0d2ce8e14ad24132L,
26264         0x8a47cbfc19946ebaL } },
26265     /* 48 << 21 */
26266     { { 0x47feeb6662b5f3afL,0xcefab5610abb3734L,0x449de60e19f35cb1L,
26267         0x39f8db14157f0eb9L },
26268       { 0xffaecc5b3c61bfd6L,0xa5a4d41d41216703L,0x7f8fabed224e1cc2L,
26269         0x0d5a8186871ad953L } },
26270     /* 49 << 21 */
26271     { { 0xf10774f7d22da9a9L,0x45b8a678cc8a9b0dL,0xd9c2e722bdc32cffL,
26272         0xbf71b5f5337202a5L },
26273       { 0x95c57f2f69fc4db9L,0xb6dad34c765d01e1L,0x7e0bd13fcb904635L,
26274         0x61751253763a588cL } },
26275     /* 50 << 21 */
26276     { { 0xd85c299781af2c2dL,0xc0f7d9c481b9d7daL,0x838a34ae08533e8dL,
26277         0x15c4cb08311d8311L },
26278       { 0x97f832858e121e14L,0xeea7dc1e85000a5fL,0x0c6059b65d256274L,
26279         0xec9beaceb95075c0L } },
26280     /* 51 << 21 */
26281     { { 0x173daad71df97828L,0xbf851cb5a8937877L,0xb083c59401646f3cL,
26282         0x3bad30cf50c6d352L },
26283       { 0xfeb2b202496bbceaL,0x3cf9fd4f18a1e8baL,0xd26de7ff1c066029L,
26284         0x39c81e9e4e9ed4f8L } },
26285     /* 52 << 21 */
26286     { { 0xd8be0cb97b390d35L,0x01df2bbd964aab27L,0x3e8c1a65c3ef64f8L,
26287         0x567291d1716ed1ddL },
26288       { 0x95499c6c5f5406d3L,0x71fdda395ba8e23fL,0xcfeb320ed5096eceL,
26289         0xbe7ba92bca66dd16L } },
26290     /* 53 << 21 */
26291     { { 0x4608d36bc6fb5a7dL,0xe3eea15a6d2dd0e0L,0x75b0a3eb8f97a36aL,
26292         0xf59814cc1c83de1eL },
26293       { 0x56c9c5b01c33c23fL,0xa96c1da46faa4136L,0x46bf2074de316551L,
26294         0x3b866e7b1f756c8fL } },
26295     /* 54 << 21 */
26296     { { 0x727727d81495ed6bL,0xb2394243b682dce7L,0x8ab8454e758610f3L,
26297         0xc243ce84857d72a4L },
26298       { 0x7b320d71dbbf370fL,0xff9afa3778e0f7caL,0x0119d1e0ea7b523fL,
26299         0xb997f8cb058c7d42L } },
26300     /* 55 << 21 */
26301     { { 0x285bcd2a37bbb184L,0x51dcec49a45d1fa6L,0x6ade3b64e29634cbL,
26302         0x080c94a726b86ef1L },
26303       { 0xba583db12283fbe3L,0x902bddc85a9315edL,0x07c1ccb386964becL,
26304         0x78f4eacfb6258301L } },
26305     /* 56 << 21 */
26306     { { 0x4bdf3a4956f90823L,0xba0f5080741d777bL,0x091d71c3f38bf760L,
26307         0x9633d50f9b625b02L },
26308       { 0x03ecb743b8c9de61L,0xb47512545de74720L,0x9f9defc974ce1cb2L,
26309         0x774a4f6a00bd32efL } },
26310     /* 57 << 21 */
26311     { { 0xaca385f773848f22L,0x53dad716f3f8558eL,0xab7b34b093c471f9L,
26312         0xf530e06919644bc7L },
26313       { 0x3d9fb1ffdd59d31aL,0x4382e0df08daa795L,0x165c6f4bd5cc88d7L,
26314         0xeaa392d54a18c900L } },
26315     /* 58 << 21 */
26316     { { 0x94203c67648024eeL,0x188763f28c2fabcdL,0xa80f87acbbaec835L,
26317         0x632c96e0f29d8d54L },
26318       { 0x29b0a60e4c00a95eL,0x2ef17f40e011e9faL,0xf6c0e1d115b77223L,
26319         0xaaec2c6214b04e32L } },
26320     /* 59 << 21 */
26321     { { 0xd35688d83d84e58cL,0x2af5094c958571dbL,0x4fff7e19760682a6L,
26322         0x4cb27077e39a407cL },
26323       { 0x0f59c5474ff0e321L,0x169f34a61b34c8ffL,0x2bff109652bc1ba7L,
26324         0xa25423b783583544L } },
26325     /* 60 << 21 */
26326     { { 0x5d55d5d50ac8b782L,0xff6622ec2db3c892L,0x48fce7416b8bb642L,
26327         0x31d6998c69d7e3dcL },
26328       { 0xdbaf8004cadcaed0L,0x801b0142d81d053cL,0x94b189fc59630ec6L,
26329         0x120e9934af762c8eL } },
26330     /* 61 << 21 */
26331     { { 0x53a29aa4fdc6a404L,0x19d8e01ea1909948L,0x3cfcabf1d7e89681L,
26332         0x3321a50d4e132d37L },
26333       { 0xd0496863e9a86111L,0x8c0cde6106a3bc65L,0xaf866c49fc9f8eefL,
26334         0x2066350eff7f5141L } },
26335     /* 62 << 21 */
26336     { { 0x4f8a4689e56ddfbdL,0xea1b0c07fe32983aL,0x2b317462873cb8cbL,
26337         0x658deddc2d93229fL },
26338       { 0x65efaf4d0f64ef58L,0xfe43287d730cc7a8L,0xaebc0c723d047d70L,
26339         0x92efa539d92d26c9L } },
26340     /* 63 << 21 */
26341     { { 0x06e7845794b56526L,0x415cb80f0961002dL,0x89e5c56576dcb10fL,
26342         0x8bbb6982ff9259feL },
26343       { 0x4fe8795b9abc2668L,0xb5d4f5341e678fb1L,0x6601f3be7b7da2b9L,
26344         0x98da59e2a13d6805L } },
26345     /* 64 << 21 */
26346     { { 0x190d8ea601799a52L,0xa20cec41b86d2952L,0x3062ffb27fff2a7cL,
26347         0x741b32e579f19d37L },
26348       { 0xf80d81814eb57d47L,0x7a2d0ed416aef06bL,0x09735fb01cecb588L,
26349         0x1641caaac6061f5bL } },
26350     /* 0 << 28 */
26351     { { 0x00, 0x00, 0x00, 0x00 },
26352       { 0x00, 0x00, 0x00, 0x00 } },
26353     /* 1 << 28 */
26354     { { 0x7f99824f20151427L,0x206828b692430206L,0xaa9097d7e1112357L,
26355         0xacf9a2f209e414ecL },
26356       { 0xdbdac9da27915356L,0x7e0734b7001efee3L,0x54fab5bbd2b288e2L,
26357         0x4c630fc4f62dd09cL } },
26358     /* 2 << 28 */
26359     { { 0x8537107a1ac2703bL,0xb49258d86bc857b5L,0x57df14debcdaccd1L,
26360         0x24ab68d7c4ae8529L },
26361       { 0x7ed8b5d4734e59d0L,0x5f8740c8c495cc80L,0x84aedd5a291db9b3L,
26362         0x80b360f84fb995beL } },
26363     /* 3 << 28 */
26364     { { 0xae915f5d5fa067d1L,0x4134b57f9668960cL,0xbd3656d6a48edaacL,
26365         0xdac1e3e4fc1d7436L },
26366       { 0x674ff869d81fbb26L,0x449ed3ecb26c33d4L,0x85138705d94203e8L,
26367         0xccde538bbeeb6f4aL } },
26368     /* 4 << 28 */
26369     { { 0x55d5c68da61a76faL,0x598b441dca1554dcL,0xd39923b9773b279cL,
26370         0x33331d3c36bf9efcL },
26371       { 0x2d4c848e298de399L,0xcfdb8e77a1a27f56L,0x94c855ea57b8ab70L,
26372         0xdcdb9dae6f7879baL } },
26373     /* 5 << 28 */
26374     { { 0x7bdff8c2019f2a59L,0xb3ce5bb3cb4fbc74L,0xea907f688a9173ddL,
26375         0x6cd3d0d395a75439L },
26376       { 0x92ecc4d6efed021cL,0x09a9f9b06a77339aL,0x87ca6b157188c64aL,
26377         0x10c2996844899158L } },
26378     /* 6 << 28 */
26379     { { 0x5859a229ed6e82efL,0x16f338e365ebaf4eL,0x0cd313875ead67aeL,
26380         0x1c73d22854ef0bb4L },
26381       { 0x4cb5513174a5c8c7L,0x01cd29707f69ad6aL,0xa04d00dde966f87eL,
26382         0xd96fe4470b7b0321L } },
26383     /* 7 << 28 */
26384     { { 0x342ac06e88fbd381L,0x02cd4a845c35a493L,0xe8fa89de54f1bbcdL,
26385         0x341d63672575ed4cL },
26386       { 0xebe357fbd238202bL,0x600b4d1aa984ead9L,0xc35c9f4452436ea0L,
26387         0x96fe0a39a370751bL } },
26388     /* 8 << 28 */
26389     { { 0x4c4f07367f636a38L,0x9f943fb70e76d5cbL,0xb03510baa8b68b8bL,
26390         0xc246780a9ed07a1fL },
26391       { 0x3c0514156d549fc2L,0xc2953f31607781caL,0x955e2c69d8d95413L,
26392         0xb300fadc7bd282e3L } },
26393     /* 9 << 28 */
26394     { { 0x81fe7b5087e9189fL,0xdb17375cf42dda27L,0x22f7d896cf0a5904L,
26395         0xa0e57c5aebe348e6L },
26396       { 0xa61011d3f40e3c80L,0xb11893218db705c5L,0x4ed9309e50fedec3L,
26397         0xdcf14a104d6d5c1dL } },
26398     /* 10 << 28 */
26399     { { 0x056c265b55691342L,0xe8e0850491049dc7L,0x131329f5c9bae20aL,
26400         0x96c8b3e8d9dccdb4L },
26401       { 0x8c5ff838fb4ee6b4L,0xfc5a9aeb41e8ccf0L,0x7417b764fae050c6L,
26402         0x0953c3d700452080L } },
26403     /* 11 << 28 */
26404     { { 0x2137268238dfe7e8L,0xea417e152bb79d4bL,0x59641f1c76e7cf2dL,
26405         0x271e3059ea0bcfccL },
26406       { 0x624c7dfd7253ecbdL,0x2f552e254fca6186L,0xcbf84ecd4d866e9cL,
26407         0x73967709f68d4610L } },
26408     /* 12 << 28 */
26409     { { 0xa14b1163c27901b4L,0xfd9236e0899b8bf3L,0x42b091eccbc6da0aL,
26410         0xbb1dac6f5ad1d297L },
26411       { 0x80e61d53a91cf76eL,0x4110a412d31f1ee7L,0x2d87c3ba13efcf77L,
26412         0x1f374bb4df450d76L } },
26413     /* 13 << 28 */
26414     { { 0x5e78e2f20d188dabL,0xe3968ed0f4b885efL,0x46c0568e7314570fL,
26415         0x3161633801170521L },
26416       { 0x18e1e7e24f0c8afeL,0x4caa75ffdeea78daL,0x82db67f27c5d8a51L,
26417         0x36a44d866f505370L } },
26418     /* 14 << 28 */
26419     { { 0xd72c5bda0333974fL,0x5db516ae27a70146L,0x34705281210ef921L,
26420         0xbff17a8f0c9c38e5L },
26421       { 0x78f4814e12476da1L,0xc1e1661333c16980L,0x9e5b386f424d4bcaL,
26422         0x4c274e87c85740deL } },
26423     /* 15 << 28 */
26424     { { 0xb6a9b88d6c2f5226L,0x14d1b944550d7ca8L,0x580c85fc1fc41709L,
26425         0xc1da368b54c6d519L },
26426       { 0x2b0785ced5113cf7L,0x0670f6335a34708fL,0x46e2376715cc3f88L,
26427         0x1b480cfa50c72c8fL } },
26428     /* 16 << 28 */
26429     { { 0x202886024147519aL,0xd0981eac26b372f0L,0xa9d4a7caa785ebc8L,
26430         0xd953c50ddbdf58e9L },
26431       { 0x9d6361ccfd590f8fL,0x72e9626b44e6c917L,0x7fd9611022eb64cfL,
26432         0x863ebb7e9eb288f3L } },
26433     /* 17 << 28 */
26434     { { 0x6e6ab7616aca8ee7L,0x97d10b39d7b40358L,0x1687d3771e5feb0dL,
26435         0xc83e50e48265a27aL },
26436       { 0x8f75a9fec954b313L,0xcc2e8f47310d1f61L,0xf5ba81c56557d0e0L,
26437         0x25f9680c3eaf6207L } },
26438     /* 18 << 28 */
26439     { { 0xf95c66094354080bL,0x5225bfa57bf2fe1cL,0xc5c004e25c7d98faL,
26440         0x3561bf1c019aaf60L },
26441       { 0x5e6f9f17ba151474L,0xdec2f934b04f6ecaL,0x64e368a1269acb1eL,
26442         0x1332d9e40cdda493L } },
26443     /* 19 << 28 */
26444     { { 0x60d6cf69df23de05L,0x66d17da2009339a0L,0x9fcac9850a693923L,
26445         0xbcf057fced7c6a6dL },
26446       { 0xc3c5c8c5f0b5662cL,0x25318dd8dcba4f24L,0x60e8cb75082b69ffL,
26447         0x7c23b3ee1e728c01L } },
26448     /* 20 << 28 */
26449     { { 0x15e10a0a097e4403L,0xcb3d0a8619854665L,0x88d8e211d67d4826L,
26450         0xb39af66e0b9d2839L },
26451       { 0xa5f94588bd475ca8L,0xe06b7966c077b80bL,0xfedb1485da27c26cL,
26452         0xd290d33afe0fd5e0L } },
26453     /* 21 << 28 */
26454     { { 0xa40bcc47f34fb0faL,0xb4760cc81fb1ab09L,0x8fca0993a273bfe3L,
26455         0x13e4fe07f70b213cL },
26456       { 0x3bcdb992fdb05163L,0x8c484b110c2b19b6L,0x1acb815faaf2e3e2L,
26457         0xc6905935b89ff1b4L } },
26458     /* 22 << 28 */
26459     { { 0xb2ad6f9d586e74e1L,0x488883ad67b80484L,0x758aa2c7369c3ddbL,
26460         0x8ab74e699f9afd31L },
26461       { 0x10fc2d285e21beb1L,0x3484518a318c42f9L,0x377427dc53cf40c3L,
26462         0x9de0781a391bc1d9L } },
26463     /* 23 << 28 */
26464     { { 0x8faee858693807e1L,0xa38653274e81ccc7L,0x02c30ff26f835b84L,
26465         0xb604437b0d3d38d4L },
26466       { 0xb3fc8a985ca1823dL,0xb82f7ec903be0324L,0xee36d761cf684a33L,
26467         0x5a01df0e9f29bf7dL } },
26468     /* 24 << 28 */
26469     { { 0x686202f31306583dL,0x05b10da0437c622eL,0xbf9aaa0f076a7bc8L,
26470         0x25e94efb8f8f4e43L },
26471       { 0x8a35c9b7fa3dc26dL,0xe0e5fb9396ff03c5L,0xa77e3843ebc394ceL,
26472         0xcede65958361de60L } },
26473     /* 25 << 28 */
26474     { { 0xd27c22f6a1993545L,0xab01cc3624d671baL,0x63fa2877a169c28eL,
26475         0x925ef9042eb08376L },
26476       { 0x3b2fa3cf53aa0b32L,0xb27beb5b71c49d7aL,0xb60e1834d105e27fL,
26477         0xd60897884f68570dL } },
26478     /* 26 << 28 */
26479     { { 0x23094ce0d6fbc2acL,0x738037a1815ff551L,0xda73b1bb6bef119cL,
26480         0xdcf6c430eef506baL },
26481       { 0x00e4fe7be3ef104aL,0xebdd9a2c0a065628L,0x853a81c38792043eL,
26482         0x22ad6eceb3b59108L } },
26483     /* 27 << 28 */
26484     { { 0x9fb813c039cd297dL,0x8ec7e16e05bda5d9L,0x2834797c0d104b96L,
26485         0xcc11a2e77c511510L },
26486       { 0x96ca5a5396ee6380L,0x054c8655cea38742L,0xb5946852d54dfa7dL,
26487         0x97c422e71f4ab207L } },
26488     /* 28 << 28 */
26489     { { 0xbf9075090c22b540L,0x2cde42aab7c267d4L,0xba18f9ed5ab0d693L,
26490         0x3ba62aa66e4660d9L },
26491       { 0xb24bf97bab9ea96aL,0x5d039642e3b60e32L,0x4e6a45067c4d9bd5L,
26492         0x666c5b9e7ed4a6a4L } },
26493     /* 29 << 28 */
26494     { { 0xfa3fdcd98edbd7ccL,0x4660bb87c6ccd753L,0x9ae9082021e6b64fL,
26495         0x8a56a713b36bfb3fL },
26496       { 0xabfce0965726d47fL,0x9eed01b20b1a9a7fL,0x30e9cad44eb74a37L,
26497         0x7b2524cc53e9666dL } },
26498     /* 30 << 28 */
26499     { { 0x6a29683b8f4b002fL,0xc2200d7a41f4fc20L,0xcf3af47a3a338accL,
26500         0x6539a4fbe7128975L },
26501       { 0xcec31c14c33c7fcfL,0x7eb6799bc7be322bL,0x119ef4e96646f623L,
26502         0x7b7a26a554d7299bL } },
26503     /* 31 << 28 */
26504     { { 0xcb37f08d403f46f2L,0x94b8fc431a0ec0c7L,0xbb8514e3c332142fL,
26505         0xf3ed2c33e80d2a7aL },
26506       { 0x8d2080afb639126cL,0xf7b6be60e3553adeL,0x3950aa9f1c7e2b09L,
26507         0x847ff9586410f02bL } },
26508     /* 32 << 28 */
26509     { { 0x877b7cf5678a31b0L,0xd50301ae3998b620L,0x734257c5c00fb396L,
26510         0xf9fb18a004e672a6L },
26511       { 0xff8bd8ebe8758851L,0x1e64e4c65d99ba44L,0x4b8eaedf7dfd93b7L,
26512         0xba2f2a9804e76b8cL } },
26513     /* 33 << 28 */
26514     { { 0x7d790cbae8053433L,0xc8e725a03d2c9585L,0x58c5c476cdd8f5edL,
26515         0xd106b952efa9fe1dL },
26516       { 0x3c5c775b0eff13a9L,0x242442bae057b930L,0xe9f458d4c9b70cbdL,
26517         0x69b71448a3cdb89aL } },
26518     /* 34 << 28 */
26519     { { 0x41ee46f60e2ed742L,0x573f104540067493L,0xb1e154ff9d54c304L,
26520         0x2ad0436a8d3a7502L },
26521       { 0xee4aaa2d431a8121L,0xcd38b3ab886f11edL,0x57d49ea6034a0eb7L,
26522         0xd2b773bdf7e85e58L } },
26523     /* 35 << 28 */
26524     { { 0x4a559ac49b5c1f14L,0xc444be1a3e54df2bL,0x13aad704eda41891L,
26525         0xcd927bec5eb5c788L },
26526       { 0xeb3c8516e48c8a34L,0x1b7ac8124b546669L,0x1815f896594df8ecL,
26527         0x87c6a79c79227865L } },
26528     /* 36 << 28 */
26529     { { 0xae02a2f09b56ddbdL,0x1339b5ac8a2f1cf3L,0xf2b569c7839dff0dL,
26530         0xb0b9e864fee9a43dL },
26531       { 0x4ff8ca4177bb064eL,0x145a2812fd249f63L,0x3ab7beacf86f689aL,
26532         0x9bafec2701d35f5eL } },
26533     /* 37 << 28 */
26534     { { 0x28054c654265aa91L,0xa4b18304035efe42L,0x6887b0e69639dec7L,
26535         0xf4b8f6ad3d52aea5L },
26536       { 0xfb9293cc971a8a13L,0x3f159e5d4c934d07L,0x2c50e9b109acbc29L,
26537         0x08eb65e67154d129L } },
26538     /* 38 << 28 */
26539     { { 0x4feff58930b75c3eL,0x0bb82fe294491c93L,0xd8ac377a89af62bbL,
26540         0xd7b514909685e49fL },
26541       { 0xabca9a7b04497f19L,0x1b35ed0a1a7ad13fL,0x6b601e213ec86ed6L,
26542         0xda91fcb9ce0c76f1L } },
26543     /* 39 << 28 */
26544     { { 0x9e28507bd7ab27e1L,0x7c19a55563945b7bL,0x6b43f0a1aafc9827L,
26545         0x443b4fbd3aa55b91L },
26546       { 0x962b2e656962c88fL,0x139da8d4ce0db0caL,0xb93f05dd1b8d6c4fL,
26547         0x779cdff7180b9824L } },
26548     /* 40 << 28 */
26549     { { 0xbba23fddae57c7b7L,0x345342f21b932522L,0xfd9c80fe556d4aa3L,
26550         0xa03907ba6525bb61L },
26551       { 0x38b010e1ff218933L,0xc066b654aa52117bL,0x8e14192094f2e6eaL,
26552         0x66a27dca0d32f2b2L } },
26553     /* 41 << 28 */
26554     { { 0x69c7f993048b3717L,0xbf5a989ab178ae1cL,0x49fa9058564f1d6bL,
26555         0x27ec6e15d31fde4eL },
26556       { 0x4cce03737276e7fcL,0x64086d7989d6bf02L,0x5a72f0464ccdd979L,
26557         0x909c356647775631L } },
26558     /* 42 << 28 */
26559     { { 0x1c07bc6b75dd7125L,0xb4c6bc9787a0428dL,0x507ece52fdeb6b9dL,
26560         0xfca56512b2c95432L },
26561       { 0x15d97181d0e8bd06L,0x384dd317c6bb46eaL,0x5441ea203952b624L,
26562         0xbcf70dee4e7dc2fbL } },
26563     /* 43 << 28 */
26564     { { 0x372b016e6628e8c3L,0x07a0d667b60a7522L,0xcf05751b0a344ee2L,
26565         0x0ec09a48118bdeecL },
26566       { 0x6e4b3d4ed83dce46L,0x43a6316d99d2fc6eL,0xa99d898956cf044cL,
26567         0x7c7f4454ae3e5fb7L } },
26568     /* 44 << 28 */
26569     { { 0xb2e6b121fbabbe92L,0x281850fbe1330076L,0x093581ec97890015L,
26570         0x69b1dded75ff77f5L },
26571       { 0x7cf0b18fab105105L,0x953ced31a89ccfefL,0x3151f85feb914009L,
26572         0x3c9f1b8788ed48adL } },
26573     /* 45 << 28 */
26574     { { 0xc9aba1a14a7eadcbL,0x928e7501522e71cfL,0xeaede7273a2e4f83L,
26575         0x467e10d11ce3bbd3L },
26576       { 0xf3442ac3b955dcf0L,0xba96307dd3d5e527L,0xf763a10efd77f474L,
26577         0x5d744bd06a6e1ff0L } },
26578     /* 46 << 28 */
26579     { { 0xd287282aa777899eL,0xe20eda8fd03f3cdeL,0x6a7e75bb50b07d31L,
26580         0x0b7e2a946f379de4L },
26581       { 0x31cb64ad19f593cfL,0x7b1a9e4f1e76ef1dL,0xe18c9c9db62d609cL,
26582         0x439bad6de779a650L } },
26583     /* 47 << 28 */
26584     { { 0x219d9066e032f144L,0x1db632b8e8b2ec6aL,0xff0d0fd4fda12f78L,
26585         0x56fb4c2d2a25d265L },
26586       { 0x5f4e2ee1255a03f1L,0x61cd6af2e96af176L,0xe0317ba8d068bc97L,
26587         0x927d6bab264b988eL } },
26588     /* 48 << 28 */
26589     { { 0xa18f07e0e90fb21eL,0x00fd2b80bba7fca1L,0x20387f2795cd67b5L,
26590         0x5b89a4e7d39707f7L },
26591       { 0x8f83ad3f894407ceL,0xa0025b946c226132L,0xc79563c7f906c13bL,
26592         0x5f548f314e7bb025L } },
26593     /* 49 << 28 */
26594     { { 0x2b4c6b8feac6d113L,0xa67e3f9c0e813c76L,0x3982717c3fe1f4b9L,
26595         0x5886581926d8050eL },
26596       { 0x99f3640cf7f06f20L,0xdc6102162a66ebc2L,0x52f2c175767a1e08L,
26597         0x05660e1a5999871bL } },
26598     /* 50 << 28 */
26599     { { 0x6b0f17626d3c4693L,0xf0e7d62737ed7beaL,0xc51758c7b75b226dL,
26600         0x40a886281f91613bL },
26601       { 0x889dbaa7bbb38ce0L,0xe0404b65bddcad81L,0xfebccd3a8bc9671fL,
26602         0xfbf9a357ee1f5375L } },
26603     /* 51 << 28 */
26604     { { 0x5dc169b028f33398L,0xb07ec11d72e90f65L,0xae7f3b4afaab1eb1L,
26605         0xd970195e5f17538aL },
26606       { 0x52b05cbe0181e640L,0xf5debd622643313dL,0x761481545df31f82L,
26607         0x23e03b333a9e13c5L } },
26608     /* 52 << 28 */
26609     { { 0xff7589494fde0c1fL,0xbf8a1abee5b6ec20L,0x702278fb87e1db6cL,
26610         0xc447ad7a35ed658fL },
26611       { 0x48d4aa3803d0ccf2L,0x80acb338819a7c03L,0x9bc7c89e6e17ceccL,
26612         0x46736b8b03be1d82L } },
26613     /* 53 << 28 */
26614     { { 0xd65d7b60c0432f96L,0xddebe7a3deb5442fL,0x79a253077dff69a2L,
26615         0x37a56d9402cf3122L },
26616       { 0x8bab8aedf2350d0aL,0x13c3f276037b0d9aL,0xc664957c44c65caeL,
26617         0x88b44089c2e71a88L } },
26618     /* 54 << 28 */
26619     { { 0xdb88e5a35cb02664L,0x5d4c0bf18686c72eL,0xea3d9b62a682d53eL,
26620         0x9b605ef40b2ad431L },
26621       { 0x71bac202c69645d0L,0xa115f03a6a1b66e7L,0xfe2c563a158f4dc4L,
26622         0xf715b3a04d12a78cL } },
26623     /* 55 << 28 */
26624     { { 0x8f7f0a48d413213aL,0x2035806dc04becdbL,0xecd34a995d8587f5L,
26625         0x4d8c30799f6d3a71L },
26626       { 0x1b2a2a678d95a8f6L,0xc58c9d7df2110d0dL,0xdeee81d5cf8fba3fL,
26627         0xa42be3c00c7cdf68L } },
26628     /* 56 << 28 */
26629     { { 0x2126f742d43b5eaaL,0x054a0766dfa59b85L,0x9d0d5e36126bfd45L,
26630         0xa1f8fbd7384f8a8fL },
26631       { 0x317680f5d563fcccL,0x48ca5055f280a928L,0xe00b81b227b578cfL,
26632         0x10aad9182994a514L } },
26633     /* 57 << 28 */
26634     { { 0xd9e07b62b7bdc953L,0x9f0f6ff25bc086ddL,0x09d1ccff655eee77L,
26635         0x45475f795bef7df1L },
26636       { 0x3faa28fa86f702ccL,0x92e609050f021f07L,0xe9e629687f8fa8c6L,
26637         0xbd71419af036ea2cL } },
26638     /* 58 << 28 */
26639     { { 0x171ee1cc6028da9aL,0x5352fe1ac251f573L,0xf8ff236e3fa997f4L,
26640         0xd831b6c9a5749d5fL },
26641       { 0x7c872e1de350e2c2L,0xc56240d91e0ce403L,0xf9deb0776974f5cbL,
26642         0x7d50ba87961c3728L } },
26643     /* 59 << 28 */
26644     { { 0xd6f894265a3a2518L,0xcf817799c6303d43L,0x510a0471619e5696L,
26645         0xab049ff63a5e307bL },
26646       { 0xe4cdf9b0feb13ec7L,0xd5e971179d8ff90cL,0xf6f64d069afa96afL,
26647         0x00d0bf5e9d2012a2L } },
26648     /* 60 << 28 */
26649     { { 0xe63f301f358bcdc0L,0x07689e990a9d47f8L,0x1f689e2f4f43d43aL,
26650         0x4d542a1690920904L },
26651       { 0xaea293d59ca0a707L,0xd061fe458ac68065L,0x1033bf1b0090008cL,
26652         0x29749558c08a6db6L } },
26653     /* 61 << 28 */
26654     { { 0x74b5fc59c1d5d034L,0xf712e9f667e215e0L,0xfd520cbd860200e6L,
26655         0x0229acb43ea22588L },
26656       { 0x9cd1e14cfff0c82eL,0x87684b6259c69e73L,0xda85e61c96ccb989L,
26657         0x2d5dbb02a3d06493L } },
26658     /* 62 << 28 */
26659     { { 0xf22ad33ae86b173cL,0xe8e41ea5a79ff0e3L,0x01d2d725dd0d0c10L,
26660         0x31f39088032d28f9L },
26661       { 0x7b3f71e17829839eL,0x0cf691b44502ae58L,0xef658dbdbefc6115L,
26662         0xa5cd6ee5b3ab5314L } },
26663     /* 63 << 28 */
26664     { { 0x206c8d7b5f1d2347L,0x794645ba4cc2253aL,0xd517d8ff58389e08L,
26665         0x4fa20dee9f847288L },
26666       { 0xeba072d8d797770aL,0x7360c91dbf429e26L,0x7200a3b380af8279L,
26667         0x6a1c915082dadce3L } },
26668     /* 64 << 28 */
26669     { { 0x0ee6d3a7c35d8794L,0x042e65580356bae5L,0x9f59698d643322fdL,
26670         0x9379ae1550a61967L },
26671       { 0x64b9ae62fcc9981eL,0xaed3d6316d2934c6L,0x2454b3025e4e65ebL,
26672         0xab09f647f9950428L } },
26673     /* 0 << 35 */
26674     { { 0x00, 0x00, 0x00, 0x00 },
26675       { 0x00, 0x00, 0x00, 0x00 } },
26676     /* 1 << 35 */
26677     { { 0xb2083a1222248accL,0x1f6ec0ef3264e366L,0x5659b7045afdee28L,
26678         0x7a823a40e6430bb5L },
26679       { 0x24592a04e1900a79L,0xcde09d4ac9ee6576L,0x52b6463f4b5ea54aL,
26680         0x1efe9ed3d3ca65a7L } },
26681     /* 2 << 35 */
26682     { { 0xe27a6dbe305406ddL,0x8eb7dc7fdd5d1957L,0xf54a6876387d4d8fL,
26683         0x9c479409c7762de4L },
26684       { 0xbe4d5b5d99b30778L,0x25380c566e793682L,0x602d37f3dac740e3L,
26685         0x140deabe1566e4aeL } },
26686     /* 3 << 35 */
26687     { { 0x4481d067afd32acfL,0xd8f0fccae1f71ccfL,0xd208dd0cb596f2daL,
26688         0xd049d7309aad93f9L },
26689       { 0xc79f263d42ab580eL,0x09411bb123f707b4L,0x8cfde1ff835e0edaL,
26690         0x7270749090f03402L } },
26691     /* 4 << 35 */
26692     { { 0xeaee6126c49a861eL,0x024f3b65e14f0d06L,0x51a3f1e8c69bfc17L,
26693         0xc3c3a8e9a7686381L },
26694       { 0x3400752cb103d4c8L,0x02bc46139218b36bL,0xc67f75eb7651504aL,
26695         0xd6848b56d02aebfaL } },
26696     /* 5 << 35 */
26697     { { 0xbd9802e6c30fa92bL,0x5a70d96d9a552784L,0x9085c4ea3f83169bL,
26698         0xfa9423bb06908228L },
26699       { 0x2ffebe12fe97a5b9L,0x85da604971b99118L,0x9cbc2f7f63178846L,
26700         0xfd96bc709153218eL } },
26701     /* 6 << 35 */
26702     { { 0x958381db1782269bL,0xae34bf792597e550L,0xbb5c60645f385153L,
26703         0x6f0e96afe3088048L },
26704       { 0xbf6a021577884456L,0xb3b5688c69310ea7L,0x17c9429504fad2deL,
26705         0xe020f0e517896d4dL } },
26706     /* 7 << 35 */
26707     { { 0x730ba0ab0976505fL,0x567f6813095e2ec5L,0x470620106331ab71L,
26708         0x72cfa97741d22b9fL },
26709       { 0x33e55ead8a2373daL,0xa8d0d5f47ba45a68L,0xba1d8f9c03029d15L,
26710         0x8f34f1ccfc55b9f3L } },
26711     /* 8 << 35 */
26712     { { 0xcca4428dbbe5a1a9L,0x8187fd5f3126bd67L,0x0036973a48105826L,
26713         0xa39b6663b8bd61a0L },
26714       { 0x6d42deef2d65a808L,0x4969044f94636b19L,0xf611ee47dd5d564cL,
26715         0x7b2f3a49d2873077L } },
26716     /* 9 << 35 */
26717     { { 0x94157d45300eb294L,0x2b2a656e169c1494L,0xc000dd76d3a47aa9L,
26718         0xa2864e4fa6243ea4L },
26719       { 0x82716c47db89842eL,0x12dfd7d761479fb7L,0x3b9a2c56e0b2f6dcL,
26720         0x46be862ad7f85d67L } },
26721     /* 10 << 35 */
26722     { { 0x03b0d8dd0f82b214L,0x460c34f9f103cbc6L,0xf32e5c0318d79e19L,
26723         0x8b8888baa84117f8L },
26724       { 0x8f3c37dcc0722677L,0x10d21be91c1c0f27L,0xd47c8468e0f7a0c6L,
26725         0x9bf02213adecc0e0L } },
26726     /* 11 << 35 */
26727     { { 0x0baa7d1242b48b99L,0x1bcb665d48424096L,0x8b847cd6ebfb5cfbL,
26728         0x87c2ae569ad4d10dL },
26729       { 0xf1cbb1220de36726L,0xe7043c683fdfbd21L,0x4bd0826a4e79d460L,
26730         0x11f5e5984bd1a2cbL } },
26731     /* 12 << 35 */
26732     { { 0x97554160b7fe7b6eL,0x7d16189a400a3fb2L,0xd73e9beae328ca1eL,
26733         0x0dd04b97e793d8ccL },
26734       { 0xa9c83c9b506db8ccL,0x5cd47aaecf38814cL,0x26fc430db64b45e6L,
26735         0x079b5499d818ea84L } },
26736     /* 13 << 35 */
26737     { { 0xebb01102c1c24a3bL,0xca24e5681c161c1aL,0x103eea6936f00a4aL,
26738         0x9ad76ee876176c7bL },
26739       { 0x97451fc2538e0ff7L,0x94f898096604b3b0L,0x6311436e3249cfd7L,
26740         0x27b4a7bd41224f69L } },
26741     /* 14 << 35 */
26742     { { 0x03b5d21ae0ac2941L,0x279b0254c2d31937L,0x3307c052cac992d0L,
26743         0x6aa7cb92efa8b1f3L },
26744       { 0x5a1825800d37c7a5L,0x13380c37342d5422L,0x92ac2d66d5d2ef92L,
26745         0x035a70c9030c63c6L } },
26746     /* 15 << 35 */
26747     { { 0xc16025dd4ce4f152L,0x1f419a71f9df7c06L,0x6d5b221491e4bb14L,
26748         0xfc43c6cc839fb4ceL },
26749       { 0x49f06591925d6b2dL,0x4b37d9d362186598L,0x8c54a971d01b1629L,
26750         0xe1a9c29f51d50e05L } },
26751     /* 16 << 35 */
26752     { { 0x5109b78571ba1861L,0x48b22d5cd0c8f93dL,0xe8fa84a78633bb93L,
26753         0x53fba6ba5aebbd08L },
26754       { 0x7ff27df3e5eea7d8L,0x521c879668ca7158L,0xb9d5133bce6f1a05L,
26755         0x2d50cd53fd0ebee4L } },
26756     /* 17 << 35 */
26757     { { 0xc82115d6c5a3ef16L,0x993eff9dba079221L,0xe4da2c5e4b5da81cL,
26758         0x9a89dbdb8033fd85L },
26759       { 0x60819ebf2b892891L,0x53902b215d14a4d5L,0x6ac35051d7fda421L,
26760         0xcc6ab88561c83284L } },
26761     /* 18 << 35 */
26762     { { 0x14eba133f74cff17L,0x240aaa03ecb813f2L,0xcfbb65406f665beeL,
26763         0x084b1fe4a425ad73L },
26764       { 0x009d5d16d081f6a6L,0x35304fe8eef82c90L,0xf20346d5aa9eaa22L,
26765         0x0ada9f07ac1c91e3L } },
26766     /* 19 << 35 */
26767     { { 0xa6e21678968a6144L,0x54c1f77c07b31a1eL,0xd6bb787e5781fbe1L,
26768         0x61bd2ee0e31f1c4aL },
26769       { 0xf25aa1e9781105fcL,0x9cf2971f7b2f8e80L,0x26d15412cdff919bL,
26770         0x01db4ebe34bc896eL } },
26771     /* 20 << 35 */
26772     { { 0x7d9b3e23b40df1cfL,0x5933737394e971b4L,0xbf57bd14669cf921L,
26773         0x865daedf0c1a1064L },
26774       { 0x3eb70bd383279125L,0xbc3d5b9f34ecdaabL,0x91e3ed7e5f755cafL,
26775         0x49699f54d41e6f02L } },
26776     /* 21 << 35 */
26777     { { 0x185770e1d4a7a15bL,0x08f3587aeaac87e7L,0x352018db473133eaL,
26778         0x674ce71904fd30fcL },
26779       { 0x7b8d9835088b3e0eL,0x7a0356a95d0d47a1L,0x9d9e76596474a3c4L,
26780         0x61ea48a7ff66966cL } },
26781     /* 22 << 35 */
26782     { { 0x304177580f3e4834L,0xfdbb21c217a9afcbL,0x756fa17f2f9a67b3L,
26783         0x2a6b2421a245c1a8L },
26784       { 0x64be27944af02291L,0xade465c62a5804feL,0x8dffbd39a6f08fd7L,
26785         0xc4efa84caa14403bL } },
26786     /* 23 << 35 */
26787     { { 0xa1b91b2a442b0f5cL,0xb748e317cf997736L,0x8d1b62bfcee90e16L,
26788         0x907ae2710b2078c0L },
26789       { 0xdf31534b0c9bcdddL,0x043fb05439adce83L,0x99031043d826846aL,
26790         0x61a9c0d6b144f393L } },
26791     /* 24 << 35 */
26792     { { 0xdab4804647718427L,0xdf17ff9b6e830f8bL,0x408d7ee8e49a1347L,
26793         0x6ac71e2391c1d4aeL },
26794       { 0xc8cbb9fd1defd73cL,0x19840657bbbbfec5L,0x39db1cb59e7ef8eaL,
26795         0x78aa829664105f30L } },
26796     /* 25 << 35 */
26797     { { 0xa3d9b7f0a3738c29L,0x0a2f235abc3250a3L,0x55e506f6445e4cafL,
26798         0x0974f73d33475f7aL },
26799       { 0xd37dbba35ba2f5a8L,0x542c6e636af40066L,0x26d99b53c5d73e2cL,
26800         0x06060d7d6c3ca33eL } },
26801     /* 26 << 35 */
26802     { { 0xcdbef1c2065fef4aL,0x77e60f7dfd5b92e3L,0xd7c549f026708350L,
26803         0x201b3ad034f121bfL },
26804       { 0x5fcac2a10334fc14L,0x8a9a9e09344552f6L,0x7dd8a1d397653082L,
26805         0x5fc0738f79d4f289L } },
26806     /* 27 << 35 */
26807     { { 0x787d244d17d2d8c3L,0xeffc634570830684L,0x5ddb96dde4f73ae5L,
26808         0x8efb14b1172549a5L },
26809       { 0x6eb73eee2245ae7aL,0xbca4061eea11f13eL,0xb577421d30b01f5dL,
26810         0xaa688b24782e152cL } },
26811     /* 28 << 35 */
26812     { { 0x67608e71bd3502baL,0x4ef41f24b4de75a0L,0xb08dde5efd6125e5L,
26813         0xde484825a409543fL },
26814       { 0x1f198d9865cc2295L,0x428a37716e0edfa2L,0x4f9697a2adf35fc7L,
26815         0x01a43c79f7cac3c7L } },
26816     /* 29 << 35 */
26817     { { 0xb05d70590fd3659aL,0x8927f30cbb7f2d9aL,0x4023d1ac8cf984d3L,
26818         0x32125ed302897a45L },
26819       { 0xfb572dad3d414205L,0x73000ef2e3fa82a9L,0x4c0868e9f10a5581L,
26820         0x5b61fc676b0b3ca5L } },
26821     /* 30 << 35 */
26822     { { 0xc1258d5b7cae440cL,0x21c08b41402b7531L,0xf61a8955de932321L,
26823         0x3568faf82d1408afL },
26824       { 0x71b15e999ecf965bL,0xf14ed248e917276fL,0xc6f4caa1820cf9e2L,
26825         0x681b20b218d83c7eL } },
26826     /* 31 << 35 */
26827     { { 0x6cde738dc6c01120L,0x71db0813ae70e0dbL,0x95fc064474afe18cL,
26828         0x34619053129e2be7L },
26829       { 0x80615ceadb2a3b15L,0x0a49a19edb4c7073L,0x0e1b84c88fd2d367L,
26830         0xd74bf462033fb8aaL } },
26831     /* 32 << 35 */
26832     { { 0x889f6d65533ef217L,0x7158c7e4c3ca2e87L,0xfb670dfbdc2b4167L,
26833         0x75910a01844c257fL },
26834       { 0xf336bf07cf88577dL,0x22245250e45e2aceL,0x2ed92e8d7ca23d85L,
26835         0x29f8be4c2b812f58L } },
26836     /* 33 << 35 */
26837     { { 0xdd9ebaa7076fe12bL,0x3f2400cbae1537f9L,0x1aa9352817bdfb46L,
26838         0xc0f9843067883b41L },
26839       { 0x5590ede10170911dL,0x7562f5bb34d4b17fL,0xe1fa1df21826b8d2L,
26840         0xb40b796a6bd80d59L } },
26841     /* 34 << 35 */
26842     { { 0xd65bf1973467ba92L,0x8c9b46dbf70954b0L,0x97c8a0f30e78f15dL,
26843         0xa8f3a69a85a4c961L },
26844       { 0x4242660f61e4ce9bL,0xbf06aab36ea6790cL,0xc6706f8eec986416L,
26845         0x9e56dec19a9fc225L } },
26846     /* 35 << 35 */
26847     { { 0x527c46f49a9898d9L,0xd799e77b5633cdefL,0x24eacc167d9e4297L,
26848         0xabb61cea6b1cb734L },
26849       { 0xbee2e8a7f778443cL,0x3bb42bf129de2fe6L,0xcbed86a13003bb6fL,
26850         0xd3918e6cd781cdf6L } },
26851     /* 36 << 35 */
26852     { { 0x4bee32719a5103f1L,0x5243efc6f50eac06L,0xb8e122cb6adcc119L,
26853         0x1b7faa84c0b80a08L },
26854       { 0x32c3d1bd6dfcd08cL,0x129dec4e0be427deL,0x98ab679c1d263c83L,
26855         0xafc83cb7cef64effL } },
26856     /* 37 << 35 */
26857     { { 0x85eb60882fa6be76L,0x892585fb1328cbfeL,0xc154d3edcf618ddaL,
26858         0xc44f601b3abaf26eL },
26859       { 0x7bf57d0b2be1fdfdL,0xa833bd2d21137feeL,0x9353af362db591a8L,
26860         0xc76f26dc5562a056L } },
26861     /* 38 << 35 */
26862     { { 0x1d87e47d3fdf5a51L,0x7afb5f9355c9cab0L,0x91bbf58f89e0586eL,
26863         0x7c72c0180d843709L },
26864       { 0xa9a5aafb99b5c3dcL,0xa48a0f1d3844aeb0L,0x7178b7ddb667e482L,
26865         0x453985e96e23a59aL } },
26866     /* 39 << 35 */
26867     { { 0x4a54c86001b25dd8L,0x0dd37f48fb897c8aL,0x5f8aa6100ea90cd9L,
26868         0xc8892c6816d5830dL },
26869       { 0xeb4befc0ef514ca5L,0x478eb679e72c9ee6L,0x9bca20dadbc40d5fL,
26870         0xf015de21dde4f64aL } },
26871     /* 40 << 35 */
26872     { { 0xaa6a4de0eaf4b8a5L,0x68cfd9ca4bc60e32L,0x668a4b017fd15e70L,
26873         0xd9f0694af27dc09dL },
26874       { 0xf6c3cad5ba708bcdL,0x5cd2ba695bb95c2aL,0xaa28c1d333c0a58fL,
26875         0x23e274e3abc77870L } },
26876     /* 41 << 35 */
26877     { { 0x44c3692ddfd20a4aL,0x091c5fd381a66653L,0x6c0bb69109a0757dL,
26878         0x9072e8b9667343eaL },
26879       { 0x31d40eb080848becL,0x95bd480a79fd36ccL,0x01a77c6165ed43f5L,
26880         0xafccd1272e0d40bfL } },
26881     /* 42 << 35 */
26882     { { 0xeccfc82d1cc1884bL,0xc85ac2015d4753b4L,0xc7a6caac658e099fL,
26883         0xcf46369e04b27390L },
26884       { 0xe2e7d049506467eaL,0x481b63a237cdecccL,0x4029abd8ed80143aL,
26885         0x28bfe3c7bcb00b88L } },
26886     /* 43 << 35 */
26887     { { 0x3bec10090643d84aL,0x885f3668abd11041L,0xdb02432cf83a34d6L,
26888         0x32f7b360719ceebeL },
26889       { 0xf06c7837dad1fe7aL,0x60a157a95441a0b0L,0x704970e9e2d47550L,
26890         0xcd2bd553271b9020L } },
26891     /* 44 << 35 */
26892     { { 0xff57f82f33e24a0bL,0x9cbee23ff2565079L,0x16353427eb5f5825L,
26893         0x276feec4e948d662L },
26894       { 0xd1b62bc6da10032bL,0x718351ddf0e72a53L,0x934520762420e7baL,
26895         0x96368fff3a00118dL } },
26896     /* 45 << 35 */
26897     { { 0x00ce2d26150a49e4L,0x0c28b6363f04706bL,0xbad65a4658b196d0L,
26898         0x6c8455fcec9f8b7cL },
26899       { 0xe90c895f2d71867eL,0x5c0be31bedf9f38cL,0x2a37a15ed8f6ec04L,
26900         0x239639e78cd85251L } },
26901     /* 46 << 35 */
26902     { { 0xd89753159c7c4c6bL,0x603aa3c0d7409af7L,0xb8d53d0c007132fbL,
26903         0x68d12af7a6849238L },
26904       { 0xbe0607e7bf5d9279L,0x9aa50055aada74ceL,0xe81079cbba7e8ccbL,
26905         0x610c71d1a5f4ff5eL } },
26906     /* 47 << 35 */
26907     { { 0x9e2ee1a75aa07093L,0xca84004ba75da47cL,0x074d39513de75401L,
26908         0xf938f756bb311592L },
26909       { 0x9619761800a43421L,0x39a2536207bc78c8L,0x278f710a0a171276L,
26910         0xb28446ea8d1a8f08L } },
26911     /* 48 << 35 */
26912     { { 0x184781bfe3b6a661L,0x7751cb1de6d279f7L,0xf8ff95d6c59eb662L,
26913         0x186d90b758d3dea7L },
26914       { 0x0e4bb6c1dfb4f754L,0x5c5cf56b2b2801dcL,0xc561e4521f54564dL,
26915         0xb4fb8c60f0dd7f13L } },
26916     /* 49 << 35 */
26917     { { 0xf884963033ff98c7L,0x9619fffacf17769cL,0xf8090bf61bfdd80aL,
26918         0x14d9a149422cfe63L },
26919       { 0xb354c3606f6df9eaL,0xdbcf770d218f17eaL,0x207db7c879eb3480L,
26920         0x213dbda8559b6a26L } },
26921     /* 50 << 35 */
26922     { { 0xac4c200b29fc81b3L,0xebc3e09f171d87c1L,0x917995301481aa9eL,
26923         0x051b92e192e114faL },
26924       { 0xdf8f92e9ecb5537fL,0x44b1b2cc290c7483L,0xa711455a2adeb016L,
26925         0x964b685681a10c2cL } },
26926     /* 51 << 35 */
26927     { { 0x4f159d99cec03623L,0x05532225ef3271eaL,0xb231bea3c5ee4849L,
26928         0x57a54f507094f103L },
26929       { 0x3e2d421d9598b352L,0xe865a49c67412ab4L,0xd2998a251cc3a912L,
26930         0x5d0928080c74d65dL } },
26931     /* 52 << 35 */
26932     { { 0x73f459084088567aL,0xeb6b280e1f214a61L,0x8c9adc34caf0c13dL,
26933         0x39d12938f561fb80L },
26934       { 0xb2dc3a5ebc6edfb4L,0x7485b1b1fe4d210eL,0x062e0400e186ae72L,
26935         0x91e32d5c6eeb3b88L } },
26936     /* 53 << 35 */
26937     { { 0x6df574d74be59224L,0xebc88ccc716d55f3L,0x26c2e6d0cad6ed33L,
26938         0xc6e21e7d0d3e8b10L },
26939       { 0x2cc5840e5bcc36bbL,0x9292445e7da74f69L,0x8be8d3214e5193a8L,
26940         0x3ec236298df06413L } },
26941     /* 54 << 35 */
26942     { { 0xc7e9ae85b134defaL,0x6073b1d01bb2d475L,0xb9ad615e2863c00dL,
26943         0x9e29493d525f4ac4L },
26944       { 0xc32b1dea4e9acf4fL,0x3e1f01c8a50db88dL,0xb05d70ea04da916cL,
26945         0x714b0d0ad865803eL } },
26946     /* 55 << 35 */
26947     { { 0x4bd493fc9920cb5eL,0x5b44b1f792c7a3acL,0xa2a77293bcec9235L,
26948         0x5ee06e87cd378553L },
26949       { 0xceff8173da621607L,0x2bb03e4c99f5d290L,0x2945106aa6f734acL,
26950         0xb5056604d25c4732L } },
26951     /* 56 << 35 */
26952     { { 0x5945920ce079afeeL,0x686e17a06789831fL,0x5966bee8b74a5ae5L,
26953         0x38a673a21e258d46L },
26954       { 0xbd1cc1f283141c95L,0x3b2ecf4f0e96e486L,0xcd3aa89674e5fc78L,
26955         0x415ec10c2482fa7aL } },
26956     /* 57 << 35 */
26957     { { 0x1523441980503380L,0x513d917ad314b392L,0xb0b52f4e63caecaeL,
26958         0x07bf22ad2dc7780bL },
26959       { 0xe761e8a1e4306839L,0x1b3be9625dd7feaaL,0x4fe728de74c778f1L,
26960         0xf1fa0bda5e0070f6L } },
26961     /* 58 << 35 */
26962     { { 0x85205a316ec3f510L,0x2c7e4a14d2980475L,0xde3c19c06f30ebfdL,
26963         0xdb1c1f38d4b7e644L },
26964       { 0xfe291a755dce364aL,0xb7b22a3c058f5be3L,0x2cd2c30237fea38cL,
26965         0x2930967a2e17be17L } },
26966     /* 59 << 35 */
26967     { { 0x87f009de0c061c65L,0xcb014aacedc6ed44L,0x49bd1cb43bafb1ebL,
26968         0x81bd8b5c282d3688L },
26969       { 0x1cdab87ef01a17afL,0x21f37ac4e710063bL,0x5a6c567642fc8193L,
26970         0xf4753e7056a6015cL } },
26971     /* 60 << 35 */
26972     { { 0x020f795ea15b0a44L,0x8f37c8d78958a958L,0x63b7e89ba4b675b5L,
26973         0xb4fb0c0c0fc31aeaL },
26974       { 0xed95e639a7ff1f2eL,0x9880f5a3619614fbL,0xdeb6ff02947151abL,
26975         0x5bc5118ca868dcdbL } },
26976     /* 61 << 35 */
26977     { { 0xd8da20554c20cea5L,0xcac2776e14c4d69aL,0xcccb22c1622d599bL,
26978         0xa4ddb65368a9bb50L },
26979       { 0x2c4ff1511b4941b4L,0xe1ff19b46efba588L,0x35034363c48345e0L,
26980         0x45542e3d1e29dfc4L } },
26981     /* 62 << 35 */
26982     { { 0xf197cb91349f7aedL,0x3b2b5a008fca8420L,0x7c175ee823aaf6d8L,
26983         0x54dcf42135af32b6L },
26984       { 0x0ba1430727d6561eL,0x879d5ee4d175b1e2L,0xc7c4367399807db5L,
26985         0x77a544559cd55bcdL } },
26986     /* 63 << 35 */
26987     { { 0xe6c2ff130105c072L,0x18f7a99f8dda7da4L,0x4c3018200e2d35c1L,
26988         0x06a53ca0d9cc6c82L },
26989       { 0xaa21cc1ef1aa1d9eL,0x324143344a75b1e8L,0x2a6d13280ebe9fdcL,
26990         0x16bd173f98a4755aL } },
26991     /* 64 << 35 */
26992     { { 0xfbb9b2452133ffd9L,0x39a8b2f1830f1a20L,0x484bc97dd5a1f52aL,
26993         0xd6aebf56a40eddf8L },
26994       { 0x32257acb76ccdac6L,0xaf4d36ec1586ff27L,0x8eaa8863f8de7dd1L,
26995         0x0045d5cf88647c16L } },
26996     /* 0 << 42 */
26997     { { 0x00, 0x00, 0x00, 0x00 },
26998       { 0x00, 0x00, 0x00, 0x00 } },
26999     /* 1 << 42 */
27000     { { 0xa6f3d574c005979dL,0xc2072b426a40e350L,0xfca5c1568de2ecf9L,
27001         0xa8c8bf5ba515344eL },
27002       { 0x97aee555114df14aL,0xd4374a4dfdc5ec6bL,0x754cc28f2ca85418L,
27003         0x71cb9e27d3c41f78L } },
27004     /* 2 << 42 */
27005     { { 0x8910507903605c39L,0xf0843d9ea142c96cL,0xf374493416923684L,
27006         0x732caa2ffa0a2893L },
27007       { 0xb2e8c27061160170L,0xc32788cc437fbaa3L,0x39cd818ea6eda3acL,
27008         0xe2e942399e2b2e07L } },
27009     /* 3 << 42 */
27010     { { 0x6967d39b0260e52aL,0xd42585cc90653325L,0x0d9bd60521ca7954L,
27011         0x4fa2087781ed57b3L },
27012       { 0x60c1eff8e34a0bbeL,0x56b0040c84f6ef64L,0x28be2b24b1af8483L,
27013         0xb2278163f5531614L } },
27014     /* 4 << 42 */
27015     { { 0x8df275455922ac1cL,0xa7b3ef5ca52b3f63L,0x8e77b21471de57c4L,
27016         0x31682c10834c008bL },
27017       { 0xc76824f04bd55d31L,0xb6d1c08617b61c71L,0x31db0903c2a5089dL,
27018         0x9c092172184e5d3fL } },
27019     /* 5 << 42 */
27020     { { 0xdd7ced5bc00cc638L,0x1a2015eb61278fc2L,0x2e8e52886a37f8d6L,
27021         0xc457786fe79933adL },
27022       { 0xb3fe4cce2c51211aL,0xad9b10b224c20498L,0x90d87a4fd28db5e5L,
27023         0x698cd1053aca2fc3L } },
27024     /* 6 << 42 */
27025     { { 0x4f112d07e91b536dL,0xceb982f29eba09d6L,0x3c157b2c197c396fL,
27026         0xe23c2d417b66eb24L },
27027       { 0x480c57d93f330d37L,0xb3a4c8a179108debL,0x702388decb199ce5L,
27028         0x0b019211b944a8d4L } },
27029     /* 7 << 42 */
27030     { { 0x24f2a692840bb336L,0x7c353bdca669fa7bL,0xda20d6fcdec9c300L,
27031         0x625fbe2fa13a4f17L },
27032       { 0xa2b1b61adbc17328L,0x008965bfa9515621L,0x49690939c620ff46L,
27033         0x182dd27d8717e91cL } },
27034     /* 8 << 42 */
27035     { { 0x5ace5035ea6c3997L,0x54259aaac2610befL,0xef18bb3f3c80dd39L,
27036         0x6910b95b5fc3fa39L },
27037       { 0xfce2f51043e09aeeL,0xced56c9fa7675665L,0x10e265acd872db61L,
27038         0x6982812eae9fce69L } },
27039     /* 9 << 42 */
27040     { { 0x29be11c6ce800998L,0x72bb1752b90360d9L,0x2c1931975a4ad590L,
27041         0x2ba2f5489fc1dbc0L },
27042       { 0x7fe4eebbe490ebe0L,0x12a0a4cd7fae11c0L,0x7197cf81e903ba37L,
27043         0xcf7d4aa8de1c6dd8L } },
27044     /* 10 << 42 */
27045     { { 0x92af6bf43fd5684cL,0x2b26eecf80360aa1L,0xbd960f3000546a82L,
27046         0x407b3c43f59ad8feL },
27047       { 0x86cae5fe249c82baL,0x9e0faec72463744cL,0x87f551e894916272L,
27048         0x033f93446ceb0615L } },
27049     /* 11 << 42 */
27050     { { 0x1e5eb0d18be82e84L,0x89967f0e7a582fefL,0xbcf687d5a6e921faL,
27051         0xdfee4cf3d37a09baL },
27052       { 0x94f06965b493c465L,0x638b9a1c7635c030L,0x7666786466f05e9fL,
27053         0xccaf6808c04da725L } },
27054     /* 12 << 42 */
27055     { { 0xca2eb690768fccfcL,0xf402d37db835b362L,0x0efac0d0e2fdfcceL,
27056         0xefc9cdefb638d990L },
27057       { 0x2af12b72d1669a8bL,0x33c536bc5774ccbdL,0x30b21909fb34870eL,
27058         0xc38fa2f77df25acaL } },
27059     /* 13 << 42 */
27060     { { 0x74c5f02bbf81f3f5L,0x0525a5aeaf7e4581L,0x88d2aaba433c54aeL,
27061         0xed9775db806a56c5L },
27062       { 0xd320738ac0edb37dL,0x25fdb6ee66cc1f51L,0xac661d1710600d76L,
27063         0x931ec1f3bdd1ed76L } },
27064     /* 14 << 42 */
27065     { { 0x65c11d6219ee43f1L,0x5cd57c3e60829d97L,0xd26c91a3984be6e8L,
27066         0xf08d93098b0c53bdL },
27067       { 0x94bc9e5bc016e4eaL,0xd391683911d43d2bL,0x886c5ad773701155L,
27068         0xe037762620b00715L } },
27069     /* 15 << 42 */
27070     { { 0x7f01c9ecaa80ba59L,0x3083411a68538e51L,0x970370f1e88128afL,
27071         0x625cc3db91dec14bL },
27072       { 0xfef9666c01ac3107L,0xb2a8d577d5057ac3L,0xb0f2629992be5df7L,
27073         0xf579c8e500353924L } },
27074     /* 16 << 42 */
27075     { { 0xb8fa3d931341ed7aL,0x4223272ca7b59d49L,0x3dcb194783b8c4a4L,
27076         0x4e413c01ed1302e4L },
27077       { 0x6d999127e17e44ceL,0xee86bf7533b3adfbL,0xf6902fe625aa96caL,
27078         0xb73540e4e5aae47dL } },
27079     /* 17 << 42 */
27080     { { 0x32801d7b1b4a158cL,0xe571c99e27e2a369L,0x40cb76c010d9f197L,
27081         0xc308c2893167c0aeL },
27082       { 0xa6ef9dd3eb7958f2L,0xa7226dfc300879b1L,0x6cd0b3627edf0636L,
27083         0x4efbce6c7bc37eedL } },
27084     /* 18 << 42 */
27085     { { 0x75f92a058d699021L,0x586d4c79772566e3L,0x378ca5f1761ad23aL,
27086         0x650d86fc1465a8acL },
27087       { 0x7a4ed457842ba251L,0x6b65e3e642234933L,0xaf1543b731aad657L,
27088         0xa4cefe98cbfec369L } },
27089     /* 19 << 42 */
27090     { { 0xb587da909f47befbL,0x6562e9fb41312d13L,0xa691ea59eff1cefeL,
27091         0xcc30477a05fc4cf6L },
27092       { 0xa16324610b0ffd3dL,0xa1f16f3b5b355956L,0x5b148d534224ec24L,
27093         0xdc834e7bf977012aL } },
27094     /* 20 << 42 */
27095     { { 0x7bfc5e75b2c69dbcL,0x3aa77a2903c3da6cL,0xde0df03cca910271L,
27096         0xcbd5ca4a7806dc55L },
27097       { 0xe1ca58076db476cbL,0xfde15d625f37a31eL,0xf49af520f41af416L,
27098         0x96c5c5b17d342db5L } },
27099     /* 21 << 42 */
27100     { { 0x155c43b7eb4ceb9bL,0x2e9930104e77371aL,0x1d2987da675d43afL,
27101         0xef2bc1c08599fd72L },
27102       { 0x96894b7b9342f6b2L,0x201eadf27c8e71f0L,0xf3479d9f4a1f3efcL,
27103         0xe0f8a742702a9704L } },
27104     /* 22 << 42 */
27105     { { 0xeafd44b6b3eba40cL,0xf9739f29c1c1e0d0L,0x0091471a619d505eL,
27106         0xc15f9c969d7c263eL },
27107       { 0x5be4728583afbe33L,0xa3b6d6af04f1e092L,0xe76526b9751a9d11L,
27108         0x2ec5b26d9a4ae4d2L } },
27109     /* 23 << 42 */
27110     { { 0xeb66f4d902f6fb8dL,0x4063c56196912164L,0xeb7050c180ef3000L,
27111         0x288d1c33eaa5b3f0L },
27112       { 0xe87c68d607806fd8L,0xb2f7f9d54bbbf50fL,0x25972f3aac8d6627L,
27113         0xf854777410e8c13bL } },
27114     /* 24 << 42 */
27115     { { 0xcc50ef6c872b4a60L,0xab2a34a44613521bL,0x39c5c190983e15d1L,
27116         0x61dde5df59905512L },
27117       { 0xe417f6219f2275f3L,0x0750c8b6451d894bL,0x75b04ab978b0bdaaL,
27118         0x3bfd9fd4458589bdL } },
27119     /* 25 << 42 */
27120     { { 0xf1013e30ee9120b6L,0x2b51af9323a4743eL,0xea96ffae48d14d9eL,
27121         0x71dc0dbe698a1d32L },
27122       { 0x914962d20180cca4L,0x1ae60677c3568963L,0x8cf227b1437bc444L,
27123         0xc650c83bc9962c7aL } },
27124     /* 26 << 42 */
27125     { { 0x23c2c7ddfe7ccfc4L,0xf925c89d1b929d48L,0x4460f74b06783c33L,
27126         0xac2c8d49a590475aL },
27127       { 0xfb40b407b807bba0L,0x9d1e362d69ff8f3aL,0xa33e9681cbef64a4L,
27128         0x67ece5fa332fb4b2L } },
27129     /* 27 << 42 */
27130     { { 0x6900a99b739f10e3L,0xc3341ca9ff525925L,0xee18a626a9e2d041L,
27131         0xa5a8368529580dddL },
27132       { 0xf3470c819d7de3cdL,0xedf025862062cf9cL,0xf43522fac010edb0L,
27133         0x3031413513a4b1aeL } },
27134     /* 28 << 42 */
27135     { { 0xc792e02adb22b94bL,0x993d8ae9a1eaa45bL,0x8aad6cd3cd1e1c63L,
27136         0x89529ca7c5ce688aL },
27137       { 0x2ccee3aae572a253L,0xe02b643802a21efbL,0xa7091b6ec9430358L,
27138         0x06d1b1fa9d7db504L } },
27139     /* 29 << 42 */
27140     { { 0x58846d32c4744733L,0x40517c71379f9e34L,0x2f65655f130ef6caL,
27141         0x526e4488f1f3503fL },
27142       { 0x8467bd177ee4a976L,0x1d9dc913921363d1L,0xd8d24c33b069e041L,
27143         0x5eb5da0a2cdf7f51L } },
27144     /* 30 << 42 */
27145     { { 0x1c0f3cb1197b994fL,0x3c95a6c52843eae9L,0x7766ffc9a6097ea5L,
27146         0x7bea4093d723b867L },
27147       { 0xb48e1f734db378f9L,0x70025b00e37b77acL,0x943dc8e7af24ad46L,
27148         0xb98a15ac16d00a85L } },
27149     /* 31 << 42 */
27150     { { 0x3adc38ba2743b004L,0xb1c7f4f7334415eeL,0xea43df8f1e62d05aL,
27151         0x326189059d76a3b6L },
27152       { 0x2fbd0bb5a23a0f46L,0x5bc971db6a01918cL,0x7801d94ab4743f94L,
27153         0xb94df65e676ae22bL } },
27154     /* 32 << 42 */
27155     { { 0xaafcbfabaf95894cL,0x7b9bdc07276b2241L,0xeaf983625bdda48bL,
27156         0x5977faf2a3fcb4dfL },
27157       { 0xbed042ef052c4b5bL,0x9fe87f71067591f0L,0xc89c73ca22f24ec7L,
27158         0x7d37fa9ee64a9f1bL } },
27159     /* 33 << 42 */
27160     { { 0x2710841a15562627L,0x2c01a613c243b034L,0x1d135c562bc68609L,
27161         0xc2ca17158b03f1f6L },
27162       { 0xc9966c2d3eb81d82L,0xc02abf4a8f6df13eL,0x77b34bd78f72b43bL,
27163         0xaff6218f360c82b0L } },
27164     /* 34 << 42 */
27165     { { 0x0aa5726c8d55b9d2L,0xdc0adbe999e9bffbL,0x9097549cefb9e72aL,
27166         0x167557129dfb3111L },
27167       { 0xdd8bf984f26847f9L,0xbcb8e387dfb30cb7L,0xc1fd32a75171ef9cL,
27168         0x977f3fc7389b363fL } },
27169     /* 35 << 42 */
27170     { { 0x116eaf2bf4babda0L,0xfeab68bdf7113c8eL,0xd1e3f064b7def526L,
27171         0x1ac30885e0b3fa02L },
27172       { 0x1c5a6e7b40142d9dL,0x839b560330921c0bL,0x48f301fa36a116a3L,
27173         0x380e1107cfd9ee6dL } },
27174     /* 36 << 42 */
27175     { { 0x7945ead858854be1L,0x4111c12ecbd4d49dL,0xece3b1ec3a29c2efL,
27176         0x6356d4048d3616f5L },
27177       { 0x9f0d6a8f594d320eL,0x0989316df651ccd2L,0x6c32117a0f8fdde4L,
27178         0x9abe5cc5a26a9bbcL } },
27179     /* 37 << 42 */
27180     { { 0xcff560fb9723f671L,0x21b2a12d7f3d593cL,0xe4cb18da24ba0696L,
27181         0x186e2220c3543384L },
27182       { 0x722f64e088312c29L,0x94282a9917dc7752L,0x62467bbf5a85ee89L,
27183         0xf435c650f10076a0L } },
27184     /* 38 << 42 */
27185     { { 0xc9ff153943b3a50bL,0x7132130c1a53efbcL,0x31bfe063f7b0c5b7L,
27186         0xb0179a7d4ea994ccL },
27187       { 0x12d064b3c85f455bL,0x472593288f6e0062L,0xf64e590bb875d6d9L,
27188         0x22dd6225ad92bcc7L } },
27189     /* 39 << 42 */
27190     { { 0xb658038eb9c3bd6dL,0x00cdb0d6fbba27c8L,0x0c6813371062c45dL,
27191         0xd8515b8c2d33407dL },
27192       { 0xcb8f699e8cbb5ecfL,0x8c4347f8c608d7d8L,0x2c11850abb3e00dbL,
27193         0x20a8dafdecb49d19L } },
27194     /* 40 << 42 */
27195     { { 0xbd78148045ee2f40L,0x75e354af416b60cfL,0xde0b58a18d49a8c4L,
27196         0xe40e94e2fa359536L },
27197       { 0xbd4fa59f62accd76L,0x05cf466a8c762837L,0xb5abda99448c277bL,
27198         0x5a9e01bf48b13740L } },
27199     /* 41 << 42 */
27200     { { 0x9d457798326aad8dL,0xbdef4954c396f7e7L,0x6fb274a2c253e292L,
27201         0x2800bf0a1cfe53e7L },
27202       { 0x22426d3144438fd4L,0xef2339235e259f9aL,0x4188503c03f66264L,
27203         0x9e5e7f137f9fdfabL } },
27204     /* 42 << 42 */
27205     { { 0x565eb76c5fcc1abaL,0xea63254859b5bff8L,0x5587c087aab6d3faL,
27206         0x92b639ea6ce39c1bL },
27207       { 0x0706e782953b135cL,0x7308912e425268efL,0x599e92c7090e7469L,
27208         0x83b90f529bc35e75L } },
27209     /* 43 << 42 */
27210     { { 0x4750b3d0244975b3L,0xf3a4435811965d72L,0x179c67749c8dc751L,
27211         0xff18cdfed23d9ff0L },
27212       { 0xc40138332028e247L,0x96e280e2f3bfbc79L,0xf60417bdd0880a84L,
27213         0x263c9f3d2a568151L } },
27214     /* 44 << 42 */
27215     { { 0x36be15b32d2ce811L,0x846dc0c2f8291d21L,0x5cfa0ecb789fcfdbL,
27216         0x45a0beedd7535b9aL },
27217       { 0xec8e9f0796d69af1L,0x31a7c5b8599ab6dcL,0xd36d45eff9e2e09fL,
27218         0x3cf49ef1dcee954bL } },
27219     /* 45 << 42 */
27220     { { 0x6be34cf3086cff9bL,0x88dbd49139a3360fL,0x1e96b8cc0dbfbd1dL,
27221         0xc1e5f7bfcb7e2552L },
27222       { 0x0547b21428819d98L,0xc770dd9c7aea9dcbL,0xaef0d4c7041d68c8L,
27223         0xcc2b981813cb9ba8L } },
27224     /* 46 << 42 */
27225     { { 0x7fc7bc76fe86c607L,0x6b7b9337502a9a95L,0x1948dc27d14dab63L,
27226         0x249dd198dae047beL },
27227       { 0xe8356584a981a202L,0x3531dd183a893387L,0x1be11f90c85c7209L,
27228         0x93d2fe1ee2a52b5aL } },
27229     /* 47 << 42 */
27230     { { 0x8225bfe2ec6d6b97L,0x9cf6d6f4bd0aa5deL,0x911459cb54779f5fL,
27231         0x5649cddb86aeb1f3L },
27232       { 0x321335793f26ce5aL,0xc289a102550f431eL,0x559dcfda73b84c6fL,
27233         0x84973819ee3ac4d7L } },
27234     /* 48 << 42 */
27235     { { 0xb51e55e6f2606a82L,0xe25f706190f2fb57L,0xacef6c2ab1a4e37cL,
27236         0x864e359d5dcf2706L },
27237       { 0x479e6b187ce57316L,0x2cab25003a96b23dL,0xed4898628ef16df7L,
27238         0x2056538cef3758b5L } },
27239     /* 49 << 42 */
27240     { { 0xa7df865ef15d3101L,0x80c5533a61b553d7L,0x366e19974ed14294L,
27241         0x6620741fb3c0bcd6L },
27242       { 0x21d1d9c4edc45418L,0x005b859ec1cc4a9dL,0xdf01f630a1c462f0L,
27243         0x15d06cf3f26820c7L } },
27244     /* 50 << 42 */
27245     { { 0x9f7f24ee3484be47L,0x2ff33e964a0c902fL,0x00bdf4575a0bc453L,
27246         0x2378dfaf1aa238dbL },
27247       { 0x272420ec856720f2L,0x2ad9d95b96797291L,0xd1242cc6768a1558L,
27248         0x2e287f8b5cc86aa8L } },
27249     /* 51 << 42 */
27250     { { 0x796873d0990cecaaL,0xade55f81675d4080L,0x2645eea321f0cd84L,
27251         0x7a1efa0fb4e17d02L },
27252       { 0xf6858420037cc061L,0x682e05f0d5d43e12L,0x59c3699427218710L,
27253         0x85cbba4d3f7cd2fcL } },
27254     /* 52 << 42 */
27255     { { 0x726f97297a3cd22aL,0x9f8cd5dc4a628397L,0x17b93ab9c23165edL,
27256         0xff5f5dbf122823d4L },
27257       { 0xc1e4e4b5654a446dL,0xd1a9496f677257baL,0x6387ba94de766a56L,
27258         0x23608bc8521ec74aL } },
27259     /* 53 << 42 */
27260     { { 0x16a522d76688c4d4L,0x9d6b428207373abdL,0xa62f07acb42efaa3L,
27261         0xf73e00f7e3b90180L },
27262       { 0x36175fec49421c3eL,0xc4e44f9b3dcf2678L,0x76df436b7220f09fL,
27263         0x172755fb3aa8b6cfL } },
27264     /* 54 << 42 */
27265     { { 0xbab89d57446139ccL,0x0a0a6e025fe0208fL,0xcdbb63e211e5d399L,
27266         0x33ecaa12a8977f0bL },
27267       { 0x59598b21f7c42664L,0xb3e91b32ab65d08aL,0x035822eef4502526L,
27268         0x1dcf0176720a82a9L } },
27269     /* 55 << 42 */
27270     { { 0x50f8598f3d589e02L,0xdf0478ffb1d63d2cL,0x8b8068bd1571cd07L,
27271         0x30c3aa4fd79670cdL },
27272       { 0x25e8fd4b941ade7fL,0x3d1debdc32790011L,0x65b6dcbd3a3f9ff0L,
27273         0x282736a4793de69cL } },
27274     /* 56 << 42 */
27275     { { 0xef69a0c3d41d3bd3L,0xb533b8c907a26bdeL,0xe2801d97db2edf9fL,
27276         0xdc4a8269e1877af0L },
27277       { 0x6c1c58513d590dbeL,0x84632f6bee4e9357L,0xd36d36b779b33374L,
27278         0xb46833e39bbca2e6L } },
27279     /* 57 << 42 */
27280     { { 0x37893913f7fc0586L,0x385315f766bf4719L,0x72c56293b31855dcL,
27281         0xd1416d4e849061feL },
27282       { 0xbeb3ab7851047213L,0x447f6e61f040c996L,0xd06d310d638b1d0cL,
27283         0xe28a413fbad1522eL } },
27284     /* 58 << 42 */
27285     { { 0x685a76cb82003f86L,0x610d07f70bcdbca3L,0x6ff660219ca4c455L,
27286         0x7df39b87cea10eecL },
27287       { 0xb9255f96e22db218L,0x8cc6d9eb08a34c44L,0xcd4ffb86859f9276L,
27288         0x8fa15eb250d07335L } },
27289     /* 59 << 42 */
27290     { { 0xdf553845cf2c24b5L,0x89f66a9f52f9c3baL,0x8f22b5b9e4a7ceb3L,
27291         0xaffef8090e134686L },
27292       { 0x3e53e1c68eb8fac2L,0x93c1e4eb28aec98eL,0xb6b91ec532a43bcbL,
27293         0x2dbfa947b2d74a51L } },
27294     /* 60 << 42 */
27295     { { 0xe065d190ca84bad7L,0xfb13919fad58e65cL,0x3c41718bf1cb6e31L,
27296         0x688969f006d05c3fL },
27297       { 0xd4f94ce721264d45L,0xfdfb65e97367532bL,0x5b1be8b10945a39dL,
27298         0x229f789c2b8baf3bL } },
27299     /* 61 << 42 */
27300     { { 0xd8f41f3e6f49f15dL,0x678ce828907f0792L,0xc69ace82fca6e867L,
27301         0x106451aed01dcc89L },
27302       { 0x1bb4f7f019fc32d2L,0x64633dfcb00c52d2L,0x8f13549aad9ea445L,
27303         0x99a3bf50fb323705L } },
27304     /* 62 << 42 */
27305     { { 0x0c9625a2534d4dbcL,0x45b8f1d1c2a2fea3L,0x76ec21a1a530fc1aL,
27306         0x4bac9c2a9e5bd734L },
27307       { 0x5996d76a7b4e3587L,0x0045cdee1182d9e3L,0x1aee24b91207f13dL,
27308         0x66452e9797345a41L } },
27309     /* 63 << 42 */
27310     { { 0x16e5b0549f950cd0L,0x9cc72fb1d7fdd075L,0x6edd61e766249663L,
27311         0xde4caa4df043cccbL },
27312       { 0x11b1f57a55c7ac17L,0x779cbd441a85e24dL,0x78030f86e46081e7L,
27313         0xfd4a60328e20f643L } },
27314     /* 64 << 42 */
27315     { { 0xcc7a64880a750c0fL,0x39bacfe34e548e83L,0x3d418c760c110f05L,
27316         0x3e4daa4cb1f11588L },
27317       { 0x2733e7b55ffc69ffL,0x46f147bc92053127L,0x885b2434d722df94L,
27318         0x6a444f65e6fc6b7cL } },
27319     /* 0 << 49 */
27320     { { 0x00, 0x00, 0x00, 0x00 },
27321       { 0x00, 0x00, 0x00, 0x00 } },
27322     /* 1 << 49 */
27323     { { 0x7a1a465ac3f16ea8L,0x115a461db2f1d11cL,0x4767dd956c68a172L,
27324         0x3392f2ebd13a4698L },
27325       { 0xc7a99ccde526cdc7L,0x8e537fdc22292b81L,0x76d8cf69a6d39198L,
27326         0xffc5ff432446852dL } },
27327     /* 2 << 49 */
27328     { { 0x97b14f7ea90567e6L,0x513257b7b6ae5cb7L,0x85454a3c9f10903dL,
27329         0xd8d2c9ad69bc3724L },
27330       { 0x38da93246b29cb44L,0xb540a21d77c8cbacL,0x9bbfe43501918e42L,
27331         0xfffa707a56c3614eL } },
27332     /* 3 << 49 */
27333     { { 0x0ce4e3f1d4e353b7L,0x062d8a14ef46b0a0L,0x6408d5ab574b73fdL,
27334         0xbc41d1c9d3273ffdL },
27335       { 0x3538e1e76be77800L,0x71fe8b37c5655031L,0x1cd916216b9b331aL,
27336         0xad825d0bbb388f73L } },
27337     /* 4 << 49 */
27338     { { 0x56c2e05b1cb76219L,0x0ec0bf9171567e7eL,0xe7076f8661c4c910L,
27339         0xd67b085bbabc04d9L },
27340       { 0x9fb904595e93a96aL,0x7526c1eafbdc249aL,0x0d44d367ecdd0bb7L,
27341         0x953999179dc0d695L } },
27342     /* 5 << 49 */
27343     { { 0x61360ee99e240d18L,0x057cdcacb4b94466L,0xe7667cd12fe5325cL,
27344         0x1fa297b521974e3bL },
27345       { 0xfa4081e7db083d76L,0x31993be6f206bd15L,0x8949269b14c19f8cL,
27346         0x21468d72a9d92357L } },
27347     /* 6 << 49 */
27348     { { 0x2ccbc583a4c506ecL,0x957ed188d1acfe97L,0x8baed83312f1aea2L,
27349         0xef2a6cb48325362dL },
27350       { 0x130dde428e195c43L,0xc842025a0e6050c6L,0x2da972a708686a5dL,
27351         0xb52999a1e508b4a8L } },
27352     /* 7 << 49 */
27353     { { 0xd9f090b910a5a8bdL,0xca91d249096864daL,0x8e6a93be3f67dbc1L,
27354         0xacae6fbaf5f4764cL },
27355       { 0x1563c6e0d21411a0L,0x28fa787fda0a4ad8L,0xd524491c908c8030L,
27356         0x1257ba0e4c795f07L } },
27357     /* 8 << 49 */
27358     { { 0x83f49167ceca9754L,0x426d2cf64b7939a0L,0x2555e355723fd0bfL,
27359         0xa96e6d06c4f144e2L },
27360       { 0x4768a8dd87880e61L,0x15543815e508e4d5L,0x09d7e772b1b65e15L,
27361         0x63439dd6ac302fa0L } },
27362     /* 9 << 49 */
27363     { { 0xb93f802fc14e35c2L,0x71735b7c4341333cL,0x03a2510416d4f362L,
27364         0x3f4d069bbf433c8eL },
27365       { 0x0d83ae01f78f5a7cL,0x50a8ffbe7c4eed07L,0xc74f890676e10f83L,
27366         0x7d0809669ddaf8e1L } },
27367     /* 10 << 49 */
27368     { { 0xb11df8e1698e04ccL,0x877be203169005c8L,0x32749e8c4f3c6179L,
27369         0x2dbc9d0a7853fc05L },
27370       { 0x187d4f939454d937L,0xe682ce9db4800e1bL,0xa9129ad8165e68e8L,
27371         0x0fe29735be7f785bL } },
27372     /* 11 << 49 */
27373     { { 0x5303f40c5b9e02b7L,0xa37c969235ee04e8L,0x5f46cc2034d6632bL,
27374         0x55ef72b296ac545bL },
27375       { 0xabec5c1f7b91b062L,0x0a79e1c7bb33e821L,0xbb04b4283a9f4117L,
27376         0x0de1f28ffd2a475aL } },
27377     /* 12 << 49 */
27378     { { 0x31019ccf3a4434b4L,0xa34581111a7954dcL,0xa9dac80de34972a7L,
27379         0xb043d05474f6b8ddL },
27380       { 0x021c319e11137b1aL,0x00a754ceed5cc03fL,0x0aa2c794cbea5ad4L,
27381         0x093e67f470c015b6L } },
27382     /* 13 << 49 */
27383     { { 0x72cdfee9c97e3f6bL,0xc10bcab4b6da7461L,0x3b02d2fcb59806b9L,
27384         0x85185e89a1de6f47L },
27385       { 0x39e6931f0eb6c4d4L,0x4d4440bdd4fa5b04L,0x5418786e34be7eb8L,
27386         0x6380e5219d7259bcL } },
27387     /* 14 << 49 */
27388     { { 0x20ac0351d598d710L,0x272c4166cb3a4da4L,0xdb82fe1aca71de1fL,
27389         0x746e79f2d8f54b0fL },
27390       { 0x6e7fc7364b573e9bL,0x75d03f46fd4b5040L,0x5c1cc36d0b98d87bL,
27391         0x513ba3f11f472da1L } },
27392     /* 15 << 49 */
27393     { { 0x79d0af26abb177ddL,0xf82ab5687891d564L,0x2b6768a972232173L,
27394         0xefbb3bb08c1f6619L },
27395       { 0xb29c11dba6d18358L,0x519e2797b0916d3aL,0xd4dc18f09188e290L,
27396         0x648e86e398b0ca7fL } },
27397     /* 16 << 49 */
27398     { { 0x859d3145983c38b5L,0xb14f176c637abc8bL,0x2793fb9dcaff7be6L,
27399         0xebe5a55f35a66a5aL },
27400       { 0x7cec1dcd9f87dc59L,0x7c595cd3fbdbf560L,0x5b543b2226eb3257L,
27401         0x69080646c4c935fdL } },
27402     /* 17 << 49 */
27403     { { 0x7f2e440381e9ede3L,0x243c3894caf6df0aL,0x7c605bb11c073b11L,
27404         0xcd06a541ba6a4a62L },
27405       { 0x2916894949d4e2e5L,0x33649d074af66880L,0xbfc0c885e9a85035L,
27406         0xb4e52113fc410f4bL } },
27407     /* 18 << 49 */
27408     { { 0xdca3b70678a6513bL,0x92ea4a2a9edb1943L,0x02642216db6e2dd8L,
27409         0x9b45d0b49fd57894L },
27410       { 0x114e70dbc69d11aeL,0x1477dd194c57595fL,0xbc2208b4ec77c272L,
27411         0x95c5b4d7db68f59cL } },
27412     /* 19 << 49 */
27413     { { 0xb8c4fc6342e532b7L,0x386ba4229ae35290L,0xfb5dda42d201ecbcL,
27414         0x2353dc8ba0e38fd6L },
27415       { 0x9a0b85ea68f7e978L,0x96ec56822ad6d11fL,0x5e279d6ce5f6886dL,
27416         0xd3fe03cd3cb1914dL } },
27417     /* 20 << 49 */
27418     { { 0xfe541fa47ea67c77L,0x952bd2afe3ea810cL,0x791fef568d01d374L,
27419         0xa3a1c6210f11336eL },
27420       { 0x5ad0d5a9c7ec6d79L,0xff7038af3225c342L,0x003c6689bc69601bL,
27421         0x25059bc745e8747dL } },
27422     /* 21 << 49 */
27423     { { 0xfa4965b2f2086fbfL,0xf6840ea686916078L,0xd7ac762070081d6cL,
27424         0xe600da31b5328645L },
27425       { 0x01916f63529b8a80L,0xe80e48582d7d6f3eL,0x29eb0fe8d664ca7cL,
27426         0xf017637be7b43b0cL } },
27427     /* 22 << 49 */
27428     { { 0x9a75c80676cb2566L,0x8f76acb1b24892d9L,0x7ae7b9cc1f08fe45L,
27429         0x19ef73296a4907d8L },
27430       { 0x2db4ab715f228bf0L,0xf3cdea39817032d7L,0x0b1f482edcabe3c0L,
27431         0x3baf76b4bb86325cL } },
27432     /* 23 << 49 */
27433     { { 0xd49065e010089465L,0x3bab5d298e77c596L,0x7636c3a6193dbd95L,
27434         0xdef5d294b246e499L },
27435       { 0xb22c58b9286b2475L,0xa0b93939cd80862bL,0x3002c83af0992388L,
27436         0x6de01f9beacbe14cL } },
27437     /* 24 << 49 */
27438     { { 0x6aac688eadd70482L,0x708de92a7b4a4e8aL,0x75b6dd73758a6eefL,
27439         0xea4bf352725b3c43L },
27440       { 0x10041f2c87912868L,0xb1b1be95ef09297aL,0x19ae23c5a9f3860aL,
27441         0xc4f0f839515dcf4bL } },
27442     /* 25 << 49 */
27443     { { 0x3c7ecca397f6306aL,0x744c44ae68a3a4b0L,0x69cd13a0b3a1d8a2L,
27444         0x7cad0a1e5256b578L },
27445       { 0xea653fcd33791d9eL,0x9cc2a05d74b2e05fL,0x73b391dcfd7affa2L,
27446         0xddb7091eb6b05442L } },
27447     /* 26 << 49 */
27448     { { 0xc71e27bf8538a5c6L,0x195c63dd89abff17L,0xfd3152851b71e3daL,
27449         0x9cbdfda7fa680fa0L },
27450       { 0x9db876ca849d7eabL,0xebe2764b3c273271L,0x663357e3f208dceaL,
27451         0x8c5bd833565b1b70L } },
27452     /* 27 << 49 */
27453     { { 0xccc3b4f59837fc0dL,0x9b641ba8a79cf00fL,0x7428243ddfdf3990L,
27454         0x83a594c4020786b1L },
27455       { 0xb712451a526c4502L,0x9d39438e6adb3f93L,0xfdb261e3e9ff0ccdL,
27456         0x80344e3ce07af4c3L } },
27457     /* 28 << 49 */
27458     { { 0x75900d7c2fa4f126L,0x08a3b8655c99a232L,0x2478b6bfdb25e0c3L,
27459         0x482cc2c271db2edfL },
27460       { 0x37df7e645f321bb8L,0x8a93821b9a8005b4L,0x3fa2f10ccc8c1958L,
27461         0x0d3322182c269d0aL } },
27462     /* 29 << 49 */
27463     { { 0x20ab8119e246b0e6L,0xb39781e4d349fd17L,0xd293231eb31aa100L,
27464         0x4b779c97bb032168L },
27465       { 0x4b3f19e1c8470500L,0x45b7efe90c4c869dL,0xdb84f38aa1a6bbccL,
27466         0x3b59cb15b2fddbc1L } },
27467     /* 30 << 49 */
27468     { { 0xba5514df3fd165e8L,0x499fd6a9061f8811L,0x72cd1fe0bfef9f00L,
27469         0x120a4bb979ad7e8aL },
27470       { 0xf2ffd0955f4a5ac5L,0xcfd174f195a7a2f0L,0xd42301ba9d17baf1L,
27471         0xd2fa487a77f22089L } },
27472     /* 31 << 49 */
27473     { { 0x9cb09efeb1dc77e1L,0xe956693921c99682L,0x8c5469016c6067bbL,
27474         0xfd37857461c24456L },
27475       { 0x2b6a6cbe81796b33L,0x62d550f658e87f8bL,0x1b763e1c7f1b01b4L,
27476         0x4b93cfea1b1b5e12L } },
27477     /* 32 << 49 */
27478     { { 0xb93452381d531696L,0x57201c0088cdde69L,0xdde922519a86afc7L,
27479         0xe3043895bd35cea8L },
27480       { 0x7608c1e18555970dL,0x8267dfa92535935eL,0xd4c60a57322ea38bL,
27481         0xe0bf7977804ef8b5L } },
27482     /* 33 << 49 */
27483     { { 0x1a0dab28c06fece4L,0xd405991e94e7b49dL,0xc542b6d2706dab28L,
27484         0xcb228da3a91618fbL },
27485       { 0x224e4164107d1ceaL,0xeb9fdab3d0f5d8f1L,0xc02ba3860d6e41cdL,
27486         0x676a72c59b1f7146L } },
27487     /* 34 << 49 */
27488     { { 0xffd6dd984d6cb00bL,0xcef9c5cade2e8d7cL,0xa1bbf5d7641c7936L,
27489         0x1b95b230ee8f772eL },
27490       { 0xf765a92ee8ac25b1L,0xceb04cfc3a18b7c6L,0x27944cef0acc8966L,
27491         0xcbb3c957434c1004L } },
27492     /* 35 << 49 */
27493     { { 0x9c9971a1a43ff93cL,0x5bc2db17a1e358a9L,0x45b4862ea8d9bc82L,
27494         0x70ebfbfb2201e052L },
27495       { 0xafdf64c792871591L,0xea5bcae6b42d0219L,0xde536c552ad8f03cL,
27496         0xcd6c3f4da76aa33cL } },
27497     /* 36 << 49 */
27498     { { 0xbeb5f6230bca6de3L,0xdd20dd99b1e706fdL,0x90b3ff9dac9059d4L,
27499         0x2d7b29027ccccc4eL },
27500       { 0x8a090a59ce98840fL,0xa5d947e08410680aL,0x49ae346a923379a5L,
27501         0x7dbc84f9b28a3156L } },
27502     /* 37 << 49 */
27503     { { 0xfd40d91654a1aff2L,0xabf318ba3a78fb9bL,0x50152ed83029f95eL,
27504         0x9fc1dd77c58ad7faL },
27505       { 0x5fa5791513595c17L,0xb95046688f62b3a9L,0x907b5b24ff3055b0L,
27506         0x2e995e359a84f125L } },
27507     /* 38 << 49 */
27508     { { 0x87dacf697e9bbcfbL,0x95d0c1d6e86d96e3L,0x65726e3c2d95a75cL,
27509         0x2c3c9001acd27f21L },
27510       { 0x1deab5616c973f57L,0x108b7e2ca5221643L,0x5fee9859c4ef79d4L,
27511         0xbd62b88a40d4b8c6L } },
27512     /* 39 << 49 */
27513     { { 0xb4dd29c4197c75d6L,0x266a6df2b7076febL,0x9512d0ea4bf2df11L,
27514         0x1320c24f6b0cc9ecL },
27515       { 0x6bb1e0e101a59596L,0x8317c5bbeff9aaacL,0x65bb405e385aa6c9L,
27516         0x613439c18f07988fL } },
27517     /* 40 << 49 */
27518     { { 0xd730049f16a66e91L,0xe97f2820fa1b0e0dL,0x4131e003304c28eaL,
27519         0x820ab732526bac62L },
27520       { 0xb2ac9ef928714423L,0x54ecfffaadb10cb2L,0x8781476ef886a4ccL,
27521         0x4b2c87b5db2f8d49L } },
27522     /* 41 << 49 */
27523     { { 0xe857cd200a44295dL,0x707d7d2158c6b044L,0xae8521f9f596757cL,
27524         0x87448f0367b2b714L },
27525       { 0x13a9bc455ebcd58dL,0x79bcced99122d3c1L,0x3c6442479e076642L,
27526         0x0cf227782df4767dL } },
27527     /* 42 << 49 */
27528     { { 0x5e61aee471d444b6L,0x211236bfc5084a1dL,0x7e15bc9a4fd3eaf6L,
27529         0x68df2c34ab622bf5L },
27530       { 0x9e674f0f59bf4f36L,0xf883669bd7f34d73L,0xc48ac1b831497b1dL,
27531         0x323b925d5106703bL } },
27532     /* 43 << 49 */
27533     { { 0x22156f4274082008L,0xeffc521ac8482bcbL,0x5c6831bf12173479L,
27534         0xcaa2528fc4739490L },
27535       { 0x84d2102a8f1b3c4dL,0xcf64dfc12d9bec0dL,0x433febad78a546efL,
27536         0x1f621ec37b73cef1L } },
27537     /* 44 << 49 */
27538     { { 0x6aecd62737338615L,0x162082ab01d8edf6L,0x833a811919e86b66L,
27539         0x6023a251d299b5dbL },
27540       { 0xf5bb0c3abbf04b89L,0x6735eb69ae749a44L,0xd0e058c54713de3bL,
27541         0xfdf2593e2c3d4ccdL } },
27542     /* 45 << 49 */
27543     { { 0x1b8f414efdd23667L,0xdd52aacafa2015eeL,0x3e31b517bd9625ffL,
27544         0x5ec9322d8db5918cL },
27545       { 0xbc73ac85a96f5294L,0x82aa5bf361a0666aL,0x49755810bf08ac42L,
27546         0xd21cdfd5891cedfcL } },
27547     /* 46 << 49 */
27548     { { 0x918cb57b67f8be10L,0x365d1a7c56ffa726L,0x2435c5046532de93L,
27549         0xc0fc5e102674cd02L },
27550       { 0x6e51fcf89cbbb142L,0x1d436e5aafc50692L,0x766bffff3fbcae22L,
27551         0x3148c2fdfd55d3b8L } },
27552     /* 47 << 49 */
27553     { { 0x52c7fdc9233222faL,0x89ff1092e419fb6bL,0x3cd6db9925254977L,
27554         0x2e85a1611cf12ca7L },
27555       { 0xadd2547cdc810bc9L,0xea3f458f9d257c22L,0x642c1fbe27d6b19bL,
27556         0xed07e6b5140481a6L } },
27557     /* 48 << 49 */
27558     { { 0x6ada1d4286d2e0f8L,0xe59201220e8a9fd5L,0x02c936af708c1b49L,
27559         0x60f30fee2b4bfaffL },
27560       { 0x6637ad06858e6a61L,0xce4c77673fd374d0L,0x39d54b2d7188defbL,
27561         0xa8c9d250f56a6b66L } },
27562     /* 49 << 49 */
27563     { { 0x58fc0f5eb24fe1dcL,0x9eaf9dee6b73f24cL,0xa90d588b33650705L,
27564         0xde5b62c5af2ec729L },
27565       { 0x5c72cfaed3c2b36eL,0x868c19d5034435daL,0x88605f93e17ee145L,
27566         0xaa60c4ee77a5d5b1L } },
27567     /* 50 << 49 */
27568     { { 0xbcf5bfd23b60c472L,0xaf4ef13ceb1d3049L,0x373f44fce13895c9L,
27569         0xf29b382f0cbc9822L },
27570       { 0x1bfcb85373efaef6L,0xcf56ac9ca8c96f40L,0xd7adf1097a191e24L,
27571         0x98035f44bf8a8dc2L } },
27572     /* 51 << 49 */
27573     { { 0xf40a71b91e750c84L,0xc57f7b0c5dc6c469L,0x49a0e79c6fbc19c1L,
27574         0x6b0f5889a48ebdb8L },
27575       { 0x5d3fd084a07c4e9fL,0xc3830111ab27de14L,0x0e4929fe33e08dccL,
27576         0xf4a5ad2440bb73a3L } },
27577     /* 52 << 49 */
27578     { { 0xde86c2bf490f97caL,0x288f09c667a1ce18L,0x364bb8861844478dL,
27579         0x7840fa42ceedb040L },
27580       { 0x1269fdd25a631b37L,0x94761f1ea47c8b7dL,0xfc0c2e17481c6266L,
27581         0x85e16ea23daa5fa7L } },
27582     /* 53 << 49 */
27583     { { 0xccd8603392491048L,0x0c2f6963f4d402d7L,0x6336f7dfdf6a865cL,
27584         0x0a2a463cb5c02a87L },
27585       { 0xb0e29be7bf2f12eeL,0xf0a2200266bad988L,0x27f87e039123c1d7L,
27586         0x21669c55328a8c98L } },
27587     /* 54 << 49 */
27588     { { 0x186b980392f14529L,0xd3d056cc63954df3L,0x2f03fd58175a46f6L,
27589         0x63e34ebe11558558L },
27590       { 0xe13fedee5b80cfa5L,0xe872a120d401dbd1L,0x52657616e8a9d667L,
27591         0xbc8da4b6e08d6693L } },
27592     /* 55 << 49 */
27593     { { 0x370fb9bb1b703e75L,0x6773b186d4338363L,0x18dad378ecef7bffL,
27594         0xaac787ed995677daL },
27595       { 0x4801ea8b0437164bL,0xf430ad2073fe795eL,0xb164154d8ee5eb73L,
27596         0x0884ecd8108f7c0eL } },
27597     /* 56 << 49 */
27598     { { 0x0e6ec0965f520698L,0x640631fe44f7b8d9L,0x92fd34fca35a68b9L,
27599         0x9c5a4b664d40cf4eL },
27600       { 0x949454bf80b6783dL,0x80e701fe3a320a10L,0x8d1a564a1a0a39b2L,
27601         0x1436d53d320587dbL } },
27602     /* 57 << 49 */
27603     { { 0xf5096e6d6556c362L,0xbc23a3c0e2455d7eL,0x3a7aee54807230f9L,
27604         0x9ba1cfa622ae82fdL },
27605       { 0x833a057a99c5d706L,0x8be85f4b842315c9L,0xd083179a66a72f12L,
27606         0x2fc77d5dcdcc73cdL } },
27607     /* 58 << 49 */
27608     { { 0x22b88a805616ee30L,0xfb09548fe7ab1083L,0x8ad6ab0d511270cdL,
27609         0x61f6c57a6924d9abL },
27610       { 0xa0f7bf7290aecb08L,0x849f87c90df784a4L,0x27c79c15cfaf1d03L,
27611         0xbbf9f675c463faceL } },
27612     /* 59 << 49 */
27613     { { 0x91502c65765ba543L,0x18ce3cac42ea60ddL,0xe5cee6ac6e43ecb3L,
27614         0x63e4e91068f2aeebL },
27615       { 0x26234fa3c85932eeL,0x96883e8b4c90c44dL,0x29b9e738a18a50f6L,
27616         0xbfc62b2a3f0420dfL } },
27617     /* 60 << 49 */
27618     { { 0xd22a7d906d3e1fa9L,0x17115618fe05b8a3L,0x2a0c9926bb2b9c01L,
27619         0xc739fcc6e07e76a2L },
27620       { 0x540e9157165e439aL,0x06353a626a9063d8L,0x84d9559461e927a3L,
27621         0x013b9b26e2e0be7fL } },
27622     /* 61 << 49 */
27623     { { 0x4feaec3b973497f1L,0x15c0f94e093ebc2dL,0x6af5f22733af0583L,
27624         0x0c2af206c61f3340L },
27625       { 0xd25dbdf14457397cL,0x2e8ed017cabcbae0L,0xe3010938c2815306L,
27626         0xbaa99337e8c6cd68L } },
27627     /* 62 << 49 */
27628     { { 0x085131823b0ec7deL,0x1e1b822b58df05dfL,0x5c14842fa5c3b683L,
27629         0x98fe977e3eba34ceL },
27630       { 0xfd2316c20d5e8873L,0xe48d839abd0d427dL,0x495b2218623fc961L,
27631         0x24ee56e7b46fba5eL } },
27632     /* 63 << 49 */
27633     { { 0x9184a55b91e4de58L,0xa7488ca5dfdea288L,0xa723862ea8dcc943L,
27634         0x92d762b2849dc0fcL },
27635       { 0x3c444a12091ff4a9L,0x581113fa0cada274L,0xb9de0a4530d8eae2L,
27636         0x5e0fcd85df6b41eaL } },
27637     /* 64 << 49 */
27638     { { 0x6233ea68c094dbb5L,0xb77d062ed968d410L,0x3e719bbc58b3002dL,
27639         0x68e7dd3d3dc49d58L },
27640       { 0x8d825740013a5e58L,0x213117473c9e3c1bL,0x0cb0a2a77c99b6abL,
27641         0x5c48a3b3c2f888f2L } },
27642     /* 0 << 56 */
27643     { { 0x00, 0x00, 0x00, 0x00 },
27644       { 0x00, 0x00, 0x00, 0x00 } },
27645     /* 1 << 56 */
27646     { { 0xc7913e91991724f3L,0x5eda799c39cbd686L,0xddb595c763d4fc1eL,
27647         0x6b63b80bac4fed54L },
27648       { 0x6ea0fc697e5fb516L,0x737708bad0f1c964L,0x9628745f11a92ca5L,
27649         0x61f379589a86967aL } },
27650     /* 2 << 56 */
27651     { { 0x9af39b2caa665072L,0x78322fa4efd324efL,0x3d153394c327bd31L,
27652         0x81d5f2713129dab0L },
27653       { 0xc72e0c42f48027f5L,0xaa40cdbc8536e717L,0xf45a657a2d369d0fL,
27654         0xb03bbfc4ea7f74e6L } },
27655     /* 3 << 56 */
27656     { { 0x46a8c4180d738dedL,0x6f1a5bb0e0de5729L,0xf10230b98ba81675L,
27657         0x32c6f30c112b33d4L },
27658       { 0x7559129dd8fffb62L,0x6a281b47b459bf05L,0x77c1bd3afa3b6776L,
27659         0x0709b3807829973aL } },
27660     /* 4 << 56 */
27661     { { 0x8c26b232a3326505L,0x38d69272ee1d41bfL,0x0459453effe32afaL,
27662         0xce8143ad7cb3ea87L },
27663       { 0x932ec1fa7e6ab666L,0x6cd2d23022286264L,0x459a46fe6736f8edL,
27664         0x50bf0d009eca85bbL } },
27665     /* 5 << 56 */
27666     { { 0x0b825852877a21ecL,0x300414a70f537a94L,0x3f1cba4021a9a6a2L,
27667         0x50824eee76943c00L },
27668       { 0xa0dbfcecf83cba5dL,0xf953814893b4f3c0L,0x6174416248f24dd7L,
27669         0x5322d64de4fb09ddL } },
27670     /* 6 << 56 */
27671     { { 0x574473843d9325f3L,0xa9bef2d0f371cb84L,0x77d2188ba61e36c5L,
27672         0xbbd6a7d7c602df72L },
27673       { 0xba3aa9028f61bc0bL,0xf49085ed6ed0b6a1L,0x8bc625d6ae6e8298L,
27674         0x832b0b1da2e9c01dL } },
27675     /* 7 << 56 */
27676     { { 0xa337c447f1f0ced1L,0x800cc7939492dd2bL,0x4b93151dbea08efaL,
27677         0x820cf3f8de0a741eL },
27678       { 0xff1982dc1c0f7d13L,0xef92196084dde6caL,0x1ad7d97245f96ee3L,
27679         0x319c8dbe29dea0c7L } },
27680     /* 8 << 56 */
27681     { { 0xd3ea38717b82b99bL,0x75922d4d470eb624L,0x8f66ec543b95d466L,
27682         0x66e673ccbee1e346L },
27683       { 0x6afe67c4b5f2b89aL,0x3de9c1e6290e5cd3L,0x8c278bb6310a2adaL,
27684         0x420fa3840bdb323bL } },
27685     /* 9 << 56 */
27686     { { 0x0ae1d63b0eb919b0L,0xd74ee51da74b9620L,0x395458d0a674290cL,
27687         0x324c930f4620a510L },
27688       { 0x2d1f4d19fbac27d4L,0x4086e8ca9bedeeacL,0x0cdd211b9b679ab8L,
27689         0x5970167d7090fec4L } },
27690     /* 10 << 56 */
27691     { { 0x3420f2c9faf1fc63L,0x616d333a328c8bb4L,0x7d65364c57f1fe4aL,
27692         0x9343e87755e5c73aL },
27693       { 0x5795176be970e78cL,0xa36ccebf60533627L,0xfc7c738009cdfc1bL,
27694         0xb39a2afeb3fec326L } },
27695     /* 11 << 56 */
27696     { { 0xb7ff1ba16224408aL,0xcc856e92247cfc5eL,0x01f102e7c18bc493L,
27697         0x4613ab742091c727L },
27698       { 0xaa25e89cc420bf2bL,0x00a5317690337ec2L,0xd2be9f437d025fc7L,
27699         0x3316fb856e6fe3dcL } },
27700     /* 12 << 56 */
27701     { { 0x27520af59ac50814L,0xfdf95e789a8e4223L,0xb7e7df2a56bec5a0L,
27702         0xf7022f7ddf159e5dL },
27703       { 0x93eeeab1cac1fe8fL,0x8040188c37451168L,0x7ee8aa8ad967dce6L,
27704         0xfa0e79e73abc9299L } },
27705     /* 13 << 56 */
27706     { { 0x67332cfc2064cfd1L,0x339c31deb0651934L,0x719b28d52a3bcbeaL,
27707         0xee74c82b9d6ae5c6L },
27708       { 0x0927d05ebaf28ee6L,0x82cecf2c9d719028L,0x0b0d353eddb30289L,
27709         0xfe4bb977fddb2e29L } },
27710     /* 14 << 56 */
27711     { { 0xbb5bb990640bfd9eL,0xd226e27782f62108L,0x4bf0098502ffdd56L,
27712         0x7756758a2ca1b1b5L },
27713       { 0xc32b62a35285fe91L,0xedbc546a8c9cd140L,0x1e47a013af5cb008L,
27714         0xbca7e720073ce8f2L } },
27715     /* 15 << 56 */
27716     { { 0xe10b2ab817a91caeL,0xb89aab6508e27f63L,0x7b3074a7dba3ddf9L,
27717         0x1c20ce09330c2972L },
27718       { 0x6b9917b45fcf7e33L,0xe6793743945ceb42L,0x18fc22155c633d19L,
27719         0xad1adb3cc7485474L } },
27720     /* 16 << 56 */
27721     { { 0x646f96796424c49bL,0xf888dfe867c241c9L,0xe12d4b9324f68b49L,
27722         0x9a6b62d8a571df20L },
27723       { 0x81b4b26d179483cbL,0x666f96329511fae2L,0xd281b3e4d53aa51fL,
27724         0x7f96a7657f3dbd16L } },
27725     /* 17 << 56 */
27726     { { 0xa7f8b5bf074a30ceL,0xd7f52107005a32e6L,0x6f9e090750237ed4L,
27727         0x2f21da478096fa2bL },
27728       { 0xf3e19cb4eec863a0L,0xd18f77fd9527620aL,0x9505c81c407c1cf8L,
27729         0x9998db4e1b6ec284L } },
27730     /* 18 << 56 */
27731     { { 0x7e3389e5c247d44dL,0x125071413f4f3d80L,0xd4ba01104a78a6c7L,
27732         0x312874a0767720beL },
27733       { 0xded059a675944370L,0xd6123d903b2c0bddL,0xa56b717b51c108e3L,
27734         0x9bb7940e070623e9L } },
27735     /* 19 << 56 */
27736     { { 0x794e2d5984ac066cL,0xf5954a92e68c69a0L,0x28c524584fd99dccL,
27737         0x60e639fcb1012517L },
27738       { 0xc2e601257de79248L,0xe9ef6404f12fc6d7L,0x4c4f28082a3b5d32L,
27739         0x865ad32ec768eb8aL } },
27740     /* 20 << 56 */
27741     { { 0xac02331b13fb70b6L,0x037b44c195599b27L,0x1a860fc460bd082cL,
27742         0xa2e25745c980cd01L },
27743       { 0xee3387a81da0263eL,0x931bfb952d10f3d6L,0x5b687270a1f24a32L,
27744         0xf140e65dca494b86L } },
27745     /* 21 << 56 */
27746     { { 0x4f4ddf91b2f1ac7aL,0xf99eaabb760fee27L,0x57f4008a49c228e5L,
27747         0x090be4401cf713bbL },
27748       { 0xac91fbe45004f022L,0xd838c2c2569e1af6L,0xd6c7d20b0f1daaa5L,
27749         0xaa063ac11bbb02c0L } },
27750     /* 22 << 56 */
27751     { { 0x0938a42259558a78L,0x5343c6698435da2fL,0x96f67b18034410dcL,
27752         0x7cc1e42484510804L },
27753       { 0x86a1543f16dfbb7dL,0x921fa9425b5bd592L,0x9dcccb6eb33dd03cL,
27754         0x8581ddd9b843f51eL } },
27755     /* 23 << 56 */
27756     { { 0x54935fcb81d73c9eL,0x6d07e9790a5e97abL,0x4dc7b30acf3a6babL,
27757         0x147ab1f3170bee11L },
27758       { 0x0aaf8e3d9fafdee4L,0xfab3dbcb538a8b95L,0x405df4b36ef13871L,
27759         0xf1f4e9cb088d5a49L } },
27760     /* 24 << 56 */
27761     { { 0x9bcd24d366b33f1dL,0x3b97b8205ce445c0L,0xe2926549ba93ff61L,
27762         0xd9c341ce4dafe616L },
27763       { 0xfb30a76e16efb6f3L,0xdf24b8ca605b953cL,0x8bd52afec2fffb9fL,
27764         0xbbac5ff7e19d0b96L } },
27765     /* 25 << 56 */
27766     { { 0x43c01b87459afccdL,0x6bd45143b7432652L,0x8473453055b5d78eL,
27767         0x81088fdb1554ba7dL },
27768       { 0xada0a52c1e269375L,0xf9f037c42dc5ec10L,0xc066060794bfbc11L,
27769         0xc0a630bbc9c40d2fL } },
27770     /* 26 << 56 */
27771     { { 0x5efc797eab64c31eL,0xffdb1dab74507144L,0xf61242871ca6790cL,
27772         0xe9609d81e69bf1bfL },
27773       { 0xdb89859500d24fc9L,0x9c750333e51fb417L,0x51830a91fef7bbdeL,
27774         0x0ce67dc8945f585cL } },
27775     /* 27 << 56 */
27776     { { 0x9a730ed44763eb50L,0x24a0e221c1ab0d66L,0x643b6393648748f3L,
27777         0x1982daa16d3c6291L },
27778       { 0x6f00a9f78bbc5549L,0x7a1783e17f36384eL,0xe8346323de977f50L,
27779         0x91ab688db245502aL } },
27780     /* 28 << 56 */
27781     { { 0x331ab6b56d0bdd66L,0x0a6ef32e64b71229L,0x1028150efe7c352fL,
27782         0x27e04350ce7b39d3L },
27783       { 0x2a3c8acdc1070c82L,0xfb2034d380c9feefL,0x2d729621709f3729L,
27784         0x8df290bf62cb4549L } },
27785     /* 29 << 56 */
27786     { { 0x02f99f33fc2e4326L,0x3b30076d5eddf032L,0xbb21f8cf0c652fb5L,
27787         0x314fb49eed91cf7bL },
27788       { 0xa013eca52f700750L,0x2b9e3c23712a4575L,0xe5355557af30fbb0L,
27789         0x1ada35167c77e771L } },
27790     /* 30 << 56 */
27791     { { 0x45f6ecb27b135670L,0xe85d19df7cfc202eL,0x0f1b50c758d1be9fL,
27792         0x5ebf2c0aead2e344L },
27793       { 0x1531fe4eabc199c9L,0xc703259256bab0aeL,0x16ab2e486c1fec54L,
27794         0x0f87fda804280188L } },
27795     /* 31 << 56 */
27796     { { 0xdc9f46fc609e4a74L,0x2a44a143ba667f91L,0xbc3d8b95b4d83436L,
27797         0xa01e4bd0c7bd2958L },
27798       { 0x7b18293273483c90L,0xa79c6aa1a7c7b598L,0xbf3983c6eaaac07eL,
27799         0x8f18181e96e0d4e6L } },
27800     /* 32 << 56 */
27801     { { 0x8553d37c051af62bL,0xe9a998eb0bf94496L,0xe0844f9fb0d59aa1L,
27802         0x983fd558e6afb813L },
27803       { 0x9670c0ca65d69804L,0x732b22de6ea5ff2dL,0xd7640ba95fd8623bL,
27804         0x9f619163a6351782L } },
27805     /* 33 << 56 */
27806     { { 0x0bfc27eeacee5043L,0xae419e732eb10f02L,0x19c028d18943fb05L,
27807         0x71f01cf7ff13aa2aL },
27808       { 0x7790737e8887a132L,0x6751330966318410L,0x9819e8a37ddb795eL,
27809         0xfecb8ef5dad100b2L } },
27810     /* 34 << 56 */
27811     { { 0x59f74a223021926aL,0xb7c28a496f9b4c1cL,0xed1a733f912ad0abL,
27812         0x42a910af01a5659cL },
27813       { 0x3842c6e07bd68cabL,0x2b57fa3876d70ac8L,0x8a6707a83c53aaebL,
27814         0x62c1c51065b4db18L } },
27815     /* 35 << 56 */
27816     { { 0x8de2c1fbb2d09dc7L,0xc3dfed12266bd23bL,0x927d039bd5b27db6L,
27817         0x2fb2f0f1103243daL },
27818       { 0xf855a07b80be7399L,0xed9327ce1f9f27a8L,0xa0bd99c7729bdef7L,
27819         0x2b67125e28250d88L } },
27820     /* 36 << 56 */
27821     { { 0x784b26e88670ced7L,0xe3dfe41fc31bd3b4L,0x9e353a06bcc85cbcL,
27822         0x302e290960178a9dL },
27823       { 0x860abf11a6eac16eL,0x76447000aa2b3aacL,0x46ff9d19850afdabL,
27824         0x35bdd6a5fdb2d4c1L } },
27825     /* 37 << 56 */
27826     { { 0xe82594b07e5c9ce9L,0x0f379e5320af346eL,0x608b31e3bc65ad4aL,
27827         0x710c6b12267c4826L },
27828       { 0x51c966f971954cf1L,0xb1cec7930d0aa215L,0x1f15598986bd23a8L,
27829         0xae2ff99cf9452e86L } },
27830     /* 38 << 56 */
27831     { { 0xd8dd953c340ceaa2L,0x263552752e2e9333L,0x15d4e5f98586f06dL,
27832         0xd6bf94a8f7cab546L },
27833       { 0x33c59a0ab76a9af0L,0x52740ab3ba095af7L,0xc444de8a24389ca0L,
27834         0xcc6f9863706da0cbL } },
27835     /* 39 << 56 */
27836     { { 0xb5a741a76b2515cfL,0x71c416019585c749L,0x78350d4fe683de97L,
27837         0x31d6152463d0b5f5L },
27838       { 0x7a0cc5e1fbce090bL,0xaac927edfbcb2a5bL,0xe920de4920d84c35L,
27839         0x8c06a0b622b4de26L } },
27840     /* 40 << 56 */
27841     { { 0xd34dd58bafe7ddf3L,0x55851fedc1e6e55bL,0xd1395616960696e7L,
27842         0x940304b25f22705fL },
27843       { 0x6f43f861b0a2a860L,0xcf1212820e7cc981L,0x121862120ab64a96L,
27844         0x09215b9ab789383cL } },
27845     /* 41 << 56 */
27846     { { 0x311eb30537387c09L,0xc5832fcef03ee760L,0x30358f5832f7ea19L,
27847         0xe01d3c3491d53551L },
27848       { 0x1ca5ee41da48ea80L,0x34e71e8ecf4fa4c1L,0x312abd257af1e1c7L,
27849         0xe3afcdeb2153f4a5L } },
27850     /* 42 << 56 */
27851     { { 0x9d5c84d700235e9aL,0x0308d3f48c4c836fL,0xc0a66b0489332de5L,
27852         0x610dd39989e566efL },
27853       { 0xf8eea460d1ac1635L,0x84cbb3fb20a2c0dfL,0x40afb488e74a48c5L,
27854         0x29738198d326b150L } },
27855     /* 43 << 56 */
27856     { { 0x2a17747fa6d74081L,0x60ea4c0555a26214L,0x53514bb41f88c5feL,
27857         0xedd645677e83426cL },
27858       { 0xd5d6cbec96460b25L,0xa12fd0ce68dc115eL,0xc5bc3ed2697840eaL,
27859         0x969876a8a6331e31L } },
27860     /* 44 << 56 */
27861     { { 0x60c36217472ff580L,0xf42297054ad41393L,0x4bd99ef0a03b8b92L,
27862         0x501c7317c144f4f6L },
27863       { 0x159009b318464945L,0x6d5e594c74c5c6beL,0x2d587011321a3660L,
27864         0xd1e184b13898d022L } },
27865     /* 45 << 56 */
27866     { { 0x5ba047524c6a7e04L,0x47fa1e2b45550b65L,0x9419daf048c0a9a5L,
27867         0x663629537c243236L },
27868       { 0xcd0744b15cb12a88L,0x561b6f9a2b646188L,0x599415a566c2c0c0L,
27869         0xbe3f08590f83f09aL } },
27870     /* 46 << 56 */
27871     { { 0x9141c5beb92041b8L,0x01ae38c726477d0dL,0xca8b71f3d12c7a94L,
27872         0xfab5b31f765c70dbL },
27873       { 0x76ae7492487443e9L,0x8595a310990d1349L,0xf8dbeda87d460a37L,
27874         0x7f7ad0821e45a38fL } },
27875     /* 47 << 56 */
27876     { { 0xed1d4db61059705aL,0xa3dd492ae6b9c697L,0x4b92ee3a6eb38bd5L,
27877         0xbab2609d67cc0bb7L },
27878       { 0x7fc4fe896e70ee82L,0xeff2c56e13e6b7e3L,0x9b18959e34d26fcaL,
27879         0x2517ab66889d6b45L } },
27880     /* 48 << 56 */
27881     { { 0xf167b4e0bdefdd4fL,0x69958465f366e401L,0x5aa368aba73bbec0L,
27882         0x121487097b240c21L },
27883       { 0x378c323318969006L,0xcb4d73cee1fe53d1L,0x5f50a80e130c4361L,
27884         0xd67f59517ef5212bL } },
27885     /* 49 << 56 */
27886     { { 0xf145e21e9e70c72eL,0xb2e52e295566d2fbL,0x44eaba4a032397f5L,
27887         0x5e56937b7e31a7deL },
27888       { 0x68dcf517456c61e1L,0xbc2e954aa8b0a388L,0xe3552fa760a8b755L,
27889         0x03442dae73ad0cdeL } },
27890     /* 50 << 56 */
27891     { { 0x37ffe747ceb26210L,0x983545e8787baef9L,0x8b8c853586a3de31L,
27892         0xc621dbcbfacd46dbL },
27893       { 0x82e442e959266fbbL,0xa3514c37339d471cL,0x3a11b77162cdad96L,
27894         0xf0cb3b3cecf9bdf0L } },
27895     /* 51 << 56 */
27896     { { 0x3fcbdbce478e2135L,0x7547b5cfbda35342L,0xa97e81f18a677af6L,
27897         0xc8c2bf8328817987L },
27898       { 0xdf07eaaf45580985L,0xc68d1f05c93b45cbL,0x106aa2fec77b4cacL,
27899         0x4c1d8afc04a7ae86L } },
27900     /* 52 << 56 */
27901     { { 0xdb41c3fd9eb45ab2L,0x5b234b5bd4b22e74L,0xda253decf215958aL,
27902         0x67e0606ea04edfa0L },
27903       { 0xabbbf070ef751b11L,0xf352f175f6f06dceL,0xdfc4b6af6839f6b4L,
27904         0x53ddf9a89959848eL } },
27905     /* 53 << 56 */
27906     { { 0xda49c379c21520b0L,0x90864ff0dbd5d1b6L,0x2f055d235f49c7f7L,
27907         0xe51e4e6aa796b2d8L },
27908       { 0xc361a67f5c9dc340L,0x5ad53c37bca7c620L,0xda1d658832c756d0L,
27909         0xad60d9118bb67e13L } },
27910     /* 54 << 56 */
27911     { { 0xd6c47bdf0eeec8c6L,0x4a27fec1078a1821L,0x081f7415c3099524L,
27912         0x8effdf0b82cd8060L },
27913       { 0xdb70ec1c65842df8L,0x8821b358d319a901L,0x72ee56eede42b529L,
27914         0x5bb39592236e4286L } },
27915     /* 55 << 56 */
27916     { { 0xd1183316fd6f7140L,0xf9fadb5bbd8e81f7L,0x701d5e0c5a02d962L,
27917         0xfdee4dbf1b601324L },
27918       { 0xbed1740735d7620eL,0x04e3c2c3f48c0012L,0x9ee29da73455449aL,
27919         0x562cdef491a836c4L } },
27920     /* 56 << 56 */
27921     { { 0x8f682a5f47701097L,0x617125d8ff88d0c2L,0x948fda2457bb86ddL,
27922         0x348abb8f289f7286L },
27923       { 0xeb10eab599d94bbdL,0xd51ba28e4684d160L,0xabe0e51c30c8f41aL,
27924         0x66588b4513254f4aL } },
27925     /* 57 << 56 */
27926     { { 0x147ebf01fad097a5L,0x49883ea8610e815dL,0xe44d60ba8a11de56L,
27927         0xa970de6e827a7a6dL },
27928       { 0x2be414245e17fc19L,0xd833c65701214057L,0x1375813b363e723fL,
27929         0x6820bb88e6a52e9bL } },
27930     /* 58 << 56 */
27931     { { 0x7e7f6970d875d56aL,0xd6a0a9ac51fbf6bfL,0x54ba8790a3083c12L,
27932         0xebaeb23d6ae7eb64L },
27933       { 0xa8685c3ab99a907aL,0xf1e74550026bf40bL,0x7b73a027c802cd9eL,
27934         0x9a8a927c4fef4635L } },
27935     /* 59 << 56 */
27936     { { 0xe1b6f60c08191224L,0xc4126ebbde4ec091L,0xe1dff4dc4ae38d84L,
27937         0xde3f57db4f2ef985L },
27938       { 0x34964337d446a1ddL,0x7bf217a0859e77f6L,0x8ff105278e1d13f5L,
27939         0xa304ef0374eeae27L } },
27940     /* 60 << 56 */
27941     { { 0xfc6f5e47d19dfa5aL,0xdb007de37fad982bL,0x28205ad1613715f5L,
27942         0x251e67297889529eL },
27943       { 0x727051841ae98e78L,0xf818537d271cac32L,0xc8a15b7eb7f410f5L,
27944         0xc474356f81f62393L } },
27945     /* 61 << 56 */
27946     { { 0x92dbdc5ac242316bL,0xabe060acdbf4aff5L,0x6e8c38fe909a8ec6L,
27947         0x43e514e56116cb94L },
27948       { 0x2078fa3807d784f9L,0x1161a880f4b5b357L,0x5283ce7913adea3dL,
27949         0x0756c3e6cc6a910bL } },
27950     /* 62 << 56 */
27951     { { 0x60bcfe01aaa79697L,0x04a73b2956391db1L,0xdd8dad47189b45a0L,
27952         0xbfac0dd048d5b8d9L },
27953       { 0x34ab3af57d3d2ec2L,0x6fa2fc2d207bd3afL,0x9ff4009266550dedL,
27954         0x719b3e871fd5b913L } },
27955     /* 63 << 56 */
27956     { { 0xa573a4966d17fbc7L,0x0cd1a70a73d2b24eL,0x34e2c5cab2676937L,
27957         0xe7050b06bf669f21L },
27958       { 0xfbe948b61ede9046L,0xa053005197662659L,0x58cbd4edf10124c5L,
27959         0xde2646e4dd6c06c8L } },
27960     /* 64 << 56 */
27961     { { 0x332f81088cad38c0L,0x471b7e906bd68ae2L,0x56ac3fb20d8e27a3L,
27962         0xb54660db136b4b0dL },
27963       { 0x123a1e11a6fd8de4L,0x44dbffeaa37799efL,0x4540b977ce6ac17cL,
27964         0x495173a8af60acefL } },
27965     /* 0 << 63 */
27966     { { 0x00, 0x00, 0x00, 0x00 },
27967       { 0x00, 0x00, 0x00, 0x00 } },
27968     /* 1 << 63 */
27969     { { 0x9ebb284d391c2a82L,0xbcdd4863158308e8L,0x006f16ec83f1edcaL,
27970         0xa13e2c37695dc6c8L },
27971       { 0x2ab756f04a057a87L,0xa8765500a6b48f98L,0x4252face68651c44L,
27972         0xa52b540be1765e02L } },
27973     /* 2 << 63 */
27974     { { 0x4f922fc516a0d2bbL,0x0d5cc16c1a623499L,0x9241cf3a57c62c8bL,
27975         0x2f5e6961fd1b667fL },
27976       { 0x5c15c70bf5a01797L,0x3d20b44d60956192L,0x04911b37071fdb52L,
27977         0xf648f9168d6f0f7bL } },
27978     /* 3 << 63 */
27979     { { 0x6dc1acafe60b7cf7L,0x25860a5084a9d869L,0x56fc6f09e7ba8ac4L,
27980         0x828c5bd06148d29eL },
27981       { 0xac6b435edc55ae5fL,0xa527f56cc0117411L,0x94d5045efd24342cL,
27982         0x2c4c0a3570b67c0dL } },
27983     /* 4 << 63 */
27984     { { 0x027cc8b8fac61d9aL,0x7d25e062e3c6fe8aL,0xe08805bfe5bff503L,
27985         0x13271e6c6ff632f7L },
27986       { 0x55dca6c0232f76a5L,0x8957c32d701ef426L,0xee728bcba10a5178L,
27987         0x5ea60411b62c5173L } },
27988     /* 5 << 63 */
27989     { { 0xfc4e964ed0b8892bL,0x9ea176839301bb74L,0x6265c5aefcc48626L,
27990         0xe60cf82ebb3e9102L },
27991       { 0x57adf797d4df5531L,0x235b59a18deeefe2L,0x60adcf583f306eb1L,
27992         0x105c27533d09492dL } },
27993     /* 6 << 63 */
27994     { { 0x4090914bb5def996L,0x1cb69c83233dd1e7L,0xc1e9c1d39b3d5e76L,
27995         0x1f3338edfccf6012L },
27996       { 0xb1e95d0d2f5378a8L,0xacf4c2c72f00cd21L,0x6e984240eb5fe290L,
27997         0xd66c038d248088aeL } },
27998     /* 7 << 63 */
27999     { { 0x804d264af94d70cfL,0xbdb802ef7314bf7eL,0x8fb54de24333ed02L,
28000         0x740461e0285635d9L },
28001       { 0x4113b2c8365e9383L,0xea762c833fdef652L,0x4eec6e2e47b956c1L,
28002         0xa3d814be65620fa4L } },
28003     /* 8 << 63 */
28004     { { 0x9ad5462bb4d8bc50L,0x181c0b16a9195770L,0xebd4fe1c78412a68L,
28005         0xae0341bcc0dff48cL },
28006       { 0xb6bc45cf7003e866L,0xf11a6dea8a24a41bL,0x5407151ad04c24c2L,
28007         0x62c9d27dda5b7b68L } },
28008     /* 9 << 63 */
28009     { { 0x2e96423588cceff6L,0x8594c54f8b07ed69L,0x1578e73cc84d0d0dL,
28010         0x7b4e1055ff532868L },
28011       { 0xa348c0d5b5ec995aL,0xbf4b9d5514289a54L,0x9ba155a658fbd777L,
28012         0x186ed7a81a84491dL } },
28013     /* 10 << 63 */
28014     { { 0xd4992b30614c0900L,0xda98d121bd00c24bL,0x7f534dc87ec4bfa1L,
28015         0x4a5ff67437dc34bcL },
28016       { 0x68c196b81d7ea1d7L,0x38cf289380a6d208L,0xfd56cd09e3cbbd6eL,
28017         0xec72e27e4205a5b6L } },
28018     /* 11 << 63 */
28019     { { 0x15ea68f5a44f77f7L,0x7aa5f9fdb43c52bcL,0x86ff676f94f0e609L,
28020         0xa4cde9632e2d432bL },
28021       { 0x8cafa0c0eee470afL,0x84137d0e8a3f5ec8L,0xebb40411faa31231L,
28022         0xa239c13f6f7f7ccfL } },
28023     /* 12 << 63 */
28024     { { 0x32865719a8afd30bL,0x867983288a826dceL,0xdf04e891c4a8fbe0L,
28025         0xbb6b6e1bebf56ad3L },
28026       { 0x0a695b11471f1ff0L,0xd76c3389be15baf0L,0x018edb95be96c43eL,
28027         0xf2beaaf490794158L } },
28028     /* 13 << 63 */
28029     { { 0x152db09ec3076a27L,0x5e82908ee416545dL,0xa2c41272356d6f2eL,
28030         0xdc9c964231fd74e1L },
28031       { 0x66ceb88d519bf615L,0xe29ecd7605a2274eL,0x3a0473c4bf5e2fa0L,
28032         0x6b6eb67164284e67L } },
28033     /* 14 << 63 */
28034     { { 0xe8b97932b88756ddL,0xed4e8652f17e3e61L,0xc2dd14993ee1c4a4L,
28035         0xc0aaee17597f8c0eL },
28036       { 0x15c4edb96c168af3L,0x6563c7bfb39ae875L,0xadfadb6f20adb436L,
28037         0xad55e8c99a042ac0L } },
28038     /* 15 << 63 */
28039     { { 0x975a1ed8b76da1f5L,0x10dfa466a58acb94L,0x8dd7f7e3ac060282L,
28040         0x6813e66a572a051eL },
28041       { 0xb4ccae1e350cb901L,0xb653d65650cb7822L,0x42484710dfab3b87L,
28042         0xcd7ee5379b670fd0L } },
28043     /* 16 << 63 */
28044     { { 0x0a50b12e523b8bf6L,0x8009eb5b8f910c1bL,0xf535af824a167588L,
28045         0x0f835f9cfb2a2abdL },
28046       { 0xf59b29312afceb62L,0xc797df2a169d383fL,0xeb3f5fb066ac02b0L,
28047         0x029d4c6fdaa2d0caL } },
28048     /* 17 << 63 */
28049     { { 0xd4059bc1afab4bc5L,0x833f5c6f56783247L,0xb53466308d2d3605L,
28050         0x83387891d34d8433L },
28051       { 0xd973b30fadd9419aL,0xbcca1099afe3fce8L,0x081783150809aac6L,
28052         0x01b7f21a540f0f11L } },
28053     /* 18 << 63 */
28054     { { 0x65c29219909523c8L,0xa62f648fa3a1c741L,0x88598d4f60c9e55aL,
28055         0xbce9141b0e4f347aL },
28056       { 0x9af97d8435f9b988L,0x0210da62320475b6L,0x3c076e229191476cL,
28057         0x7520dbd944fc7834L } },
28058     /* 19 << 63 */
28059     { { 0x6a6b2cfec1ab1bbdL,0xef8a65bedc650938L,0x72855540805d7bc4L,
28060         0xda389396ed11fdfdL },
28061       { 0xa9d5bd3674660876L,0x11d67c54b45dff35L,0x6af7d148a4f5da94L,
28062         0xbb8d4c3fc0bbeb31L } },
28063     /* 20 << 63 */
28064     { { 0x87a7ebd1e0a1b12aL,0x1e4ef88d770ba95fL,0x8c33345cdc2ae9cbL,
28065         0xcecf127601cc8403L },
28066       { 0x687c012e1b39b80fL,0xfd90d0ad35c33ba4L,0xa3ef5a675c9661c2L,
28067         0x368fc88ee017429eL } },
28068     /* 21 << 63 */
28069     { { 0xd30c6761196a2fa2L,0x931b9817bd5b312eL,0xba01000c72f54a31L,
28070         0xa203d2c866eaa541L },
28071       { 0xf2abdee098939db3L,0xe37d6c2c3e606c02L,0xf2921574521ff643L,
28072         0x2781b3c4d7e2fca3L } },
28073     /* 22 << 63 */
28074     { { 0x664300b07850ec06L,0xac5a38b97d3a10cfL,0x9233188de34ab39dL,
28075         0xe77057e45072cbb9L },
28076       { 0xbcf0c042b59e78dfL,0x4cfc91e81d97de52L,0x4661a26c3ee0ca4aL,
28077         0x5620a4c1fb8507bcL } },
28078     /* 23 << 63 */
28079     { { 0x4b44d4aa049f842cL,0xceabc5d51540e82bL,0x306710fd15c6f156L,
28080         0xbe5ae52b63db1d72L },
28081       { 0x06f1e7e6334957f1L,0x57e388f031144a70L,0xfb69bb2fdf96447bL,
28082         0x0f78ebd373e38a12L } },
28083     /* 24 << 63 */
28084     { { 0xb82226052b7ce542L,0xe6d4ce997472bde1L,0x53e16ebe09d2f4daL,
28085         0x180ff42e53b92b2eL },
28086       { 0xc59bcc022c34a1c6L,0x3803d6f9422c46c2L,0x18aff74f5c14a8a2L,
28087         0x55aebf8010a08b28L } },
28088     /* 25 << 63 */
28089     { { 0x66097d587135593fL,0x32e6eff72be570cdL,0x584e6a102a8c860dL,
28090         0xcd185890a2eb4163L },
28091       { 0x7ceae99d6d97e134L,0xd42c6b70dd8447ceL,0x59ddbb4ab8c50273L,
28092         0x03c612df3cf34e1eL } },
28093     /* 26 << 63 */
28094     { { 0x84b9ca1504b6c5a0L,0x35216f3918f0e3a3L,0x3ec2d2bcbd986c00L,
28095         0x8bf546d9d19228feL },
28096       { 0xd1c655a44cd623c3L,0x366ce718502b8e5aL,0x2cfc84b4eea0bfe7L,
28097         0xe01d5ceecf443e8eL } },
28098     /* 27 << 63 */
28099     { { 0x8ec045d9036520f8L,0xdfb3c3d192d40e98L,0x0bac4ccecc559a04L,
28100         0x35eccae5240ea6b1L },
28101       { 0x180b32dbf8a5a0acL,0x547972a5eb699700L,0xa3765801ca26bca0L,
28102         0x57e09d0ea647f25aL } },
28103     /* 28 << 63 */
28104     { { 0xb956970e2fdd23ccL,0xb80288bc5682e971L,0xe6e6d91e9ae86ebcL,
28105         0x0564c83f8c9f1939L },
28106       { 0x551932a239560368L,0xe893752b049c28e2L,0x0b03cee5a6a158c3L,
28107         0xe12d656b04964263L } },
28108     /* 29 << 63 */
28109     { { 0x4b47554e63e3bc1dL,0xc719b6a245044ff7L,0x4f24d30ae48daa07L,
28110         0xa3f37556c8c1edc3L },
28111       { 0x9a47bf760700d360L,0xbb1a1824822ae4e2L,0x22e275a389f1fb4cL,
28112         0x72b1aa239968c5f5L } },
28113     /* 30 << 63 */
28114     { { 0xa75feacabe063f64L,0x9b392f43bce47a09L,0xd42415091ad07acaL,
28115         0x4b0c591b8d26cd0fL },
28116       { 0x2d42ddfd92f1169aL,0x63aeb1ac4cbf2392L,0x1de9e8770691a2afL,
28117         0xebe79af7d98021daL } },
28118     /* 31 << 63 */
28119     { { 0xcfdf2a4e40e50acfL,0xf0a98ad7af01d665L,0xefb640bf1831be1fL,
28120         0x6fe8bd2f80e9ada0L },
28121       { 0x94c103a16cafbc91L,0x170f87598308e08cL,0x5de2d2ab9780ff4fL,
28122         0x666466bc45b201f2L } },
28123     /* 32 << 63 */
28124     { { 0x58af2010f5b343bcL,0x0f2e400af2f142feL,0x3483bfdea85f4bdfL,
28125         0xf0b1d09303bfeaa9L },
28126       { 0x2ea01b95c7081603L,0xe943e4c93dba1097L,0x47be92adb438f3a6L,
28127         0x00bb7742e5bf6636L } },
28128     /* 33 << 63 */
28129     { { 0x136b7083824297b4L,0x9d0e55805584455fL,0xab48cedcf1c7d69eL,
28130         0x53a9e4812a256e76L },
28131       { 0x0402b0e065eb2413L,0xdadbbb848fc407a7L,0xa65cd5a48d7f5492L,
28132         0x21d4429374bae294L } },
28133     /* 34 << 63 */
28134     { { 0x66917ce63b5f1cc4L,0x37ae52eace872e62L,0xbb087b722905f244L,
28135         0x120770861e6af74fL },
28136       { 0x4b644e491058edeaL,0x827510e3b638ca1dL,0x8cf2b7046038591cL,
28137         0xffc8b47afe635063L } },
28138     /* 35 << 63 */
28139     { { 0x3ae220e61b4d5e63L,0xbd8647429d961b4bL,0x610c107e9bd16bedL,
28140         0x4270352a1127147bL },
28141       { 0x7d17ffe664cfc50eL,0x50dee01a1e36cb42L,0x068a762235dc5f9aL,
28142         0x9a08d536df53f62cL } },
28143     /* 36 << 63 */
28144     { { 0x4ed714576be5f7deL,0xd93006f8c2263c9eL,0xe073694ccacacb36L,
28145         0x2ff7a5b43ae118abL },
28146       { 0x3cce53f1cd871236L,0xf156a39dc2aa6d52L,0x9cc5f271b198d76dL,
28147         0xbc615b6f81383d39L } },
28148     /* 37 << 63 */
28149     { { 0xa54538e8de3eee6bL,0x58c77538ab910d91L,0x31e5bdbc58d278bdL,
28150         0x3cde4adfb963acaeL },
28151       { 0xb1881fd25302169cL,0x8ca60fa0a989ed8bL,0xa1999458ff96a0eeL,
28152         0xc1141f03ac6c283dL } },
28153     /* 38 << 63 */
28154     { { 0x7677408d6dfafed3L,0x33a0165339661588L,0x3c9c15ec0b726fa0L,
28155         0x090cfd936c9b56daL },
28156       { 0xe34f4baea3c40af5L,0x3469eadbd21129f1L,0xcc51674a1e207ce8L,
28157         0x1e293b24c83b1ef9L } },
28158     /* 39 << 63 */
28159     { { 0x17173d131e6c0bb4L,0x1900469590776d35L,0xe7980e346de6f922L,
28160         0x873554cbf4dd9a22L },
28161       { 0x0316c627cbf18a51L,0x4d93651b3032c081L,0x207f27713946834dL,
28162         0x2c08d7b430cdbf80L } },
28163     /* 40 << 63 */
28164     { { 0x137a4fb486df2a61L,0xa1ed9c07ecf7b4a2L,0xb2e460e27bd042ffL,
28165         0xb7f5e2fa5f62f5ecL },
28166       { 0x7aa6ec6bcc2423b7L,0x75ce0a7fba63eea7L,0x67a45fb1f250a6e1L,
28167         0x93bc919ce53cdc9fL } },
28168     /* 41 << 63 */
28169     { { 0x9271f56f871942dfL,0x2372ff6f7859ad66L,0x5f4c2b9633cb1a78L,
28170         0xe3e291015838aa83L },
28171       { 0xa7ed1611e4e8110cL,0x2a2d70d5330198ceL,0xbdf132e86720efe0L,
28172         0xe61a896266a471bfL } },
28173     /* 42 << 63 */
28174     { { 0x796d3a85825808bdL,0x51dc3cb73fd6e902L,0x643c768a916219d1L,
28175         0x36cd7685a2ad7d32L },
28176       { 0xe3db9d05b22922a4L,0x6494c87edba29660L,0xf0ac91dfbcd2ebc7L,
28177         0x4deb57a045107f8dL } },
28178     /* 43 << 63 */
28179     { { 0x42271f59c3d12a73L,0x5f71687ca5c2c51dL,0xcb1f50c605797bcbL,
28180         0x29ed0ed9d6d34eb0L },
28181       { 0xe5fe5b474683c2ebL,0x4956eeb597447c46L,0x5b163a4371207167L,
28182         0x93fa2fed0248c5efL } },
28183     /* 44 << 63 */
28184     { { 0x67930af231f63950L,0xa77797c114caa2c9L,0x526e80ee27ac7e62L,
28185         0xe1e6e62658b28aecL },
28186       { 0x636178b0b3c9fef0L,0xaf7752e06d5f90beL,0x94ecaf18eece51cfL,
28187         0x2864d0edca806e1fL } },
28188     /* 45 << 63 */
28189     { { 0x6de2e38397c69134L,0x5a42c316eb291293L,0xc77792196a60bae0L,
28190         0xa24de3466b7599d1L },
28191       { 0x49d374aab75d4941L,0x989005862d501ff0L,0x9f16d40eeb7974cfL,
28192         0x1033860bcdd8c115L } },
28193     /* 46 << 63 */
28194     { { 0xb6c69ac82094cec3L,0x9976fb88403b770cL,0x1dea026c4859590dL,
28195         0xb6acbb468562d1fdL },
28196       { 0x7cd6c46144569d85L,0xc3190a3697f0891dL,0xc6f5319548d5a17dL,
28197         0x7d919966d749abc8L } },
28198     /* 47 << 63 */
28199     { { 0x65104837dd1c8a20L,0x7e5410c82f683419L,0x958c3ca8be94022eL,
28200         0x605c31976145dac2L },
28201       { 0x3fc0750101683d54L,0x1d7127c5595b1234L,0x10b8f87c9481277fL,
28202         0x677db2a8e65a1adbL } },
28203     /* 48 << 63 */
28204     { { 0xec2fccaaddce3345L,0x2a6811b7012a4350L,0x96760ff1ac598bdcL,
28205         0x054d652ad1bf4128L },
28206       { 0x0a1151d492a21005L,0xad7f397133110fdfL,0x8c95928c1960100fL,
28207         0x6c91c8257bf03362L } },
28208     /* 49 << 63 */
28209     { { 0xc8c8b2a2ce309f06L,0xfdb27b59ca27204bL,0xd223eaa50848e32eL,
28210         0xb93e4b2ee7bfaf1eL },
28211       { 0xc5308ae644aa3dedL,0x317a666ac015d573L,0xc888ce231a979707L,
28212         0xf141c1e60d5c4958L } },
28213     /* 50 << 63 */
28214     { { 0xb53b7de561906373L,0x858dbadeeb999595L,0x8cbb47b2a59e5c36L,
28215         0x660318b3dcf4e842L },
28216       { 0xbd161ccd12ba4b7aL,0xf399daabf8c8282aL,0x1587633aeeb2130dL,
28217         0xa465311ada38dd7dL } },
28218     /* 51 << 63 */
28219     { { 0x5f75eec864d3779bL,0x3c5d0476ad64c171L,0x874103712a914428L,
28220         0x8096a89190e2fc29L },
28221       { 0xd3d2ae9d23b3ebc2L,0x90bdd6dba580cfd6L,0x52dbb7f3c5b01f6cL,
28222         0xe68eded4e102a2dcL } },
28223     /* 52 << 63 */
28224     { { 0x17785b7799eb6df0L,0x26c3cc517386b779L,0x345ed9886417a48eL,
28225         0xe990b4e407d6ef31L },
28226       { 0x0f456b7e2586abbaL,0x239ca6a559c96e9aL,0xe327459ce2eb4206L,
28227         0x3a4c3313a002b90aL } },
28228     /* 53 << 63 */
28229     { { 0x2a114806f6a3f6fbL,0xad5cad2f85c251ddL,0x92c1f613f5a784d3L,
28230         0xec7bfacf349766d5L },
28231       { 0x04b3cd333e23cb3bL,0x3979fe84c5a64b2dL,0x192e27207e589106L,
28232         0xa60c43d1a15b527fL } },
28233     /* 54 << 63 */
28234     { { 0x2dae9082be7cf3a6L,0xcc86ba92bc967274L,0xf28a2ce8aea0a8a9L,
28235         0x404ca6d96ee988b3L },
28236       { 0xfd7e9c5d005921b8L,0xf56297f144e79bf9L,0xa163b4600d75ddc2L,
28237         0x30b23616a1f2be87L } },
28238     /* 55 << 63 */
28239     { { 0x4b070d21bfe50e2bL,0x7ef8cfd0e1bfede1L,0xadba00112aac4ae0L,
28240         0x2a3e7d01b9ebd033L },
28241       { 0x995277ece38d9d1cL,0xb500249e9c5d2de3L,0x8912b820f13ca8c9L,
28242         0xc8798114877793afL } },
28243     /* 56 << 63 */
28244     { { 0x19e6125dec3f1decL,0x07b1f040911178daL,0xd93ededa904a6738L,
28245         0x55187a5a0bebedcdL },
28246       { 0xf7d04722eb329d41L,0xf449099ef170b391L,0xfd317a69ca99f828L,
28247         0x50c3db2b34a4976dL } },
28248     /* 57 << 63 */
28249     { { 0xe9ba77843757b392L,0x326caefdaa3ca05aL,0x78e5293bf1e593d4L,
28250         0x7842a9370d98fd13L },
28251       { 0xe694bf965f96b10dL,0x373a9df606a8cd05L,0x997d1e51e8f0c7fcL,
28252         0x1d01979063fd972eL } },
28253     /* 58 << 63 */
28254     { { 0x0064d8585499fb32L,0x7b67bad977a8aeb7L,0x1d3eb9772d08eec5L,
28255         0x5fc047a6cbabae1dL },
28256       { 0x0577d159e54a64bbL,0x8862201bc43497e4L,0xad6b4e282ce0608dL,
28257         0x8b687b7d0b167aacL } },
28258     /* 59 << 63 */
28259     { { 0x6ed4d3678b2ecfa9L,0x24dfe62da90c3c38L,0xa1862e103fe5c42bL,
28260         0x1ca73dcad5732a9fL },
28261       { 0x35f038b776bb87adL,0x674976abf242b81fL,0x4f2bde7eb0fd90cdL,
28262         0x6efc172ea7fdf092L } },
28263     /* 60 << 63 */
28264     { { 0x3806b69b92222f1fL,0x5a2459ca6cf7ae70L,0x6789f69ca85217eeL,
28265         0x5f232b5ee3dc85acL },
28266       { 0x660e3ec548e9e516L,0x124b4e473197eb31L,0x10a0cb13aafcca23L,
28267         0x7bd63ba48213224fL } },
28268     /* 61 << 63 */
28269     { { 0xaffad7cc290a7f4fL,0x6b409c9e0286b461L,0x58ab809fffa407afL,
28270         0xc3122eedc68ac073L },
28271       { 0x17bf9e504ef24d7eL,0x5d9297943e2a5811L,0x519bc86702902e01L,
28272         0x76bba5da39c8a851L } },
28273     /* 62 << 63 */
28274     { { 0xe9f9669cda94951eL,0x4b6af58d66b8d418L,0xfa32107417d426a4L,
28275         0xc78e66a99dde6027L },
28276       { 0x0516c0834a53b964L,0xfc659d38ff602330L,0x0ab55e5c58c5c897L,
28277         0x985099b2838bc5dfL } },
28278     /* 63 << 63 */
28279     { { 0x061d9efcc52fc238L,0x712b27286ac1da3fL,0xfb6581499283fe08L,
28280         0x4954ac94b8aaa2f7L },
28281       { 0x85c0ada47fb2e74fL,0xee8ba98eb89926b0L,0xe4f9d37d23d1af5bL,
28282         0x14ccdbf9ba9b015eL } },
28283     /* 64 << 63 */
28284     { { 0xb674481b7bfe7178L,0x4e1debae65405868L,0x061b2821c48c867dL,
28285         0x69c15b35513b30eaL },
28286       { 0x3b4a166636871088L,0xe5e29f5d1220b1ffL,0x4b82bb35233d9f4dL,
28287         0x4e07633318cdc675L } },
28288     /* 0 << 70 */
28289     { { 0x00, 0x00, 0x00, 0x00 },
28290       { 0x00, 0x00, 0x00, 0x00 } },
28291     /* 1 << 70 */
28292     { { 0x0d53f5c7a3e6fcedL,0xe8cbbdd5f45fbdebL,0xf85c01df13339a70L,
28293         0x0ff71880142ceb81L },
28294       { 0x4c4e8774bd70437aL,0x5fb32891ba0bda6aL,0x1cdbebd2f18bd26eL,
28295         0x2f9526f103a9d522L } },
28296     /* 2 << 70 */
28297     { { 0x40ce305192c4d684L,0x8b04d7257612efcdL,0xb9dcda366f9cae20L,
28298         0x0edc4d24f058856cL },
28299       { 0x64f2e6bf85427900L,0x3de81295dc09dfeaL,0xd41b4487379bf26cL,
28300         0x50b62c6d6df135a9L } },
28301     /* 3 << 70 */
28302     { { 0xd4f8e3b4c72dfe67L,0xc416b0f690e19fdfL,0x18b9098d4c13bd35L,
28303         0xac11118a15b8cb9eL },
28304       { 0xf598a318f0062841L,0xbfe0602f89f356f4L,0x7ae3637e30177a0cL,
28305         0x3409774761136537L } },
28306     /* 4 << 70 */
28307     { { 0x0db2fb5ed005832aL,0x5f5efd3b91042e4fL,0x8c4ffdc6ed70f8caL,
28308         0xe4645d0bb52da9ccL },
28309       { 0x9596f58bc9001d1fL,0x52c8f0bc4e117205L,0xfd4aa0d2e398a084L,
28310         0x815bfe3a104f49deL } },
28311     /* 5 << 70 */
28312     { { 0x97e5443f23885e5fL,0xf72f8f99e8433aabL,0xbd00b154e4d4e604L,
28313         0xd0b35e6ae5e173ffL },
28314       { 0x57b2a0489164722dL,0x3e3c665b88761ec8L,0x6bdd13973da83832L,
28315         0x3c8b1a1e73dafe3bL } },
28316     /* 6 << 70 */
28317     { { 0x4497ace654317cacL,0xbe600ab9521771b3L,0xb42e409eb0dfe8b8L,
28318         0x386a67d73942310fL },
28319       { 0x25548d8d4431cc28L,0xa7cff142985dc524L,0x4d60f5a193c4be32L,
28320         0x83ebd5c8d071c6e1L } },
28321     /* 7 << 70 */
28322     { { 0xba3a80a7b1fd2b0bL,0x9b3ad3965bec33e8L,0xb3868d6179743fb3L,
28323         0xcfd169fcfdb462faL },
28324       { 0xd3b499d79ce0a6afL,0x55dc1cf1e42d3ff8L,0x04fb9e6cc6c3e1b2L,
28325         0x47e6961d6f69a474L } },
28326     /* 8 << 70 */
28327     { { 0x54eb3acce548b37bL,0xb38e754284d40549L,0x8c3daa517b341b4fL,
28328         0x2f6928ec690bf7faL },
28329       { 0x0496b32386ce6c41L,0x01be1c5510adadcdL,0xc04e67e74bb5faf9L,
28330         0x3cbaf678e15c9985L } },
28331     /* 9 << 70 */
28332     { { 0x8cd1214550ca4247L,0xba1aa47ae7dd30aaL,0x2f81ddf1e58fee24L,
28333         0x03452936eec9b0e8L },
28334       { 0x8bdc3b81243aea96L,0x9a2919af15c3d0e5L,0x9ea640ec10948361L,
28335         0x5ac86d5b6e0bcccfL } },
28336     /* 10 << 70 */
28337     { { 0xf892d918c36cf440L,0xaed3e837c939719cL,0xb07b08d2c0218b64L,
28338         0x6f1bcbbace9790ddL },
28339       { 0x4a84d6ed60919b8eL,0xd89007918ac1f9ebL,0xf84941aa0dd5daefL,
28340         0xb22fe40a67fd62c5L } },
28341     /* 11 << 70 */
28342     { { 0x97e15ba2157f2db3L,0xbda2fc8f8e28ca9cL,0x5d050da437b9f454L,
28343         0x3d57eb572379d72eL },
28344       { 0xe9b5eba2fb5ee997L,0x01648ca2e11538caL,0x32bb76f6f6327974L,
28345         0x338f14b8ff3f4bb7L } },
28346     /* 12 << 70 */
28347     { { 0x524d226ad7ab9a2dL,0x9c00090d7dfae958L,0x0ba5f5398751d8c2L,
28348         0x8afcbcdd3ab8262dL },
28349       { 0x57392729e99d043bL,0xef51263baebc943aL,0x9feace9320862935L,
28350         0x639efc03b06c817bL } },
28351     /* 13 << 70 */
28352     { { 0x1fe054b366b4be7aL,0x3f25a9de84a37a1eL,0xf39ef1ad78d75cd9L,
28353         0xd7b58f495062c1b5L },
28354       { 0x6f74f9a9ff563436L,0xf718ff29e8af51e7L,0x5234d31315e97fecL,
28355         0xb6a8e2b1292f1c0aL } },
28356     /* 14 << 70 */
28357     { { 0xa7f53aa8327720c1L,0x956ca322ba092cc8L,0x8f03d64a28746c4dL,
28358         0x51fe178266d0d392L },
28359       { 0xd19b34db3c832c80L,0x60dccc5c6da2e3b4L,0x245dd62e0a104cccL,
28360         0xa7ab1de1620b21fdL } },
28361     /* 15 << 70 */
28362     { { 0xb293ae0b3893d123L,0xf7b75783b15ee71cL,0x5aa3c61442a9468bL,
28363         0xd686123cdb15d744L },
28364       { 0x8c616891a7ab4116L,0x6fcd72c8a4e6a459L,0xac21911077e5fad7L,
28365         0xfb6a20e7704fa46bL } },
28366     /* 16 << 70 */
28367     { { 0xe839be7d341d81dcL,0xcddb688932148379L,0xda6211a1f7026eadL,
28368         0xf3b2575ff4d1cc5eL },
28369       { 0x40cfc8f6a7a73ae6L,0x83879a5e61d5b483L,0xc5acb1ed41a50ebcL,
28370         0x59a60cc83c07d8faL } },
28371     /* 17 << 70 */
28372     { { 0x1b73bdceb1876262L,0x2b0d79f012af4ee9L,0x8bcf3b0bd46e1d07L,
28373         0x17d6af9de45d152fL },
28374       { 0x735204616d736451L,0x43cbbd9756b0bf5aL,0xb0833a5bd5999b9dL,
28375         0x702614f0eb72e398L } },
28376     /* 18 << 70 */
28377     { { 0x0aadf01a59c3e9f8L,0x40200e77ce6b3d16L,0xda22bdd3deddafadL,
28378         0x76dedaf4310d72e1L },
28379       { 0x49ef807c4bc2e88fL,0x6ba81291146dd5a5L,0xa1a4077a7d8d59e9L,
28380         0x87b6a2e7802db349L } },
28381     /* 19 << 70 */
28382     { { 0xd56799971b4e598eL,0xf499ef1f06fe4b1dL,0x3978d3aefcb267c5L,
28383         0xb582b557235786d0L },
28384       { 0x32b3b2ca1715cb07L,0x4c3de6a28480241dL,0x63b5ffedcb571ecdL,
28385         0xeaf53900ed2fe9a9L } },
28386     /* 20 << 70 */
28387     { { 0xdec98d4ac3b81990L,0x1cb837229e0cc8feL,0xfe0b0491d2b427b9L,
28388         0x0f2386ace983a66cL },
28389       { 0x930c4d1eb3291213L,0xa2f82b2e59a62ae4L,0x77233853f93e89e3L,
28390         0x7f8063ac11777c7fL } },
28391     /* 21 << 70 */
28392     { { 0xff0eb56759ad2877L,0x6f4546429865c754L,0xe6fe701a236e9a84L,
28393         0xc586ef1606e40fc3L },
28394       { 0x3f62b6e024bafad9L,0xc8b42bd264da906aL,0xc98e1eb4da3276a0L,
28395         0x30d0e5fc06cbf852L } },
28396     /* 22 << 70 */
28397     { { 0x1b6b2ae1e8b4dfd4L,0xd754d5c78301cbacL,0x66097629112a39acL,
28398         0xf86b599993ba4ab9L },
28399       { 0x26c9dea799f9d581L,0x0473b1a8c2fafeaaL,0x1469af553b2505a5L,
28400         0x227d16d7d6a43323L } },
28401     /* 23 << 70 */
28402     { { 0x3316f73cad3d97f9L,0x52bf3bb51f137455L,0x953eafeb09954e7cL,
28403         0xa721dfeddd732411L },
28404       { 0xb4929821141d4579L,0x3411321caa3bd435L,0xafb355aa17fa6015L,
28405         0xb4e7ef4a18e42f0eL } },
28406     /* 24 << 70 */
28407     { { 0x604ac97c59371000L,0xe1c48c707f759c18L,0x3f62ecc5a5db6b65L,
28408         0x0a78b17338a21495L },
28409       { 0x6be1819dbcc8ad94L,0x70dc04f6d89c3400L,0x462557b4a6b4840aL,
28410         0x544c6ade60bd21c0L } },
28411     /* 25 << 70 */
28412     { { 0x6a00f24e907a544bL,0xa7520dcb313da210L,0xfe939b7511e4994bL,
28413         0x918b6ba6bc275d70L },
28414       { 0xd3e5e0fc644be892L,0x707a9816fdaf6c42L,0x60145567f15c13feL,
28415         0x4818ebaae130a54aL } },
28416     /* 26 << 70 */
28417     { { 0x28aad3ad58d2f767L,0xdc5267fdd7e7c773L,0x4919cc88c3afcc98L,
28418         0xaa2e6ab02db8cd4bL },
28419       { 0xd46fec04d0c63eaaL,0xa1cb92c519ffa832L,0x678dd178e43a631fL,
28420         0xfb5ae1cd3dc788b3L } },
28421     /* 27 << 70 */
28422     { { 0x68b4fb906e77de04L,0x7992bcf0f06dbb97L,0x896e6a13c417c01dL,
28423         0x8d96332cb956be01L },
28424       { 0x902fc93a413aa2b9L,0x99a4d915fc98c8a5L,0x52c29407565f1137L,
28425         0x4072690f21e4f281L } },
28426     /* 28 << 70 */
28427     { { 0x36e607cf02ff6072L,0xa47d2ca98ad98cdcL,0xbf471d1ef5f56609L,
28428         0xbcf86623f264ada0L },
28429       { 0xb70c0687aa9e5cb6L,0xc98124f217401c6cL,0x8189635fd4a61435L,
28430         0xd28fb8afa9d98ea6L } },
28431     /* 29 << 70 */
28432     { { 0xb9a67c2a40c251f8L,0x88cd5d87a2da44beL,0x437deb96e09b5423L,
28433         0x150467db64287dc1L },
28434       { 0xe161debbcdabb839L,0xa79e9742f1839a3eL,0xbb8dd3c2652d202bL,
28435         0x7b3e67f7e9f97d96L } },
28436     /* 30 << 70 */
28437     { { 0x5aa5d78fb1cb6ac9L,0xffa13e8eca1d0d45L,0x369295dd2ba5bf95L,
28438         0xd68bd1f839aff05eL },
28439       { 0xaf0d86f926d783f2L,0x543a59b3fc3aafc1L,0x3fcf81d27b7da97cL,
28440         0xc990a056d25dee46L } },
28441     /* 31 << 70 */
28442     { { 0x3e6775b8519cce2cL,0xfc9af71fae13d863L,0x774a4a6f47c1605cL,
28443         0x46ba42452fd205e8L },
28444       { 0xa06feea4d3fd524dL,0x1e7246416de1acc2L,0xf53816f1334e2b42L,
28445         0x49e5918e922f0024L } },
28446     /* 32 << 70 */
28447     { { 0x439530b665c7322dL,0xcf12cc01b3c1b3fbL,0xc70b01860172f685L,
28448         0xb915ee221b58391dL },
28449       { 0x9afdf03ba317db24L,0x87dec65917b8ffc4L,0x7f46597be4d3d050L,
28450         0x80a1c1ed006500e7L } },
28451     /* 33 << 70 */
28452     { { 0x84902a9678bf030eL,0xfb5e9c9a50560148L,0x6dae0a9263362426L,
28453         0xdcaeecf4a9e30c40L },
28454       { 0xc0d887bb518d0c6bL,0x99181152cb985b9dL,0xad186898ef7bc381L,
28455         0x18168ffb9ee46201L } },
28456     /* 34 << 70 */
28457     { { 0x9a04cdaa2502753cL,0xbb279e2651407c41L,0xeacb03aaf23564e5L,
28458         0x1833658271e61016L },
28459       { 0x8684b8c4eb809877L,0xb336e18dea0e672eL,0xefb601f034ee5867L,
28460         0x2733edbe1341cfd1L } },
28461     /* 35 << 70 */
28462     { { 0xb15e809a26025c3cL,0xe6e981a69350df88L,0x923762378502fd8eL,
28463         0x4791f2160c12be9bL },
28464       { 0xb725678925f02425L,0xec8631947a974443L,0x7c0ce882fb41cc52L,
28465         0xc266ff7ef25c07f2L } },
28466     /* 36 << 70 */
28467     { { 0x3d4da8c3017025f3L,0xefcf628cfb9579b4L,0x5c4d00161f3716ecL,
28468         0x9c27ebc46801116eL },
28469       { 0x5eba0ea11da1767eL,0xfe15145247004c57L,0x3ace6df68c2373b7L,
28470         0x75c3dffe5dbc37acL } },
28471     /* 37 << 70 */
28472     { { 0x3dc32a73ddc925fcL,0xb679c8412f65ee0bL,0x715a3295451cbfebL,
28473         0xd9889768f76e9a29L },
28474       { 0xec20ce7fb28ad247L,0xe99146c400894d79L,0x71457d7c9f5e3ea7L,
28475         0x097b266238030031L } },
28476     /* 38 << 70 */
28477     { { 0xdb7f6ae6cf9f82a8L,0x319decb9438f473aL,0xa63ab386283856c3L,
28478         0x13e3172fb06a361bL },
28479       { 0x2959f8dc7d5a006cL,0x2dbc27c675fba752L,0xc1227ab287c22c9eL,
28480         0x06f61f7571a268b2L } },
28481     /* 39 << 70 */
28482     { { 0x1b6bb97104779ce2L,0xaca838120aadcb1dL,0x297ae0bcaeaab2d5L,
28483         0xa5c14ee75bfb9f13L },
28484       { 0xaa00c583f17a62c7L,0x39eb962c173759f6L,0x1eeba1d486c9a88fL,
28485         0x0ab6c37adf016c5eL } },
28486     /* 40 << 70 */
28487     { { 0xa2a147dba28a0749L,0x246c20d6ee519165L,0x5068d1b1d3810715L,
28488         0xb1e7018c748160b9L },
28489       { 0x03f5b1faf380ff62L,0xef7fb1ddf3cb2c1eL,0xeab539a8fc91a7daL,
28490         0x83ddb707f3f9b561L } },
28491     /* 41 << 70 */
28492     { { 0xc550e211fe7df7a4L,0xa7cd07f2063f6f40L,0xb0de36352976879cL,
28493         0xb5f83f85e55741daL },
28494       { 0x4ea9d25ef3d8ac3dL,0x6fe2066f62819f02L,0x4ab2b9c2cef4a564L,
28495         0x1e155d965ffa2de3L } },
28496     /* 42 << 70 */
28497     { { 0x0eb0a19bc3a72d00L,0x4037665b8513c31bL,0x2fb2b6bf04c64637L,
28498         0x45c34d6e08cdc639L },
28499       { 0x56f1e10ff01fd796L,0x4dfb8101fe3667b8L,0xe0eda2539021d0c0L,
28500         0x7a94e9ff8a06c6abL } },
28501     /* 43 << 70 */
28502     { { 0x2d3bb0d9bb9aa882L,0xea20e4e5ec05fd10L,0xed7eeb5f1a1ca64eL,
28503         0x2fa6b43cc6327cbdL },
28504       { 0xb577e3cf3aa91121L,0x8c6bd5ea3a34079bL,0xd7e5ba3960e02fc0L,
28505         0xf16dd2c390141bf8L } },
28506     /* 44 << 70 */
28507     { { 0xb57276d980101b98L,0x760883fdb82f0f66L,0x89d7de754bc3eff3L,
28508         0x03b606435dc2ab40L },
28509       { 0xcd6e53dfe05beeacL,0xf2f1e862bc3325cdL,0xdd0f7921774f03c3L,
28510         0x97ca72214552cc1bL } },
28511     /* 45 << 70 */
28512     { { 0x5a0d6afe1cd19f72L,0xa20915dcf183fbebL,0x9fda4b40832c403cL,
28513         0x32738eddbe425442L },
28514       { 0x469a1df6b5eccf1aL,0x4b5aff4228bbe1f0L,0x31359d7f570dfc93L,
28515         0xa18be235f0088628L } },
28516     /* 46 << 70 */
28517     { { 0xa5b30fbab00ed3a9L,0x34c6137473cdf8beL,0x2c5c5f46abc56797L,
28518         0x5cecf93db82a8ae2L },
28519       { 0x7d3dbe41a968fbf0L,0xd23d45831a5c7f3dL,0xf28f69a0c087a9c7L,
28520         0xc2d75471474471caL } },
28521     /* 47 << 70 */
28522     { { 0x36ec9f4a4eb732ecL,0x6c943bbdb1ca6bedL,0xd64535e1f2457892L,
28523         0x8b84a8eaf7e2ac06L },
28524       { 0xe0936cd32499dd5fL,0x12053d7e0ed04e57L,0x4bdd0076e4305d9dL,
28525         0x34a527b91f67f0a2L } },
28526     /* 48 << 70 */
28527     { { 0xe79a4af09cec46eaL,0xb15347a1658b9bc7L,0x6bd2796f35af2f75L,
28528         0xac9579904051c435L },
28529       { 0x2669dda3c33a655dL,0x5d503c2e88514aa3L,0xdfa113373753dd41L,
28530         0x3f0546730b754f78L } },
28531     /* 49 << 70 */
28532     { { 0xbf185677496125bdL,0xfb0023c83775006cL,0xfa0f072f3a037899L,
28533         0x4222b6eb0e4aea57L },
28534       { 0x3dde5e767866d25aL,0xb6eb04f84837aa6fL,0x5315591a2cf1cdb8L,
28535         0x6dfb4f412d4e683cL } },
28536     /* 50 << 70 */
28537     { { 0x7e923ea448ee1f3aL,0x9604d9f705a2afd5L,0xbe1d4a3340ea4948L,
28538         0x5b45f1f4b44cbd2fL },
28539       { 0x5faf83764acc757eL,0xa7cf9ab863d68ff7L,0x8ad62f69df0e404bL,
28540         0xd65f33c212bdafdfL } },
28541     /* 51 << 70 */
28542     { { 0xc365de15a377b14eL,0x6bf5463b8e39f60cL,0x62030d2d2ce68148L,
28543         0xd95867efe6f843a8L },
28544       { 0xd39a0244ef5ab017L,0x0bd2d8c14ab55d12L,0xc9503db341639169L,
28545         0x2d4e25b0f7660c8aL } },
28546     /* 52 << 70 */
28547     { { 0x760cb3b5e224c5d7L,0xfa3baf8c68616919L,0x9fbca1138d142552L,
28548         0x1ab18bf17669ebf5L },
28549       { 0x55e6f53e9bdf25ddL,0x04cc0bf3cb6cd154L,0x595bef4995e89080L,
28550         0xfe9459a8104a9ac1L } },
28551     /* 53 << 70 */
28552     { { 0xad2d89cacce9bb32L,0xddea65e1f7de8285L,0x62ed8c35b351bd4bL,
28553         0x4150ff360c0e19a7L },
28554       { 0x86e3c801345f4e47L,0x3bf21f71203a266cL,0x7ae110d4855b1f13L,
28555         0x5d6aaf6a07262517L } },
28556     /* 54 << 70 */
28557     { { 0x1e0f12e1813d28f1L,0x6000e11d7ad7a523L,0xc7d8deefc744a17bL,
28558         0x1e990b4814c05a00L },
28559       { 0x68fddaee93e976d5L,0x696241d146610d63L,0xb204e7c3893dda88L,
28560         0x8bccfa656a3a6946L } },
28561     /* 55 << 70 */
28562     { { 0xb59425b4c5cd1411L,0x701b4042ff3658b1L,0xe3e56bca4784cf93L,
28563         0x27de5f158fe68d60L },
28564       { 0x4ab9cfcef8d53f19L,0xddb10311a40a730dL,0x6fa73cd14eee0a8aL,
28565         0xfd5487485249719dL } },
28566     /* 56 << 70 */
28567     { { 0x49d66316a8123ef0L,0x73c32db4e7f95438L,0x2e2ed2090d9e7854L,
28568         0xf98a93299d9f0507L },
28569       { 0xc5d33cf60c6aa20aL,0x9a32ba1475279bb2L,0x7e3202cb774a7307L,
28570         0x64ed4bc4e8c42dbdL } },
28571     /* 57 << 70 */
28572     { { 0xc20f1a06d4caed0dL,0xb8021407171d22b3L,0xd426ca04d13268d7L,
28573         0x9237700725f4d126L },
28574       { 0x4204cbc371f21a85L,0x18461b7af82369baL,0xc0c07d313fc858f9L,
28575         0x5deb5a50e2bab569L } },
28576     /* 58 << 70 */
28577     { { 0xd5959d46d5eea89eL,0xfdff842408437f4bL,0xf21071e43cfe254fL,
28578         0x7241769695468321L },
28579       { 0x5d8288b9102cae3eL,0x2d143e3df1965dffL,0x00c9a376a078d847L,
28580         0x6fc0da3126028731L } },
28581     /* 59 << 70 */
28582     { { 0xa2baeadfe45083a2L,0x66bc72185e5b4bcdL,0x2c826442d04b8e7fL,
28583         0xc19f54516c4b586bL },
28584       { 0x60182c495b7eeed5L,0xd9954ecd7aa9dfa1L,0xa403a8ecc73884adL,
28585         0x7fb17de29bb39041L } },
28586     /* 60 << 70 */
28587     { { 0x694b64c5abb020e8L,0x3d18c18419c4eec7L,0x9c4673ef1c4793e5L,
28588         0xc7b8aeb5056092e6L },
28589       { 0x3aa1ca43f0f8c16bL,0x224ed5ecd679b2f6L,0x0d56eeaf55a205c9L,
28590         0xbfe115ba4b8e028bL } },
28591     /* 61 << 70 */
28592     { { 0x97e608493927f4feL,0xf91fbf94759aa7c5L,0x985af7696be90a51L,
28593         0xc1277b7878ccb823L },
28594       { 0x395b656ee7a75952L,0x00df7de0928da5f5L,0x09c231754ca4454fL,
28595         0x4ec971f47aa2d3c1L } },
28596     /* 62 << 70 */
28597     { { 0x45c3c507e75d9cccL,0x63b7be8a3dc90306L,0x37e09c665db44bdcL,
28598         0x50d60da16841c6a2L },
28599       { 0x6f9b65ee08df1b12L,0x387348797ff089dfL,0x9c331a663fe8013dL,
28600         0x017f5de95f42fcc8L } },
28601     /* 63 << 70 */
28602     { { 0x43077866e8e57567L,0xc9f781cef9fcdb18L,0x38131dda9b12e174L,
28603         0x25d84aa38a03752aL },
28604       { 0x45e09e094d0c0ce2L,0x1564008b92bebba5L,0xf7e8ad31a87284c7L,
28605         0xb7c4b46c97e7bbaaL } },
28606     /* 64 << 70 */
28607     { { 0x3e22a7b397acf4ecL,0x0426c4005ea8b640L,0x5e3295a64e969285L,
28608         0x22aabc59a6a45670L },
28609       { 0xb929714c5f5942bcL,0x9a6168bdfa3182edL,0x2216a665104152baL,
28610         0x46908d03b6926368L } },
28611     /* 0 << 77 */
28612     { { 0x00, 0x00, 0x00, 0x00 },
28613       { 0x00, 0x00, 0x00, 0x00 } },
28614     /* 1 << 77 */
28615     { { 0xa9f5d8745a1251fbL,0x967747a8c72725c7L,0x195c33e531ffe89eL,
28616         0x609d210fe964935eL },
28617       { 0xcafd6ca82fe12227L,0xaf9b5b960426469dL,0x2e9ee04c5693183cL,
28618         0x1084a333c8146fefL } },
28619     /* 2 << 77 */
28620     { { 0x96649933aed1d1f7L,0x566eaff350563090L,0x345057f0ad2e39cfL,
28621         0x148ff65b1f832124L },
28622       { 0x042e89d4cf94cf0dL,0x319bec84520c58b3L,0x2a2676265361aa0dL,
28623         0xc86fa3028fbc87adL } },
28624     /* 3 << 77 */
28625     { { 0xfc83d2ab5c8b06d5L,0xb1a785a2fe4eac46L,0xb99315bc846f7779L,
28626         0xcf31d816ef9ea505L },
28627       { 0x2391fe6a15d7dc85L,0x2f132b04b4016b33L,0x29547fe3181cb4c7L,
28628         0xdb66d8a6650155a1L } },
28629     /* 4 << 77 */
28630     { { 0x6b66d7e1adc1696fL,0x98ebe5930acd72d0L,0x65f24550cc1b7435L,
28631         0xce231393b4b9a5ecL },
28632       { 0x234a22d4db067df9L,0x98dda095caff9b00L,0x1bbc75a06100c9c1L,
28633         0x1560a9c8939cf695L } },
28634     /* 5 << 77 */
28635     { { 0xcf006d3e99e0925fL,0x2dd74a966322375aL,0xc58b446ab56af5baL,
28636         0x50292683e0b9b4f1L },
28637       { 0xe2c34cb41aeaffa3L,0x8b17203f9b9587c1L,0x6d559207ead1350cL,
28638         0x2b66a215fb7f9604L } },
28639     /* 6 << 77 */
28640     { { 0x0850325efe51bf74L,0x9c4f579e5e460094L,0x5c87b92a76da2f25L,
28641         0x889de4e06febef33L },
28642       { 0x6900ec06646083ceL,0xbe2a0335bfe12773L,0xadd1da35c5344110L,
28643         0x757568b7b802cd20L } },
28644     /* 7 << 77 */
28645     { { 0x7555977900f7e6c8L,0x38e8b94f0facd2f0L,0xfea1f3af03fde375L,
28646         0x5e11a1d875881dfcL },
28647       { 0xb3a6b02ec1e2f2efL,0x193d2bbbc605a6c5L,0x325ffeee339a0b2dL,
28648         0x27b6a7249e0c8846L } },
28649     /* 8 << 77 */
28650     { { 0xe4050f1cf1c367caL,0x9bc85a9bc90fbc7dL,0xa373c4a2e1a11032L,
28651         0xb64232b7ad0393a9L },
28652       { 0xf5577eb0167dad29L,0x1604f30194b78ab2L,0x0baa94afe829348bL,
28653         0x77fbd8dd41654342L } },
28654     /* 9 << 77 */
28655     { { 0xdab50ea5b964e39aL,0xd4c29e3cd0d3c76eL,0x80dae67c56d11964L,
28656         0x7307a8bfe5ffcc2fL },
28657       { 0x65bbc1aa91708c3bL,0xa151e62c28bf0eebL,0x6cb533816fa34db7L,
28658         0x5139e05ca29403a8L } },
28659     /* 10 << 77 */
28660     { { 0x6ff651b494a7cd2eL,0x5671ffd10699336cL,0x6f5fd2cc979a896aL,
28661         0x11e893a8d8148cefL },
28662       { 0x988906a165cf7b10L,0x81b67178c50d8485L,0x7c0deb358a35b3deL,
28663         0x423ac855c1d29799L } },
28664     /* 11 << 77 */
28665     { { 0xaf580d87dac50b74L,0x28b2b89f5869734cL,0x99a3b936874e28fbL,
28666         0xbb2c919025f3f73aL },
28667       { 0x199f691884a9d5b7L,0x7ebe23257e770374L,0xf442e1070738efe2L,
28668         0xcf9f3f56cf9082d2L } },
28669     /* 12 << 77 */
28670     { { 0x719f69e109618708L,0xcc9e8364c183f9b1L,0xec203a95366a21afL,
28671         0x6aec5d6d068b141fL },
28672       { 0xee2df78a994f04e9L,0xb39ccae8271245b0L,0xb875a4a997e43f4fL,
28673         0x507dfe11db2cea98L } },
28674     /* 13 << 77 */
28675     { { 0x4fbf81cb489b03e9L,0xdb86ec5b6ec414faL,0xfad444f9f51b3ae5L,
28676         0xca7d33d61914e3feL },
28677       { 0xa9c32f5c0ae6c4d0L,0xa9ca1d1e73969568L,0x98043c311aa7467eL,
28678         0xe832e75ce21b5ac6L } },
28679     /* 14 << 77 */
28680     { { 0x314b7aea5232123dL,0x08307c8c65ae86dbL,0x06e7165caa4668edL,
28681         0xb170458bb4d3ec39L },
28682       { 0x4d2e3ec6c19bb986L,0xc5f34846ae0304edL,0x917695a06c9f9722L,
28683         0x6c7f73174cab1c0aL } },
28684     /* 15 << 77 */
28685     { { 0x6295940e9d6d2e8bL,0xd318b8c1549f7c97L,0x2245320497713885L,
28686         0x468d834ba8a440feL },
28687       { 0xd81fe5b2bfba796eL,0x152364db6d71f116L,0xbb8c7c59b5b66e53L,
28688         0x0b12c61b2641a192L } },
28689     /* 16 << 77 */
28690     { { 0x31f14802fcf0a7fdL,0x42fd07895488b01eL,0x71d78d6d9952b498L,
28691         0x8eb572d907ac5201L },
28692       { 0xe0a2a44c4d194a88L,0xd2b63fd9ba017e66L,0x78efc6c8f888aefcL,
28693         0xb76f6bda4a881a11L } },
28694     /* 17 << 77 */
28695     { { 0x187f314bb46c2397L,0x004cf5665ded2819L,0xa9ea570438764d34L,
28696         0xbba4521778084709L },
28697       { 0x064745711171121eL,0xad7b7eb1e7c9b671L,0xdacfbc40730f7507L,
28698         0x178cd8c6c7ad7bd1L } },
28699     /* 18 << 77 */
28700     { { 0xbf0be101b2a67238L,0x3556d367af9c14f2L,0x104b7831a5662075L,
28701         0x58ca59bb79d9e60aL },
28702       { 0x4bc45392a569a73bL,0x517a52e85698f6c9L,0x85643da5aeadd755L,
28703         0x1aed0cd52a581b84L } },
28704     /* 19 << 77 */
28705     { { 0xb9b4ff8480af1372L,0x244c3113f1ba5d1fL,0x2a5dacbef5f98d31L,
28706         0x2c3323e84375bc2aL },
28707       { 0x17a3ab4a5594b1ddL,0xa1928bfbceb4797eL,0xe83af245e4886a19L,
28708         0x8979d54672b5a74aL } },
28709     /* 20 << 77 */
28710     { { 0xa0f726bc19f9e967L,0xd9d03152e8fbbf4eL,0xcfd6f51db7707d40L,
28711         0x633084d963f6e6e0L },
28712       { 0xedcd9cdc55667eafL,0x73b7f92b2e44d56fL,0xfb2e39b64e962b14L,
28713         0x7d408f6ef671fcbfL } },
28714     /* 21 << 77 */
28715     { { 0xcc634ddc164a89bbL,0x74a42bb23ef3bd05L,0x1280dbb2428decbbL,
28716         0x6103f6bb402c8596L },
28717       { 0xfa2bf581355a5752L,0x562f96a800946674L,0x4e4ca16d6da0223bL,
28718         0xfe47819f28d3aa25L } },
28719     /* 22 << 77 */
28720     { { 0x9eea3075f8dfcf8aL,0xa284f0aa95669825L,0xb3fca250867d3fd8L,
28721         0x20757b5f269d691eL },
28722       { 0xf2c2402093b8a5deL,0xd3f93359ebc06da6L,0x1178293eb2739c33L,
28723         0xd2a3e770bcd686e5L } },
28724     /* 23 << 77 */
28725     { { 0xa76f49f4cd941534L,0x0d37406be3c71c0eL,0x172d93973b97f7e3L,
28726         0xec17e239bd7fd0deL },
28727       { 0xe32905516f496ba2L,0x6a69317236ad50e7L,0xc4e539a283e7eff5L,
28728         0x752737e718e1b4cfL } },
28729     /* 24 << 77 */
28730     { { 0xa2f7932c68af43eeL,0x5502468e703d00bdL,0xe5dc978f2fb061f5L,
28731         0xc9a1904a28c815adL },
28732       { 0xd3af538d470c56a4L,0x159abc5f193d8cedL,0x2a37245f20108ef3L,
28733         0xfa17081e223f7178L } },
28734     /* 25 << 77 */
28735     { { 0x27b0fb2b10c8c0f5L,0x2102c3ea40650547L,0x594564df8ac3bfa7L,
28736         0x98102033509dad96L },
28737       { 0x6989643ff1d18a13L,0x35eebd91d7fc5af0L,0x078d096afaeaafd8L,
28738         0xb7a89341def3de98L } },
28739     /* 26 << 77 */
28740     { { 0x2a206e8decf2a73aL,0x066a63978e551994L,0x3a6a088ab98d53a2L,
28741         0x0ce7c67c2d1124aaL },
28742       { 0x48cec671759a113cL,0xe3b373d34f6f67faL,0x5455d479fd36727bL,
28743         0xe5a428eea13c0d81L } },
28744     /* 27 << 77 */
28745     { { 0xb853dbc81c86682bL,0xb78d2727b8d02b2aL,0xaaf69bed8ebc329aL,
28746         0xdb6b40b3293b2148L },
28747       { 0xe42ea77db8c4961fL,0xb1a12f7c20e5e0abL,0xa0ec527479e8b05eL,
28748         0x68027391fab60a80L } },
28749     /* 28 << 77 */
28750     { { 0x6bfeea5f16b1bd5eL,0xf957e4204de30ad3L,0xcbaf664e6a353b9eL,
28751         0x5c87331226d14febL },
28752       { 0x4e87f98cb65f57cbL,0xdb60a6215e0cdd41L,0x67c16865a6881440L,
28753         0x1093ef1a46ab52aaL } },
28754     /* 29 << 77 */
28755     { { 0xc095afb53f4ece64L,0x6a6bb02e7604551aL,0x55d44b4e0b26b8cdL,
28756         0xe5f9a999f971268aL },
28757       { 0xc08ec42511a7de84L,0x83568095fda469ddL,0x737bfba16c6c90a2L,
28758         0x1cb9c4a0be229831L } },
28759     /* 30 << 77 */
28760     { { 0x93bccbbabb2eec64L,0xa0c23b64da03adbeL,0x5f7aa00ae0e86ac4L,
28761         0x470b941efc1401e6L },
28762       { 0x5ad8d6799df43574L,0x4ccfb8a90f65d810L,0x1bce80e3aa7fbd81L,
28763         0x273291ad9508d20aL } },
28764     /* 31 << 77 */
28765     { { 0xf5c4b46b42a92806L,0x810684eca86ab44aL,0x4591640bca0bc9f8L,
28766         0xb5efcdfc5c4b6054L },
28767       { 0x16fc89076e9edd12L,0xe29d0b50d4d792f9L,0xa45fd01c9b03116dL,
28768         0x85035235c81765a4L } },
28769     /* 32 << 77 */
28770     { { 0x1fe2a9b2b4b4b67cL,0xc1d10df0e8020604L,0x9d64abfcbc8058d8L,
28771         0x8943b9b2712a0fbbL },
28772       { 0x90eed9143b3def04L,0x85ab3aa24ce775ffL,0x605fd4ca7bbc9040L,
28773         0x8b34a564e2c75dfbL } },
28774     /* 33 << 77 */
28775     { { 0x41ffc94a10358560L,0x2d8a50729e5c28aaL,0xe915a0fc4cc7eb15L,
28776         0xe9efab058f6d0f5dL },
28777       { 0xdbab47a9d19e9b91L,0x8cfed7450276154cL,0x154357ae2cfede0dL,
28778         0x520630df19f5a4efL } },
28779     /* 34 << 77 */
28780     { { 0x25759f7ce382360fL,0xb6db05c988bf5857L,0x2917d61d6c58d46cL,
28781         0x14f8e491fd20cb7aL },
28782       { 0xb68a727a11c20340L,0x0386f86faf7ccbb6L,0x5c8bc6ccfee09a20L,
28783         0x7d76ff4abb7eea35L } },
28784     /* 35 << 77 */
28785     { { 0xa7bdebe7db15be7aL,0x67a08054d89f0302L,0x56bf0ea9c1193364L,
28786         0xc824446762837ebeL },
28787       { 0x32bd8e8b20d841b8L,0x127a0548dbb8a54fL,0x83dd4ca663b20236L,
28788         0x87714718203491faL } },
28789     /* 36 << 77 */
28790     { { 0x4dabcaaaaa8a5288L,0x91cc0c8aaf23a1c9L,0x34c72c6a3f220e0cL,
28791         0xbcc20bdf1232144aL },
28792       { 0x6e2f42daa20ede1bL,0xc441f00c74a00515L,0xbf46a5b6734b8c4bL,
28793         0x574095037b56c9a4L } },
28794     /* 37 << 77 */
28795     { { 0x9f735261e4585d45L,0x9231faed6734e642L,0x1158a176be70ee6cL,
28796         0x35f1068d7c3501bfL },
28797       { 0x6beef900a2d26115L,0x649406f2ef0afee3L,0x3f43a60abc2420a1L,
28798         0x509002a7d5aee4acL } },
28799     /* 38 << 77 */
28800     { { 0xb46836a53ff3571bL,0x24f98b78837927c1L,0x6254256a4533c716L,
28801         0xf27abb0bd07ee196L },
28802       { 0xd7cf64fc5c6d5bfdL,0x6915c751f0cd7a77L,0xd9f590128798f534L,
28803         0x772b0da8f81d8b5fL } },
28804     /* 39 << 77 */
28805     { { 0x1244260c2e03fa69L,0x36cf0e3a3be1a374L,0x6e7c1633ef06b960L,
28806         0xa71a4c55671f90f6L },
28807       { 0x7a94125133c673dbL,0xc0bea51073e8c131L,0x61a8a699d4f6c734L,
28808         0x25e78c88341ed001L } },
28809     /* 40 << 77 */
28810     { { 0x5c18acf88e2f7d90L,0xfdbf33d777be32cdL,0x0a085cd7d2eb5ee9L,
28811         0x2d702cfbb3201115L },
28812       { 0xb6e0ebdb85c88ce8L,0x23a3ce3c1e01d617L,0x3041618e567333acL,
28813         0x9dd0fd8f157edb6bL } },
28814     /* 41 << 77 */
28815     { { 0x27f74702b57872b8L,0x2ef26b4f657d5fe1L,0x95426f0a57cf3d40L,
28816         0x847e2ad165a6067aL },
28817       { 0xd474d9a009996a74L,0x16a56acd2a26115cL,0x02a615c3d16f4d43L,
28818         0xcc3fc965aadb85b7L } },
28819     /* 42 << 77 */
28820     { { 0x386bda73ce07d1b0L,0xd82910c258ad4178L,0x124f82cfcd2617f4L,
28821         0xcc2f5e8def691770L },
28822       { 0x82702550b8c30cccL,0x7b856aea1a8e575aL,0xbb822fefb1ab9459L,
28823         0x085928bcec24e38eL } },
28824     /* 43 << 77 */
28825     { { 0x5d0402ecba8f4b4dL,0xc07cd4ba00b4d58bL,0x5d8dffd529227e7aL,
28826         0x61d44d0c31bf386fL },
28827       { 0xe486dc2b135e6f4dL,0x680962ebe79410efL,0xa61bd343f10088b5L,
28828         0x6aa76076e2e28686L } },
28829     /* 44 << 77 */
28830     { { 0x80463d118fb98871L,0xcb26f5c3bbc76affL,0xd4ab8eddfbe03614L,
28831         0xc8eb579bc0cf2deeL },
28832       { 0xcc004c15c93bae41L,0x46fbae5d3aeca3b2L,0x671235cf0f1e9ab1L,
28833         0xadfba9349ec285c1L } },
28834     /* 45 << 77 */
28835     { { 0x88ded013f216c980L,0xc8ac4fb8f79e0bc1L,0xa29b89c6fb97a237L,
28836         0xb697b7809922d8e7L },
28837       { 0x3142c639ddb945b5L,0x447b06c7e094c3a9L,0xcdcb364272266c90L,
28838         0x633aad08a9385046L } },
28839     /* 46 << 77 */
28840     { { 0xa36c936bb57c6477L,0x871f8b64e94dbcc6L,0x28d0fb62a591a67bL,
28841         0x9d40e081c1d926f5L },
28842       { 0x3111eaf6f2d84b5aL,0x228993f9a565b644L,0x0ccbf5922c83188bL,
28843         0xf87b30ab3df3e197L } },
28844     /* 47 << 77 */
28845     { { 0xb8658b317642bca8L,0x1a032d7f52800f17L,0x051dcae579bf9445L,
28846         0xeba6b8ee54a2e253L },
28847       { 0x5c8b9cadd4485692L,0x84bda40e8986e9beL,0xd16d16a42f0db448L,
28848         0x8ec80050a14d4188L } },
28849     /* 48 << 77 */
28850     { { 0xb2b2610798fa7aaaL,0x41209ee4f073aa4eL,0xf1570359f2d6b19bL,
28851         0xcbe6868cfc577cafL },
28852       { 0x186c4bdc32c04dd3L,0xa6c35faecfeee397L,0xb4a1b312f086c0cfL,
28853         0xe0a5ccc6d9461fe2L } },
28854     /* 49 << 77 */
28855     { { 0xc32278aa1536189fL,0x1126c55fba6df571L,0x0f71a602b194560eL,
28856         0x8b2d7405324bd6e1L },
28857       { 0x8481939e3738be71L,0xb5090b1a1a4d97a9L,0x116c65a3f05ba915L,
28858         0x21863ad3aae448aaL } },
28859     /* 50 << 77 */
28860     { { 0xd24e2679a7aae5d3L,0x7076013d0de5c1c4L,0x2d50f8babb05b629L,
28861         0x73c1abe26e66efbbL },
28862       { 0xefd4b422f2488af7L,0xe4105d02663ba575L,0x7eb60a8b53a69457L,
28863         0x62210008c945973bL } },
28864     /* 51 << 77 */
28865     { { 0xfb25547877a50ec6L,0xbf0392f70a37a72cL,0xa0a7a19c4be18e7aL,
28866         0x90d8ea1625b1e0afL },
28867       { 0x7582a293ef953f57L,0x90a64d05bdc5465aL,0xca79c497e2510717L,
28868         0x560dbb7c18cb641fL } },
28869     /* 52 << 77 */
28870     { { 0x1d8e32864b66abfbL,0xd26f52e559030900L,0x1ee3f6435584941aL,
28871         0x6d3b3730569f5958L },
28872       { 0x9ff2a62f4789dba5L,0x91fcb81572b5c9b7L,0xf446cb7d6c8f9a0eL,
28873         0x48f625c139b7ecb5L } },
28874     /* 53 << 77 */
28875     { { 0xbabae8011c6219b8L,0xe7a562d928ac2f23L,0xe1b4873226e20588L,
28876         0x06ee1cad775af051L },
28877       { 0xda29ae43faff79f7L,0xc141a412652ee9e0L,0x1e127f6f195f4bd0L,
28878         0x29c6ab4f072f34f8L } },
28879     /* 54 << 77 */
28880     { { 0x7b7c147730448112L,0x82b51af1e4a38656L,0x2bf2028a2f315010L,
28881         0xc9a4a01f6ea88cd4L },
28882       { 0xf63e95d8257e5818L,0xdd8efa10b4519b16L,0xed8973e00da910bfL,
28883         0xed49d0775c0fe4a9L } },
28884     /* 55 << 77 */
28885     { { 0xac3aac5eb7caee1eL,0x1033898da7f4da57L,0x42145c0e5c6669b9L,
28886         0x42daa688c1aa2aa0L },
28887       { 0x629cc15c1a1d885aL,0x25572ec0f4b76817L,0x8312e4359c8f8f28L,
28888         0x8107f8cd81965490L } },
28889     /* 56 << 77 */
28890     { { 0x516ff3a36fa6110cL,0x74fb1eb1fb93561fL,0x6c0c90478457522bL,
28891         0xcfd321046bb8bdc6L },
28892       { 0x2d6884a2cc80ad57L,0x7c27fc3586a9b637L,0x3461baedadf4e8cdL,
28893         0x1d56251a617242f0L } },
28894     /* 57 << 77 */
28895     { { 0x0b80d209c955bef4L,0xdf02cad206adb047L,0xf0d7cb915ec74feeL,
28896         0xd25033751111ba44L },
28897       { 0x9671755edf53cb36L,0x54dcb6123368551bL,0x66d69aacc8a025a4L,
28898         0x6be946c6e77ef445L } },
28899     /* 58 << 77 */
28900     { { 0x719946d1a995e094L,0x65e848f6e51e04d8L,0xe62f33006a1e3113L,
28901         0x1541c7c1501de503L },
28902       { 0x4daac9faf4acfadeL,0x0e58589744cd0b71L,0x544fd8690a51cd77L,
28903         0x60fc20ed0031016dL } },
28904     /* 59 << 77 */
28905     { { 0x58b404eca4276867L,0x46f6c3cc34f34993L,0x477ca007c636e5bdL,
28906         0x8018f5e57c458b47L },
28907       { 0xa1202270e47b668fL,0xcef48ccdee14f203L,0x23f98bae62ff9b4dL,
28908         0x55acc035c589edddL } },
28909     /* 60 << 77 */
28910     { { 0x3fe712af64db4444L,0x19e9d634becdd480L,0xe08bc047a930978aL,
28911         0x2dbf24eca1280733L },
28912       { 0x3c0ae38c2cd706b2L,0x5b012a5b359017b9L,0x3943c38c72e0f5aeL,
28913         0x786167ea57176fa3L } },
28914     /* 61 << 77 */
28915     { { 0xe5f9897d594881dcL,0x6b5efad8cfb820c1L,0xb2179093d55018deL,
28916         0x39ad7d320bac56ceL },
28917       { 0xb55122e02cfc0e81L,0x117c4661f6d89daaL,0x362d01e1cb64fa09L,
28918         0x6a309b4e3e9c4dddL } },
28919     /* 62 << 77 */
28920     { { 0xfa979fb7abea49b1L,0xb4b1d27d10e2c6c5L,0xbd61c2c423afde7aL,
28921         0xeb6614f89786d358L },
28922       { 0x4a5d816b7f6f7459L,0xe431a44f09360e7bL,0x8c27a032c309914cL,
28923         0xcea5d68acaede3d8L } },
28924     /* 63 << 77 */
28925     { { 0x3668f6653a0a3f95L,0x893694167ceba27bL,0x89981fade4728fe9L,
28926         0x7102c8a08a093562L },
28927       { 0xbb80310e235d21c8L,0x505e55d1befb7f7bL,0xa0a9081112958a67L,
28928         0xd67e106a4d851fefL } },
28929     /* 64 << 77 */
28930     { { 0xb84011a9431dd80eL,0xeb7c7cca73306cd9L,0x20fadd29d1b3b730L,
28931         0x83858b5bfe37b3d3L },
28932       { 0xbf4cd193b6251d5cL,0x1cca1fd31352d952L,0xc66157a490fbc051L,
28933         0x7990a63889b98636L } },
28934     /* 0 << 84 */
28935     { { 0x00, 0x00, 0x00, 0x00 },
28936       { 0x00, 0x00, 0x00, 0x00 } },
28937     /* 1 << 84 */
28938     { { 0xe5aa692a87dec0e1L,0x010ded8df7b39d00L,0x7b1b80c854cfa0b5L,
28939         0x66beb876a0f8ea28L },
28940       { 0x50d7f5313476cd0eL,0xa63d0e65b08d3949L,0x1a09eea953479fc6L,
28941         0x82ae9891f499e742L } },
28942     /* 2 << 84 */
28943     { { 0xab58b9105ca7d866L,0x582967e23adb3b34L,0x89ae4447cceac0bcL,
28944         0x919c667c7bf56af5L },
28945       { 0x9aec17b160f5dcd7L,0xec697b9fddcaadbcL,0x0b98f341463467f5L,
28946         0xb187f1f7a967132fL } },
28947     /* 3 << 84 */
28948     { { 0x90fe7a1d214aeb18L,0x1506af3c741432f7L,0xbb5565f9e591a0c4L,
28949         0x10d41a77b44f1bc3L },
28950       { 0xa09d65e4a84bde96L,0x42f060d8f20a6a1cL,0x652a3bfdf27f9ce7L,
28951         0xb6bdb65c3b3d739fL } },
28952     /* 4 << 84 */
28953     { { 0xeb5ddcb6ec7fae9fL,0x995f2714efb66e5aL,0xdee95d8e69445d52L,
28954         0x1b6c2d4609e27620L },
28955       { 0x32621c318129d716L,0xb03909f10958c1aaL,0x8c468ef91af4af63L,
28956         0x162c429ffba5cdf6L } },
28957     /* 5 << 84 */
28958     { { 0x2f682343753b9371L,0x29cab45a5f1f9cd7L,0x571623abb245db96L,
28959         0xc507db093fd79999L },
28960       { 0x4e2ef652af036c32L,0x86f0cc7805018e5cL,0xc10a73d4ab8be350L,
28961         0x6519b3977e826327L } },
28962     /* 6 << 84 */
28963     { { 0xe8cb5eef9c053df7L,0x8de25b37b300ea6fL,0xdb03fa92c849cffbL,
28964         0x242e43a7e84169bbL },
28965       { 0xe4fa51f4dd6f958eL,0x6925a77ff4445a8dL,0xe6e72a50e90d8949L,
28966         0xc66648e32b1f6390L } },
28967     /* 7 << 84 */
28968     { { 0xb2ab1957173e460cL,0x1bbbce7530704590L,0xc0a90dbddb1c7162L,
28969         0x505e399e15cdd65dL },
28970       { 0x68434dcb57797ab7L,0x60ad35ba6a2ca8e8L,0x4bfdb1e0de3336c1L,
28971         0xbbef99ebd8b39015L } },
28972     /* 8 << 84 */
28973     { { 0x6c3b96f31711ebecL,0x2da40f1fce98fdc4L,0xb99774d357b4411fL,
28974         0x87c8bdf415b65bb6L },
28975       { 0xda3a89e3c2eef12dL,0xde95bb9b3c7471f3L,0x600f225bd812c594L,
28976         0x54907c5d2b75a56bL } },
28977     /* 9 << 84 */
28978     { { 0xa93cc5f08db60e35L,0x743e3cd6fa833319L,0x7dad5c41f81683c9L,
28979         0x70c1e7d99c34107eL },
28980       { 0x0edc4a39a6be0907L,0x36d4703586d0b7d3L,0x8c76da03272bfa60L,
28981         0x0b4a07ea0f08a414L } },
28982     /* 10 << 84 */
28983     { { 0x699e4d2945c1dd53L,0xcadc5898231debb5L,0xdf49fcc7a77f00e0L,
28984         0x93057bbfa73e5a0eL },
28985       { 0x2f8b7ecd027a4cd1L,0x114734b3c614011aL,0xe7a01db767677c68L,
28986         0x89d9be5e7e273f4fL } },
28987     /* 11 << 84 */
28988     { { 0xd225cb2e089808efL,0xf1f7a27dd59e4107L,0x53afc7618211b9c9L,
28989         0x0361bc67e6819159L },
28990       { 0x2a865d0b7f071426L,0x6a3c1810e7072567L,0x3e3bca1e0d6bcabdL,
28991         0xa1b02bc1408591bcL } },
28992     /* 12 << 84 */
28993     { { 0xe0deee5931fba239L,0xf47424d398bd91d1L,0x0f8886f4071a3c1dL,
28994         0x3f7d41e8a819233bL },
28995       { 0x708623c2cf6eb998L,0x86bb49af609a287fL,0x942bb24963c90762L,
28996         0x0ef6eea555a9654bL } },
28997     /* 13 << 84 */
28998     { { 0x5f6d2d7236f5defeL,0xfa9922dc56f99176L,0x6c8c5ecef78ce0c7L,
28999         0x7b44589dbe09b55eL },
29000       { 0xe11b3bca9ea83770L,0xd7fa2c7f2ab71547L,0x2a3dd6fa2a1ddcc0L,
29001         0x09acb4305a7b7707L } },
29002     /* 14 << 84 */
29003     { { 0x4add4a2e649d4e57L,0xcd53a2b01917526eL,0xc526233020b44ac4L,
29004         0x4028746abaa2c31dL },
29005       { 0x5131839064291d4cL,0xbf48f151ee5ad909L,0xcce57f597b185681L,
29006         0x7c3ac1b04854d442L } },
29007     /* 15 << 84 */
29008     { { 0x65587dc3c093c171L,0xae7acb2424f42b65L,0x5a338adb955996cbL,
29009         0xc8e656756051f91bL },
29010       { 0x66711fba28b8d0b1L,0x15d74137b6c10a90L,0x70cdd7eb3a232a80L,
29011         0xc9e2f07f6191ed24L } },
29012     /* 16 << 84 */
29013     { { 0xa80d1db6f79588c0L,0xfa52fc69b55768ccL,0x0b4df1ae7f54438aL,
29014         0x0cadd1a7f9b46a4fL },
29015       { 0xb40ea6b31803dd6fL,0x488e4fa555eaae35L,0x9f047d55382e4e16L,
29016         0xc9b5b7e02f6e0c98L } },
29017     /* 17 << 84 */
29018     { { 0x6b1bd2d395762649L,0xa9604ee7c7aea3f6L,0x3646ff276dc6f896L,
29019         0x9bf0e7f52860bad1L },
29020       { 0x2d92c8217cb44b92L,0xa2f5ce63aea9c182L,0xd0a2afb19154a5fdL,
29021         0x482e474c95801da6L } },
29022     /* 18 << 84 */
29023     { { 0xc19972d0b611c24bL,0x1d468e6560a8f351L,0xeb7580697bcf6421L,
29024         0xec9dd0ee88fbc491L },
29025       { 0x5b59d2bf956c2e32L,0x73dc6864dcddf94eL,0xfd5e2321bcee7665L,
29026         0xa7b4f8ef5e9a06c4L } },
29027     /* 19 << 84 */
29028     { { 0xfba918dd7280f855L,0xbbaac2608baec688L,0xa3b3f00f33400f42L,
29029         0x3d2dba2966f2e6e4L },
29030       { 0xb6f71a9498509375L,0x8f33031fcea423ccL,0x009b8dd04807e6fbL,
29031         0x5163cfe55cdb954cL } },
29032     /* 20 << 84 */
29033     { { 0x03cc8f17cf41c6e8L,0xf1f03c2a037b925cL,0xc39c19cc66d2427cL,
29034         0x823d24ba7b6c18e4L },
29035       { 0x32ef9013901f0b4fL,0x684360f1f8941c2eL,0x0ebaff522c28092eL,
29036         0x7891e4e3256c932fL } },
29037     /* 21 << 84 */
29038     { { 0x51264319ac445e3dL,0x553432e78ea74381L,0xe6eeaa6967e9c50aL,
29039         0x27ced28462e628c7L },
29040       { 0x3f96d3757a4afa57L,0xde0a14c3e484c150L,0x364a24eb38bd9923L,
29041         0x1df18da0e5177422L } },
29042     /* 22 << 84 */
29043     { { 0x174e8f82d8d38a9bL,0x2e97c600e7de1391L,0xc5709850a1c175ddL,
29044         0x969041a032ae5035L },
29045       { 0xcbfd533b76a2086bL,0xd6bba71bd7c2e8feL,0xb2d58ee6099dfb67L,
29046         0x3a8b342d064a85d9L } },
29047     /* 23 << 84 */
29048     { { 0x3bc07649522f9be3L,0x690c075bdf1f49a8L,0x80e1aee83854ec42L,
29049         0x2a7dbf4417689dc7L },
29050       { 0xc004fc0e3faf4078L,0xb2f02e9edf11862cL,0xf10a5e0fa0a1b7b3L,
29051         0x30aca6238936ec80L } },
29052     /* 24 << 84 */
29053     { { 0xf83cbf0502f40d9aL,0x4681c4682c318a4dL,0x985756180e9c2674L,
29054         0xbe79d0461847092eL },
29055       { 0xaf1e480a78bd01e0L,0x6dd359e472a51db9L,0x62ce3821e3afbab6L,
29056         0xc5cee5b617733199L } },
29057     /* 25 << 84 */
29058     { { 0xe08b30d46ffd9fbbL,0x6e5bc69936c610b7L,0xf343cff29ce262cfL,
29059         0xca2e4e3568b914c1L },
29060       { 0x011d64c016de36c5L,0xe0b10fdd42e2b829L,0x789429816685aaf8L,
29061         0xe7511708230ede97L } },
29062     /* 26 << 84 */
29063     { { 0x671ed8fc3b922bf8L,0xe4d8c0a04c29b133L,0x87eb12393b6e99c4L,
29064         0xaff3974c8793bebaL },
29065       { 0x037494052c18df9bL,0xc5c3a29391007139L,0x6a77234fe37a0b95L,
29066         0x02c29a21b661c96bL } },
29067     /* 27 << 84 */
29068     { { 0xc3aaf1d6141ecf61L,0x9195509e3bb22f53L,0x2959740422d51357L,
29069         0x1b083822537bed60L },
29070       { 0xcd7d6e35e07289f0L,0x1f94c48c6dd86effL,0xc8bb1f82eb0f9cfaL,
29071         0x9ee0b7e61b2eb97dL } },
29072     /* 28 << 84 */
29073     { { 0x5a52fe2e34d74e31L,0xa352c3103bf79ab6L,0x97ff6c5aabfeeb8fL,
29074         0xbfbe8feff5c97305L },
29075       { 0xd6081ce6a7904608L,0x1f812f3ac4fca249L,0x9b24bc9ab9e5e200L,
29076         0x91022c6738012ee8L } },
29077     /* 29 << 84 */
29078     { { 0xe83d9c5d30a713a1L,0x4876e3f084ef0f93L,0xc9777029c1fbf928L,
29079         0xef7a6bb3bce7d2a4L },
29080       { 0xb8067228dfa2a659L,0xd5cd3398d877a48fL,0xbea4fd8f025d0f3fL,
29081         0xd67d2e352eae7c2bL } },
29082     /* 30 << 84 */
29083     { { 0x184de7d7cc5f4394L,0xb5551b5c4536e142L,0x2e89b212d34aa60aL,
29084         0x14a96feaf50051d5L },
29085       { 0x4e21ef740d12bb0bL,0xc522f02060b9677eL,0x8b12e4672df7731dL,
29086         0x39f803827b326d31L } },
29087     /* 31 << 84 */
29088     { { 0xdfb8630c39024a94L,0xaacb96a897319452L,0xd68a3961eda3867cL,
29089         0x0c58e2b077c4ffcaL },
29090       { 0x3d545d634da919faL,0xef79b69af15e2289L,0x54bc3d3d808bab10L,
29091         0xc8ab300745f82c37L } },
29092     /* 32 << 84 */
29093     { { 0xc12738b67c4a658aL,0xb3c4763940e72182L,0x3b77be468798e44fL,
29094         0xdc047df217a7f85fL },
29095       { 0x2439d4c55e59d92dL,0xcedca475e8e64d8dL,0xa724cd0d87ca9b16L,
29096         0x35e4fd59a5540dfeL } },
29097     /* 33 << 84 */
29098     { { 0xf8c1ff18e4bcf6b1L,0x856d6285295018faL,0x433f665c3263c949L,
29099         0xa6a76dd6a1f21409L },
29100       { 0x17d32334cc7b4f79L,0xa1d0312206720e4aL,0xadb6661d81d9bed5L,
29101         0xf0d6fb0211db15d1L } },
29102     /* 34 << 84 */
29103     { { 0x7fd11ad51fb747d2L,0xab50f9593033762bL,0x2a7e711bfbefaf5aL,
29104         0xc73932783fef2bbfL },
29105       { 0xe29fa2440df6f9beL,0x9092757b71efd215L,0xee60e3114f3d6fd9L,
29106         0x338542d40acfb78bL } },
29107     /* 35 << 84 */
29108     { { 0x44a23f0838961a0fL,0x1426eade986987caL,0x36e6ee2e4a863cc6L,
29109         0x48059420628b8b79L },
29110       { 0x30303ad87396e1deL,0x5c8bdc4838c5aad1L,0x3e40e11f5c8f5066L,
29111         0xabd6e7688d246bbdL } },
29112     /* 36 << 84 */
29113     { { 0x68aa40bb23330a01L,0xd23f5ee4c34eafa0L,0x3bbee3155de02c21L,
29114         0x18dd4397d1d8dd06L },
29115       { 0x3ba1939a122d7b44L,0xe6d3b40aa33870d6L,0x8e620f701c4fe3f8L,
29116         0xf6bba1a5d3a50cbfL } },
29117     /* 37 << 84 */
29118     { { 0x4a78bde5cfc0aee0L,0x847edc46c08c50bdL,0xbaa2439cad63c9b2L,
29119         0xceb4a72810fc2acbL },
29120       { 0xa419e40e26da033dL,0x6cc3889d03e02683L,0x1cd28559fdccf725L,
29121         0x0fd7e0f18d13d208L } },
29122     /* 38 << 84 */
29123     { { 0x01b9733b1f0df9d4L,0x8cc2c5f3a2b5e4f3L,0x43053bfa3a304fd4L,
29124         0x8e87665c0a9f1aa7L },
29125       { 0x087f29ecd73dc965L,0x15ace4553e9023dbL,0x2370e3092bce28b4L,
29126         0xf9723442b6b1e84aL } },
29127     /* 39 << 84 */
29128     { { 0xbeee662eb72d9f26L,0xb19396def0e47109L,0x85b1fa73e13289d0L,
29129         0x436cf77e54e58e32L },
29130       { 0x0ec833b3e990ef77L,0x7373e3ed1b11fc25L,0xbe0eda870fc332ceL,
29131         0xced049708d7ea856L } },
29132     /* 40 << 84 */
29133     { { 0xf85ff7857e977ca0L,0xb66ee8dadfdd5d2bL,0xf5e37950905af461L,
29134         0x587b9090966d487cL },
29135       { 0x6a198a1b32ba0127L,0xa7720e07141615acL,0xa23f3499996ef2f2L,
29136         0xef5f64b4470bcb3dL } },
29137     /* 41 << 84 */
29138     { { 0xa526a96292b8c559L,0x0c14aac069740a0fL,0x0d41a9e3a6bdc0a5L,
29139         0x97d521069c48aef4L },
29140       { 0xcf16bd303e7c253bL,0xcc834b1a47fdedc1L,0x7362c6e5373aab2eL,
29141         0x264ed85ec5f590ffL } },
29142     /* 42 << 84 */
29143     { { 0x7a46d9c066d41870L,0xa50c20b14787ba09L,0x185e7e51e3d44635L,
29144         0xb3b3e08031e2d8dcL },
29145       { 0xbed1e558a179e9d9L,0x2daa3f7974a76781L,0x4372baf23a40864fL,
29146         0x46900c544fe75cb5L } },
29147     /* 43 << 84 */
29148     { { 0xb95f171ef76765d0L,0x4ad726d295c87502L,0x2ec769da4d7c99bdL,
29149         0x5e2ddd19c36cdfa8L },
29150       { 0xc22117fca93e6deaL,0xe8a2583b93771123L,0xbe2f6089fa08a3a2L,
29151         0x4809d5ed8f0e1112L } },
29152     /* 44 << 84 */
29153     { { 0x3b414aa3da7a095eL,0x9049acf126f5aaddL,0x78d46a4d6be8b84aL,
29154         0xd66b1963b732b9b3L },
29155       { 0x5c2ac2a0de6e9555L,0xcf52d098b5bd8770L,0x15a15fa60fd28921L,
29156         0x56ccb81e8b27536dL } },
29157     /* 45 << 84 */
29158     { { 0x0f0d8ab89f4ccbb8L,0xed5f44d2db221729L,0x4314198800bed10cL,
29159         0xc94348a41d735b8bL },
29160       { 0x79f3e9c429ef8479L,0x4c13a4e3614c693fL,0x32c9af568e143a14L,
29161         0xbc517799e29ac5c4L } },
29162     /* 46 << 84 */
29163     { { 0x05e179922774856fL,0x6e52fb056c1bf55fL,0xaeda4225e4f19e16L,
29164         0x70f4728aaf5ccb26L },
29165       { 0x5d2118d1b2947f22L,0xc827ea16281d6fb9L,0x8412328d8cf0eabdL,
29166         0x45ee9fb203ef9dcfL } },
29167     /* 47 << 84 */
29168     { { 0x8e700421bb937d63L,0xdf8ff2d5cc4b37a6L,0xa4c0d5b25ced7b68L,
29169         0x6537c1efc7308f59L },
29170       { 0x25ce6a263b37f8e8L,0x170e9a9bdeebc6ceL,0xdd0379528728d72cL,
29171         0x445b0e55850154bcL } },
29172     /* 48 << 84 */
29173     { { 0x4b7d0e0683a7337bL,0x1e3416d4ffecf249L,0x24840eff66a2b71fL,
29174         0xd0d9a50ab37cc26dL },
29175       { 0xe21981506fe28ef7L,0x3cc5ef1623324c7fL,0x220f3455769b5263L,
29176         0xe2ade2f1a10bf475L } },
29177     /* 49 << 84 */
29178     { { 0x28cd20fa458d3671L,0x1549722c2dc4847bL,0x6dd01e55591941e3L,
29179         0x0e6fbcea27128ccbL },
29180       { 0xae1a1e6b3bef0262L,0xfa8c472c8f54e103L,0x7539c0a872c052ecL,
29181         0xd7b273695a3490e9L } },
29182     /* 50 << 84 */
29183     { { 0x143fe1f171684349L,0x36b4722e32e19b97L,0xdc05922790980affL,
29184         0x175c9c889e13d674L },
29185       { 0xa7de5b226e6bfdb1L,0x5ea5b7b2bedb4b46L,0xd5570191d34a6e44L,
29186         0xfcf60d2ea24ff7e6L } },
29187     /* 51 << 84 */
29188     { { 0x614a392d677819e1L,0x7be74c7eaa5a29e8L,0xab50fece63c85f3fL,
29189         0xaca2e2a946cab337L },
29190       { 0x7f700388122a6fe3L,0xdb69f703882a04a8L,0x9a77935dcf7aed57L,
29191         0xdf16207c8d91c86fL } },
29192     /* 52 << 84 */
29193     { { 0x2fca49ab63ed9998L,0xa3125c44a77ddf96L,0x05dd8a8624344072L,
29194         0xa023dda2fec3fb56L },
29195       { 0x421b41fc0c743032L,0x4f2120c15e438639L,0xfb7cae51c83c1b07L,
29196         0xb2370caacac2171aL } },
29197     /* 53 << 84 */
29198     { { 0x2eb2d9626cc820fbL,0x59feee5cb85a44bfL,0x94620fca5b6598f0L,
29199         0x6b922cae7e314051L },
29200       { 0xff8745ad106bed4eL,0x546e71f5dfa1e9abL,0x935c1e481ec29487L,
29201         0x9509216c4d936530L } },
29202     /* 54 << 84 */
29203     { { 0xc7ca306785c9a2dbL,0xd6ae51526be8606fL,0x09dbcae6e14c651dL,
29204         0xc9536e239bc32f96L },
29205       { 0xa90535a934521b03L,0xf39c526c878756ffL,0x383172ec8aedf03cL,
29206         0x20a8075eefe0c034L } },
29207     /* 55 << 84 */
29208     { { 0xf22f9c6264026422L,0x8dd1078024b9d076L,0x944c742a3bef2950L,
29209         0x55b9502e88a2b00bL },
29210       { 0xa59e14b486a09817L,0xa39dd3ac47bb4071L,0x55137f663be0592fL,
29211         0x07fcafd4c9e63f5bL } },
29212     /* 56 << 84 */
29213     { { 0x963652ee346eb226L,0x7dfab085ec2facb7L,0x273bf2b8691add26L,
29214         0x30d74540f2b46c44L },
29215       { 0x05e8e73ef2c2d065L,0xff9b8a00d42eeac9L,0x2fcbd20597209d22L,
29216         0xeb740ffade14ea2cL } },
29217     /* 57 << 84 */
29218     { { 0xc71ff913a8aef518L,0x7bfc74bbfff4cfa2L,0x1716680cb6b36048L,
29219         0x121b2cce9ef79af1L },
29220       { 0xbff3c836a01eb3d3L,0x50eb1c6a5f79077bL,0xa48c32d6a004bbcfL,
29221         0x47a593167d64f61dL } },
29222     /* 58 << 84 */
29223     { { 0x6068147f93102016L,0x12c5f65494d12576L,0xefb071a7c9bc6b91L,
29224         0x7c2da0c56e23ea95L },
29225       { 0xf4fd45b6d4a1dd5dL,0x3e7ad9b69122b13cL,0x342ca118e6f57a48L,
29226         0x1c2e94a706f8288fL } },
29227     /* 59 << 84 */
29228     { { 0x99e68f075a97d231L,0x7c80de974d838758L,0xbce0f5d005872727L,
29229         0xbe5d95c219c4d016L },
29230       { 0x921d5cb19c2492eeL,0x42192dc1404d6fb3L,0x4c84dcd132f988d3L,
29231         0xde26d61fa17b8e85L } },
29232     /* 60 << 84 */
29233     { { 0xc466dcb6137c7408L,0x9a38d7b636a266daL,0x7ef5cb0683bebf1bL,
29234         0xe5cdcbbf0fd014e3L },
29235       { 0x30aa376df65965a0L,0x60fe88c2ebb3e95eL,0x33fd0b6166ee6f20L,
29236         0x8827dcdb3f41f0a0L } },
29237     /* 61 << 84 */
29238     { { 0xbf8a9d240c56c690L,0x40265dadddb7641dL,0x522b05bf3a6b662bL,
29239         0x466d1dfeb1478c9bL },
29240       { 0xaa6169621484469bL,0x0db6054902df8f9fL,0xc37bca023cb8bf51L,
29241         0x5effe34621371ce8L } },
29242     /* 62 << 84 */
29243     { { 0xe8f65264ff112c32L,0x8a9c736d7b971fb2L,0xa4f194707b75080dL,
29244         0xfc3f2c5a8839c59bL },
29245       { 0x1d6c777e5aeb49c2L,0xf3db034dda1addfeL,0xd76fee5a5535affcL,
29246         0x0853ac70b92251fdL } },
29247     /* 63 << 84 */
29248     { { 0x37e3d5948b2a29d5L,0x28f1f4574de00ddbL,0x8083c1b5f42c328bL,
29249         0xd8ef1d8fe493c73bL },
29250       { 0x96fb626041dc61bdL,0xf74e8a9d27ee2f8aL,0x7c605a802c946a5dL,
29251         0xeed48d653839ccfdL } },
29252     /* 64 << 84 */
29253     { { 0x9894344f3a29467aL,0xde81e949c51eba6dL,0xdaea066ba5e5c2f2L,
29254         0x3fc8a61408c8c7b3L },
29255       { 0x7adff88f06d0de9fL,0xbbc11cf53b75ce0aL,0x9fbb7accfbbc87d5L,
29256         0xa1458e267badfde2L } },
29257     /* 0 << 91 */
29258     { { 0x00, 0x00, 0x00, 0x00 },
29259       { 0x00, 0x00, 0x00, 0x00 } },
29260     /* 1 << 91 */
29261     { { 0x1cb43668e039c256L,0x5f26fb8b7c17fd5dL,0xeee426af79aa062bL,
29262         0x072002d0d78fbf04L },
29263       { 0x4c9ca237e84fb7e3L,0xb401d8a10c82133dL,0xaaa525926d7e4181L,
29264         0xe943083373dbb152L } },
29265     /* 2 << 91 */
29266     { { 0xf92dda31be24319aL,0x03f7d28be095a8e7L,0xa52fe84098782185L,
29267         0x276ddafe29c24dbcL },
29268       { 0x80cd54961d7a64ebL,0xe43608897f1dbe42L,0x2f81a8778438d2d5L,
29269         0x7e4d52a885169036L } },
29270     /* 3 << 91 */
29271     { { 0x19e3d5b11d59715dL,0xc7eaa762d788983eL,0xe5a730b0abf1f248L,
29272         0xfbab8084fae3fd83L },
29273       { 0x65e50d2153765b2fL,0xbdd4e083fa127f3dL,0x9cf3c074397b1b10L,
29274         0x59f8090cb1b59fd3L } },
29275     /* 4 << 91 */
29276     { { 0x7b15fd9d615faa8fL,0x8fa1eb40968554edL,0x7bb4447e7aa44882L,
29277         0x2bb2d0d1029fff32L },
29278       { 0x075e2a646caa6d2fL,0x8eb879de22e7351bL,0xbcd5624e9a506c62L,
29279         0x218eaef0a87e24dcL } },
29280     /* 5 << 91 */
29281     { { 0x37e5684744ddfa35L,0x9ccfc5c5dab3f747L,0x9ac1df3f1ee96cf4L,
29282         0x0c0571a13b480b8fL },
29283       { 0x2fbeb3d54b3a7b3cL,0x35c036695dcdbb99L,0x52a0f5dcb2415b3aL,
29284         0xd57759b44413ed9aL } },
29285     /* 6 << 91 */
29286     { { 0x1fe647d83d30a2c5L,0x0857f77ef78a81dcL,0x11d5a334131a4a9bL,
29287         0xc0a94af929d393f5L },
29288       { 0xbc3a5c0bdaa6ec1aL,0xba9fe49388d2d7edL,0xbb4335b4bb614797L,
29289         0x991c4d6872f83533L } },
29290     /* 7 << 91 */
29291     { { 0x53258c28d2f01cb3L,0x93d6eaa3d75db0b1L,0x419a2b0de87d0db4L,
29292         0xa1e48f03d8fe8493L },
29293       { 0xf747faf6c508b23aL,0xf137571a35d53549L,0x9f5e58e2fcf9b838L,
29294         0xc7186ceea7fd3cf5L } },
29295     /* 8 << 91 */
29296     { { 0x77b868cee978a1d3L,0xe3a68b337ab92d04L,0x5102979487a5b862L,
29297         0x5f0606c33a61d41dL },
29298       { 0x2814be276f9326f1L,0x2f521c14c6fe3c2eL,0x17464d7dacdf7351L,
29299         0x10f5f9d3777f7e44L } },
29300     /* 9 << 91 */
29301     { { 0xce8e616b269fb37dL,0xaaf738047de62de5L,0xaba111754fdd4153L,
29302         0x515759ba3770b49bL },
29303       { 0x8b09ebf8aa423a61L,0x592245a1cd41fb92L,0x1cba8ec19b4c8936L,
29304         0xa87e91e3af36710eL } },
29305     /* 10 << 91 */
29306     { { 0x1fd84ce43d34a2e3L,0xee3759ceb43b5d61L,0x895bc78c619186c7L,
29307         0xf19c3809cbb9725aL },
29308       { 0xc0be21aade744b1fL,0xa7d222b060f8056bL,0x74be6157b23efe11L,
29309         0x6fab2b4f0cd68253L } },
29310     /* 11 << 91 */
29311     { { 0xad33ea5f4bf1d725L,0x9c1d8ee24f6c950fL,0x544ee78aa377af06L,
29312         0x54f489bb94a113e1L },
29313       { 0x8f11d634992fb7e8L,0x0169a7aaa2a44347L,0x1d49d4af95020e00L,
29314         0x95945722e08e120bL } },
29315     /* 12 << 91 */
29316     { { 0xb6e33878a4d32282L,0xe36e029d48020ae7L,0xe05847fb37a9b750L,
29317         0xf876812cb29e3819L },
29318       { 0x84ad138ed23a17f0L,0x6d7b4480f0b3950eL,0xdfa8aef42fd67ae0L,
29319         0x8d3eea2452333af6L } },
29320     /* 13 << 91 */
29321     { { 0x0d052075b15d5accL,0xc6d9c79fbd815bc4L,0x8dcafd88dfa36cf2L,
29322         0x908ccbe238aa9070L },
29323       { 0x638722c4ba35afceL,0x5a3da8b0fd6abf0bL,0x2dce252cc9c335c1L,
29324         0x84e7f0de65aa799bL } },
29325     /* 14 << 91 */
29326     { { 0x2101a522b99a72cbL,0x06de6e6787618016L,0x5ff8c7cde6f3653eL,
29327         0x0a821ab5c7a6754aL },
29328       { 0x7e3fa52b7cb0b5a2L,0xa7fb121cc9048790L,0x1a72502006ce053aL,
29329         0xb490a31f04e929b0L } },
29330     /* 15 << 91 */
29331     { { 0xe17be47d62dd61adL,0x781a961c6be01371L,0x1063bfd3dae3cbbaL,
29332         0x356474067f73c9baL },
29333       { 0xf50e957b2736a129L,0xa6313702ed13f256L,0x9436ee653a19fcc5L,
29334         0xcf2bdb29e7a4c8b6L } },
29335     /* 16 << 91 */
29336     { { 0xb06b1244c5f95cd8L,0xda8c8af0f4ab95f4L,0x1bae59c2b9e5836dL,
29337         0x07d51e7e3acffffcL },
29338       { 0x01e15e6ac2ccbcdaL,0x3bc1923f8528c3e0L,0x43324577a49fead4L,
29339         0x61a1b8842aa7a711L } },
29340     /* 17 << 91 */
29341     { { 0xf9a86e08700230efL,0x0af585a1bd19adf8L,0x7645f361f55ad8f2L,
29342         0x6e67622346c3614cL },
29343       { 0x23cb257c4e774d3fL,0x82a38513ac102d1bL,0x9bcddd887b126aa5L,
29344         0xe716998beefd3ee4L } },
29345     /* 18 << 91 */
29346     { { 0x4239d571fb167583L,0xdd011c78d16c8f8aL,0x271c289569a27519L,
29347         0x9ce0a3b7d2d64b6aL },
29348       { 0x8c977289d5ec6738L,0xa3b49f9a8840ef6bL,0x808c14c99a453419L,
29349         0x5c00295b0cf0a2d5L } },
29350     /* 19 << 91 */
29351     { { 0x524414fb1d4bcc76L,0xb07691d2459a88f1L,0x77f43263f70d110fL,
29352         0x64ada5e0b7abf9f3L },
29353       { 0xafd0f94e5b544cf5L,0xb4a13a15fd2713feL,0xb99b7d6e250c74f4L,
29354         0x097f2f7320324e45L } },
29355     /* 20 << 91 */
29356     { { 0x994b37d8affa8208L,0xc3c31b0bdc29aafcL,0x3da746517a3a607fL,
29357         0xd8e1b8c1fe6955d6L },
29358       { 0x716e1815c8418682L,0x541d487f7dc91d97L,0x48a04669c6996982L,
29359         0xf39cab1583a6502eL } },
29360     /* 21 << 91 */
29361     { { 0x025801a0e68db055L,0xf3569758ba3338d5L,0xb0c8c0aaee2afa84L,
29362         0x4f6985d3fb6562d1L },
29363       { 0x351f1f15132ed17aL,0x510ed0b4c04365feL,0xa3f98138e5b1f066L,
29364         0xbc9d95d632df03dcL } },
29365     /* 22 << 91 */
29366     { { 0xa83ccf6e19abd09eL,0x0b4097c14ff17edbL,0x58a5c478d64a06ceL,
29367         0x2ddcc3fd544a58fdL },
29368       { 0xd449503d9e8153b8L,0x3324fd027774179bL,0xaf5d47c8dbd9120cL,
29369         0xeb86016234fa94dbL } },
29370     /* 23 << 91 */
29371     { { 0x5817bdd1972f07f4L,0xe5579e2ed27bbcebL,0x86847a1f5f11e5a6L,
29372         0xb39ed2557c3cf048L },
29373       { 0xe1076417a2f62e55L,0x6b9ab38f1bcf82a2L,0x4bb7c3197aeb29f9L,
29374         0xf6d17da317227a46L } },
29375     /* 24 << 91 */
29376     { { 0xab53ddbd0f968c00L,0xa03da7ec000c880bL,0x7b2396246a9ad24dL,
29377         0x612c040101ec60d0L },
29378       { 0x70d10493109f5df1L,0xfbda403080af7550L,0x30b93f95c6b9a9b3L,
29379         0x0c74ec71007d9418L } },
29380     /* 25 << 91 */
29381     { { 0x941755646edb951fL,0x5f4a9d787f22c282L,0xb7870895b38d1196L,
29382         0xbc593df3a228ce7cL },
29383       { 0xc78c5bd46af3641aL,0x7802200b3d9b3dccL,0x0dc73f328be33304L,
29384         0x847ed87d61ffb79aL } },
29385     /* 26 << 91 */
29386     { { 0xf85c974e6d671192L,0x1e14100ade16f60fL,0x45cb0d5a95c38797L,
29387         0x18923bba9b022da4L },
29388       { 0xef2be899bbe7e86eL,0x4a1510ee216067bfL,0xd98c815484d5ce3eL,
29389         0x1af777f0f92a2b90L } },
29390     /* 27 << 91 */
29391     { { 0x9fbcb4004ef65724L,0x3e04a4c93c0ca6feL,0xfb3e2cb555002994L,
29392         0x1f3a93c55363ecabL },
29393       { 0x1fe00efe3923555bL,0x744bedd91e1751eaL,0x3fb2db596ab69357L,
29394         0x8dbd7365f5e6618bL } },
29395     /* 28 << 91 */
29396     { { 0x99d53099df1ea40eL,0xb3f24a0b57d61e64L,0xd088a198596eb812L,
29397         0x22c8361b5762940bL },
29398       { 0x66f01f97f9c0d95cL,0x884611728e43cdaeL,0x11599a7fb72b15c3L,
29399         0x135a7536420d95ccL } },
29400     /* 29 << 91 */
29401     { { 0x2dcdf0f75f7ae2f6L,0x15fc6e1dd7fa6da2L,0x81ca829ad1d441b6L,
29402         0x84c10cf804a106b6L },
29403       { 0xa9b26c95a73fbbd0L,0x7f24e0cb4d8f6ee8L,0x48b459371e25a043L,
29404         0xf8a74fca036f3dfeL } },
29405     /* 30 << 91 */
29406     { { 0x1ed46585c9f84296L,0x7fbaa8fb3bc278b0L,0xa8e96cd46c4fcbd0L,
29407         0x940a120273b60a5fL },
29408       { 0x34aae12055a4aec8L,0x550e9a74dbd742f0L,0x794456d7228c68abL,
29409         0x492f8868a4e25ec6L } },
29410     /* 31 << 91 */
29411     { { 0x682915adb2d8f398L,0xf13b51cc5b84c953L,0xcda90ab85bb917d6L,
29412         0x4b6155604ea3dee1L },
29413       { 0x578b4e850a52c1c8L,0xeab1a69520b75fc4L,0x60c14f3caa0bb3c6L,
29414         0x220f448ab8216094L } },
29415     /* 32 << 91 */
29416     { { 0x4fe7ee31b0e63d34L,0xf4600572a9e54fabL,0xc0493334d5e7b5a4L,
29417         0x8589fb9206d54831L },
29418       { 0xaa70f5cc6583553aL,0x0879094ae25649e5L,0xcc90450710044652L,
29419         0xebb0696d02541c4fL } },
29420     /* 33 << 91 */
29421     { { 0x5a171fdeb9718710L,0x38f1bed8f374a9f5L,0xc8c582e1ba39bdc1L,
29422         0xfc457b0a908cc0ceL },
29423       { 0x9a187fd4883841e2L,0x8ec25b3938725381L,0x2553ed0596f84395L,
29424         0x095c76616f6c6897L } },
29425     /* 34 << 91 */
29426     { { 0x917ac85c4bdc5610L,0xb2885fe4179eb301L,0x5fc655478b78bdccL,
29427         0x4a9fc893e59e4699L },
29428       { 0xbb7ff0cd3ce299afL,0x195be9b3adf38b20L,0x6a929c87d38ddb8fL,
29429         0x55fcc99cb21a51b9L } },
29430     /* 35 << 91 */
29431     { { 0x2b695b4c721a4593L,0xed1e9a15768eaac2L,0xfb63d71c7489f914L,
29432         0xf98ba31c78118910L },
29433       { 0x802913739b128eb4L,0x7801214ed448af4aL,0xdbd2e22b55418dd3L,
29434         0xeffb3c0dd3998242L } },
29435     /* 36 << 91 */
29436     { { 0xdfa6077cc7bf3827L,0xf2165bcb47f8238fL,0xfe37cf688564d554L,
29437         0xe5f825c40a81fb98L },
29438       { 0x43cc4f67ffed4d6fL,0xbc609578b50a34b0L,0x8aa8fcf95041faf1L,
29439         0x5659f053651773b6L } },
29440     /* 37 << 91 */
29441     { { 0xe87582c36044d63bL,0xa60894090cdb0ca0L,0x8c993e0fbfb2bcf6L,
29442         0xfc64a71945985cfcL },
29443       { 0x15c4da8083dbedbaL,0x804ae1122be67df7L,0xda4c9658a23defdeL,
29444         0x12002ddd5156e0d3L } },
29445     /* 38 << 91 */
29446     { { 0xe68eae895dd21b96L,0x8b99f28bcf44624dL,0x0ae008081ec8897aL,
29447         0xdd0a93036712f76eL },
29448       { 0x962375224e233de4L,0x192445b12b36a8a5L,0xabf9ff74023993d9L,
29449         0x21f37bf42aad4a8fL } },
29450     /* 39 << 91 */
29451     { { 0x340a4349f8bd2bbdL,0x1d902cd94868195dL,0x3d27bbf1e5fdb6f1L,
29452         0x7a5ab088124f9f1cL },
29453       { 0xc466ab06f7a09e03L,0x2f8a197731f2c123L,0xda355dc7041b6657L,
29454         0xcb840d128ece2a7cL } },
29455     /* 40 << 91 */
29456     { { 0xb600ad9f7db32675L,0x78fea13307a06f1bL,0x5d032269b31f6094L,
29457         0x07753ef583ec37aaL },
29458       { 0x03485aed9c0bea78L,0x41bb3989bc3f4524L,0x09403761697f726dL,
29459         0x6109beb3df394820L } },
29460     /* 41 << 91 */
29461     { { 0x804111ea3b6d1145L,0xb6271ea9a8582654L,0x619615e624e66562L,
29462         0xa2554945d7b6ad9cL },
29463       { 0xd9c4985e99bfe35fL,0x9770ccc07b51cdf6L,0x7c32701392881832L,
29464         0x8777d45f286b26d1L } },
29465     /* 42 << 91 */
29466     { { 0x9bbeda22d847999dL,0x03aa33b6c3525d32L,0x4b7b96d428a959a1L,
29467         0xbb3786e531e5d234L },
29468       { 0xaeb5d3ce6961f247L,0x20aa85af02f93d3fL,0x9cd1ad3dd7a7ae4fL,
29469         0xbf6688f0781adaa8L } },
29470     /* 43 << 91 */
29471     { { 0xb1b40e867469ceadL,0x1904c524309fca48L,0x9b7312af4b54bbc7L,
29472         0xbe24bf8f593affa2L },
29473       { 0xbe5e0790bd98764bL,0xa0f45f17a26e299eL,0x4af0d2c26b8fe4c7L,
29474         0xef170db18ae8a3e6L } },
29475     /* 44 << 91 */
29476     { { 0x0e8d61a029e0ccc1L,0xcd53e87e60ad36caL,0x328c6623c8173822L,
29477         0x7ee1767da496be55L },
29478       { 0x89f13259648945afL,0x9e45a5fd25c8009cL,0xaf2febd91f61ab8cL,
29479         0x43f6bc868a275385L } },
29480     /* 45 << 91 */
29481     { { 0x87792348f2142e79L,0x17d89259c6e6238aL,0x7536d2f64a839d9bL,
29482         0x1f428fce76a1fbdcL },
29483       { 0x1c1096010db06dfeL,0xbfc16bc150a3a3ccL,0xf9cbd9ec9b30f41bL,
29484         0x5b5da0d600138cceL } },
29485     /* 46 << 91 */
29486     { { 0xec1d0a4856ef96a7L,0xb47eb848982bf842L,0x66deae32ec3f700dL,
29487         0x4e43c42caa1181e0L },
29488       { 0xa1d72a31d1a4aa2aL,0x440d4668c004f3ceL,0x0d6a2d3b45fe8a7aL,
29489         0x820e52e2fb128365L } },
29490     /* 47 << 91 */
29491     { { 0x29ac5fcf25e51b09L,0x180cd2bf2023d159L,0xa9892171a1ebf90eL,
29492         0xf97c4c877c132181L },
29493       { 0x9f1dc724c03dbb7eL,0xae043765018cbbe4L,0xfb0b2a360767d153L,
29494         0xa8e2f4d6249cbaebL } },
29495     /* 48 << 91 */
29496     { { 0x172a5247d95ea168L,0x1758fada2970764aL,0xac803a511d978169L,
29497         0x299cfe2ede77e01bL },
29498       { 0x652a1e17b0a98927L,0x2e26e1d120014495L,0x7ae0af9f7175b56aL,
29499         0xc2e22a80d64b9f95L } },
29500     /* 49 << 91 */
29501     { { 0x4d0ff9fbd90a060aL,0x496a27dbbaf38085L,0x32305401da776bcfL,
29502         0xb8cdcef6725f209eL },
29503       { 0x61ba0f37436a0bbaL,0x263fa10876860049L,0x92beb98eda3542cfL,
29504         0xa2d4d14ad5849538L } },
29505     /* 50 << 91 */
29506     { { 0x989b9d6812e9a1bcL,0x61d9075c5f6e3268L,0x352c6aa999ace638L,
29507         0xde4e4a55920f43ffL },
29508       { 0xe5e4144ad673c017L,0x667417ae6f6e05eaL,0x613416aedcd1bd56L,
29509         0x5eb3620186693711L } },
29510     /* 51 << 91 */
29511     { { 0x2d7bc5043a1aa914L,0x175a129976dc5975L,0xe900e0f23fc8125cL,
29512         0x569ef68c11198875L },
29513       { 0x9012db6363a113b4L,0xe3bd3f5698835766L,0xa5c94a5276412deaL,
29514         0xad9e2a09aa735e5cL } },
29515     /* 52 << 91 */
29516     { { 0x405a984c508b65e9L,0xbde4a1d16df1a0d1L,0x1a9433a1dfba80daL,
29517         0xe9192ff99440ad2eL },
29518       { 0x9f6496965099fe92L,0x25ddb65c0b27a54aL,0x178279ddc590da61L,
29519         0x5479a999fbde681aL } },
29520     /* 53 << 91 */
29521     { { 0xd0e84e05013fe162L,0xbe11dc92632d471bL,0xdf0b0c45fc0e089fL,
29522         0x04fb15b04c144025L },
29523       { 0xa61d5fc213c99927L,0xa033e9e03de2eb35L,0xf8185d5cb8dacbb4L,
29524         0x9a88e2658644549dL } },
29525     /* 54 << 91 */
29526     { { 0xf717af6254671ff6L,0x4bd4241b5fa58603L,0x06fba40be67773c0L,
29527         0xc1d933d26a2847e9L },
29528       { 0xf4f5acf3689e2c70L,0x92aab0e746bafd31L,0x798d76aa3473f6e5L,
29529         0xcc6641db93141934L } },
29530     /* 55 << 91 */
29531     { { 0xcae27757d31e535eL,0x04cc43b687c2ee11L,0x8d1f96752e029ffaL,
29532         0xc2150672e4cc7a2cL },
29533       { 0x3b03c1e08d68b013L,0xa9d6816fedf298f3L,0x1bfbb529a2804464L,
29534         0x95a52fae5db22125L } },
29535     /* 56 << 91 */
29536     { { 0x55b321600e1cb64eL,0x004828f67e7fc9feL,0x13394b821bb0fb93L,
29537         0xb6293a2d35f1a920L },
29538       { 0xde35ef21d145d2d9L,0xbe6225b3bb8fa603L,0x00fc8f6b32cf252dL,
29539         0xa28e52e6117cf8c2L } },
29540     /* 57 << 91 */
29541     { { 0x9d1dc89b4c371e6dL,0xcebe067536ef0f28L,0x5de05d09a4292f81L,
29542         0xa8303593353e3083L },
29543       { 0xa1715b0a7e37a9bbL,0x8c56f61e2b8faec3L,0x5250743133c9b102L,
29544         0x0130cefca44431f0L } },
29545     /* 58 << 91 */
29546     { { 0x56039fa0bd865cfbL,0x4b03e578bc5f1dd7L,0x40edf2e4babe7224L,
29547         0xc752496d3a1988f6L },
29548       { 0xd1572d3b564beb6bL,0x0db1d11039a1c608L,0x568d193416f60126L,
29549         0x05ae9668f354af33L } },
29550     /* 59 << 91 */
29551     { { 0x19de6d37c92544f2L,0xcc084353a35837d5L,0xcbb6869c1a514eceL,
29552         0xb633e7282e1d1066L },
29553       { 0xf15dd69f936c581cL,0x96e7b8ce7439c4f9L,0x5e676f482e448a5bL,
29554         0xb2ca7d5bfd916bbbL } },
29555     /* 60 << 91 */
29556     { { 0xd55a2541f5024025L,0x47bc5769e4c2d937L,0x7d31b92a0362189fL,
29557         0x83f3086eef7816f9L },
29558       { 0xf9f46d94b587579aL,0xec2d22d830e76c5fL,0x27d57461b000ffcfL,
29559         0xbb7e65f9364ffc2cL } },
29560     /* 61 << 91 */
29561     { { 0x7c7c94776652a220L,0x61618f89d696c981L,0x5021701d89effff3L,
29562         0xf2c8ff8e7c314163L },
29563       { 0x2da413ad8efb4d3eL,0x937b5adfce176d95L,0x22867d342a67d51cL,
29564         0x262b9b1018eb3ac9L } },
29565     /* 62 << 91 */
29566     { { 0x4e314fe4c43ff28bL,0x764766276a664e7aL,0x3e90e40bb7a565c2L,
29567         0x8588993ac1acf831L },
29568       { 0xd7b501d68f938829L,0x996627ee3edd7d4cL,0x37d44a6290cd34c7L,
29569         0xa8327499f3833e8dL } },
29570     /* 63 << 91 */
29571     { { 0x2e18917d4bf50353L,0x85dd726b556765fbL,0x54fe65d693d5ab66L,
29572         0x3ddbaced915c25feL },
29573       { 0xa799d9a412f22e85L,0xe2a248676d06f6bcL,0xf4f1ee5643ca1637L,
29574         0xfda2828b61ece30aL } },
29575     /* 64 << 91 */
29576     { { 0x758c1a3ea2dee7a6L,0xdcde2f3c734b2284L,0xaba445d24eaba6adL,
29577         0x35aaf66876cee0a7L },
29578       { 0x7e0b04a9e5aa049aL,0xe74083ad91103e84L,0xbeb183ce40afecc3L,
29579         0x6b89de9fea043f7aL } },
29580     /* 0 << 98 */
29581     { { 0x00, 0x00, 0x00, 0x00 },
29582       { 0x00, 0x00, 0x00, 0x00 } },
29583     /* 1 << 98 */
29584     { { 0x0e299d23fe67ba66L,0x9145076093cf2f34L,0xf45b5ea997fcf913L,
29585         0x5be008438bd7dddaL },
29586       { 0x358c3e05d53ff04dL,0xbf7ccdc35de91ef7L,0xad684dbfb69ec1a0L,
29587         0x367e7cf2801fd997L } },
29588     /* 2 << 98 */
29589     { { 0x0ca1f3b7b0dc8595L,0x27de46089f1d9f2eL,0x1af3bf39badd82a7L,
29590         0x79356a7965862448L },
29591       { 0xc0602345f5f9a052L,0x1a8b0f89139a42f9L,0xb53eee42844d40fcL,
29592         0x93b0bfe54e5b6368L } },
29593     /* 3 << 98 */
29594     { { 0x5434dd02c024789cL,0x90dca9ea41b57bfcL,0x8aa898e2243398dfL,
29595         0xf607c834894a94bbL },
29596       { 0xbb07be97c2c99b76L,0x6576ba6718c29302L,0x3d79efcce703a88cL,
29597         0xf259ced7b6a0d106L } },
29598     /* 4 << 98 */
29599     { { 0x0f893a5dc8de610bL,0xe8c515fb67e223ceL,0x7774bfa64ead6dc5L,
29600         0x89d20f95925c728fL },
29601       { 0x7a1e0966098583ceL,0xa2eedb9493f2a7d7L,0x1b2820974c304d4aL,
29602         0x0842e3dac077282dL } },
29603     /* 5 << 98 */
29604     { { 0xe4d972a33b9e2d7bL,0x7cc60b27c48218ffL,0x8fc7083884149d91L,
29605         0x5c04346f2f461eccL },
29606       { 0xebe9fdf2614650a9L,0x5e35b537c1f666acL,0x645613d188babc83L,
29607         0x88cace3ac5e1c93eL } },
29608     /* 6 << 98 */
29609     { { 0x209ca3753de92e23L,0xccb03cc85fbbb6e3L,0xccb90f03d7b1487eL,
29610         0xfa9c2a38c710941fL },
29611       { 0x756c38236724ceedL,0x3a902258192d0323L,0xb150e519ea5e038eL,
29612         0xdcba2865c7427591L } },
29613     /* 7 << 98 */
29614     { { 0xe549237f78890732L,0xc443bef953fcb4d9L,0x9884d8a6eb3480d6L,
29615         0x8a35b6a13048b186L },
29616       { 0xb4e4471665e9a90aL,0x45bf380d653006c0L,0x8f3f820d4fe9ae3bL,
29617         0x244a35a0979a3b71L } },
29618     /* 8 << 98 */
29619     { { 0xa1010e9d74cd06ffL,0x9c17c7dfaca3eeacL,0x74c86cd38063aa2bL,
29620         0x8595c4b3734614ffL },
29621       { 0xa3de00ca990f62ccL,0xd9bed213ca0c3be5L,0x7886078adf8ce9f5L,
29622         0xddb27ce35cd44444L } },
29623     /* 9 << 98 */
29624     { { 0xed374a6658926dddL,0x138b2d49908015b8L,0x886c6579de1f7ab8L,
29625         0x888b9aa0c3020b7aL },
29626       { 0xd3ec034e3a96e355L,0xba65b0b8f30fbe9aL,0x064c8e50ff21367aL,
29627         0x1f508ea40b04b46eL } },
29628     /* 10 << 98 */
29629     { { 0x98561a49747c866cL,0xbbb1e5fe0518a062L,0x20ff4e8becdc3608L,
29630         0x7f55cded20184027L },
29631       { 0x8d73ec95f38c85f0L,0x5b589fdf8bc3b8c3L,0xbe95dd980f12b66fL,
29632         0xf5bd1a090e338e01L } },
29633     /* 11 << 98 */
29634     { { 0x65163ae55e915918L,0x6158d6d986f8a46bL,0x8466b538eeebf99cL,
29635         0xca8761f6bca477efL },
29636       { 0xaf3449c29ebbc601L,0xef3b0f41e0c3ae2fL,0xaa6c577d5de63752L,
29637         0xe916660164682a51L } },
29638     /* 12 << 98 */
29639     { { 0x5a3097befc15aa1eL,0x40d12548b54b0745L,0x5bad4706519a5f12L,
29640         0xed03f717a439dee6L },
29641       { 0x0794bb6c4a02c499L,0xf725083dcffe71d2L,0x2cad75190f3adcafL,
29642         0x7f68ea1c43729310L } },
29643     /* 13 << 98 */
29644     { { 0xe747c8c7b7ffd977L,0xec104c3580761a22L,0x8395ebaf5a3ffb83L,
29645         0xfb3261f4e4b63db7L },
29646       { 0x53544960d883e544L,0x13520d708cc2eeb8L,0x08f6337bd3d65f99L,
29647         0x83997db2781cf95bL } },
29648     /* 14 << 98 */
29649     { { 0xce6ff1060dbd2c01L,0x4f8eea6b1f9ce934L,0x546f7c4b0e993921L,
29650         0x6236a3245e753fc7L },
29651       { 0x65a41f84a16022e9L,0x0c18d87843d1dbb2L,0x73c556402d4cef9cL,
29652         0xa042810870444c74L } },
29653     /* 15 << 98 */
29654     { { 0x68e4f15e9afdfb3cL,0x49a561435bdfb6dfL,0xa9bc1bd45f823d97L,
29655         0xbceb5970ea111c2aL },
29656       { 0x366b455fb269bbc4L,0x7cd85e1ee9bc5d62L,0xc743c41c4f18b086L,
29657         0xa4b4099095294fb9L } },
29658     /* 16 << 98 */
29659     { { 0x9c7c581d26ee8382L,0xcf17dcc5359d638eL,0xee8273abb728ae3dL,
29660         0x1d112926f821f047L },
29661       { 0x1149847750491a74L,0x687fa761fde0dfb9L,0x2c2580227ea435abL,
29662         0x6b8bdb9491ce7e3fL } },
29663     /* 17 << 98 */
29664     { { 0x4c5b5dc93bf834aaL,0x043718194f6c7e4bL,0xc284e00a3736bcadL,
29665         0x0d88111821ae8f8dL },
29666       { 0xf9cf0f82f48c8e33L,0xa11fd075a1bf40dbL,0xdceab0dedc2733e5L,
29667         0xc560a8b58e986bd7L } },
29668     /* 18 << 98 */
29669     { { 0x48dd1fe23929d097L,0x3885b29092f188f1L,0x0f2ae613da6fcdacL,
29670         0x9054303eb662a46cL },
29671       { 0xb6871e440738042aL,0x98e6a977bdaf6449L,0xd8bc0650d1c9df1bL,
29672         0xef3d645136e098f9L } },
29673     /* 19 << 98 */
29674     { { 0x03fbae82b6d72d28L,0x77ca9db1f5d84080L,0x8a112cffa58efc1cL,
29675         0x518d761cc564cb4aL },
29676       { 0x69b5740ef0d1b5ceL,0x717039cce9eb1785L,0x3fe29f9022f53382L,
29677         0x8e54ba566bc7c95cL } },
29678     /* 20 << 98 */
29679     { { 0x9c806d8af7f91d0fL,0x3b61b0f1a82a5728L,0x4640032d94d76754L,
29680         0x273eb5de47d834c6L },
29681       { 0x2988abf77b4e4d53L,0xb7ce66bfde401777L,0x9fba6b32715071b3L,
29682         0x82413c24ad3a1a98L } },
29683     /* 21 << 98 */
29684     { { 0x5b7fc8c4e0e8ad93L,0xb5679aee5fab868dL,0xb1f9d2fa2b3946f3L,
29685         0x458897dc5685b50aL },
29686       { 0x1e98c93089d0caf3L,0x39564c5f78642e92L,0x1b77729a0dbdaf18L,
29687         0xf9170722579e82e6L } },
29688     /* 22 << 98 */
29689     { { 0x680c0317e4515fa5L,0xf85cff84fb0c790fL,0xc7a82aab6d2e0765L,
29690         0x7446bca935c82b32L },
29691       { 0x5de607aa6d63184fL,0x7c1a46a8262803a6L,0xd218313daebe8035L,
29692         0x92113ffdc73c51f8L } },
29693     /* 23 << 98 */
29694     { { 0x4b38e08312e7e46cL,0x69d0a37a56126bd5L,0xfb3f324b73c07e04L,
29695         0xa0c22f678fda7267L },
29696       { 0x8f2c00514d2c7d8fL,0xbc45ced3cbe2cae5L,0xe1c6cf07a8f0f277L,
29697         0xbc3923121eb99a98L } },
29698     /* 24 << 98 */
29699     { { 0x75537b7e3cc8ac85L,0x8d725f57dd02753bL,0xfd05ff64b737df2fL,
29700         0x55fe8712f6d2531dL },
29701       { 0x57ce04a96ab6b01cL,0x69a02a897cd93724L,0x4f82ac35cf86699bL,
29702         0x8242d3ad9cb4b232L } },
29703     /* 25 << 98 */
29704     { { 0x713d0f65d62105e5L,0xbb222bfa2d29be61L,0xf2f9a79e6cfbef09L,
29705         0xfc24d8d3d5d6782fL },
29706       { 0x5db77085d4129967L,0xdb81c3ccdc3c2a43L,0x9d655fc005d8d9a3L,
29707         0x3f5d057a54298026L } },
29708     /* 26 << 98 */
29709     { { 0x1157f56d88c54694L,0xb26baba59b09573eL,0x2cab03b022adffd1L,
29710         0x60a412c8dd69f383L },
29711       { 0xed76e98b54b25039L,0xd4ee67d3687e714dL,0x877396487b00b594L,
29712         0xce419775c9ef709bL } },
29713     /* 27 << 98 */
29714     { { 0x40f76f851c203a40L,0x30d352d6eafd8f91L,0xaf196d3d95578dd2L,
29715         0xea4bb3d777cc3f3dL },
29716       { 0x42a5bd03b98e782bL,0xac958c400624920dL,0xb838134cfc56fcc8L,
29717         0x86ec4ccf89572e5eL } },
29718     /* 28 << 98 */
29719     { { 0x69c435269be47be0L,0x323b7dd8cb28fea1L,0xfa5538ba3a6c67e5L,
29720         0xef921d701d378e46L },
29721       { 0xf92961fc3c4b880eL,0x3f6f914e98940a67L,0xa990eb0afef0ff39L,
29722         0xa6c2920ff0eeff9cL } },
29723     /* 29 << 98 */
29724     { { 0xca80416651b8d9a3L,0x42531bc90ffb0db1L,0x72ce4718aa82e7ceL,
29725         0x6e199913df574741L },
29726       { 0xd5f1b13dd5d36946L,0x8255dc65f68f0194L,0xdc9df4cd8710d230L,
29727         0x3453c20f138c1988L } },
29728     /* 30 << 98 */
29729     { { 0x9af98dc089a6ef01L,0x4dbcc3f09857df85L,0x348056015c1ad924L,
29730         0x40448da5d0493046L },
29731       { 0xf629926d4ee343e2L,0x6343f1bd90e8a301L,0xefc9349140815b3fL,
29732         0xf882a423de8f66fbL } },
29733     /* 31 << 98 */
29734     { { 0x3a12d5f4e7db9f57L,0x7dfba38a3c384c27L,0x7a904bfd6fc660b1L,
29735         0xeb6c5db32773b21cL },
29736       { 0xc350ee661cdfe049L,0x9baac0ce44540f29L,0xbc57b6aba5ec6aadL,
29737         0x167ce8c30a7c1baaL } },
29738     /* 32 << 98 */
29739     { { 0xb23a03a553fb2b56L,0x6ce141e74e057f78L,0x796525c389e490d9L,
29740         0x0bc95725a31a7e75L },
29741       { 0x1ec567911220fd06L,0x716e3a3c408b0bd6L,0x31cd6bf7e8ebeba9L,
29742         0xa7326ca6bee6b670L } },
29743     /* 33 << 98 */
29744     { { 0x3d9f851ccd090c43L,0x561e8f13f12c3988L,0x50490b6a904b7be4L,
29745         0x61690ce10410737bL },
29746       { 0x299e9a370f009052L,0x258758f0f026092eL,0x9fa255f3fdfcdc0fL,
29747         0xdbc9fb1fc0e1bcd2L } },
29748     /* 34 << 98 */
29749     { { 0x35f9dd6e24651840L,0xdca45a84a5c59abcL,0x103d396fecca4938L,
29750         0x4532da0ab97b3f29L },
29751       { 0xc4135ea51999a6bfL,0x3aa9505a5e6bf2eeL,0xf77cef063f5be093L,
29752         0x97d1a0f8a943152eL } },
29753     /* 35 << 98 */
29754     { { 0x2cb0ebba2e1c21ddL,0xf41b29fc2c6797c4L,0xc6e17321b300101fL,
29755         0x4422b0e9d0d79a89L },
29756       { 0x49e4901c92f1bfc4L,0x06ab1f8fe1e10ed9L,0x84d35577db2926b8L,
29757         0xca349d39356e8ec2L } },
29758     /* 36 << 98 */
29759     { { 0x70b63d32343bf1a9L,0x8fd3bd2837d1a6b1L,0x0454879c316865b4L,
29760         0xee959ff6c458efa2L },
29761       { 0x0461dcf89706dc3fL,0x737db0e2164e4b2eL,0x092626802f8843c8L,
29762         0x54498bbc7745e6f6L } },
29763     /* 37 << 98 */
29764     { { 0x359473faa29e24afL,0xfcc3c45470aa87a1L,0xfd2c4bf500573aceL,
29765         0xb65b514e28dd1965L },
29766       { 0xe46ae7cf2193e393L,0x60e9a4e1f5444d97L,0xe7594e9600ff38edL,
29767         0x43d84d2f0a0e0f02L } },
29768     /* 38 << 98 */
29769     { { 0x8b6db141ee398a21L,0xb88a56aee3bcc5beL,0x0a1aa52f373460eaL,
29770         0x20da1a56160bb19bL },
29771       { 0xfb54999d65bf0384L,0x71a14d245d5a180eL,0xbc44db7b21737b04L,
29772         0xd84fcb1801dd8e92L } },
29773     /* 39 << 98 */
29774     { { 0x80de937bfa44b479L,0x535054995c98fd4fL,0x1edb12ab28f08727L,
29775         0x4c58b582a5f3ef53L },
29776       { 0xbfb236d88327f246L,0xc3a3bfaa4d7df320L,0xecd96c59b96024f2L,
29777         0xfc293a537f4e0433L } },
29778     /* 40 << 98 */
29779     { { 0x5341352b5acf6e10L,0xc50343fdafe652c3L,0x4af3792d18577a7fL,
29780         0xe1a4c617af16823dL },
29781       { 0x9b26d0cd33425d0aL,0x306399ed9b7bc47fL,0x2a792f33706bb20bL,
29782         0x3121961498111055L } },
29783     /* 41 << 98 */
29784     { { 0x864ec06487f5d28bL,0x11392d91962277fdL,0xb5aa7942bb6aed5fL,
29785         0x080094dc47e799d9L },
29786       { 0x4afa588c208ba19bL,0xd3e7570f8512f284L,0xcbae64e602f5799aL,
29787         0xdeebe7ef514b9492L } },
29788     /* 42 << 98 */
29789     { { 0x30300f98e5c298ffL,0x17f561be3678361fL,0xf52ff31298cb9a16L,
29790         0x6233c3bc5562d490L },
29791       { 0x7bfa15a192e3a2cbL,0x961bcfd1e6365119L,0x3bdd29bf2c8c53b1L,
29792         0x739704df822844baL } },
29793     /* 43 << 98 */
29794     { { 0x7dacfb587e7b754bL,0x23360791a806c9b9L,0xe7eb88c923504452L,
29795         0x2983e996852c1783L },
29796       { 0xdd4ae529958d881dL,0x026bae03262c7b3cL,0x3a6f9193960b52d1L,
29797         0xd0980f9092696cfbL } },
29798     /* 44 << 98 */
29799     { { 0x4c1f428cd5f30851L,0x94dfed272a4f6630L,0x4df53772fc5d48a4L,
29800         0xdd2d5a2f933260ceL },
29801       { 0x574115bdd44cc7a5L,0x4ba6b20dbd12533aL,0x30e93cb8243057c9L,
29802         0x794c486a14de320eL } },
29803     /* 45 << 98 */
29804     { { 0xe925d4cef21496e4L,0xf951d198ec696331L,0x9810e2de3e8d812fL,
29805         0xd0a47259389294abL },
29806       { 0x513ba2b50e3bab66L,0x462caff5abad306fL,0xe2dc6d59af04c49eL,
29807         0x1aeb8750e0b84b0bL } },
29808     /* 46 << 98 */
29809     { { 0xc034f12f2f7d0ca2L,0x6d2e8128e06acf2fL,0x801f4f8321facc2fL,
29810         0xa1170c03f40ef607L },
29811       { 0xfe0a1d4f7805a99cL,0xbde56a36cc26aba5L,0x5b1629d035531f40L,
29812         0xac212c2b9afa6108L } },
29813     /* 47 << 98 */
29814     { { 0x30a06bf315697be5L,0x6f0545dc2c63c7c1L,0x5d8cb8427ccdadafL,
29815         0xd52e379bac7015bbL },
29816       { 0xc4f56147f462c23eL,0xd44a429846bc24b0L,0xbc73d23ae2856d4fL,
29817         0x61cedd8c0832bcdfL } },
29818     /* 48 << 98 */
29819     { { 0x6095355699f241d7L,0xee4adbd7001a349dL,0x0b35bf6aaa89e491L,
29820         0x7f0076f4136f7546L },
29821       { 0xd19a18ba9264da3dL,0x6eb2d2cd62a7a28bL,0xcdba941f8761c971L,
29822         0x1550518ba3be4a5dL } },
29823     /* 49 << 98 */
29824     { { 0xd0e8e2f057d0b70cL,0xeea8612ecd133ba3L,0x814670f044416aecL,
29825         0x424db6c330775061L },
29826       { 0xd96039d116213fd1L,0xc61e7fa518a3478fL,0xa805bdcccb0c5021L,
29827         0xbdd6f3a80cc616ddL } },
29828     /* 50 << 98 */
29829     { { 0x060096675d97f7e2L,0x31db0fc1af0bf4b6L,0x23680ed45491627aL,
29830         0xb99a3c667d741fb1L },
29831       { 0xe9bb5f5536b1ff92L,0x29738577512b388dL,0xdb8a2ce750fcf263L,
29832         0x385346d46c4f7b47L } },
29833     /* 51 << 98 */
29834     { { 0xbe86c5ef31631f9eL,0xbf91da2103a57a29L,0xc3b1f7967b23f821L,
29835         0x0f7d00d2770db354L },
29836       { 0x8ffc6c3bd8fe79daL,0xcc5e8c40d525c996L,0x4640991dcfff632aL,
29837         0x64d97e8c67112528L } },
29838     /* 52 << 98 */
29839     { { 0xc232d97302f1cd1eL,0xce87eacb1dd212a4L,0x6e4c8c73e69802f7L,
29840         0x12ef02901fffddbdL },
29841       { 0x941ec74e1bcea6e2L,0xd0b540243cb92cbbL,0x809fb9d47e8f9d05L,
29842         0x3bf16159f2992aaeL } },
29843     /* 53 << 98 */
29844     { { 0xad40f279f8a7a838L,0x11aea63105615660L,0xbf52e6f1a01f6fa1L,
29845         0xef0469953dc2aec9L },
29846       { 0x785dbec9d8080711L,0xe1aec60a9fdedf76L,0xece797b5fa21c126L,
29847         0xc66e898f05e52732L } },
29848     /* 54 << 98 */
29849     { { 0x39bb69c408811fdbL,0x8bfe1ef82fc7f082L,0xc8e7a393174f4138L,
29850         0xfba8ad1dd58d1f98L },
29851       { 0xbc21d0cebfd2fd5bL,0x0b839a826ee60d61L,0xaacf7658afd22253L,
29852         0xb526bed8aae396b3L } },
29853     /* 55 << 98 */
29854     { { 0xccc1bbc238564464L,0x9e3ff9478c45bc73L,0xcde9bca358188a78L,
29855         0x138b8ee0d73bf8f7L },
29856       { 0x5c7e234c4123c489L,0x66e69368fa643297L,0x0629eeee39a15fa3L,
29857         0x95fab881a9e2a927L } },
29858     /* 56 << 98 */
29859     { { 0xb2497007eafbb1e1L,0xd75c9ce6e75b7a93L,0x3558352defb68d78L,
29860         0xa2f26699223f6396L },
29861       { 0xeb911ecfe469b17aL,0x62545779e72d3ec2L,0x8ea47de782cb113fL,
29862         0xebe4b0864e1fa98dL } },
29863     /* 57 << 98 */
29864     { { 0xec2d5ed78cdfedb1L,0xa535c077fe211a74L,0x9678109b11d244c5L,
29865         0xf17c8bfbbe299a76L },
29866       { 0xb651412efb11fbc4L,0xea0b548294ab3f65L,0xd8dffd950cf78243L,
29867         0x2e719e57ce0361d4L } },
29868     /* 58 << 98 */
29869     { { 0x9007f085304ddc5bL,0x095e8c6d4daba2eaL,0x5a33cdb43f9d28a9L,
29870         0x85b95cd8e2283003L },
29871       { 0xbcd6c819b9744733L,0x29c5f538fc7f5783L,0x6c49b2fad59038e4L,
29872         0x68349cc13bbe1018L } },
29873     /* 59 << 98 */
29874     { { 0xcc490c1d21830ee5L,0x36f9c4eee9bfa297L,0x58fd729448de1a94L,
29875         0xaadb13a84e8f2cdcL },
29876       { 0x515eaaa081313dbaL,0xc76bb468c2152dd8L,0x357f8d75a653dbf8L,
29877         0xe4d8c4d1b14ac143L } },
29878     /* 60 << 98 */
29879     { { 0xbdb8e675b055cb40L,0x898f8e7b977b5167L,0xecc65651b82fb863L,
29880         0x565448146d88f01fL },
29881       { 0xb0928e95263a75a9L,0xcfb6836f1a22fcdaL,0x651d14db3f3bd37cL,
29882         0x1d3837fbb6ad4664L } },
29883     /* 61 << 98 */
29884     { { 0x7c5fb538ff4f94abL,0x7243c7126d7fb8f2L,0xef13d60ca85c5287L,
29885         0x18cfb7c74bb8dd1bL },
29886       { 0x82f9bfe672908219L,0x35c4592b9d5144abL,0x52734f379cf4b42fL,
29887         0x6bac55e78c60ddc4L } },
29888     /* 62 << 98 */
29889     { { 0xb5cd811e94dea0f6L,0x259ecae4e18cc1a3L,0x6a0e836e15e660f8L,
29890         0x6c639ea60e02bff2L },
29891       { 0x8721b8cb7e1026fdL,0x9e73b50b63261942L,0xb8c7097477f01da3L,
29892         0x1839e6a68268f57fL } },
29893     /* 63 << 98 */
29894     { { 0x571b94155150b805L,0x1892389ef92c7097L,0x8d69c18e4a084b95L,
29895         0x7014c512be5b495cL },
29896       { 0x4780db361b07523cL,0x2f6219ce2c1c64faL,0xc38b81b0602c105aL,
29897         0xab4f4f205dc8e360L } },
29898     /* 64 << 98 */
29899     { { 0x20d3c982cf7d62d2L,0x1f36e29d23ba8150L,0x48ae0bf092763f9eL,
29900         0x7a527e6b1d3a7007L },
29901       { 0xb4a89097581a85e3L,0x1f1a520fdc158be5L,0xf98db37d167d726eL,
29902         0x8802786e1113e862L } },
29903     /* 0 << 105 */
29904     { { 0x00, 0x00, 0x00, 0x00 },
29905       { 0x00, 0x00, 0x00, 0x00 } },
29906     /* 1 << 105 */
29907     { { 0xefb2149e36f09ab0L,0x03f163ca4a10bb5bL,0xd029704506e20998L,
29908         0x56f0af001b5a3babL },
29909       { 0x7af4cfec70880e0dL,0x7332a66fbe3d913fL,0x32e6c84a7eceb4bdL,
29910         0xedc4a79a9c228f55L } },
29911     /* 2 << 105 */
29912     { { 0xc37c7dd0c55c4496L,0xa6a9635725bbabd2L,0x5b7e63f2add7f363L,
29913         0x9dce37822e73f1dfL },
29914       { 0xe1e5a16ab2b91f71L,0xe44898235ba0163cL,0xf2759c32f6e515adL,
29915         0xa5e2f1f88615eecfL } },
29916     /* 3 << 105 */
29917     { { 0x74519be7abded551L,0x03d358b8c8b74410L,0x4d00b10b0e10d9a9L,
29918         0x6392b0b128da52b7L },
29919       { 0x6744a2980b75c904L,0xc305b0aea8f7f96cL,0x042e421d182cf932L,
29920         0xf6fc5d509e4636caL } },
29921     /* 4 << 105 */
29922     { { 0x795847c9d64cc78cL,0x6c50621b9b6cb27bL,0x07099bf8df8022abL,
29923         0x48f862ebc04eda1dL },
29924       { 0xd12732ede1603c16L,0x19a80e0f5c9a9450L,0xe2257f54b429b4fcL,
29925         0x66d3b2c645460515L } },
29926     /* 5 << 105 */
29927     { { 0x6ca4f87e822e37beL,0x73f237b4253bda4eL,0xf747f3a241190aebL,
29928         0xf06fa36f804cf284L },
29929       { 0x0a6bbb6efc621c12L,0x5d624b6440b80ec6L,0x4b0724257ba556f3L,
29930         0x7fa0c3543e2d20a8L } },
29931     /* 6 << 105 */
29932     { { 0xe921fa31e3229d41L,0xa929c65294531bd4L,0x84156027a6d38209L,
29933         0xf3d69f736bdb97bdL },
29934       { 0x8906d19a16833631L,0x68a34c2e03d51be3L,0xcb59583b0e511cd8L,
29935         0x99ce6bfdfdc132a8L } },
29936     /* 7 << 105 */
29937     { { 0x3facdaaaffcdb463L,0x658bbc1a34a38b08L,0x12a801f8f1a9078dL,
29938         0x1567bcf96ab855deL },
29939       { 0xe08498e03572359bL,0xcf0353e58659e68bL,0xbb86e9c87d23807cL,
29940         0xbc08728d2198e8a2L } },
29941     /* 8 << 105 */
29942     { { 0x8de2b7bc453cadd6L,0x203900a7bc0bc1f8L,0xbcd86e47a6abd3afL,
29943         0x911cac128502effbL },
29944       { 0x2d550242ec965469L,0x0e9f769229e0017eL,0x633f078f65979885L,
29945         0xfb87d4494cf751efL } },
29946     /* 9 << 105 */
29947     { { 0xe1790e4bfc25419aL,0x364672034bff3cfdL,0xc8db638625b6e83fL,
29948         0x6cc69f236cad6fd2L },
29949       { 0x0219e45a6bc68bb9L,0xe43d79b6297f7334L,0x7d445368465dc97cL,
29950         0x4b9eea322a0b949aL } },
29951     /* 10 << 105 */
29952     { { 0x1b96c6ba6102d021L,0xeaafac782f4461eaL,0xd4b85c41c49f19a8L,
29953         0x275c28e4cf538875L },
29954       { 0x35451a9ddd2e54e0L,0x6991adb50605618bL,0x5b8b4bcd7b36cd24L,
29955         0x372a4f8c56f37216L } },
29956     /* 11 << 105 */
29957     { { 0xc890bd73a6a5da60L,0x6f083da0dc4c9ff0L,0xf4e14d94f0536e57L,
29958         0xf9ee1edaaaec8243L },
29959       { 0x571241ec8bdcf8e7L,0xa5db82710b041e26L,0x9a0b9a99e3fff040L,
29960         0xcaaf21dd7c271202L } },
29961     /* 12 << 105 */
29962     { { 0xb4e2b2e14f0dd2e8L,0xe77e7c4f0a377ac7L,0x69202c3f0d7a2198L,
29963         0xf759b7ff28200eb8L },
29964       { 0xc87526eddcfe314eL,0xeb84c52453d5cf99L,0xb1b52ace515138b6L,
29965         0x5aa7ff8c23fca3f4L } },
29966     /* 13 << 105 */
29967     { { 0xff0b13c3b9791a26L,0x960022dacdd58b16L,0xdbd55c9257aad2deL,
29968         0x3baaaaa3f30fe619L },
29969       { 0x9a4b23460d881efdL,0x506416c046325e2aL,0x91381e76035c18d4L,
29970         0xb3bb68bef27817b0L } },
29971     /* 14 << 105 */
29972     { { 0x15bfb8bf5116f937L,0x7c64a586c1268943L,0x71e25cc38419a2c8L,
29973         0x9fd6b0c48335f463L },
29974       { 0x4bf0ba3ce8ee0e0eL,0x6f6fba60298c21faL,0x57d57b39ae66bee0L,
29975         0x292d513022672544L } },
29976     /* 15 << 105 */
29977     { { 0xf451105dbab093b3L,0x012f59b902839986L,0x8a9158023474a89cL,
29978         0x048c919c2de03e97L },
29979       { 0xc476a2b591071cd5L,0x791ed89a034970a5L,0x89bd9042e1b7994bL,
29980         0x8eaf5179a1057ffdL } },
29981     /* 16 << 105 */
29982     { { 0x6066e2a2d551ee10L,0x87a8f1d8727e09a6L,0x00d08bab2c01148dL,
29983         0x6da8e4f1424f33feL },
29984       { 0x466d17f0cf9a4e71L,0xff5020103bf5cb19L,0xdccf97d8d062ecc0L,
29985         0x80c0d9af81d80ac4L } },
29986     /* 17 << 105 */
29987     { { 0xe87771d8033f2876L,0xb0186ec67d5cc3dbL,0x58e8bb803bc9bc1dL,
29988         0x4d1395cc6f6ef60eL },
29989       { 0xa73c62d6186244a0L,0x918e5f23110a5b53L,0xed4878ca741b7eabL,
29990         0x3038d71adbe03e51L } },
29991     /* 18 << 105 */
29992     { { 0x840204b7a93c3246L,0x21ab6069a0b9b4cdL,0xf5fa6e2bb1d64218L,
29993         0x1de6ad0ef3d56191L },
29994       { 0x570aaa88ff1929c7L,0xc6df4c6b640e87b5L,0xde8a74f2c65f0cccL,
29995         0x8b972fd5e6f6cc01L } },
29996     /* 19 << 105 */
29997     { { 0x3fff36b60b846531L,0xba7e45e610a5e475L,0x84a1d10e4145b6c5L,
29998         0xf1f7f91a5e046d9dL },
29999       { 0x0317a69244de90d7L,0x951a1d4af199c15eL,0x91f78046c9d73debL,
30000         0x74c82828fab8224fL } },
30001     /* 20 << 105 */
30002     { { 0xaa6778fce7560b90L,0xb4073e61a7e824ceL,0xff0d693cd642eba8L,
30003         0x7ce2e57a5dccef38L },
30004       { 0x89c2c7891df1ad46L,0x83a06922098346fdL,0x2d715d72da2fc177L,
30005         0x7b6dd71d85b6cf1dL } },
30006     /* 21 << 105 */
30007     { { 0xc60a6d0a73fa9cb0L,0xedd3992e328bf5a9L,0xc380ddd0832c8c82L,
30008         0xd182d410a2a0bf50L },
30009       { 0x7d9d7438d9a528dbL,0xe8b1a0e9caf53994L,0xddd6e5fe0e19987cL,
30010         0xacb8df03190b059dL } },
30011     /* 22 << 105 */
30012     { { 0x53703a328300129fL,0x1f63766268c43bfdL,0xbcbd191300e54051L,
30013         0x812fcc627bf5a8c5L },
30014       { 0x3f969d5f29fb85daL,0x72f4e00a694759e8L,0x426b6e52790726b7L,
30015         0x617bbc873bdbb209L } },
30016     /* 23 << 105 */
30017     { { 0x511f8bb997aee317L,0x812a4096e81536a8L,0x137dfe593ac09b9bL,
30018         0x0682238fba8c9a7aL },
30019       { 0x7072ead6aeccb4bdL,0x6a34e9aa692ba633L,0xc82eaec26fff9d33L,
30020         0xfb7535121d4d2b62L } },
30021     /* 24 << 105 */
30022     { { 0x1a0445ff1d7aadabL,0x65d38260d5f6a67cL,0x6e62fb0891cfb26fL,
30023         0xef1e0fa55c7d91d6L },
30024       { 0x47e7c7ba33db72cdL,0x017cbc09fa7c74b2L,0x3c931590f50a503cL,
30025         0xcac54f60616baa42L } },
30026     /* 25 << 105 */
30027     { { 0x9b6cd380b2369f0fL,0x97d3a70d23c76151L,0x5f9dd6fc9862a9c6L,
30028         0x044c4ab212312f51L },
30029       { 0x035ea0fd834a2ddcL,0x49e6b862cc7b826dL,0xb03d688362fce490L,
30030         0x62f2497ab37e36e9L } },
30031     /* 26 << 105 */
30032     { { 0x04b005b6c6458293L,0x36bb5276e8d10af7L,0xacf2dc138ee617b8L,
30033         0x470d2d35b004b3d4L },
30034       { 0x06790832feeb1b77L,0x2bb75c3985657f9cL,0xd70bd4edc0f60004L,
30035         0xfe797ecc219b018bL } },
30036     /* 27 << 105 */
30037     { { 0x9b5bec2a753aebccL,0xdaf9f3dcc939eca5L,0xd6bc6833d095ad09L,
30038         0x98abdd51daa4d2fcL },
30039       { 0xd9840a318d168be5L,0xcf7c10e02325a23cL,0xa5c02aa07e6ecfafL,
30040         0x2462e7e6b5bfdf18L } },
30041     /* 28 << 105 */
30042     { { 0xab2d8a8ba0cc3f12L,0x68dd485dbc672a29L,0x72039752596f2cd3L,
30043         0x5d3eea67a0cf3d8dL },
30044       { 0x810a1a81e6602671L,0x8f144a4014026c0cL,0xbc753a6d76b50f85L,
30045         0xc4dc21e8645cd4a4L } },
30046     /* 29 << 105 */
30047     { { 0xc5262dea521d0378L,0x802b8e0e05011c6fL,0x1ba19cbb0b4c19eaL,
30048         0x21db64b5ebf0aaecL },
30049       { 0x1f394ee970342f9dL,0x93a10aee1bc44a14L,0xa7eed31b3efd0baaL,
30050         0x6e7c824e1d154e65L } },
30051     /* 30 << 105 */
30052     { { 0xee23fa819966e7eeL,0x64ec4aa805b7920dL,0x2d44462d2d90aad4L,
30053         0xf44dd195df277ad5L },
30054       { 0x8d6471f1bb46b6a1L,0x1e65d313fd885090L,0x33a800f513a977b4L,
30055         0xaca9d7210797e1efL } },
30056     /* 31 << 105 */
30057     { { 0x9a5a85a0fcff6a17L,0x9970a3f31eca7ceeL,0xbb9f0d6bc9504be3L,
30058         0xe0c504beadd24ee2L },
30059       { 0x7e09d95677fcc2f4L,0xef1a522765bb5fc4L,0x145d4fb18b9286aaL,
30060         0x66fd0c5d6649028bL } },
30061     /* 32 << 105 */
30062     { { 0x98857ceb1bf4581cL,0xe635e186aca7b166L,0x278ddd22659722acL,
30063         0xa0903c4c1db68007L },
30064       { 0x366e458948f21402L,0x31b49c14b96abda2L,0x329c4b09e0403190L,
30065         0x97197ca3d29f43feL } },
30066     /* 33 << 105 */
30067     { { 0x8073dd1e274983d8L,0xda1a3bde55717c8fL,0xfd3d4da20361f9d1L,
30068         0x1332d0814c7de1ceL },
30069       { 0x9b7ef7a3aa6d0e10L,0x17db2e73f54f1c4aL,0xaf3dffae4cd35567L,
30070         0xaaa2f406e56f4e71L } },
30071     /* 34 << 105 */
30072     { { 0x8966759e7ace3fc7L,0x9594eacf45a8d8c6L,0x8de3bd8b91834e0eL,
30073         0xafe4ca53548c0421L },
30074       { 0xfdd7e856e6ee81c6L,0x8f671beb6b891a3aL,0xf7a58f2bfae63829L,
30075         0x9ab186fb9c11ac9fL } },
30076     /* 35 << 105 */
30077     { { 0x8d6eb36910b5be76L,0x046b7739fb040bcdL,0xccb4529fcb73de88L,
30078         0x1df0fefccf26be03L },
30079       { 0xad7757a6bcfcd027L,0xa8786c75bb3165caL,0xe9db1e347e99a4d9L,
30080         0x99ee86dfb06c504bL } },
30081     /* 36 << 105 */
30082     { { 0x5b7c2dddc15c9f0aL,0xdf87a7344295989eL,0x59ece47c03d08fdaL,
30083         0xb074d3ddad5fc702L },
30084       { 0x2040790351a03776L,0x2bb1f77b2a608007L,0x25c58f4fe1153185L,
30085         0xe6df62f6766e6447L } },
30086     /* 37 << 105 */
30087     { { 0xefb3d1beed51275aL,0x5de47dc72f0f483fL,0x7932d98e97c2bedfL,
30088         0xd5c119270219f8a1L },
30089       { 0x9d751200a73a294eL,0x5f88434a9dc20172L,0xd28d9fd3a26f506aL,
30090         0xa890cd319d1dcd48L } },
30091     /* 38 << 105 */
30092     { { 0x0aebaec170f4d3b4L,0xfd1a13690ffc8d00L,0xb9d9c24057d57838L,
30093         0x45929d2668bac361L },
30094       { 0x5a2cd06025b15ca6L,0x4b3c83e16e474446L,0x1aac7578ee1e5134L,
30095         0xa418f5d6c91e2f41L } },
30096     /* 39 << 105 */
30097     { { 0x6936fc8a213ed68bL,0x860ae7ed510a5224L,0x63660335def09b53L,
30098         0x641b2897cd79c98dL },
30099       { 0x29bd38e101110f35L,0x79c26f42648b1937L,0x64dae5199d9164f4L,
30100         0xd85a23100265c273L } },
30101     /* 40 << 105 */
30102     { { 0x7173dd5d4b07e2b1L,0xd144c4cb8d9ea221L,0xe8b04ea41105ab14L,
30103         0x92dda542fe80d8f1L },
30104       { 0xe9982fa8cf03dce6L,0x8b5ea9651a22cffcL,0xf7f4ea7f3fad88c4L,
30105         0x62db773e6a5ba95cL } },
30106     /* 41 << 105 */
30107     { { 0xd20f02fb93f24567L,0xfd46c69a315257caL,0x0ac74cc78bcab987L,
30108         0x46f31c015ceca2f5L },
30109       { 0x40aedb59888b219eL,0xe50ecc37e1fccd02L,0x1bcd9dad911f816cL,
30110         0x583cc1ec8db9b00cL } },
30111     /* 42 << 105 */
30112     { { 0xf3cd2e66a483bf11L,0xfa08a6f5b1b2c169L,0xf375e2454be9fa28L,
30113         0x99a7ffec5b6d011fL },
30114       { 0x6a3ebddbc4ae62daL,0x6cea00ae374aef5dL,0xab5fb98d9d4d05bcL,
30115         0x7cba1423d560f252L } },
30116     /* 43 << 105 */
30117     { { 0x49b2cc21208490deL,0x1ca66ec3bcfb2879L,0x7f1166b71b6fb16fL,
30118         0xfff63e0865fe5db3L },
30119       { 0xb8345abe8b2610beL,0xb732ed8039de3df4L,0x0e24ed50211c32b4L,
30120         0xd10d8a69848ff27dL } },
30121     /* 44 << 105 */
30122     { { 0xc1074398ed4de248L,0xd7cedace10488927L,0xa4aa6bf885673e13L,
30123         0xb46bae916daf30afL },
30124       { 0x07088472fcef7ad8L,0x61151608d4b35e97L,0xbcfe8f26dde29986L,
30125         0xeb84c4c7d5a34c79L } },
30126     /* 45 << 105 */
30127     { { 0xc1eec55c164e1214L,0x891be86da147bb03L,0x9fab4d100ba96835L,
30128         0xbf01e9b8a5c1ae9fL },
30129       { 0x6b4de139b186ebc0L,0xd5c74c2685b91bcaL,0x5086a99cc2d93854L,
30130         0xeed62a7ba7a9dfbcL } },
30131     /* 46 << 105 */
30132     { { 0x8778ed6f76b7618aL,0xbff750a503b66062L,0x4cb7be22b65186dbL,
30133         0x369dfbf0cc3a6d13L },
30134       { 0xc7dab26c7191a321L,0x9edac3f940ed718eL,0xbc142b36d0cfd183L,
30135         0xc8af82f67c991693L } },
30136     /* 47 << 105 */
30137     { { 0xb3d1e4d897ce0b2aL,0xe6d7c87fc3a55cdfL,0x35846b9568b81afeL,
30138         0x018d12afd3c239d8L },
30139       { 0x2b2c620801206e15L,0xe0e42453a3b882c6L,0x854470a3a50162d5L,
30140         0x081574787017a62aL } },
30141     /* 48 << 105 */
30142     { { 0x18bd3fb4820357c7L,0x992039ae6f1458adL,0x9a1df3c525b44aa1L,
30143         0x2d780357ed3d5281L },
30144       { 0x58cf7e4dc77ad4d4L,0xd49a7998f9df4fc4L,0x4465a8b51d71205eL,
30145         0xa0ee0ea6649254aaL } },
30146     /* 49 << 105 */
30147     { { 0x4b5eeecfab7bd771L,0x6c87307335c262b9L,0xdc5bd6483c9d61e7L,
30148         0x233d6d54321460d2L },
30149       { 0xd20c5626fc195bccL,0x2544595804d78b63L,0xe03fcb3d17ec8ef3L,
30150         0x54b690d146b8f781L } },
30151     /* 50 << 105 */
30152     { { 0x82fa2c8a21230646L,0xf51aabb9084f418cL,0xff4fbec11a30ba43L,
30153         0x6a5acf73743c9df7L },
30154       { 0x1da2b357d635b4d5L,0xc3de68ddecd5c1daL,0xa689080bd61af0ddL,
30155         0xdea5938ad665bf99L } },
30156     /* 51 << 105 */
30157     { { 0x0231d71afe637294L,0x01968aa6a5a81cd8L,0x11252d50048e63b5L,
30158         0xc446bc526ca007e9L },
30159       { 0xef8c50a696d6134bL,0x9361fbf59e09a05cL,0xf17f85a6dca3291aL,
30160         0xb178d548ff251a21L } },
30161     /* 52 << 105 */
30162     { { 0x87f6374ba4df3915L,0x566ce1bf2fd5d608L,0x425cba4d7de35102L,
30163         0x6b745f8f58c5d5e2L },
30164       { 0x88402af663122edfL,0x3190f9ed3b989a89L,0x4ad3d387ebba3156L,
30165         0xef385ad9c7c469a5L } },
30166     /* 53 << 105 */
30167     { { 0xb08281de3f642c29L,0x20be0888910ffb88L,0xf353dd4ad5292546L,
30168         0x3f1627de8377a262L },
30169       { 0xa5faa013eefcd638L,0x8f3bf62674cc77c3L,0x32618f65a348f55eL,
30170         0x5787c0dc9fefeb9eL } },
30171     /* 54 << 105 */
30172     { { 0xf1673aa2d9a23e44L,0x88dfa9934e10690dL,0x1ced1b362bf91108L,
30173         0x9193ceca3af48649L },
30174       { 0xfb34327d2d738fc5L,0x6697b037975fee6cL,0x2f485da0c04079a5L,
30175         0x2cdf57352feaa1acL } },
30176     /* 55 << 105 */
30177     { { 0x76944420bd55659eL,0x7973e32b4376090cL,0x86bb4fe1163b591aL,
30178         0x10441aedc196f0caL },
30179       { 0x3b431f4a045ad915L,0x6c11b437a4afacb1L,0x30b0c7db71fdbbd8L,
30180         0xb642931feda65acdL } },
30181     /* 56 << 105 */
30182     { { 0x4baae6e89c92b235L,0xa73bbd0e6b3993a1L,0xd06d60ec693dd031L,
30183         0x03cab91b7156881cL },
30184       { 0xd615862f1db3574bL,0x485b018564bb061aL,0x27434988a0181e06L,
30185         0x2cd61ad4c1c0c757L } },
30186     /* 57 << 105 */
30187     { { 0x3effed5a2ff9f403L,0x8dc98d8b62239029L,0x2206021e1f17b70dL,
30188         0xafbec0cabf510015L },
30189       { 0x9fed716480130dfaL,0x306dc2b58a02dcf5L,0x48f06620feb10fc0L,
30190         0x78d1e1d55a57cf51L } },
30191     /* 58 << 105 */
30192     { { 0xadef8c5a192ef710L,0x88afbd4b3b7431f9L,0x7e1f740764250c9eL,
30193         0x6e31318db58bec07L },
30194       { 0xfd4fc4b824f89b4eL,0x65a5dd8848c36a2aL,0x4f1eccfff024baa7L,
30195         0x22a21cf2cba94650L } },
30196     /* 59 << 105 */
30197     { { 0x95d29dee42a554f7L,0x828983a5002ec4baL,0x8112a1f78badb73dL,
30198         0x79ea8897a27c1839L },
30199       { 0x8969a5a7d065fd83L,0xf49af791b262a0bcL,0xfcdea8b6af2b5127L,
30200         0x10e913e1564c2dbcL } },
30201     /* 60 << 105 */
30202     { { 0x51239d14bc21ef51L,0xe51c3ceb4ce57292L,0x795ff06847bbcc3bL,
30203         0x86b46e1ebd7e11e6L },
30204       { 0x0ea6ba2380041ef4L,0xd72fe5056262342eL,0x8abc6dfd31d294d4L,
30205         0xbbe017a21278c2c9L } },
30206     /* 61 << 105 */
30207     { { 0xb1fcfa09b389328aL,0x322fbc62d01771b5L,0x04c0d06360b045bfL,
30208         0xdb652edc10e52d01L },
30209       { 0x50ef932c03ec6627L,0xde1b3b2dc1ee50e3L,0x5ab7bdc5dc37a90dL,
30210         0xfea6721331e33a96L } },
30211     /* 62 << 105 */
30212     { { 0x6482b5cb4f2999aaL,0x38476cc6b8cbf0ddL,0x93ebfacb173405bbL,
30213         0x15cdafe7e52369ecL },
30214       { 0xd42d5ba4d935b7dbL,0x648b60041c99a4cdL,0x785101bda3b5545bL,
30215         0x4bf2c38a9dd67fafL } },
30216     /* 63 << 105 */
30217     { { 0xb1aadc634442449cL,0xe0e9921a33ad4fb8L,0x5c552313aa686d82L,
30218         0xdee635fa465d866cL },
30219       { 0xbc3c224a18ee6e8aL,0xeed748a6ed42e02fL,0xe70f930ad474cd08L,
30220         0x774ea6ecfff24adfL } },
30221     /* 64 << 105 */
30222     { { 0x03e2de1cf3480d4aL,0xf0d8edc7bc8acf1aL,0xf23e330368295a9cL,
30223         0xfadd5f68c546a97dL },
30224       { 0x895597ad96f8acb1L,0xbddd49d5671bdae2L,0x16fcd52821dd43f4L,
30225         0xa5a454126619141aL } },
30226     /* 0 << 112 */
30227     { { 0x00, 0x00, 0x00, 0x00 },
30228       { 0x00, 0x00, 0x00, 0x00 } },
30229     /* 1 << 112 */
30230     { { 0x8ce9b6bfc360e25aL,0xe6425195075a1a78L,0x9dc756a8481732f4L,
30231         0x83c0440f5432b57aL },
30232       { 0xc670b3f1d720281fL,0x2205910ed135e051L,0xded14b0edb052be7L,
30233         0x697b3d27c568ea39L } },
30234     /* 2 << 112 */
30235     { { 0x2e599b9afb3ff9edL,0x28c2e0ab17f6515cL,0x1cbee4fd474da449L,
30236         0x071279a44f364452L },
30237       { 0x97abff6601fbe855L,0x3ee394e85fda51c4L,0x190385f667597c0bL,
30238         0x6e9fccc6a27ee34bL } },
30239     /* 3 << 112 */
30240     { { 0x0b89de9314092ebbL,0xf17256bd428e240cL,0xcf89a7f393d2f064L,
30241         0x4f57841ee1ed3b14L },
30242       { 0x4ee14405e708d855L,0x856aae7203f1c3d0L,0xc8e5424fbdd7eed5L,
30243         0x3333e4ef73ab4270L } },
30244     /* 4 << 112 */
30245     { { 0x3bc77adedda492f8L,0xc11a3aea78297205L,0x5e89a3e734931b4cL,
30246         0x17512e2e9f5694bbL },
30247       { 0x5dc349f3177bf8b6L,0x232ea4ba08c7ff3eL,0x9c4f9d16f511145dL,
30248         0xccf109a333b379c3L } },
30249     /* 5 << 112 */
30250     { { 0xe75e7a88a1f25897L,0x7ac6961fa1b5d4d8L,0xe3e1077308f3ed5cL,
30251         0x208a54ec0a892dfbL },
30252       { 0xbe826e1978660710L,0x0cf70a97237df2c8L,0x418a7340ed704da5L,
30253         0xa3eeb9a908ca33fdL } },
30254     /* 6 << 112 */
30255     { { 0x49d96233169bca96L,0x04d286d42da6aafbL,0xc09606eca0c2fa94L,
30256         0x8869d0d523ff0fb3L },
30257       { 0xa99937e5d0150d65L,0xa92e2503240c14c9L,0x656bf945108e2d49L,
30258         0x152a733aa2f59e2bL } },
30259     /* 7 << 112 */
30260     { { 0xb4323d588434a920L,0xc0af8e93622103c5L,0x667518ef938dbf9aL,
30261         0xa184307383a9cdf2L },
30262       { 0x350a94aa5447ab80L,0xe5e5a325c75a3d61L,0x74ba507f68411a9eL,
30263         0x10581fc1594f70c5L } },
30264     /* 8 << 112 */
30265     { { 0x60e2857080eb24a9L,0x7bedfb4d488e0cfdL,0x721ebbd7c259cdb8L,
30266         0x0b0da855bc6390a9L },
30267       { 0x2b4d04dbde314c70L,0xcdbf1fbc6c32e846L,0x33833eabb162fc9eL,
30268         0x9939b48bb0dd3ab7L } },
30269     /* 9 << 112 */
30270     { { 0x5aaa98a7cb0c9c8cL,0x75105f3081c4375cL,0xceee50575ef1c90fL,
30271         0xb31e065fc23a17bfL },
30272       { 0x5364d275d4b6d45aL,0xd363f3ad62ec8996L,0xb5d212394391c65bL,
30273         0x84564765ebb41b47L } },
30274     /* 10 << 112 */
30275     { { 0x20d18ecc37107c78L,0xacff3b6b570c2a66L,0x22f975d99bd0d845L,
30276         0xef0a0c46ba178fa0L },
30277       { 0x1a41965176b6028eL,0xc49ec674248612d4L,0x5b6ac4f27338af55L,
30278         0x06145e627bee5a36L } },
30279     /* 11 << 112 */
30280     { { 0x33e95d07e75746b5L,0x1c1e1f6dc40c78beL,0x967833ef222ff8e2L,
30281         0x4bedcf6ab49180adL },
30282       { 0x6b37e9c13d7a4c8aL,0x2748887c6ddfe760L,0xf7055123aa3a5bbcL,
30283         0x954ff2257bbb8e74L } },
30284     /* 12 << 112 */
30285     { { 0xc42b8ab197c3dfb9L,0x55a549b0cf168154L,0xad6748e7c1b50692L,
30286         0x2775780f6fc5cbcbL },
30287       { 0x4eab80b8e1c9d7c8L,0x8c69dae13fdbcd56L,0x47e6b4fb9969eaceL,
30288         0x002f1085a705cb5aL } },
30289     /* 13 << 112 */
30290     { { 0x4e23ca446d3fea55L,0xb4ae9c86f4810568L,0x47bfb91b2a62f27dL,
30291         0x60deb4c9d9bac28cL },
30292       { 0xa892d8947de6c34cL,0x4ee682594494587dL,0x914ee14e1a3f8a5bL,
30293         0xbb113eaa28700385L } },
30294     /* 14 << 112 */
30295     { { 0x81ca03b92115b4c9L,0x7c163d388908cad1L,0xc912a118aa18179aL,
30296         0xe09ed750886e3081L },
30297       { 0xa676e3fa26f516caL,0x753cacf78e732f91L,0x51592aea833da8b4L,
30298         0xc626f42f4cbea8aaL } },
30299     /* 15 << 112 */
30300     { { 0xef9dc899a7b56eafL,0x00c0e52c34ef7316L,0x5b1e4e24fe818a86L,
30301         0x9d31e20dc538be47L },
30302       { 0x22eb932d3ed68974L,0xe44bbc087c4e87c4L,0x4121086e0dde9aefL,
30303         0x8e6b9cff134f4345L } },
30304     /* 16 << 112 */
30305     { { 0x96892c1f711b0eb9L,0xb905f2c8780ab954L,0xace26309a20792dbL,
30306         0xec8ac9b30684e126L },
30307       { 0x486ad8b6b40a2447L,0x60121fc19fe3fb24L,0x5626fccf1a8e3b3fL,
30308         0x4e5686226ad1f394L } },
30309     /* 17 << 112 */
30310     { { 0xda7aae0d196aa5a1L,0xe0df8c771041b5fbL,0x451465d926b318b7L,
30311         0xc29b6e557ab136e9L },
30312       { 0x2c2ab48b71148463L,0xb5738de364454a76L,0x54ccf9a05a03abe4L,
30313         0x377c02960427d58eL } },
30314     /* 18 << 112 */
30315     { { 0x73f5f0b92bb39c1fL,0x14373f2ce608d8c5L,0xdcbfd31400fbb805L,
30316         0xdf18fb2083afdcfbL },
30317       { 0x81a57f4242b3523fL,0xe958532d87f650fbL,0xaa8dc8b68b0a7d7cL,
30318         0x1b75dfb7150166beL } },
30319     /* 19 << 112 */
30320     { { 0x90e4f7c92d7d1413L,0x67e2d6b59834f597L,0x4fd4f4f9a808c3e8L,
30321         0xaf8237e0d5281ec1L },
30322       { 0x25ab5fdc84687ceeL,0xc5ded6b1a5b26c09L,0x8e4a5aecc8ea7650L,
30323         0x23b73e5c14cc417fL } },
30324     /* 20 << 112 */
30325     { { 0x2bfb43183037bf52L,0xb61e6db578c725d7L,0x8efd4060bbb3e5d7L,
30326         0x2e014701dbac488eL },
30327       { 0xac75cf9a360aa449L,0xb70cfd0579634d08L,0xa591536dfffb15efL,
30328         0xb2c37582d07c106cL } },
30329     /* 21 << 112 */
30330     { { 0xb4293fdcf50225f9L,0xc52e175cb0e12b03L,0xf649c3bad0a8bf64L,
30331         0x745a8fefeb8ae3c6L },
30332       { 0x30d7e5a358321bc3L,0xb1732be70bc4df48L,0x1f217993e9ea5058L,
30333         0xf7a71cde3e4fd745L } },
30334     /* 22 << 112 */
30335     { { 0x86cc533e894c5bbbL,0x6915c7d969d83082L,0xa6aa2d055815c244L,
30336         0xaeeee59249b22ce5L },
30337       { 0x89e39d1378135486L,0x3a275c1f16b76f2fL,0xdb6bcc1be036e8f5L,
30338         0x4df69b215e4709f5L } },
30339     /* 23 << 112 */
30340     { { 0xa188b2502d0f39aaL,0x622118bb15a85947L,0x2ebf520ffde0f4faL,
30341         0xa40e9f294860e539L },
30342       { 0x7b6a51eb22b57f0fL,0x849a33b97e80644aL,0x50e5d16f1cf095feL,
30343         0xd754b54eec55f002L } },
30344     /* 24 << 112 */
30345     { { 0x5cfbbb22236f4a98L,0x0b0c59e9066800bbL,0x4ac69a8f5a9a7774L,
30346         0x2b33f804d6bec948L },
30347       { 0xb372929532e6c466L,0x68956d0f4e599c73L,0xa47a249f155c31ccL,
30348         0x24d80f0de1ce284eL } },
30349     /* 25 << 112 */
30350     { { 0xcd821dfb988baf01L,0xe6331a7ddbb16647L,0x1eb8ad33094cb960L,
30351         0x593cca38c91bbca5L },
30352       { 0x384aac8d26567456L,0x40fa0309c04b6490L,0x97834cd6dab6c8f6L,
30353         0x68a7318d3f91e55fL } },
30354     /* 26 << 112 */
30355     { { 0xa00fd04efc4d3157L,0xb56f8ab22bf3bdeaL,0x014f56484fa57172L,
30356         0x948c5860450abdb3L },
30357       { 0x342b5df00ebd4f08L,0x3e5168cd0e82938eL,0x7aedc1ceb0df5dd0L,
30358         0x6bbbc6d9e5732516L } },
30359     /* 27 << 112 */
30360     { { 0xc7bfd486605daaa6L,0x46fd72b7bb9a6c9eL,0xe4847fb1a124fb89L,
30361         0x75959cbda2d8ffbcL },
30362       { 0x42579f65c8a588eeL,0x368c92e6b80b499dL,0xea4ef6cd999a5df1L,
30363         0xaa73bb7f936fe604L } },
30364     /* 28 << 112 */
30365     { { 0xf347a70d6457d188L,0x86eda86b8b7a388bL,0xb7cdff060ccd6013L,
30366         0xbeb1b6c7d0053fb2L },
30367       { 0x0b02238799240a9fL,0x1bbb384f776189b2L,0x8695e71e9066193aL,
30368         0x2eb5009706ffac7eL } },
30369     /* 29 << 112 */
30370     { { 0x0654a9c04a7d2caaL,0x6f3fb3d1a5aaa290L,0x835db041ff476e8fL,
30371         0x540b8b0bc42295e4L },
30372       { 0xa5c73ac905e214f5L,0x9a74075a56a0b638L,0x2e4b1090ce9e680bL,
30373         0x57a5b4796b8d9afaL } },
30374     /* 30 << 112 */
30375     { { 0x0dca48e726bfe65cL,0x097e391c7290c307L,0x683c462e6669e72eL,
30376         0xf505be1e062559acL },
30377       { 0x5fbe3ea1e3a3035aL,0x6431ebf69cd50da8L,0xfd169d5c1f6407f2L,
30378         0x8d838a9560fce6b8L } },
30379     /* 31 << 112 */
30380     { { 0x2a2bfa7f650006f0L,0xdfd7dad350c0fbb2L,0x92452495ccf9ad96L,
30381         0x183bf494d95635f9L },
30382       { 0x02d5df434a7bd989L,0x505385cca5431095L,0xdd98e67dfd43f53eL,
30383         0xd61e1a6c500c34a9L } },
30384     /* 32 << 112 */
30385     { { 0x5a4b46c64a8a3d62L,0x8469c4d0247743d2L,0x2bb3a13d88f7e433L,
30386         0x62b23a1001be5849L },
30387       { 0xe83596b4a63d1a4cL,0x454e7fea7d183f3eL,0x643fce6117afb01cL,
30388         0x4e65e5e61c4c3638L } },
30389     /* 33 << 112 */
30390     { { 0x41d85ea1ef74c45bL,0x2cfbfa66ae328506L,0x98b078f53ada7da9L,
30391         0xd985fe37ec752fbbL },
30392       { 0xeece68fe5a0148b4L,0x6f9a55c72d78136dL,0x232dccc4d2b729ceL,
30393         0xa27e0dfd90aafbc4L } },
30394     /* 34 << 112 */
30395     { { 0x9647445212b4603eL,0xa876c5516b706d14L,0xdf145fcf69a9d412L,
30396         0xe2ab75b72d479c34L },
30397       { 0x12df9a761a23ff97L,0xc61389925d359d10L,0x6e51c7aefa835f22L,
30398         0x69a79cb1c0fcc4d9L } },
30399     /* 35 << 112 */
30400     { { 0xf57f350d594cc7e1L,0x3079ca633350ab79L,0x226fb6149aff594aL,
30401         0x35afec026d59a62bL },
30402       { 0x9bee46f406ed2c6eL,0x58da17357d939a57L,0x44c504028fd1797eL,
30403         0xd8853e7c5ccea6caL } },
30404     /* 36 << 112 */
30405     { { 0x4065508da35fcd5fL,0x8965df8c495ccaebL,0x0f2da85012e1a962L,
30406         0xee471b94c1cf1cc4L },
30407       { 0xcef19bc80a08fb75L,0x704958f581de3591L,0x2867f8b23aef4f88L,
30408         0x8d749384ea9f9a5fL } },
30409     /* 37 << 112 */
30410     { { 0x1b3855378c9049f4L,0x5be948f37b92d8b6L,0xd96f725db6e2bd6bL,
30411         0x37a222bc958c454dL },
30412       { 0xe7c61abb8809bf61L,0x46f07fbc1346f18dL,0xfb567a7ae87c0d1cL,
30413         0x84a461c87ef3d07aL } },
30414     /* 38 << 112 */
30415     { { 0x0a5adce6d9278d98L,0x24d948139dfc73e1L,0x4f3528b6054321c3L,
30416         0x2e03fdde692ea706L },
30417       { 0x10e6061947b533c0L,0x1a8bc73f2ca3c055L,0xae58d4b21bb62b8fL,
30418         0xb2045a73584a24e3L } },
30419     /* 39 << 112 */
30420     { { 0x3ab3d5afbd76e195L,0x478dd1ad6938a810L,0x6ffab3936ee3d5cbL,
30421         0xdfb693db22b361e4L },
30422       { 0xf969449651dbf1a7L,0xcab4b4ef08a2e762L,0xe8c92f25d39bba9aL,
30423         0x850e61bcf1464d96L } },
30424     /* 40 << 112 */
30425     { { 0xb7e830e3dc09508bL,0xfaf6d2cf74317655L,0x72606cebdf690355L,
30426         0x48bb92b3d0c3ded6L },
30427       { 0x65b754845c7cf892L,0xf6cd7ac9d5d5f01fL,0xc2c30a5996401d69L,
30428         0x91268650ed921878L } },
30429     /* 41 << 112 */
30430     { { 0x380bf913b78c558fL,0x43c0baebc8afdaa9L,0x377f61d554f169d3L,
30431         0xf8da07e3ae5ff20bL },
30432       { 0xb676c49da8a90ea8L,0x81c1ff2b83a29b21L,0x383297ac2ad8d276L,
30433         0x3001122fba89f982L } },
30434     /* 42 << 112 */
30435     { { 0xe1d794be6718e448L,0x246c14827c3e6e13L,0x56646ef85d26b5efL,
30436         0x80f5091e88069cddL },
30437       { 0xc5992e2f724bdd38L,0x02e915b48471e8c7L,0x96ff320a0d0ff2a9L,
30438         0xbf8864874384d1a0L } },
30439     /* 43 << 112 */
30440     { { 0xbbe1e6a6c93f72d6L,0xd5f75d12cad800eaL,0xfa40a09fe7acf117L,
30441         0x32c8cdd57581a355L },
30442       { 0x742219927023c499L,0xa8afe5d738ec3901L,0x5691afcba90e83f0L,
30443         0x41bcaa030b8f8eacL } },
30444     /* 44 << 112 */
30445     { { 0xe38b5ff98d2668d5L,0x0715281a7ad81965L,0x1bc8fc7c03c6ce11L,
30446         0xcbbee6e28b650436L },
30447       { 0x06b00fe80cdb9808L,0x17d6e066fe3ed315L,0x2e9d38c64d0b5018L,
30448         0xab8bfd56844dcaefL } },
30449     /* 45 << 112 */
30450     { { 0x42894a59513aed8bL,0xf77f3b6d314bd07aL,0xbbdecb8f8e42b582L,
30451         0xf10e2fa8d2390fe6L },
30452       { 0xefb9502262a2f201L,0x4d59ea5050ee32b0L,0xd87f77286da789a8L,
30453         0xcf98a2cff79492c4L } },
30454     /* 46 << 112 */
30455     { { 0xf9577239720943c2L,0xba044cf53990b9d0L,0x5aa8e82395f2884aL,
30456         0x834de6ed0278a0afL },
30457       { 0xc8e1ee9a5f25bd12L,0x9259ceaa6f7ab271L,0x7e6d97a277d00b76L,
30458         0x5c0c6eeaa437832aL } },
30459     /* 47 << 112 */
30460     { { 0x5232c20f5606b81dL,0xabd7b3750d991ee5L,0x4d2bfe358632d951L,
30461         0x78f8514698ed9364L },
30462       { 0x951873f0f30c3282L,0x0da8ac80a789230bL,0x3ac7789c5398967fL,
30463         0xa69b8f7fbdda0fb5L } },
30464     /* 48 << 112 */
30465     { { 0xe5db77176add8545L,0x1b71cb6672c49b66L,0xd856073968421d77L,
30466         0x03840fe883e3afeaL },
30467       { 0xb391dad51ec69977L,0xae243fb9307f6726L,0xc88ac87be8ca160cL,
30468         0x5174cced4ce355f4L } },
30469     /* 49 << 112 */
30470     { { 0x98a35966e58ba37dL,0xfdcc8da27817335dL,0x5b75283083fbc7bfL,
30471         0x68e419d4d9c96984L },
30472       { 0x409a39f402a40380L,0x88940faf1fe977bcL,0xc640a94b8f8edea6L,
30473         0x1e22cd17ed11547dL } },
30474     /* 50 << 112 */
30475     { { 0xe28568ce59ffc3e2L,0x60aa1b55c1dee4e7L,0xc67497c8837cb363L,
30476         0x06fb438a105a2bf2L },
30477       { 0x30357ec4500d8e20L,0x1ad9095d0670db10L,0x7f589a05c73b7cfdL,
30478         0xf544607d880d6d28L } },
30479     /* 51 << 112 */
30480     { { 0x17ba93b1a20ef103L,0xad8591306ba6577bL,0x65c91cf66fa214a0L,
30481         0xd7d49c6c27990da5L },
30482       { 0xecd9ec8d20bb569dL,0xbd4b2502eeffbc33L,0x2056ca5a6bed0467L,
30483         0x7916a1f75b63728cL } },
30484     /* 52 << 112 */
30485     { { 0xd4f9497d53a4f566L,0x8973466497b56810L,0xf8e1da740494a621L,
30486         0x82546a938d011c68L },
30487       { 0x1f3acb19c61ac162L,0x52f8fa9cabad0d3eL,0x15356523b4b7ea43L,
30488         0x5a16ad61ae608125L } },
30489     /* 53 << 112 */
30490     { { 0xb0bcb87f4faed184L,0x5f236b1d5029f45fL,0xd42c76070bc6b1fcL,
30491         0xc644324e68aefce3L },
30492       { 0x8e191d595c5d8446L,0xc020807713ae1979L,0xadcaee553ba59cc7L,
30493         0x20ed6d6ba2cb81baL } },
30494     /* 54 << 112 */
30495     { { 0x0952ba19b6efcffcL,0x60f12d6897c0b87cL,0x4ee2c7c49caa30bcL,
30496         0x767238b797fbff4eL },
30497       { 0xebc73921501b5d92L,0x3279e3dfc2a37737L,0x9fc12bc86d197543L,
30498         0xfa94dc6f0a40db4eL } },
30499     /* 55 << 112 */
30500     { { 0x7392b41a530ccbbdL,0x87c82146ea823525L,0xa52f984c05d98d0cL,
30501         0x2ae57d735ef6974cL },
30502       { 0x9377f7bf3042a6ddL,0xb1a007c019647a64L,0xfaa9079a0cca9767L,
30503         0x3d81a25bf68f72d5L } },
30504     /* 56 << 112 */
30505     { { 0x752067f8ff81578eL,0x786221509045447dL,0xc0c22fcf0505aa6fL,
30506         0x1030f0a66bed1c77L },
30507       { 0x31f29f151f0bd739L,0x2d7989c7e6debe85L,0x5c070e728e677e98L,
30508         0x0a817bd306e81fd5L } },
30509     /* 57 << 112 */
30510     { { 0xc110d830b0f2ac95L,0x48d0995aab20e64eL,0x0f3e00e17729cd9aL,
30511         0x2a570c20dd556946L },
30512       { 0x912dbcfd4e86214dL,0x2d014ee2cf615498L,0x55e2b1e63530d76eL,
30513         0xc5135ae4fd0fd6d1L } },
30514     /* 58 << 112 */
30515     { { 0x0066273ad4f3049fL,0xbb8e9893e7087477L,0x2dba1ddb14c6e5fdL,
30516         0xdba3788651f57e6cL },
30517       { 0x5aaee0a65a72f2cfL,0x1208bfbf7bea5642L,0xf5c6aa3b67872c37L,
30518         0xd726e08343f93224L } },
30519     /* 59 << 112 */
30520     { { 0x1854daa5061f1658L,0xc0016df1df0cd2b3L,0xc2a3f23e833d50deL,
30521         0x73b681d2bbbd3017L },
30522       { 0x2f046dc43ac343c0L,0x9c847e7d85716421L,0xe1e13c910917eed4L,
30523         0x3fc9eebd63a1b9c6L } },
30524     /* 60 << 112 */
30525     { { 0x0f816a727fe02299L,0x6335ccc2294f3319L,0x3820179f4745c5beL,
30526         0xe647b782922f066eL },
30527       { 0xc22e49de02cafb8aL,0x299bc2fffcc2ecccL,0x9a8feea26e0e8282L,
30528         0xa627278bfe893205L } },
30529     /* 61 << 112 */
30530     { { 0xa7e197337933e47bL,0xf4ff6b132e766402L,0xa4d8be0a98440d9fL,
30531         0x658f5c2f38938808L },
30532       { 0x90b75677c95b3b3eL,0xfa0442693137b6ffL,0x077b039b43c47c29L,
30533         0xcca95dd38a6445b2L } },
30534     /* 62 << 112 */
30535     { { 0x0b498ba42333fc4cL,0x274f8e68f736a1b1L,0x6ca348fd5f1d4b2eL,
30536         0x24d3be78a8f10199L },
30537       { 0x8535f858ca14f530L,0xa6e7f1635b982e51L,0x847c851236e1bf62L,
30538         0xf6a7c58e03448418L } },
30539     /* 63 << 112 */
30540     { { 0x583f3703f9374ab6L,0x864f91956e564145L,0x33bc3f4822526d50L,
30541         0x9f323c801262a496L },
30542       { 0xaa97a7ae3f046a9aL,0x70da183edf8a039aL,0x5b68f71c52aa0ba6L,
30543         0x9be0fe5121459c2dL } },
30544     /* 64 << 112 */
30545     { { 0xc1e17eb6cbc613e5L,0x33131d55497ea61cL,0x2f69d39eaf7eded5L,
30546         0x73c2f434de6af11bL },
30547       { 0x4ca52493a4a375faL,0x5f06787cb833c5c2L,0x814e091f3e6e71cfL,
30548         0x76451f578b746666L } },
30549     /* 0 << 119 */
30550     { { 0x00, 0x00, 0x00, 0x00 },
30551       { 0x00, 0x00, 0x00, 0x00 } },
30552     /* 1 << 119 */
30553     { { 0x80f9bdef694db7e0L,0xedca8787b9fcddc6L,0x51981c3403b8dce1L,
30554         0x4274dcf170e10ba1L },
30555       { 0xf72743b86def6d1aL,0xd25b1670ebdb1866L,0xc4491e8c050c6f58L,
30556         0x2be2b2ab87fbd7f5L } },
30557     /* 2 << 119 */
30558     { { 0x3e0e5c9dd111f8ecL,0xbcc33f8db7c4e760L,0x702f9a91bd392a51L,
30559         0x7da4a795c132e92dL },
30560       { 0x1a0b0ae30bb1151bL,0x54febac802e32251L,0xea3a5082694e9e78L,
30561         0xe58ffec1e4fe40b8L } },
30562     /* 3 << 119 */
30563     { { 0xf85592fcd1e0cf9eL,0xdea75f0dc0e7b2e8L,0xc04215cfc135584eL,
30564         0x174fc7272f57092aL },
30565       { 0xe7277877eb930beaL,0x504caccb5eb02a5aL,0xf9fe08f7f5241b9bL,
30566         0xe7fb62f48d5ca954L } },
30567     /* 4 << 119 */
30568     { { 0xfbb8349d29c4120bL,0x9f94391fc0d0d915L,0xc4074fa75410ba51L,
30569         0xa66adbf6150a5911L },
30570       { 0xc164543c34bfca38L,0xe0f27560b9e1ccfcL,0x99da0f53e820219cL,
30571         0xe8234498c6b4997aL } },
30572     /* 5 << 119 */
30573     { { 0xcfb88b769d4c5423L,0x9e56eb10b0521c49L,0x418e0b5ebe8700a1L,
30574         0x00cbaad6f93cb58aL },
30575       { 0xe923fbded92a5e67L,0xca4979ac1f347f11L,0x89162d856bc0585bL,
30576         0xdd6254afac3c70e3L } },
30577     /* 6 << 119 */
30578     { { 0x7b23c513516e19e4L,0x56e2e847c5c4d593L,0x9f727d735ce71ef6L,
30579         0x5b6304a6f79a44c5L },
30580       { 0x6638a7363ab7e433L,0x1adea470fe742f83L,0xe054b8545b7fc19fL,
30581         0xf935381aba1d0698L } },
30582     /* 7 << 119 */
30583     { { 0x546eab2d799e9a74L,0x96239e0ea949f729L,0xca274c6b7090055aL,
30584         0x835142c39020c9b0L },
30585       { 0xa405667aa2e8807fL,0x29f2c0851aa3d39eL,0xcc555d6442fc72f5L,
30586         0xe856e0e7fbeacb3cL } },
30587     /* 8 << 119 */
30588     { { 0xb5504f9d918e4936L,0x65035ef6b2513982L,0x0553a0c26f4d9cb9L,
30589         0x6cb10d56bea85509L },
30590       { 0x48d957b7a242da11L,0x16a4d3dd672b7268L,0x3d7e637c8502a96bL,
30591         0x27c7032b730d463bL } },
30592     /* 9 << 119 */
30593     { { 0xbdc02b18e4136a14L,0xbacf969d678e32bfL,0xc98d89a3dd9c3c03L,
30594         0x7b92420a23becc4fL },
30595       { 0xd4b41f78c64d565cL,0x9f969d0010f28295L,0xec7f7f76b13d051aL,
30596         0x08945e1ea92da585L } },
30597     /* 10 << 119 */
30598     { { 0x55366b7d5846426fL,0xe7d09e89247d441dL,0x510b404d736fbf48L,
30599         0x7fa003d0e784bd7dL },
30600       { 0x25f7614f17fd9596L,0x49e0e0a135cb98dbL,0x2c65957b2e83a76aL,
30601         0x5d40da8dcddbe0f8L } },
30602     /* 11 << 119 */
30603     { { 0xf2b8c405050bad24L,0x8918426dc2aa4823L,0x2aeab3dda38365a7L,
30604         0x720317177c91b690L },
30605       { 0x8b00d69960a94120L,0x478a255de99eaeecL,0xbf656a5f6f60aafdL,
30606         0xdfd7cb755dee77b3L } },
30607     /* 12 << 119 */
30608     { { 0x37f68bb4a595939dL,0x0355647928740217L,0x8e740e7c84ad7612L,
30609         0xd89bc8439044695fL },
30610       { 0xf7f3da5d85a9184dL,0x562563bb9fc0b074L,0x06d2e6aaf88a888eL,
30611         0x612d8643161fbe7cL } },
30612     /* 13 << 119 */
30613     { { 0x465edba7f64085e7L,0xb230f30429aa8511L,0x53388426cda2d188L,
30614         0x908857354b666649L },
30615       { 0x6f02ff9a652f54f6L,0x65c822945fae2bf0L,0x7816ade062f5eee3L,
30616         0xdcdbdf43fcc56d70L } },
30617     /* 14 << 119 */
30618     { { 0x9fb3bba354530bb2L,0xbde3ef77cb0869eaL,0x89bc90460b431163L,
30619         0x4d03d7d2e4819a35L },
30620       { 0x33ae4f9e43b6a782L,0x216db3079c88a686L,0x91dd88e000ffedd9L,
30621         0xb280da9f12bd4840L } },
30622     /* 15 << 119 */
30623     { { 0x32a7cb8a1635e741L,0xfe14008a78be02a7L,0x3fafb3341b7ae030L,
30624         0x7fd508e75add0ce9L },
30625       { 0x72c83219d607ad51L,0x0f229c0a8d40964aL,0x1be2c3361c878da2L,
30626         0xe0c96742eab2ab86L } },
30627     /* 16 << 119 */
30628     { { 0x458f86913e538cd7L,0xa7001f6c8e08ad53L,0x52b8c6e6bf5d15ffL,
30629         0x548234a4011215ddL },
30630       { 0xff5a9d2d3d5b4045L,0xb0ffeeb64a904190L,0x55a3aca448607f8bL,
30631         0x8cbd665c30a0672aL } },
30632     /* 17 << 119 */
30633     { { 0x87f834e042583068L,0x02da2aebf3f6e683L,0x6b763e5d05c12248L,
30634         0x7230378f65a8aefcL },
30635       { 0x93bd80b571e8e5caL,0x53ab041cb3b62524L,0x1b8605136c9c552eL,
30636         0xe84d402cd5524e66L } },
30637     /* 18 << 119 */
30638     { { 0xa37f3573f37f5937L,0xeb0f6c7dd1e4fca5L,0x2965a554ac8ab0fcL,
30639         0x17fbf56c274676acL },
30640       { 0x2e2f6bd9acf7d720L,0x41fc8f8810224766L,0x517a14b385d53befL,
30641         0xdae327a57d76a7d1L } },
30642     /* 19 << 119 */
30643     { { 0x6ad0a065c4818267L,0x33aa189b37c1bbc1L,0x64970b5227392a92L,
30644         0x21699a1c2d1535eaL },
30645       { 0xcd20779cc2d7a7fdL,0xe318605999c83cf2L,0x9b69440b72c0b8c7L,
30646         0xa81497d77b9e0e4dL } },
30647     /* 20 << 119 */
30648     { { 0x515d5c891f5f82dcL,0x9a7f67d76361079eL,0xa8da81e311a35330L,
30649         0xe44990c44b18be1bL },
30650       { 0xc7d5ed95af103e59L,0xece8aba78dac9261L,0xbe82b0999394b8d3L,
30651         0x6830f09a16adfe83L } },
30652     /* 21 << 119 */
30653     { { 0x250a29b488172d01L,0x8b20bd65caff9e02L,0xb8a7661ee8a6329aL,
30654         0x4520304dd3fce920L },
30655       { 0xae45da1f2b47f7efL,0xe07f52885bffc540L,0xf79970093464f874L,
30656         0x2244c2cda6fa1f38L } },
30657     /* 22 << 119 */
30658     { { 0x43c41ac194d7d9b1L,0x5bafdd82c82e7f17L,0xdf0614c15fda0fcaL,
30659         0x74b043a7a8ae37adL },
30660       { 0x3ba6afa19e71734cL,0x15d5437e9c450f2eL,0x4a5883fe67e242b1L,
30661         0x5143bdc22c1953c2L } },
30662     /* 23 << 119 */
30663     { { 0x542b8b53fc5e8920L,0x363bf9a89a9cee08L,0x02375f10c3486e08L,
30664         0x2037543b8c5e70d2L },
30665       { 0x7109bccc625640b4L,0xcbc1051e8bc62c3bL,0xf8455fed803f26eaL,
30666         0x6badceabeb372424L } },
30667     /* 24 << 119 */
30668     { { 0xa2a9ce7c6b53f5f9L,0x642465951b176d99L,0xb1298d36b95c081bL,
30669         0x53505bb81d9a9ee6L },
30670       { 0x3f6f9e61f2ba70b0L,0xd07e16c98afad453L,0x9f1694bbe7eb4a6aL,
30671         0xdfebced93cb0bc8eL } },
30672     /* 25 << 119 */
30673     { { 0x92d3dcdc53868c8bL,0x174311a2386107a6L,0x4109e07c689b4e64L,
30674         0x30e4587f2df3dcb6L },
30675       { 0x841aea310811b3b2L,0x6144d41d0cce43eaL,0x464c45812a9a7803L,
30676         0xd03d371f3e158930L } },
30677     /* 26 << 119 */
30678     { { 0xc676d7f2b1f3390bL,0x9f7a1b8ca5b61272L,0x4ebebfc9c2e127a9L,
30679         0x4602500c5dd997bfL },
30680       { 0x7f09771c4711230fL,0x058eb37c020f09c1L,0xab693d4bfee5e38bL,
30681         0x9289eb1f4653cbc0L } },
30682     /* 27 << 119 */
30683     { { 0xbecf46abd51b9cf5L,0xd2aa9c029f0121afL,0x36aaf7d2e90dc274L,
30684         0x909e4ea048b95a3cL },
30685       { 0xe6b704966f32dbdbL,0x672188a08b030b3eL,0xeeffe5b3cfb617e2L,
30686         0x87e947de7c82709eL } },
30687     /* 28 << 119 */
30688     { { 0xa44d2b391770f5a7L,0xe4d4d7910e44eb82L,0x42e69d1e3f69712aL,
30689         0xbf11c4d6ac6a820eL },
30690       { 0xb5e7f3e542c4224cL,0xd6b4e81c449d941cL,0x5d72bd165450e878L,
30691         0x6a61e28aee25ac54L } },
30692     /* 29 << 119 */
30693     { { 0x33272094e6f1cd95L,0x7512f30d0d18673fL,0x32f7a4ca5afc1464L,
30694         0x2f0956566bbb977bL },
30695       { 0x586f47caa8226200L,0x02c868ad1ac07369L,0x4ef2b845c613acbeL,
30696         0x43d7563e0386054cL } },
30697     /* 30 << 119 */
30698     { { 0x54da9dc7ab952578L,0xb5423df226e84d0bL,0xa8b64eeb9b872042L,
30699         0xac2057825990f6dfL },
30700       { 0x4ff696eb21f4c77aL,0x1a79c3e4aab273afL,0x29bc922e9436b3f1L,
30701         0xff807ef8d6d9a27aL } },
30702     /* 31 << 119 */
30703     { { 0x82acea3d778f22a0L,0xfb10b2e85b5e7469L,0xc0b169802818ee7dL,
30704         0x011afff4c91c1a2fL },
30705       { 0x95a6d126ad124418L,0x31c081a5e72e295fL,0x36bb283af2f4db75L,
30706         0xd115540f7acef462L } },
30707     /* 32 << 119 */
30708     { { 0xc7f3a8f833f6746cL,0x21e46f65fea990caL,0x915fd5c5caddb0a9L,
30709         0xbd41f01678614555L },
30710       { 0x346f4434426ffb58L,0x8055943614dbc204L,0xf3dd20fe5a969b7fL,
30711         0x9d59e956e899a39aL } },
30712     /* 33 << 119 */
30713     { { 0xf1b0971c8ad4cf4bL,0x034488602ffb8fb8L,0xf071ac3c65340ba4L,
30714         0x408d0596b27fd758L },
30715       { 0xe7c78ea498c364b0L,0xa4aac4a5051e8ab5L,0xb9e1d560485d9002L,
30716         0x9acd518a88844455L } },
30717     /* 34 << 119 */
30718     { { 0xe4ca688fd06f56c0L,0xa48af70ddf027972L,0x691f0f045e9a609dL,
30719         0xa9dd82cdee61270eL },
30720       { 0x8903ca63a0ef18d3L,0x9fb7ee353d6ca3bdL,0xa7b4a09cabf47d03L,
30721         0x4cdada011c67de8eL } },
30722     /* 35 << 119 */
30723     { { 0x520037499355a244L,0xe77fd2b64f2151a9L,0x695d6cf666b4efcbL,
30724         0xc5a0cacfda2cfe25L },
30725       { 0x104efe5cef811865L,0xf52813e89ea5cc3dL,0x855683dc40b58dbcL,
30726         0x0338ecde175fcb11L } },
30727     /* 36 << 119 */
30728     { { 0xf9a0563774921592L,0xb4f1261db9bb9d31L,0x551429b74e9c5459L,
30729         0xbe182e6f6ea71f53L },
30730       { 0xd3a3b07cdfc50573L,0x9ba1afda62be8d44L,0x9bcfd2cb52ab65d3L,
30731         0xdf11d547a9571802L } },
30732     /* 37 << 119 */
30733     { { 0x099403ee02a2404aL,0x497406f421088a71L,0x994794095004ae71L,
30734         0xbdb42078a812c362L },
30735       { 0x2b72a30fd8828442L,0x283add27fcb5ed1cL,0xf7c0e20066a40015L,
30736         0x3e3be64108b295efL } },
30737     /* 38 << 119 */
30738     { { 0xac127dc1e038a675L,0x729deff38c5c6320L,0xb7df8fd4a90d2c53L,
30739         0x9b74b0ec681e7cd3L },
30740       { 0x5cb5a623dab407e5L,0xcdbd361576b340c6L,0xa184415a7d28392cL,
30741         0xc184c1d8e96f7830L } },
30742     /* 39 << 119 */
30743     { { 0xc3204f1981d3a80fL,0xfde0c841c8e02432L,0x78203b3e8149e0c1L,
30744         0x5904bdbb08053a73L },
30745       { 0x30fc1dd1101b6805L,0x43c223bc49aa6d49L,0x9ed671417a174087L,
30746         0x311469a0d5997008L } },
30747     /* 40 << 119 */
30748     { { 0xb189b6845e43fc61L,0xf3282375e0d3ab57L,0x4fa34b67b1181da8L,
30749         0x621ed0b299ee52b8L },
30750       { 0x9b178de1ad990676L,0xd51de67b56d54065L,0x2a2c27c47538c201L,
30751         0x33856ec838a40f5cL } },
30752     /* 41 << 119 */
30753     { { 0x2522fc15be6cdcdeL,0x1e603f339f0c6f89L,0x7994edc3103e30a6L,
30754         0x033a00db220c853eL },
30755       { 0xd3cfa409f7bb7fd7L,0x70f8781e462d18f6L,0xbbd82980687fe295L,
30756         0x6eef4c32595669f3L } },
30757     /* 42 << 119 */
30758     { { 0x86a9303b2f7e85c3L,0x5fce462171988f9bL,0x5b935bf6c138acb5L,
30759         0x30ea7d6725661212L },
30760       { 0xef1eb5f4e51ab9a2L,0x0587c98aae067c78L,0xb3ce1b3c77ca9ca6L,
30761         0x2a553d4d54b5f057L } },
30762     /* 43 << 119 */
30763     { { 0xc78982364da29ec2L,0xdbdd5d13b9c57316L,0xc57d6e6b2cd80d47L,
30764         0x80b460cffe9e7391L },
30765       { 0x98648cabf963c31eL,0x67f9f633cc4d32fdL,0x0af42a9dfdf7c687L,
30766         0x55f292a30b015ea7L } },
30767     /* 44 << 119 */
30768     { { 0x89e468b2cd21ab3dL,0xe504f022c393d392L,0xab21e1d4a5013af9L,
30769         0xe3283f78c2c28acbL },
30770       { 0xf38b35f6226bf99fL,0xe83542740e291e69L,0x61673a15b20c162dL,
30771         0xc101dc75b04fbdbeL } },
30772     /* 45 << 119 */
30773     { { 0x8323b4c2255bd617L,0x6c9696936c2a9154L,0xc6e6586062679387L,
30774         0x8e01db0cb8c88e23L },
30775       { 0x33c42873893a5559L,0x7630f04b47a3e149L,0xb5d80805ddcf35f8L,
30776         0x582ca08077dfe732L } },
30777     /* 46 << 119 */
30778     { { 0x2c7156e10b1894a0L,0x92034001d81c68c0L,0xed225d00c8b115b5L,
30779         0x237f9c2283b907f2L },
30780       { 0x0ea2f32f4470e2c0L,0xb725f7c158be4e95L,0x0f1dcafab1ae5463L,
30781         0x59ed51871ba2fc04L } },
30782     /* 47 << 119 */
30783     { { 0xf6e0f316d0115d4dL,0x5180b12fd3691599L,0x157e32c9527f0a41L,
30784         0x7b0b081da8e0ecc0L },
30785       { 0x6dbaaa8abf4f0dd0L,0x99b289c74d252696L,0x79b7755edbf864feL,
30786         0x6974e2b176cad3abL } },
30787     /* 48 << 119 */
30788     { { 0x35dbbee206ddd657L,0xe7cbdd112ff3a96dL,0x88381968076be758L,
30789         0x2d737e7208c91f5dL },
30790       { 0x5f83ab6286ec3776L,0x98aa649d945fa7a1L,0xf477ec3772ef0933L,
30791         0x66f52b1e098c17b1L } },
30792     /* 49 << 119 */
30793     { { 0x9eec58fbd803738bL,0x91aaade7e4e86aa4L,0x6b1ae617a5b51492L,
30794         0x63272121bbc45974L },
30795       { 0x7e0e28f0862c5129L,0x0a8f79a93321a4a0L,0xe26d16645041c88fL,
30796         0x0571b80553233e3aL } },
30797     /* 50 << 119 */
30798     { { 0xd1b0ccdec9520711L,0x55a9e4ed3c8b84bfL,0x9426bd39a1fef314L,
30799         0x4f5f638e6eb93f2bL },
30800       { 0xba2a1ed32bf9341bL,0xd63c13214d42d5a9L,0xd2964a89316dc7c5L,
30801         0xd1759606ca511851L } },
30802     /* 51 << 119 */
30803     { { 0xd8a9201ff9e6ed35L,0xb7b5ee456736925aL,0x0a83fbbc99581af7L,
30804         0x3076bc4064eeb051L },
30805       { 0x5511c98c02dec312L,0x270de898238dcb78L,0x2cf4cf9c539c08c9L,
30806         0xa70cb65e38d3b06eL } },
30807     /* 52 << 119 */
30808     { { 0xb12ec10ecfe57bbdL,0x82c7b65635a0c2b5L,0xddc7d5cd161c67bdL,
30809         0xe32e8985ae3a32ccL },
30810       { 0x7aba9444d11a5529L,0xe964ed022427fa1aL,0x1528392d24a1770aL,
30811         0xa152ce2c12c72fcdL } },
30812     /* 53 << 119 */
30813     { { 0x714553a48ec07649L,0x18b4c290459dd453L,0xea32b7147b64b110L,
30814         0xb871bfa52e6f07a2L },
30815       { 0xb67112e59e2e3c9bL,0xfbf250e544aa90f6L,0xf77aedb8bd539006L,
30816         0x3b0cdf9ad172a66fL } },
30817     /* 54 << 119 */
30818     { { 0xedf69feaf8c51187L,0x05bb67ec741e4da7L,0x47df0f3208114345L,
30819         0x56facb07bb9792b1L },
30820       { 0xf3e007e98f6229e4L,0x62d103f4526fba0fL,0x4f33bef7b0339d79L,
30821         0x9841357bb59bfec1L } },
30822     /* 55 << 119 */
30823     { { 0xfa8dbb59c34e6705L,0xc3c7180b7fdaa84cL,0xf95872fca4108537L,
30824         0x8750cc3b932a3e5aL },
30825       { 0xb61cc69db7275d7dL,0xffa0168b2e59b2e9L,0xca032abc6ecbb493L,
30826         0x1d86dbd32c9082d8L } },
30827     /* 56 << 119 */
30828     { { 0xae1e0b67e28ef5baL,0x2c9a4699cb18e169L,0x0ecd0e331e6bbd20L,
30829         0x571b360eaf5e81d2L },
30830       { 0xcd9fea58101c1d45L,0x6651788e18880452L,0xa99726351f8dd446L,
30831         0x44bed022e37281d0L } },
30832     /* 57 << 119 */
30833     { { 0x094b2b2d33da525dL,0xf193678e13144fd8L,0xb8ab5ba4f4c1061dL,
30834         0x4343b5fadccbe0f4L },
30835       { 0xa870237163812713L,0x47bf6d2df7611d93L,0x46729b8cbd21e1d7L,
30836         0x7484d4e0d629e77dL } },
30837     /* 58 << 119 */
30838     { { 0x830e6eea60dbac1fL,0x23d8c484da06a2f7L,0x896714b050ca535bL,
30839         0xdc8d3644ebd97a9bL },
30840       { 0x106ef9fab12177b4L,0xf79bf464534d5d9cL,0x2537a349a6ab360bL,
30841         0xc7c54253a00c744fL } },
30842     /* 59 << 119 */
30843     { { 0xb3c7a047e5911a76L,0x61ffa5c8647f1ee7L,0x15aed36f8f56ab42L,
30844         0x6a0d41b0a3ff9ac9L },
30845       { 0x68f469f5cc30d357L,0xbe9adf816b72be96L,0x1cd926fe903ad461L,
30846         0x7e89e38fcaca441bL } },
30847     /* 60 << 119 */
30848     { { 0xf0f82de5facf69d4L,0x363b7e764775344cL,0x6894f312b2e36d04L,
30849         0x3c6cb4fe11d1c9a5L },
30850       { 0x85d9c3394008e1f2L,0x5e9a85ea249f326cL,0xdc35c60a678c5e06L,
30851         0xc08b944f9f86fba9L } },
30852     /* 61 << 119 */
30853     { { 0xde40c02c89f71f0fL,0xad8f3e31ff3da3c0L,0x3ea5096b42125dedL,
30854         0x13879cbfa7379183L },
30855       { 0x6f4714a56b306a0bL,0x359c2ea667646c5eL,0xfacf894307726368L,
30856         0x07a5893565ff431eL } },
30857     /* 62 << 119 */
30858     { { 0x24d661d168754ab0L,0x801fce1d6f429a76L,0xc068a85fa58ce769L,
30859         0xedc35c545d5eca2bL },
30860       { 0xea31276fa3f660d1L,0xa0184ebeb8fc7167L,0x0f20f21a1d8db0aeL,
30861         0xd96d095f56c35e12L } },
30862     /* 63 << 119 */
30863     { { 0xedf402b5f8c2a25bL,0x1bb772b9059204b6L,0x50cbeae219b4e34cL,
30864         0x93109d803fa0845aL },
30865       { 0x54f7ccf78ef59fb5L,0x3b438fe288070963L,0x9e28c65931f3ba9bL,
30866         0x9cc31b46ead9da92L } },
30867     /* 64 << 119 */
30868     { { 0x3c2f0ba9b733aa5fL,0xdece47cbf05af235L,0xf8e3f715a2ac82a5L,
30869         0xc97ba6412203f18aL },
30870       { 0xc3af550409c11060L,0x56ea2c0546af512dL,0xfac28daff3f28146L,
30871         0x87fab43a959ef494L } },
30872     /* 0 << 126 */
30873     { { 0x00, 0x00, 0x00, 0x00 },
30874       { 0x00, 0x00, 0x00, 0x00 } },
30875     /* 1 << 126 */
30876     { { 0x09891641d4c5105fL,0x1ae80f8e6d7fbd65L,0x9d67225fbee6bdb0L,
30877         0x3b433b597fc4d860L },
30878       { 0x44e66db693e85638L,0xf7b59252e3e9862fL,0xdb785157665c32ecL,
30879         0x702fefd7ae362f50L } },
30880     /* 2 << 126 */
30881     { { 0x3754475d0fefb0c3L,0xd48fb56b46d7c35dL,0xa070b633363798a4L,
30882         0xae89f3d28fdb98e6L },
30883       { 0x970b89c86363d14cL,0x8981752167abd27dL,0x9bf7d47444d5a021L,
30884         0xb3083bafcac72aeeL } },
30885     /* 3 << 126 */
30886     { { 0x389741debe949a44L,0x638e9388546a4fa5L,0x3fe6419ca0047bdcL,
30887         0x7047f648aaea57caL },
30888       { 0x54e48a9041fbab17L,0xda8e0b28576bdba2L,0xe807eebcc72afddcL,
30889         0x07d3336df42577bfL } },
30890     /* 4 << 126 */
30891     { { 0x62a8c244bfe20925L,0x91c19ac38fdce867L,0x5a96a5d5dd387063L,
30892         0x61d587d421d324f6L },
30893       { 0xe87673a2a37173eaL,0x2384800853778b65L,0x10f8441e05bab43eL,
30894         0xfa11fe124621efbeL } },
30895     /* 5 << 126 */
30896     { { 0x047b772e81685d7bL,0x23f27d81bf34a976L,0xc27608e2915f48efL,
30897         0x3b0b43faa521d5c3L },
30898       { 0x7613fb2663ca7284L,0x7f5729b41d4db837L,0x87b14898583b526bL,
30899         0x00b732a6bbadd3d1L } },
30900     /* 6 << 126 */
30901     { { 0x8e02f4262048e396L,0x436b50b6383d9de4L,0xf78d3481471e85adL,
30902         0x8b01ea6ad005c8d6L },
30903       { 0xd3c7afee97015c07L,0x46cdf1a94e3ba2aeL,0x7a42e50183d3a1d2L,
30904         0xd54b5268b541dff4L } },
30905     /* 7 << 126 */
30906     { { 0x3f24cf304e23e9bcL,0x4387f816126e3624L,0x26a46a033b0b6d61L,
30907         0xaf1bc8458b2d777cL },
30908       { 0x25c401ba527de79cL,0x0e1346d44261bbb6L,0x4b96c44b287b4bc7L,
30909         0x658493c75254562fL } },
30910     /* 8 << 126 */
30911     { { 0x23f949feb8a24a20L,0x17ebfed1f52ca53fL,0x9b691bbebcfb4853L,
30912         0x5617ff6b6278a05dL },
30913       { 0x241b34c5e3c99ebdL,0xfc64242e1784156aL,0x4206482f695d67dfL,
30914         0xb967ce0eee27c011L } },
30915     /* 9 << 126 */
30916     { { 0x65db375121c80b5dL,0x2e7a563ca31ecca0L,0xe56ffc4e5238a07eL,
30917         0x3d6c296632ced854L },
30918       { 0xe99d7d1aaf70b885L,0xafc3bad92d686459L,0x9c78bf460cc8ba5bL,
30919         0x5a43951918955aa3L } },
30920     /* 10 << 126 */
30921     { { 0xf8b517a85fe4e314L,0xe60234d0fcb8906fL,0xffe542acf2061b23L,
30922         0x287e191f6b4cb59cL },
30923       { 0x21857ddc09d877d8L,0x1c23478c14678941L,0xbbf0c056b6e05ea4L,
30924         0x82da4b53b01594feL } },
30925     /* 11 << 126 */
30926     { { 0xf7526791fadb8608L,0x049e832d7b74cdf6L,0xa43581ccc2b90a34L,
30927         0x73639eb89360b10cL },
30928       { 0x4fba331fe1e4a71bL,0x6ffd6b938072f919L,0x6e53271c65679032L,
30929         0x67206444f14272ceL } },
30930     /* 12 << 126 */
30931     { { 0xc0f734a3b2335834L,0x9526205a90ef6860L,0xcb8be71704e2bb0dL,
30932         0x2418871e02f383faL },
30933       { 0xd71776814082c157L,0xcc914ad029c20073L,0xf186c1ebe587e728L,
30934         0x6fdb3c2261bcd5fdL } },
30935     /* 13 << 126 */
30936     { { 0x30d014a6f2f9f8e9L,0x963ece234fec49d2L,0x862025c59605a8d9L,
30937         0x3987444519f8929aL },
30938       { 0x01b6ff6512bf476aL,0x598a64d809cf7d91L,0xd7ec774993be56caL,
30939         0x10899785cbb33615L } },
30940     /* 14 << 126 */
30941     { { 0xb8a092fd02eee3adL,0xa86b3d3530145270L,0x323d98c68512b675L,
30942         0x4b8bc78562ebb40fL },
30943       { 0x7d301f54413f9cdeL,0xa5e4fb4f2bab5664L,0x1d2b252d1cbfec23L,
30944         0xfcd576bbe177120dL } },
30945     /* 15 << 126 */
30946     { { 0x04427d3e83731a34L,0x2bb9028eed836e8eL,0xb36acff8b612ca7cL,
30947         0xb88fe5efd3d9c73aL },
30948       { 0xbe2a6bc6edea4eb3L,0x43b93133488eec77L,0xf41ff566b17106e1L,
30949         0x469e9172654efa32L } },
30950     /* 16 << 126 */
30951     { { 0xb4480f0441c23fa3L,0xb4712eb0c1989a2eL,0x3ccbba0f93a29ca7L,
30952         0x6e205c14d619428cL },
30953       { 0x90db7957b3641686L,0x0432691d45ac8b4eL,0x07a759acf64e0350L,
30954         0x0514d89c9c972517L } },
30955     /* 17 << 126 */
30956     { { 0x1701147fa8e67fc3L,0x9e2e0b8bab2085beL,0xd5651824ac284e57L,
30957         0x890d432574893664L },
30958       { 0x8a7c5e6ec55e68a3L,0xbf12e90b4339c85aL,0x31846b85f922b655L,
30959         0x9a54ce4d0bf4d700L } },
30960     /* 18 << 126 */
30961     { { 0xd7f4e83af1a14295L,0x916f955cb285d4f9L,0xe57bb0e099ffdabaL,
30962         0x28a43034eab0d152L },
30963       { 0x0a36ffa2b8a9cef8L,0x5517407eb9ec051aL,0x9c796096ea68e672L,
30964         0x853db5fbfb3c77fbL } },
30965     /* 19 << 126 */
30966     { { 0x21474ba9e864a51aL,0x6c2676996e8a1b8bL,0x7c82362694120a28L,
30967         0xe61e9a488383a5dbL },
30968       { 0x7dd750039f84216dL,0xab020d07ad43cd85L,0x9437ae48da12c659L,
30969         0x6449c2ebe65452adL } },
30970     /* 20 << 126 */
30971     { { 0xcc7c4c1c2cf9d7c1L,0x1320886aee95e5abL,0xbb7b9056beae170cL,
30972         0xc8a5b250dbc0d662L },
30973       { 0x4ed81432c11d2303L,0x7da669121f03769fL,0x3ac7a5fd84539828L,
30974         0x14dada943bccdd02L } },
30975     /* 21 << 126 */
30976     { { 0x8b84c3217ef6b0d1L,0x52a9477a7c933f22L,0x5ef6728afd440b82L,
30977         0x5c3bd8596ce4bd5eL },
30978       { 0x918b80f5f22c2d3eL,0x368d5040b7bb6cc5L,0xb66142a12695a11cL,
30979         0x60ac583aeb19ea70L } },
30980     /* 22 << 126 */
30981     { { 0x317cbb980eab2437L,0x8cc08c555e2654c8L,0xfe2d6520e6d8307fL,
30982         0xe9f147f357428993L },
30983       { 0x5f9c7d14d2fd6cf1L,0xa3ecd0642d4fcbb0L,0xad83fef08e7341f7L,
30984         0x643f23a03a63115cL } },
30985     /* 23 << 126 */
30986     { { 0xd38a78abe65ab743L,0xbf7c75b135edc89cL,0x3dd8752e530df568L,
30987         0xf85c4a76e308c682L },
30988       { 0x4c9955b2e68acf37L,0xa544df3dab32af85L,0x4b8ec3f5a25cf493L,
30989         0x4d8f27641a622febL } },
30990     /* 24 << 126 */
30991     { { 0x7bb4f7aaf0dcbc49L,0x7de551f970bbb45bL,0xcfd0f3e49f2ca2e5L,
30992         0xece587091f5c76efL },
30993       { 0x32920edd167d79aeL,0x039df8a2fa7d7ec1L,0xf46206c0bb30af91L,
30994         0x1ff5e2f522676b59L } },
30995     /* 25 << 126 */
30996     { { 0x11f4a0396ea51d66L,0x506c1445807d7a26L,0x60da5705755a9b24L,
30997         0x8fc8cc321f1a319eL },
30998       { 0x83642d4d9433d67dL,0x7fa5cb8f6a7dd296L,0x576591db9b7bde07L,
30999         0x13173d25419716fbL } },
31000     /* 26 << 126 */
31001     { { 0xea30599dd5b340ffL,0xfc6b5297b0fe76c5L,0x1c6968c8ab8f5adcL,
31002         0xf723c7f5901c928dL },
31003       { 0x4203c3219773d402L,0xdf7c6aa31b51dd47L,0x3d49e37a552be23cL,
31004         0x57febee80b5a6e87L } },
31005     /* 27 << 126 */
31006     { { 0xc5ecbee47bd8e739L,0x79d44994ae63bf75L,0x168bd00f38fb8923L,
31007         0x75d48ee4d0533130L },
31008       { 0x554f77aadb5cdf33L,0x3396e8963c696769L,0x2fdddbf2d3fd674eL,
31009         0xbbb8f6ee99d0e3e5L } },
31010     /* 28 << 126 */
31011     { { 0x51b90651cbae2f70L,0xefc4bc0593aaa8ebL,0x8ecd8689dd1df499L,
31012         0x1aee99a822f367a5L },
31013       { 0x95d485b9ae8274c5L,0x6c14d4457d30b39cL,0xbafea90bbcc1ef81L,
31014         0x7c5f317aa459a2edL } },
31015     /* 29 << 126 */
31016     { { 0x012110754ef44227L,0xa17bed6edc20f496L,0x0cdfe424819853cdL,
31017         0x13793298f71e2ce7L },
31018       { 0x3c1f3078dbbe307bL,0x6dd1c20e76ee9936L,0x23ee4b57423caa20L,
31019         0x4ac3793b8efb840eL } },
31020     /* 30 << 126 */
31021     { { 0x934438ebed1f8ca0L,0x3e5466584ebb25a2L,0xc415af0ec069896fL,
31022         0xc13eddb09a5aa43dL },
31023       { 0x7a04204fd49eb8f6L,0xd0d5bdfcd74f1670L,0x3697e28656fc0558L,
31024         0x1020737101cebadeL } },
31025     /* 31 << 126 */
31026     { { 0x5f87e6900647a82bL,0x908e0ed48f40054fL,0xa9f633d479853803L,
31027         0x8ed13c9a4a28b252L },
31028       { 0x3e2ef6761f460f64L,0x53930b9b36d06336L,0x347073ac8fc4979bL,
31029         0x84380e0e5ecd5597L } },
31030     /* 32 << 126 */
31031     { { 0xe3b22c6bc4fe3c39L,0xba4a81536c7bebdfL,0xf23ab6b725693459L,
31032         0x53bc377014922b11L },
31033       { 0x4645c8ab5afc60dbL,0xaa02235520b9f2a3L,0x52a2954cce0fc507L,
31034         0x8c2731bb7ce1c2e7L } },
31035     /* 33 << 126 */
31036     { { 0xf39608ab18a0339dL,0xac7a658d3735436cL,0xb22c2b07cd992b4fL,
31037         0x4e83daecf40dcfd4L },
31038       { 0x8a34c7be2f39ea3eL,0xef0c005fb0a56d2eL,0x62731f6a6edd8038L,
31039         0x5721d7404e3cb075L } },
31040     /* 34 << 126 */
31041     { { 0x1ea41511fbeeee1bL,0xd1ef5e73ef1d0c05L,0x42feefd173c07d35L,
31042         0xe530a00a8a329493L },
31043       { 0x5d55b7fef15ebfb0L,0x549de03cd322491aL,0xf7b5f602745b3237L,
31044         0x3632a3a21ab6e2b6L } },
31045     /* 35 << 126 */
31046     { { 0x0d3bba890ef59f78L,0x0dfc6443c9e52b9aL,0x1dc7969972631447L,
31047         0xef033917b3be20b1L },
31048       { 0x0c92735db1383948L,0xc1fc29a2c0dd7d7dL,0x6485b697403ed068L,
31049         0x13bfaab3aac93bdcL } },
31050     /* 36 << 126 */
31051     { { 0x410dc6a90deeaf52L,0xb003fb024c641c15L,0x1384978c5bc504c4L,
31052         0x37640487864a6a77L },
31053       { 0x05991bc6222a77daL,0x62260a575e47eb11L,0xc7af6613f21b432cL,
31054         0x22f3acc9ab4953e9L } },
31055     /* 37 << 126 */
31056     { { 0x529349228e41d155L,0x4d0245683ac059efL,0xb02017554d884411L,
31057         0xce8055cfa59a178fL },
31058       { 0xcd77d1aff6204549L,0xa0a00a3ec7066759L,0x471071ef0272c229L,
31059         0x009bcf6bd3c4b6b0L } },
31060     /* 38 << 126 */
31061     { { 0x2a2638a822305177L,0xd51d59df41645bbfL,0xa81142fdc0a7a3c0L,
31062         0xa17eca6d4c7063eeL },
31063       { 0x0bb887ed60d9dcecL,0xd6d28e5120ad2455L,0xebed6308a67102baL,
31064         0x042c31148bffa408L } },
31065     /* 39 << 126 */
31066     { { 0xfd099ac58aa68e30L,0x7a6a3d7c1483513eL,0xffcc6b75ba2d8f0cL,
31067         0x54dacf961e78b954L },
31068       { 0xf645696fa4a9af89L,0x3a41194006ac98ecL,0x41b8b3f622a67a20L,
31069         0x2d0b1e0f99dec626L } },
31070     /* 40 << 126 */
31071     { { 0x27c8919240be34e8L,0xc7162b3791907f35L,0x90188ec1a956702bL,
31072         0xca132f7ddf93769cL },
31073       { 0x3ece44f90e2025b4L,0x67aaec690c62f14cL,0xad74141822e3cc11L,
31074         0xcf9b75c37ff9a50eL } },
31075     /* 41 << 126 */
31076     { { 0x02fa2b164d348272L,0xbd99d61a9959d56dL,0xbc4f19db18762916L,
31077         0xcc7cce5049c1ac80L },
31078       { 0x4d59ebaad846bd83L,0x8775a9dca9202849L,0x07ec4ae16e1f4ca9L,
31079         0x27eb5875ba893f11L } },
31080     /* 42 << 126 */
31081     { { 0x00284d51662cc565L,0x82353a6b0db4138dL,0xd9c7aaaaaa32a594L,
31082         0xf5528b5ea5669c47L },
31083       { 0xf32202312f23c5ffL,0xe3e8147a6affa3a1L,0xfb423d5c202ddda0L,
31084         0x3d6414ac6b871bd4L } },
31085     /* 43 << 126 */
31086     { { 0x586f82e1a51a168aL,0xb712c67148ae5448L,0x9a2e4bd176233eb8L,
31087         0x0188223a78811ca9L },
31088       { 0x553c5e21f7c18de1L,0x7682e451b27bb286L,0x3ed036b30e51e929L,
31089         0xf487211bec9cb34fL } },
31090     /* 44 << 126 */
31091     { { 0x0d0942770c24efc8L,0x0349fd04bef737a4L,0x6d1c9dd2514cdd28L,
31092         0x29c135ff30da9521L },
31093       { 0xea6e4508f78b0b6fL,0x176f5dd2678c143cL,0x081484184be21e65L,
31094         0x27f7525ce7df38c4L } },
31095     /* 45 << 126 */
31096     { { 0x1fb70e09748ab1a4L,0x9cba50a05efe4433L,0x7846c7a615f75af2L,
31097         0x2a7c2c575ee73ea8L },
31098       { 0x42e566a43f0a449aL,0x45474c3bad90fc3dL,0x7447be3d8b61d057L,
31099         0x3e9d1cf13a4ec092L } },
31100     /* 46 << 126 */
31101     { { 0x1603e453f380a6e6L,0x0b86e4319b1437c2L,0x7a4173f2ef29610aL,
31102         0x8fa729a7f03d57f7L },
31103       { 0x3e186f6e6c9c217eL,0xbe1d307991919524L,0x92a62a70153d4fb1L,
31104         0x32ed3e34d68c2f71L } },
31105     /* 47 << 126 */
31106     { { 0xd785027f9eb1a8b7L,0xbc37eb77c5b22fe8L,0x466b34f0b9d6a191L,
31107         0x008a89af9a05f816L },
31108       { 0x19b028fb7d42c10aL,0x7fe8c92f49b3f6b8L,0x58907cc0a5a0ade3L,
31109         0xb3154f51559d1a7cL } },
31110     /* 48 << 126 */
31111     { { 0x5066efb6d9790ed6L,0xa77a0cbca6aa793bL,0x1a915f3c223e042eL,
31112         0x1c5def0469c5874bL },
31113       { 0x0e83007873b6c1daL,0x55cf85d2fcd8557aL,0x0f7c7c760460f3b1L,
31114         0x87052acb46e58063L } },
31115     /* 49 << 126 */
31116     { { 0x09212b80907eae66L,0x3cb068e04d721c89L,0xa87941aedd45ac1cL,
31117         0xde8d5c0d0daa0dbbL },
31118       { 0xda421fdce3502e6eL,0xc89442014d89a084L,0x7307ba5ef0c24bfbL,
31119         0xda212beb20bde0efL } },
31120     /* 50 << 126 */
31121     { { 0xea2da24bf82ce682L,0x058d381607f71fe4L,0x35a024625ffad8deL,
31122         0xcd7b05dcaadcefabL },
31123       { 0xd442f8ed1d9f54ecL,0x8be3d618b2d3b5caL,0xe2220ed0e06b2ce2L,
31124         0x82699a5f1b0da4c0L } },
31125     /* 51 << 126 */
31126     { { 0x3ff106f571c0c3a7L,0x8f580f5a0d34180cL,0x4ebb120e22d7d375L,
31127         0x5e5782cce9513675L },
31128       { 0x2275580c99c82a70L,0xe8359fbf15ea8c4cL,0x53b48db87b415e70L,
31129         0xaacf2240100c6014L } },
31130     /* 52 << 126 */
31131     { { 0x9faaccf5e4652f1dL,0xbd6fdd2ad56157b2L,0xa4f4fb1f6261ec50L,
31132         0x244e55ad476bcd52L },
31133       { 0x881c9305047d320bL,0x1ca983d56181263fL,0x354e9a44278fb8eeL,
31134         0xad2dbc0f396e4964L } },
31135     /* 53 << 126 */
31136     { { 0x723f3aa29268b3deL,0x0d1ca29ae6e0609aL,0x794866aa6cf44252L,
31137         0x0b59f3e301af87edL },
31138       { 0xe234e5ff7f4a6c51L,0xa8768fd261dc2f7eL,0xdafc73320a94d81fL,
31139         0xd7f8428206938ce1L } },
31140     /* 54 << 126 */
31141     { { 0xae0b3c0e0546063eL,0x7fbadcb25d61abc6L,0xd5d7a2c9369ac400L,
31142         0xa5978d09ae67d10cL },
31143       { 0x290f211e4f85eaacL,0xe61e2ad1facac681L,0xae125225388384cdL,
31144         0xa7fb68e9ccfde30fL } },
31145     /* 55 << 126 */
31146     { { 0x7a59b9363daed4c2L,0x80a9aa402606f789L,0xb40c1ea5f6a6d90aL,
31147         0x948364d3514d5885L },
31148       { 0x062ebc6070985182L,0xa6db5b0e33310895L,0x64a12175e329c2f5L,
31149         0xc5f25bd290ea237eL } },
31150     /* 56 << 126 */
31151     { { 0x7915c5242d0a4c23L,0xeb5d26e46bb3cc52L,0x369a9116c09e2c92L,
31152         0x0c527f92cf182cf8L },
31153       { 0x9e5919382aede0acL,0xb29222086cc34939L,0x3c9d896299a34361L,
31154         0x3c81836dc1905fe6L } },
31155     /* 57 << 126 */
31156     { { 0x4bfeb57fa001ec5aL,0xe993f5bba0dc5dbaL,0x47884109724a1380L,
31157         0x8a0369ab32fe9a04L },
31158       { 0xea068d608c927db8L,0xbf5f37cf94655741L,0x47d402a204b6c7eaL,
31159         0x4551c2956af259cbL } },
31160     /* 58 << 126 */
31161     { { 0x698b71e7ed77ee8bL,0xbddf7bd0f309d5c7L,0x6201c22c34e780caL,
31162         0xab04f7d84c295ef4L },
31163       { 0x1c9472944313a8ceL,0xe532e4ac92ca4cfeL,0x89738f80d0a7a97aL,
31164         0xec088c88a580fd5bL } },
31165     /* 59 << 126 */
31166     { { 0x612b1ecc42ce9e51L,0x8f9840fdb25fdd2aL,0x3cda78c001e7f839L,
31167         0x546b3d3aece05480L },
31168       { 0x271719a980d30916L,0x45497107584c20c4L,0xaf8f94785bc78608L,
31169         0x28c7d484277e2a4cL } },
31170     /* 60 << 126 */
31171     { { 0xfce0176788a2ffe4L,0xdc506a3528e169a5L,0x0ea108617af9c93aL,
31172         0x1ed2436103fa0e08L },
31173       { 0x96eaaa92a3d694e7L,0xc0f43b4def50bc74L,0xce6aa58c64114db4L,
31174         0x8218e8ea7c000fd4L } },
31175     /* 61 << 126 */
31176     { { 0xac815dfb185f8844L,0xcd7e90cb1557abfbL,0x23d16655afbfecdfL,
31177         0x80f3271f085cac4aL },
31178       { 0x7fc39aa7d0e62f47L,0x88d519d1460a48e5L,0x59559ac4d28f101eL,
31179         0x7981d9e9ca9ae816L } },
31180     /* 62 << 126 */
31181     { { 0x5c38652c9ac38203L,0x86eaf87f57657fe5L,0x568fc472e21f5416L,
31182         0x2afff39ce7e597b5L },
31183       { 0x3adbbb07256d4eabL,0x225986928285ab89L,0x35f8112a041caefeL,
31184         0x95df02e3a5064c8bL } },
31185     /* 63 << 126 */
31186     { { 0x4d63356ec7004bf3L,0x230a08f4db83c7deL,0xca27b2708709a7b7L,
31187         0x0d1c4cc4cb9abd2dL },
31188       { 0x8a0bc66e7550fee8L,0x369cd4c79cf7247eL,0x75562e8492b5b7e7L,
31189         0x8fed0da05802af7bL } },
31190     /* 64 << 126 */
31191     { { 0x6a7091c2e48fb889L,0x26882c137b8a9d06L,0xa24986631b82a0e2L,
31192         0x844ed7363518152dL },
31193       { 0x282f476fd86e27c7L,0xa04edaca04afefdcL,0x8b256ebc6119e34dL,
31194         0x56a413e90787d78bL } },
31195     /* 0 << 133 */
31196     { { 0x00, 0x00, 0x00, 0x00 },
31197       { 0x00, 0x00, 0x00, 0x00 } },
31198     /* 1 << 133 */
31199     { { 0x82ee061d5a74be50L,0xe41781c4dea16ff5L,0xe0b0c81e99bfc8a2L,
31200         0x624f4d690b547e2dL },
31201       { 0x3a83545dbdcc9ae4L,0x2573dbb6409b1e8eL,0x482960c4a6c93539L,
31202         0xf01059ad5ae18798L } },
31203     /* 2 << 133 */
31204     { { 0x715c9f973112795fL,0xe8244437984e6ee1L,0x55cb4858ecb66bcdL,
31205         0x7c136735abaffbeeL },
31206       { 0x546615955dbec38eL,0x51c0782c388ad153L,0x9ba4c53ac6e0952fL,
31207         0x27e6782a1b21dfa8L } },
31208     /* 3 << 133 */
31209     { { 0x682f903d4ed2dbc2L,0x0eba59c87c3b2d83L,0x8e9dc84d9c7e9335L,
31210         0x5f9b21b00eb226d7L },
31211       { 0xe33bd394af267baeL,0xaa86cc25be2e15aeL,0x4f0bf67d6a8ec500L,
31212         0x5846aa44f9630658L } },
31213     /* 4 << 133 */
31214     { { 0xfeb09740e2c2bf15L,0x627a2205a9e99704L,0xec8d73d0c2fbc565L,
31215         0x223eed8fc20c8de8L },
31216       { 0x1ee32583a8363b49L,0x1a0b6cb9c9c2b0a6L,0x49f7c3d290dbc85cL,
31217         0xa8dfbb971ef4c1acL } },
31218     /* 5 << 133 */
31219     { { 0xafb34d4c65c7c2abL,0x1d4610e7e2c5ea84L,0x893f6d1b973c4ab5L,
31220         0xa3cdd7e9945ba5c4L },
31221       { 0x60514983064417eeL,0x1459b23cad6bdf2bL,0x23b2c3415cf726c3L,
31222         0x3a82963532d6354aL } },
31223     /* 6 << 133 */
31224     { { 0x294f901fab192c18L,0xec5fcbfe7030164fL,0xe2e2fcb7e2246ba6L,
31225         0x1e7c88b3221a1a0cL },
31226       { 0x72c7dd93c92d88c5L,0x41c2148e1106fb59L,0x547dd4f5a0f60f14L,
31227         0xed9b52b263960f31L } },
31228     /* 7 << 133 */
31229     { { 0x6c8349ebb0a5b358L,0xb154c5c29e7e2ed6L,0xcad5eccfeda462dbL,
31230         0xf2d6dbe42de66b69L },
31231       { 0x426aedf38665e5b2L,0x488a85137b7f5723L,0x15cc43b38bcbb386L,
31232         0x27ad0af3d791d879L } },
31233     /* 8 << 133 */
31234     { { 0xc16c236e846e364fL,0x7f33527cdea50ca0L,0xc48107750926b86dL,
31235         0x6c2a36090598e70cL },
31236       { 0xa6755e52f024e924L,0xe0fa07a49db4afcaL,0x15c3ce7d66831790L,
31237         0x5b4ef350a6cbb0d6L } },
31238     /* 9 << 133 */
31239     { { 0x2c4aafc4b6205969L,0x42563f02f6c7854fL,0x016aced51d983b48L,
31240         0xfeb356d899949755L },
31241       { 0x8c2a2c81d1a39bd7L,0x8f44340fe6934ae9L,0x148cf91c447904daL,
31242         0x7340185f0f51a926L } },
31243     /* 10 << 133 */
31244     { { 0x2f8f00fb7409ab46L,0x057e78e680e289b2L,0x03e5022ca888e5d1L,
31245         0x3c87111a9dede4e2L },
31246       { 0x5b9b0e1c7809460bL,0xe751c85271c9abc7L,0x8b944e28c7cc1dc9L,
31247         0x4f201ffa1d3cfa08L } },
31248     /* 11 << 133 */
31249     { { 0x02fc905c3e6721ceL,0xd52d70dad0b3674cL,0x5dc2e5ca18810da4L,
31250         0xa984b2735c69dd99L },
31251       { 0x63b9252784de5ca4L,0x2f1c9872c852dec4L,0x18b03593c2e3de09L,
31252         0x19d70b019813dc2fL } },
31253     /* 12 << 133 */
31254     { { 0x42806b2da6dc1d29L,0xd3030009f871e144L,0xa1feb333aaf49276L,
31255         0xb5583b9ec70bc04bL },
31256       { 0x1db0be7895695f20L,0xfc84181189d012b5L,0x6409f27205f61643L,
31257         0x40d34174d5883128L } },
31258     /* 13 << 133 */
31259     { { 0xd79196f567419833L,0x6059e252863b7b08L,0x84da18171c56700cL,
31260         0x5758ee56b28d3ec4L },
31261       { 0x7da2771d013b0ea6L,0xfddf524b54c5e9b9L,0x7df4faf824305d80L,
31262         0x58f5c1bf3a97763fL } },
31263     /* 14 << 133 */
31264     { { 0xa5af37f17c696042L,0xd4cba22c4a2538deL,0x211cb9959ea42600L,
31265         0xcd105f417b069889L },
31266       { 0xb1e1cf19ddb81e74L,0x472f2d895157b8caL,0x086fb008ee9db885L,
31267         0x365cd5700f26d131L } },
31268     /* 15 << 133 */
31269     { { 0x284b02bba2be7053L,0xdcbbf7c67ab9a6d6L,0x4425559c20f7a530L,
31270         0x961f2dfa188767c8L },
31271       { 0xe2fd943570dc80c4L,0x104d6b63f0784120L,0x7f592bc153567122L,
31272         0xf6bc1246f688ad77L } },
31273     /* 16 << 133 */
31274     { { 0x05214c050f15dde9L,0xa47a76a80d5f2b82L,0xbb254d3062e82b62L,
31275         0x11a05fe03ec955eeL },
31276       { 0x7eaff46e9d529b36L,0x55ab13018f9e3df6L,0xc463e37199317698L,
31277         0xfd251438ccda47adL } },
31278     /* 17 << 133 */
31279     { { 0xca9c354723d695eaL,0x48ce626e16e589b5L,0x6b5b64c7b187d086L,
31280         0xd02e1794b2207948L },
31281       { 0x8b58e98f7198111dL,0x90ca6305dcf9c3ccL,0x5691fe72f34089b0L,
31282         0x60941af1fc7c80ffL } },
31283     /* 18 << 133 */
31284     { { 0xa09bc0a222eb51e5L,0xc0bb7244aa9cf09aL,0x36a8077f80159f06L,
31285         0x8b5c989edddc560eL },
31286       { 0x19d2f316512e1f43L,0x02eac554ad08ff62L,0x012ab84c07d20b4eL,
31287         0x37d1e115d6d4e4e1L } },
31288     /* 19 << 133 */
31289     { { 0xb6443e1aab7b19a8L,0xf08d067edef8cd45L,0x63adf3e9685e03daL,
31290         0xcf15a10e4792b916L },
31291       { 0xf44bcce5b738a425L,0xebe131d59636b2fdL,0x940688417850d605L,
31292         0x09684eaab40d749dL } },
31293     /* 20 << 133 */
31294     { { 0x8c3c669c72ba075bL,0x89f78b55ba469015L,0x5706aade3e9f8ba8L,
31295         0x6d8bd565b32d7ed7L },
31296       { 0x25f4e63b805f08d6L,0x7f48200dc3bcc1b5L,0x4e801968b025d847L,
31297         0x74afac0487cbe0a8L } },
31298     /* 21 << 133 */
31299     { { 0x43ed2c2b7e63d690L,0xefb6bbf00223cdb8L,0x4fec3cae2884d3feL,
31300         0x065ecce6d75e25a4L },
31301       { 0x6c2294ce69f79071L,0x0d9a8e5f044b8666L,0x5009f23817b69d8fL,
31302         0x3c29f8fec5dfdaf7L } },
31303     /* 22 << 133 */
31304     { { 0x9067528febae68c4L,0x5b38563230c5ba21L,0x540df1191fdd1aecL,
31305         0xcf37825bcfba4c78L },
31306       { 0x77eff980beb11454L,0x40a1a99160c1b066L,0xe8018980f889a1c7L,
31307         0xb9c52ae976c24be0L } },
31308     /* 23 << 133 */
31309     { { 0x05fbbcce45650ef4L,0xae000f108aa29ac7L,0x884b71724f04c470L,
31310         0x7cd4fde219bb5c25L },
31311       { 0x6477b22ae8840869L,0xa88688595fbd0686L,0xf23cc02e1116dfbaL,
31312         0x76cd563fd87d7776L } },
31313     /* 24 << 133 */
31314     { { 0xe2a37598a9d82abfL,0x5f188ccbe6c170f5L,0x816822005066b087L,
31315         0xda22c212c7155adaL },
31316       { 0x151e5d3afbddb479L,0x4b606b846d715b99L,0x4a73b54bf997cb2eL,
31317         0x9a1bfe433ecd8b66L } },
31318     /* 25 << 133 */
31319     { { 0x1c3128092a67d48aL,0xcd6a671e031fa9e2L,0xbec3312a0e43a34aL,
31320         0x1d93563955ef47d3L },
31321       { 0x5ea024898fea73eaL,0x8247b364a035afb2L,0xb58300a65265b54cL,
31322         0x3286662f722c7148L } },
31323     /* 26 << 133 */
31324     { { 0xb77fd76bb4ec4c20L,0xf0a12fa70f3fe3fdL,0xf845bbf541d8c7e8L,
31325         0xe4d969ca5ec10aa8L },
31326       { 0x4c0053b743e232a3L,0xdc7a3fac37f8a45aL,0x3c4261c520d81c8fL,
31327         0xfd4b3453b00eab00L } },
31328     /* 27 << 133 */
31329     { { 0x76d48f86d36e3062L,0x626c5277a143ff02L,0x538174deaf76f42eL,
31330         0x2267aa866407ceacL },
31331       { 0xfad7635172e572d5L,0xab861af7ba7330ebL,0xa0a1c8c7418d8657L,
31332         0x988821cb20289a52L } },
31333     /* 28 << 133 */
31334     { { 0x79732522cccc18adL,0xaadf3f8df1a6e027L,0xf7382c9317c2354dL,
31335         0x5ce1680cd818b689L },
31336       { 0x359ebbfcd9ecbee9L,0x4330689c1cae62acL,0xb55ce5b4c51ac38aL,
31337         0x7921dfeafe238ee8L } },
31338     /* 29 << 133 */
31339     { { 0x3972bef8271d1ca5L,0x3e423bc7e8aabd18L,0x57b09f3f44a3e5e3L,
31340         0x5da886ae7b444d66L },
31341       { 0x68206634a9964375L,0x356a2fa3699cd0ffL,0xaf0faa24dba515e9L,
31342         0x536e1f5cb321d79aL } },
31343     /* 30 << 133 */
31344     { { 0xd3b9913a5c04e4eaL,0xd549dcfed6f11513L,0xee227bf579fd1d94L,
31345         0x9f35afeeb43f2c67L },
31346       { 0xd2638d24f1314f53L,0x62baf948cabcd822L,0x5542de294ef48db0L,
31347         0xb3eb6a04fc5f6bb2L } },
31348     /* 31 << 133 */
31349     { { 0x23c110ae1208e16aL,0x1a4d15b5f8363e24L,0x30716844164be00bL,
31350         0xa8e24824f6f4690dL },
31351       { 0x548773a290b170cfL,0xa1bef33142f191f4L,0x70f418d09247aa97L,
31352         0xea06028e48be9147L } },
31353     /* 32 << 133 */
31354     { { 0xe13122f3dbfb894eL,0xbe9b79f6ce274b18L,0x85a49de5ca58aadfL,
31355         0x2495775811487351L },
31356       { 0x111def61bb939099L,0x1d6a974a26d13694L,0x4474b4ced3fc253bL,
31357         0x3a1485e64c5db15eL } },
31358     /* 33 << 133 */
31359     { { 0xe79667b4147c15b4L,0xe34f553b7bc61301L,0x032b80f817094381L,
31360         0x55d8bafd723eaa21L },
31361       { 0x5a987995f1c0e74eL,0x5a9b292eebba289cL,0x413cd4b2eb4c8251L,
31362         0x98b5d243d162db0aL } },
31363     /* 34 << 133 */
31364     { { 0xbb47bf6668342520L,0x08d68949baa862d1L,0x11f349c7e906abcdL,
31365         0x454ce985ed7bf00eL },
31366       { 0xacab5c9eb55b803bL,0xb03468ea31e3c16dL,0x5c24213dd273bf12L,
31367         0x211538eb71587887L } },
31368     /* 35 << 133 */
31369     { { 0x198e4a2f731dea2dL,0xd5856cf274ed7b2aL,0x86a632eb13a664feL,
31370         0x932cd909bda41291L },
31371       { 0x850e95d4c0c4ddc0L,0xc0f422f8347fc2c9L,0xe68cbec486076bcbL,
31372         0xf9e7c0c0cd6cd286L } },
31373     /* 36 << 133 */
31374     { { 0x65994ddb0f5f27caL,0xe85461fba80d59ffL,0xff05481a66601023L,
31375         0xc665427afc9ebbfbL },
31376       { 0xb0571a697587fd52L,0x935289f88d49efceL,0x61becc60ea420688L,
31377         0xb22639d913a786afL } },
31378     /* 37 << 133 */
31379     { { 0x1a8e6220361ecf90L,0x001f23e025506463L,0xe4ae9b5d0a5c2b79L,
31380         0xebc9cdadd8149db5L },
31381       { 0xb33164a1934aa728L,0x750eb00eae9b60f3L,0x5a91615b9b9cfbfdL,
31382         0x97015cbfef45f7f6L } },
31383     /* 38 << 133 */
31384     { { 0xb462c4a5bf5151dfL,0x21adcc41b07118f2L,0xd60c545b043fa42cL,
31385         0xfc21aa54e96be1abL },
31386       { 0xe84bc32f4e51ea80L,0x3dae45f0259b5d8dL,0xbb73c7ebc38f1b5eL,
31387         0xe405a74ae8ae617dL } },
31388     /* 39 << 133 */
31389     { { 0xbb1ae9c69f1c56bdL,0x8c176b9849f196a4L,0xc448f3116875092bL,
31390         0xb5afe3de9f976033L },
31391       { 0xa8dafd49145813e5L,0x687fc4d9e2b34226L,0xf2dfc92d4c7ff57fL,
31392         0x004e3fc1401f1b46L } },
31393     /* 40 << 133 */
31394     { { 0x5afddab61430c9abL,0x0bdd41d32238e997L,0xf0947430418042aeL,
31395         0x71f9addacdddc4cbL },
31396       { 0x7090c016c52dd907L,0xd9bdf44d29e2047fL,0xe6f1fe801b1011a6L,
31397         0xb63accbcd9acdc78L } },
31398     /* 41 << 133 */
31399     { { 0xcfc7e2351272a95bL,0x0c667717a6276ac8L,0x3c0d3709e2d7eef7L,
31400         0x5add2b069a685b3eL },
31401       { 0x363ad32d14ea5d65L,0xf8e01f068d7dd506L,0xc9ea221375b4aac6L,
31402         0xed2a2bf90d353466L } },
31403     /* 42 << 133 */
31404     { { 0x439d79b5e9d3a7c3L,0x8e0ee5a681b7f34bL,0xcf3dacf51dc4ba75L,
31405         0x1d3d1773eb3310c7L },
31406       { 0xa8e671127747ae83L,0x31f43160197d6b40L,0x0521cceecd961400L,
31407         0x67246f11f6535768L } },
31408     /* 43 << 133 */
31409     { { 0x702fcc5aef0c3133L,0x247cc45d7e16693bL,0xfd484e49c729b749L,
31410         0x522cef7db218320fL },
31411       { 0xe56ef40559ab93b3L,0x225fba119f181071L,0x33bd659515330ed0L,
31412         0xc4be69d51ddb32f7L } },
31413     /* 44 << 133 */
31414     { { 0x264c76680448087cL,0xac30903f71432daeL,0x3851b26600f9bf47L,
31415         0x400ed3116cdd6d03L },
31416       { 0x045e79fef8fd2424L,0xfdfd974afa6da98bL,0x45c9f6410c1e673aL,
31417         0x76f2e7335b2c5168L } },
31418     /* 45 << 133 */
31419     { { 0x1adaebb52a601753L,0xb286514cc57c2d49L,0xd87696701e0bfd24L,
31420         0x950c547e04478922L },
31421       { 0xd1d41969e5d32bfeL,0x30bc1472750d6c3eL,0x8f3679fee0e27f3aL,
31422         0x8f64a7dca4a6ee0cL } },
31423     /* 46 << 133 */
31424     { { 0x2fe59937633dfb1fL,0xea82c395977f2547L,0xcbdfdf1a661ea646L,
31425         0xc7ccc591b9085451L },
31426       { 0x8217796281761e13L,0xda57596f9196885cL,0xbc17e84928ffbd70L,
31427         0x1e6e0a412671d36fL } },
31428     /* 47 << 133 */
31429     { { 0x61ae872c4152fcf5L,0x441c87b09e77e754L,0xd0799dd5a34dff09L,
31430         0x766b4e4488a6b171L },
31431       { 0xdc06a51211f1c792L,0xea02ae934be35c3eL,0xe5ca4d6de90c469eL,
31432         0x4df4368e56e4ff5cL } },
31433     /* 48 << 133 */
31434     { { 0x7817acab4baef62eL,0x9f5a2202a85b91e8L,0x9666ebe66ce57610L,
31435         0x32ad31f3f73bfe03L },
31436       { 0x628330a425bcf4d6L,0xea950593515056e6L,0x59811c89e1332156L,
31437         0xc89cf1fe8c11b2d7L } },
31438     /* 49 << 133 */
31439     { { 0x75b6391304e60cc0L,0xce811e8d4625d375L,0x030e43fc2d26e562L,
31440         0xfbb30b4b608d36a0L },
31441       { 0x634ff82c48528118L,0x7c6fe085cd285911L,0x7f2830c099358f28L,
31442         0x2e60a95e665e6c09L } },
31443     /* 50 << 133 */
31444     { { 0x08407d3d9b785dbfL,0x530889aba759bce7L,0xf228e0e652f61239L,
31445         0x2b6d14616879be3cL },
31446       { 0xe6902c0451a7bbf7L,0x30ad99f076f24a64L,0x66d9317a98bc6da0L,
31447         0xf4f877f3cb596ac0L } },
31448     /* 51 << 133 */
31449     { { 0xb05ff62d4c44f119L,0x4555f536e9b77416L,0xc7c0d0598caed63bL,
31450         0x0cd2b7cec358b2a9L },
31451       { 0x3f33287b46945fa3L,0xf8785b20d67c8791L,0xc54a7a619637bd08L,
31452         0x54d4598c18be79d7L } },
31453     /* 52 << 133 */
31454     { { 0x889e5acbc46d7ce1L,0x9a515bb78b085877L,0xfac1a03d0b7a5050L,
31455         0x7d3e738af2926035L },
31456       { 0x861cc2ce2a6cb0ebL,0x6f2e29558f7adc79L,0x61c4d45133016376L,
31457         0xd9fd2c805ad59090L } },
31458     /* 53 << 133 */
31459     { { 0xe5a83738b2b836a1L,0x855b41a07c0d6622L,0x186fe3177cc19af1L,
31460         0x6465c1fffdd99acbL },
31461       { 0x46e5c23f6974b99eL,0x75a7cf8ba2717cbeL,0x4d2ebc3f062be658L,
31462         0x094b44475f209c98L } },
31463     /* 54 << 133 */
31464     { { 0x4af285edb940cb5aL,0x6706d7927cc82f10L,0xc8c8776c030526faL,
31465         0xfa8e6f76a0da9140L },
31466       { 0x77ea9d34591ee4f0L,0x5f46e33740274166L,0x1bdf98bbea671457L,
31467         0xd7c08b46862a1fe2L } },
31468     /* 55 << 133 */
31469     { { 0x46cc303c1c08ad63L,0x995434404c845e7bL,0x1b8fbdb548f36bf7L,
31470         0x5b82c3928c8273a7L },
31471       { 0x08f712c4928435d5L,0x071cf0f179330380L,0xc74c2d24a8da054aL,
31472         0xcb0e720143c46b5cL } },
31473     /* 56 << 133 */
31474     { { 0x0ad7337ac0b7eff3L,0x8552225ec5e48b3cL,0xe6f78b0c73f13a5fL,
31475         0x5e70062e82349cbeL },
31476       { 0x6b8d5048e7073969L,0x392d2a29c33cb3d2L,0xee4f727c4ecaa20fL,
31477         0xa068c99e2ccde707L } },
31478     /* 57 << 133 */
31479     { { 0xfcd5651fb87a2913L,0xea3e3c153cc252f0L,0x777d92df3b6cd3e4L,
31480         0x7a414143c5a732e7L },
31481       { 0xa895951aa71ff493L,0xfe980c92bbd37cf6L,0x45bd5e64decfeeffL,
31482         0x910dc2a9a44c43e9L } },
31483     /* 58 << 133 */
31484     { { 0xcb403f26cca9f54dL,0x928bbdfb9303f6dbL,0x3c37951ea9eee67cL,
31485         0x3bd61a52f79961c3L },
31486       { 0x09a238e6395c9a79L,0x6940ca2d61eb352dL,0x7d1e5c5ec1875631L,
31487         0x1e19742c1e1b20d1L } },
31488     /* 59 << 133 */
31489     { { 0x4633d90823fc2e6eL,0xa76e29a908959149L,0x61069d9c84ed7da5L,
31490         0x0baa11cf5dbcad51L },
31491       { 0xd01eec64961849daL,0x93b75f1faf3d8c28L,0x57bc4f9f1ca2ee44L,
31492         0x5a26322d00e00558L } },
31493     /* 60 << 133 */
31494     { { 0x1888d65861a023efL,0x1d72aab4b9e5246eL,0xa9a26348e5563ec0L,
31495         0xa0971963c3439a43L },
31496       { 0x567dd54badb9b5b7L,0x73fac1a1c45a524bL,0x8fe97ef7fe38e608L,
31497         0x608748d23f384f48L } },
31498     /* 61 << 133 */
31499     { { 0xb0571794c486094fL,0x869254a38bf3a8d6L,0x148a8dd1310b0e25L,
31500         0x99ab9f3f9aa3f7d8L },
31501       { 0x0927c68a6706c02eL,0x22b5e76c69790e6cL,0x6c3252606c71376cL,
31502         0x53a5769009ef6657L } },
31503     /* 62 << 133 */
31504     { { 0x8d63f852edffcf3aL,0xb4d2ed043c0a6f55L,0xdb3aa8de12519b9eL,
31505         0x5d38e9c41e0a569aL },
31506       { 0x871528bf303747e2L,0xa208e77cf5b5c18dL,0x9d129c88ca6bf923L,
31507         0xbcbf197fbf02839fL } },
31508     /* 63 << 133 */
31509     { { 0x9b9bf03027323194L,0x3b055a8b339ca59dL,0xb46b23120f669520L,
31510         0x19789f1f497e5f24L },
31511       { 0x9c499468aaf01801L,0x72ee11908b69d59cL,0x8bd39595acf4c079L,
31512         0x3ee11ece8e0cd048L } },
31513     /* 64 << 133 */
31514     { { 0xebde86ec1ed66f18L,0x225d906bd61fce43L,0x5cab07d6e8bed74dL,
31515         0x16e4617f27855ab7L },
31516       { 0x6568aaddb2fbc3ddL,0xedb5484f8aeddf5bL,0x878f20e86dcf2fadL,
31517         0x3516497c615f5699L } },
31518     /* 0 << 140 */
31519     { { 0x00, 0x00, 0x00, 0x00 },
31520       { 0x00, 0x00, 0x00, 0x00 } },
31521     /* 1 << 140 */
31522     { { 0xef0a3fecfa181e69L,0x9ea02f8130d69a98L,0xb2e9cf8e66eab95dL,
31523         0x520f2beb24720021L },
31524       { 0x621c540a1df84361L,0x1203772171fa6d5dL,0x6e3c7b510ff5f6ffL,
31525         0x817a069babb2bef3L } },
31526     /* 2 << 140 */
31527     { { 0x83572fb6b294cda6L,0x6ce9bf75b9039f34L,0x20e012f0095cbb21L,
31528         0xa0aecc1bd063f0daL },
31529       { 0x57c21c3af02909e5L,0xc7d59ecf48ce9cdcL,0x2732b8448ae336f8L,
31530         0x056e37233f4f85f4L } },
31531     /* 3 << 140 */
31532     { { 0x8a10b53189e800caL,0x50fe0c17145208fdL,0x9e43c0d3b714ba37L,
31533         0x427d200e34189accL },
31534       { 0x05dee24fe616e2c0L,0x9c25f4c8ee1854c1L,0x4d3222a58f342a73L,
31535         0x0807804fa027c952L } },
31536     /* 4 << 140 */
31537     { { 0xc222653a4f0d56f3L,0x961e4047ca28b805L,0x2c03f8b04a73434bL,
31538         0x4c966787ab712a19L },
31539       { 0xcc196c42864fee42L,0xc1be93da5b0ece5cL,0xa87d9f22c131c159L,
31540         0x2bb6d593dce45655L } },
31541     /* 5 << 140 */
31542     { { 0x22c49ec9b809b7ceL,0x8a41486be2c72c2cL,0x813b9420fea0bf36L,
31543         0xb3d36ee9a66dac69L },
31544       { 0x6fddc08a328cc987L,0x0a3bcd2c3a326461L,0x7103c49dd810dbbaL,
31545         0xf9d81a284b78a4c4L } },
31546     /* 6 << 140 */
31547     { { 0x3de865ade4d55941L,0xdedafa5e30384087L,0x6f414abb4ef18b9bL,
31548         0x9ee9ea42faee5268L },
31549       { 0x260faa1637a55a4aL,0xeb19a514015f93b9L,0x51d7ebd29e9c3598L,
31550         0x523fc56d1932178eL } },
31551     /* 7 << 140 */
31552     { { 0x501d070cb98fe684L,0xd60fbe9a124a1458L,0xa45761c892bc6b3fL,
31553         0xf5384858fe6f27cbL },
31554       { 0x4b0271f7b59e763bL,0x3d4606a95b5a8e5eL,0x1eda5d9b05a48292L,
31555         0xda7731d0e6fec446L } },
31556     /* 8 << 140 */
31557     { { 0xa3e3369390d45871L,0xe976404006166d8dL,0xb5c3368289a90403L,
31558         0x4bd1798372f1d637L },
31559       { 0xa616679ed5d2c53aL,0x5ec4bcd8fdcf3b87L,0xae6d7613b66a694eL,
31560         0x7460fc76e3fc27e5L } },
31561     /* 9 << 140 */
31562     { { 0x70469b8295caabeeL,0xde024ca5889501e3L,0x6bdadc06076ed265L,
31563         0x0cb1236b5a0ef8b2L },
31564       { 0x4065ddbf0972ebf9L,0xf1dd387522aca432L,0xa88b97cf744aff76L,
31565         0xd1359afdfe8e3d24L } },
31566     /* 10 << 140 */
31567     { { 0x52a3ba2b91502cf3L,0x2c3832a8084db75dL,0x04a12dddde30b1c9L,
31568         0x7802eabce31fd60cL },
31569       { 0x33707327a37fddabL,0x65d6f2abfaafa973L,0x3525c5b811e6f91aL,
31570         0x76aeb0c95f46530bL } },
31571     /* 11 << 140 */
31572     { { 0xe8815ff62f93a675L,0xa6ec968405f48679L,0x6dcbb556358ae884L,
31573         0x0af61472e19e3873L },
31574       { 0x72334372a5f696beL,0xc65e57ea6f22fb70L,0x268da30c946cea90L,
31575         0x136a8a8765681b2aL } },
31576     /* 12 << 140 */
31577     { { 0xad5e81dc0f9f44d4L,0xf09a69602c46585aL,0xd1649164c447d1b1L,
31578         0x3b4b36c8879dc8b1L },
31579       { 0x20d4177b3b6b234cL,0x096a25051730d9d0L,0x0611b9b8ef80531dL,
31580         0xba904b3b64bb495dL } },
31581     /* 13 << 140 */
31582     { { 0x1192d9d493a3147aL,0x9f30a5dc9a565545L,0x90b1f9cb6ef07212L,
31583         0x299585460d87fc13L },
31584       { 0xd3323effc17db9baL,0xcb18548ccb1644a8L,0x18a306d44f49ffbcL,
31585         0x28d658f14c2e8684L } },
31586     /* 14 << 140 */
31587     { { 0x44ba60cda99f8c71L,0x67b7abdb4bf742ffL,0x66310f9c914b3f99L,
31588         0xae430a32f412c161L },
31589       { 0x1e6776d388ace52fL,0x4bc0fa2452d7067dL,0x03c286aa8f07cd1bL,
31590         0x4cb8f38ca985b2c1L } },
31591     /* 15 << 140 */
31592     { { 0x83ccbe808c3bff36L,0x005a0bd25263e575L,0x460d7dda259bdcd1L,
31593         0x4a1c5642fa5cab6bL },
31594       { 0x2b7bdbb99fe4fc88L,0x09418e28cc97bbb5L,0xd8274fb4a12321aeL,
31595         0xb137007d5c87b64eL } },
31596     /* 16 << 140 */
31597     { { 0x80531fe1c63c4962L,0x50541e89981fdb25L,0xdc1291a1fd4c2b6bL,
31598         0xc0693a17a6df4fcaL },
31599       { 0xb2c4604e0117f203L,0x245f19630a99b8d0L,0xaedc20aac6212c44L,
31600         0xb1ed4e56520f52a8L } },
31601     /* 17 << 140 */
31602     { { 0xfe48f575f8547be3L,0x0a7033cda9e45f98L,0x4b45d3a918c50100L,
31603         0xb2a6cd6aa61d41daL },
31604       { 0x60bbb4f557933c6bL,0xa7538ebd2b0d7ffcL,0x9ea3ab8d8cd626b6L,
31605         0x8273a4843601625aL } },
31606     /* 18 << 140 */
31607     { { 0x888598450168e508L,0x8cbc9bb299a94abdL,0x713ac792fab0a671L,
31608         0xa3995b196c9ebffcL },
31609       { 0xe711668e1239e152L,0x56892558bbb8dff4L,0x8bfc7dabdbf17963L,
31610         0x5b59fe5ab3de1253L } },
31611     /* 19 << 140 */
31612     { { 0x7e3320eb34a9f7aeL,0xe5e8cf72d751efe4L,0x7ea003bcd9be2f37L,
31613         0xc0f551a0b6c08ef7L },
31614       { 0x56606268038f6725L,0x1dd38e356d92d3b6L,0x07dfce7cc3cbd686L,
31615         0x4e549e04651c5da8L } },
31616     /* 20 << 140 */
31617     { { 0x4058f93b08b19340L,0xc2fae6f4cac6d89dL,0x4bad8a8c8f159cc7L,
31618         0x0ddba4b3cb0b601cL },
31619       { 0xda4fc7b51dd95f8cL,0x1d163cd7cea5c255L,0x30707d06274a8c4cL,
31620         0x79d9e0082802e9ceL } },
31621     /* 21 << 140 */
31622     { { 0x02a29ebfe6ddd505L,0x37064e74b50bed1aL,0x3f6bae65a7327d57L,
31623         0x3846f5f1f83920bcL },
31624       { 0x87c3749160df1b9bL,0x4cfb28952d1da29fL,0x10a478ca4ed1743cL,
31625         0x390c60303edd47c6L } },
31626     /* 22 << 140 */
31627     { { 0x8f3e53128c0a78deL,0xccd02bda1e85df70L,0xd6c75c03a61b6582L,
31628         0x0762921cfc0eebd1L },
31629       { 0xd34d0823d85010c0L,0xd73aaacb0044cf1fL,0xfb4159bba3b5e78aL,
31630         0x2287c7f7e5826f3fL } },
31631     /* 23 << 140 */
31632     { { 0x4aeaf742580b1a01L,0xf080415d60423b79L,0xe12622cda7dea144L,
31633         0x49ea499659d62472L },
31634       { 0xb42991ef571f3913L,0x0610f214f5b25a8aL,0x47adc58530b79e8fL,
31635         0xf90e3df607a065a2L } },
31636     /* 24 << 140 */
31637     { { 0x5d0a5deb43e2e034L,0x53fb5a34444024aaL,0xa8628c686b0c9f7fL,
31638         0x9c69c29cac563656L },
31639       { 0x5a231febbace47b6L,0xbdce02899ea5a2ecL,0x05da1fac9463853eL,
31640         0x96812c52509e78aaL } },
31641     /* 25 << 140 */
31642     { { 0xd3fb577157151692L,0xeb2721f8d98e1c44L,0xc050608732399be1L,
31643         0xda5a5511d979d8b8L },
31644       { 0x737ed55dc6f56780L,0xe20d30040dc7a7f4L,0x02ce7301f5941a03L,
31645         0x91ef5215ed30f83aL } },
31646     /* 26 << 140 */
31647     { { 0x28727fc14092d85fL,0x72d223c65c49e41aL,0xa7cf30a2ba6a4d81L,
31648         0x7c086209b030d87dL },
31649       { 0x04844c7dfc588b09L,0x728cd4995874bbb0L,0xcc1281eee84c0495L,
31650         0x0769b5baec31958fL } },
31651     /* 27 << 140 */
31652     { { 0x665c228bf99c2471L,0xf2d8a11b191eb110L,0x4594f494d36d7024L,
31653         0x482ded8bcdcb25a1L },
31654       { 0xc958a9d8dadd4885L,0x7004477ef1d2b547L,0x0a45f6ef2a0af550L,
31655         0x4fc739d62f8d6351L } },
31656     /* 28 << 140 */
31657     { { 0x75cdaf27786f08a9L,0x8700bb2642c2737fL,0x855a71411c4e2670L,
31658         0x810188c115076fefL },
31659       { 0xc251d0c9abcd3297L,0xae4c8967f48108ebL,0xbd146de718ceed30L,
31660         0xf9d4f07ac986bcedL } },
31661     /* 29 << 140 */
31662     { { 0x5ad98ed583fa1e08L,0x7780d33ebeabd1fbL,0xe330513c903b1196L,
31663         0xba11de9ea47bc8c4L },
31664       { 0x684334da02c2d064L,0x7ecf360da48de23bL,0x57a1b4740a9089d8L,
31665         0xf28fa439ff36734cL } },
31666     /* 30 << 140 */
31667     { { 0xf2a482cbea4570b3L,0xee65d68ba5ebcee9L,0x988d0036b9694cd5L,
31668         0x53edd0e937885d32L },
31669       { 0xe37e3307beb9bc6dL,0xe9abb9079f5c6768L,0x4396ccd551f2160fL,
31670         0x2500888c47336da6L } },
31671     /* 31 << 140 */
31672     { { 0x383f9ed9926fce43L,0x809dd1c704da2930L,0x30f6f5968a4cb227L,
31673         0x0d700c7f73a56b38L },
31674       { 0x1825ea33ab64a065L,0xaab9b7351338df80L,0x1516100d9b63f57fL,
31675         0x2574395a27a6a634L } },
31676     /* 32 << 140 */
31677     { { 0xb5560fb6700a1acdL,0xe823fd73fd999681L,0xda915d1f6cb4e1baL,
31678         0x0d0301186ebe00a3L },
31679       { 0x744fb0c989fca8cdL,0x970d01dbf9da0e0bL,0x0ad8c5647931d76fL,
31680         0xb15737bff659b96aL } },
31681     /* 33 << 140 */
31682     { { 0xdc9933e8a8b484e7L,0xb2fdbdf97a26dec7L,0x2349e9a49f1f0136L,
31683         0x7860368e70fddddbL },
31684       { 0xd93d2c1cf9ad3e18L,0x6d6c5f17689f4e79L,0x7a544d91b24ff1b6L,
31685         0x3e12a5ebfe16cd8cL } },
31686     /* 34 << 140 */
31687     { { 0x543574e9a56b872fL,0xa1ad550cfcf68ea2L,0x689e37d23f560ef7L,
31688         0x8c54b9cac9d47a8bL },
31689       { 0x46d40a4a088ac342L,0xec450c7c1576c6d0L,0xb589e31c1f9689e9L,
31690         0xdacf2602b8781718L } },
31691     /* 35 << 140 */
31692     { { 0xa89237c6c8cb6b42L,0x1326fc93b96ef381L,0x55d56c6db5f07825L,
31693         0xacba2eea7449e22dL },
31694       { 0x74e0887a633c3000L,0xcb6cd172d7cbcf71L,0x309e81dec36cf1beL,
31695         0x07a18a6d60ae399bL } },
31696     /* 36 << 140 */
31697     { { 0xb36c26799edce57eL,0x52b892f4df001d41L,0xd884ae5d16a1f2c6L,
31698         0x9b329424efcc370aL },
31699       { 0x3120daf2bd2e21dfL,0x55298d2d02470a99L,0x0b78af6ca05db32eL,
31700         0x5c76a331601f5636L } },
31701     /* 37 << 140 */
31702     { { 0xaae861fff8a4f29cL,0x70dc9240d68f8d49L,0x960e649f81b1321cL,
31703         0x3d2c801b8792e4ceL },
31704       { 0xf479f77242521876L,0x0bed93bc416c79b1L,0xa67fbc05263e5bc9L,
31705         0x01e8e630521db049L } },
31706     /* 38 << 140 */
31707     { { 0x76f26738c6f3431eL,0xe609cb02e3267541L,0xb10cff2d818c877cL,
31708         0x1f0e75ce786a13cbL },
31709       { 0xf4fdca641158544dL,0x5d777e896cb71ed0L,0x3c233737a9aa4755L,
31710         0x7b453192e527ab40L } },
31711     /* 39 << 140 */
31712     { { 0xdb59f68839f05ffeL,0x8f4f4be06d82574eL,0xcce3450cee292d1bL,
31713         0xaa448a1261ccd086L },
31714       { 0xabce91b3f7914967L,0x4537f09b1908a5edL,0xa812421ef51042e7L,
31715         0xfaf5cebcec0b3a34L } },
31716     /* 40 << 140 */
31717     { { 0x730ffd874ca6b39aL,0x70fb72ed02efd342L,0xeb4735f9d75c8edbL,
31718         0xc11f2157c278aa51L },
31719       { 0xc459f635bf3bfebfL,0x3a1ff0b46bd9601fL,0xc9d12823c420cb73L,
31720         0x3e9af3e23c2915a3L } },
31721     /* 41 << 140 */
31722     { { 0xe0c82c72b41c3440L,0x175239e5e3039a5fL,0xe1084b8a558795a3L,
31723         0x328d0a1dd01e5c60L },
31724       { 0x0a495f2ed3788a04L,0x25d8ff1666c11a9fL,0xf5155f059ed692d6L,
31725         0x954fa1074f425fe4L } },
31726     /* 42 << 140 */
31727     { { 0xd16aabf2e98aaa99L,0x90cd8ba096b0f88aL,0x957f4782c154026aL,
31728         0x54ee073452af56d2L },
31729       { 0xbcf89e5445b4147aL,0x3d102f219a52816cL,0x6808517e39b62e77L,
31730         0x92e2542169169ad8L } },
31731     /* 43 << 140 */
31732     { { 0xd721d871bb608558L,0x60e4ebaef6d4ff9bL,0x0ba1081941f2763eL,
31733         0xca2e45be51ee3247L },
31734       { 0x66d172ec2bfd7a5fL,0x528a8f2f74d0b12dL,0xe17f1e38dabe70dcL,
31735         0x1d5d73169f93983cL } },
31736     /* 44 << 140 */
31737     { { 0x51b2184adf423e31L,0xcb417291aedb1a10L,0x2054ca93625bcab9L,
31738         0x54396860a98998f0L },
31739       { 0x4e53f6c4a54ae57eL,0x0ffeb590ee648e9dL,0xfbbdaadc6afaf6bcL,
31740         0xf88ae796aa3bfb8aL } },
31741     /* 45 << 140 */
31742     { { 0x209f1d44d2359ed9L,0xac68dd03f3544ce2L,0xf378da47fd51e569L,
31743         0xe1abd8602cc80097L },
31744       { 0x23ca18d9343b6e3aL,0x480797e8b40a1baeL,0xd1f0c717533f3e67L,
31745         0x4489697006e6cdfcL } },
31746     /* 46 << 140 */
31747     { { 0x8ca2105552a82e8dL,0xb2caf78578460cdcL,0x4c1b7b62e9037178L,
31748         0xefc09d2cdb514b58L },
31749       { 0x5f2df9ee9113be5cL,0x2fbda78fb3f9271cL,0xe09a81af8f83fc54L,
31750         0x06b138668afb5141L } },
31751     /* 47 << 140 */
31752     { { 0x38f6480f43e3865dL,0x72dd77a81ddf47d9L,0xf2a8e9714c205ff7L,
31753         0x46d449d89d088ad8L },
31754       { 0x926619ea185d706fL,0xe47e02ebc7dd7f62L,0xe7f120a78cbc2031L,
31755         0xc18bef00998d4ac9L } },
31756     /* 48 << 140 */
31757     { { 0x18f37a9c6bdf22daL,0xefbc432f90dc82dfL,0xc52cef8e5d703651L,
31758         0x82887ba0d99881a5L },
31759       { 0x7cec9ddab920ec1dL,0xd0d7e8c3ec3e8d3bL,0x445bc3954ca88747L,
31760         0xedeaa2e09fd53535L } },
31761     /* 49 << 140 */
31762     { { 0x461b1d936cc87475L,0xd92a52e26d2383bdL,0xfabccb59d7903546L,
31763         0x6111a7613d14b112L },
31764       { 0x0ae584feb3d5f612L,0x5ea69b8d60e828ecL,0x6c07898554087030L,
31765         0x649cab04ac4821feL } },
31766     /* 50 << 140 */
31767     { { 0x25ecedcf8bdce214L,0xb5622f7286af7361L,0x0e1227aa7038b9e2L,
31768         0xd0efb273ac20fa77L },
31769       { 0x817ff88b79df975bL,0x856bf2861999503eL,0xb4d5351f5038ec46L,
31770         0x740a52c5fc42af6eL } },
31771     /* 51 << 140 */
31772     { { 0x2e38bb152cbb1a3fL,0xc3eb99fe17a83429L,0xca4fcbf1dd66bb74L,
31773         0x880784d6cde5e8fcL },
31774       { 0xddc84c1cb4e7a0beL,0x8780510dbd15a72fL,0x44bcf1af81ec30e1L,
31775         0x141e50a80a61073eL } },
31776     /* 52 << 140 */
31777     { { 0x0d95571847be87aeL,0x68a61417f76a4372L,0xf57e7e87c607c3d3L,
31778         0x043afaf85252f332L },
31779       { 0xcc14e1211552a4d2L,0xb6dee692bb4d4ab4L,0xb6ab74c8a03816a4L,
31780         0x84001ae46f394a29L } },
31781     /* 53 << 140 */
31782     { { 0x5bed8344d795fb45L,0x57326e7db79f55a5L,0xc9533ce04accdffcL,
31783         0x53473caf3993fa04L },
31784       { 0x7906eb93a13df4c8L,0xa73e51f697cbe46fL,0xd1ab3ae10ae4ccf8L,
31785         0x256145088a5b3dbcL } },
31786     /* 54 << 140 */
31787     { { 0x61eff96211a71b27L,0xdf71412b6bb7fa39L,0xb31ba6b82bd7f3efL,
31788         0xb0b9c41569180d29L },
31789       { 0xeec14552014cdde5L,0x702c624b227b4bbbL,0x2b15e8c2d3e988f3L,
31790         0xee3bcc6da4f7fd04L } },
31791     /* 55 << 140 */
31792     { { 0x9d00822a42ac6c85L,0x2db0cea61df9f2b7L,0xd7cad2ab42de1e58L,
31793         0x346ed5262d6fbb61L },
31794       { 0xb39629951a2faf09L,0x2fa8a5807c25612eL,0x30ae04da7cf56490L,
31795         0x756629080eea3961L } },
31796     /* 56 << 140 */
31797     { { 0x3609f5c53d080847L,0xcb081d395241d4f6L,0xb4fb381077961a63L,
31798         0xc20c59842abb66fcL },
31799       { 0x3d40aa7cf902f245L,0x9cb127364e536b1eL,0x5eda24da99b3134fL,
31800         0xafbd9c695cd011afL } },
31801     /* 57 << 140 */
31802     { { 0x9a16e30ac7088c7dL,0x5ab657103207389fL,0x1b09547fe7407a53L,
31803         0x2322f9d74fdc6eabL },
31804       { 0xc0f2f22d7430de4dL,0x19382696e68ca9a9L,0x17f1eff1918e5868L,
31805         0xe3b5b635586f4204L } },
31806     /* 58 << 140 */
31807     { { 0x146ef9803fbc4341L,0x359f2c805b5eed4eL,0x9f35744e7482e41dL,
31808         0x9a9ac3ecf3b224c2L },
31809       { 0x9161a6fe91fc50aeL,0x89ccc66bc613fa7cL,0x89268b14c732f15aL,
31810         0x7cd6f4e2b467ed03L } },
31811     /* 59 << 140 */
31812     { { 0xfbf79869ce56b40eL,0xf93e094cc02dde98L,0xefe0c3a8edee2cd7L,
31813         0x90f3ffc0b268fd42L },
31814       { 0x81a7fd5608241aedL,0x95ab7ad800b1afe8L,0x401270563e310d52L,
31815         0xd3ffdeb109d9fc43L } },
31816     /* 60 << 140 */
31817     { { 0xc8f85c91d11a8594L,0x2e74d25831cf6db8L,0x829c7ca302b5dfd0L,
31818         0xe389cfbe69143c86L },
31819       { 0xd01b6405941768d8L,0x4510399503bf825dL,0xcc4ee16656cd17e2L,
31820         0xbea3c283ba037e79L } },
31821     /* 61 << 140 */
31822     { { 0x4e1ac06ed9a47520L,0xfbfe18aaaf852404L,0x5615f8e28087648aL,
31823         0x7301e47eb9d150d9L },
31824       { 0x79f9f9ddb299b977L,0x76697a7ba5b78314L,0x10d674687d7c90e7L,
31825         0x7afffe03937210b5L } },
31826     /* 62 << 140 */
31827     { { 0x5aef3e4b28c22ceeL,0xefb0ecd809fd55aeL,0x4cea71320d2a5d6aL,
31828         0x9cfb5fa101db6357L },
31829       { 0x395e0b57f36e1ac5L,0x008fa9ad36cafb7dL,0x8f6cdf705308c4dbL,
31830         0x51527a3795ed2477L } },
31831     /* 63 << 140 */
31832     { { 0xba0dee305bd21311L,0x6ed41b22909c90d7L,0xc5f6b7587c8696d3L,
31833         0x0db8eaa83ce83a80L },
31834       { 0xd297fe37b24b4b6fL,0xfe58afe8522d1f0dL,0x973587368c98dbd9L,
31835         0x6bc226ca9454a527L } },
31836     /* 64 << 140 */
31837     { { 0xa12b384ece53c2d0L,0x779d897d5e4606daL,0xa53e47b073ec12b0L,
31838         0x462dbbba5756f1adL },
31839       { 0x69fe09f2cafe37b6L,0x273d1ebfecce2e17L,0x8ac1d5383cf607fdL,
31840         0x8035f7ff12e10c25L } },
31841     /* 0 << 147 */
31842     { { 0x00, 0x00, 0x00, 0x00 },
31843       { 0x00, 0x00, 0x00, 0x00 } },
31844     /* 1 << 147 */
31845     { { 0x854d34c77e6c5520L,0xc27df9efdcb9ea58L,0x405f2369d686666dL,
31846         0x29d1febf0417aa85L },
31847       { 0x9846819e93470afeL,0x3e6a9669e2a27f9eL,0x24d008a2e31e6504L,
31848         0xdba7cecf9cb7680aL } },
31849     /* 2 << 147 */
31850     { { 0xecaff541338d6e43L,0x56f7dd734541d5ccL,0xb5d426de96bc88caL,
31851         0x48d94f6b9ed3a2c3L },
31852       { 0x6354a3bb2ef8279cL,0xd575465b0b1867f2L,0xef99b0ff95225151L,
31853         0xf3e19d88f94500d8L } },
31854     /* 3 << 147 */
31855     { { 0x92a83268e32dd620L,0x913ec99f627849a2L,0xedd8fdfa2c378882L,
31856         0xaf96f33eee6f8cfeL },
31857       { 0xc06737e5dc3fa8a5L,0x236bb531b0b03a1dL,0x33e59f2989f037b0L,
31858         0x13f9b5a7d9a12a53L } },
31859     /* 4 << 147 */
31860     { { 0x0d0df6ce51efb310L,0xcb5b2eb4958df5beL,0xd6459e2936158e59L,
31861         0x82aae2b91466e336L },
31862       { 0xfb658a39411aa636L,0x7152ecc5d4c0a933L,0xf10c758a49f026b7L,
31863         0xf4837f97cb09311fL } },
31864     /* 5 << 147 */
31865     { { 0xddfb02c4c753c45fL,0x18ca81b6f9c840feL,0x846fd09ab0f8a3e6L,
31866         0xb1162adde7733dbcL },
31867       { 0x7070ad20236e3ab6L,0xf88cdaf5b2a56326L,0x05fc8719997cbc7aL,
31868         0x442cd4524b665272L } },
31869     /* 6 << 147 */
31870     { { 0x7807f364b71698f5L,0x6ba418d29f7b605eL,0xfd20b00fa03b2cbbL,
31871         0x883eca37da54386fL },
31872       { 0xff0be43ff3437f24L,0xe910b432a48bb33cL,0x4963a128329df765L,
31873         0xac1dd556be2fe6f7L } },
31874     /* 7 << 147 */
31875     { { 0x557610f924a0a3fcL,0x38e17bf4e881c3f9L,0x6ba84fafed0dac99L,
31876         0xd4a222c359eeb918L },
31877       { 0xc79c1dbe13f542b6L,0x1fc65e0de425d457L,0xeffb754f1debb779L,
31878         0x638d8fd09e08af60L } },
31879     /* 8 << 147 */
31880     { { 0x994f523a626332d5L,0x7bc388335561bb44L,0x005ed4b03d845ea2L,
31881         0xd39d3ee1c2a1f08aL },
31882       { 0x6561fdd3e7676b0dL,0x620e35fffb706017L,0x36ce424ff264f9a8L,
31883         0xc4c3419fda2681f7L } },
31884     /* 9 << 147 */
31885     { { 0xfb6afd2f69beb6e8L,0x3a50b9936d700d03L,0xc840b2ad0c83a14fL,
31886         0x573207be54085befL },
31887       { 0x5af882e309fe7e5bL,0x957678a43b40a7e1L,0x172d4bdd543056e2L,
31888         0x9c1b26b40df13c0aL } },
31889     /* 10 << 147 */
31890     { { 0x1c30861cf405ff06L,0xebac86bd486e828bL,0xe791a971636933fcL,
31891         0x50e7c2be7aeee947L },
31892       { 0xc3d4a095fa90d767L,0xae60eb7be670ab7bL,0x17633a64397b056dL,
31893         0x93a21f33105012aaL } },
31894     /* 11 << 147 */
31895     { { 0x663c370babb88643L,0x91df36d722e21599L,0x183ba8358b761671L,
31896         0x381eea1d728f3bf1L },
31897       { 0xb9b2f1ba39966e6cL,0x7c464a28e7295492L,0x0fd5f70a09b26b7fL,
31898         0xa9aba1f9fbe009dfL } },
31899     /* 12 << 147 */
31900     { { 0x857c1f22369b87adL,0x3c00e5d932fca556L,0x1ad74cab90b06466L,
31901         0xa7112386550faaf2L },
31902       { 0x7435e1986d9bd5f5L,0x2dcc7e3859c3463fL,0xdc7df748ca7bd4b2L,
31903         0x13cd4c089dec2f31L } },
31904     /* 13 << 147 */
31905     { { 0x0d3b5df8e3237710L,0x0dadb26ecbd2f7b0L,0x9f5966abe4aa082bL,
31906         0x666ec8de350e966eL },
31907       { 0x1bfd1ed5ee524216L,0xcd93c59b41dab0b6L,0x658a8435d186d6baL,
31908         0x1b7d34d2159d1195L } },
31909     /* 14 << 147 */
31910     { { 0x5936e46022caf46bL,0x6a45dd8f9a96fe4fL,0xf7925434b98f474eL,
31911         0x414104120053ef15L },
31912       { 0x71cf8d1241de97bfL,0xb8547b61bd80bef4L,0xb47d3970c4db0037L,
31913         0xf1bcd328fef20dffL } },
31914     /* 15 << 147 */
31915     { { 0x31a92e0910caad67L,0x1f5919605531a1e1L,0x3bb852e05f4fc840L,
31916         0x63e297ca93a72c6cL },
31917       { 0x3c2b0b2e49abad67L,0x6ec405fced3db0d9L,0xdc14a5307fef1d40L,
31918         0xccd19846280896fcL } },
31919     /* 16 << 147 */
31920     { { 0x00f831769bb81648L,0xd69eb485653120d0L,0xd17d75f44ccabc62L,
31921         0x34a07f82b749fcb1L },
31922       { 0x2c3af787bbfb5554L,0xb06ed4d062e283f8L,0x5722889fa19213a0L,
31923         0x162b085edcf3c7b4L } },
31924     /* 17 << 147 */
31925     { { 0xbcaecb31e0dd3ecaL,0xc6237fbce52f13a5L,0xcc2b6b0327bac297L,
31926         0x2ae1cac5b917f54aL },
31927       { 0x474807d47845ae4fL,0xfec7dd92ce5972e0L,0xc3bd25411d7915bbL,
31928         0x66f85dc4d94907caL } },
31929     /* 18 << 147 */
31930     { { 0xd981b888bdbcf0caL,0xd75f5da6df279e9fL,0x128bbf247054e934L,
31931         0x3c6ff6e581db134bL },
31932       { 0x795b7cf4047d26e4L,0xf370f7b85049ec37L,0xc6712d4dced945afL,
31933         0xdf30b5ec095642bcL } },
31934     /* 19 << 147 */
31935     { { 0x9b034c624896246eL,0x5652c016ee90bbd1L,0xeb38636f87fedb73L,
31936         0x5e32f8470135a613L },
31937       { 0x0703b312cf933c83L,0xd05bb76e1a7f47e6L,0x825e4f0c949c2415L,
31938         0x569e56227250d6f8L } },
31939     /* 20 << 147 */
31940     { { 0xbbe9eb3a6568013eL,0x8dbd203f22f243fcL,0x9dbd7694b342734aL,
31941         0x8f6d12f846afa984L },
31942       { 0xb98610a2c9eade29L,0xbab4f32347dd0f18L,0x5779737b671c0d46L,
31943         0x10b6a7c6d3e0a42aL } },
31944     /* 21 << 147 */
31945     { { 0xfb19ddf33035b41cL,0xd336343f99c45895L,0x61fe493854c857e5L,
31946         0xc4d506beae4e57d5L },
31947       { 0x3cd8c8cbbbc33f75L,0x7281f08a9262c77dL,0x083f4ea6f11a2823L,
31948         0x8895041e9fba2e33L } },
31949     /* 22 << 147 */
31950     { { 0xfcdfea499c438edfL,0x7678dcc391edba44L,0xf07b3b87e2ba50f0L,
31951         0xc13888ef43948c1bL },
31952       { 0xc2135ad41140af42L,0x8e5104f3926ed1a7L,0xf24430cb88f6695fL,
31953         0x0ce0637b6d73c120L } },
31954     /* 23 << 147 */
31955     { { 0xb2db01e6fe631e8fL,0x1c5563d7d7bdd24bL,0x8daea3ba369ad44fL,
31956         0x000c81b68187a9f9L },
31957       { 0x5f48a951aae1fd9aL,0xe35626c78d5aed8aL,0x209527630498c622L,
31958         0x76d17634773aa504L } },
31959     /* 24 << 147 */
31960     { { 0x36d90ddaeb300f7aL,0x9dcf7dfcedb5e801L,0x645cb26874d5244cL,
31961         0xa127ee79348e3aa2L },
31962       { 0x488acc53575f1dbbL,0x95037e8580e6161eL,0x57e59283292650d0L,
31963         0xabe67d9914938216L } },
31964     /* 25 << 147 */
31965     { { 0x3c7f944b3f8e1065L,0xed908cb6330e8924L,0x08ee8fd56f530136L,
31966         0x2227b7d5d7ffc169L },
31967       { 0x4f55c893b5cd6dd5L,0x82225e11a62796e8L,0x5c6cead1cb18e12cL,
31968         0x4381ae0c84f5a51aL } },
31969     /* 26 << 147 */
31970     { { 0x345913d37fafa4c8L,0x3d9180820491aac0L,0x9347871f3e69264cL,
31971         0xbea9dd3cb4f4f0cdL },
31972       { 0xbda5d0673eadd3e7L,0x0033c1b80573bcd8L,0x255893795da2486cL,
31973         0xcb89ee5b86abbee7L } },
31974     /* 27 << 147 */
31975     { { 0x8fe0a8f322532e5dL,0xb6410ff0727dfc4cL,0x619b9d58226726dbL,
31976         0x5ec256697a2b2dc7L },
31977       { 0xaf4d2e064c3beb01L,0x852123d07acea556L,0x0e9470faf783487aL,
31978         0x75a7ea045664b3ebL } },
31979     /* 28 << 147 */
31980     { { 0x4ad78f356798e4baL,0x9214e6e5c7d0e091L,0xc420b488b1290403L,
31981         0x64049e0afc295749L },
31982       { 0x03ef5af13ae9841fL,0xdbe4ca19b0b662a6L,0x46845c5ffa453458L,
31983         0xf8dabf1910b66722L } },
31984     /* 29 << 147 */
31985     { { 0xb650f0aacce2793bL,0x71db851ec5ec47c1L,0x3eb78f3e3b234fa9L,
31986         0xb0c60f35fc0106ceL },
31987       { 0x05427121774eadbdL,0x25367fafce323863L,0x7541b5c9cd086976L,
31988         0x4ff069e2dc507ad1L } },
31989     /* 30 << 147 */
31990     { { 0x741452568776e667L,0x6e76142cb23c6bb5L,0xdbf307121b3a8a87L,
31991         0x60e7363e98450836L },
31992       { 0x5741450eb7366d80L,0xe4ee14ca4837dbdfL,0xa765eb9b69d4316fL,
31993         0x04548dca8ef43825L } },
31994     /* 31 << 147 */
31995     { { 0x9c9f4e4c5ae888ebL,0x733abb5156e9ac99L,0xdaad3c20ba6ac029L,
31996         0x9b8dd3d32ba3e38eL },
31997       { 0xa9bb4c920bc5d11aL,0xf20127a79c5f88a3L,0x4f52b06e161d3cb8L,
31998         0x26c1ff096afaf0a6L } },
31999     /* 32 << 147 */
32000     { { 0x32670d2f7189e71fL,0xc64387485ecf91e7L,0x15758e57db757a21L,
32001         0x427d09f8290a9ce5L },
32002       { 0x846a308f38384a7aL,0xaac3acb4b0732b99L,0x9e94100917845819L,
32003         0x95cba111a7ce5e03L } },
32004     /* 33 << 147 */
32005     { { 0x6f3d4f7fb00009c4L,0xb8396c278ff28b5fL,0xb1a9ae431c97975dL,
32006         0x9d7ba8afe5d9fed5L },
32007       { 0x338cf09f34f485b6L,0xbc0ddacc64122516L,0xa450da1205d471feL,
32008         0x4c3a6250628dd8c9L } },
32009     /* 34 << 147 */
32010     { { 0x69c7d103d1295837L,0xa2893e503807eb2fL,0xd6e1e1debdb41491L,
32011         0xc630745b5e138235L },
32012       { 0xc892109e48661ae1L,0x8d17e7ebea2b2674L,0x00ec0f87c328d6b5L,
32013         0x6d858645f079ff9eL } },
32014     /* 35 << 147 */
32015     { { 0x6cdf243e19115eadL,0x1ce1393e4bac4fcfL,0x2c960ed09c29f25bL,
32016         0x59be4d8e9d388a05L },
32017       { 0x0d46e06cd0def72bL,0xb923db5de0342748L,0xf7d3aacd936d4a3dL,
32018         0x558519cc0b0b099eL } },
32019     /* 36 << 147 */
32020     { { 0x3ea8ebf8827097efL,0x259353dbd054f55dL,0x84c89abc6d2ed089L,
32021         0x5c548b698e096a7cL },
32022       { 0xd587f616994b995dL,0x4d1531f6a5845601L,0x792ab31e451fd9f0L,
32023         0xc8b57bb265adf6caL } },
32024     /* 37 << 147 */
32025     { { 0x68440fcb1cd5ad73L,0xb9c860e66144da4fL,0x2ab286aa8462beb8L,
32026         0xcc6b8fffef46797fL },
32027       { 0xac820da420c8a471L,0x69ae05a177ff7fafL,0xb9163f39bfb5da77L,
32028         0xbd03e5902c73ab7aL } },
32029     /* 38 << 147 */
32030     { { 0x7e862b5eb2940d9eL,0x3c663d864b9af564L,0xd8309031bde3033dL,
32031         0x298231b2d42c5bc6L },
32032       { 0x42090d2c552ad093L,0xa4799d1cff854695L,0x0a88b5d6d31f0d00L,
32033         0xf8b40825a2f26b46L } },
32034     /* 39 << 147 */
32035     { { 0xec29b1edf1bd7218L,0xd491c53b4b24c86eL,0xd2fe588f3395ea65L,
32036         0x6f3764f74456ef15L },
32037       { 0xdb43116dcdc34800L,0xcdbcd456c1e33955L,0xefdb554074ab286bL,
32038         0x948c7a51d18c5d7cL } },
32039     /* 40 << 147 */
32040     { { 0xeb81aa377378058eL,0x41c746a104411154L,0xa10c73bcfb828ac7L,
32041         0x6439be919d972b29L },
32042       { 0x4bf3b4b043a2fbadL,0x39e6dadf82b5e840L,0x4f7164086397bd4cL,
32043         0x0f7de5687f1eeccbL } },
32044     /* 41 << 147 */
32045     { { 0x5865c5a1d2ffbfc1L,0xf74211fa4ccb6451L,0x66368a88c0b32558L,
32046         0x5b539dc29ad7812eL },
32047       { 0x579483d02f3af6f6L,0x5213207899934eceL,0x50b9650fdcc9e983L,
32048         0xca989ec9aee42b8aL } },
32049     /* 42 << 147 */
32050     { { 0x6a44c829d6f62f99L,0x8f06a3094c2a7c0cL,0x4ea2b3a098a0cb0aL,
32051         0x5c547b70beee8364L },
32052       { 0x461d40e1682afe11L,0x9e0fc77a7b41c0a8L,0x79e4aefde20d5d36L,
32053         0x2916e52032dd9f63L } },
32054     /* 43 << 147 */
32055     { { 0xf59e52e83f883fafL,0x396f96392b868d35L,0xc902a9df4ca19881L,
32056         0x0fc96822db2401a6L },
32057       { 0x4123758766f1c68dL,0x10fc6de3fb476c0dL,0xf8b6b579841f5d90L,
32058         0x2ba8446cfa24f44aL } },
32059     /* 44 << 147 */
32060     { { 0xa237b920ef4a9975L,0x60bb60042330435fL,0xd6f4ab5acfb7e7b5L,
32061         0xb2ac509783435391L },
32062       { 0xf036ee2fb0d1ea67L,0xae779a6a74c56230L,0x59bff8c8ab838ae6L,
32063         0xcd83ca999b38e6f0L } },
32064     /* 45 << 147 */
32065     { { 0xbb27bef5e33deed3L,0xe6356f6f001892a8L,0xbf3be6cc7adfbd3eL,
32066         0xaecbc81c33d1ac9dL },
32067       { 0xe4feb909e6e861dcL,0x90a247a453f5f801L,0x01c50acb27346e57L,
32068         0xce29242e461acc1bL } },
32069     /* 46 << 147 */
32070     { { 0x04dd214a2f998a91L,0x271ee9b1d4baf27bL,0x7e3027d1e8c26722L,
32071         0x21d1645c1820dce5L },
32072       { 0x086f242c7501779cL,0xf0061407fa0e8009L,0xf23ce47760187129L,
32073         0x05bbdedb0fde9bd0L } },
32074     /* 47 << 147 */
32075     { { 0x682f483225d98473L,0xf207fe855c658427L,0xb6fdd7ba4166ffa1L,
32076         0x0c3140569eed799dL },
32077       { 0x0db8048f4107e28fL,0x74ed387141216840L,0x74489f8f56a3c06eL,
32078         0x1e1c005b12777134L } },
32079     /* 48 << 147 */
32080     { { 0xdb332a73f37ec3c3L,0xc65259bddd59eba0L,0x2291709cdb4d3257L,
32081         0x9a793b25bd389390L },
32082       { 0xf39fe34be43756f0L,0x2f76bdce9afb56c9L,0x9f37867a61208b27L,
32083         0xea1d4307089972c3L } },
32084     /* 49 << 147 */
32085     { { 0x8c5953308bdf623aL,0x5f5accda8441fb7dL,0xfafa941832ddfd95L,
32086         0x6ad40c5a0fde9be7L },
32087       { 0x43faba89aeca8709L,0xc64a7cf12c248a9dL,0x1662025272637a76L,
32088         0xaee1c79122b8d1bbL } },
32089     /* 50 << 147 */
32090     { { 0xf0f798fd21a843b2L,0x56e4ed4d8d005cb1L,0x355f77801f0d8abeL,
32091         0x197b04cf34522326L },
32092       { 0x41f9b31ffd42c13fL,0x5ef7feb2b40f933dL,0x27326f425d60bad4L,
32093         0x027ecdb28c92cf89L } },
32094     /* 51 << 147 */
32095     { { 0x04aae4d14e3352feL,0x08414d2f73591b90L,0x5ed6124eb7da7d60L,
32096         0xb985b9314d13d4ecL },
32097       { 0xa592d3ab96bf36f9L,0x012dbed5bbdf51dfL,0xa57963c0df6c177dL,
32098         0x010ec86987ca29cfL } },
32099     /* 52 << 147 */
32100     { { 0xba1700f6bf926dffL,0x7c9fdbd1f4bf6bc2L,0xdc18dc8f64da11f5L,
32101         0xa6074b7ad938ae75L },
32102       { 0x14270066e84f44a4L,0x99998d38d27b954eL,0xc1be8ab2b4f38e9aL,
32103         0x8bb55bbf15c01016L } },
32104     /* 53 << 147 */
32105     { { 0xf73472b40ea2ab30L,0xd365a340f73d68ddL,0xc01a716819c2e1ebL,
32106         0x32f49e3734061719L },
32107       { 0xb73c57f101d8b4d6L,0x03c8423c26b47700L,0x321d0bc8a4d8826aL,
32108         0x6004213c4bc0e638L } },
32109     /* 54 << 147 */
32110     { { 0xf78c64a1c1c06681L,0x16e0a16fef018e50L,0x31cbdf91db42b2b3L,
32111         0xf8f4ffcee0d36f58L },
32112       { 0xcdcc71cd4cc5e3e0L,0xd55c7cfaa129e3e0L,0xccdb6ba00fb2cbf1L,
32113         0x6aba0005c4bce3cbL } },
32114     /* 55 << 147 */
32115     { { 0x501cdb30d232cfc4L,0x9ddcf12ed58a3cefL,0x02d2cf9c87e09149L,
32116         0xdc5d7ec72c976257L },
32117       { 0x6447986e0b50d7ddL,0x88fdbaf7807f112aL,0x58c9822ab00ae9f6L,
32118         0x6abfb9506d3d27e0L } },
32119     /* 56 << 147 */
32120     { { 0xd0a744878a429f4fL,0x0649712bdb516609L,0xb826ba57e769b5dfL,
32121         0x82335df21fc7aaf2L },
32122       { 0x2389f0675c93d995L,0x59ac367a68677be6L,0xa77985ff21d9951bL,
32123         0x038956fb85011cceL } },
32124     /* 57 << 147 */
32125     { { 0x608e48cbbb734e37L,0xc08c0bf22be5b26fL,0x17bbdd3bf9b1a0d9L,
32126         0xeac7d89810483319L },
32127       { 0xc95c4bafbc1a6deaL,0xfdd0e2bf172aafdbL,0x40373cbc8235c41aL,
32128         0x14303f21fb6f41d5L } },
32129     /* 58 << 147 */
32130     { { 0xba0636210408f237L,0xcad3b09aecd2d1edL,0x4667855a52abb6a2L,
32131         0xba9157dcaa8b417bL },
32132       { 0xfe7f35074f013efbL,0x1b112c4baa38c4a2L,0xa1406a609ba64345L,
32133         0xe53cba336993c80bL } },
32134     /* 59 << 147 */
32135     { { 0x45466063ded40d23L,0x3d5f1f4d54908e25L,0x9ebefe62403c3c31L,
32136         0x274ea0b50672a624L },
32137       { 0xff818d99451d1b71L,0x80e826438f79cf79L,0xa165df1373ce37f5L,
32138         0xa744ef4ffe3a21fdL } },
32139     /* 60 << 147 */
32140     { { 0x73f1e7f5cf551396L,0xc616898e868c676bL,0x671c28c78c442c36L,
32141         0xcfe5e5585e0a317dL },
32142       { 0x1242d8187051f476L,0x56fad2a614f03442L,0x262068bc0a44d0f6L,
32143         0xdfa2cd6ece6edf4eL } },
32144     /* 61 << 147 */
32145     { { 0x0f43813ad15d1517L,0x61214cb2377d44f5L,0xd399aa29c639b35fL,
32146         0x42136d7154c51c19L },
32147       { 0x9774711b08417221L,0x0a5546b352545a57L,0x80624c411150582dL,
32148         0x9ec5c418fbc555bcL } },
32149     /* 62 << 147 */
32150     { { 0x2c87dcad771849f1L,0xb0c932c501d7bf6fL,0x6aa5cd3e89116eb2L,
32151         0xd378c25a51ca7bd3L },
32152       { 0xc612a0da9e6e3e31L,0x0417a54db68ad5d0L,0x00451e4a22c6edb8L,
32153         0x9fbfe019b42827ceL } },
32154     /* 63 << 147 */
32155     { { 0x2fa92505ba9384a2L,0x21b8596e64ad69c1L,0x8f4fcc49983b35a6L,
32156         0xde09376072754672L },
32157       { 0x2f14ccc8f7bffe6dL,0x27566bff5d94263dL,0xb5b4e9c62df3ec30L,
32158         0x94f1d7d53e6ea6baL } },
32159     /* 64 << 147 */
32160     { { 0x97b7851aaaca5e9bL,0x518aa52156713b97L,0x3357e8c7150a61f6L,
32161         0x7842e7e2ec2c2b69L },
32162       { 0x8dffaf656868a548L,0xd963bd82e068fc81L,0x64da5c8b65917733L,
32163         0x927090ff7b247328L } },
32164     /* 0 << 154 */
32165     { { 0x00, 0x00, 0x00, 0x00 },
32166       { 0x00, 0x00, 0x00, 0x00 } },
32167     /* 1 << 154 */
32168     { { 0x214bc9a7d298c241L,0xe3b697ba56807cfdL,0xef1c78024564eadbL,
32169         0xdde8cdcfb48149c5L },
32170       { 0x946bf0a75a4d2604L,0x27154d7f6c1538afL,0x95cc9230de5b1fccL,
32171         0xd88519e966864f82L } },
32172     /* 2 << 154 */
32173     { { 0xb828dd1a7cb1282cL,0xa08d7626be46973aL,0x6baf8d40e708d6b2L,
32174         0x72571fa14daeb3f3L },
32175       { 0x85b1732ff22dfd98L,0x87ab01a70087108dL,0xaaaafea85988207aL,
32176         0xccc832f869f00755L } },
32177     /* 3 << 154 */
32178     { { 0x964d950e36ff3bf0L,0x8ad20f6ff0b34638L,0x4d9177b3b5d7585fL,
32179         0xcf839760ef3f019fL },
32180       { 0x582fc5b38288c545L,0x2f8e4e9b13116bd1L,0xf91e1b2f332120efL,
32181         0xcf5687242a17dd23L } },
32182     /* 4 << 154 */
32183     { { 0x488f1185ca8d9d1aL,0xadf2c77dd987ded2L,0x5f3039f060c46124L,
32184         0xe5d70b7571e095f4L },
32185       { 0x82d586506260e70fL,0x39d75ea7f750d105L,0x8cf3d0b175bac364L,
32186         0xf3a7564d21d01329L } },
32187     /* 5 << 154 */
32188     { { 0x182f04cd2f52d2a7L,0x4fde149ae2df565aL,0xb80c5eeca79fb2f7L,
32189         0xab491d7b22ddc897L },
32190       { 0x99d76c18c6312c7fL,0xca0d5f3d6aa41a57L,0x71207325d15363a0L,
32191         0xe82aa265beb252c2L } },
32192     /* 6 << 154 */
32193     { { 0x94ab4700ec3128c2L,0x6c76d8628e383f49L,0xdc36b150c03024ebL,
32194         0xfb43947753daac69L },
32195       { 0xfc68764a8dc79623L,0x5b86995db440fbb2L,0xd66879bfccc5ee0dL,
32196         0x0522894295aa8bd3L } },
32197     /* 7 << 154 */
32198     { { 0xb51a40a51e6a75c1L,0x24327c760ea7d817L,0x0663018207774597L,
32199         0xd6fdbec397fa7164L },
32200       { 0x20c99dfb13c90f48L,0xd6ac5273686ef263L,0xc6a50bdcfef64eebL,
32201         0xcd87b28186fdfc32L } },
32202     /* 8 << 154 */
32203     { { 0xb24aa43e3fcd3efcL,0xdd26c034b8088e9aL,0xa5ef4dc9bd3d46eaL,
32204         0xa2f99d588a4c6a6fL },
32205       { 0xddabd3552f1da46cL,0x72c3f8ce1afacdd1L,0xd90c4eee92d40578L,
32206         0xd28bb41fca623b94L } },
32207     /* 9 << 154 */
32208     { { 0x50fc0711745edc11L,0x9dd9ad7d3dc87558L,0xce6931fbb49d1e64L,
32209         0x6c77a0a2c98bd0f9L },
32210       { 0x62b9a6296baf7cb1L,0xcf065f91ccf72d22L,0x7203cce979639071L,
32211         0x09ae4885f9cb732fL } },
32212     /* 10 << 154 */
32213     { { 0x5e7c3becee8314f3L,0x1c068aeddbea298fL,0x08d381f17c80acecL,
32214         0x03b56be8e330495bL },
32215       { 0xaeffb8f29222882dL,0x95ff38f6c4af8bf7L,0x50e32d351fc57d8cL,
32216         0x6635be5217b444f0L } },
32217     /* 11 << 154 */
32218     { { 0x04d15276a5177900L,0x4e1dbb47f6858752L,0x5b475622c615796cL,
32219         0xa6fa0387691867bfL },
32220       { 0xed7f5d562844c6d0L,0xc633cf9b03a2477dL,0xf6be5c402d3721d6L,
32221         0xaf312eb7e9fd68e6L } },
32222     /* 12 << 154 */
32223     { { 0x242792d2e7417ce1L,0xff42bc71970ee7f5L,0x1ff4dc6d5c67a41eL,
32224         0x77709b7b20882a58L },
32225       { 0x3554731dbe217f2cL,0x2af2a8cd5bb72177L,0x58eee769591dd059L,
32226         0xbb2930c94bba6477L } },
32227     /* 13 << 154 */
32228     { { 0x863ee0477d930cfcL,0x4c262ad1396fd1f4L,0xf4765bc8039af7e1L,
32229         0x2519834b5ba104f6L },
32230       { 0x7cd61b4cd105f961L,0xa5415da5d63bca54L,0x778280a088a1f17cL,
32231         0xc49689492329512cL } },
32232     /* 14 << 154 */
32233     { { 0x174a9126cecdaa7aL,0xfc8c7e0e0b13247bL,0x29c110d23484c1c4L,
32234         0xf8eb8757831dfc3bL },
32235       { 0x022f0212c0067452L,0x3f6f69ee7b9b926cL,0x09032da0ef42daf4L,
32236         0x79f00ade83f80de4L } },
32237     /* 15 << 154 */
32238     { { 0x6210db7181236c97L,0x74f7685b3ee0781fL,0x4df7da7ba3e41372L,
32239         0x2aae38b1b1a1553eL },
32240       { 0x1688e222f6dd9d1bL,0x576954485b8b6487L,0x478d21274b2edeaaL,
32241         0xb2818fa51e85956aL } },
32242     /* 16 << 154 */
32243     { { 0x1e6adddaf176f2c0L,0x01ca4604e2572658L,0x0a404ded85342ffbL,
32244         0x8cf60f96441838d6L },
32245       { 0x9bbc691cc9071c4aL,0xfd58874434442803L,0x97101c85809c0d81L,
32246         0xa7fb754c8c456f7fL } },
32247     /* 17 << 154 */
32248     { { 0xc95f3c5cd51805e1L,0xab4ccd39b299dca8L,0x3e03d20b47eaf500L,
32249         0xfa3165c1d7b80893L },
32250       { 0x005e8b54e160e552L,0xdc4972ba9019d11fL,0x21a6972e0c9a4a7aL,
32251         0xa52c258f37840fd7L } },
32252     /* 18 << 154 */
32253     { { 0xf8559ff4c1e99d81L,0x08e1a7d6a3c617c0L,0xb398fd43248c6ba7L,
32254         0x6ffedd91d1283794L },
32255       { 0x8a6a59d2d629d208L,0xa9d141d53490530eL,0x42f6fc1838505989L,
32256         0x09bf250d479d94eeL } },
32257     /* 19 << 154 */
32258     { { 0x223ad3b1b3822790L,0x6c5926c093b8971cL,0x609efc7e75f7fa62L,
32259         0x45d66a6d1ec2d989L },
32260       { 0x4422d663987d2792L,0x4a73caad3eb31d2bL,0xf06c2ac1a32cb9e6L,
32261         0xd9445c5f91aeba84L } },
32262     /* 20 << 154 */
32263     { { 0x6af7a1d5af71013fL,0xe68216e50bedc946L,0xf4cba30bd27370a0L,
32264         0x7981afbf870421ccL },
32265       { 0x02496a679449f0e1L,0x86cfc4be0a47edaeL,0x3073c936b1feca22L,
32266         0xf569461203f8f8fbL } },
32267     /* 21 << 154 */
32268     { { 0xd063b723901515eaL,0x4c6c77a5749cf038L,0x6361e360ab9e5059L,
32269         0x596cf171a76a37c0L },
32270       { 0x800f53fa6530ae7aL,0x0f5e631e0792a7a6L,0x5cc29c24efdb81c9L,
32271         0xa269e8683f9c40baL } },
32272     /* 22 << 154 */
32273     { { 0xec14f9e12cb7191eL,0x78ea1bd8e5b08ea6L,0x3c65aa9b46332bb9L,
32274         0x84cc22b3bf80ce25L },
32275       { 0x0098e9e9d49d5bf1L,0xcd4ec1c619087da4L,0x3c9d07c5aef6e357L,
32276         0x839a02689f8f64b8L } },
32277     /* 23 << 154 */
32278     { { 0xc5e9eb62c6d8607fL,0x759689f56aa995e4L,0x70464669bbb48317L,
32279         0x921474bfe402417dL },
32280       { 0xcabe135b2a354c8cL,0xd51e52d2812fa4b5L,0xec74109653311fe8L,
32281         0x4f774535b864514bL } },
32282     /* 24 << 154 */
32283     { { 0xbcadd6715bde48f8L,0xc97038732189bc7dL,0x5d45299ec709ee8aL,
32284         0xd1287ee2845aaff8L },
32285       { 0x7d1f8874db1dbf1fL,0xea46588b990c88d6L,0x60ba649a84368313L,
32286         0xd5fdcbce60d543aeL } },
32287     /* 25 << 154 */
32288     { { 0x90b46d43810d5ab0L,0x6739d8f904d7e5ccL,0x021c1a580d337c33L,
32289         0x00a6116268e67c40L },
32290       { 0x95ef413b379f0a1fL,0xfe126605e9e2ab95L,0x67578b852f5f199cL,
32291         0xf5c003292cb84913L } },
32292     /* 26 << 154 */
32293     { { 0xf795643037577dd8L,0x83b82af429c5fe88L,0x9c1bea26cdbdc132L,
32294         0x589fa0869c04339eL },
32295       { 0x033e9538b13799dfL,0x85fa8b21d295d034L,0xdf17f73fbd9ddccaL,
32296         0xf32bd122ddb66334L } },
32297     /* 27 << 154 */
32298     { { 0x55ef88a7858b044cL,0x1f0d69c25aa9e397L,0x55fd9cc340d85559L,
32299         0xc774df727785ddb2L },
32300       { 0x5dcce9f6d3bd2e1cL,0xeb30da20a85dfed0L,0x5ed7f5bbd3ed09c4L,
32301         0x7d42a35c82a9c1bdL } },
32302     /* 28 << 154 */
32303     { { 0xcf3de9959890272dL,0x75f3432a3e713a10L,0x5e13479fe28227b8L,
32304         0xb8561ea9fefacdc8L },
32305       { 0xa6a297a08332aafdL,0x9b0d8bb573809b62L,0xd2fa1cfd0c63036fL,
32306         0x7a16eb55bd64bda8L } },
32307     /* 29 << 154 */
32308     { { 0x3f5cf5f678e62ddcL,0x2267c45407fd752bL,0x5e361b6b5e437bbeL,
32309         0x95c595018354e075L },
32310       { 0xec725f85f2b254d9L,0x844b617d2cb52b4eL,0xed8554f5cf425fb5L,
32311         0xab67703e2af9f312L } },
32312     /* 30 << 154 */
32313     { { 0x4cc34ec13cf48283L,0xb09daa259c8a705eL,0xd1e9d0d05b7d4f84L,
32314         0x4df6ef64db38929dL },
32315       { 0xe16b0763aa21ba46L,0xc6b1d178a293f8fbL,0x0ff5b602d520aabfL,
32316         0x94d671bdc339397aL } },
32317     /* 31 << 154 */
32318     { { 0x7c7d98cf4f5792faL,0x7c5e0d6711215261L,0x9b19a631a7c5a6d4L,
32319         0xc8511a627a45274dL },
32320       { 0x0c16621ca5a60d99L,0xf7fbab88cf5e48cbL,0xab1e6ca2f7ddee08L,
32321         0x83bd08cee7867f3cL } },
32322     /* 32 << 154 */
32323     { { 0xf7e48e8a2ac13e27L,0x4494f6df4eb1a9f5L,0xedbf84eb981f0a62L,
32324         0x49badc32536438f0L },
32325       { 0x50bea541004f7571L,0xbac67d10df1c94eeL,0x253d73a1b727bc31L,
32326         0xb3d01cf230686e28L } },
32327     /* 33 << 154 */
32328     { { 0x51b77b1b55fd0b8bL,0xa099d183feec3173L,0x202b1fb7670e72b7L,
32329         0xadc88b33a8e1635fL },
32330       { 0x34e8216af989d905L,0xc2e68d2029b58d01L,0x11f81c926fe55a93L,
32331         0x15f1462a8f296f40L } },
32332     /* 34 << 154 */
32333     { { 0x1915d375ea3d62f2L,0xa17765a301c8977dL,0x7559710ae47b26f6L,
32334         0xe0bd29c8535077a5L },
32335       { 0x615f976d08d84858L,0x370dfe8569ced5c1L,0xbbc7503ca734fa56L,
32336         0xfbb9f1ec91ac4574L } },
32337     /* 35 << 154 */
32338     { { 0x95d7ec53060dd7efL,0xeef2dacd6e657979L,0x54511af3e2a08235L,
32339         0x1e324aa41f4aea3dL },
32340       { 0x550e7e71e6e67671L,0xbccd5190bf52faf7L,0xf880d316223cc62aL,
32341         0x0d402c7e2b32eb5dL } },
32342     /* 36 << 154 */
32343     { { 0xa40bc039306a5a3bL,0x4e0a41fd96783a1bL,0xa1e8d39a0253cdd4L,
32344         0x6480be26c7388638L },
32345       { 0xee365e1d2285f382L,0x188d8d8fec0b5c36L,0x34ef1a481f0f4d82L,
32346         0x1a8f43e1a487d29aL } },
32347     /* 37 << 154 */
32348     { { 0x8168226d77aefb3aL,0xf69a751e1e72c253L,0x8e04359ae9594df1L,
32349         0x475ffd7dd14c0467L },
32350       { 0xb5a2c2b13844e95cL,0x85caf647dd12ef94L,0x1ecd2a9ff1063d00L,
32351         0x1dd2e22923843311L } },
32352     /* 38 << 154 */
32353     { { 0x38f0e09d73d17244L,0x3ede77468fc653f1L,0xae4459f5dc20e21cL,
32354         0x00db2ffa6a8599eaL },
32355       { 0x11682c3930cfd905L,0x4934d074a5c112a6L,0xbdf063c5568bfe95L,
32356         0x779a440a016c441aL } },
32357     /* 39 << 154 */
32358     { { 0x0c23f21897d6fbdcL,0xd3a5cd87e0776aacL,0xcee37f72d712e8dbL,
32359         0xfb28c70d26f74e8dL },
32360       { 0xffe0c728b61301a0L,0xa6282168d3724354L,0x7ff4cb00768ffedcL,
32361         0xc51b308803b02de9L } },
32362     /* 40 << 154 */
32363     { { 0xa5a8147c3902dda5L,0x35d2f706fe6973b4L,0x5ac2efcfc257457eL,
32364         0x933f48d48700611bL },
32365       { 0xc365af884912beb2L,0x7f5a4de6162edf94L,0xc646ba7c0c32f34bL,
32366         0x632c6af3b2091074L } },
32367     /* 41 << 154 */
32368     { { 0x58d4f2e3753e43a9L,0x70e1d21724d4e23fL,0xb24bf729afede6a6L,
32369         0x7f4a94d8710c8b60L },
32370       { 0xaad90a968d4faa6aL,0xd9ed0b32b066b690L,0x52fcd37b78b6dbfdL,
32371         0x0b64615e8bd2b431L } },
32372     /* 42 << 154 */
32373     { { 0x228e2048cfb9fad5L,0xbeaa386d240b76bdL,0x2d6681c890dad7bcL,
32374         0x3e553fc306d38f5eL },
32375       { 0xf27cdb9b9d5f9750L,0x3e85c52ad28c5b0eL,0x190795af5247c39bL,
32376         0x547831ebbddd6828L } },
32377     /* 43 << 154 */
32378     { { 0xf327a2274a82f424L,0x36919c787e47f89dL,0xe478391943c7392cL,
32379         0xf101b9aa2316fefeL },
32380       { 0xbcdc9e9c1c5009d2L,0xfb55ea139cd18345L,0xf5b5e231a3ce77c7L,
32381         0xde6b4527d2f2cb3dL } },
32382     /* 44 << 154 */
32383     { { 0x10f6a3339bb26f5fL,0x1e85db8e044d85b6L,0xc3697a0894197e54L,
32384         0x65e18cc0a7cb4ea8L },
32385       { 0xa38c4f50a471fe6eL,0xf031747a2f13439cL,0x53c4a6bac007318bL,
32386         0xa8da3ee51deccb3dL } },
32387     /* 45 << 154 */
32388     { { 0x0555b31c558216b1L,0x90c7810c2f79e6c2L,0x9b669f4dfe8eed3cL,
32389         0x70398ec8e0fac126L },
32390       { 0xa96a449ef701b235L,0x0ceecdb3eb94f395L,0x285fc368d0cb7431L,
32391         0x0d37bb5216a18c64L } },
32392     /* 46 << 154 */
32393     { { 0x05110d38b880d2ddL,0xa60f177b65930d57L,0x7da34a67f36235f5L,
32394         0x47f5e17c183816b9L },
32395       { 0xc7664b57db394af4L,0x39ba215d7036f789L,0x46d2ca0e2f27b472L,
32396         0xc42647eef73a84b7L } },
32397     /* 47 << 154 */
32398     { { 0x44bc754564488f1dL,0xaa922708f4cf85d5L,0x721a01d553e4df63L,
32399         0x649c0c515db46cedL },
32400       { 0x6bf0d64e3cffcb6cL,0xe3bf93fe50f71d96L,0x75044558bcc194a0L,
32401         0x16ae33726afdc554L } },
32402     /* 48 << 154 */
32403     { { 0xbfc01adf5ca48f3fL,0x64352f06e22a9b84L,0xcee54da1c1099e4aL,
32404         0xbbda54e8fa1b89c0L },
32405       { 0x166a3df56f6e55fbL,0x1ca44a2420176f88L,0x936afd88dfb7b5ffL,
32406         0xe34c24378611d4a0L } },
32407     /* 49 << 154 */
32408     { { 0x7effbb7586142103L,0x6704ba1b1f34fc4dL,0x7c2a468f10c1b122L,
32409         0x36b3a6108c6aace9L },
32410       { 0xabfcc0a775a0d050L,0x066f91973ce33e32L,0xce905ef429fe09beL,
32411         0x89ee25baa8376351L } },
32412     /* 50 << 154 */
32413     { { 0x2a3ede22fd29dc76L,0x7fd32ed936f17260L,0x0cadcf68284b4126L,
32414         0x63422f08a7951fc8L },
32415       { 0x562b24f40807e199L,0xfe9ce5d122ad4490L,0xc2f51b100db2b1b4L,
32416         0xeb3613ffe4541d0dL } },
32417     /* 51 << 154 */
32418     { { 0xbd2c4a052680813bL,0x527aa55d561b08d6L,0xa9f8a40ea7205558L,
32419         0xe3eea56f243d0becL },
32420       { 0x7b853817a0ff58b3L,0xb67d3f651a69e627L,0x0b76bbb9a869b5d6L,
32421         0xa3afeb82546723edL } },
32422     /* 52 << 154 */
32423     { { 0x5f24416d3e554892L,0x8413b53d430e2a45L,0x99c56aee9032a2a0L,
32424         0x09432bf6eec367b1L },
32425       { 0x552850c6daf0ecc1L,0x49ebce555bc92048L,0xdfb66ba654811307L,
32426         0x1b84f7976f298597L } },
32427     /* 53 << 154 */
32428     { { 0x795904818d1d7a0dL,0xd9fabe033a6fa556L,0xa40f9c59ba9e5d35L,
32429         0xcb1771c1f6247577L },
32430       { 0x542a47cae9a6312bL,0xa34b3560552dd8c5L,0xfdf94de00d794716L,
32431         0xd46124a99c623094L } },
32432     /* 54 << 154 */
32433     { { 0x56b7435d68afe8b4L,0x27f205406c0d8ea1L,0x12b77e1473186898L,
32434         0xdbc3dd467479490fL },
32435       { 0x951a9842c03b0c05L,0x8b1b3bb37921bc96L,0xa573b3462b202e0aL,
32436         0x77e4665d47254d56L } },
32437     /* 55 << 154 */
32438     { { 0x08b70dfcd23e3984L,0xab86e8bcebd14236L,0xaa3e07f857114ba7L,
32439         0x5ac71689ab0ef4f2L },
32440       { 0x88fca3840139d9afL,0x72733f8876644af0L,0xf122f72a65d74f4aL,
32441         0x13931577a5626c7aL } },
32442     /* 56 << 154 */
32443     { { 0xd5b5d9eb70f8d5a4L,0x375adde7d7bbb228L,0x31e88b860c1c0b32L,
32444         0xd1f568c4173edbaaL },
32445       { 0x1592fc835459df02L,0x2beac0fb0fcd9a7eL,0xb0a6fdb81b473b0aL,
32446         0xe3224c6f0fe8fc48L } },
32447     /* 57 << 154 */
32448     { { 0x680bd00ee87edf5bL,0x30385f0220e77cf5L,0xe9ab98c04d42d1b2L,
32449         0x72d191d2d3816d77L },
32450       { 0x1564daca0917d9e5L,0x394eab591f8fed7fL,0xa209aa8d7fbb3896L,
32451         0x5564f3b9be6ac98eL } },
32452     /* 58 << 154 */
32453     { { 0xead21d05d73654efL,0x68d1a9c413d78d74L,0x61e017086d4973a0L,
32454         0x83da350046e6d32aL },
32455       { 0x6a3dfca468ae0118L,0xa1b9a4c9d02da069L,0x0b2ff9c7ebab8302L,
32456         0x98af07c3944ba436L } },
32457     /* 59 << 154 */
32458     { { 0x85997326995f0f9fL,0x467fade071b58bc6L,0x47e4495abd625a2bL,
32459         0xfdd2d01d33c3b8cdL },
32460       { 0x2c38ae28c693f9faL,0x48622329348f7999L,0x97bf738e2161f583L,
32461         0x15ee2fa7565e8cc9L } },
32462     /* 60 << 154 */
32463     { { 0xa1a5c8455777e189L,0xcc10bee0456f2829L,0x8ad95c56da762bd5L,
32464         0x152e2214e9d91da8L },
32465       { 0x975b0e727cb23c74L,0xfd5d7670a90c66dfL,0xb5b5b8ad225ffc53L,
32466         0xab6dff73faded2aeL } },
32467     /* 61 << 154 */
32468     { { 0xebd567816f4cbe9dL,0x0ed8b2496a574bd7L,0x41c246fe81a881faL,
32469         0x91564805c3db9c70L },
32470       { 0xd7c12b085b862809L,0x1facd1f155858d7bL,0x7693747caf09e92aL,
32471         0x3b69dcba189a425fL } },
32472     /* 62 << 154 */
32473     { { 0x0be28e9f967365efL,0x57300eb2e801f5c9L,0x93b8ac6ad583352fL,
32474         0xa2cf1f89cd05b2b7L },
32475       { 0x7c0c9b744dcc40ccL,0xfee38c45ada523fbL,0xb49a4dec1099cc4dL,
32476         0x325c377f69f069c6L } },
32477     /* 63 << 154 */
32478     { { 0xe12458ce476cc9ffL,0x580e0b6cc6d4cb63L,0xd561c8b79072289bL,
32479         0x0377f264a619e6daL },
32480       { 0x2668536288e591a5L,0xa453a7bd7523ca2bL,0x8a9536d2c1df4533L,
32481         0xc8e50f2fbe972f79L } },
32482     /* 64 << 154 */
32483     { { 0xd433e50f6d3549cfL,0x6f33696ffacd665eL,0x695bfdacce11fcb4L,
32484         0x810ee252af7c9860L },
32485       { 0x65450fe17159bb2cL,0xf7dfbebe758b357bL,0x2b057e74d69fea72L,
32486         0xd485717a92731745L } },
32487     /* 0 << 161 */
32488     { { 0x00, 0x00, 0x00, 0x00 },
32489       { 0x00, 0x00, 0x00, 0x00 } },
32490     /* 1 << 161 */
32491     { { 0x896c42e8ee36860cL,0xdaf04dfd4113c22dL,0x1adbb7b744104213L,
32492         0xe5fd5fa11fd394eaL },
32493       { 0x68235d941a4e0551L,0x6772cfbe18d10151L,0x276071e309984523L,
32494         0xe4e879de5a56ba98L } },
32495     /* 2 << 161 */
32496     { { 0xaaafafb0285b9491L,0x01a0be881e4c705eL,0xff1d4f5d2ad9caabL,
32497         0x6e349a4ac37a233fL },
32498       { 0xcf1c12464a1c6a16L,0xd99e6b6629383260L,0xea3d43665f6d5471L,
32499         0x36974d04ff8cc89bL } },
32500     /* 3 << 161 */
32501     { { 0xc26c49a1cfe89d80L,0xb42c026dda9c8371L,0xca6c013adad066d2L,
32502         0xfb8f722856a4f3eeL },
32503       { 0x08b579ecd850935bL,0x34c1a74cd631e1b3L,0xcb5fe596ac198534L,
32504         0x39ff21f6e1f24f25L } },
32505     /* 4 << 161 */
32506     { { 0x27f29e148f929057L,0x7a64ae06c0c853dfL,0x256cd18358e9c5ceL,
32507         0x9d9cce82ded092a5L },
32508       { 0xcc6e59796e93b7c7L,0xe1e4709231bb9e27L,0xb70b3083aa9e29a0L,
32509         0xbf181a753785e644L } },
32510     /* 5 << 161 */
32511     { { 0xf53f2c658ead09f7L,0x1335e1d59780d14dL,0x69cc20e0cd1b66bcL,
32512         0x9b670a37bbe0bfc8L },
32513       { 0xce53dc8128efbeedL,0x0c74e77c8326a6e5L,0x3604e0d2b88e9a63L,
32514         0xbab38fca13dc2248L } },
32515     /* 6 << 161 */
32516     { { 0x8ed6e8c85c0a3f1eL,0xbcad24927c87c37fL,0xfdfb62bb9ee3b78dL,
32517         0xeba8e477cbceba46L },
32518       { 0x37d38cb0eeaede4bL,0x0bc498e87976deb6L,0xb2944c046b6147fbL,
32519         0x8b123f35f71f9609L } },
32520     /* 7 << 161 */
32521     { { 0xa155dcc7de79dc24L,0xf1168a32558f69cdL,0xbac215950d1850dfL,
32522         0x15c8295bb204c848L },
32523       { 0xf661aa367d8184ffL,0xc396228e30447bdbL,0x11cd5143bde4a59eL,
32524         0xe3a26e3b6beab5e6L } },
32525     /* 8 << 161 */
32526     { { 0xd3b3a13f1402b9d0L,0x573441c32c7bc863L,0x4b301ec4578c3e6eL,
32527         0xc26fc9c40adaf57eL },
32528       { 0x96e71bfd7493cea3L,0xd05d4b3f1af81456L,0xdaca2a8a6a8c608fL,
32529         0x53ef07f60725b276L } },
32530     /* 9 << 161 */
32531     { { 0x07a5fbd27824fc56L,0x3467521813289077L,0x5bf69fd5e0c48349L,
32532         0xa613ddd3b6aa7875L },
32533       { 0x7f78c19c5450d866L,0x46f4409c8f84a481L,0x9f1d192890fce239L,
32534         0x016c4168b2ce44b9L } },
32535     /* 10 << 161 */
32536     { { 0xbae023f0c7435978L,0xb152c88820e30e19L,0x9c241645e3fa6fafL,
32537         0x735d95c184823e60L },
32538       { 0x0319757303955317L,0x0b4b02a9f03b4995L,0x076bf55970274600L,
32539         0x32c5cc53aaf57508L } },
32540     /* 11 << 161 */
32541     { { 0xe8af6d1f60624129L,0xb7bc5d649a5e2b5eL,0x3814b0485f082d72L,
32542         0x76f267f2ce19677aL },
32543       { 0x626c630fb36eed93L,0x55230cd73bf56803L,0x78837949ce2736a0L,
32544         0x0d792d60aa6c55f1L } },
32545     /* 12 << 161 */
32546     { { 0x0318dbfdd5c7c5d2L,0xb38f8da7072b342dL,0x3569bddc7b8de38aL,
32547         0xf25b5887a1c94842L },
32548       { 0xb2d5b2842946ad60L,0x854f29ade9d1707eL,0xaa5159dc2c6a4509L,
32549         0x899f94c057189837L } },
32550     /* 13 << 161 */
32551     { { 0xcf6adc51f4a55b03L,0x261762de35e3b2d5L,0x4cc4301204827b51L,
32552         0xcd22a113c6021442L },
32553       { 0xce2fd61a247c9569L,0x59a50973d152becaL,0x6c835a1163a716d4L,
32554         0xc26455ed187dedcfL } },
32555     /* 14 << 161 */
32556     { { 0x27f536e049ce89e7L,0x18908539cc890cb5L,0x308909abd83c2aa1L,
32557         0xecd3142b1ab73bd3L },
32558       { 0x6a85bf59b3f5ab84L,0x3c320a68f2bea4c6L,0xad8dc5386da4541fL,
32559         0xeaf34eb0b7c41186L } },
32560     /* 15 << 161 */
32561     { { 0x1c780129977c97c4L,0x5ff9beebc57eb9faL,0xa24d0524c822c478L,
32562         0xfd8eec2a461cd415L },
32563       { 0xfbde194ef027458cL,0xb4ff53191d1be115L,0x63f874d94866d6f4L,
32564         0x35c75015b21ad0c9L } },
32565     /* 16 << 161 */
32566     { { 0xa6b5c9d646ac49d2L,0x42c77c0b83137aa9L,0x24d000fc68225a38L,
32567         0x0f63cfc82fe1e907L },
32568       { 0x22d1b01bc6441f95L,0x7d38f719ec8e448fL,0x9b33fa5f787fb1baL,
32569         0x94dcfda1190158dfL } },
32570     /* 17 << 161 */
32571     { { 0xc47cb3395f6d4a09L,0x6b4f355cee52b826L,0x3d100f5df51b930aL,
32572         0xf4512fac9f668f69L },
32573       { 0x546781d5206c4c74L,0xd021d4d4cb4d2e48L,0x494a54c2ca085c2dL,
32574         0xf1dbaca4520850a8L } },
32575     /* 18 << 161 */
32576     { { 0x63c79326490a1acaL,0xcb64dd9c41526b02L,0xbb772591a2979258L,
32577         0x3f58297048d97846L },
32578       { 0xd66b70d17c213ba7L,0xc28febb5e8a0ced4L,0x6b911831c10338c1L,
32579         0x0d54e389bf0126f3L } },
32580     /* 19 << 161 */
32581     { { 0x7048d4604af206eeL,0x786c88f677e97cb9L,0xd4375ae1ac64802eL,
32582         0x469bcfe1d53ec11cL },
32583       { 0xfc9b340d47062230L,0xe743bb57c5b4a3acL,0xfe00b4aa59ef45acL,
32584         0x29a4ef2359edf188L } },
32585     /* 20 << 161 */
32586     { { 0x40242efeb483689bL,0x2575d3f6513ac262L,0xf30037c80ca6db72L,
32587         0xc9fcce8298864be2L },
32588       { 0x84a112ff0149362dL,0x95e575821c4ae971L,0x1fa4b1a8945cf86cL,
32589         0x4525a7340b024a2fL } },
32590     /* 21 << 161 */
32591     { { 0xe76c8b628f338360L,0x483ff59328edf32bL,0x67e8e90a298b1aecL,
32592         0x9caab338736d9a21L },
32593       { 0x5c09d2fd66892709L,0x2496b4dcb55a1d41L,0x93f5fb1ae24a4394L,
32594         0x08c750496fa8f6c1L } },
32595     /* 22 << 161 */
32596     { { 0xcaead1c2c905d85fL,0xe9d7f7900733ae57L,0x24c9a65cf07cdd94L,
32597         0x7389359ca4b55931L },
32598       { 0xf58709b7367e45f7L,0x1f203067cb7e7adcL,0x82444bffc7b72818L,
32599         0x07303b35baac8033L } },
32600     /* 23 << 161 */
32601     { { 0x1e1ee4e4d13b7ea1L,0xe6489b24e0e74180L,0xa5f2c6107e70ef70L,
32602         0xa1655412bdd10894L },
32603       { 0x555ebefb7af4194eL,0x533c1c3c8e89bd9cL,0x735b9b5789895856L,
32604         0x15fb3cd2567f5c15L } },
32605     /* 24 << 161 */
32606     { { 0x057fed45526f09fdL,0xe8a4f10c8128240aL,0x9332efc4ff2bfd8dL,
32607         0x214e77a0bd35aa31L },
32608       { 0x32896d7314faa40eL,0x767867ec01e5f186L,0xc9adf8f117a1813eL,
32609         0xcb6cda7854741795L } },
32610     /* 25 << 161 */
32611     { { 0xb7521b6d349d51aaL,0xf56b5a9ee3c7b8e9L,0xc6f1e5c932a096dfL,
32612         0x083667c4a3635024L },
32613       { 0x365ea13518087f2fL,0xf1b8eaacd136e45dL,0xc8a0e48473aec989L,
32614         0xd75a324b142c9259L } },
32615     /* 26 << 161 */
32616     { { 0xb7b4d00101dae185L,0x45434e0b9b7a94bcL,0xf54339affbd8cb0bL,
32617         0xdcc4569ee98ef49eL },
32618       { 0x7789318a09a51299L,0x81b4d206b2b025d8L,0xf64aa418fae85792L,
32619         0x3e50258facd7baf7L } },
32620     /* 27 << 161 */
32621     { { 0xdce84cdb2996864bL,0xa2e670891f485fa4L,0xb28b2bb6534c6a5aL,
32622         0x31a7ec6bc94b9d39L },
32623       { 0x1d217766d6bc20daL,0x4acdb5ec86761190L,0x6872632873701063L,
32624         0x4d24ee7c2128c29bL } },
32625     /* 28 << 161 */
32626     { { 0xc072ebd3a19fd868L,0x612e481cdb8ddd3bL,0xb4e1d7541a64d852L,
32627         0x00ef95acc4c6c4abL },
32628       { 0x1536d2edaa0a6c46L,0x6129408643774790L,0x54af25e8343fda10L,
32629         0x9ff9d98dfd25d6f2L } },
32630     /* 29 << 161 */
32631     { { 0x0746af7c468b8835L,0x977a31cb730ecea7L,0xa5096b80c2cf4a81L,
32632         0xaa9868336458c37aL },
32633       { 0x6af29bf3a6bd9d34L,0x6a62fe9b33c5d854L,0x50e6c304b7133b5eL,
32634         0x04b601597d6e6848L } },
32635     /* 30 << 161 */
32636     { { 0x4cd296df5579bea4L,0x10e35ac85ceedaf1L,0x04c4c5fde3bcc5b1L,
32637         0x95f9ee8a89412cf9L },
32638       { 0x2c9459ee82b6eb0fL,0x2e84576595c2aaddL,0x774a84aed327fcfeL,
32639         0xd8c937220368d476L } },
32640     /* 31 << 161 */
32641     { { 0x0dbd5748f83e8a3bL,0xa579aa968d2495f3L,0x535996a0ae496e9bL,
32642         0x07afbfe9b7f9bcc2L },
32643       { 0x3ac1dc6d5b7bd293L,0x3b592cff7022323dL,0xba0deb989c0a3e76L,
32644         0x18e78e9f4b197acbL } },
32645     /* 32 << 161 */
32646     { { 0x211cde10296c36efL,0x7ee8967282c4da77L,0xb617d270a57836daL,
32647         0xf0cd9c319cb7560bL },
32648       { 0x01fdcbf7e455fe90L,0x3fb53cbb7e7334f3L,0x781e2ea44e7de4ecL,
32649         0x8adab3ad0b384fd0L } },
32650     /* 33 << 161 */
32651     { { 0x129eee2f53d64829L,0x7a471e17a261492bL,0xe4f9adb9e4cb4a2cL,
32652         0x3d359f6f97ba2c2dL },
32653       { 0x346c67860aacd697L,0x92b444c375c2f8a8L,0xc79fa117d85df44eL,
32654         0x56782372398ddf31L } },
32655     /* 34 << 161 */
32656     { { 0x60e690f2bbbab3b8L,0x4851f8ae8b04816bL,0xc72046ab9c92e4d2L,
32657         0x518c74a17cf3136bL },
32658       { 0xff4eb50af9877d4cL,0x14578d90a919cabbL,0x8218f8c4ac5eb2b6L,
32659         0xa3ccc547542016e4L } },
32660     /* 35 << 161 */
32661     { { 0x025bf48e327f8349L,0xf3e97346f43cb641L,0xdc2bafdf500f1085L,
32662         0x571678762f063055L },
32663       { 0x5bd914b9411925a6L,0x7c078d48a1123de5L,0xee6bf835182b165dL,
32664         0xb11b5e5bba519727L } },
32665     /* 36 << 161 */
32666     { { 0xe33ea76c1eea7b85L,0x2352b46192d4f85eL,0xf101d334afe115bbL,
32667         0xfabc1294889175a3L },
32668       { 0x7f6bcdc05233f925L,0xe0a802dbe77fec55L,0xbdb47b758069b659L,
32669         0x1c5e12def98fbd74L } },
32670     /* 37 << 161 */
32671     { { 0x869c58c64b8457eeL,0xa5360f694f7ea9f7L,0xe576c09ff460b38fL,
32672         0x6b70d54822b7fb36L },
32673       { 0x3fd237f13bfae315L,0x33797852cbdff369L,0x97df25f525b516f9L,
32674         0x46f388f2ba38ad2dL } },
32675     /* 38 << 161 */
32676     { { 0x656c465889d8ddbbL,0x8830b26e70f38ee8L,0x4320fd5cde1212b0L,
32677         0xc34f30cfe4a2edb2L },
32678       { 0xabb131a356ab64b8L,0x7f77f0ccd99c5d26L,0x66856a37bf981d94L,
32679         0x19e76d09738bd76eL } },
32680     /* 39 << 161 */
32681     { { 0xe76c8ac396238f39L,0xc0a482bea830b366L,0xb7b8eaff0b4eb499L,
32682         0x8ecd83bc4bfb4865L },
32683       { 0x971b2cb7a2f3776fL,0xb42176a4f4b88adfL,0xb9617df5be1fa446L,
32684         0x8b32d508cd031bd2L } },
32685     /* 40 << 161 */
32686     { { 0x1c6bd47d53b618c0L,0xc424f46c6a227923L,0x7303ffdedd92d964L,
32687         0xe971287871b5abf2L },
32688       { 0x8f48a632f815561dL,0x85f48ff5d3c055d1L,0x222a14277525684fL,
32689         0xd0d841a067360cc3L } },
32690     /* 41 << 161 */
32691     { { 0x4245a9260b9267c6L,0xc78913f1cf07f863L,0xaa844c8e4d0d9e24L,
32692         0xa42ad5223d5f9017L },
32693       { 0xbd371749a2c989d5L,0x928292dfe1f5e78eL,0x493b383e0a1ea6daL,
32694         0x5136fd8d13aee529L } },
32695     /* 42 << 161 */
32696     { { 0x860c44b1f2c34a99L,0x3b00aca4bf5855acL,0xabf6aaa0faaf37beL,
32697         0x65f436822a53ec08L },
32698       { 0x1d9a5801a11b12e1L,0x78a7ab2ce20ed475L,0x0de1067e9a41e0d5L,
32699         0x30473f5f305023eaL } },
32700     /* 43 << 161 */
32701     { { 0xdd3ae09d169c7d97L,0x5cd5baa4cfaef9cdL,0x5cd7440b65a44803L,
32702         0xdc13966a47f364deL },
32703       { 0x077b2be82b8357c1L,0x0cb1b4c5e9d57c2aL,0x7a4ceb3205ff363eL,
32704         0xf310fa4dca35a9efL } },
32705     /* 44 << 161 */
32706     { { 0xdbb7b352f97f68c6L,0x0c773b500b02cf58L,0xea2e48213c1f96d9L,
32707         0xffb357b0eee01815L },
32708       { 0xb9c924cde0f28039L,0x0b36c95a46a3fbe4L,0x1faaaea45e46db6cL,
32709         0xcae575c31928aaffL } },
32710     /* 45 << 161 */
32711     { { 0x7f671302a70dab86L,0xfcbd12a971c58cfcL,0xcbef9acfbee0cb92L,
32712         0x573da0b9f8c1b583L },
32713       { 0x4752fcfe0d41d550L,0xe7eec0e32155cffeL,0x0fc39fcb545ae248L,
32714         0x522cb8d18065f44eL } },
32715     /* 46 << 161 */
32716     { { 0x263c962a70cbb96cL,0xe034362abcd124a9L,0xf120db283c2ae58dL,
32717         0xb9a38d49fef6d507L },
32718       { 0xb1fd2a821ff140fdL,0xbd162f3020aee7e0L,0x4e17a5d4cb251949L,
32719         0x2aebcb834f7e1c3dL } },
32720     /* 47 << 161 */
32721     { { 0x608eb25f937b0527L,0xf42e1e47eb7d9997L,0xeba699c4b8a53a29L,
32722         0x1f921c71e091b536L },
32723       { 0xcce29e7b5b26bbd5L,0x7a8ef5ed3b61a680L,0xe5ef8043ba1f1c7eL,
32724         0x16ea821718158ddaL } },
32725     /* 48 << 161 */
32726     { { 0x01778a2b599ff0f9L,0x68a923d78104fc6bL,0x5bfa44dfda694ff3L,
32727         0x4f7199dbf7667f12L },
32728       { 0xc06d8ff6e46f2a79L,0x08b5deade9f8131dL,0x02519a59abb4ce7cL,
32729         0xc4f710bcb42aec3eL } },
32730     /* 49 << 161 */
32731     { { 0x3d77b05778bde41aL,0x6474bf80b4186b5aL,0x048b3f6788c65741L,
32732         0xc64519de03c7c154L },
32733       { 0xdf0738460edfcc4fL,0x319aa73748f1aa6bL,0x8b9f8a02ca909f77L,
32734         0x902581397580bfefL } },
32735     /* 50 << 161 */
32736     { { 0xd8bfd3cac0c22719L,0xc60209e4c9ca151eL,0x7a744ab5d9a1a69cL,
32737         0x6de5048b14937f8fL },
32738       { 0x171938d8e115ac04L,0x7df709401c6b16d2L,0xa6aeb6637f8e94e7L,
32739         0xc130388e2a2cf094L } },
32740     /* 51 << 161 */
32741     { { 0x1850be8477f54e6eL,0x9f258a7265d60fe5L,0xff7ff0c06c9146d6L,
32742         0x039aaf90e63a830bL },
32743       { 0x38f27a739460342fL,0x4703148c3f795f8aL,0x1bb5467b9681a97eL,
32744         0x00931ba5ecaeb594L } },
32745     /* 52 << 161 */
32746     { { 0xcdb6719d786f337cL,0xd9c01cd2e704397dL,0x0f4a3f20555c2fefL,
32747         0x004525097c0af223L },
32748       { 0x54a5804784db8e76L,0x3bacf1aa93c8aa06L,0x11ca957cf7919422L,
32749         0x5064105378cdaa40L } },
32750     /* 53 << 161 */
32751     { { 0x7a3038749f7144aeL,0x170c963f43d4acfdL,0x5e14814958ddd3efL,
32752         0xa7bde5829e72dba8L },
32753       { 0x0769da8b6fa68750L,0xfa64e532572e0249L,0xfcaadf9d2619ad31L,
32754         0x87882daaa7b349cdL } },
32755     /* 54 << 161 */
32756     { { 0x9f6eb7316c67a775L,0xcb10471aefc5d0b1L,0xb433750ce1b806b2L,
32757         0x19c5714d57b1ae7eL },
32758       { 0xc0dc8b7bed03fd3fL,0xdd03344f31bc194eL,0xa66c52a78c6320b5L,
32759         0x8bc82ce3d0b6fd93L } },
32760     /* 55 << 161 */
32761     { { 0xf8e13501b35f1341L,0xe53156dd25a43e42L,0xd3adf27e4daeb85cL,
32762         0xb81d8379bbeddeb5L },
32763       { 0x1b0b546e2e435867L,0x9020eb94eba5dd60L,0x37d911618210cb9dL,
32764         0x4c596b315c91f1cfL } },
32765     /* 56 << 161 */
32766     { { 0xb228a90f0e0b040dL,0xbaf02d8245ff897fL,0x2aac79e600fa6122L,
32767         0x248288178e36f557L },
32768       { 0xb9521d31113ec356L,0x9e48861e15eff1f8L,0x2aa1d412e0d41715L,
32769         0x71f8620353f131b8L } },
32770     /* 57 << 161 */
32771     { { 0xf60da8da3fd19408L,0x4aa716dc278d9d99L,0x394531f7a8c51c90L,
32772         0xb560b0e8f59db51cL },
32773       { 0xa28fc992fa34bdadL,0xf024fa149cd4f8bdL,0x5cf530f723a9d0d3L,
32774         0x615ca193e28c9b56L } },
32775     /* 58 << 161 */
32776     { { 0x6d2a483d6f73c51eL,0xa4cb2412ea0dc2ddL,0x50663c411eb917ffL,
32777         0x3d3a74cfeade299eL },
32778       { 0x29b3990f4a7a9202L,0xa9bccf59a7b15c3dL,0x66a3ccdca5df9208L,
32779         0x48027c1443f2f929L } },
32780     /* 59 << 161 */
32781     { { 0xd385377c40b557f0L,0xe001c366cd684660L,0x1b18ed6be2183a27L,
32782         0x879738d863210329L },
32783       { 0xa687c74bbda94882L,0xd1bbcc48a684b299L,0xaf6f1112863b3724L,
32784         0x6943d1b42c8ce9f8L } },
32785     /* 60 << 161 */
32786     { { 0xe044a3bb098cafb4L,0x27ed231060d48cafL,0x542b56753a31b84dL,
32787         0xcbf3dd50fcddbed7L },
32788       { 0x25031f1641b1d830L,0xa7ec851dcb0c1e27L,0xac1c8fe0b5ae75dbL,
32789         0xb24c755708c52120L } },
32790     /* 61 << 161 */
32791     { { 0x57f811dc1d4636c3L,0xf8436526681a9939L,0x1f6bc6d99c81adb3L,
32792         0x840f8ac35b7d80d4L },
32793       { 0x731a9811f4387f1aL,0x7c501cd3b5156880L,0xa5ca4a07dfe68867L,
32794         0xf123d8f05fcea120L } },
32795     /* 62 << 161 */
32796     { { 0x1fbb0e71d607039eL,0x2b70e215cd3a4546L,0x32d2f01d53324091L,
32797         0xb796ff08180ab19bL },
32798       { 0x32d87a863c57c4aaL,0x2aed9cafb7c49a27L,0x9fb35eac31630d98L,
32799         0x338e8cdf5c3e20a3L } },
32800     /* 63 << 161 */
32801     { { 0x80f1618266cde8dbL,0x4e1599802d72fd36L,0xd7b8f13b9b6e5072L,
32802         0xf52139073b7b5dc1L },
32803       { 0x4d431f1d8ce4396eL,0x37a1a680a7ed2142L,0xbf375696d01aaf6bL,
32804         0xaa1c0c54e63aab66L } },
32805     /* 64 << 161 */
32806     { { 0x3014368b4ed80940L,0x67e6d0567a6fceddL,0x7c208c49ca97579fL,
32807         0xfe3d7a81a23597f6L },
32808       { 0x5e2032027e096ae2L,0xb1f3e1e724b39366L,0x26da26f32fdcdffcL,
32809         0x79422f1d6097be83L } },
32810     /* 0 << 168 */
32811     { { 0x00, 0x00, 0x00, 0x00 },
32812       { 0x00, 0x00, 0x00, 0x00 } },
32813     /* 1 << 168 */
32814     { { 0x263a2cfb9db3b381L,0x9c3a2deed4df0a4bL,0x728d06e97d04e61fL,
32815         0x8b1adfbc42449325L },
32816       { 0x6ec1d9397e053a1bL,0xee2be5c766daf707L,0x80ba1e14810ac7abL,
32817         0xdd2ae778f530f174L } },
32818     /* 2 << 168 */
32819     { { 0x0435d97a205b9d8bL,0x6eb8f064056756d4L,0xd5e88a8bb6f8210eL,
32820         0x070ef12dec9fd9eaL },
32821       { 0x4d8495053bcc876aL,0x12a75338a7404ce3L,0xd22b49e1b8a1db5eL,
32822         0xec1f205114bfa5adL } },
32823     /* 3 << 168 */
32824     { { 0xadbaeb79b6828f36L,0x9d7a025801bd5b9eL,0xeda01e0d1e844b0cL,
32825         0x4b625175887edfc9L },
32826       { 0x14109fdd9669b621L,0x88a2ca56f6f87b98L,0xfe2eb788170df6bcL,
32827         0x0cea06f4ffa473f9L } },
32828     /* 4 << 168 */
32829     { { 0x43ed81b5c4e83d33L,0xd9f358795efd488bL,0x164a620f9deb4d0fL,
32830         0xc6927bdbac6a7394L },
32831       { 0x45c28df79f9e0f03L,0x2868661efcd7e1a9L,0x7cf4e8d0ffa348f1L,
32832         0x6bd4c284398538e0L } },
32833     /* 5 << 168 */
32834     { { 0x2618a091289a8619L,0xef796e606671b173L,0x664e46e59090c632L,
32835         0xa38062d41e66f8fbL },
32836       { 0x6c744a200573274eL,0xd07b67e4a9271394L,0x391223b26bdc0e20L,
32837         0xbe2d93f1eb0a05a7L } },
32838     /* 6 << 168 */
32839     { { 0xf23e2e533f36d141L,0xe84bb3d44dfca442L,0xb804a48d6b7c023aL,
32840         0x1e16a8fa76431c3bL },
32841       { 0x1b5452adddd472e0L,0x7d405ee70d1ee127L,0x50fc6f1dffa27599L,
32842         0x351ac53cbf391b35L } },
32843     /* 7 << 168 */
32844     { { 0x7efa14b84444896bL,0x64974d2ff94027fbL,0xefdcd0e8de84487dL,
32845         0x8c45b2602b48989bL },
32846       { 0xa8fcbbc2d8463487L,0xd1b2b3f73fbc476cL,0x21d005b7c8f443c0L,
32847         0x518f2e6740c0139cL } },
32848     /* 8 << 168 */
32849     { { 0x56036e8c06d75fc1L,0x2dcf7bb73249a89fL,0x81dd1d3de245e7ddL,
32850         0xf578dc4bebd6e2a7L },
32851       { 0x4c028903df2ce7a0L,0xaee362889c39afacL,0xdc847c31146404abL,
32852         0x6304c0d8a4e97818L } },
32853     /* 9 << 168 */
32854     { { 0xae51dca2a91f6791L,0x2abe41909baa9efcL,0xd9d2e2f4559c7ac1L,
32855         0xe82f4b51fc9f773aL },
32856       { 0xa77130274073e81cL,0xc0276facfbb596fcL,0x1d819fc9a684f70cL,
32857         0x29b47fddc9f7b1e0L } },
32858     /* 10 << 168 */
32859     { { 0x358de103459b1940L,0xec881c595b013e93L,0x51574c9349532ad3L,
32860         0x2db1d445b37b46deL },
32861       { 0xc6445b87df239fd8L,0xc718af75151d24eeL,0xaea1c4a4f43c6259L,
32862         0x40c0e5d770be02f7L } },
32863     /* 11 << 168 */
32864     { { 0x6a4590f4721b33f2L,0x2124f1fbfedf04eaL,0xf8e53cde9745efe7L,
32865         0xe7e1043265f046d9L },
32866       { 0xc3fca28ee4d0c7e6L,0x847e339a87253b1bL,0x9b5953483743e643L,
32867         0xcb6a0a0b4fd12fc5L } },
32868     /* 12 << 168 */
32869     { { 0xfb6836c327d02dccL,0x5ad009827a68bcc2L,0x1b24b44c005e912dL,
32870         0xcc83d20f811fdcfeL },
32871       { 0x36527ec1666fba0cL,0x6994819714754635L,0xfcdcb1a8556da9c2L,
32872         0xa593426781a732b2L } },
32873     /* 13 << 168 */
32874     { { 0xec1214eda714181dL,0x609ac13b6067b341L,0xff4b4c97a545df1fL,
32875         0xa124050134d2076bL },
32876       { 0x6efa0c231409ca97L,0x254cc1a820638c43L,0xd4e363afdcfb46cdL,
32877         0x62c2adc303942a27L } },
32878     /* 14 << 168 */
32879     { { 0xc67b9df056e46483L,0xa55abb2063736356L,0xab93c098c551bc52L,
32880         0x382b49f9b15fe64bL },
32881       { 0x9ec221ad4dff8d47L,0x79caf615437df4d6L,0x5f13dc64bb456509L,
32882         0xe4c589d9191f0714L } },
32883     /* 15 << 168 */
32884     { { 0x27b6a8ab3fd40e09L,0xe455842e77313ea9L,0x8b51d1e21f55988bL,
32885         0x5716dd73062bbbfcL },
32886       { 0x633c11e54e8bf3deL,0x9a0e77b61b85be3bL,0x565107290911cca6L,
32887         0x27e76495efa6590fL } },
32888     /* 16 << 168 */
32889     { { 0xe4ac8b33070d3aabL,0x2643672b9a2cd5e5L,0x52eff79b1cfc9173L,
32890         0x665ca49b90a7c13fL },
32891       { 0x5a8dda59b3efb998L,0x8a5b922d052f1341L,0xae9ebbab3cf9a530L,
32892         0x35986e7bf56da4d7L } },
32893     /* 17 << 168 */
32894     { { 0x3a636b5cff3513ccL,0xbb0cf8ba3198f7ddL,0xb8d4052241f16f86L,
32895         0x760575d8de13a7bfL },
32896       { 0x36f74e169f7aa181L,0x163a3ecff509ed1cL,0x6aead61f3c40a491L,
32897         0x158c95fcdfe8fcaaL } },
32898     /* 18 << 168 */
32899     { { 0xa3991b6e13cda46fL,0x79482415342faed0L,0xf3ba5bde666b5970L,
32900         0x1d52e6bcb26ab6ddL },
32901       { 0x768ba1e78608dd3dL,0x4930db2aea076586L,0xd9575714e7dc1afaL,
32902         0x1fc7bf7df7c58817L } },
32903     /* 19 << 168 */
32904     { { 0x6b47accdd9eee96cL,0x0ca277fbe58cec37L,0x113fe413e702c42aL,
32905         0xdd1764eec47cbe51L },
32906       { 0x041e7cde7b3ed739L,0x50cb74595ce9e1c0L,0x355685132925b212L,
32907         0x7cff95c4001b081cL } },
32908     /* 20 << 168 */
32909     { { 0x63ee4cbd8088b454L,0xdb7f32f79a9e0c8aL,0xb377d4186b2447cbL,
32910         0xe3e982aad370219bL },
32911       { 0x06ccc1e4c2a2a593L,0x72c368650773f24fL,0xa13b4da795859423L,
32912         0x8bbf1d3375040c8fL } },
32913     /* 21 << 168 */
32914     { { 0x726f0973da50c991L,0x48afcd5b822d6ee2L,0xe5fc718b20fd7771L,
32915         0xb9e8e77dfd0807a1L },
32916       { 0x7f5e0f4499a7703dL,0x6972930e618e36f3L,0x2b7c77b823807bbeL,
32917         0xe5b82405cb27ff50L } },
32918     /* 22 << 168 */
32919     { { 0xba8b8be3bd379062L,0xd64b7a1d2dce4a92L,0x040a73c5b2952e37L,
32920         0x0a9e252ed438aecaL },
32921       { 0xdd43956bc39d3bcbL,0x1a31ca00b32b2d63L,0xd67133b85c417a18L,
32922         0xd08e47902ef442c8L } },
32923     /* 23 << 168 */
32924     { { 0x98cb1ae9255c0980L,0x4bd863812b4a739fL,0x5a5c31e11e4a45a1L,
32925         0x1e5d55fe9cb0db2fL },
32926       { 0x74661b068ff5cc29L,0x026b389f0eb8a4f4L,0x536b21a458848c24L,
32927         0x2e5bf8ec81dc72b0L } },
32928     /* 24 << 168 */
32929     { { 0x03c187d0ad886aacL,0x5c16878ab771b645L,0xb07dfc6fc74045abL,
32930         0x2c6360bf7800caedL },
32931       { 0x24295bb5b9c972a3L,0xc9e6f88e7c9a6dbaL,0x90ffbf2492a79aa6L,
32932         0xde29d50a41c26ac2L } },
32933     /* 25 << 168 */
32934     { { 0x9f0af483d309cbe6L,0x5b020d8ae0bced4fL,0x606e986db38023e3L,
32935         0xad8f2c9d1abc6933L },
32936       { 0x19292e1de7400e93L,0xfe3e18a952be5e4dL,0xe8e9771d2e0680bfL,
32937         0x8c5bec98c54db063L } },
32938     /* 26 << 168 */
32939     { { 0x2af9662a74a55d1fL,0xe3fbf28f046f66d8L,0xa3a72ab4d4dc4794L,
32940         0x09779f455c7c2dd8L },
32941       { 0xd893bdafc3d19d8dL,0xd5a7509457d6a6dfL,0x8cf8fef9952e6255L,
32942         0x3da67cfbda9a8affL } },
32943     /* 27 << 168 */
32944     { { 0x4c23f62a2c160dcdL,0x34e6c5e38f90eaefL,0x35865519a9a65d5aL,
32945         0x07c48aae8fd38a3dL },
32946       { 0xb7e7aeda50068527L,0x2c09ef231c90936aL,0x31ecfeb6e879324cL,
32947         0xa0871f6bfb0ec938L } },
32948     /* 28 << 168 */
32949     { { 0xb1f0fb68d84d835dL,0xc90caf39861dc1e6L,0x12e5b0467594f8d7L,
32950         0x26897ae265012b92L },
32951       { 0xbcf68a08a4d6755dL,0x403ee41c0991fbdaL,0x733e343e3bbf17e8L,
32952         0xd2c7980d679b3d65L } },
32953     /* 29 << 168 */
32954     { { 0x33056232d2e11305L,0x966be492f3c07a6fL,0x6a8878ffbb15509dL,
32955         0xff2211010a9b59a4L },
32956       { 0x6c9f564aabe30129L,0xc6f2c940336e64cfL,0x0fe752628b0c8022L,
32957         0xbe0267e96ae8db87L } },
32958     /* 30 << 168 */
32959     { { 0x22e192f193bc042bL,0xf085b534b237c458L,0xa0d192bd832c4168L,
32960         0x7a76e9e3bdf6271dL },
32961       { 0x52a882fab88911b5L,0xc85345e4b4db0eb5L,0xa3be02a681a7c3ffL,
32962         0x51889c8cf0ec0469L } },
32963     /* 31 << 168 */
32964     { { 0x9d031369a5e829e5L,0xcbb4c6fc1607aa41L,0x75ac59a6241d84c1L,
32965         0xc043f2bf8829e0eeL },
32966       { 0x82a38f758ea5e185L,0x8bda40b9d87cbd9fL,0x9e65e75e2d8fc601L,
32967         0x3d515f74a35690b3L } },
32968     /* 32 << 168 */
32969     { { 0x534acf4fda79e5acL,0x68b83b3a8630215fL,0x5c748b2ed085756eL,
32970         0xb0317258e5d37cb2L },
32971       { 0x6735841ac5ccc2c4L,0x7d7dc96b3d9d5069L,0xa147e410fd1754bdL,
32972         0x65296e94d399ddd5L } },
32973     /* 33 << 168 */
32974     { { 0xf6b5b2d0bc8fa5bcL,0x8a5ead67500c277bL,0x214625e6dfa08a5dL,
32975         0x51fdfedc959cf047L },
32976       { 0x6bc9430b289fca32L,0xe36ff0cf9d9bdc3fL,0x2fe187cb58ea0edeL,
32977         0xed66af205a900b3fL } },
32978     /* 34 << 168 */
32979     { { 0x00e0968b5fa9f4d6L,0x2d4066ce37a362e7L,0xa99a9748bd07e772L,
32980         0x710989c006a4f1d0L },
32981       { 0xd5dedf35ce40cbd8L,0xab55c5f01743293dL,0x766f11448aa24e2cL,
32982         0x94d874f8605fbcb4L } },
32983     /* 35 << 168 */
32984     { { 0xa365f0e8a518001bL,0xee605eb69d04ef0fL,0x5a3915cdba8d4d25L,
32985         0x44c0e1b8b5113472L },
32986       { 0xcbb024e88b6740dcL,0x89087a53ee1d4f0cL,0xa88fa05c1fc4e372L,
32987         0x8bf395cbaf8b3af2L } },
32988     /* 36 << 168 */
32989     { { 0x1e71c9a1deb8568bL,0xa35daea080fb3d32L,0xe8b6f2662cf8fb81L,
32990         0x6d51afe89490696aL },
32991       { 0x81beac6e51803a19L,0xe3d24b7f86219080L,0x727cfd9ddf6f463cL,
32992         0x8c6865ca72284ee8L } },
32993     /* 37 << 168 */
32994     { { 0x32c88b7db743f4efL,0x3793909be7d11dceL,0xd398f9222ff2ebe8L,
32995         0x2c70ca44e5e49796L },
32996       { 0xdf4d9929cb1131b1L,0x7826f29825888e79L,0x4d3a112cf1d8740aL,
32997         0x00384cb6270afa8bL } },
32998     /* 38 << 168 */
32999     { { 0xcb64125b3ab48095L,0x3451c25662d05106L,0xd73d577da4955845L,
33000         0x39570c16bf9f4433L },
33001       { 0xd7dfaad3adecf263L,0xf1c3d8d1dc76e102L,0x5e774a5854c6a836L,
33002         0xdad4b6723e92d47bL } },
33003     /* 39 << 168 */
33004     { { 0xbe7e990ff0d796a0L,0x5fc62478df0e8b02L,0x8aae8bf4030c00adL,
33005         0x3d2db93b9004ba0fL },
33006       { 0xe48c8a79d85d5ddcL,0xe907caa76bb07f34L,0x58db343aa39eaed5L,
33007         0x0ea6e007adaf5724L } },
33008     /* 40 << 168 */
33009     { { 0xe00df169d23233f3L,0x3e32279677cb637fL,0x1f897c0e1da0cf6cL,
33010         0xa651f5d831d6bbddL },
33011       { 0xdd61af191a230c76L,0xbd527272cdaa5e4aL,0xca753636d0abcd7eL,
33012         0x78bdd37c370bd8dcL } },
33013     /* 41 << 168 */
33014     { { 0xc23916c217cd93feL,0x65b97a4ddadce6e2L,0xe04ed4eb174e42f8L,
33015         0x1491ccaabb21480aL },
33016       { 0x145a828023196332L,0x3c3862d7587b479aL,0x9f4a88a301dcd0edL,
33017         0x4da2b7ef3ea12f1fL } },
33018     /* 42 << 168 */
33019     { { 0xf8e7ae33b126e48eL,0x404a0b32f494e237L,0x9beac474c55acadbL,
33020         0x4ee5cf3bcbec9fd9L },
33021       { 0x336b33b97df3c8c3L,0xbd905fe3b76808fdL,0x8f436981aa45c16aL,
33022         0x255c5bfa3dd27b62L } },
33023     /* 43 << 168 */
33024     { { 0x71965cbfc3dd9b4dL,0xce23edbffc068a87L,0xb78d4725745b029bL,
33025         0x74610713cefdd9bdL },
33026       { 0x7116f75f1266bf52L,0x0204672218e49bb6L,0xdf43df9f3d6f19e3L,
33027         0xef1bc7d0e685cb2fL } },
33028     /* 44 << 168 */
33029     { { 0xcddb27c17078c432L,0xe1961b9cb77fedb7L,0x1edc2f5cc2290570L,
33030         0x2c3fefca19cbd886L },
33031       { 0xcf880a36c2af389aL,0x96c610fdbda71ceaL,0xf03977a932aa8463L,
33032         0x8eb7763f8586d90aL } },
33033     /* 45 << 168 */
33034     { { 0x3f3424542a296e77L,0xc871868342837a35L,0x7dc710906a09c731L,
33035         0x54778ffb51b816dbL },
33036       { 0x6b33bfecaf06defdL,0xfe3c105f8592b70bL,0xf937fda461da6114L,
33037         0x3c13e6514c266ad7L } },
33038     /* 46 << 168 */
33039     { { 0xe363a829855938e8L,0x2eeb5d9e9de54b72L,0xbeb93b0e20ccfab9L,
33040         0x3dffbb5f25e61a25L },
33041       { 0x7f655e431acc093dL,0x0cb6cc3d3964ce61L,0x6ab283a1e5e9b460L,
33042         0x55d787c5a1c7e72dL } },
33043     /* 47 << 168 */
33044     { { 0x4d2efd47deadbf02L,0x11e80219ac459068L,0x810c762671f311f0L,
33045         0xfa17ef8d4ab6ef53L },
33046       { 0xaf47fd2593e43bffL,0x5cb5ff3f0be40632L,0x546871068ee61da3L,
33047         0x7764196eb08afd0fL } },
33048     /* 48 << 168 */
33049     { { 0x831ab3edf0290a8fL,0xcae81966cb47c387L,0xaad7dece184efb4fL,
33050         0xdcfc53b34749110eL },
33051       { 0x6698f23c4cb632f9L,0xc42a1ad6b91f8067L,0xb116a81d6284180aL,
33052         0xebedf5f8e901326fL } },
33053     /* 49 << 168 */
33054     { { 0xf2274c9f97e3e044L,0x4201852011d09fc9L,0x56a65f17d18e6e23L,
33055         0x2ea61e2a352b683cL },
33056       { 0x27d291bc575eaa94L,0x9e7bc721b8ff522dL,0x5f7268bfa7f04d6fL,
33057         0x5868c73faba41748L } },
33058     /* 50 << 168 */
33059     { { 0x9f85c2db7be0eeadL,0x511e7842ff719135L,0x5a06b1e9c5ea90d7L,
33060         0x0c19e28326fab631L },
33061       { 0x8af8f0cfe9206c55L,0x89389cb43553c06aL,0x39dbed97f65f8004L,
33062         0x0621b037c508991dL } },
33063     /* 51 << 168 */
33064     { { 0x1c52e63596e78cc4L,0x5385c8b20c06b4a8L,0xd84ddfdbb0e87d03L,
33065         0xc49dfb66934bafadL },
33066       { 0x7071e17059f70772L,0x3a073a843a1db56bL,0x034949033b8af190L,
33067         0x7d882de3d32920f0L } },
33068     /* 52 << 168 */
33069     { { 0x91633f0ab2cf8940L,0x72b0b1786f948f51L,0x2d28dc30782653c8L,
33070         0x88829849db903a05L },
33071       { 0xb8095d0c6a19d2bbL,0x4b9e7f0c86f782cbL,0x7af739882d907064L,
33072         0xd12be0fe8b32643cL } },
33073     /* 53 << 168 */
33074     { { 0x358ed23d0e165dc3L,0x3d47ce624e2378ceL,0x7e2bb0b9feb8a087L,
33075         0x3246e8aee29e10b9L },
33076       { 0x459f4ec703ce2b4dL,0xe9b4ca1bbbc077cfL,0x2613b4f20e9940c1L,
33077         0xfc598bb9047d1eb1L } },
33078     /* 54 << 168 */
33079     { { 0x9744c62b45036099L,0xa9dee742167c65d8L,0x0c511525dabe1943L,
33080         0xda11055493c6c624L },
33081       { 0xae00a52c651a3be2L,0xcda5111d884449a6L,0x063c06f4ff33bed1L,
33082         0x73baaf9a0d3d76b4L } },
33083     /* 55 << 168 */
33084     { { 0x52fb0c9d7fc63668L,0x6886c9dd0c039cdeL,0x602bd59955b22351L,
33085         0xb00cab02360c7c13L },
33086       { 0x8cb616bc81b69442L,0x41486700b55c3ceeL,0x71093281f49ba278L,
33087         0xad956d9c64a50710L } },
33088     /* 56 << 168 */
33089     { { 0x9561f28b638a7e81L,0x54155cdf5980ddc3L,0xb2db4a96d26f247aL,
33090         0x9d774e4e4787d100L },
33091       { 0x1a9e6e2e078637d2L,0x1c363e2d5e0ae06aL,0x7493483ee9cfa354L,
33092         0x76843cb37f74b98dL } },
33093     /* 57 << 168 */
33094     { { 0xbaca6591d4b66947L,0xb452ce9804460a8cL,0x6830d24643768f55L,
33095         0xf4197ed87dff12dfL },
33096       { 0x6521b472400dd0f7L,0x59f5ca8f4b1e7093L,0x6feff11b080338aeL,
33097         0x0ada31f6a29ca3c6L } },
33098     /* 58 << 168 */
33099     { { 0x24794eb694a2c215L,0xd83a43ab05a57ab4L,0x264a543a2a6f89feL,
33100         0x2c2a3868dd5ec7c2L },
33101       { 0xd33739408439d9b2L,0x715ea6720acd1f11L,0x42c1d235e7e6cc19L,
33102         0x81ce6e96b990585cL } },
33103     /* 59 << 168 */
33104     { { 0x04e5dfe0d809c7bdL,0xd7b2580c8f1050abL,0x6d91ad78d8a4176fL,
33105         0x0af556ee4e2e897cL },
33106       { 0x162a8b73921de0acL,0x52ac9c227ea78400L,0xee2a4eeaefce2174L,
33107         0xbe61844e6d637f79L } },
33108     /* 60 << 168 */
33109     { { 0x0491f1bc789a283bL,0x72d3ac3d880836f4L,0xaa1c5ea388e5402dL,
33110         0x1b192421d5cc473dL },
33111       { 0x5c0b99989dc84cacL,0xb0a8482d9c6e75b8L,0x639961d03a191ce2L,
33112         0xda3bc8656d837930L } },
33113     /* 61 << 168 */
33114     { { 0xca990653056e6f8fL,0x84861c4164d133a7L,0x8b403276746abe40L,
33115         0xb7b4d51aebf8e303L },
33116       { 0x05b43211220a255dL,0xc997152c02419e6eL,0x76ff47b6630c2feaL,
33117         0x50518677281fdadeL } },
33118     /* 62 << 168 */
33119     { { 0x3283b8bacf902b0bL,0x8d4b4eb537db303bL,0xcc89f42d755011bcL,
33120         0xb43d74bbdd09d19bL },
33121       { 0x65746bc98adba350L,0x364eaf8cb51c1927L,0x13c7659610ad72ecL,
33122         0x30045121f8d40c20L } },
33123     /* 63 << 168 */
33124     { { 0x6d2d99b7ea7b979bL,0xcd78cd74e6fb3bcdL,0x11e45a9e86cffbfeL,
33125         0x78a61cf4637024f6L },
33126       { 0xd06bc8723d502295L,0xf1376854458cb288L,0xb9db26a1342f8586L,
33127         0xf33effcf4beee09eL } },
33128     /* 64 << 168 */
33129     { { 0xd7e0c4cdb30cfb3aL,0x6d09b8c16c9db4c8L,0x40ba1a4207c8d9dfL,
33130         0x6fd495f71c52c66dL },
33131       { 0xfb0e169f275264daL,0x80c2b746e57d8362L,0xedd987f749ad7222L,
33132         0xfdc229af4398ec7bL } },
33133     /* 0 << 175 */
33134     { { 0x00, 0x00, 0x00, 0x00 },
33135       { 0x00, 0x00, 0x00, 0x00 } },
33136     /* 1 << 175 */
33137     { { 0xb0d1ed8452666a58L,0x4bcb6e00e6a9c3c2L,0x3c57411c26906408L,
33138         0xcfc2075513556400L },
33139       { 0xa08b1c505294dba3L,0xa30ba2868b7dd31eL,0xd70ba90e991eca74L,
33140         0x094e142ce762c2b9L } },
33141     /* 2 << 175 */
33142     { { 0xb81d783e979f3925L,0x1efd130aaf4c89a7L,0x525c2144fd1bf7faL,
33143         0x4b2969041b265a9eL },
33144       { 0xed8e9634b9db65b6L,0x35c82e3203599d8aL,0xdaa7a54f403563f3L,
33145         0x9df088ad022c38abL } },
33146     /* 3 << 175 */
33147     { { 0xe5cfb066bb3fd30aL,0x429169daeff0354eL,0x809cf8523524e36cL,
33148         0x136f4fb30155be1dL },
33149       { 0x4826af011fbba712L,0x6ef0f0b4506ba1a1L,0xd9928b3177aea73eL,
33150         0xe2bf6af25eaa244eL } },
33151     /* 4 << 175 */
33152     { { 0x8d084f124237b64bL,0x688ebe99e3ecfd07L,0x57b8a70cf6845dd8L,
33153         0x808fc59c5da4a325L },
33154       { 0xa9032b2ba3585862L,0xb66825d5edf29386L,0xb5a5a8db431ec29bL,
33155         0xbb143a983a1e8dc8L } },
33156     /* 5 << 175 */
33157     { { 0x35ee94ce12ae381bL,0x3a7f176c86ccda90L,0xc63a657e4606eacaL,
33158         0x9ae5a38043cd04dfL },
33159       { 0x9bec8d15ed251b46L,0x1f5d6d30caca5e64L,0x347b3b359ff20f07L,
33160         0x4d65f034f7e4b286L } },
33161     /* 6 << 175 */
33162     { { 0x9e93ba24f111661eL,0xedced484b105eb04L,0x96dc9ba1f424b578L,
33163         0xbf8f66b7e83e9069L },
33164       { 0x872d4df4d7ed8216L,0xbf07f3778e2cbecfL,0x4281d89998e73754L,
33165         0xfec85fbb8aab8708L } },
33166     /* 7 << 175 */
33167     { { 0x9a3c0deea5ba5b0bL,0xe6a116ce42d05299L,0xae9775fee9b02d42L,
33168         0x72b05200a1545cb6L },
33169       { 0xbc506f7d31a3b4eaL,0xe58930788bbd9b32L,0xc8bc5f37e4b12a97L,
33170         0x6b000c064a73b671L } },
33171     /* 8 << 175 */
33172     { { 0x13b5bf22765fa7d0L,0x59805bf01d6a5370L,0x67a5e29d4280db98L,
33173         0x4f53916f776b1ce3L },
33174       { 0x714ff61f33ddf626L,0x4206238ea085d103L,0x1c50d4b7e5809ee3L,
33175         0x999f450d85f8eb1dL } },
33176     /* 9 << 175 */
33177     { { 0x658a6051e4c79e9bL,0x1394cb73c66a9feaL,0x27f31ed5c6be7b23L,
33178         0xf4c88f365aa6f8feL },
33179       { 0x0fb0721f4aaa499eL,0x68b3a7d5e3fb2a6bL,0xa788097d3a92851dL,
33180         0x060e7f8ae96f4913L } },
33181     /* 10 << 175 */
33182     { { 0x82eebe731a3a93bcL,0x42bbf465a21adc1aL,0xc10b6fa4ef030efdL,
33183         0x247aa4c787b097bbL },
33184       { 0x8b8dc632f60c77daL,0x6ffbc26ac223523eL,0xa4f6ff11344579cfL,
33185         0x5825653c980250f6L } },
33186     /* 11 << 175 */
33187     { { 0xb2dd097ebc1aa2b9L,0x0788939337a0333aL,0x1cf55e7137a0db38L,
33188         0x2648487f792c1613L },
33189       { 0xdad013363fcef261L,0x6239c81d0eabf129L,0x8ee761de9d276be2L,
33190         0x406a7a341eda6ad3L } },
33191     /* 12 << 175 */
33192     { { 0x4bf367ba4a493b31L,0x54f20a529bf7f026L,0xb696e0629795914bL,
33193         0xcddab96d8bf236acL },
33194       { 0x4ff2c70aed25ea13L,0xfa1d09eb81cbbbe7L,0x88fc8c87468544c5L,
33195         0x847a670d696b3317L } },
33196     /* 13 << 175 */
33197     { { 0xf133421e64bcb626L,0xaea638c826dee0b5L,0xd6e7680bb310346cL,
33198         0xe06f4097d5d4ced3L },
33199       { 0x099614527512a30bL,0xf3d867fde589a59aL,0x2e73254f52d0c180L,
33200         0x9063d8a3333c74acL } },
33201     /* 14 << 175 */
33202     { { 0xeda6c595d314e7bcL,0x2ee7464b467899edL,0x1cef423c0a1ed5d3L,
33203         0x217e76ea69cc7613L },
33204       { 0x27ccce1fe7cda917L,0x12d8016b8a893f16L,0xbcd6de849fc74f6bL,
33205         0xfa5817e2f3144e61L } },
33206     /* 15 << 175 */
33207     { { 0x1f3541640821ee4cL,0x1583eab40bc61992L,0x7490caf61d72879fL,
33208         0x998ad9f3f76ae7b2L },
33209       { 0x1e181950a41157f7L,0xa9d7e1e6e8da3a7eL,0x963784eb8426b95fL,
33210         0x0ee4ed6e542e2a10L } },
33211     /* 16 << 175 */
33212     { { 0xb79d4cc5ac751e7bL,0x93f96472fd4211bdL,0x8c72d3d2c8de4fc6L,
33213         0x7b69cbf5df44f064L },
33214       { 0x3da90ca2f4bf94e1L,0x1a5325f8f12894e2L,0x0a437f6c7917d60bL,
33215         0x9be7048696c9cb5dL } },
33216     /* 17 << 175 */
33217     { { 0xb4d880bfe1dc5c05L,0xd738addaeebeeb57L,0x6f0119d3df0fe6a3L,
33218         0x5c686e5566eaaf5aL },
33219       { 0x9cb10b50dfd0b7ecL,0xbdd0264b6a497c21L,0xfc0935148c546c96L,
33220         0x58a947fa79dbf42aL } },
33221     /* 18 << 175 */
33222     { { 0xc0b48d4e49ccd6d7L,0xff8fb02c88bd5580L,0xc75235e907d473b2L,
33223         0x4fab1ac5a2188af3L },
33224       { 0x030fa3bc97576ec0L,0xe8c946e80b7e7d2fL,0x40a5c9cc70305600L,
33225         0x6d8260a9c8b013b4L } },
33226     /* 19 << 175 */
33227     { { 0x0368304f70bba85cL,0xad090da1a4a0d311L,0x7170e8702415eec1L,
33228         0xbfba35fe8461ea47L },
33229       { 0x6279019ac1e91938L,0xa47638f31afc415fL,0x36c65cbbbcba0e0fL,
33230         0x02160efb034e2c48L } },
33231     /* 20 << 175 */
33232     { { 0xe6c51073615cd9e4L,0x498ec047f1243c06L,0x3e5a8809b17b3d8cL,
33233         0x5cd99e610cc565f1L },
33234       { 0x81e312df7851dafeL,0xf156f5baa79061e2L,0x80d62b71880c590eL,
33235         0xbec9746f0a39faa1L } },
33236     /* 21 << 175 */
33237     { { 0x1d98a9c1c8ed1f7aL,0x09e43bb5a81d5ff2L,0xd5f00f680da0794aL,
33238         0x412050d9661aa836L },
33239       { 0xa89f7c4e90747e40L,0x6dc05ebbb62a3686L,0xdf4de847308e3353L,
33240         0x53868fbb9fb53bb9L } },
33241     /* 22 << 175 */
33242     { { 0x2b09d2c3cfdcf7ddL,0x41a9fce3723fcab4L,0x73d905f707f57ca3L,
33243         0x080f9fb1ac8e1555L },
33244       { 0x7c088e849ba7a531L,0x07d35586ed9a147fL,0x602846abaf48c336L,
33245         0x7320fd320ccf0e79L } },
33246     /* 23 << 175 */
33247     { { 0xaa780798b18bd1ffL,0x52c2e300afdd2905L,0xf27ea3d6434267cdL,
33248         0x8b96d16d15605b5fL },
33249       { 0x7bb310494b45706bL,0xe7f58b8e743d25f8L,0xe9b5e45b87f30076L,
33250         0xd19448d65d053d5aL } },
33251     /* 24 << 175 */
33252     { { 0x1ecc8cb9d3210a04L,0x6bc7d463dafb5269L,0x3e59b10a67c3489fL,
33253         0x1769788c65641e1bL },
33254       { 0x8a53b82dbd6cb838L,0x7066d6e6236d5f22L,0x03aa1c616908536eL,
33255         0xc971da0d66ae9809L } },
33256     /* 25 << 175 */
33257     { { 0x01b3a86bc49a2facL,0x3b8420c03092e77aL,0x020573007d6fb556L,
33258         0x6941b2a1bff40a87L },
33259       { 0x140b63080658ff2aL,0x878043633424ab36L,0x0253bd515751e299L,
33260         0xc75bcd76449c3e3aL } },
33261     /* 26 << 175 */
33262     { { 0x92eb40907f8f875dL,0x9c9d754e56c26bbfL,0x158cea618110bbe7L,
33263         0x62a6b802745f91eaL },
33264       { 0xa79c41aac6e7394bL,0x445b6a83ad57ef10L,0x0c5277eb6ea6f40cL,
33265         0x319fe96b88633365L } },
33266     /* 27 << 175 */
33267     { { 0x0b0fc61f385f63cbL,0x41250c8422bdd127L,0x67d153f109e942c2L,
33268         0x60920d08c021ad5dL },
33269       { 0x229f5746724d81a5L,0xb7ffb8925bba3299L,0x518c51a1de413032L,
33270         0x2a9bfe773c2fd94cL } },
33271     /* 28 << 175 */
33272     { { 0xcbcde2393191f4fdL,0x43093e16d3d6ada1L,0x184579f358769606L,
33273         0x2c94a8b3d236625cL },
33274       { 0x6922b9c05c437d8eL,0x3d4ae423d8d9f3c8L,0xf72c31c12e7090a2L,
33275         0x4ac3f5f3d76a55bdL } },
33276     /* 29 << 175 */
33277     { { 0x342508fc6b6af991L,0x0d5271001b5cebbdL,0xb84740d0dd440dd7L,
33278         0x748ef841780162fdL },
33279       { 0xa8dbfe0edfc6fafbL,0xeadfdf05f7300f27L,0x7d06555ffeba4ec9L,
33280         0x12c56f839e25fa97L } },
33281     /* 30 << 175 */
33282     { { 0x77f84203d39b8c34L,0xed8b1be63125eddbL,0x5bbf2441f6e39dc5L,
33283         0xb00f6ee66a5d678aL },
33284       { 0xba456ecf57d0ea99L,0xdcae0f5817e06c43L,0x01643de40f5b4baaL,
33285         0x2c324341d161b9beL } },
33286     /* 31 << 175 */
33287     { { 0x80177f55e126d468L,0xed325f1f76748e09L,0x6116004acfa9bdc2L,
33288         0x2d8607e63a9fb468L },
33289       { 0x0e573e276009d660L,0x3a525d2e8d10c5a1L,0xd26cb45c3b9009a0L,
33290         0xb6b0cdc0de9d7448L } },
33291     /* 32 << 175 */
33292     { { 0x949c9976e1337c26L,0x6faadebdd73d68e5L,0x9e158614f1b768d9L,
33293         0x22dfa5579cc4f069L },
33294       { 0xccd6da17be93c6d6L,0x24866c61a504f5b9L,0x2121353c8d694da1L,
33295         0x1c6ca5800140b8c6L } },
33296     /* 33 << 175 */
33297     { { 0xc245ad8ce964021eL,0xb83bffba032b82b3L,0xfaa220c647ef9898L,
33298         0x7e8d3ac6982c948aL },
33299       { 0x1faa2091bc2d124aL,0xbd54c3dd05b15ff4L,0x386bf3abc87c6fb7L,
33300         0xfb2b0563fdeb6f66L } },
33301     /* 34 << 175 */
33302     { { 0x4e77c5575b45afb4L,0xe9ded649efb8912dL,0x7ec9bbf542f6e557L,
33303         0x2570dfff62671f00L },
33304       { 0x2b3bfb7888e084bdL,0xa024b238f37fe5b4L,0x44e7dc0495649aeeL,
33305         0x498ca2555e7ec1d8L } },
33306     /* 35 << 175 */
33307     { { 0x3bc766eaaaa07e86L,0x0db6facbf3608586L,0xbadd2549bdc259c8L,
33308         0x95af3c6e041c649fL },
33309       { 0xb36a928c02e30afbL,0x9b5356ad008a88b8L,0x4b67a5f1cf1d9e9dL,
33310         0xc6542e47a5d8d8ceL } },
33311     /* 36 << 175 */
33312     { { 0x73061fe87adfb6ccL,0xcc826fd398678141L,0x00e758b13c80515aL,
33313         0x6afe324741485083L },
33314       { 0x0fcb08b9b6ae8a75L,0xb8cf388d4acf51e1L,0x344a55606961b9d6L,
33315         0x1a6778b86a97fd0cL } },
33316     /* 37 << 175 */
33317     { { 0xd840fdc1ecc4c7e3L,0xde9fe47d16db68ccL,0xe95f89dea3e216aaL,
33318         0x84f1a6a49594a8beL },
33319       { 0x7ddc7d725a7b162bL,0xc5cfda19adc817a3L,0x80a5d35078b58d46L,
33320         0x93365b1382978f19L } },
33321     /* 38 << 175 */
33322     { { 0x2e44d22526a1fc90L,0x0d6d10d24d70705dL,0xd94b6b10d70c45f4L,
33323         0x0f201022b216c079L },
33324       { 0xcec966c5658fde41L,0xa8d2bc7d7e27601dL,0xbfcce3e1ff230be7L,
33325         0x3394ff6b0033ffb5L } },
33326     /* 39 << 175 */
33327     { { 0xd890c5098132c9afL,0xaac4b0eb361e7868L,0x5194ded3e82d15aaL,
33328         0x4550bd2e23ae6b7dL },
33329       { 0x3fda318eea5399d4L,0xd989bffa91638b80L,0x5ea124d0a14aa12dL,
33330         0x1fb1b8993667b944L } },
33331     /* 40 << 175 */
33332     { { 0x95ec796944c44d6aL,0x91df144a57e86137L,0x915fd62073adac44L,
33333         0x8f01732d59a83801L },
33334       { 0xec579d253aa0a633L,0x06de5e7cc9d6d59cL,0xc132f958b1ef8010L,
33335         0x29476f96e65c1a02L } },
33336     /* 41 << 175 */
33337     { { 0x336a77c0d34c3565L,0xef1105b21b9f1e9eL,0x63e6d08bf9e08002L,
33338         0x9aff2f21c613809eL },
33339       { 0xb5754f853a80e75dL,0xde71853e6bbda681L,0x86f041df8197fd7aL,
33340         0x8b332e08127817faL } },
33341     /* 42 << 175 */
33342     { { 0x05d99be8b9c20cdaL,0x89f7aad5d5cd0c98L,0x7ef936fe5bb94183L,
33343         0x92ca0753b05cd7f2L },
33344       { 0x9d65db1174a1e035L,0x02628cc813eaea92L,0xf2d9e24249e4fbf2L,
33345         0x94fdfd9be384f8b7L } },
33346     /* 43 << 175 */
33347     { { 0x65f5605463428c6bL,0x2f7205b290b409a5L,0xf778bb78ff45ae11L,
33348         0xa13045bec5ee53b2L },
33349       { 0xe00a14ff03ef77feL,0x689cd59fffef8befL,0x3578f0ed1e9ade22L,
33350         0xe99f3ec06268b6a8L } },
33351     /* 44 << 175 */
33352     { { 0xa2057d91ea1b3c3eL,0x2d1a7053b8823a4aL,0xabbb336a2cca451eL,
33353         0xcd2466e32218bb5dL },
33354       { 0x3ac1f42fc8cb762dL,0x7e312aae7690211fL,0xebb9bd7345d07450L,
33355         0x207c4b8246c2213fL } },
33356     /* 45 << 175 */
33357     { { 0x99d425c1375913ecL,0x94e45e9667908220L,0xc08f3087cd67dbf6L,
33358         0xa5670fbec0887056L },
33359       { 0x6717b64a66f5b8fcL,0xd5a56aea786fec28L,0xa8c3f55fc0ff4952L,
33360         0xa77fefae457ac49bL } },
33361     /* 46 << 175 */
33362     { { 0x29882d7c98379d44L,0xd000bdfb509edc8aL,0xc6f95979e66fe464L,
33363         0x504a6115fa61bde0L },
33364       { 0x56b3b871effea31aL,0x2d3de26df0c21a54L,0x21dbff31834753bfL,
33365         0xe67ecf4969269d86L } },
33366     /* 47 << 175 */
33367     { { 0x7a176952151fe690L,0x035158047f2adb5fL,0xee794b15d1b62a8dL,
33368         0xf004ceecaae454e6L },
33369       { 0x0897ea7cf0386facL,0x3b62ff12d1fca751L,0x154181df1b7a04ecL,
33370         0x2008e04afb5847ecL } },
33371     /* 48 << 175 */
33372     { { 0xd147148e41dbd772L,0x2b419f7322942654L,0x669f30d3e9c544f7L,
33373         0x52a2c223c8540149L },
33374       { 0x5da9ee14634dfb02L,0x5f074ff0f47869f3L,0x74ee878da3933accL,
33375         0xe65106514fe35ed1L } },
33376     /* 49 << 175 */
33377     { { 0xb3eb9482f1012e7aL,0x51013cc0a8a566aeL,0xdd5e924347c00d3bL,
33378         0x7fde089d946bb0e5L },
33379       { 0x030754fec731b4b3L,0x12a136a499fda062L,0x7c1064b85a1a35bcL,
33380         0xbf1f5763446c84efL } },
33381     /* 50 << 175 */
33382     { { 0xed29a56da16d4b34L,0x7fba9d09dca21c4fL,0x66d7ac006d8de486L,
33383         0x6006198773a2a5e1L },
33384       { 0x8b400f869da28ff0L,0x3133f70843c4599cL,0x9911c9b8ee28cb0dL,
33385         0xcd7e28748e0af61dL } },
33386     /* 51 << 175 */
33387     { { 0x5a85f0f272ed91fcL,0x85214f319cd4a373L,0x881fe5be1925253cL,
33388         0xd8dc98e091e8bc76L },
33389       { 0x7120affe585cc3a2L,0x724952ed735bf97aL,0x5581e7dc3eb34581L,
33390         0x5cbff4f2e52ee57dL } },
33391     /* 52 << 175 */
33392     { { 0x8d320a0e87d8cc7bL,0x9beaa7f3f1d280d0L,0x7a0b95719beec704L,
33393         0x9126332e5b7f0057L },
33394       { 0x01fbc1b48ed3bd6dL,0x35bb2c12d945eb24L,0x6404694e9a8ae255L,
33395         0xb6092eec8d6abfb3L } },
33396     /* 53 << 175 */
33397     { { 0x4d76143fcc058865L,0x7b0a5af26e249922L,0x8aef94406a50d353L,
33398         0xe11e4bcc64f0e07aL },
33399       { 0x4472993aa14a90faL,0x7706e20cba0c51d4L,0xf403292f1532672dL,
33400         0x52573bfa21829382L } },
33401     /* 54 << 175 */
33402     { { 0x6a7bb6a93b5bdb83L,0x08da65c0a4a72318L,0xc58d22aa63eb065fL,
33403         0x1717596c1b15d685L },
33404       { 0x112df0d0b266d88bL,0xf688ae975941945aL,0x487386e37c292cacL,
33405         0x42f3b50d57d6985cL } },
33406     /* 55 << 175 */
33407     { { 0x6da4f9986a90fc34L,0xc8f257d365ca8a8dL,0xc2feabca6951f762L,
33408         0xe1bc81d074c323acL },
33409       { 0x1bc68f67251a2a12L,0x10d86587be8a70dcL,0xd648af7ff0f84d2eL,
33410         0xf0aa9ebc6a43ac92L } },
33411     /* 56 << 175 */
33412     { { 0x69e3be0427596893L,0xb6bb02a645bf452bL,0x0875c11af4c698c8L,
33413         0x6652b5c7bece3794L },
33414       { 0x7b3755fd4f5c0499L,0x6ea16558b5532b38L,0xd1c69889a2e96ef7L,
33415         0x9c773c3a61ed8f48L } },
33416     /* 57 << 175 */
33417     { { 0x2b653a409b323abcL,0xe26605e1f0e1d791L,0x45d410644a87157aL,
33418         0x8f9a78b7cbbce616L },
33419       { 0xcf1e44aac407edddL,0x81ddd1d8a35b964fL,0x473e339efd083999L,
33420         0x6c94bdde8e796802L } },
33421     /* 58 << 175 */
33422     { { 0x5a304ada8545d185L,0x82ae44ea738bb8cbL,0x628a35e3df87e10eL,
33423         0xd3624f3da15b9fe3L },
33424       { 0xcc44209b14be4254L,0x7d0efcbcbdbc2ea5L,0x1f60336204c37bbeL,
33425         0x21f363f556a5852cL } },
33426     /* 59 << 175 */
33427     { { 0xa1503d1ca8501550L,0x2251e0e1d8ab10bbL,0xde129c966961c51cL,
33428         0x1f7246a481910f68L },
33429       { 0x2eb744ee5f2591f2L,0x3c47d33f5e627157L,0x4d6d62c922f3bd68L,
33430         0x6120a64bcb8df856L } },
33431     /* 60 << 175 */
33432     { { 0x3a9ac6c07b5d07dfL,0xa92b95587ef39783L,0xe128a134ab3a9b4fL,
33433         0x41c18807b1252f05L },
33434       { 0xfc7ed08980ba9b1cL,0xac8dc6dec532a9ddL,0xbf829cef55246809L,
33435         0x101b784f5b4ee80fL } },
33436     /* 61 << 175 */
33437     { { 0xc09945bbb6f11603L,0x57b09dbe41d2801eL,0xfba5202fa97534a8L,
33438         0x7fd8ae5fc17b9614L },
33439       { 0xa50ba66678308435L,0x9572f77cd3868c4dL,0x0cef7bfd2dd7aab0L,
33440         0xe7958e082c7c79ffL } },
33441     /* 62 << 175 */
33442     { { 0x81262e4225346689L,0x716da290b07c7004L,0x35f911eab7950ee3L,
33443         0x6fd72969261d21b5L },
33444       { 0x5238980308b640d3L,0x5b0026ee887f12a1L,0x20e21660742e9311L,
33445         0x0ef6d5415ff77ff7L } },
33446     /* 63 << 175 */
33447     { { 0x969127f0f9c41135L,0xf21d60c968a64993L,0x656e5d0ce541875cL,
33448         0xf1e0f84ea1d3c233L },
33449       { 0x9bcca35906002d60L,0xbe2da60c06191552L,0x5da8bbae61181ec3L,
33450         0x9f04b82365806f19L } },
33451     /* 64 << 175 */
33452     { { 0xf1604a7dd4b79bb8L,0xaee806fb52c878c8L,0x34144f118d47b8e8L,
33453         0x72edf52b949f9054L },
33454       { 0xebfca84e2127015aL,0x9051d0c09cb7cef3L,0x86e8fe58296deec8L,
33455         0x33b2818841010d74L } },
33456     /* 0 << 182 */
33457     { { 0x00, 0x00, 0x00, 0x00 },
33458       { 0x00, 0x00, 0x00, 0x00 } },
33459     /* 1 << 182 */
33460     { { 0x01079383171b445fL,0x9bcf21e38131ad4cL,0x8cdfe205c93987e8L,
33461         0xe63f4152c92e8c8fL },
33462       { 0x729462a930add43dL,0x62ebb143c980f05aL,0x4f3954e53b06e968L,
33463         0xfe1d75ad242cf6b1L } },
33464     /* 2 << 182 */
33465     { { 0x5f95c6c7af8685c8L,0xd4c1c8ce2f8f01aaL,0xc44bbe322574692aL,
33466         0xb8003478d4a4a068L },
33467       { 0x7c8fc6e52eca3cdbL,0xea1db16bec04d399L,0xb05bc82e8f2bc5cfL,
33468         0x763d517ff44793d2L } },
33469     /* 3 << 182 */
33470     { { 0x4451c1b808bd98d0L,0x644b1cd46575f240L,0x6907eb337375d270L,
33471         0x56c8bebdfa2286bdL },
33472       { 0xc713d2acc4632b46L,0x17da427aafd60242L,0x313065b7c95c7546L,
33473         0xf8239898bf17a3deL } },
33474     /* 4 << 182 */
33475     { { 0xf3b7963f4c830320L,0x842c7aa0903203e3L,0xaf22ca0ae7327afbL,
33476         0x38e13092967609b6L },
33477       { 0x73b8fb62757558f1L,0x3cc3e831f7eca8c1L,0xe4174474f6331627L,
33478         0xa77989cac3c40234L } },
33479     /* 5 << 182 */
33480     { { 0xe5fd17a144a081e0L,0xd797fb7db70e296aL,0x2b472b30481f719cL,
33481         0x0e632a98fe6f8c52L },
33482       { 0x89ccd116c5f0c284L,0xf51088af2d987c62L,0x2a2bccda4c2de6cfL,
33483         0x810f9efef679f0f9L } },
33484     /* 6 << 182 */
33485     { { 0xb0f394b97ffe4b3eL,0x0b691d21e5fa5d21L,0xb0bd77479dfbbc75L,
33486         0xd2830fdafaf78b00L },
33487       { 0xf78c249c52434f57L,0x4b1f754598096dabL,0x73bf6f948ff8c0b3L,
33488         0x34aef03d454e134cL } },
33489     /* 7 << 182 */
33490     { { 0xf8d151f4b7ac7ec5L,0xd6ceb95ae50da7d5L,0xa1b492b0dc3a0eb8L,
33491         0x75157b69b3dd2863L },
33492       { 0xe2c4c74ec5413d62L,0xbe329ff7bc5fc4c7L,0x835a2aea60fa9ddaL,
33493         0xf117f5ad7445cb87L } },
33494     /* 8 << 182 */
33495     { { 0xae8317f4b0166f7aL,0xfbd3e3f7ceec74e6L,0xfdb516ace0874bfdL,
33496         0x3d846019c681f3a3L },
33497       { 0x0b12ee5c7c1620b0L,0xba68b4dd2b63c501L,0xac03cd326668c51eL,
33498         0x2a6279f74e0bcb5bL } },
33499     /* 9 << 182 */
33500     { { 0x17bd69b06ae85c10L,0x729469791dfdd3a6L,0xd9a032682c078becL,
33501         0x41c6a658bfd68a52L },
33502       { 0xcdea10240e023900L,0xbaeec121b10d144dL,0x5a600e74058ab8dcL,
33503         0x1333af21bb89ccddL } },
33504     /* 10 << 182 */
33505     { { 0xdf25eae03aaba1f1L,0x2cada16e3b7144cfL,0x657ee27d71ab98bcL,
33506         0x99088b4c7a6fc96eL },
33507       { 0x05d5c0a03549dbd4L,0x42cbdf8ff158c3acL,0x3fb6b3b087edd685L,
33508         0x22071cf686f064d0L } },
33509     /* 11 << 182 */
33510     { { 0xd2d6721fff2811e5L,0xdb81b703fe7fae8cL,0x3cfb74efd3f1f7bbL,
33511         0x0cdbcd7616cdeb5dL },
33512       { 0x4f39642a566a808cL,0x02b74454340064d6L,0xfabbadca0528fa6fL,
33513         0xe4c3074cd3fc0bb6L } },
33514     /* 12 << 182 */
33515     { { 0xb32cb8b0b796d219L,0xc3e95f4f34741dd9L,0x8721212568edf6f5L,
33516         0x7a03aee4a2b9cb8eL },
33517       { 0x0cd3c376f53a89aaL,0x0d8af9b1948a28dcL,0xcf86a3f4902ab04fL,
33518         0x8aacb62a7f42002dL } },
33519     /* 13 << 182 */
33520     { { 0x106985ebf62ffd52L,0xe670b54e5797bf10L,0x4b405209c5e30aefL,
33521         0x12c97a204365b5e9L },
33522       { 0x104646ce1fe32093L,0x13cb4ff63907a8c9L,0x8b9f30d1d46e726bL,
33523         0xe1985e21aba0f499L } },
33524     /* 14 << 182 */
33525     { { 0xc573dea910a230cdL,0x24f46a93cd30f947L,0xf2623fcfabe2010aL,
33526         0x3f278cb273f00e4fL },
33527       { 0xed55c67d50b920ebL,0xf1cb9a2d8e760571L,0x7c50d1090895b709L,
33528         0x4207cf07190d4369L } },
33529     /* 15 << 182 */
33530     { { 0x3b027e81c4127fe1L,0xa9f8b9ad3ae9c566L,0x5ab10851acbfbba5L,
33531         0xa747d648569556f5L },
33532       { 0xcc172b5c2ba97bf7L,0x15e0f77dbcfa3324L,0xa345b7977686279dL,
33533         0x5a723480e38003d3L } },
33534     /* 16 << 182 */
33535     { { 0xfd8e139f8f5fcda8L,0xf3e558c4bdee5bfdL,0xd76cbaf4e33f9f77L,
33536         0x3a4c97a471771969L },
33537       { 0xda27e84bf6dce6a7L,0xff373d9613e6c2d1L,0xf115193cd759a6e9L,
33538         0x3f9b702563d2262cL } },
33539     /* 17 << 182 */
33540     { { 0xd9764a31317cd062L,0x30779d8e199f8332L,0xd807410616b11b0bL,
33541         0x7917ab9f78aeaed8L },
33542       { 0xb67a9cbe28fb1d8eL,0x2e313563136eda33L,0x010b7069a371a86cL,
33543         0x44d90fa26744e6b7L } },
33544     /* 18 << 182 */
33545     { { 0x68190867d6b3e243L,0x9fe6cd9d59048c48L,0xb900b02895731538L,
33546         0xa012062f32cae04fL },
33547       { 0x8107c8bc9399d082L,0x47e8c54a41df12e2L,0x14ba5117b6ef3f73L,
33548         0x22260bea81362f0bL } },
33549     /* 19 << 182 */
33550     { { 0x90ea261e1a18cc20L,0x2192999f2321d636L,0xef64d314e311b6a0L,
33551         0xd7401e4c3b54a1f5L },
33552       { 0x190199836fbca2baL,0x46ad32938fbffc4bL,0xa142d3f63786bf40L,
33553         0xeb5cbc26b67039fcL } },
33554     /* 20 << 182 */
33555     { { 0x9cb0ae6c252bd479L,0x05e0f88a12b5848fL,0x78f6d2b2a5c97663L,
33556         0x6f6e149bc162225cL },
33557       { 0xe602235cde601a89L,0xd17bbe98f373be1fL,0xcaf49a5ba8471827L,
33558         0x7e1a0a8518aaa116L } },
33559     /* 21 << 182 */
33560     { { 0x6c833196270580c3L,0x1e233839f1c98a14L,0x67b2f7b4ae34e0a5L,
33561         0x47ac8745d8ce7289L },
33562       { 0x2b74779a100dd467L,0x274a43374ee50d09L,0x603dcf1383608bc9L,
33563         0xcd9da6c3c89e8388L } },
33564     /* 22 << 182 */
33565     { { 0x2660199f355116acL,0xcc38bb59b6d18eedL,0x3075f31f2f4bc071L,
33566         0x9774457f265dc57eL },
33567       { 0x06a6a9c8c6db88bbL,0x6429d07f4ec98e04L,0x8d05e57b05ecaa8bL,
33568         0x20f140b17872ea7bL } },
33569     /* 23 << 182 */
33570     { { 0xdf8c0f09ca494693L,0x48d3a020f252e909L,0x4c5c29af57b14b12L,
33571         0x7e6fa37dbf47ad1cL },
33572       { 0x66e7b50649a0c938L,0xb72c0d486be5f41fL,0x6a6242b8b2359412L,
33573         0xcd35c7748e859480L } },
33574     /* 24 << 182 */
33575     { { 0x12536fea87baa627L,0x58c1fec1f72aa680L,0x6c29b637601e5dc9L,
33576         0x9e3c3c1cde9e01b9L },
33577       { 0xefc8127b2bcfe0b0L,0x351071022a12f50dL,0x6ccd6cb14879b397L,
33578         0xf792f804f8a82f21L } },
33579     /* 25 << 182 */
33580     { { 0x509d4804a9b46402L,0xedddf85dc10f0850L,0x928410dc4b6208aaL,
33581         0xf6229c46391012dcL },
33582       { 0xc5a7c41e7727b9b6L,0x289e4e4baa444842L,0x049ba1d9e9a947eaL,
33583         0x44f9e47f83c8debcL } },
33584     /* 26 << 182 */
33585     { { 0xfa77a1fe611f8b8eL,0xfd2e416af518f427L,0xc5fffa70114ebac3L,
33586         0xfe57c4e95d89697bL },
33587       { 0xfdd053acb1aaf613L,0x31df210fea585a45L,0x318cc10e24985034L,
33588         0x1a38efd15f1d6130L } },
33589     /* 27 << 182 */
33590     { { 0xbf86f2370b1e9e21L,0xb258514d1dbe88aaL,0x1e38a58890c1baf9L,
33591         0x2936a01ebdb9b692L },
33592       { 0xd576de986dd5b20cL,0xb586bf7170f98ecfL,0xcccf0f12c42d2fd7L,
33593         0x8717e61cfb35bd7bL } },
33594     /* 28 << 182 */
33595     { { 0x8b1e572235e6fc06L,0x3477728f0b3e13d5L,0x150c294daa8a7372L,
33596         0xc0291d433bfa528aL },
33597       { 0xc6c8bc67cec5a196L,0xdeeb31e45c2e8a7cL,0xba93e244fb6e1c51L,
33598         0xb9f8b71b2e28e156L } },
33599     /* 29 << 182 */
33600     { { 0xce65a287968a2ab9L,0xe3c5ce6946bbcb1fL,0xf8c835b9e7ae3f30L,
33601         0x16bbee26ff72b82bL },
33602       { 0x665e2017fd42cd22L,0x1e139970f8b1d2a0L,0x125cda2979204932L,
33603         0x7aee94a549c3bee5L } },
33604     /* 30 << 182 */
33605     { { 0x68c7016089821a66L,0xf7c376788f981669L,0xd90829fc48cc3645L,
33606         0x346af049d70addfcL },
33607       { 0x2057b232370bf29cL,0xf90c73ce42e650eeL,0xe03386eaa126ab90L,
33608         0x0e266e7e975a087bL } },
33609     /* 31 << 182 */
33610     { { 0x80578eb90fca65d9L,0x7e2989ea16af45b8L,0x7438212dcac75a4eL,
33611         0x38c7ca394fef36b8L },
33612       { 0x8650c494d402676aL,0x26ab5a66f72c7c48L,0x4e6cb426ce3a464eL,
33613         0xf8f998962b72f841L } },
33614     /* 32 << 182 */
33615     { { 0x8c3184911a335cc8L,0x563459ba6a5913e4L,0x1b920d61c7b32919L,
33616         0x805ab8b6a02425adL },
33617       { 0x2ac512da8d006086L,0x6ca4846abcf5c0fdL,0xafea51d8ac2138d7L,
33618         0xcb647545344cd443L } },
33619     /* 33 << 182 */
33620     { { 0x0429ee8fbd7d9040L,0xee66a2de819b9c96L,0x54f9ec25dea7d744L,
33621         0x2ffea642671721bbL },
33622       { 0x4f19dbd1114344eaL,0x04304536fd0dbc8bL,0x014b50aa29ec7f91L,
33623         0xb5fc22febb06014dL } },
33624     /* 34 << 182 */
33625     { { 0x60d963a91ee682e0L,0xdf48abc0fe85c727L,0x0cadba132e707c2dL,
33626         0xde608d3aa645aeffL },
33627       { 0x05f1c28bedafd883L,0x3c362edebd94de1fL,0x8dd0629d13593e41L,
33628         0x0a5e736f766d6eafL } },
33629     /* 35 << 182 */
33630     { { 0xbfa92311f68cf9d1L,0xa4f9ef87c1797556L,0x10d75a1f5601c209L,
33631         0x651c374c09b07361L },
33632       { 0x49950b5888b5ceadL,0x0ef000586fa9dbaaL,0xf51ddc264e15f33aL,
33633         0x1f8b5ca62ef46140L } },
33634     /* 36 << 182 */
33635     { { 0x343ac0a3ee9523f0L,0xbb75eab2975ea978L,0x1bccf332107387f4L,
33636         0x790f92599ab0062eL },
33637       { 0xf1a363ad1e4f6a5fL,0x06e08b8462519a50L,0x609151877265f1eeL,
33638         0x6a80ca3493ae985eL } },
33639     /* 37 << 182 */
33640     { { 0x81b29768aaba4864L,0xb13cabf28d52a7d6L,0xb5c363488ead03f1L,
33641         0xc932ad9581c7c1c0L },
33642       { 0x5452708ecae1e27bL,0x9dac42691b0df648L,0x233e3f0cdfcdb8bcL,
33643         0xe6ceccdfec540174L } },
33644     /* 38 << 182 */
33645     { { 0xbd0d845e95081181L,0xcc8a7920699355d5L,0x111c0f6dc3b375a8L,
33646         0xfd95bc6bfd51e0dcL },
33647       { 0x4a106a266888523aL,0x4d142bd6cb01a06dL,0x79bfd289adb9b397L,
33648         0x0bdbfb94e9863914L } },
33649     /* 39 << 182 */
33650     { { 0x29d8a2291660f6a6L,0x7f6abcd6551c042dL,0x13039deb0ac3ffe8L,
33651         0xa01be628ec8523fbL },
33652       { 0x6ea341030ca1c328L,0xc74114bdb903928eL,0x8aa4ff4e9e9144b0L,
33653         0x7064091f7f9a4b17L } },
33654     /* 40 << 182 */
33655     { { 0xa3f4f521e447f2c4L,0x81b8da7a604291f0L,0xd680bc467d5926deL,
33656         0x84f21fd534a1202fL },
33657       { 0x1d1e31814e9df3d8L,0x1ca4861a39ab8d34L,0x809ddeec5b19aa4aL,
33658         0x59f72f7e4d329366L } },
33659     /* 41 << 182 */
33660     { { 0xa2f93f41386d5087L,0x40bf739cdd67d64fL,0xb449420566702158L,
33661         0xc33c65be73b1e178L },
33662       { 0xcdcd657c38ca6153L,0x97f4519adc791976L,0xcc7c7f29cd6e1f39L,
33663         0x38de9cfb7e3c3932L } },
33664     /* 42 << 182 */
33665     { { 0xe448eba37b793f85L,0xe9f8dbf9f067e914L,0xc0390266f114ae87L,
33666         0x39ed75a7cd6a8e2aL },
33667       { 0xadb148487ffba390L,0x67f8cb8b6af9bc09L,0x322c38489c7476dbL,
33668         0xa320fecf52a538d6L } },
33669     /* 43 << 182 */
33670     { { 0xe0493002b2aced2bL,0xdfba1809616bd430L,0x531c4644c331be70L,
33671         0xbc04d32e90d2e450L },
33672       { 0x1805a0d10f9f142dL,0x2c44a0c547ee5a23L,0x31875a433989b4e3L,
33673         0x6b1949fd0c063481L } },
33674     /* 44 << 182 */
33675     { { 0x2dfb9e08be0f4492L,0x3ff0da03e9d5e517L,0x03dbe9a1f79466a8L,
33676         0x0b87bcd015ea9932L },
33677       { 0xeb64fc83ab1f58abL,0x6d9598da817edc8aL,0x699cff661d3b67e5L,
33678         0x645c0f2992635853L } },
33679     /* 45 << 182 */
33680     { { 0x253cdd82eabaf21cL,0x82b9602a2241659eL,0x2cae07ec2d9f7091L,
33681         0xbe4c720c8b48cd9bL },
33682       { 0x6ce5bc036f08d6c9L,0x36e8a997af10bf40L,0x83422d213e10ff12L,
33683         0x7b26d3ebbcc12494L } },
33684     /* 46 << 182 */
33685     { { 0xb240d2d0c9469ad6L,0xc4a11b4d30afa05bL,0x4b604acedd6ba286L,
33686         0x184866003ee2864cL },
33687       { 0x5869d6ba8d9ce5beL,0x0d8f68c5ff4bfb0dL,0xb69f210b5700cf73L,
33688         0x61f6653a6d37c135L } },
33689     /* 47 << 182 */
33690     { { 0xff3d432b5aff5a48L,0x0d81c4b972ba3a69L,0xee879ae9fa1899efL,
33691         0xbac7e2a02d6acafdL },
33692       { 0xd6d93f6c1c664399L,0x4c288de15bcb135dL,0x83031dab9dab7cbfL,
33693         0xfe23feb03abbf5f0L } },
33694     /* 48 << 182 */
33695     { { 0x9f1b2466cdedca85L,0x140bb7101a09538cL,0xac8ae8515e11115dL,
33696         0x0d63ff676f03f59eL },
33697       { 0x755e55517d234afbL,0x61c2db4e7e208fc1L,0xaa9859cef28a4b5dL,
33698         0xbdd6d4fc34af030fL } },
33699     /* 49 << 182 */
33700     { { 0xd1c4a26d3be01cb1L,0x9ba14ffc243aa07cL,0xf95cd3a9b2503502L,
33701         0xe379bc067d2a93abL },
33702       { 0x3efc18e9d4ca8d68L,0x083558ec80bb412aL,0xd903b9409645a968L,
33703         0xa499f0b69ba6054fL } },
33704     /* 50 << 182 */
33705     { { 0x208b573cb8349abeL,0x3baab3e530b4fc1cL,0x87e978bacb524990L,
33706         0x3524194eccdf0e80L },
33707       { 0x627117257d4bcc42L,0xe90a3d9bb90109baL,0x3b1bdd571323e1e0L,
33708         0xb78e9bd55eae1599L } },
33709     /* 51 << 182 */
33710     { { 0x0794b7469e03d278L,0x80178605d70e6297L,0x171792f899c97855L,
33711         0x11b393eef5a86b5cL },
33712       { 0x48ef6582d8884f27L,0xbd44737abf19ba5fL,0x8698de4ca42062c6L,
33713         0x8975eb8061ce9c54L } },
33714     /* 52 << 182 */
33715     { { 0xd50e57c7d7fe71f3L,0x15342190bc97ce38L,0x51bda2de4df07b63L,
33716         0xba12aeae200eb87dL },
33717       { 0xabe135d2a9b4f8f6L,0x04619d65fad6d99cL,0x4a6683a77994937cL,
33718         0x7a778c8b6f94f09aL } },
33719     /* 53 << 182 */
33720     { { 0x8c50862320a71b89L,0x241a2aed1c229165L,0x352be595aaf83a99L,
33721         0x9fbfee7f1562bac8L },
33722       { 0xeaf658b95c4017e3L,0x1dc7f9e015120b86L,0xd84f13dd4c034d6fL,
33723         0x283dd737eaea3038L } },
33724     /* 54 << 182 */
33725     { { 0x197f2609cd85d6a2L,0x6ebbc345fae60177L,0xb80f031b4e12fedeL,
33726         0xde55d0c207a2186bL },
33727       { 0x1fb3e37f24dcdd5aL,0x8d602da57ed191fbL,0x108fb05676023e0dL,
33728         0x70178c71459c20c0L } },
33729     /* 55 << 182 */
33730     { { 0xfad5a3863fe54cf0L,0xa4a3ec4f02bbb475L,0x1aa5ec20919d94d7L,
33731         0x5d3b63b5a81e4ab3L },
33732       { 0x7fa733d85ad3d2afL,0xfbc586ddd1ac7a37L,0x282925de40779614L,
33733         0xfe0ffffbe74a242aL } },
33734     /* 56 << 182 */
33735     { { 0x3f39e67f906151e5L,0xcea27f5f55e10649L,0xdca1d4e1c17cf7b7L,
33736         0x0c326d122fe2362dL },
33737       { 0x05f7ac337dd35df3L,0x0c3b7639c396dbdfL,0x0912f5ac03b7db1cL,
33738         0x9dea4b705c9ed4a9L } },
33739     /* 57 << 182 */
33740     { { 0x475e6e53aae3f639L,0xfaba0e7cfc278bacL,0x16f9e2219490375fL,
33741         0xaebf9746a5a7ed0aL },
33742       { 0x45f9af3ff41ad5d6L,0x03c4623cb2e99224L,0x82c5bb5cb3cf56aaL,
33743         0x6431181934567ed3L } },
33744     /* 58 << 182 */
33745     { { 0xec57f2118be489acL,0x2821895db9a1104bL,0x610dc8756064e007L,
33746         0x8e526f3f5b20d0feL },
33747       { 0x6e71ca775b645aeeL,0x3d1dcb9f800e10ffL,0x36b51162189cf6deL,
33748         0x2c5a3e306bb17353L } },
33749     /* 59 << 182 */
33750     { { 0xc186cd3e2a6c6fbfL,0xa74516fa4bf97906L,0x5b4b8f4b279d6901L,
33751         0x0c4e57b42b573743L },
33752       { 0x75fdb229b6e386b6L,0xb46793fd99deac27L,0xeeec47eacf712629L,
33753         0xe965f3c4cbc3b2ddL } },
33754     /* 60 << 182 */
33755     { { 0x8dd1fb83425c6559L,0x7fc00ee60af06fdaL,0xe98c922533d956dfL,
33756         0x0f1ef3354fbdc8a2L },
33757       { 0x2abb5145b79b8ea2L,0x40fd2945bdbff288L,0x6a814ac4d7185db7L,
33758         0xc4329d6fc084609aL } },
33759     /* 61 << 182 */
33760     { { 0xc9ba7b52ed1be45dL,0x891dd20de4cd2c74L,0x5a4d4a7f824139b1L,
33761         0x66c17716b873c710L },
33762       { 0x5e5bc1412843c4e0L,0xd5ac4817b97eb5bfL,0xc0f8af54450c95c7L,
33763         0xc91b3fa0318406c5L } },
33764     /* 62 << 182 */
33765     { { 0x360c340aab9d97f8L,0xfb57bd0790a2d611L,0x4339ae3ca6a6f7e5L,
33766         0x9c1fcd2a2feb8a10L },
33767       { 0x972bcca9c7ea7432L,0x1b0b924c308076f6L,0x80b2814a2a5b4ca5L,
33768         0x2f78f55b61ef3b29L } },
33769     /* 63 << 182 */
33770     { { 0xf838744ac18a414fL,0xc611eaae903d0a86L,0x94dabc162a453f55L,
33771         0xe6f2e3da14efb279L },
33772       { 0x5b7a60179320dc3cL,0x692e382f8df6b5a4L,0x3f5e15e02d40fa90L,
33773         0xc87883ae643dd318L } },
33774     /* 64 << 182 */
33775     { { 0x511053e453544774L,0x834d0ecc3adba2bcL,0x4215d7f7bae371f5L,
33776         0xfcfd57bf6c8663bcL },
33777       { 0xded2383dd6901b1dL,0x3b49fbb4b5587dc3L,0xfd44a08d07625f62L,
33778         0x3ee4d65b9de9b762L } },
33779     /* 0 << 189 */
33780     { { 0x00, 0x00, 0x00, 0x00 },
33781       { 0x00, 0x00, 0x00, 0x00 } },
33782     /* 1 << 189 */
33783     { { 0x64e5137d0d63d1faL,0x658fc05202a9d89fL,0x4889487450436309L,
33784         0xe9ae30f8d598da61L },
33785       { 0x2ed710d1818baf91L,0xe27e9e068b6a0c20L,0x1e28dcfb1c1a6b44L,
33786         0x883acb64d6ac57dcL } },
33787     /* 2 << 189 */
33788     { { 0x8735728dc2c6ff70L,0x79d6122fc5dc2235L,0x23f5d00319e277f9L,
33789         0x7ee84e25dded8cc7L },
33790       { 0x91a8afb063cd880aL,0x3f3ea7c63574af60L,0x0cfcdc8402de7f42L,
33791         0x62d0792fb31aa152L } },
33792     /* 3 << 189 */
33793     { { 0x8e1b4e438a5807ceL,0xad283893e4109a7eL,0xc30cc9cbafd59ddaL,
33794         0xf65f36c63d8d8093L },
33795       { 0xdf31469ea60d32b2L,0xee93df4b3e8191c8L,0x9c1017c5355bdeb5L,
33796         0xd26231858616aa28L } },
33797     /* 4 << 189 */
33798     { { 0xb02c83f9dec31a21L,0x988c8b236ad9d573L,0x53e983aea57be365L,
33799         0xe968734d646f834eL },
33800       { 0x9137ea8f5da6309bL,0x10f3a624c1f1ce16L,0x782a9ea2ca440921L,
33801         0xdf94739e5b46f1b5L } },
33802     /* 5 << 189 */
33803     { { 0x9f9be006cce85c9bL,0x360e70d6a4c7c2d3L,0x2cd5beeaaefa1e60L,
33804         0x64cf63c08c3d2b6dL },
33805       { 0xfb107fa3e1cf6f90L,0xb7e937c6d5e044e6L,0x74e8ca78ce34db9fL,
33806         0x4f8b36c13e210bd0L } },
33807     /* 6 << 189 */
33808     { { 0x1df165a434a35ea8L,0x3418e0f74d4412f6L,0x5af1f8af518836c3L,
33809         0x42ceef4d130e1965L },
33810       { 0x5560ca0b543a1957L,0xc33761e5886cb123L,0x66624b1ffe98ed30L,
33811         0xf772f4bf1090997dL } },
33812     /* 7 << 189 */
33813     { { 0xf4e540bb4885d410L,0x7287f8109ba5f8d7L,0x22d0d865de98dfb1L,
33814         0x49ff51a1bcfbb8a3L },
33815       { 0xb6b6fa536bc3012eL,0x3d31fd72170d541dL,0x8018724f4b0f4966L,
33816         0x79e7399f87dbde07L } },
33817     /* 8 << 189 */
33818     { { 0x56f8410ef4f8b16aL,0x97241afec47b266aL,0x0a406b8e6d9c87c1L,
33819         0x803f3e02cd42ab1bL },
33820       { 0x7f0309a804dbec69L,0xa83b85f73bbad05fL,0xc6097273ad8e197fL,
33821         0xc097440e5067adc1L } },
33822     /* 9 << 189 */
33823     { { 0x730eafb63524ff16L,0xd7f9b51e823fc6ceL,0x27bd0d32443e4ac0L,
33824         0x40c59ad94d66f217L },
33825       { 0x6c33136f17c387a4L,0x5043b8d5eb86804dL,0x74970312675a73c9L,
33826         0x838fdb31f16669b6L } },
33827     /* 10 << 189 */
33828     { { 0xc507b6dd418e7dddL,0x39888d93472f19d6L,0x7eae26be0c27eb4dL,
33829         0x17b53ed3fbabb884L },
33830       { 0xfc27021b2b01ae4fL,0x88462e87cf488682L,0xbee096ec215e2d87L,
33831         0xeb2fea9ad242e29bL } },
33832     /* 11 << 189 */
33833     { { 0x5d985b5fb821fc28L,0x89d2e197dc1e2ad2L,0x55b566b89030ba62L,
33834         0xe3fd41b54f41b1c6L },
33835       { 0xb738ac2eb9a96d61L,0x7f8567ca369443f4L,0x8698622df803a440L,
33836         0x2b5862368fe2f4dcL } },
33837     /* 12 << 189 */
33838     { { 0xbbcc00c756b95bceL,0x5ec03906616da680L,0x79162ee672214252L,
33839         0x43132b6386a892d2L },
33840       { 0x4bdd3ff22f3263bfL,0xd5b3733c9cd0a142L,0x592eaa8244415ccbL,
33841         0x663e89248d5474eaL } },
33842     /* 13 << 189 */
33843     { { 0x8058a25e5236344eL,0x82e8df9dbda76ee6L,0xdcf6efd811cc3d22L,
33844         0x00089cda3b4ab529L },
33845       { 0x91d3a071bd38a3dbL,0x4ea97fc0ef72b925L,0x0c9fc15bea3edf75L,
33846         0x5a6297cda4348ed3L } },
33847     /* 14 << 189 */
33848     { { 0x0d38ab35ce7c42d4L,0x9fd493ef82feab10L,0x46056b6d82111b45L,
33849         0xda11dae173efc5c3L },
33850       { 0xdc7402785545a7fbL,0xbdb2601c40d507e6L,0x121dfeeb7066fa58L,
33851         0x214369a839ae8c2aL } },
33852     /* 15 << 189 */
33853     { { 0x195709cb06e0956cL,0x4c9d254f010cd34bL,0xf51e13f70471a532L,
33854         0xe19d67911e73054dL },
33855       { 0xf702a628db5c7be3L,0xc7141218b24dde05L,0xdc18233cf29b2e2eL,
33856         0x3a6bd1e885342dbaL } },
33857     /* 16 << 189 */
33858     { { 0x3f747fa0b311898cL,0xe2a272e4cd0eac65L,0x4bba5851f914d0bcL,
33859         0x7a1a9660c4a43ee3L },
33860       { 0xe5a367cea1c8cde9L,0x9d958ba97271abe3L,0xf3ff7eb63d1615cdL,
33861         0xa2280dcef5ae20b0L } },
33862     /* 17 << 189 */
33863     { { 0x56dba5c1cf640147L,0xea5a2e3d5e83d118L,0x04cd6b6dda24c511L,
33864         0x1c0f4671e854d214L },
33865       { 0x91a6b7a969565381L,0xdc966240decf1f5bL,0x1b22d21cfcf5d009L,
33866         0x2a05f6419021dbd5L } },
33867     /* 18 << 189 */
33868     { { 0x8c0ed566d4312483L,0x5179a95d643e216fL,0xcc185fec17044493L,
33869         0xb306333954991a21L },
33870       { 0xd801ecdb0081a726L,0x0149b0c64fa89bbbL,0xafe9065a4391b6b9L,
33871         0xedc92786d633f3a3L } },
33872     /* 19 << 189 */
33873     { { 0xe408c24aae6a8e13L,0x85833fde9f3897abL,0x43800e7ed81a0715L,
33874         0xde08e346b44ffc5fL },
33875       { 0x7094184ccdeff2e0L,0x49f9387b165eaed1L,0x635d6129777c468aL,
33876         0x8c0dcfd1538c2dd8L } },
33877     /* 20 << 189 */
33878     { { 0xd6d9d9e37a6a308bL,0x623758304c2767d3L,0x874a8bc6f38cbeb6L,
33879         0xd94d3f1accb6fd9eL },
33880       { 0x92a9735bba21f248L,0x272ad0e56cd1efb0L,0x7437b69c05b03284L,
33881         0xe7f047026948c225L } },
33882     /* 21 << 189 */
33883     { { 0x8a56c04acba2ececL,0x0c181270e3a73e41L,0x6cb34e9d03e93725L,
33884         0xf77c8713496521a9L },
33885       { 0x94569183fa7f9f90L,0xf2e7aa4c8c9707adL,0xced2c9ba26c1c9a3L,
33886         0x9109fe9640197507L } },
33887     /* 22 << 189 */
33888     { { 0x9ae868a9e9adfe1cL,0x3984403d314e39bbL,0xb5875720f2fe378fL,
33889         0x33f901e0ba44a628L },
33890       { 0xea1125fe3652438cL,0xae9ec4e69dd1f20bL,0x1e740d9ebebf7fbdL,
33891         0x6dbd3ddc42dbe79cL } },
33892     /* 23 << 189 */
33893     { { 0x62082aecedd36776L,0xf612c478e9859039L,0xa493b201032f7065L,
33894         0xebd4d8f24ff9b211L },
33895       { 0x3f23a0aaaac4cb32L,0xea3aadb715ed4005L,0xacf17ea4afa27e63L,
33896         0x56125c1ac11fd66cL } },
33897     /* 24 << 189 */
33898     { { 0x266344a43794f8dcL,0xdcca923a483c5c36L,0x2d6b6bbf3f9d10a0L,
33899         0xb320c5ca81d9bdf3L },
33900       { 0x620e28ff47b50a95L,0x933e3b01cef03371L,0xf081bf8599100153L,
33901         0x183be9a0c3a8c8d6L } },
33902     /* 25 << 189 */
33903     { { 0x4e3ddc5ad6bbe24dL,0xc6c7463053843795L,0x78193dd765ec2d4cL,
33904         0xb8df26cccd3c89b2L },
33905       { 0x98dbe3995a483f8dL,0x72d8a9577dd3313aL,0x65087294ab0bd375L,
33906         0xfcd892487c259d16L } },
33907     /* 26 << 189 */
33908     { { 0x8a9443d77613aa81L,0x8010080085fe6584L,0x70fc4dbc7fb10288L,
33909         0xf58280d3e86beee8L },
33910       { 0x14fdd82f7c978c38L,0xdf1204c10de44d7bL,0xa08a1c844160252fL,
33911         0x591554cac17646a5L } },
33912     /* 27 << 189 */
33913     { { 0x214a37d6a05bd525L,0x48d5f09b07957b3cL,0x0247cdcbd7109bc9L,
33914         0x40f9e4bb30599ce7L },
33915       { 0xc325fa03f46ad2ecL,0x00f766cfc3e3f9eeL,0xab556668d43a4577L,
33916         0x68d30a613ee03b93L } },
33917     /* 28 << 189 */
33918     { { 0x7ddc81ea77b46a08L,0xcf5a6477c7480699L,0x43a8cb346633f683L,
33919         0x1b867e6b92363c60L },
33920       { 0x439211141f60558eL,0xcdbcdd632f41450eL,0x7fc04601cc630e8bL,
33921         0xea7c66d597038b43L } },
33922     /* 29 << 189 */
33923     { { 0x7259b8a504e99fd8L,0x98a8dd124785549aL,0x0e459a7c840552e1L,
33924         0xcdfcf4d04bb0909eL },
33925       { 0x34a86db253758da7L,0xe643bb83eac997e1L,0x96400bd7530c5b7eL,
33926         0x9f97af87b41c8b52L } },
33927     /* 30 << 189 */
33928     { { 0x34fc8820fbeee3f9L,0x93e5349049091afdL,0x764b9be59a31f35cL,
33929         0x71f3786457e3d924L },
33930       { 0x02fb34e0943aa75eL,0xa18c9c58ab8ff6e4L,0x080f31b133cf0d19L,
33931         0x5c9682db083518a7L } },
33932     /* 31 << 189 */
33933     { { 0x873d4ca6b709c3deL,0x64a842623575b8f0L,0x6275da1f020154bbL,
33934         0x97678caad17cf1abL },
33935       { 0x8779795f951a95c3L,0xdd35b16350fccc08L,0x3270962733d8f031L,
33936         0x3c5ab10a498dd85cL } },
33937     /* 32 << 189 */
33938     { { 0xb6c185c341dca566L,0x7de7fedad8622aa3L,0x99e84d92901b6dfbL,
33939         0x30a02b0e7c4ad288L },
33940       { 0xc7c81daa2fd3cf36L,0xd1319547df89e59fL,0xb2be8184cd496733L,
33941         0xd5f449eb93d3412bL } },
33942     /* 33 << 189 */
33943     { { 0x7ea41b1b25fe531dL,0xf97974326a1d5646L,0x86067f722bde501aL,
33944         0xf91481c00c85e89cL },
33945       { 0xca8ee465f8b05bc6L,0x1844e1cf02e83cdaL,0xca82114ab4dbe33bL,
33946         0x0f9f87694eabfde2L } },
33947     /* 34 << 189 */
33948     { { 0x4936b1c038b27fe2L,0x63b6359baba402dfL,0x40c0ea2f656bdbabL,
33949         0x9c992a896580c39cL },
33950       { 0x600e8f152a60aed1L,0xeb089ca4e0bf49dfL,0x9c233d7d2d42d99aL,
33951         0x648d3f954c6bc2faL } },
33952     /* 35 << 189 */
33953     { { 0xdcc383a8e1add3f3L,0xf42c0c6a4f64a348L,0x2abd176f0030dbdbL,
33954         0x4de501a37d6c215eL },
33955       { 0x4a107c1f4b9a64bcL,0xa77f0ad32496cd59L,0xfb78ac627688dffbL,
33956         0x7025a2ca67937d8eL } },
33957     /* 36 << 189 */
33958     { { 0xfde8b2d1d1a8f4e7L,0xf5b3da477354927cL,0xe48606a3d9205735L,
33959         0xac477cc6e177b917L },
33960       { 0xfb1f73d2a883239aL,0xe12572f6cc8b8357L,0x9d355e9cfb1f4f86L,
33961         0x89b795f8d9f3ec6eL } },
33962     /* 37 << 189 */
33963     { { 0x27be56f1b54398dcL,0x1890efd73fedeed5L,0x62f77f1f9c6d0140L,
33964         0x7ef0e314596f0ee4L },
33965       { 0x50ca6631cc61dab3L,0x4a39801df4866e4fL,0x66c8d032ae363b39L,
33966         0x22c591e52ead66aaL } },
33967     /* 38 << 189 */
33968     { { 0x954ba308de02a53eL,0x2a6c060fd389f357L,0xe6cfcde8fbf40b66L,
33969         0x8e02fc56c6340ce1L },
33970       { 0xe495779573adb4baL,0x7b86122ca7b03805L,0x63f835120c8e6fa6L,
33971         0x83660ea0057d7804L } },
33972     /* 39 << 189 */
33973     { { 0xbad7910521ba473cL,0xb6c50beeded5389dL,0xee2caf4daa7c9bc0L,
33974         0xd97b8de48c4e98a7L },
33975       { 0xa9f63e70ab3bbddbL,0x3898aabf2597815aL,0x7659af89ac15b3d9L,
33976         0xedf7725b703ce784L } },
33977     /* 40 << 189 */
33978     { { 0x25470fabe085116bL,0x04a4337587285310L,0x4e39187ee2bfd52fL,
33979         0x36166b447d9ebc74L },
33980       { 0x92ad433cfd4b322cL,0x726aa817ba79ab51L,0xf96eacd8c1db15ebL,
33981         0xfaf71e910476be63L } },
33982     /* 41 << 189 */
33983     { { 0xdd69a640641fad98L,0xb799591829622559L,0x03c6daa5de4199dcL,
33984         0x92cadc97ad545eb4L },
33985       { 0x1028238b256534e4L,0x73e80ce68595409aL,0x690d4c66d05dc59bL,
33986         0xc95f7b8f981dee80L } },
33987     /* 42 << 189 */
33988     { { 0xf4337014d856ac25L,0x441bd9ddac524dcaL,0x640b3d855f0499f5L,
33989         0x39cf84a9d5fda182L },
33990       { 0x04e7b055b2aa95a0L,0x29e33f0a0ddf1860L,0x082e74b5423f6b43L,
33991         0x217edeb90aaa2b0fL } },
33992     /* 43 << 189 */
33993     { { 0x58b83f3583cbea55L,0xc485ee4dbc185d70L,0x833ff03b1e5f6992L,
33994         0xb5b9b9cccf0c0dd5L },
33995       { 0x7caaee8e4e9e8a50L,0x462e907b6269dafdL,0x6ed5cee9fbe791c6L,
33996         0x68ca3259ed430790L } },
33997     /* 44 << 189 */
33998     { { 0x2b72bdf213b5ba88L,0x60294c8a35ef0ac4L,0x9c3230ed19b99b08L,
33999         0x560fff176c2589aaL },
34000       { 0x552b8487d6770374L,0xa373202d9a56f685L,0xd3e7f90745f175d9L,
34001         0x3c2f315fd080d810L } },
34002     /* 45 << 189 */
34003     { { 0x1130e9dd7b9520e8L,0xc078f9e20af037b5L,0x38cd2ec71e9c104cL,
34004         0x0f684368c472fe92L },
34005       { 0xd3f1b5ed6247e7efL,0xb32d33a9396dfe21L,0x46f59cf44a9aa2c2L,
34006         0x69cd5168ff0f7e41L } },
34007     /* 46 << 189 */
34008     { { 0x3f59da0f4b3234daL,0xcf0b0235b4579ebeL,0x6d1cbb256d2476c7L,
34009         0x4f0837e69dc30f08L },
34010       { 0x9a4075bb906f6e98L,0x253bb434c761e7d1L,0xde2e645f6e73af10L,
34011         0xb89a40600c5f131cL } },
34012     /* 47 << 189 */
34013     { { 0xd12840c5b8cc037fL,0x3d093a5b7405bb47L,0x6202c253206348b8L,
34014         0xbf5d57fcc55a3ca7L },
34015       { 0x89f6c90c8c3bef48L,0x23ac76235a0a960aL,0xdfbd3d6b552b42abL,
34016         0x3ef22458132061f6L } },
34017     /* 48 << 189 */
34018     { { 0xd74e9bdac97e6516L,0x88779360c230f49eL,0xa6ec1de31e74ea49L,
34019         0x581dcee53fb645a2L },
34020       { 0xbaef23918f483f14L,0x6d2dddfcd137d13bL,0x54cde50ed2743a42L,
34021         0x89a34fc5e4d97e67L } },
34022     /* 49 << 189 */
34023     { { 0x13f1f5b312e08ce5L,0xa80540b8a7f0b2caL,0x854bcf7701982805L,
34024         0xb8653ffd233bea04L },
34025       { 0x8e7b878702b0b4c9L,0x2675261f9acb170aL,0x061a9d90930c14e5L,
34026         0xb59b30e0def0abeaL } },
34027     /* 50 << 189 */
34028     { { 0x1dc19ea60200ec7dL,0xb6f4a3f90bce132bL,0xb8d5de90f13e27e0L,
34029         0xbaee5ef01fade16fL },
34030       { 0x6f406aaae4c6cf38L,0xab4cfe06d1369815L,0x0dcffe87efd550c6L,
34031         0x9d4f59c775ff7d39L } },
34032     /* 51 << 189 */
34033     { { 0xb02553b151deb6adL,0x812399a4b1877749L,0xce90f71fca6006e1L,
34034         0xc32363a6b02b6e77L },
34035       { 0x02284fbedc36c64dL,0x86c81e31a7e1ae61L,0x2576c7e5b909d94aL,
34036         0x8b6f7d02818b2bb0L } },
34037     /* 52 << 189 */
34038     { { 0xeca3ed0756faa38aL,0xa3790e6c9305bb54L,0xd784eeda7bc73061L,
34039         0xbd56d3696dd50614L },
34040       { 0xd6575949229a8aa9L,0xdcca8f474595ec28L,0x814305c106ab4fe6L,
34041         0xc8c3976824f43f16L } },
34042     /* 53 << 189 */
34043     { { 0xe2a45f36523f2b36L,0x995c6493920d93bbL,0xf8afdab790f1632bL,
34044         0x79ebbecd1c295954L },
34045       { 0xc7bb3ddb79592f48L,0x67216a7b5f88e998L,0xd91f098bbc01193eL,
34046         0xf7d928a5b1db83fcL } },
34047     /* 54 << 189 */
34048     { { 0x55e38417e991f600L,0x2a91113e2981a934L,0xcbc9d64806b13bdeL,
34049         0xb011b6ac0755ff44L },
34050       { 0x6f4cb518045ec613L,0x522d2d31c2f5930aL,0x5acae1af382e65deL,
34051         0x5764306727bc966fL } },
34052     /* 55 << 189 */
34053     { { 0x5e12705d1c7193f0L,0xf0f32f473be8858eL,0x785c3d7d96c6dfc7L,
34054         0xd75b4a20bf31795dL },
34055       { 0x91acf17b342659d4L,0xe596ea3444f0378fL,0x4515708fce52129dL,
34056         0x17387e1e79f2f585L } },
34057     /* 56 << 189 */
34058     { { 0x72cfd2e949dee168L,0x1ae052233e2af239L,0x009e75be1d94066aL,
34059         0x6cca31c738abf413L },
34060       { 0xb50bd61d9bc49908L,0x4a9b4a8cf5e2bc1eL,0xeb6cc5f7946f83acL,
34061         0x27da93fcebffab28L } },
34062     /* 57 << 189 */
34063     { { 0xea314c964821c8c5L,0x8de49deda83c15f4L,0x7a64cf207af33004L,
34064         0x45f1bfebc9627e10L },
34065       { 0x878b062654b9df60L,0x5e4fdc3ca95c0b33L,0xe54a37cac2035d8eL,
34066         0x9087cda980f20b8cL } },
34067     /* 58 << 189 */
34068     { { 0x36f61c238319ade4L,0x766f287ade8cfdf8L,0x48821948346f3705L,
34069         0x49a7b85316e4f4a2L },
34070       { 0xb9b3f8a75cedadfdL,0x8f5628158db2a815L,0xc0b7d55401f68f95L,
34071         0x12971e27688a208eL } },
34072     /* 59 << 189 */
34073     { { 0xc9f8b696d0ff34fcL,0x20824de21222718cL,0x7213cf9f0c95284dL,
34074         0xe2ad741bdc158240L },
34075       { 0x0ee3a6df54043ccfL,0x16ff479bd84412b3L,0xf6c74ee0dfc98af0L,
34076         0xa78a169f52fcd2fbL } },
34077     /* 60 << 189 */
34078     { { 0xd8ae874699c930e9L,0x1d33e85849e117a5L,0x7581fcb46624759fL,
34079         0xde50644f5bedc01dL },
34080       { 0xbeec5d00caf3155eL,0x672d66acbc73e75fL,0x86b9d8c6270b01dbL,
34081         0xd249ef8350f55b79L } },
34082     /* 61 << 189 */
34083     { { 0x6131d6d473978fe3L,0xcc4e4542754b00a1L,0x4e05df0557dfcfe9L,
34084         0x94b29cdd51ef6bf0L },
34085       { 0xe4530cff9bc7edf2L,0x8ac236fdd3da65f3L,0x0faf7d5fc8eb0b48L,
34086         0x4d2de14c660eb039L } },
34087     /* 62 << 189 */
34088     { { 0xc006bba760430e54L,0x10a2d0d6da3289abL,0x9c037a5dd7979c59L,
34089         0x04d1f3d3a116d944L },
34090       { 0x9ff224738a0983cdL,0x28e25b38c883cabbL,0xe968dba547a58995L,
34091         0x2c80b505774eebdfL } },
34092     /* 63 << 189 */
34093     { { 0xee763b714a953bebL,0x502e223f1642e7f6L,0x6fe4b64161d5e722L,
34094         0x9d37c5b0dbef5316L },
34095       { 0x0115ed70f8330bc7L,0x139850e675a72789L,0x27d7faecffceccc2L,
34096         0x3016a8604fd9f7f6L } },
34097     /* 64 << 189 */
34098     { { 0xc492ec644cd8f64cL,0x58a2d790279d7b51L,0x0ced1fc51fc75256L,
34099         0x3e658aed8f433017L },
34100       { 0x0b61942e05da59ebL,0xba3d60a30ddc3722L,0x7c311cd1742e7f87L,
34101         0x6473ffeef6b01b6eL } },
34102     /* 0 << 196 */
34103     { { 0x00, 0x00, 0x00, 0x00 },
34104       { 0x00, 0x00, 0x00, 0x00 } },
34105     /* 1 << 196 */
34106     { { 0x8303604f692ac542L,0xf079ffe1227b91d3L,0x19f63e6315aaf9bdL,
34107         0xf99ee565f1f344fbL },
34108       { 0x8a1d661fd6219199L,0x8c883bc6d48ce41cL,0x1065118f3c74d904L,
34109         0x713889ee0faf8b1bL } },
34110     /* 2 << 196 */
34111     { { 0x972b3f8f81a1b3beL,0x4f3ce145ce2764a0L,0xe2d0f1cc28c4f5f7L,
34112         0xdeee0c0dc7f3985bL },
34113       { 0x7df4adc0d39e25c3L,0x40619820c467a080L,0x440ebc9361cf5a58L,
34114         0x527729a6422ad600L } },
34115     /* 3 << 196 */
34116     { { 0xca6c0937b1b76ba6L,0x1a2eab854d2026dcL,0xb1715e1519d9ae0aL,
34117         0xf1ad9199bac4a026L },
34118       { 0x35b3dfb807ea7b0eL,0xedf5496f3ed9eb89L,0x8932e5ff2d6d08abL,
34119         0xf314874e25bd2731L } },
34120     /* 4 << 196 */
34121     { { 0xefb26a753f73f449L,0x1d1c94f88d44fc79L,0x49f0fbc53bc0dc4dL,
34122         0xb747ea0b3698a0d0L },
34123       { 0x5218c3fe228d291eL,0x35b804b543c129d6L,0xfac859b8d1acc516L,
34124         0x6c10697d95d6e668L } },
34125     /* 5 << 196 */
34126     { { 0xc38e438f0876fd4eL,0x45f0c30783d2f383L,0x203cc2ecb10934cbL,
34127         0x6a8f24392c9d46eeL },
34128       { 0xf16b431b65ccde7bL,0x41e2cd1827e76a6fL,0xb9c8cf8f4e3484d7L,
34129         0x64426efd8315244aL } },
34130     /* 6 << 196 */
34131     { { 0x1c0a8e44fc94dea3L,0x34c8cdbfdad6a0b0L,0x919c384004113cefL,
34132         0xfd32fba415490ffaL },
34133       { 0x58d190f6795dcfb7L,0xfef01b0383588bafL,0x9e6d1d63ca1fc1c0L,
34134         0x53173f96f0a41ac9L } },
34135     /* 7 << 196 */
34136     { { 0x2b1d402aba16f73bL,0x2fb310148cf9b9fcL,0x2d51e60e446ef7bfL,
34137         0xc731021bb91e1745L },
34138       { 0x9d3b47244fee99d4L,0x4bca48b6fac5c1eaL,0x70f5f514bbea9af7L,
34139         0x751f55a5974c283aL } },
34140     /* 8 << 196 */
34141     { { 0x6e30251acb452fdbL,0x31ee696550f30650L,0xb0b3e508933548d9L,
34142         0xb8949a4ff4b0ef5bL },
34143       { 0x208b83263c88f3bdL,0xab147c30db1d9989L,0xed6515fd44d4df03L,
34144         0x17a12f75e72eb0c5L } },
34145     /* 9 << 196 */
34146     { { 0x3b59796d36cf69dbL,0x1219eee956670c18L,0xfe3341f77a070d8eL,
34147         0x9b70130ba327f90cL },
34148       { 0x36a324620ae18e0eL,0x2021a62346c0a638L,0x251b5817c62eb0d4L,
34149         0x87bfbcdf4c762293L } },
34150     /* 10 << 196 */
34151     { { 0xf78ab505cdd61d64L,0x8c7a53fcc8c18857L,0xa653ce6f16147515L,
34152         0x9c923aa5ea7d52d5L },
34153       { 0xc24709cb5c18871fL,0x7d53bec873b3cc74L,0x59264afffdd1d4c4L,
34154         0x5555917e240da582L } },
34155     /* 11 << 196 */
34156     { { 0xcae8bbda548f5a0eL,0x1910eaba3bbfbbe1L,0xae5796857677afc3L,
34157         0x49ea61f173ff0b5cL },
34158       { 0x786554784f7c3922L,0x95d337cd20c68eefL,0x68f1e1e5df779ab9L,
34159         0x14b491b0b5cf69a8L } },
34160     /* 12 << 196 */
34161     { { 0x7a6cbbe028e3fe89L,0xe7e1fee4c5aac0ebL,0x7f47eda5697e5140L,
34162         0x4f450137b454921fL },
34163       { 0xdb625f8495cd8185L,0x74be0ba1cdb2e583L,0xaee4fd7cdd5e6de4L,
34164         0x4251437de8101739L } },
34165     /* 13 << 196 */
34166     { { 0x686d72a0ac620366L,0x4be3fb9cb6d59344L,0x6e8b44e7a1eb75b9L,
34167         0x84e39da391a5c10cL },
34168       { 0x37cc1490b38f0409L,0x029519432c2ade82L,0x9b6887831190a2d8L,
34169         0x25627d14231182baL } },
34170     /* 14 << 196 */
34171     { { 0x6eb550aa658a6d87L,0x1405aaa7cf9c7325L,0xd147142e5c8748c9L,
34172         0x7f637e4f53ede0e0L },
34173       { 0xf8ca277614ffad2cL,0xe58fb1bdbafb6791L,0x17158c23bf8f93fcL,
34174         0x7f15b3730a4a4655L } },
34175     /* 15 << 196 */
34176     { { 0x39d4add2d842ca72L,0xa71e43913ed96305L,0x5bb09cbe6700be14L,
34177         0x68d69d54d8befcf6L },
34178       { 0xa45f536737183bcfL,0x7152b7bb3370dff7L,0xcf887baabf12525bL,
34179         0xe7ac7bddd6d1e3cdL } },
34180     /* 16 << 196 */
34181     { { 0x25914f7881fdad90L,0xcf638f560d2cf6abL,0xb90bc03fcc054de5L,
34182         0x932811a718b06350L },
34183       { 0x2f00b3309bbd11ffL,0x76108a6fb4044974L,0x801bb9e0a851d266L,
34184         0x0dd099bebf8990c1L } },
34185     /* 17 << 196 */
34186     { { 0x58c5aaaaabe32986L,0x0fe9dd2a50d59c27L,0x84951ff48d307305L,
34187         0x6c23f82986529b78L },
34188       { 0x50bb22180b136a79L,0x7e2174de77a20996L,0x6f00a4b9c0bb4da6L,
34189         0x89a25a17efdde8daL } },
34190     /* 18 << 196 */
34191     { { 0xf728a27ec11ee01dL,0xf900553ae5f10dfbL,0x189a83c802ec893cL,
34192         0x3ca5bdc123f66d77L },
34193       { 0x9878153797eada9fL,0x59c50ab310256230L,0x346042d9323c69b3L,
34194         0x1b715a6d2c460449L } },
34195     /* 19 << 196 */
34196     { { 0xa41dd4766ae06e0bL,0xcdd7888e9d42e25fL,0x0f395f7456b25a20L,
34197         0xeadfe0ae8700e27eL },
34198       { 0xb09d52a969950093L,0x3525d9cb327f8d40L,0xb8235a9467df886aL,
34199         0x77e4b0dd035faec2L } },
34200     /* 20 << 196 */
34201     { { 0x115eb20a517d7061L,0x77fe34336c2df683L,0x6870ddc7cdc6fc67L,
34202         0xb16105880b87de83L },
34203       { 0x343584cad9c4ddbeL,0xb3164f1c3d754be2L,0x0731ed3ac1e6c894L,
34204         0x26327dec4f6b904cL } },
34205     /* 21 << 196 */
34206     { { 0x9d49c6de97b5cd32L,0x40835daeb5eceecdL,0xc66350edd9ded7feL,
34207         0x8aeebb5c7a678804L },
34208       { 0x51d42fb75b8ee9ecL,0xd7a17bdd8e3ca118L,0x40d7511a2ef4400eL,
34209         0xc48990ac875a66f4L } },
34210     /* 22 << 196 */
34211     { { 0x8de07d2a2199e347L,0xbee755562a39e051L,0x56918786916e51dcL,
34212         0xeb1913134a2d89ecL },
34213       { 0x6679610d37d341edL,0x434fbb4156d51c2bL,0xe54b7ee7d7492dbaL,
34214         0xaa33a79a59021493L } },
34215     /* 23 << 196 */
34216     { { 0x49fc5054e4bd6d3dL,0x09540f045ab551d0L,0x8acc90854942d3a6L,
34217         0x231af02f2d28323bL },
34218       { 0x93458cac0992c163L,0x1fef8e71888e3bb4L,0x27578da5be8c268cL,
34219         0xcc8be792e805ec00L } },
34220     /* 24 << 196 */
34221     { { 0x29267baec61c3855L,0xebff429d58c1fd3bL,0x22d886c08c0b93b8L,
34222         0xca5e00b22ddb8953L },
34223       { 0xcf330117c3fed8b7L,0xd49ac6fa819c01f6L,0x6ddaa6bd3c0fbd54L,
34224         0x917430688049a2cfL } },
34225     /* 25 << 196 */
34226     { { 0xd67f981eaff2ef81L,0xc3654d352818ae80L,0x81d050441b2aa892L,
34227         0x2db067bf3d099328L },
34228       { 0xe7c79e86703dcc97L,0xe66f9b37e133e215L,0xcdf119a6e39a7a5cL,
34229         0x47c60de3876f1b61L } },
34230     /* 26 << 196 */
34231     { { 0x6e405939d860f1b2L,0x3e9a1dbcf5ed4d4aL,0x3f23619ec9b6bcbdL,
34232         0x5ee790cf734e4497L },
34233       { 0xf0a834b15bdaf9bbL,0x02cedda74ca295f0L,0x4619aa2bcb8e378cL,
34234         0xe5613244cc987ea4L } },
34235     /* 27 << 196 */
34236     { { 0x0bc022cc76b23a50L,0x4a2793ad0a6c21ceL,0x3832878089cac3f5L,
34237         0x29176f1bcba26d56L },
34238       { 0x062961874f6f59ebL,0x86e9bca98bdc658eL,0x2ca9c4d357e30402L,
34239         0x5438b216516a09bbL } },
34240     /* 28 << 196 */
34241     { { 0x0a6a063c7672765aL,0x37a3ce640547b9bfL,0x42c099c898b1a633L,
34242         0xb5ab800d05ee6961L },
34243       { 0xf1963f5911a5acd6L,0xbaee615746201063L,0x36d9a649a596210aL,
34244         0xaed043631ba7138cL } },
34245     /* 29 << 196 */
34246     { { 0xcf817d1ca4a82b76L,0x5586960ef3806be9L,0x7ab67c8909dc6bb5L,
34247         0x52ace7a0114fe7ebL },
34248       { 0xcd987618cbbc9b70L,0x4f06fd5a604ca5e1L,0x90af14ca6dbde133L,
34249         0x1afe4322948a3264L } },
34250     /* 30 << 196 */
34251     { { 0xa70d2ca6c44b2c6cL,0xab7267990ef87dfeL,0x310f64dc2e696377L,
34252         0x49b42e684c8126a0L },
34253       { 0x0ea444c3cea0b176L,0x53a8ddf7cb269182L,0xf3e674ebbbba9dcbL,
34254         0x0d2878a8d8669d33L } },
34255     /* 31 << 196 */
34256     { { 0x04b935d5d019b6a3L,0xbb5cf88e406f1e46L,0xa1912d165b57c111L,
34257         0x9803fc2119ebfd78L },
34258       { 0x4f231c9ec07764a9L,0xd93286eeb75bd055L,0x83a9457d8ee6c9deL,
34259         0x046959156087ec90L } },
34260     /* 32 << 196 */
34261     { { 0x14c6dd8a58d6cd46L,0x9cb633b58e6634d2L,0xc1305047f81bc328L,
34262         0x12ede0e226a177e5L },
34263       { 0x332cca62065a6f4fL,0xc3a47ecd67be487bL,0x741eb1870f47ed1cL,
34264         0x99e66e58e7598b14L } },
34265     /* 33 << 196 */
34266     { { 0x6f0544ca63d0ff12L,0xe5efc784b610a05fL,0xf72917b17cad7b47L,
34267         0x3ff6ea20f2cac0c0L },
34268       { 0xcc23791bf21db8b7L,0x7dac70b1d7d93565L,0x682cda1d694bdaadL,
34269         0xeb88bb8c1023516dL } },
34270     /* 34 << 196 */
34271     { { 0xc4c634b4dfdbeb1bL,0x22f5ca72b4ee4deaL,0x1045a368e6524821L,
34272         0xed9e8a3f052b18b2L },
34273       { 0x9b7f2cb1b961f49aL,0x7fee2ec17b009670L,0x350d875422507a6dL,
34274         0x561bd7114db55f1dL } },
34275     /* 35 << 196 */
34276     { { 0x4c189ccc320bbcafL,0x568434cfdf1de48cL,0x6af1b00e0fa8f128L,
34277         0xf0ba9d028907583cL },
34278       { 0x735a400432ff9f60L,0x3dd8e4b6c25dcf33L,0xf2230f1642c74cefL,
34279         0xd8117623013fa8adL } },
34280     /* 36 << 196 */
34281     { { 0x36822876f51fe76eL,0x8a6811cc11d62589L,0xc3fc7e6546225718L,
34282         0xb7df2c9fc82fdbcdL },
34283       { 0x3b1d4e52dd7b205bL,0xb695947847a2e414L,0x05e4d793efa91148L,
34284         0xb47ed446fd2e9675L } },
34285     /* 37 << 196 */
34286     { { 0x1a7098b904c9d9bfL,0x661e28811b793048L,0xb1a16966b01ee461L,
34287         0xbc5213082954746fL },
34288       { 0xc909a0fc2477de50L,0xd80bb41c7dbd51efL,0xa85be7ec53294905L,
34289         0x6d465b1883958f97L } },
34290     /* 38 << 196 */
34291     { { 0x16f6f330fb6840fdL,0xfaaeb2143401e6c8L,0xaf83d30fccb5b4f8L,
34292         0x22885739266dec4bL },
34293       { 0x51b4367c7bc467dfL,0x926562e3d842d27aL,0xdfcb66140fea14a6L,
34294         0xeb394daef2734cd9L } },
34295     /* 39 << 196 */
34296     { { 0x3eeae5d211c0be98L,0xb1e6ed11814e8165L,0x191086bce52bce1cL,
34297         0x14b74cc6a75a04daL },
34298       { 0x63cf11868c060985L,0x071047de2dbd7f7cL,0x4e433b8bce0942caL,
34299         0xecbac447d8fec61dL } },
34300     /* 40 << 196 */
34301     { { 0x8f0ed0e2ebf3232fL,0xfff80f9ec52a2eddL,0xad9ab43375b55fdbL,
34302         0x73ca7820e42e0c11L },
34303       { 0x6dace0a0e6251b46L,0x89bc6b5c4c0d932dL,0x3438cd77095da19aL,
34304         0x2f24a9398d48bdfbL } },
34305     /* 41 << 196 */
34306     { { 0x99b47e46766561b7L,0x736600e60ed0322aL,0x06a47cb1638e1865L,
34307         0x927c1c2dcb136000L },
34308       { 0x295423370cc5df69L,0x99b37c0209d649a9L,0xc5f0043c6aefdb27L,
34309         0x6cdd99871be95c27L } },
34310     /* 42 << 196 */
34311     { { 0x69850931390420d2L,0x299c40ac0983efa4L,0x3a05e778af39aeadL,
34312         0x8427440843a45193L },
34313       { 0x6bcd0fb991a711a0L,0x461592c89f52ab17L,0xb49302b4da3c6ed6L,
34314         0xc51fddc7330d7067L } },
34315     /* 43 << 196 */
34316     { { 0x94babeb6da50d531L,0x521b840da6a7b9daL,0x5305151e404bdc89L,
34317         0x1bcde201d0d07449L },
34318       { 0xf427a78b3b76a59aL,0xf84841ce07791a1bL,0xebd314bebf91ed1cL,
34319         0x8e61d34cbf172943L } },
34320     /* 44 << 196 */
34321     { { 0x1d5dc4515541b892L,0xb186ee41fc9d9e54L,0x9d9f345ed5bf610dL,
34322         0x3e7ba65df6acca9fL },
34323       { 0x9dda787aa8369486L,0x09f9dab78eb5ba53L,0x5afb2033d6481bc3L,
34324         0x76f4ce30afa62104L } },
34325     /* 45 << 196 */
34326     { { 0xa8fa00cff4f066b5L,0x89ab5143461dafc2L,0x44339ed7a3389998L,
34327         0x2ff862f1bc214903L },
34328       { 0x2c88f985b05556e3L,0xcd96058e3467081eL,0x7d6a4176edc637eaL,
34329         0xe1743d0936a5acdcL } },
34330     /* 46 << 196 */
34331     { { 0x66fd72e27eb37726L,0xf7fa264e1481a037L,0x9fbd3bde45f4aa79L,
34332         0xed1e0147767c3e22L },
34333       { 0x7621f97982e7abe2L,0x19eedc7245f633f8L,0xe69b155e6137bf3aL,
34334         0xa0ad13ce414ee94eL } },
34335     /* 47 << 196 */
34336     { { 0x93e3d5241c0e651aL,0xab1a6e2a02ce227eL,0xe7af17974ab27ecaL,
34337         0x245446debd444f39L },
34338       { 0x59e22a2156c07613L,0x43deafcef4275498L,0x10834ccb67fd0946L,
34339         0xa75841e547406edfL } },
34340     /* 48 << 196 */
34341     { { 0xebd6a6777b0ac93dL,0xa6e37b0d78f5e0d7L,0x2516c09676f5492bL,
34342         0x1e4bf8889ac05f3aL },
34343       { 0xcdb42ce04df0ba2bL,0x935d5cfd5062341bL,0x8a30333382acac20L,
34344         0x429438c45198b00eL } },
34345     /* 49 << 196 */
34346     { { 0x1d083bc9049d33faL,0x58b82dda946f67ffL,0xac3e2db867a1d6a3L,
34347         0x62e6bead1798aac8L },
34348       { 0xfc85980fde46c58cL,0xa7f6937969c8d7beL,0x23557927837b35ecL,
34349         0x06a933d8e0790c0cL } },
34350     /* 50 << 196 */
34351     { { 0x827c0e9b077ff55dL,0x53977798bb26e680L,0x595308741d9cb54fL,
34352         0xcca3f4494aac53efL },
34353       { 0x11dc5c87a07eda0fL,0xc138bccffd6400c8L,0x549680d313e5da72L,
34354         0xc93eed824540617eL } },
34355     /* 51 << 196 */
34356     { { 0xfd3db1574d0b75c0L,0x9716eb426386075bL,0x0639605c817b2c16L,
34357         0x09915109f1e4f201L },
34358       { 0x35c9a9285cca6c3bL,0xb25f7d1a3505c900L,0xeb9f7d20630480c4L,
34359         0xc3c7b8c62a1a501cL } },
34360     /* 52 << 196 */
34361     { { 0x3f99183c5a1f8e24L,0xfdb118fa9dd255f0L,0xb9b18b90c27f62a6L,
34362         0xe8f732f7396ec191L },
34363       { 0x524a2d910be786abL,0x5d32adef0ac5a0f5L,0x9b53d4d69725f694L,
34364         0x032a76c60510ba89L } },
34365     /* 53 << 196 */
34366     { { 0x840391a3ebeb1544L,0x44b7b88c3ed73ac3L,0xd24bae7a256cb8b3L,
34367         0x7ceb151ae394cb12L },
34368       { 0xbd6b66d05bc1e6a8L,0xec70cecb090f07bfL,0x270644ed7d937589L,
34369         0xee9e1a3d5f1dccfeL } },
34370     /* 54 << 196 */
34371     { { 0xb0d40a84745b98d2L,0xda429a212556ed40L,0xf676eced85148cb9L,
34372         0x5a22d40cded18936L },
34373       { 0x3bc4b9e570e8a4ceL,0xbfd1445b9eae0379L,0xf23f2c0c1a0bd47eL,
34374         0xa9c0bb31e1845531L } },
34375     /* 55 << 196 */
34376     { { 0x9ddc4d600a4c3f6bL,0xbdfaad792c15ef44L,0xce55a2367f484accL,
34377         0x08653ca7055b1f15L },
34378       { 0x2efa8724538873a3L,0x09299e5dace1c7e7L,0x07afab66ade332baL,
34379         0x9be1fdf692dd71b7L } },
34380     /* 56 << 196 */
34381     { { 0xa49b5d595758b11cL,0x0b852893c8654f40L,0xb63ef6f452379447L,
34382         0xd4957d29105e690cL },
34383       { 0x7d484363646559b0L,0xf4a8273c49788a8eL,0xee406cb834ce54a9L,
34384         0x1e1c260ff86fda9bL } },
34385     /* 57 << 196 */
34386     { { 0xe150e228cf6a4a81L,0x1fa3b6a31b488772L,0x1e6ff110c5a9c15bL,
34387         0xc6133b918ad6aa47L },
34388       { 0x8ac5d55c9dffa978L,0xba1d1c1d5f3965f2L,0xf969f4e07732b52fL,
34389         0xfceecdb5a5172a07L } },
34390     /* 58 << 196 */
34391     { { 0xb0120a5f10f2b8f5L,0xc83a6cdf5c4c2f63L,0x4d47a491f8f9c213L,
34392         0xd9e1cce5d3f1bbd5L },
34393       { 0x0d91bc7caba7e372L,0xfcdc74c8dfd1a2dbL,0x05efa800374618e5L,
34394         0x1121696915a7925eL } },
34395     /* 59 << 196 */
34396     { { 0xd4c89823f6021c5dL,0x880d5e84eff14423L,0x6523bc5a6dcd1396L,
34397         0xd1acfdfc113c978bL },
34398       { 0xb0c164e8bbb66840L,0xf7f4301e72b58459L,0xc29ad4a6a638e8ecL,
34399         0xf5ab896146b78699L } },
34400     /* 60 << 196 */
34401     { { 0x9dbd79740e954750L,0x0121de8864f9d2c6L,0x2e597b42d985232eL,
34402         0x55b6c3c553451777L },
34403       { 0xbb53e547519cb9fbL,0xf134019f8428600dL,0x5a473176e081791aL,
34404         0x2f3e226335fb0c08L } },
34405     /* 61 << 196 */
34406     { { 0xb28c301773d273b0L,0xccd210767721ef9aL,0x054cc292b650dc39L,
34407         0x662246de6188045eL },
34408       { 0x904b52fa6b83c0d1L,0xa72df26797e9cd46L,0x886b43cd899725e4L,
34409         0x2b651688d849ff22L } },
34410     /* 62 << 196 */
34411     { { 0x60479b7902f34533L,0x5e354c140c77c148L,0xb4bb7581a8537c78L,
34412         0x188043d7efe1495fL },
34413       { 0x9ba12f428c1d5026L,0x2e0c8a2693d4aaabL,0xbdba7b8baa57c450L,
34414         0x140c9ad69bbdafefL } },
34415     /* 63 << 196 */
34416     { { 0x2067aa4225ac0f18L,0xf7b1295b04d1fbf3L,0x14829111a4b04824L,
34417         0x2ce3f19233bd5e91L },
34418       { 0x9c7a1d558f2e1b72L,0xfe932286302aa243L,0x497ca7b4d4be9554L,
34419         0xb8e821b8e0547a6eL } },
34420     /* 64 << 196 */
34421     { { 0xfb2838be67e573e0L,0x05891db94084c44bL,0x9131137396c1c2c5L,
34422         0x6aebfa3fd958444bL },
34423       { 0xac9cdce9e56e55c1L,0x7148ced32caa46d0L,0x2e10c7efb61fe8ebL,
34424         0x9fd835daff97cf4dL } },
34425     /* 0 << 203 */
34426     { { 0x00, 0x00, 0x00, 0x00 },
34427       { 0x00, 0x00, 0x00, 0x00 } },
34428     /* 1 << 203 */
34429     { { 0xa36da109081e9387L,0xfb9780d78c935828L,0xd5940332e540b015L,
34430         0xc9d7b51be0f466faL },
34431       { 0xfaadcd41d6d9f671L,0xba6c1e28b1a2ac17L,0x066a7833ed201e5fL,
34432         0x19d99719f90f462bL } },
34433     /* 2 << 203 */
34434     { { 0xf431f462060b5f61L,0xa56f46b47bd057c2L,0x348dca6c47e1bf65L,
34435         0x9a38783e41bcf1ffL },
34436       { 0x7a5d33a9da710718L,0x5a7799872e0aeaf6L,0xca87314d2d29d187L,
34437         0xfa0edc3ec687d733L } },
34438     /* 3 << 203 */
34439     { { 0x9df336216a31e09bL,0xde89e44dc1350e35L,0x292148714ca0cf52L,
34440         0xdf3796720b88a538L },
34441       { 0xc92a510a2591d61bL,0x79aa87d7585b447bL,0xf67db604e5287f77L,
34442         0x1697c8bf5efe7a80L } },
34443     /* 4 << 203 */
34444     { { 0x1c894849cb198ac7L,0xa884a93d0f264665L,0x2da964ef9b200678L,
34445         0x3c351b87009834e6L },
34446       { 0xafb2ef9fe2c4b44bL,0x580f6c473326790cL,0xb84805210b02264aL,
34447         0x8ba6f9e242a194e2L } },
34448     /* 5 << 203 */
34449     { { 0xfc87975f8fb54738L,0x3516078827c3ead3L,0x834116d2b74a085aL,
34450         0x53c99a73a62fe996L },
34451       { 0x87585be05b81c51bL,0x925bafa8be0852b7L,0x76a4fafda84d19a7L,
34452         0x39a45982585206d4L } },
34453     /* 6 << 203 */
34454     { { 0x499b6ab65eb03c0eL,0xf19b795472bc3fdeL,0xa86b5b9c6e3a80d2L,
34455         0xe43775086d42819fL },
34456       { 0xc1663650bb3ee8a3L,0x75eb14fcb132075fL,0xa8ccc9067ad834f6L,
34457         0xea6a2474e6e92ffdL } },
34458     /* 7 << 203 */
34459     { { 0x9d72fd950f8d6758L,0xcb84e101408c07ddL,0xb9114bfda5e23221L,
34460         0x358b5fe2e94e742cL },
34461       { 0x1c0577ec95f40e75L,0xf01554513d73f3d6L,0x9d55cd67bd1b9b66L,
34462         0x63e86e78af8d63c7L } },
34463     /* 8 << 203 */
34464     { { 0x39d934abd3c095f1L,0x04b261bee4b76d71L,0x1d2e6970e73e6984L,
34465         0x879fb23b5e5fcb11L },
34466       { 0x11506c72dfd75490L,0x3a97d08561bcf1c1L,0x43201d82bf5e7007L,
34467         0x7f0ac52f798232a7L } },
34468     /* 9 << 203 */
34469     { { 0x2715cbc46eb564d4L,0x8d6c752c9e570e29L,0xf80247c89ef5fd5dL,
34470         0xc3c66b46d53eb514L },
34471       { 0x9666b4010f87de56L,0xce62c06fc6c603b5L,0xae7b4c607e4fc942L,
34472         0x38ac0b77663a9c19L } },
34473     /* 10 << 203 */
34474     { { 0xcb4d20ee4b049136L,0x8b63bf12356a4613L,0x1221aef670e08128L,
34475         0xe62d8c514acb6b16L },
34476       { 0x71f64a67379e7896L,0xb25237a2cafd7fa5L,0xf077bd983841ba6aL,
34477         0xc4ac02443cd16e7eL } },
34478     /* 11 << 203 */
34479     { { 0x548ba86921fea4caL,0xd36d0817f3dfdac1L,0x09d8d71ff4685fafL,
34480         0x8eff66bec52c459aL },
34481       { 0x182faee70b57235eL,0xee3c39b10106712bL,0x5107331fc0fcdcb0L,
34482         0x669fb9dca51054baL } },
34483     /* 12 << 203 */
34484     { { 0xb25101fb319d7682L,0xb02931290a982feeL,0x51c1c9b90261b344L,
34485         0x0e008c5bbfd371faL },
34486       { 0xd866dd1c0278ca33L,0x666f76a6e5aa53b1L,0xe5cfb7796013a2cfL,
34487         0x1d3a1aada3521836L } },
34488     /* 13 << 203 */
34489     { { 0xcedd253173faa485L,0xc8ee6c4fc0a76878L,0xddbccfc92a11667dL,
34490         0x1a418ea91c2f695aL },
34491       { 0xdb11bd9251f73971L,0x3e4b3c82da2ed89fL,0x9a44f3f4e73e0319L,
34492         0xd1e3de0f303431afL } },
34493     /* 14 << 203 */
34494     { { 0x3c5604ff50f75f9cL,0x1d8eddf37e752b22L,0x0ef074dd3c9a1118L,
34495         0xd0ffc172ccb86d7bL },
34496       { 0xabd1ece3037d90f2L,0xe3f307d66055856cL,0x422f93287e4c6dafL,
34497         0x902aac66334879a0L } },
34498     /* 15 << 203 */
34499     { { 0xb6a1e7bf94cdfadeL,0x6c97e1ed7fc6d634L,0x662ad24da2fb63f8L,
34500         0xf81be1b9a5928405L },
34501       { 0x86d765e4d14b4206L,0xbecc2e0e8fa0db65L,0xa28838e0b17fc76cL,
34502         0xe49a602ae37cf24eL } },
34503     /* 16 << 203 */
34504     { { 0x76b4131a567193ecL,0xaf3c305ae5f6e70bL,0x9587bd39031eebddL,
34505         0x5709def871bbe831L },
34506       { 0x570599830eb2b669L,0x4d80ce1b875b7029L,0x838a7da80364ac16L,
34507         0x2f431d23be1c83abL } },
34508     /* 17 << 203 */
34509     { { 0xe56812a6f9294dd3L,0xb448d01f9b4b0d77L,0xf3ae606104e8305cL,
34510         0x2bead64594d8c63eL },
34511       { 0x0a85434d84fd8b07L,0x537b983ff7a9dee5L,0xedcc5f18ef55bd85L,
34512         0x2041af6221c6cf8bL } },
34513     /* 18 << 203 */
34514     { { 0x8e52874cb940c71eL,0x211935a9db5f4b3aL,0x94350492301b1dc3L,
34515         0x33d2646d29958620L },
34516       { 0x16b0d64bef911404L,0x9d1f25ea9a3c5ef4L,0x20f200eb4a352c78L,
34517         0x43929f2c4bd0b428L } },
34518     /* 19 << 203 */
34519     { { 0xa5656667c7196e29L,0x7992c2f09391be48L,0xaaa97cbd9ee0cd6eL,
34520         0x51b0310c3dc8c9bfL },
34521       { 0x237f8acfdd9f22cbL,0xbb1d81a1b585d584L,0x8d5d85f58c416388L,
34522         0x0d6e5a5a42fe474fL } },
34523     /* 20 << 203 */
34524     { { 0xe781276638235d4eL,0x1c62bd67496e3298L,0x8378660c3f175bc8L,
34525         0x4d04e18917afdd4dL },
34526       { 0x32a8160185a8068cL,0xdb58e4e192b29a85L,0xe8a65b86c70d8a3bL,
34527         0x5f0e6f4e98a0403bL } },
34528     /* 21 << 203 */
34529     { { 0x0812968469ed2370L,0x34dc30bd0871ee26L,0x3a5ce9487c9c5b05L,
34530         0x7d487b8043a90c87L },
34531       { 0x4089ba37dd0e7179L,0x45f80191b4041811L,0x1c3e105898747ba5L,
34532         0x98c4e13a6e1ae592L } },
34533     /* 22 << 203 */
34534     { { 0xd44636e6e82c9f9eL,0x711db87cc33a1043L,0x6f431263aa8aec05L,
34535         0x43ff120d2744a4aaL },
34536       { 0xd3bd892fae77779bL,0xf0fe0cc98cdc9f82L,0xca5f7fe6f1c5b1bcL,
34537         0xcc63a68244929a72L } },
34538     /* 23 << 203 */
34539     { { 0xc7eaba0c09dbe19aL,0x2f3585ad6b5c73c2L,0x8ab8924b0ae50c30L,
34540         0x17fcd27a638b30baL },
34541       { 0xaf414d3410b3d5a5L,0x09c107d22a9accf1L,0x15dac49f946a6242L,
34542         0xaec3df2ad707d642L } },
34543     /* 24 << 203 */
34544     { { 0x2c2492b73f894ae0L,0xf59df3e5b75f18ceL,0x7cb740d28f53cad0L,
34545         0x3eb585fbc4f01294L },
34546       { 0x17da0c8632c7f717L,0xeb8c795baf943f4cL,0x4ee23fb5f67c51d2L,
34547         0xef18757568889949L } },
34548     /* 25 << 203 */
34549     { { 0xa6b4bdb20389168bL,0xc4ecd258ea577d03L,0x3a63782b55743082L,
34550         0x6f678f4cc72f08cdL },
34551       { 0x553511cf65e58dd8L,0xd53b4e3ed402c0cdL,0x37de3e29a037c14cL,
34552         0x86b6c516c05712aaL } },
34553     /* 26 << 203 */
34554     { { 0x2834da3eb38dff6fL,0xbe012c52ea636be8L,0x292d238c61dd37f8L,
34555         0x0e54523f8f8142dbL },
34556       { 0xe31eb436036a05d8L,0x83e3cdff1e93c0ffL,0x3fd2fe0f50821ddfL,
34557         0xc8e19b0dff9eb33bL } },
34558     /* 27 << 203 */
34559     { { 0xc8cc943fb569a5feL,0xad0090d4d4342d75L,0x82090b4bcaeca000L,
34560         0xca39687f1bd410ebL },
34561       { 0xe7bb0df765959d77L,0x39d782189c964999L,0xd87f62e8b2415451L,
34562         0xe5efb774bed76108L } },
34563     /* 28 << 203 */
34564     { { 0x3ea011a4e822f0d0L,0xbc647ad15a8704f8L,0xbb315b3550c6820fL,
34565         0x863dec3db7e76becL },
34566       { 0x01ff5d3af017bfc7L,0x20054439976b8229L,0x067fca370bbd0d3bL,
34567         0xf63dde647f5e3d0fL } },
34568     /* 29 << 203 */
34569     { { 0x22dbefb32a4c94e9L,0xafbff0fe96f8278aL,0x80aea0b13503793dL,
34570         0xb22380295f06cd29L },
34571       { 0x65703e578ec3fecaL,0x06c38314393e7053L,0xa0b751eb7c6734c4L,
34572         0xd2e8a435c59f0f1eL } },
34573     /* 30 << 203 */
34574     { { 0x147d90525e9ca895L,0x2f4dd31e972072dfL,0xa16fda8ee6c6755cL,
34575         0xc66826ffcf196558L },
34576       { 0x1f1a76a30cf43895L,0xa9d604e083c3097bL,0xe190830966390e0eL,
34577         0xa50bf753b3c85effL } },
34578     /* 31 << 203 */
34579     { { 0x0696bddef6a70251L,0x548b801b3c6ab16aL,0x37fcf704a4d08762L,
34580         0x090b3defdff76c4eL },
34581       { 0x87e8cb8969cb9158L,0x44a90744995ece43L,0xf85395f40ad9fbf5L,
34582         0x49b0f6c54fb0c82dL } },
34583     /* 32 << 203 */
34584     { { 0x75d9bc15adf7cccfL,0x81a3e5d6dfa1e1b0L,0x8c39e444249bc17eL,
34585         0xf37dccb28ea7fd43L },
34586       { 0xda654873907fba12L,0x35daa6da4a372904L,0x0564cfc66283a6c5L,
34587         0xd09fa4f64a9395bfL } },
34588     /* 33 << 203 */
34589     { { 0x688e9ec9aeb19a36L,0xd913f1cec7bfbfb4L,0x797b9a3c61c2faa6L,
34590         0x2f979bec6a0a9c12L },
34591       { 0xb5969d0f359679ecL,0xebcf523d079b0460L,0xfd6b000810fab870L,
34592         0x3f2edcda9373a39cL } },
34593     /* 34 << 203 */
34594     { { 0x0d64f9a76f568431L,0xf848c27c02f8898cL,0xf418ade1260b5bd5L,
34595         0xc1f3e3236973dee8L },
34596       { 0x46e9319c26c185ddL,0x6d85b7d8546f0ac4L,0x427965f2247f9d57L,
34597         0xb519b636b0035f48L } },
34598     /* 35 << 203 */
34599     { { 0x6b6163a9ab87d59cL,0xff9f58c339caaa11L,0x4ac39cde3177387bL,
34600         0x5f6557c2873e77f9L },
34601       { 0x6750400636a83041L,0x9b1c96ca75ef196cL,0xf34283deb08c7940L,
34602         0x7ea096441128c316L } },
34603     /* 36 << 203 */
34604     { { 0xb510b3b56aa39dffL,0x59b43da29f8e4d8cL,0xa8ce31fd9e4c4b9fL,
34605         0x0e20be26c1303c01L },
34606       { 0x18187182e8ee47c9L,0xd9687cdb7db98101L,0x7a520e4da1e14ff6L,
34607         0x429808ba8836d572L } },
34608     /* 37 << 203 */
34609     { { 0xa37ca60d4944b663L,0xf901f7a9a3f91ae5L,0xe4e3e76e9e36e3b1L,
34610         0x9aa219cf29d93250L },
34611       { 0x347fe275056a2512L,0xa4d643d9de65d95cL,0x9669d396699fc3edL,
34612         0xb598dee2cf8c6bbeL } },
34613     /* 38 << 203 */
34614     { { 0x682ac1e5dda9e5c6L,0x4e0d3c72caa9fc95L,0x17faaade772bea44L,
34615         0x5ef8428cab0009c8L },
34616       { 0xcc4ce47a460ff016L,0xda6d12bf725281cbL,0x44c678480223aad2L,
34617         0x6e342afa36256e28L } },
34618     /* 39 << 203 */
34619     { { 0x1400bb0b93a37c04L,0x62b1bc9bdd10bd96L,0x7251adeb0dac46b7L,
34620         0x7d33b92e7be4ef51L },
34621       { 0x28b2a94be61fa29aL,0x4b2be13f06422233L,0x36d6d062330d8d37L,
34622         0x5ef80e1eb28ca005L } },
34623     /* 40 << 203 */
34624     { { 0x174d46996d16768eL,0x9fc4ff6a628bf217L,0x77705a94154e490dL,
34625         0x9d96dd288d2d997aL },
34626       { 0x77e2d9d8ce5d72c4L,0x9d06c5a4c11c714fL,0x02aa513679e4a03eL,
34627         0x1386b3c2030ff28bL } },
34628     /* 41 << 203 */
34629     { { 0xfe82e8a6fb283f61L,0x7df203e5f3abc3fbL,0xeec7c3513a4d3622L,
34630         0xf7d17dbfdf762761L },
34631       { 0xc3956e44522055f0L,0xde3012db8fa748dbL,0xca9fcb63bf1dcc14L,
34632         0xa56d9dcfbe4e2f3aL } },
34633     /* 42 << 203 */
34634     { { 0xb86186b68bcec9c2L,0x7cf24df9680b9f06L,0xc46b45eac0d29281L,
34635         0xfff42bc507b10e12L },
34636       { 0x12263c404d289427L,0x3d5f1899b4848ec4L,0x11f97010d040800cL,
34637         0xb4c5f529300feb20L } },
34638     /* 43 << 203 */
34639     { { 0xcc543f8fde94fdcbL,0xe96af739c7c2f05eL,0xaa5e0036882692e1L,
34640         0x09c75b68950d4ae9L },
34641       { 0x62f63df2b5932a7aL,0x2658252ede0979adL,0x2a19343fb5e69631L,
34642         0x718c7501525b666bL } },
34643     /* 44 << 203 */
34644     { { 0x26a42d69ea40dc3aL,0xdc84ad22aecc018fL,0x25c36c7b3270f04aL,
34645         0x46ba6d4750fa72edL },
34646       { 0x6c37d1c593e58a8eL,0xa2394731120c088cL,0xc3be4263cb6e86daL,
34647         0x2c417d367126d038L } },
34648     /* 45 << 203 */
34649     { { 0x5b70f9c58b6f8efaL,0x671a2faa37718536L,0xd3ced3c6b539c92bL,
34650         0xe56f1bd9a31203c2L },
34651       { 0x8b096ec49ff3c8ebL,0x2deae43243491ceaL,0x2465c6eb17943794L,
34652         0x5d267e6620586843L } },
34653     /* 46 << 203 */
34654     { { 0x9d3d116db07159d0L,0xae07a67fc1896210L,0x8fc84d87bb961579L,
34655         0x30009e491c1f8dd6L },
34656       { 0x8a8caf22e3132819L,0xcffa197cf23ab4ffL,0x58103a44205dd687L,
34657         0x57b796c30ded67a2L } },
34658     /* 47 << 203 */
34659     { { 0x0b9c3a6ca1779ad7L,0xa33cfe2e357c09c5L,0x2ea293153db4a57eL,
34660         0x919596958ebeb52eL },
34661       { 0x118db9a6e546c879L,0x8e996df46295c8d6L,0xdd99048455ec806bL,
34662         0x24f291ca165c1035L } },
34663     /* 48 << 203 */
34664     { { 0xcca523bb440e2229L,0x324673a273ef4d04L,0xaf3adf343e11ec39L,
34665         0x6136d7f1dc5968d3L },
34666       { 0x7a7b2899b053a927L,0x3eaa2661ae067ecdL,0x8549b9c802779cd9L,
34667         0x061d7940c53385eaL } },
34668     /* 49 << 203 */
34669     { { 0x3e0ba883f06d18bdL,0x4ba6de53b2700843L,0xb966b668591a9e4dL,
34670         0x93f675677f4fa0edL },
34671       { 0x5a02711b4347237bL,0xbc041e2fe794608eL,0x55af10f570f73d8cL,
34672         0xd2d4d4f7bb7564f7L } },
34673     /* 50 << 203 */
34674     { { 0xd7d27a89b3e93ce7L,0xf7b5a8755d3a2c1bL,0xb29e68a0255b218aL,
34675         0xb533837e8af76754L },
34676       { 0xd1b05a73579fab2eL,0xb41055a1ecd74385L,0xb2369274445e9115L,
34677         0x2972a7c4f520274eL } },
34678     /* 51 << 203 */
34679     { { 0x6c08334ef678e68aL,0x4e4160f099b057edL,0x3cfe11b852ccb69aL,
34680         0x2fd1823a21c8f772L },
34681       { 0xdf7f072f3298f055L,0x8c0566f9fec74a6eL,0xe549e0195bb4d041L,
34682         0x7c3930ba9208d850L } },
34683     /* 52 << 203 */
34684     { { 0xe07141fcaaa2902bL,0x539ad799e4f69ad3L,0xa6453f94813f9ffdL,
34685         0xc58d3c48375bc2f7L },
34686       { 0xb3326fad5dc64e96L,0x3aafcaa9b240e354L,0x1d1b0903aca1e7a9L,
34687         0x4ceb97671211b8a0L } },
34688     /* 53 << 203 */
34689     { { 0xeca83e49e32a858eL,0x4c32892eae907badL,0xd5b42ab62eb9b494L,
34690         0x7fde3ee21eabae1bL },
34691       { 0x13b5ab09caf54957L,0xbfb028bee5f5d5d5L,0x928a06502003e2c0L,
34692         0x90793aac67476843L } },
34693     /* 54 << 203 */
34694     { { 0x5e942e79c81710a0L,0x557e4a3627ccadd4L,0x72a2bc564bcf6d0cL,
34695         0x09ee5f4326d7b80cL },
34696       { 0x6b70dbe9d4292f19L,0x56f74c2663f16b18L,0xc23db0f735fbb42aL,
34697         0xb606bdf66ae10040L } },
34698     /* 55 << 203 */
34699     { { 0x1eb15d4d044573acL,0x7dc3cf86556b0ba4L,0x97af9a33c60df6f7L,
34700         0x0b1ef85ca716ce8cL },
34701       { 0x2922f884c96958beL,0x7c32fa9435690963L,0x2d7f667ceaa00061L,
34702         0xeaaf7c173547365cL } },
34703     /* 56 << 203 */
34704     { { 0x1eb4de4687032d58L,0xc54f3d835e2c79e0L,0x07818df45d04ef23L,
34705         0x55faa9c8673d41b4L },
34706       { 0xced64f6f89b95355L,0x4860d2eab7415c84L,0x5fdb9bd2050ebad3L,
34707         0xdb53e0cc6685a5bfL } },
34708     /* 57 << 203 */
34709     { { 0xb830c0319feb6593L,0xdd87f3106accff17L,0x2303ebab9f555c10L,
34710         0x94603695287e7065L },
34711       { 0xf88311c32e83358cL,0x508dd9b4eefb0178L,0x7ca237062dba8652L,
34712         0x62aac5a30047abe5L } },
34713     /* 58 << 203 */
34714     { { 0x9a61d2a08b1ea7b3L,0xd495ab63ae8b1485L,0x38740f8487052f99L,
34715         0x178ebe5bb2974eeaL },
34716       { 0x030bbcca5b36d17fL,0xb5e4cce3aaf86eeaL,0xb51a022068f8e9e0L,
34717         0xa434879609eb3e75L } },
34718     /* 59 << 203 */
34719     { { 0xbe592309eef1a752L,0x5d7162d76f2aa1edL,0xaebfb5ed0f007dd2L,
34720         0x255e14b2c89edd22L },
34721       { 0xba85e0720303b697L,0xc5d17e25f05720ffL,0x02b58d6e5128ebb6L,
34722         0x2c80242dd754e113L } },
34723     /* 60 << 203 */
34724     { { 0x919fca5fabfae1caL,0x937afaac1a21459bL,0x9e0ca91c1f66a4d2L,
34725         0x194cc7f323ec1331L },
34726       { 0xad25143a8aa11690L,0xbe40ad8d09b59e08L,0x37d60d9be750860aL,
34727         0x6c53b008c6bf434cL } },
34728     /* 61 << 203 */
34729     { { 0xb572415d1356eb80L,0xb8bf9da39578ded8L,0x22658e365e8fb38bL,
34730         0x9b70ce225af8cb22L },
34731       { 0x7c00018a829a8180L,0x84329f93b81ed295L,0x7c343ea25f3cea83L,
34732         0x38f8655f67586536L } },
34733     /* 62 << 203 */
34734     { { 0xa661a0d01d3ec517L,0x98744652512321aeL,0x084ca591eca92598L,
34735         0xa9bb9dc91dcb3febL },
34736       { 0x14c5435578b4c240L,0x5ed62a3b610cafdcL,0x07512f371b38846bL,
34737         0x571bb70ab0e38161L } },
34738     /* 63 << 203 */
34739     { { 0xb556b95b2da705d2L,0x3ef8ada6b1a08f98L,0x85302ca7ddecfbe5L,
34740         0x0e530573943105cdL },
34741       { 0x60554d5521a9255dL,0x63a32fa1f2f3802aL,0x35c8c5b0cd477875L,
34742         0x97f458ea6ad42da1L } },
34743     /* 64 << 203 */
34744     { { 0x832d7080eb6b242dL,0xd30bd0233b71e246L,0x7027991bbe31139dL,
34745         0x68797e91462e4e53L },
34746       { 0x423fe20a6b4e185aL,0x82f2c67e42d9b707L,0x25c817684cf7811bL,
34747         0xbd53005e045bb95dL } },
34748     /* 0 << 210 */
34749     { { 0x00, 0x00, 0x00, 0x00 },
34750       { 0x00, 0x00, 0x00, 0x00 } },
34751     /* 1 << 210 */
34752     { { 0xe5f649be9d8e68fdL,0xdb0f05331b044320L,0xf6fde9b3e0c33398L,
34753         0x92f4209b66c8cfaeL },
34754       { 0xe9d1afcc1a739d4bL,0x09aea75fa28ab8deL,0x14375fb5eac6f1d0L,
34755         0x6420b560708f7aa5L } },
34756     /* 2 << 210 */
34757     { { 0x9eae499c6254dc41L,0x7e2939247a837e7eL,0x74aec08c090524a7L,
34758         0xf82b92198d6f55f2L },
34759       { 0x493c962e1402cec5L,0x9f17ca17fa2f30e7L,0xbcd783e8e9b879cbL,
34760         0xea3d8c145a6f145fL } },
34761     /* 3 << 210 */
34762     { { 0xdede15e75e0dee6eL,0x74f24872dc628aa2L,0xd3e9c4fe7861bb93L,
34763         0x56d4822a6187b2e0L },
34764       { 0xb66417cfc59826f9L,0xca2609692408169eL,0xedf69d06c79ef885L,
34765         0x00031f8adc7d138fL } },
34766     /* 4 << 210 */
34767     { { 0x103c46e60ebcf726L,0x4482b8316231470eL,0x6f6dfaca487c2109L,
34768         0x2e0ace9762e666efL },
34769       { 0x3246a9d31f8d1f42L,0x1b1e83f1574944d2L,0x13dfa63aa57f334bL,
34770         0x0cf8daed9f025d81L } },
34771     /* 5 << 210 */
34772     { { 0x30d78ea800ee11c1L,0xeb053cd4b5e3dd75L,0x9b65b13ed58c43c5L,
34773         0xc3ad49bdbd151663L },
34774       { 0x99fd8e41b6427990L,0x12cf15bd707eae1eL,0x29ad4f1b1aabb71eL,
34775         0x5143e74d07545d0eL } },
34776     /* 6 << 210 */
34777     { { 0x30266336c88bdee1L,0x25f293065876767cL,0x9c078571c6731996L,
34778         0xc88690b2ed552951L },
34779       { 0x274f2c2d852705b4L,0xb0bf8d444e09552dL,0x7628beeb986575d1L,
34780         0x407be2387f864651L } },
34781     /* 7 << 210 */
34782     { { 0x0e5e3049a639fc6bL,0xe75c35d986003625L,0x0cf35bd85dcc1646L,
34783         0x8bcaced26c26273aL },
34784       { 0xe22ecf1db5536742L,0x013dd8971a9e068bL,0x17f411cb8a7909c5L,
34785         0x5757ac98861dd506L } },
34786     /* 8 << 210 */
34787     { { 0x85de1f0d1e935abbL,0xdefd10b4154de37aL,0xb8d9e392369cebb5L,
34788         0x54d5ef9b761324beL },
34789       { 0x4d6341ba74f17e26L,0xc0a0e3c878c1dde4L,0xa6d7758187d918fdL,
34790         0x6687601502ca3a13L } },
34791     /* 9 << 210 */
34792     { { 0xc7313e9cf36658f0L,0xc433ef1c71f8057eL,0x853262461b6a835aL,
34793         0xc8f053987c86394cL },
34794       { 0xff398cdfe983c4a1L,0xbf5e816203b7b931L,0x93193c46b7b9045bL,
34795         0x1e4ebf5da4a6e46bL } },
34796     /* 10 << 210 */
34797     { { 0xf9942a6043a24fe7L,0x29c1191effb3492bL,0x9f662449902fde05L,
34798         0xc792a7ac6713c32dL },
34799       { 0x2fd88ad8b737982cL,0x7e3a0319a21e60e3L,0x09b0de447383591aL,
34800         0x6df141ee8310a456L } },
34801     /* 11 << 210 */
34802     { { 0xaec1a039e6d6f471L,0x14b2ba0f1198d12eL,0xebc1a1603aeee5acL,
34803         0x401f4836e0b964ceL },
34804       { 0x2ee437964fd03f66L,0x3fdb4e49dd8f3f12L,0x6ef267f629380f18L,
34805         0x3e8e96708da64d16L } },
34806     /* 12 << 210 */
34807     { { 0xbc19180c207674f1L,0x112e09a733ae8fdbL,0x996675546aaeb71eL,
34808         0x79432af1e101b1c7L },
34809       { 0xd5eb558fde2ddec6L,0x81392d1f5357753fL,0xa7a76b973ae1158aL,
34810         0x416fbbff4a899991L } },
34811     /* 13 << 210 */
34812     { { 0x9e65fdfd0d4a9dcfL,0x7bc29e48944ddf12L,0xbc1a92d93c856866L,
34813         0x273c69056e98dfe2L },
34814       { 0x69fce418cdfaa6b8L,0x606bd8235061c69fL,0x42d495a06af75e27L,
34815         0x8ed3d5056d873a1fL } },
34816     /* 14 << 210 */
34817     { { 0xaf5528416ab25b6aL,0xc6c0ffc72b1a4523L,0xab18827b21c99e03L,
34818         0x060e86489034691bL },
34819       { 0x5207f90f93c7f398L,0x9f4a96cb82f8d10bL,0xdd71cd793ad0f9e3L,
34820         0x84f435d2fc3a54f5L } },
34821     /* 15 << 210 */
34822     { { 0x4b03c55b8e33787fL,0xef42f975a6384673L,0xff7304f75051b9f0L,
34823         0x18aca1dc741c87c2L },
34824       { 0x56f120a72d4bfe80L,0xfd823b3d053e732cL,0x11bccfe47537ca16L,
34825         0xdf6c9c741b5a996bL } },
34826     /* 16 << 210 */
34827     { { 0xee7332c7904fc3faL,0x14a23f45c7e3636aL,0xc38659c3f091d9aaL,
34828         0x4a995e5db12d8540L },
34829       { 0x20a53becf3a5598aL,0x56534b17b1eaa995L,0x9ed3dca4bf04e03cL,
34830         0x716c563ad8d56268L } },
34831     /* 17 << 210 */
34832     { { 0x27ba77a41d6178e7L,0xe4c80c4068a1ff8eL,0x750110990a13f63dL,
34833         0x7bf33521a61d46f3L },
34834       { 0x0aff218e10b365bbL,0x810218040fd7ea75L,0x05a3fd8aa4b3a925L,
34835         0xb829e75f9b3db4e6L } },
34836     /* 18 << 210 */
34837     { { 0x6bdc75a54d53e5fbL,0x04a5dc02d52717e3L,0x86af502fe9a42ec2L,
34838         0x8867e8fb2630e382L },
34839       { 0xbf845c6ebec9889bL,0x54f491f2cb47c98dL,0xa3091fba790c2a12L,
34840         0xd7f6fd78c20f708bL } },
34841     /* 19 << 210 */
34842     { { 0xa569ac30acde5e17L,0xd0f996d06852b4d7L,0xe51d4bb54609ae54L,
34843         0x3fa37d170daed061L },
34844       { 0x62a8868434b8fb41L,0x99a2acbd9efb64f1L,0xb75c1a5e6448e1f2L,
34845         0xfa99951a42b5a069L } },
34846     /* 20 << 210 */
34847     { { 0x6d956e892f3b26e7L,0xf4709860da875247L,0x3ad151792482dda3L,
34848         0xd64110e3017d82f0L },
34849       { 0x14928d2cfad414e4L,0x2b155f582ed02b24L,0x481a141bcb821bf1L,
34850         0x12e3c7704f81f5daL } },
34851     /* 21 << 210 */
34852     { { 0xe49c5de59fff8381L,0x110532325bbec894L,0xa0d051cc454d88c4L,
34853         0x4f6db89c1f8e531bL },
34854       { 0x34fe3fd6ca563a44L,0x7f5c221558da8ab9L,0x8445016d9474f0a1L,
34855         0x17d34d61cb7d8a0aL } },
34856     /* 22 << 210 */
34857     { { 0x8e9d39101c474019L,0xcaff2629d52ceefbL,0xf9cf3e32c1622c2bL,
34858         0xd4b95e3ce9071a05L },
34859       { 0xfbbca61f1594438cL,0x1eb6e6a604aadedfL,0x853027f468e14940L,
34860         0x221d322adfabda9cL } },
34861     /* 23 << 210 */
34862     { { 0xed8ea9f6b7cb179aL,0xdc7b764db7934dccL,0xfcb139405e09180dL,
34863         0x6629a6bfb47dc2ddL },
34864       { 0xbfc55e4e9f5a915eL,0xb1db9d376204441eL,0xf82d68cf930c5f53L,
34865         0x17d3a142cbb605b1L } },
34866     /* 24 << 210 */
34867     { { 0xdd5944ea308780f2L,0xdc8de7613845f5e4L,0x6beaba7d7624d7a3L,
34868         0x1e709afd304df11eL },
34869       { 0x9536437602170456L,0xbf204b3ac8f94b64L,0x4e53af7c5680ca68L,
34870         0x0526074ae0c67574L } },
34871     /* 25 << 210 */
34872     { { 0x95d8cef8ecd92af6L,0xe6b9fa7a6cd1745aL,0x3d546d3da325c3e4L,
34873         0x1f57691d9ae93aaeL },
34874       { 0xe891f3fe9d2e1a33L,0xd430093fac063d35L,0xeda59b125513a327L,
34875         0xdc2134f35536f18fL } },
34876     /* 26 << 210 */
34877     { { 0xaa51fe2c5c210286L,0x3f68aaee1cab658cL,0x5a23a00bf9357292L,
34878         0x9a626f397efdabedL },
34879       { 0xfe2b3bf3199d78e3L,0xb7a2af7771bbc345L,0x3d19827a1e59802cL,
34880         0x823bbc15b487a51cL } },
34881     /* 27 << 210 */
34882     { { 0x856139f299d0a422L,0x9ac3df65f456c6fbL,0xaddf65c6701f8bd6L,
34883         0x149f321e3758df87L },
34884       { 0xb1ecf714721b7ebaL,0xe17df09831a3312aL,0xdb2fd6ecd5c4d581L,
34885         0xfd02996f8fcea1b3L } },
34886     /* 28 << 210 */
34887     { { 0xe29fa63e7882f14fL,0xc9f6dc3507c6cadcL,0x46f22d6fb882bed0L,
34888         0x1a45755bd118e52cL },
34889       { 0x9f2c7c277c4608cfL,0x7ccbdf32568012c2L,0xfcb0aedd61729b0eL,
34890         0x7ca2ca9ef7d75dbfL } },
34891     /* 29 << 210 */
34892     { { 0xf58fecb16f640f62L,0xe274b92b39f51946L,0x7f4dfc046288af44L,
34893         0x0a91f32aeac329e5L },
34894       { 0x43ad274bd6aaba31L,0x719a16400f6884f9L,0x685d29f6daf91e20L,
34895         0x5ec1cc3327e49d52L } },
34896     /* 30 << 210 */
34897     { { 0x38f4de963b54a059L,0x0e0015e5efbcfdb3L,0x177d23d94dbb8da6L,
34898         0x98724aa297a617adL },
34899       { 0x30f0885bfdb6558eL,0xf9f7a28ac7899a96L,0xd2ae8ac8872dc112L,
34900         0xfa0642ca73c3c459L } },
34901     /* 31 << 210 */
34902     { { 0x15296981e7dfc8d6L,0x67cd44501fb5b94aL,0x0ec71cf10eddfd37L,
34903         0xc7e5eeb39a8eddc7L },
34904       { 0x02ac8e3d81d95028L,0x0088f17270b0e35dL,0xec041fabe1881fe3L,
34905         0x62cf71b8d99e7faaL } },
34906     /* 32 << 210 */
34907     { { 0x5043dea7e0f222c2L,0x309d42ac72e65142L,0x94fe9ddd9216cd30L,
34908         0xd6539c7d0f87feecL },
34909       { 0x03c5a57c432ac7d7L,0x72692cf0327fda10L,0xec28c85f280698deL,
34910         0x2331fb467ec283b1L } },
34911     /* 33 << 210 */
34912     { { 0xd34bfa322867e633L,0x78709a820a9cc815L,0xb7fe6964875e2fa5L,
34913         0x25cc064f9e98bfb5L },
34914       { 0x9eb0151c493a65c5L,0x5fb5d94153182464L,0x69e6f130f04618e2L,
34915         0xa8ecec22f89c8ab6L } },
34916     /* 34 << 210 */
34917     { { 0xcd6ac88bb96209bdL,0x65fa8cdbb3e1c9e0L,0xa47d22f54a8d8eacL,
34918         0x83895cdf8d33f963L },
34919       { 0xa8adca59b56cd3d1L,0x10c8350bdaf38232L,0x2b161fb3a5080a9fL,
34920         0xbe7f5c643af65b3aL } },
34921     /* 35 << 210 */
34922     { { 0x2c75403997403a11L,0x94626cf7121b96afL,0x431de7c46a983ec2L,
34923         0x3780dd3a52cc3df7L },
34924       { 0xe28a0e462baf8e3bL,0xabe68aad51d299aeL,0x603eb8f9647a2408L,
34925         0x14c61ed65c750981L } },
34926     /* 36 << 210 */
34927     { { 0x88b34414c53352e7L,0x5a34889c1337d46eL,0x612c1560f95f2bc8L,
34928         0x8a3f8441d4807a3aL },
34929       { 0x680d9e975224da68L,0x60cd6e88c3eb00e9L,0x3875a98e9a6bc375L,
34930         0xdc80f9244fd554c2L } },
34931     /* 37 << 210 */
34932     { { 0x6c4b34156ac77407L,0xa1e5ea8f25420681L,0x541bfa144607a458L,
34933         0x5dbc7e7a96d7fbf9L },
34934       { 0x646a851b31590a47L,0x039e85ba15ee6df8L,0xd19fa231d7b43fc0L,
34935         0x84bc8be8299a0e04L } },
34936     /* 38 << 210 */
34937     { { 0x2b9d2936f20df03aL,0x240543828608d472L,0x76b6ba049149202aL,
34938         0xb21c38313670e7b7L },
34939       { 0xddd93059d6fdee10L,0x9da47ad378488e71L,0x99cc1dfda0fcfb25L,
34940         0x42abde1064696954L } },
34941     /* 39 << 210 */
34942     { { 0x14cc15fc17eab9feL,0xd6e863e4d3e70972L,0x29a7765c6432112cL,
34943         0x886600015b0774d8L },
34944       { 0x3729175a2c088eaeL,0x13afbcae8230b8d4L,0x44768151915f4379L,
34945         0xf086431ad8d22812L } },
34946     /* 40 << 210 */
34947     { { 0x37461955c298b974L,0x905fb5f0f8711e04L,0x787abf3afe969d18L,
34948         0x392167c26f6a494eL },
34949       { 0xfc7a0d2d28c511daL,0xf127c7dcb66a262dL,0xf9c4bb95fd63fdf0L,
34950         0x900165893913ef46L } },
34951     /* 41 << 210 */
34952     { { 0x74d2a73c11aa600dL,0x2f5379bd9fb5ab52L,0xe49e53a47fb70068L,
34953         0x68dd39e5404aa9a7L },
34954       { 0xb9b0cf572ecaa9c3L,0xba0e103be824826bL,0x60c2198b4631a3c4L,
34955         0xc5ff84abfa8966a2L } },
34956     /* 42 << 210 */
34957     { { 0x2d6ebe22ac95aff8L,0x1c9bb6dbb5a46d09L,0x419062da53ee4f8dL,
34958         0x7b9042d0bb97efefL },
34959       { 0x0f87f080830cf6bdL,0x4861d19a6ec8a6c6L,0xd3a0daa1202f01aaL,
34960         0xb0111674f25afbd5L } },
34961     /* 43 << 210 */
34962     { { 0x6d00d6cf1afb20d9L,0x1369500040671bc5L,0x913ab0dc2485ea9bL,
34963         0x1f2bed069eef61acL },
34964       { 0x850c82176d799e20L,0x93415f373271c2deL,0x5afb06e96c4f5910L,
34965         0x688a52dfc4e9e421L } },
34966     /* 44 << 210 */
34967     { { 0x30495ba3e2a9a6dbL,0x4601303d58f9268bL,0xbe3b0dad7eb0f04fL,
34968         0x4ea472504456936dL },
34969       { 0x8caf8798d33fd3e7L,0x1ccd8a89eb433708L,0x9effe3e887fd50adL,
34970         0xbe240a566b29c4dfL } },
34971     /* 45 << 210 */
34972     { { 0xec4ffd98ca0e7ebdL,0xf586783ae748616eL,0xa5b00d8fc77baa99L,
34973         0x0acada29b4f34c9cL },
34974       { 0x36dad67d0fe723acL,0x1d8e53a539c36c1eL,0xe4dd342d1f4bea41L,
34975         0x64fd5e35ebc9e4e0L } },
34976     /* 46 << 210 */
34977     { { 0x96f01f9057908805L,0xb5b9ea3d5ed480ddL,0x366c5dc23efd2dd0L,
34978         0xed2fe3056e9dfa27L },
34979       { 0x4575e8926e9197e2L,0x11719c09ab502a5dL,0x264c7bece81f213fL,
34980         0x741b924155f5c457L } },
34981     /* 47 << 210 */
34982     { { 0x78ac7b6849a5f4f4L,0xf91d70a29fc45b7dL,0x39b05544b0f5f355L,
34983         0x11f06bceeef930d9L },
34984       { 0xdb84d25d038d05e1L,0x04838ee5bacc1d51L,0x9da3ce869e8ee00bL,
34985         0xc3412057c36eda1fL } },
34986     /* 48 << 210 */
34987     { { 0xae80b91364d9c2f4L,0x7468bac3a010a8ffL,0xdfd2003737359d41L,
34988         0x1a0f5ab815efeaccL },
34989       { 0x7c25ad2f659d0ce0L,0x4011bcbb6785cff1L,0x128b99127e2192c7L,
34990         0xa549d8e113ccb0e8L } },
34991     /* 49 << 210 */
34992     { { 0x805588d8c85438b1L,0x5680332dbc25cb27L,0xdcd1bc961a4bfdf4L,
34993         0x779ff428706f6566L },
34994       { 0x8bbee998f059987aL,0xf6ce8cf2cc686de7L,0xf8ad3c4a953cfdb2L,
34995         0xd1d426d92205da36L } },
34996     /* 50 << 210 */
34997     { { 0xb3c0f13fc781a241L,0x3e89360ed75362a8L,0xccd05863c8a91184L,
34998         0x9bd0c9b7efa8a7f4L },
34999       { 0x97ee4d538a912a4bL,0xde5e15f8bcf518fdL,0x6a055bf8c467e1e0L,
35000         0x10be4b4b1587e256L } },
35001     /* 51 << 210 */
35002     { { 0xd90c14f2668621c9L,0xd5518f51ab9c92c1L,0x8e6a0100d6d47b3cL,
35003         0xcbe980dd66716175L },
35004       { 0x500d3f10ddd83683L,0x3b6cb35d99cac73cL,0x53730c8b6083d550L,
35005         0xcf159767df0a1987L } },
35006     /* 52 << 210 */
35007     { { 0x84bfcf5343ad73b3L,0x1b528c204f035a94L,0x4294edf733eeac69L,
35008         0xb6283e83817f3240L },
35009       { 0xc3fdc9590a5f25b1L,0xefaf8aa55844ee22L,0xde269ba5dbdde4deL,
35010         0xe3347160c56133bfL } },
35011     /* 53 << 210 */
35012     { { 0xc11842198d9ea9f8L,0x090de5dbf3fc1ab5L,0x404c37b10bf22cdaL,
35013         0x7de20ec8f5618894L },
35014       { 0x754c588eecdaecabL,0x6ca4b0ed88342743L,0x76f08bddf4a938ecL,
35015         0xd182de8991493ccbL } },
35016     /* 54 << 210 */
35017     { { 0xd652c53ec8a4186aL,0xb3e878db946d8e33L,0x088453c05f37663cL,
35018         0x5cd9daaab407748bL },
35019       { 0xa1f5197f586d5e72L,0x47500be8c443ca59L,0x78ef35b2e2652424L,
35020         0x09c5d26f6dd7767dL } },
35021     /* 55 << 210 */
35022     { { 0x7175a79aa74d3f7bL,0x0428fd8dcf5ea459L,0x511cb97ca5d1746dL,
35023         0x36363939e71d1278L },
35024       { 0xcf2df95510350bf4L,0xb381743960aae782L,0xa748c0e43e688809L,
35025         0x98021fbfd7a5a006L } },
35026     /* 56 << 210 */
35027     { { 0x9076a70c0e367a98L,0xbea1bc150f62b7c2L,0x2645a68c30fe0343L,
35028         0xacaffa78699dc14fL },
35029       { 0xf4469964457bf9c4L,0x0db6407b0d2ead83L,0x68d56cadb2c6f3ebL,
35030         0x3b512e73f376356cL } },
35031     /* 57 << 210 */
35032     { { 0xe43b0e1ffce10408L,0x89ddc0035a5e257dL,0xb0ae0d120362e5b3L,
35033         0x07f983c7b0519161L },
35034       { 0xc2e94d155d5231e7L,0xcff22aed0b4f9513L,0xb02588dd6ad0b0b5L,
35035         0xb967d1ac11d0dcd5L } },
35036     /* 58 << 210 */
35037     { { 0x8dac6bc6cf777b6cL,0x0062bdbd4c6d1959L,0x53da71b50ef5cc85L,
35038         0x07012c7d4006f14fL },
35039       { 0x4617f962ac47800dL,0x53365f2bc102ed75L,0xb422efcb4ab8c9d3L,
35040         0x195cb26b34af31c9L } },
35041     /* 59 << 210 */
35042     { { 0x3a926e2905f2c4ceL,0xbd2bdecb9856966cL,0x5d16ab3a85527015L,
35043         0x9f81609e4486c231L },
35044       { 0xd8b96b2cda350002L,0xbd054690fa1b7d36L,0xdc90ebf5e71d79bcL,
35045         0xf241b6f908964e4eL } },
35046     /* 60 << 210 */
35047     { { 0x7c8386432fe3cd4cL,0xe0f33acbb4bc633cL,0xb4a9ecec3d139f1fL,
35048         0x05ce69cddc4a1f49L },
35049       { 0xa19d1b16f5f98aafL,0x45bb71d66f23e0efL,0x33789fcd46cdfdd3L,
35050         0x9b8e2978cee040caL } },
35051     /* 61 << 210 */
35052     { { 0x9c69b246ae0a6828L,0xba533d247078d5aaL,0x7a2e42c07bb4fbdbL,
35053         0xcfb4879a7035385cL },
35054       { 0x8c3dd30b3281705bL,0x7e361c6c404fe081L,0x7b21649c3f604edfL,
35055         0x5dbf6a3fe52ffe47L } },
35056     /* 62 << 210 */
35057     { { 0xc41b7c234b54d9bfL,0x1374e6813511c3d9L,0x1863bf16c1b2b758L,
35058         0x90e785071e9e6a96L },
35059       { 0xab4bf98d5d86f174L,0xd74e0bd385e96fe4L,0x8afde39fcac5d344L,
35060         0x90946dbcbd91b847L } },
35061     /* 63 << 210 */
35062     { { 0xf5b42358fe1a838cL,0x05aae6c5620ac9d8L,0x8e193bd8a1ce5a0bL,
35063         0x8f7105714dabfd72L },
35064       { 0x8d8fdd48182caaacL,0x8c4aeefa040745cfL,0x73c6c30af3b93e6dL,
35065         0x991241f316f42011L } },
35066     /* 64 << 210 */
35067     { { 0xa0158eeae457a477L,0xd19857dbee6ddc05L,0xb326522418c41671L,
35068         0x3ffdfc7e3c2c0d58L },
35069       { 0x3a3a525426ee7cdaL,0x341b0869df02c3a8L,0xa023bf42723bbfc8L,
35070         0x3d15002a14452691L } },
35071     /* 0 << 217 */
35072     { { 0x00, 0x00, 0x00, 0x00 },
35073       { 0x00, 0x00, 0x00, 0x00 } },
35074     /* 1 << 217 */
35075     { { 0x5ef7324c85edfa30L,0x2597655487d4f3daL,0x352f5bc0dcb50c86L,
35076         0x8f6927b04832a96cL },
35077       { 0xd08ee1ba55f2f94cL,0x6a996f99344b45faL,0xe133cb8da8aa455dL,
35078         0x5d0721ec758dc1f7L } },
35079     /* 2 << 217 */
35080     { { 0x6ba7a92079e5fb67L,0xe1331feb70aa725eL,0x5080ccf57df5d837L,
35081         0xe4cae01d7ff72e21L },
35082       { 0xd9243ee60412a77dL,0x06ff7cacdf449025L,0xbe75f7cd23ef5a31L,
35083         0xbc9578220ddef7a8L } },
35084     /* 3 << 217 */
35085     { { 0x8cf7230cb0ce1c55L,0x5b534d050bbfb607L,0xee1ef1130e16363bL,
35086         0x27e0aa7ab4999e82L },
35087       { 0xce1dac2d79362c41L,0x67920c9091bb6cb0L,0x1e648d632223df24L,
35088         0x0f7d9eefe32e8f28L } },
35089     /* 4 << 217 */
35090     { { 0x6943f39afa833834L,0x22951722a6328562L,0x81d63dd54170fc10L,
35091         0x9f5fa58faecc2e6dL },
35092       { 0xb66c8725e77d9a3bL,0x11235cea6384ebe0L,0x06a8c1185845e24aL,
35093         0x0137b286ebd093b1L } },
35094     /* 5 << 217 */
35095     { { 0xc589e1ce44ace150L,0xe0f8d3d94381e97cL,0x59e99b1162c5a4b8L,
35096         0x90d262f7fd0ec9f9L },
35097       { 0xfbc854c9283e13c9L,0x2d04fde7aedc7085L,0x057d776547dcbecbL,
35098         0x8dbdf5919a76fa5fL } },
35099     /* 6 << 217 */
35100     { { 0xd01506950de1e578L,0x2e1463e7e9f72bc6L,0xffa684411b39eca5L,
35101         0x673c85307c037f2fL },
35102       { 0xd0d6a600747f91daL,0xb08d43e1c9cb78e9L,0x0fc0c64427b5cef5L,
35103         0x5c1d160aa60a2fd6L } },
35104     /* 7 << 217 */
35105     { { 0xf98cae5328c8e13bL,0x375f10c4b2eddcd1L,0xd4eb8b7f5cce06adL,
35106         0xb4669f4580a2e1efL },
35107       { 0xd593f9d05bbd8699L,0x5528a4c9e7976d13L,0x3923e0951c7e28d3L,
35108         0xb92937903f6bb577L } },
35109     /* 8 << 217 */
35110     { { 0xdb567d6ac42bd6d2L,0x6df86468bb1f96aeL,0x0efe5b1a4843b28eL,
35111         0x961bbb056379b240L },
35112       { 0xb6caf5f070a6a26bL,0x70686c0d328e6e39L,0x80da06cf895fc8d3L,
35113         0x804d8810b363fdc9L } },
35114     /* 9 << 217 */
35115     { { 0xbe22877b207f1670L,0x9b0dd1884e615291L,0x625ae8dc97a3c2bfL,
35116         0x08584ef7439b86e8L },
35117       { 0xde7190a5dcd898ffL,0x26286c402058ee3dL,0x3db0b2175f87b1c1L,
35118         0xcc334771102a6db5L } },
35119     /* 10 << 217 */
35120     { { 0xd99de9542f770fb1L,0x97c1c6204cd7535eL,0xd3b6c4483f09cefcL,
35121         0xd725af155a63b4f8L },
35122       { 0x0c95d24fc01e20ecL,0xdfd374949ae7121fL,0x7d6ddb72ec77b7ecL,
35123         0xfe079d3b0353a4aeL } },
35124     /* 11 << 217 */
35125     { { 0x3066e70a2e6ac8d2L,0x9c6b5a43106e5c05L,0x52d3c6f5ede59b8cL,
35126         0x30d6a5c3fccec9aeL },
35127       { 0xedec7c224fc0a9efL,0x190ff08395c16cedL,0xbe12ec8f94de0fdeL,
35128         0x0d131ab8852d3433L } },
35129     /* 12 << 217 */
35130     { { 0x42ace07e85701291L,0x94793ed9194061a8L,0x30e83ed6d7f4a485L,
35131         0x9eec7269f9eeff4dL },
35132       { 0x90acba590c9d8005L,0x5feca4581e79b9d1L,0x8fbe54271d506a1eL,
35133         0xa32b2c8e2439cfa7L } },
35134     /* 13 << 217 */
35135     { { 0x1671c17373dd0b4eL,0x37a2821444a054c6L,0x81760a1b4e8b53f1L,
35136         0xa6c04224f9f93b9eL },
35137       { 0x18784b34cf671e3cL,0x81bbecd2cda9b994L,0x38831979b2ab3848L,
35138         0xef54feb7f2e03c2dL } },
35139     /* 14 << 217 */
35140     { { 0xcf197ca7fb8088faL,0x014272474ddc96c5L,0xa2d2550a30777176L,
35141         0x534698984d0cf71dL },
35142       { 0x6ce937b83a2aaac6L,0xe9f91dc35af38d9bL,0x2598ad83c8bf2899L,
35143         0x8e706ac9b5536c16L } },
35144     /* 15 << 217 */
35145     { { 0x40dc7495f688dc98L,0x26490cd7124c4afcL,0xe651ec841f18775cL,
35146         0x393ea6c3b4fdaf4aL },
35147       { 0x1e1f33437f338e0dL,0x39fb832b6053e7b5L,0x46e702da619e14d5L,
35148         0x859cacd1cdeef6e0L } },
35149     /* 16 << 217 */
35150     { { 0x63b99ce74462007dL,0xb8ab48a54cb5f5b7L,0x9ec673d2f55edde7L,
35151         0xd1567f748cfaefdaL },
35152       { 0x46381b6b0887bcecL,0x694497cee178f3c2L,0x5e6525e31e6266cbL,
35153         0x5931de26697d6413L } },
35154     /* 17 << 217 */
35155     { { 0x87f8df7c0e58d493L,0xb1ae5ed058b73f12L,0xc368f784dea0c34dL,
35156         0x9bd0a120859a91a0L },
35157       { 0xb00d88b7cc863c68L,0x3a1cc11e3d1f4d65L,0xea38e0e70aa85593L,
35158         0x37f13e987dc4aee8L } },
35159     /* 18 << 217 */
35160     { { 0x10d38667bc947badL,0x738e07ce2a36ee2eL,0xc93470cdc577fcacL,
35161         0xdee1b6162782470dL },
35162       { 0x36a25e672e793d12L,0xd6aa6caee0f186daL,0x474d0fd980e07af7L,
35163         0xf7cdc47dba8a5cd4L } },
35164     /* 19 << 217 */
35165     { { 0x28af6d9dab15247fL,0x7c789c10493a537fL,0x7ac9b11023a334e7L,
35166         0x0236ac0912c9c277L },
35167       { 0xa7e5bd251d7a5144L,0x098b9c2af13ec4ecL,0x3639dacad3f0abcaL,
35168         0x642da81aa23960f9L } },
35169     /* 20 << 217 */
35170     { { 0x7d2e5c054f7269b1L,0xfcf30777e287c385L,0x10edc84ff2a46f21L,
35171         0x354417574f43fa36L },
35172       { 0xf1327899fd703431L,0xa438d7a616dd587aL,0x65c34c57e9c8352dL,
35173         0xa728edab5cc5a24eL } },
35174     /* 21 << 217 */
35175     { { 0xaed78abc42531689L,0x0a51a0e8010963efL,0x5776fa0ad717d9b3L,
35176         0xf356c2397dd3428bL },
35177       { 0x29903fff8d3a3dacL,0x409597fa3d94491fL,0x4cd7a5ffbf4a56a4L,
35178         0xe50964748adab462L } },
35179     /* 22 << 217 */
35180     { { 0xa97b51265c3427b0L,0x6401405cd282c9bdL,0x3629f8d7222c5c45L,
35181         0xb1c02c16e8d50aedL },
35182       { 0xbea2ed75d9635bc9L,0x226790c76e24552fL,0x3c33f2a365f1d066L,
35183         0x2a43463e6dfccc2eL } },
35184     /* 23 << 217 */
35185     { { 0x8cc3453adb483761L,0xe7cc608565d5672bL,0x277ed6cbde3efc87L,
35186         0x19f2f36869234eafL },
35187       { 0x9aaf43175c0b800bL,0x1f1e7c898b6da6e2L,0x6cfb4715b94ec75eL,
35188         0xd590dd5f453118c2L } },
35189     /* 24 << 217 */
35190     { { 0x14e49da11f17a34cL,0x5420ab39235a1456L,0xb76372412f50363bL,
35191         0x7b15d623c3fabb6eL },
35192       { 0xa0ef40b1e274e49cL,0x5cf5074496b1860aL,0xd6583fbf66afe5a4L,
35193         0x44240510f47e3e9aL } },
35194     /* 25 << 217 */
35195     { { 0x9925434311b2d595L,0xf1367499eec8df57L,0x3cb12c613e73dd05L,
35196         0xd248c0337dac102aL },
35197       { 0xcf154f13a77739f5L,0xbf4288cb23d2af42L,0xaa64c9b632e4a1cfL,
35198         0xee8c07a8c8a208f3L } },
35199     /* 26 << 217 */
35200     { { 0xe10d49996fe8393fL,0x0f809a3fe91f3a32L,0x61096d1c802f63c8L,
35201         0x289e146257750d3dL },
35202       { 0xed06167e9889feeaL,0xd5c9c0e2e0993909L,0x46fca0d856508ac6L,
35203         0x918260474f1b8e83L } },
35204     /* 27 << 217 */
35205     { { 0x4f2c877a9a4a2751L,0x71bd0072cae6feadL,0x38df8dcc06aa1941L,
35206         0x5a074b4c63beeaa8L },
35207       { 0xd6d65934c1cec8edL,0xa6ecb49eaabc03bdL,0xaade91c2de8a8415L,
35208         0xcfb0efdf691136e0L } },
35209     /* 28 << 217 */
35210     { { 0x11af45ee23ab3495L,0xa132df880b77463dL,0x8923c15c815d06f4L,
35211         0xc3ceb3f50d61a436L },
35212       { 0xaf52291de88fb1daL,0xea0579741da12179L,0xb0d7218cd2fef720L,
35213         0x6c0899c98e1d8845L } },
35214     /* 29 << 217 */
35215     { { 0x98157504752ddad7L,0xd60bd74fa1a68a97L,0x7047a3a9f658fb99L,
35216         0x1f5d86d65f8511e4L },
35217       { 0xb8a4bc424b5a6d88L,0x69eb2c331abefa7dL,0x95bf39e813c9c510L,
35218         0xf571960ad48aab43L } },
35219     /* 30 << 217 */
35220     { { 0x7e8cfbcf704e23c6L,0xc71b7d2228aaa65bL,0xa041b2bd245e3c83L,
35221         0x69b98834d21854ffL },
35222       { 0x89d227a3963bfeecL,0x99947aaade7da7cbL,0x1d9ee9dbee68a9b1L,
35223         0x0a08f003698ec368L } },
35224     /* 31 << 217 */
35225     { { 0xe9ea409478ef2487L,0xc8d2d41502cfec26L,0xc52f9a6eb7dcf328L,
35226         0x0ed489e385b6a937L },
35227       { 0x9b94986bbef3366eL,0x0de59c70edddddb8L,0xffdb748ceadddbe2L,
35228         0x9b9784bb8266ea40L } },
35229     /* 32 << 217 */
35230     { { 0x142b55021a93507aL,0xb4cd11878d3c06cfL,0xdf70e76a91ec3f40L,
35231         0x484e81ad4e7553c2L },
35232       { 0x830f87b5272e9d6eL,0xea1c93e5c6ff514aL,0x67cc2adcc4192a8eL,
35233         0xc77e27e242f4535aL } },
35234     /* 33 << 217 */
35235     { { 0x9cdbab36d2b713c5L,0x86274ea0cf7b0cd3L,0x784680f309af826bL,
35236         0xbfcc837a0c72dea3L },
35237       { 0xa8bdfe9dd6529b73L,0x708aa22863a88002L,0x6c7a9a54c91d45b9L,
35238         0xdf1a38bbfd004f56L } },
35239     /* 34 << 217 */
35240     { { 0x2e8c9a26b8bad853L,0x2d52cea33723eae7L,0x054d6d8156ca2830L,
35241         0xa3317d149a8dc411L },
35242       { 0xa08662fefd4ddedaL,0xed2a153ab55d792bL,0x7035c16abfc6e944L,
35243         0xb6bc583400171cf3L } },
35244     /* 35 << 217 */
35245     { { 0xe27152b383d102b6L,0xfe695a470646b848L,0xa5bb09d8916e6d37L,
35246         0xb4269d640d17015eL },
35247       { 0x8d8156a10a1d2285L,0xfeef6c5146d26d72L,0x9dac57c84c5434a7L,
35248         0x0282e5be59d39e31L } },
35249     /* 36 << 217 */
35250     { { 0xedfff181721c486dL,0x301baf10bc58824eL,0x8136a6aa00570031L,
35251         0x55aaf78c1cddde68L },
35252       { 0x2682937159c63952L,0x3a3bd2748bc25bafL,0xecdf8657b7e52dc3L,
35253         0x2dd8c087fd78e6c8L } },
35254     /* 37 << 217 */
35255     { { 0x20553274f5531461L,0x8b4a12815d95499bL,0xe2c8763a1a80f9d2L,
35256         0xd1dbe32b4ddec758L },
35257       { 0xaf12210d30c34169L,0xba74a95378baa533L,0x3d133c6ea438f254L,
35258         0xa431531a201bef5bL } },
35259     /* 38 << 217 */
35260     { { 0x15295e22f669d7ecL,0xca374f64357fb515L,0x8a8406ffeaa3fdb3L,
35261         0x106ae448df3f2da8L },
35262       { 0x8f9b0a9033c8e9a1L,0x234645e271ad5885L,0x3d0832241c0aed14L,
35263         0xf10a7d3e7a942d46L } },
35264     /* 39 << 217 */
35265     { { 0x7c11deee40d5c9beL,0xb2bae7ffba84ed98L,0x93e97139aad58dddL,
35266         0x3d8727963f6d1fa3L },
35267       { 0x483aca818569ff13L,0x8b89a5fb9a600f72L,0x4cbc27c3c06f2b86L,
35268         0x2213071363ad9c0bL } },
35269     /* 40 << 217 */
35270     { { 0xb5358b1e48ac2840L,0x18311294ecba9477L,0xda58f990a6946b43L,
35271         0x3098baf99ab41819L },
35272       { 0x66c4c1584198da52L,0xab4fc17c146bfd1bL,0x2f0a4c3cbf36a908L,
35273         0x2ae9e34b58cf7838L } },
35274     /* 41 << 217 */
35275     { { 0xf411529e3fa11b1fL,0x21e43677974af2b4L,0x7c20958ec230793bL,
35276         0x710ea88516e840f3L },
35277       { 0xfc0b21fcc5dc67cfL,0x08d5164788405718L,0xd955c21fcfe49eb7L,
35278         0x9722a5d556dd4a1fL } },
35279     /* 42 << 217 */
35280     { { 0xc9ef50e2c861baa5L,0xc0c21a5d9505ac3eL,0xaf6b9a338b7c063fL,
35281         0xc63703392f4779c1L },
35282       { 0x22df99c7638167c3L,0xfe6ffe76795db30cL,0x2b822d33a4854989L,
35283         0xfef031dd30563aa5L } },
35284     /* 43 << 217 */
35285     { { 0x16b09f82d57c667fL,0xc70312cecc0b76f1L,0xbf04a9e6c9118aecL,
35286         0x82fcb4193409d133L },
35287       { 0x1a8ab385ab45d44dL,0xfba07222617b83a3L,0xb05f50dd58e81b52L,
35288         0x1d8db55321ce5affL } },
35289     /* 44 << 217 */
35290     { { 0x3097b8d4e344a873L,0x7d8d116dfe36d53eL,0x6db22f587875e750L,
35291         0x2dc5e37343e144eaL },
35292       { 0xc05f32e6e799eb95L,0xe9e5f4df6899e6ecL,0xbdc3bd681fab23d5L,
35293         0xb72b8ab773af60e6L } },
35294     /* 45 << 217 */
35295     { { 0x8db27ae02cecc84aL,0x600016d87bdb871cL,0x42a44b13d7c46f58L,
35296         0xb8919727c3a77d39L },
35297       { 0xcfc6bbbddafd6088L,0x1a7401466bd20d39L,0x8c747abd98c41072L,
35298         0x4c91e765bdf68ea1L } },
35299     /* 46 << 217 */
35300     { { 0x7c95e5ca08819a78L,0xcf48b729c9587921L,0x091c7c5fdebbcc7dL,
35301         0x6f287404f0e05149L },
35302       { 0xf83b5ac226cd44ecL,0x88ae32a6cfea250eL,0x6ac5047a1d06ebc5L,
35303         0xc7e550b4d434f781L } },
35304     /* 47 << 217 */
35305     { { 0x61ab1cf25c727bd2L,0x2e4badb11cf915b0L,0x1b4dadecf69d3920L,
35306         0xe61b1ca6f14c1dfeL },
35307       { 0x90b479ccbd6bd51fL,0x8024e4018045ec30L,0xcab29ca325ef0e62L,
35308         0x4f2e941649e4ebc0L } },
35309     /* 48 << 217 */
35310     { { 0x45eb40ec0ccced58L,0x25cd4b9c0da44f98L,0x43e06458871812c6L,
35311         0x99f80d5516cef651L },
35312       { 0x571340c9ce6dc153L,0x138d5117d8665521L,0xacdb45bc4e07014dL,
35313         0x2f34bb3884b60b91L } },
35314     /* 49 << 217 */
35315     { { 0xf44a4fd22ae8921eL,0xb039288e892ba1e2L,0x9da50174b1c180b2L,
35316         0x6b70ab661693dc87L },
35317       { 0x7e9babc9e7057481L,0x4581ddef9c80dc41L,0x0c890da951294682L,
35318         0x0b5629d33f4736e5L } },
35319     /* 50 << 217 */
35320     { { 0x2340c79eb06f5b41L,0xa42e84ce4e243469L,0xf9a20135045a71a9L,
35321         0xefbfb415d27b6fb6L },
35322       { 0x25ebea239d33cd6fL,0x9caedb88aa6c0af8L,0x53dc7e9ad9ce6f96L,
35323         0x3897f9fd51e0b15aL } },
35324     /* 51 << 217 */
35325     { { 0xf51cb1f88e5d788eL,0x1aec7ba8e1d490eeL,0x265991e0cc58cb3cL,
35326         0x9f306e8c9fc3ad31L },
35327       { 0x5fed006e5040a0acL,0xca9d5043fb476f2eL,0xa19c06e8beea7a23L,
35328         0xd28658010edabb63L } },
35329     /* 52 << 217 */
35330     { { 0xdb92293f6967469aL,0x2894d8398d8a8ed8L,0x87c9e406bbc77122L,
35331         0x8671c6f12ea3a26aL },
35332       { 0xe42df8d6d7de9853L,0x2e3ce346b1f2bcc7L,0xda601dfc899d50cfL,
35333         0xbfc913defb1b598fL } },
35334     /* 53 << 217 */
35335     { { 0x81c4909fe61f7908L,0x192e304f9bbc7b29L,0xc3ed8738c104b338L,
35336         0xedbe9e47783f5d61L },
35337       { 0x0c06e9be2db30660L,0xda3e613fc0eb7d8eL,0xd8fa3e97322e096eL,
35338         0xfebd91e8d336e247L } },
35339     /* 54 << 217 */
35340     { { 0x8f13ccc4df655a49L,0xa9e00dfc5eb20210L,0x84631d0fc656b6eaL,
35341         0x93a058cdd8c0d947L },
35342       { 0x6846904a67bd3448L,0x4a3d4e1af394fd5cL,0xc102c1a5db225f52L,
35343         0xe3455bbafc4f5e9aL } },
35344     /* 55 << 217 */
35345     { { 0x6b36985b4b9ad1ceL,0xa98185365bb7f793L,0x6c25e1d048b1a416L,
35346         0x1381dd533c81bee7L },
35347       { 0xd2a30d617a4a7620L,0xc841292639b8944cL,0x3c1c6fbe7a97c33aL,
35348         0x941e541d938664e7L } },
35349     /* 56 << 217 */
35350     { { 0x417499e84a34f239L,0x15fdb83cb90402d5L,0xb75f46bf433aa832L,
35351         0xb61e15af63215db1L },
35352       { 0xaabe59d4a127f89aL,0x5d541e0c07e816daL,0xaaba0659a618b692L,
35353         0x5532773317266026L } },
35354     /* 57 << 217 */
35355     { { 0xaf53a0fc95f57552L,0x329476506cacb0c9L,0x253ff58dc821be01L,
35356         0xb0309531a06f1146L },
35357       { 0x59bbbdf505c2e54dL,0x158f27ad26e8dd22L,0xcc5b7ffb397e1e53L,
35358         0xae03f65b7fc1e50dL } },
35359     /* 58 << 217 */
35360     { { 0xa9784ebd9c95f0f9L,0x5ed9deb224640771L,0x31244af7035561c4L,
35361         0x87332f3a7ee857deL },
35362       { 0x09e16e9e2b9e0d88L,0x52d910f456a06049L,0x507ed477a9592f48L,
35363         0x85cb917b2365d678L } },
35364     /* 59 << 217 */
35365     { { 0xf8511c934c8998d1L,0x2186a3f1730ea58fL,0x50189626b2029db0L,
35366         0x9137a6d902ceb75aL },
35367       { 0x2fe17f37748bc82cL,0x87c2e93180469f8cL,0x850f71cdbf891aa2L,
35368         0x0ca1b89b75ec3d8dL } },
35369     /* 60 << 217 */
35370     { { 0x516c43aa5e1cd3cdL,0x893978089a887c28L,0x0059c699ddea1f9fL,
35371         0x7737d6fa8e6868f7L },
35372       { 0x6d93746a60f1524bL,0x36985e55ba052aa7L,0x41b1d322ed923ea5L,
35373         0x3429759f25852a11L } },
35374     /* 61 << 217 */
35375     { { 0xbeca6ec3092e9f41L,0x3a238c6662256bbdL,0xd82958ea70ad487dL,
35376         0x4ac8aaf965610d93L },
35377       { 0x3fa101b15e4ccab0L,0x9bf430f29de14bfbL,0xa10f5cc66531899dL,
35378         0x590005fbea8ce17dL } },
35379     /* 62 << 217 */
35380     { { 0xc437912f24544cb6L,0x9987b71ad79ac2e3L,0x13e3d9ddc058a212L,
35381         0x00075aacd2de9606L },
35382       { 0x80ab508b6cac8369L,0x87842be7f54f6c89L,0xa7ad663d6bc532a4L,
35383         0x67813de778a91bc8L } },
35384     /* 63 << 217 */
35385     { { 0x5dcb61cec3427239L,0x5f3c7cf0c56934d9L,0xc079e0fbe3191591L,
35386         0xe40896bdb01aada7L },
35387       { 0x8d4667910492d25fL,0x8aeb30c9e7408276L,0xe94374959287aaccL,
35388         0x23d4708d79fe03d4L } },
35389     /* 64 << 217 */
35390     { { 0x8cda9cf2d0c05199L,0x502fbc22fae78454L,0xc0bda9dff572a182L,
35391         0x5f9b71b86158b372L },
35392       { 0xe0f33a592b82dd07L,0x763027359523032eL,0x7fe1a721c4505a32L,
35393         0x7b6e3e82f796409fL } },
35394     /* 0 << 224 */
35395     { { 0x00, 0x00, 0x00, 0x00 },
35396       { 0x00, 0x00, 0x00, 0x00 } },
35397     /* 1 << 224 */
35398     { { 0xe3417bc035d0b34aL,0x440b386b8327c0a7L,0x8fb7262dac0362d1L,
35399         0x2c41114ce0cdf943L },
35400       { 0x2ba5cef1ad95a0b1L,0xc09b37a867d54362L,0x26d6cdd201e486c9L,
35401         0x20477abf42ff9297L } },
35402     /* 2 << 224 */
35403     { { 0xa004dcb3292a9287L,0xddc15cf677b092c7L,0x083a8464806c0605L,
35404         0x4a68df703db997b0L },
35405       { 0x9c134e4505bf7dd0L,0xa4e63d398ccf7f8cL,0xa6e6517f41b5f8afL,
35406         0xaa8b9342ad7bc1ccL } },
35407     /* 3 << 224 */
35408     { { 0x126f35b51e706ad9L,0xb99cebb4c3a9ebdfL,0xa75389afbf608d90L,
35409         0x76113c4fc6c89858L },
35410       { 0x80de8eb097e2b5aaL,0x7e1022cc63b91304L,0x3bdab6056ccc066cL,
35411         0x33cbb144b2edf900L } },
35412     /* 4 << 224 */
35413     { { 0xc41764717af715d2L,0xe2f7f594d0134a96L,0x2c1873efa41ec956L,
35414         0xe4e7b4f677821304L },
35415       { 0xe5c8ff9788d5374aL,0x2b915e6380823d5bL,0xea6bc755b2ee8fe2L,
35416         0x6657624ce7112651L } },
35417     /* 5 << 224 */
35418     { { 0x157af101dace5acaL,0xc4fdbcf211a6a267L,0xdaddf340c49c8609L,
35419         0x97e49f52e9604a65L },
35420       { 0x9be8e790937e2ad5L,0x846e2508326e17f1L,0x3f38007a0bbbc0dcL,
35421         0xcf03603fb11e16d6L } },
35422     /* 6 << 224 */
35423     { { 0xd6f800e07442f1d5L,0x475607d166e0e3abL,0x82807f16b7c64047L,
35424         0x8858e1e3a749883dL },
35425       { 0x5859120b8231ee10L,0x1b80e7eb638a1eceL,0xcb72525ac6aa73a4L,
35426         0xa7cdea3d844423acL } },
35427     /* 7 << 224 */
35428     { { 0x5ed0c007f8ae7c38L,0x6db07a5c3d740192L,0xbe5e9c2a5fe36db3L,
35429         0xd5b9d57a76e95046L },
35430       { 0x54ac32e78eba20f2L,0xef11ca8f71b9a352L,0x305e373eff98a658L,
35431         0xffe5a100823eb667L } },
35432     /* 8 << 224 */
35433     { { 0x57477b11e51732d2L,0xdfd6eb282538fc0eL,0x5c43b0cc3b39eec5L,
35434         0x6af12778cb36cc57L },
35435       { 0x70b0852d06c425aeL,0x6df92f8c5c221b9bL,0x6c8d4f9ece826d9cL,
35436         0xf59aba7bb49359c3L } },
35437     /* 9 << 224 */
35438     { { 0x5c8ed8d5da64309dL,0x61a6de5691b30704L,0xd6b52f6a2f9b5808L,
35439         0x0eee419498c958a7L },
35440       { 0xcddd9aab771e4caaL,0x83965dfd78bc21beL,0x02affce3b3b504f5L,
35441         0x30847a21561c8291L } },
35442     /* 10 << 224 */
35443     { { 0xd2eb2cf152bfda05L,0xe0e4c4e96197b98cL,0x1d35076cf8a1726fL,
35444         0x6c06085b2db11e3dL },
35445       { 0x15c0c4d74463ba14L,0x9d292f830030238cL,0x1311ee8b3727536dL,
35446         0xfeea86efbeaedc1eL } },
35447     /* 11 << 224 */
35448     { { 0xb9d18cd366131e2eL,0xf31d974f80fe2682L,0xb6e49e0fe4160289L,
35449         0x7c48ec0b08e92799L },
35450       { 0x818111d8d1989aa7L,0xb34fa0aaebf926f9L,0xdb5fe2f5a245474aL,
35451         0xf80a6ebb3c7ca756L } },
35452     /* 12 << 224 */
35453     { { 0xa7f96054afa05dd8L,0x26dfcf21fcaf119eL,0xe20ef2e30564bb59L,
35454         0xef4dca5061cb02b8L },
35455       { 0xcda7838a65d30672L,0x8b08d534fd657e86L,0x4c5b439546d595c8L,
35456         0x39b58725425cb836L } },
35457     /* 13 << 224 */
35458     { { 0x8ea610593de9abe3L,0x404348819cdc03beL,0x9b261245cfedce8cL,
35459         0x78c318b4cf5234a1L },
35460       { 0x510bcf16fde24c99L,0x2a77cb75a2c2ff5dL,0x9c895c2b27960fb4L,
35461         0xd30ce975b0eda42bL } },
35462     /* 14 << 224 */
35463     { { 0xfda853931a62cc26L,0x23c69b9650c0e052L,0xa227df15bfc633f3L,
35464         0x2ac788481bae7d48L },
35465       { 0x487878f9187d073dL,0x6c2be919967f807dL,0x765861d8336e6d8fL,
35466         0x88b8974cce528a43L } },
35467     /* 15 << 224 */
35468     { { 0x09521177ff57d051L,0x2ff38037fb6a1961L,0xfc0aba74a3d76ad4L,
35469         0x7c76480325a7ec17L },
35470       { 0x7532d75f48879bc8L,0xea7eacc058ce6bc1L,0xc82176b48e896c16L,
35471         0x9a30e0b22c750fedL } },
35472     /* 16 << 224 */
35473     { { 0xc37e2c2e421d3aa4L,0xf926407ce84fa840L,0x18abc03d1454e41cL,
35474         0x26605ecd3f7af644L },
35475       { 0x242341a6d6a5eabfL,0x1edb84f4216b668eL,0xd836edb804010102L,
35476         0x5b337ce7945e1d8cL } },
35477     /* 17 << 224 */
35478     { { 0xd2075c77c055dc14L,0x2a0ffa2581d89cdfL,0x8ce815ea6ffdcbafL,
35479         0xa3428878fb648867L },
35480       { 0x277699cf884655fbL,0xfa5b5bd6364d3e41L,0x01f680c6441e1cb7L,
35481         0x3fd61e66b70a7d67L } },
35482     /* 18 << 224 */
35483     { { 0x666ba2dccc78cf66L,0xb30181746fdbff77L,0x8d4dd0db168d4668L,
35484         0x259455d01dab3a2aL },
35485       { 0xf58564c5cde3acecL,0x7714192513adb276L,0x527d725d8a303f65L,
35486         0x55deb6c9e6f38f7bL } },
35487     /* 19 << 224 */
35488     { { 0xfd5bb657b1fa70fbL,0xfa07f50fd8073a00L,0xf72e3aa7bca02500L,
35489         0xf68f895d9975740dL },
35490       { 0x301120605cae2a6aL,0x01bd721802874842L,0x3d4238917ce47bd3L,
35491         0xa66663c1789544f6L } },
35492     /* 20 << 224 */
35493     { { 0x864d05d73272d838L,0xe22924f9fa6295c5L,0x8189593f6c2fda32L,
35494         0x330d7189b184b544L },
35495       { 0x79efa62cbde1f714L,0x35771c94e5cb1a63L,0x2f4826b8641c8332L,
35496         0x00a894fbc8cee854L } },
35497     /* 21 << 224 */
35498     { { 0xb4b9a39b36194d40L,0xe857a7c577612601L,0xf4209dd24ecf2f58L,
35499         0x82b9e66d5a033487L },
35500       { 0xc1e36934e4e8b9ddL,0xd2372c9da42377d7L,0x51dc94c70e3ae43bL,
35501         0x4c57761e04474f6fL } },
35502     /* 22 << 224 */
35503     { { 0xdcdacd0a1058a318L,0x369cf3f578053a9aL,0xc6c3de5031c68de2L,
35504         0x4653a5763c4b6d9fL },
35505       { 0x1688dd5aaa4e5c97L,0x5be80aa1b7ab3c74L,0x70cefe7cbc65c283L,
35506         0x57f95f1306867091L } },
35507     /* 23 << 224 */
35508     { { 0xa39114e24415503bL,0xc08ff7c64cbb17e9L,0x1eff674dd7dec966L,
35509         0x6d4690af53376f63L },
35510       { 0xff6fe32eea74237bL,0xc436d17ecd57508eL,0x15aa28e1edcc40feL,
35511         0x0d769c04581bbb44L } },
35512     /* 24 << 224 */
35513     { { 0xc240b6de34eaacdaL,0xd9e116e82ba0f1deL,0xcbe45ec779438e55L,
35514         0x91787c9d96f752d7L },
35515       { 0x897f532bf129ac2fL,0xd307b7c85a36e22cL,0x91940675749fb8f3L,
35516         0xd14f95d0157fdb28L } },
35517     /* 25 << 224 */
35518     { { 0xfe51d0296ae55043L,0x8931e98f44a87de1L,0xe57f1cc609e4fee2L,
35519         0x0d063b674e072d92L },
35520       { 0x70a998b9ed0e4316L,0xe74a736b306aca46L,0xecf0fbf24fda97c7L,
35521         0xa40f65cb3e178d93L } },
35522     /* 26 << 224 */
35523     { { 0x1625360416df4285L,0xb0c9babbd0c56ae2L,0x73032b19cfc5cfc3L,
35524         0xe497e5c309752056L },
35525       { 0x12096bb4164bda96L,0x1ee42419a0b74da1L,0x8fc36243403826baL,
35526         0x0c8f0069dc09e660L } },
35527     /* 27 << 224 */
35528     { { 0x8667e981c27253c9L,0x05a6aefb92b36a45L,0xa62c4b369cb7bb46L,
35529         0x8394f37511f7027bL },
35530       { 0x747bc79c5f109d0fL,0xcad88a765b8cc60aL,0x80c5a66b58f09e68L,
35531         0xe753d451f6127eacL } },
35532     /* 28 << 224 */
35533     { { 0xc44b74a15b0ec6f5L,0x47989fe45289b2b8L,0x745f848458d6fc73L,
35534         0xec362a6ff61c70abL },
35535       { 0x070c98a7b3a8ad41L,0x73a20fc07b63db51L,0xed2c2173f44c35f4L,
35536         0x8a56149d9acc9dcaL } },
35537     /* 29 << 224 */
35538     { { 0x98f178819ac6e0f4L,0x360fdeafa413b5edL,0x0625b8f4a300b0fdL,
35539         0xf1f4d76a5b3222d3L },
35540       { 0x9d6f5109587f76b8L,0x8b4ee08d2317fdb5L,0x88089bb78c68b095L,
35541         0x95570e9a5808d9b9L } },
35542     /* 30 << 224 */
35543     { { 0xa395c36f35d33ae7L,0x200ea12350bb5a94L,0x20c789bd0bafe84bL,
35544         0x243ef52d0919276aL },
35545       { 0x3934c577e23ae233L,0xb93807afa460d1ecL,0xb72a53b1f8fa76a4L,
35546         0xd8914cb0c3ca4491L } },
35547     /* 31 << 224 */
35548     { { 0x2e1284943fb42622L,0x3b2700ac500907d5L,0xf370fb091a95ec63L,
35549         0xf8f30be231b6dfbdL },
35550       { 0xf2b2f8d269e55f15L,0x1fead851cc1323e9L,0xfa366010d9e5eef6L,
35551         0x64d487b0e316107eL } },
35552     /* 32 << 224 */
35553     { { 0x4c076b86d23ddc82L,0x03fd344c7e0143f0L,0xa95362ff317af2c5L,
35554         0x0add3db7e18b7a4fL },
35555       { 0x9c673e3f8260e01bL,0xfbeb49e554a1cc91L,0x91351bf292f2e433L,
35556         0xc755e7ec851141ebL } },
35557     /* 33 << 224 */
35558     { { 0xc9a9513929607745L,0x0ca07420a26f2b28L,0xcb2790e74bc6f9ddL,
35559         0x345bbb58adcaffc0L },
35560       { 0xc65ea38cbe0f27a2L,0x67c24d7c641fcb56L,0x2c25f0a7a9e2c757L,
35561         0x93f5cdb016f16c49L } },
35562     /* 34 << 224 */
35563     { { 0x2ca5a9d7c5ee30a1L,0xd1593635b909b729L,0x804ce9f3dadeff48L,
35564         0xec464751b07c30c3L },
35565       { 0x89d65ff39e49af6aL,0xf2d6238a6f3d01bcL,0x1095561e0bced843L,
35566         0x51789e12c8a13fd8L } },
35567     /* 35 << 224 */
35568     { { 0xd633f929763231dfL,0x46df9f7de7cbddefL,0x01c889c0cb265da8L,
35569         0xfce1ad10af4336d2L },
35570       { 0x8d110df6fc6a0a7eL,0xdd431b986da425dcL,0xcdc4aeab1834aabeL,
35571         0x84deb1248439b7fcL } },
35572     /* 36 << 224 */
35573     { { 0x8796f1693c2a5998L,0x9b9247b47947190dL,0x55b9d9a511597014L,
35574         0x7e9dd70d7b1566eeL },
35575       { 0x94ad78f7cbcd5e64L,0x0359ac179bd4c032L,0x3b11baaf7cc222aeL,
35576         0xa6a6e284ba78e812L } },
35577     /* 37 << 224 */
35578     { { 0x8392053f24cea1a0L,0xc97bce4a33621491L,0x7eb1db3435399ee9L,
35579         0x473f78efece81ad1L },
35580       { 0x41d72fe0f63d3d0dL,0xe620b880afab62fcL,0x92096bc993158383L,
35581         0x41a213578f896f6cL } },
35582     /* 38 << 224 */
35583     { { 0x1b5ee2fac7dcfcabL,0x650acfde9546e007L,0xc081b749b1b02e07L,
35584         0xda9e41a0f9eca03dL },
35585       { 0x013ba727175a54abL,0xca0cd190ea5d8d10L,0x85ea52c095fd96a9L,
35586         0x2c591b9fbc5c3940L } },
35587     /* 39 << 224 */
35588     { { 0x6fb4d4e42bad4d5fL,0xfa4c3590fef0059bL,0x6a10218af5122294L,
35589         0x9a78a81aa85751d1L },
35590       { 0x04f20579a98e84e7L,0xfe1242c04997e5b5L,0xe77a273bca21e1e4L,
35591         0xfcc8b1ef9411939dL } },
35592     /* 40 << 224 */
35593     { { 0xe20ea30292d0487aL,0x1442dbec294b91feL,0x1f7a4afebb6b0e8fL,
35594         0x1700ef746889c318L },
35595       { 0xf5bbffc370f1fc62L,0x3b31d4b669c79ccaL,0xe8bc2aaba7f6340dL,
35596         0xb0b08ab4a725e10aL } },
35597     /* 41 << 224 */
35598     { { 0x44f05701ae340050L,0xba4b30161cf0c569L,0x5aa29f83fbe19a51L,
35599         0x1b9ed428b71d752eL },
35600       { 0x1666e54eeb4819f5L,0x616cdfed9e18b75bL,0x112ed5be3ee27b0bL,
35601         0xfbf2831944c7de4dL } },
35602     /* 42 << 224 */
35603     { { 0xd685ec85e0e60d84L,0x68037e301db7ee78L,0x5b65bdcd003c4d6eL,
35604         0x33e7363a93e29a6aL },
35605       { 0x995b3a6108d0756cL,0xd727f85c2faf134bL,0xfac6edf71d337823L,
35606         0x99b9aa500439b8b4L } },
35607     /* 43 << 224 */
35608     { { 0x722eb104e2b4e075L,0x49987295437c4926L,0xb1e4c0e446a9b82dL,
35609         0xd0cb319757a006f5L },
35610       { 0xf3de0f7dd7808c56L,0xb5c54d8f51f89772L,0x500a114aadbd31aaL,
35611         0x9afaaaa6295f6cabL } },
35612     /* 44 << 224 */
35613     { { 0x94705e2104cf667aL,0xfc2a811b9d3935d7L,0x560b02806d09267cL,
35614         0xf19ed119f780e53bL },
35615       { 0xf0227c09067b6269L,0x967b85335caef599L,0x155b924368efeebcL,
35616         0xcd6d34f5c497bae6L } },
35617     /* 45 << 224 */
35618     { { 0x1dd8d5d36cceb370L,0x2aeac579a78d7bf9L,0x5d65017d70b67a62L,
35619         0x70c8e44f17c53f67L },
35620       { 0xd1fc095086a34d09L,0xe0fca256e7134907L,0xe24fa29c80fdd315L,
35621         0x2c4acd03d87499adL } },
35622     /* 46 << 224 */
35623     { { 0xbaaf75173b5a9ba6L,0xb9cbe1f612e51a51L,0xd88edae35e154897L,
35624         0xe4309c3c77b66ca0L },
35625       { 0xf5555805f67f3746L,0x85fc37baa36401ffL,0xdf86e2cad9499a53L,
35626         0x6270b2a3ecbc955bL } },
35627     /* 47 << 224 */
35628     { { 0xafae64f5974ad33bL,0x04d85977fe7b2df1L,0x2a3db3ff4ab03f73L,
35629         0x0b87878a8702740aL },
35630       { 0x6d263f015a061732L,0xc25430cea32a1901L,0xf7ebab3ddb155018L,
35631         0x3a86f69363a9b78eL } },
35632     /* 48 << 224 */
35633     { { 0x349ae368da9f3804L,0x470f07fea164349cL,0xd52f4cc98562baa5L,
35634         0xc74a9e862b290df3L },
35635       { 0xd3a1aa3543471a24L,0x239446beb8194511L,0xbec2dd0081dcd44dL,
35636         0xca3d7f0fc42ac82dL } },
35637     /* 49 << 224 */
35638     { { 0x1f3db085fdaf4520L,0xbb6d3e804549daf2L,0xf5969d8a19ad5c42L,
35639         0x7052b13ddbfd1511L },
35640       { 0x11890d1b682b9060L,0xa71d3883ac34452cL,0xa438055b783805b4L,
35641         0x432412774725b23eL } },
35642     /* 50 << 224 */
35643     { { 0xf20cf96e4901bbedL,0x6419c710f432a2bbL,0x57a0fbb9dfa9cd7dL,
35644         0x589111e400daa249L },
35645       { 0x19809a337b60554eL,0xea5f8887ede283a4L,0x2d713802503bfd35L,
35646         0x151bb0af585d2a53L } },
35647     /* 51 << 224 */
35648     { { 0x40b08f7443b30ca8L,0xe10b5bbad9934583L,0xe8a546d6b51110adL,
35649         0x1dd50e6628e0b6c5L },
35650       { 0x292e9d54cff2b821L,0x3882555d47281760L,0x134838f83724d6e3L,
35651         0xf2c679e022ddcda1L } },
35652     /* 52 << 224 */
35653     { { 0x40ee88156d2a5768L,0x7f227bd21c1e7e2dL,0x487ba134d04ff443L,
35654         0x76e2ff3dc614e54bL },
35655       { 0x36b88d6fa3177ec7L,0xbf731d512328fff5L,0x758caea249ba158eL,
35656         0x5ab8ff4c02938188L } },
35657     /* 53 << 224 */
35658     { { 0x33e1605635edc56dL,0x5a69d3497e940d79L,0x6c4fd00103866dcbL,
35659         0x20a38f574893cdefL },
35660       { 0xfbf3e790fac3a15bL,0x6ed7ea2e7a4f8e6bL,0xa663eb4fbc3aca86L,
35661         0x22061ea5080d53f7L } },
35662     /* 54 << 224 */
35663     { { 0x2480dfe6f546783fL,0xd38bc6da5a0a641eL,0xfb093cd12ede8965L,
35664         0x89654db4acb455cfL },
35665       { 0x413cbf9a26e1adeeL,0x291f3764373294d4L,0x00797257648083feL,
35666         0x25f504d3208cc341L } },
35667     /* 55 << 224 */
35668     { { 0x635a8e5ec3a0ee43L,0x70aaebca679898ffL,0x9ee9f5475dc63d56L,
35669         0xce987966ffb34d00L },
35670       { 0xf9f86b195e26310aL,0x9e435484382a8ca8L,0x253bcb81c2352fe4L,
35671         0xa4eac8b04474b571L } },
35672     /* 56 << 224 */
35673     { { 0xc1b97512c1ad8cf8L,0x193b4e9e99e0b697L,0x939d271601e85df0L,
35674         0x4fb265b3cd44eafdL },
35675       { 0x321e7dcde51e1ae2L,0x8e3a8ca6e3d8b096L,0x8de46cb052604998L,
35676         0x91099ad839072aa7L } },
35677     /* 57 << 224 */
35678     { { 0x2617f91c93aa96b8L,0x0fc8716b7fca2e13L,0xa7106f5e95328723L,
35679         0xd1c9c40b262e6522L },
35680       { 0xb9bafe8642b7c094L,0x1873439d1543c021L,0xe1baa5de5cbefd5dL,
35681         0xa363fc5e521e8affL } },
35682     /* 58 << 224 */
35683     { { 0xefe6320df862eaacL,0x14419c6322c647dcL,0x0e06707c4e46d428L,
35684         0xcb6c834f4a178f8fL },
35685       { 0x0f993a45d30f917cL,0xd4c4b0499879afeeL,0xb6142a1e70500063L,
35686         0x7c9b41c3a5d9d605L } },
35687     /* 59 << 224 */
35688     { { 0xbc00fc2f2f8ba2c7L,0x0966eb2f7c67aa28L,0x13f7b5165a786972L,
35689         0x3bfb75578a2fbba0L },
35690       { 0x131c4f235a2b9620L,0xbff3ed276faf46beL,0x9b4473d17e172323L,
35691         0x421e8878339f6246L } },
35692     /* 60 << 224 */
35693     { { 0x0fa8587a25a41632L,0xc0814124a35b6c93L,0x2b18a9f559ebb8dbL,
35694         0x264e335776edb29cL },
35695       { 0xaf245ccdc87c51e2L,0x16b3015b501e6214L,0xbb31c5600a3882ceL,
35696         0x6961bb94fec11e04L } },
35697     /* 61 << 224 */
35698     { { 0x3b825b8deff7a3a0L,0xbec33738b1df7326L,0x68ad747c99604a1fL,
35699         0xd154c9349a3bd499L },
35700       { 0xac33506f1cc7a906L,0x73bb53926c560e8fL,0x6428fcbe263e3944L,
35701         0xc11828d51c387434L } },
35702     /* 62 << 224 */
35703     { { 0x3cd04be13e4b12ffL,0xc3aad9f92d88667cL,0xc52ddcf8248120cfL,
35704         0x985a892e2a389532L },
35705       { 0xfbb4b21b3bb85fa0L,0xf95375e08dfc6269L,0xfb4fb06c7ee2aceaL,
35706         0x6785426e309c4d1fL } },
35707     /* 63 << 224 */
35708     { { 0x659b17c8d8ceb147L,0x9b649eeeb70a5554L,0x6b7fa0b5ac6bc634L,
35709         0xd99fe2c71d6e732fL },
35710       { 0x30e6e7628d3abba2L,0x18fee6e7a797b799L,0x5c9d360dc696464dL,
35711         0xe3baeb4827bfde12L } },
35712     /* 64 << 224 */
35713     { { 0x2bf5db47f23206d5L,0x2f6d34201d260152L,0x17b876533f8ff89aL,
35714         0x5157c30c378fa458L },
35715       { 0x7517c5c52d4fb936L,0xef22f7ace6518cdcL,0xdeb483e6bf847a64L,
35716         0xf508455892e0fa89L } },
35717     /* 0 << 231 */
35718     { { 0x00, 0x00, 0x00, 0x00 },
35719       { 0x00, 0x00, 0x00, 0x00 } },
35720     /* 1 << 231 */
35721     { { 0xab9659d8df7304d4L,0xb71bcf1bff210e8eL,0xa9a2438bd73fbd60L,
35722         0x4595cd1f5d11b4deL },
35723       { 0x9c0d329a4835859dL,0x4a0f0d2d7dbb6e56L,0xc6038e5edf928a4eL,
35724         0xc94296218f5ad154L } },
35725     /* 2 << 231 */
35726     { { 0x91213462f23f2d92L,0x6cab71bd60b94078L,0x6bdd0a63176cde20L,
35727         0x54c9b20cee4d54bcL },
35728       { 0x3cd2d8aa9f2ac02fL,0x03f8e617206eedb0L,0xc7f68e1693086434L,
35729         0x831469c592dd3db9L } },
35730     /* 3 << 231 */
35731     { { 0x8521df248f981354L,0x587e23ec3588a259L,0xcbedf281d7a0992cL,
35732         0x06930a5538961407L },
35733       { 0x09320debbe5bbe21L,0xa7ffa5b52491817fL,0xe6c8b4d909065160L,
35734         0xac4f3992fff6d2a9L } },
35735     /* 4 << 231 */
35736     { { 0x7aa7a1583ae9c1bdL,0xe0af6d98e37ce240L,0xe54342d928ab38b4L,
35737         0xe8b750070a1c98caL },
35738       { 0xefce86afe02358f2L,0x31b8b856ea921228L,0x052a19120a1c67fcL,
35739         0xb4069ea4e3aead59L } },
35740     /* 5 << 231 */
35741     { { 0x3232d6e27fa03cb3L,0xdb938e5b0fdd7d88L,0x04c1d2cd2ccbfc5dL,
35742         0xd2f45c12af3a580fL },
35743       { 0x592620b57883e614L,0x5fd27e68be7c5f26L,0x139e45a91567e1e3L,
35744         0x2cc71d2d44d8aaafL } },
35745     /* 6 << 231 */
35746     { { 0x4a9090cde36d0757L,0xf722d7b1d9a29382L,0xfb7fb04c04b48ddfL,
35747         0x628ad2a7ebe16f43L },
35748       { 0xcd3fbfb520226040L,0x6c34ecb15104b6c4L,0x30c0754ec903c188L,
35749         0xec336b082d23cab0L } },
35750     /* 7 << 231 */
35751     { { 0x473d62a21e206ee5L,0xf1e274808c49a633L,0x87ab956ce9f6b2c3L,
35752         0x61830b4862b606eaL },
35753       { 0x67cd6846e78e815fL,0xfe40139f4c02082aL,0x52bbbfcb952ec365L,
35754         0x74c116426b9836abL } },
35755     /* 8 << 231 */
35756     { { 0x9f51439e558df019L,0x230da4baac712b27L,0x518919e355185a24L,
35757         0x4dcefcdd84b78f50L },
35758       { 0xa7d90fb2a47d4c5aL,0x55ac9abfb30e009eL,0xfd2fc35974eed273L,
35759         0xb72d824cdbea8fafL } },
35760     /* 9 << 231 */
35761     { { 0xce721a744513e2caL,0x0b41861238240b2cL,0x05199968d5baa450L,
35762         0xeb1757ed2b0e8c25L },
35763       { 0x6ebc3e283dfac6d5L,0xb2431e2e48a237f5L,0x2acb5e2352f61499L,
35764         0x5558a2a7e06c936bL } },
35765     /* 10 << 231 */
35766     { { 0xd213f923cbb13d1bL,0x98799f425bfb9bfeL,0x1ae8ddc9701144a9L,
35767         0x0b8b3bb64c5595eeL },
35768       { 0x0ea9ef2e3ecebb21L,0x17cb6c4b3671f9a7L,0x47ef464f726f1d1fL,
35769         0x171b94846943a276L } },
35770     /* 11 << 231 */
35771     { { 0x51a4ae2d7ef0329cL,0x0850922291c4402aL,0x64a61d35afd45bbcL,
35772         0x38f096fe3035a851L },
35773       { 0xc7468b74a1dec027L,0xe8cf10e74fc7dcbaL,0xea35ff40f4a06353L,
35774         0x0b4c0dfa8b77dd66L } },
35775     /* 12 << 231 */
35776     { { 0x779b8552de7e5c19L,0xfab28609c1c0256cL,0x64f58eeeabd4743dL,
35777         0x4e8ef8387b6cc93bL },
35778       { 0xee650d264cb1bf3dL,0x4c1f9d0973dedf61L,0xaef7c9d7bfb70cedL,
35779         0x1ec0507e1641de1eL } },
35780     /* 13 << 231 */
35781     { { 0xcd7e5cc7cde45079L,0xde173c9a516ac9e4L,0x517a8494c170315cL,
35782         0x438fd90591d8e8fbL },
35783       { 0x5145c506c7d9630bL,0x6457a87bf47d4d75L,0xd31646bf0d9a80e8L,
35784         0x453add2bcef3aabeL } },
35785     /* 14 << 231 */
35786     { { 0xc9941109a607419dL,0xfaa71e62bb6bca80L,0x34158c1307c431f3L,
35787         0x594abebc992bc47aL },
35788       { 0x6dfea691eb78399fL,0x48aafb353f42cba4L,0xedcd65af077c04f0L,
35789         0x1a29a366e884491aL } },
35790     /* 15 << 231 */
35791     { { 0x023a40e51c21f2bfL,0xf99a513ca5057aeeL,0xa3fe7e25bcab072eL,
35792         0x8568d2e140e32bcfL },
35793       { 0x904594ebd3f69d9fL,0x181a973307affab1L,0xe4d68d76b6e330f4L,
35794         0x87a6dafbc75a7fc1L } },
35795     /* 16 << 231 */
35796     { { 0x549db2b5ef7d9289L,0x2480d4a8197f015aL,0x61d5590bc40493b6L,
35797         0x3a55b52e6f780331L },
35798       { 0x40eb8115309eadb0L,0xdea7de5a92e5c625L,0x64d631f0cc6a3d5aL,
35799         0x9d5e9d7c93e8dd61L } },
35800     /* 17 << 231 */
35801     { { 0xf297bef5206d3ffcL,0x23d5e0337d808bd4L,0x4a4f6912d24cf5baL,
35802         0xe4d8163b09cdaa8aL },
35803       { 0x0e0de9efd3082e8eL,0x4fe1246c0192f360L,0x1f9001504b8eee0aL,
35804         0x5219da81f1da391bL } },
35805     /* 18 << 231 */
35806     { { 0x7bf6a5c1f7ea25aaL,0xd165e6bffbb07d5fL,0xe353936189e78671L,
35807         0xa3fcac892bac4219L },
35808       { 0xdfab6fd4f0baa8abL,0x5a4adac1e2c1c2e5L,0x6cd75e3140d85849L,
35809         0xce263fea19b39181L } },
35810     /* 19 << 231 */
35811     { { 0xcb6803d307032c72L,0x7f40d5ce790968c8L,0xa6de86bddce978f0L,
35812         0x25547c4f368f751cL },
35813       { 0xb1e685fd65fb2a9eL,0xce69336f1eb9179cL,0xb15d1c2712504442L,
35814         0xb7df465cb911a06bL } },
35815     /* 20 << 231 */
35816     { { 0xb8d804a3315980cdL,0x693bc492fa3bebf7L,0x3578aeee2253c504L,
35817         0x158de498cd2474a2L },
35818       { 0x1331f5c7cfda8368L,0xd2d7bbb378d7177eL,0xdf61133af3c1e46eL,
35819         0x5836ce7dd30e7be8L } },
35820     /* 21 << 231 */
35821     { { 0x83084f1994f834cbL,0xd35653d4429ed782L,0xa542f16f59e58243L,
35822         0xc2b52f650470a22dL },
35823       { 0xe3b6221b18f23d96L,0xcb05abac3f5252b4L,0xca00938b87d61402L,
35824         0x2f186cdd411933e4L } },
35825     /* 22 << 231 */
35826     { { 0xe042ece59a29a5c5L,0xb19b3c073b6c8402L,0xc97667c719d92684L,
35827         0xb5624622ebc66372L },
35828       { 0x0cb96e653c04fa02L,0x83a7176c8eaa39aaL,0x2033561deaa1633fL,
35829         0x45a9d0864533df73L } },
35830     /* 23 << 231 */
35831     { { 0xe0542c1d3dc090bcL,0x82c996efaa59c167L,0xe3f735e80ee7fc4dL,
35832         0x7b1793937c35db79L },
35833       { 0xb6419e25f8c5dbfdL,0x4d9d7a1e1f327b04L,0x979f6f9b298dfca8L,
35834         0xc7c5dff18de9366aL } },
35835     /* 24 << 231 */
35836     { { 0x1b7a588d04c82bddL,0x68005534f8319dfdL,0xde8a55b5d8eb9580L,
35837         0x5ea886da8d5bca81L },
35838       { 0xe8530a01252a0b4dL,0x1bffb4fe35eaa0a1L,0x2ad828b1d8e99563L,
35839         0x7de96ef595f9cd87L } },
35840     /* 25 << 231 */
35841     { { 0x4abb2d0cd77d970cL,0x03cfb933d33ef9cbL,0xb0547c018b211fe9L,
35842         0x2fe64809a56ed1c6L },
35843       { 0xcb7d5624c2ac98ccL,0x2a1372c01a393e33L,0xc8d1ec1c29660521L,
35844         0xf3d31b04b37ac3e9L } },
35845     /* 26 << 231 */
35846     { { 0xa29ae9df5ece6e7cL,0x0603ac8f0facfb55L,0xcfe85b7adda233a5L,
35847         0xe618919fbd75f0b8L },
35848       { 0xf555a3d299bf1603L,0x1f43afc9f184255aL,0xdcdaf341319a3e02L,
35849         0xd3b117ef03903a39L } },
35850     /* 27 << 231 */
35851     { { 0xe095da1365d1d131L,0x86f16367c37ad03eL,0x5f37389e462cd8ddL,
35852         0xc103fa04d67a60e6L },
35853       { 0x57c34344f4b478f0L,0xce91edd8e117c98dL,0x001777b0231fc12eL,
35854         0x11ae47f2b207bccbL } },
35855     /* 28 << 231 */
35856     { { 0xd983cf8d20f8a242L,0x7aff5b1df22e1ad8L,0x68fd11d07fc4feb3L,
35857         0x5d53ae90b0f1c3e1L },
35858       { 0x50fb7905ec041803L,0x85e3c97714404888L,0x0e67faedac628d8fL,
35859         0x2e8651506668532cL } },
35860     /* 29 << 231 */
35861     { { 0x15acaaa46a67a6b0L,0xf4cdee25b25cec41L,0x49ee565ae4c6701eL,
35862         0x2a04ca66fc7d63d8L },
35863       { 0xeb105018ef0543fbL,0xf709a4f5d1b0d81dL,0x5b906ee62915d333L,
35864         0xf4a8741296f1f0abL } },
35865     /* 30 << 231 */
35866     { { 0xb6b82fa74d82f4c2L,0x90725a606804efb3L,0xbc82ec46adc3425eL,
35867         0xb7b805812787843eL },
35868       { 0xdf46d91cdd1fc74cL,0xdc1c62cbe783a6c4L,0x59d1b9f31a04cbbaL,
35869         0xd87f6f7295e40764L } },
35870     /* 31 << 231 */
35871     { { 0x02b4cfc1317f4a76L,0x8d2703eb91036bceL,0x98206cc6a5e72a56L,
35872         0x57be9ed1cf53fb0fL },
35873       { 0x09374571ef0b17acL,0x74b2655ed9181b38L,0xc8f80ea889935d0eL,
35874         0xc0d9e94291529936L } },
35875     /* 32 << 231 */
35876     { { 0x196860411e84e0e5L,0xa5db84d3aea34c93L,0xf9d5bb197073a732L,
35877         0xb8d2fe566bcfd7c0L },
35878       { 0x45775f36f3eb82faL,0x8cb20cccfdff8b58L,0x1659b65f8374c110L,
35879         0xb8b4a422330c789aL } },
35880     /* 33 << 231 */
35881     { { 0x75e3c3ea6fe8208bL,0xbd74b9e4286e78feL,0x0be2e81bd7d93a1aL,
35882         0x7ed06e27dd0a5aaeL },
35883       { 0x721f5a586be8b800L,0x428299d1d846db28L,0x95cb8e6b5be88ed3L,
35884         0xc3186b231c034e11L } },
35885     /* 34 << 231 */
35886     { { 0xa6312c9e8977d99bL,0xbe94433183f531e7L,0x8232c0c218d3b1d4L,
35887         0x617aae8be1247b73L },
35888       { 0x40153fc4282aec3bL,0xc6063d2ff7b8f823L,0x68f10e583304f94cL,
35889         0x31efae74ee676346L } },
35890     /* 35 << 231 */
35891     { { 0xbadb6c6d40a9b97cL,0x14702c634f666256L,0xdeb954f15184b2e3L,
35892         0x5184a52694b6ca40L },
35893       { 0xfff05337003c32eaL,0x5aa374dd205974c7L,0x9a7638544b0dd71aL,
35894         0x459cd27fdeb947ecL } },
35895     /* 36 << 231 */
35896     { { 0xa6e28161459c2b92L,0x2f020fa875ee8ef5L,0xb132ec2d30b06310L,
35897         0xc3e15899bc6a4530L },
35898       { 0xdc5f53feaa3f451aL,0x3a3c7f23c2d9acacL,0x2ec2f8926b27e58bL,
35899         0x68466ee7d742799fL } },
35900     /* 37 << 231 */
35901     { { 0x98324dd41fa26613L,0xa2dc6dabbdc29d63L,0xf9675faad712d657L,
35902         0x813994be21fd8d15L },
35903       { 0x5ccbb722fd4f7553L,0x5135ff8bf3a36b20L,0x44be28af69559df5L,
35904         0x40b65bed9d41bf30L } },
35905     /* 38 << 231 */
35906     { { 0xd98bf2a43734e520L,0x5e3abbe3209bdcbaL,0x77c76553bc945b35L,
35907         0x5331c093c6ef14aaL },
35908       { 0x518ffe2976b60c80L,0x2285593b7ace16f8L,0xab1f64ccbe2b9784L,
35909         0xe8f2c0d9ab2421b6L } },
35910     /* 39 << 231 */
35911     { { 0x617d7174c1df065cL,0xafeeb5ab5f6578faL,0x16ff1329263b54a8L,
35912         0x45c55808c990dce3L },
35913       { 0x42eab6c0ecc8c177L,0x799ea9b55982ecaaL,0xf65da244b607ef8eL,
35914         0x8ab226ce32a3fc2cL } },
35915     /* 40 << 231 */
35916     { { 0x745741e57ea973dcL,0x5c00ca7020888f2eL,0x7cdce3cf45fd9cf1L,
35917         0x8a741ef15507f872L },
35918       { 0x47c51c2f196b4cecL,0x70d08e43c97ea618L,0x930da15c15b18a2bL,
35919         0x33b6c6782f610514L } },
35920     /* 41 << 231 */
35921     { { 0xc662e4f807ac9794L,0x1eccf050ba06cb79L,0x1ff08623e7d954e5L,
35922         0x6ef2c5fb24cf71c3L },
35923       { 0xb2c063d267978453L,0xa0cf37961d654af8L,0x7cb242ea7ebdaa37L,
35924         0x206e0b10b86747e0L } },
35925     /* 42 << 231 */
35926     { { 0x481dae5fd5ecfefcL,0x07084fd8c2bff8fcL,0x8040a01aea324596L,
35927         0x4c646980d4de4036L },
35928       { 0x9eb8ab4ed65abfc3L,0xe01cb91f13541ec7L,0x8f029adbfd695012L,
35929         0x9ae284833c7569ecL } },
35930     /* 43 << 231 */
35931     { { 0xa5614c9ea66d80a1L,0x680a3e4475f5f911L,0x0c07b14dceba4fc1L,
35932         0x891c285ba13071c1L },
35933       { 0xcac67ceb799ece3cL,0x29b910a941e07e27L,0x66bdb409f2e43123L,
35934         0x06f8b1377ac9ecbeL } },
35935     /* 44 << 231 */
35936     { { 0x5981fafd38547090L,0x19ab8b9f85e3415dL,0xfc28c194c7e31b27L,
35937         0x843be0aa6fbcbb42L },
35938       { 0xf3b1ed43a6db836cL,0x2a1330e401a45c05L,0x4f19f3c595c1a377L,
35939         0xa85f39d044b5ee33L } },
35940     /* 45 << 231 */
35941     { { 0x3da18e6d4ae52834L,0x5a403b397423dcb0L,0xbb555e0af2374aefL,
35942         0x2ad599c41e8ca111L },
35943       { 0x1b3a2fb9014b3bf8L,0x73092684f66d5007L,0x079f1426c4340102L,
35944         0x1827cf818fddf4deL } },
35945     /* 46 << 231 */
35946     { { 0xc83605f6f10ff927L,0xd387145123739fc6L,0x6d163450cac1c2ccL,
35947         0x6b521296a2ec1ac5L },
35948       { 0x0606c4f96e3cb4a5L,0xe47d3f41778abff7L,0x425a8d5ebe8e3a45L,
35949         0x53ea9e97a6102160L } },
35950     /* 47 << 231 */
35951     { { 0x477a106e39cbb688L,0x532401d2f3386d32L,0x8e564f64b1b9b421L,
35952         0xca9b838881dad33fL },
35953       { 0xb1422b4e2093913eL,0x533d2f9269bc8112L,0x3fa017beebe7b2c7L,
35954         0xb2767c4acaf197c6L } },
35955     /* 48 << 231 */
35956     { { 0xc925ff87aedbae9fL,0x7daf0eb936880a54L,0x9284ddf59c4d0e71L,
35957         0x1581cf93316f8cf5L },
35958       { 0x3eeca8873ac1f452L,0xb417fce9fb6aeffeL,0xa5918046eefb8dc3L,
35959         0x73d318ac02209400L } },
35960     /* 49 << 231 */
35961     { { 0xe800400f728693e5L,0xe87d814b339927edL,0x93e94d3b57ea9910L,
35962         0xff8a35b62245fb69L },
35963       { 0x043853d77f200d34L,0x470f1e680f653ce1L,0x81ac05bd59a06379L,
35964         0xa14052c203930c29L } },
35965     /* 50 << 231 */
35966     { { 0x6b72fab526bc2797L,0x13670d1699f16771L,0x001700521e3e48d1L,
35967         0x978fe401b7adf678L },
35968       { 0x55ecfb92d41c5dd4L,0x5ff8e247c7b27da5L,0xe7518272013fb606L,
35969         0x5768d7e52f547a3cL } },
35970     /* 51 << 231 */
35971     { { 0xbb24eaa360017a5fL,0x6b18e6e49c64ce9bL,0xc225c655103dde07L,
35972         0xfc3672ae7592f7eaL },
35973       { 0x9606ad77d06283a1L,0x542fc650e4d59d99L,0xabb57c492a40e7c2L,
35974         0xac948f13a8db9f55L } },
35975     /* 52 << 231 */
35976     { { 0x6d4c9682b04465c3L,0xe3d062fa6468bd15L,0xa51729ac5f318d7eL,
35977         0x1fc87df69eb6fc95L },
35978       { 0x63d146a80591f652L,0xa861b8f7589621aaL,0x59f5f15ace31348cL,
35979         0x8f663391440da6daL } },
35980     /* 53 << 231 */
35981     { { 0xcfa778acb591ffa3L,0x027ca9c54cdfebceL,0xbe8e05a5444ea6b3L,
35982         0x8aab4e69a78d8254L },
35983       { 0x2437f04fb474d6b8L,0x6597ffd4045b3855L,0xbb0aea4eca47ecaaL,
35984         0x568aae8385c7ebfcL } },
35985     /* 54 << 231 */
35986     { { 0x0e966e64c73b2383L,0x49eb3447d17d8762L,0xde1078218da05dabL,
35987         0x443d8baa016b7236L },
35988       { 0x163b63a5ea7610d6L,0xe47e4185ce1ca979L,0xae648b6580baa132L,
35989         0xebf53de20e0d5b64L } },
35990     /* 55 << 231 */
35991     { { 0x8d3bfcb4d3c8c1caL,0x0d914ef35d04b309L,0x55ef64153de7d395L,
35992         0xbde1666f26b850e8L },
35993       { 0xdbe1ca6ed449ab19L,0x8902b322e89a2672L,0xb1674b7edacb7a53L,
35994         0x8e9faf6ef52523ffL } },
35995     /* 56 << 231 */
35996     { { 0x6ba535da9a85788bL,0xd21f03aebd0626d4L,0x099f8c47e873dc64L,
35997         0xcda8564d018ec97eL },
35998       { 0x3e8d7a5cde92c68cL,0x78e035a173323cc4L,0x3ef26275f880ff7cL,
35999         0xa4ee3dff273eedaaL } },
36000     /* 57 << 231 */
36001     { { 0x58823507af4e18f8L,0x967ec9b50672f328L,0x9ded19d9559d3186L,
36002         0x5e2ab3de6cdce39cL },
36003       { 0xabad6e4d11c226dfL,0xf9783f4387723014L,0x9a49a0cf1a885719L,
36004         0xfc0c1a5a90da9dbfL } },
36005     /* 58 << 231 */
36006     { { 0x8bbaec49571d92acL,0x569e85fe4692517fL,0x8333b014a14ea4afL,
36007         0x32f2a62f12e5c5adL },
36008       { 0x98c2ce3a06d89b85L,0xb90741aa2ff77a08L,0x2530defc01f795a2L,
36009         0xd6e5ba0b84b3c199L } },
36010     /* 59 << 231 */
36011     { { 0x7d8e845112e4c936L,0xae419f7dbd0be17bL,0xa583fc8c22262bc9L,
36012         0x6b842ac791bfe2bdL },
36013       { 0x33cef4e9440d6827L,0x5f69f4deef81fb14L,0xf16cf6f6234fbb92L,
36014         0x76ae3fc3d9e7e158L } },
36015     /* 60 << 231 */
36016     { { 0x4e89f6c2e9740b33L,0x677bc85d4962d6a1L,0x6c6d8a7f68d10d15L,
36017         0x5f9a72240257b1cdL },
36018       { 0x7096b9164ad85961L,0x5f8c47f7e657ab4aL,0xde57d7d0f7461d7eL,
36019         0x7eb6094d80ce5ee2L } },
36020     /* 61 << 231 */
36021     { { 0x0b1e1dfd34190547L,0x8a394f43f05dd150L,0x0a9eb24d97df44e6L,
36022         0x78ca06bf87675719L },
36023       { 0x6f0b34626ffeec22L,0x9d91bcea36cdd8fbL,0xac83363ca105be47L,
36024         0x81ba76c1069710e3L } },
36025     /* 62 << 231 */
36026     { { 0x3d1b24cb28c682c6L,0x27f252288612575bL,0xb587c779e8e66e98L,
36027         0x7b0c03e9405eb1feL },
36028       { 0xfdf0d03015b548e7L,0xa8be76e038b36af7L,0x4cdab04a4f310c40L,
36029         0x6287223ef47ecaecL } },
36030     /* 63 << 231 */
36031     { { 0x678e60558b399320L,0x61fe3fa6c01e4646L,0xc482866b03261a5eL,
36032         0xdfcf45b85c2f244aL },
36033       { 0x8fab9a512f684b43L,0xf796c654c7220a66L,0x1d90707ef5afa58fL,
36034         0x2c421d974fdbe0deL } },
36035     /* 64 << 231 */
36036     { { 0xc4f4cda3af2ebc2fL,0xa0af843dcb4efe24L,0x53b857c19ccd10b1L,
36037         0xddc9d1eb914d3e04L },
36038       { 0x7bdec8bb62771debL,0x829277aa91c5aa81L,0x7af18dd6832391aeL,
36039         0x1740f316c71a84caL } },
36040     /* 0 << 238 */
36041     { { 0x00, 0x00, 0x00, 0x00 },
36042       { 0x00, 0x00, 0x00, 0x00 } },
36043     /* 1 << 238 */
36044     { { 0x8928e99aeeaf8c49L,0xee7aa73d6e24d728L,0x4c5007c2e72b156cL,
36045         0x5fcf57c5ed408a1dL },
36046       { 0x9f719e39b6057604L,0x7d343c01c2868bbfL,0x2cca254b7e103e2dL,
36047         0xe6eb38a9f131bea2L } },
36048     /* 2 << 238 */
36049     { { 0xb33e624f8be762b4L,0x2a9ee4d1058e3413L,0x968e636967d805faL,
36050         0x9848949b7db8bfd7L },
36051       { 0x5308d7e5d23a8417L,0x892f3b1df3e29da5L,0xc95c139e3dee471fL,
36052         0x8631594dd757e089L } },
36053     /* 3 << 238 */
36054     { { 0xe0c82a3cde918dccL,0x2e7b599426fdcf4bL,0x82c5024932cb1b2dL,
36055         0xea613a9d7657ae07L },
36056       { 0xc2eb5f6cf1fdc9f7L,0xb6eae8b8879fe682L,0x253dfee0591cbc7fL,
36057         0x000da7133e1290e6L } },
36058     /* 4 << 238 */
36059     { { 0x1083e2ea1f095615L,0x0a28ad7714e68c33L,0x6bfc02523d8818beL,
36060         0xb585113af35850cdL },
36061       { 0x7d935f0b30df8aa1L,0xaddda07c4ab7e3acL,0x92c34299552f00cbL,
36062         0xc33ed1de2909df6cL } },
36063     /* 5 << 238 */
36064     { { 0x22c2195d80e87766L,0x9e99e6d89ddf4ac0L,0x09642e4e65e74934L,
36065         0x2610ffa2ff1ff241L },
36066       { 0x4d1d47d4751c8159L,0x697b4985af3a9363L,0x0318ca4687477c33L,
36067         0xa90cb5659441eff3L } },
36068     /* 6 << 238 */
36069     { { 0x58bb384836f024cbL,0x85be1f7736016168L,0x6c59587cdc7e07f1L,
36070         0x191be071af1d8f02L },
36071       { 0xbf169fa5cca5e55cL,0x3864ba3cf7d04eacL,0x915e367f8d7d05dbL,
36072         0xb48a876da6549e5dL } },
36073     /* 7 << 238 */
36074     { { 0xef89c656580e40a2L,0xf194ed8c728068bcL,0x74528045a47990c9L,
36075         0xf53fc7d75e1a4649L },
36076       { 0xbec5ae9b78593e7dL,0x2cac4ee341db65d7L,0xa8c1eb2404a3d39bL,
36077         0x53b7d63403f8f3efL } },
36078     /* 8 << 238 */
36079     { { 0x2dc40d483e07113cL,0x6e4a5d397d8b63aeL,0x5582a94b79684c2bL,
36080         0x932b33d4622da26cL },
36081       { 0xf534f6510dbbf08dL,0x211d07c964c23a52L,0x0eeece0fee5bdc9bL,
36082         0xdf178168f7015558L } },
36083     /* 9 << 238 */
36084     { { 0xd42946350a712229L,0x93cbe44809273f8cL,0x00b095ef8f13bc83L,
36085         0xbb7419728798978cL },
36086       { 0x9d7309a256dbe6e7L,0xe578ec565a5d39ecL,0x3961151b851f9a31L,
36087         0x2da7715de5709eb4L } },
36088     /* 10 << 238 */
36089     { { 0x867f301753dfabf0L,0x728d2078b8e39259L,0x5c75a0cd815d9958L,
36090         0xf84867a616603be1L },
36091       { 0xc865b13d70e35b1cL,0x0241446819b03e2cL,0xe46041daac1f3121L,
36092         0x7c9017ad6f028a7cL } },
36093     /* 11 << 238 */
36094     { { 0xabc96de90a482873L,0x4265d6b1b77e54d4L,0x68c38e79a57d88e7L,
36095         0xd461d7669ce82de3L },
36096       { 0x817a9ec564a7e489L,0xcc5675cda0def5f2L,0x9a00e785985d494eL,
36097         0xc626833f1b03514aL } },
36098     /* 12 << 238 */
36099     { { 0xabe7905a83cdd60eL,0x50602fb5a1170184L,0x689886cdb023642aL,
36100         0xd568d090a6e1fb00L },
36101       { 0x5b1922c70259217fL,0x93831cd9c43141e4L,0xdfca35870c95f86eL,
36102         0xdec2057a568ae828L } },
36103     /* 13 << 238 */
36104     { { 0xc44ea599f98a759aL,0x55a0a7a2f7c23c1dL,0xd5ffb6e694c4f687L,
36105         0x3563cce212848478L },
36106       { 0x812b3517e7b1fbe1L,0x8a7dc9794f7338e0L,0x211ecee952d048dbL,
36107         0x2eea4056c86ea3b8L } },
36108     /* 14 << 238 */
36109     { { 0xd8cb68a7ba772b34L,0xe16ed3415f4e2541L,0x9b32f6a60fec14dbL,
36110         0xeee376f7391698beL },
36111       { 0xe9a7aa1783674c02L,0x65832f975843022aL,0x29f3a8da5ba4990fL,
36112         0x79a59c3afb8e3216L } },
36113     /* 15 << 238 */
36114     { { 0x9cdc4d2ebd19bb16L,0xc6c7cfd0b3262d86L,0xd4ce14d0969c0b47L,
36115         0x1fa352b713e56128L },
36116       { 0x383d55b8973db6d3L,0x71836850e8e5b7bfL,0xc7714596e6bb571fL,
36117         0x259df31f2d5b2dd2L } },
36118     /* 16 << 238 */
36119     { { 0x568f8925913cc16dL,0x18bc5b6de1a26f5aL,0xdfa413bef5f499aeL,
36120         0xf8835decc3f0ae84L },
36121       { 0xb6e60bd865a40ab0L,0x65596439194b377eL,0xbcd8562592084a69L,
36122         0x5ce433b94f23ede0L } },
36123     /* 17 << 238 */
36124     { { 0xe8e8f04f6ad65143L,0x11511827d6e14af6L,0x3d390a108295c0c7L,
36125         0x71e29ee4621eba16L },
36126       { 0xa588fc0963717b46L,0x02be02fee06ad4a2L,0x931558c604c22b22L,
36127         0xbb4d4bd612f3c849L } },
36128     /* 18 << 238 */
36129     { { 0x54a4f49620efd662L,0x92ba6d20c5952d14L,0x2db8ea1ecc9784c2L,
36130         0x81cc10ca4b353644L },
36131       { 0x40b570ad4b4d7f6cL,0x5c9f1d9684a1dcd2L,0x01379f813147e797L,
36132         0xe5c6097b2bd499f5L } },
36133     /* 19 << 238 */
36134     { { 0x40dcafa6328e5e20L,0xf7b5244a54815550L,0xb9a4f11847bfc978L,
36135         0x0ea0e79fd25825b1L },
36136       { 0xa50f96eb646c7ecfL,0xeb811493446dea9dL,0x2af04677dfabcf69L,
36137         0xbe3a068fc713f6e8L } },
36138     /* 20 << 238 */
36139     { { 0x860d523d42e06189L,0xbf0779414e3aff13L,0x0b616dcac1b20650L,
36140         0xe66dd6d12131300dL },
36141       { 0xd4a0fd67ff99abdeL,0xc9903550c7aac50dL,0x022ecf8b7c46b2d7L,
36142         0x3333b1e83abf92afL } },
36143     /* 21 << 238 */
36144     { { 0x11cc113c6c491c14L,0x0597668880dd3f88L,0xf5b4d9e729d932edL,
36145         0xe982aad8a2c38b6dL },
36146       { 0x6f9253478be0dcf0L,0x700080ae65ca53f2L,0xd8131156443ca77fL,
36147         0xe92d6942ec51f984L } },
36148     /* 22 << 238 */
36149     { { 0xd2a08af885dfe9aeL,0xd825d9a54d2a86caL,0x2c53988d39dff020L,
36150         0xf38b135a430cdc40L },
36151       { 0x0c918ae062a7150bL,0xf31fd8de0c340e9bL,0xafa0e7ae4dbbf02eL,
36152         0x5847fb2a5eba6239L } },
36153     /* 23 << 238 */
36154     { { 0x6b1647dcdccbac8bL,0xb642aa7806f485c8L,0x873f37657038ecdfL,
36155         0x2ce5e865fa49d3feL },
36156       { 0xea223788c98c4400L,0x8104a8cdf1fa5279L,0xbcf7cc7a06becfd7L,
36157         0x49424316c8f974aeL } },
36158     /* 24 << 238 */
36159     { { 0xc0da65e784d6365dL,0xbcb7443f8f759fb8L,0x35c712b17ae81930L,
36160         0x80428dff4c6e08abL },
36161       { 0xf19dafefa4faf843L,0xced8538dffa9855fL,0x20ac409cbe3ac7ceL,
36162         0x358c1fb6882da71eL } },
36163     /* 25 << 238 */
36164     { { 0xafa9c0e5fd349961L,0x2b2cfa518421c2fcL,0x2a80db17f3a28d38L,
36165         0xa8aba5395d138e7eL },
36166       { 0x52012d1d6e96eb8dL,0x65d8dea0cbaf9622L,0x57735447b264f56cL,
36167         0xbeebef3f1b6c8da2L } },
36168     /* 26 << 238 */
36169     { { 0xfc346d98ce785254L,0xd50e8d72bb64a161L,0xc03567c749794addL,
36170         0x15a76065752c7ef6L },
36171       { 0x59f3a222961f23d6L,0x378e443873ecc0b0L,0xc74be4345a82fde4L,
36172         0xae509af2d8b9cf34L } },
36173     /* 27 << 238 */
36174     { { 0x4a61ee46577f44a1L,0xe09b748cb611deebL,0xc0481b2cf5f7b884L,
36175         0x3562667861acfa6bL },
36176       { 0x37f4c518bf8d21e6L,0x22d96531b205a76dL,0x37fb85e1954073c0L,
36177         0xbceafe4f65b3a567L } },
36178     /* 28 << 238 */
36179     { { 0xefecdef7be42a582L,0xd3fc608065046be6L,0xc9af13c809e8dba9L,
36180         0x1e6c9847641491ffL },
36181       { 0x3b574925d30c31f7L,0xb7eb72baac2a2122L,0x776a0dacef0859e7L,
36182         0x06fec31421900942L } },
36183     /* 29 << 238 */
36184     { { 0x2464bc10f8c22049L,0x9bfbcce7875ebf69L,0xd7a88e2a4336326bL,
36185         0xda05261c5bc2acfaL },
36186       { 0xc29f5bdceba7efc8L,0x471237ca25dbbf2eL,0xa72773f22975f127L,
36187         0xdc744e8e04d0b326L } },
36188     /* 30 << 238 */
36189     { { 0x38a7ed16a56edb73L,0x64357e372c007e70L,0xa167d15b5080b400L,
36190         0x07b4116423de4be1L },
36191       { 0xb2d91e3274c89883L,0x3c1628212882e7edL,0xad6b36ba7503e482L,
36192         0x48434e8e0ea34331L } },
36193     /* 31 << 238 */
36194     { { 0x79f4f24f2c7ae0b9L,0xc46fbf811939b44aL,0x76fefae856595eb1L,
36195         0x417b66abcd5f29c7L },
36196       { 0x5f2332b2c5ceec20L,0xd69661ffe1a1cae2L,0x5ede7e529b0286e6L,
36197         0x9d062529e276b993L } },
36198     /* 32 << 238 */
36199     { { 0x324794b07e50122bL,0xdd744f8b4af07ca5L,0x30a12f08d63fc97bL,
36200         0x39650f1a76626d9dL },
36201       { 0x101b47f71fa38477L,0x3d815f19d4dc124fL,0x1569ae95b26eb58aL,
36202         0xc3cde18895fb1887L } },
36203     /* 33 << 238 */
36204     { { 0x54e9f37bf9539a48L,0xb0100e067408c1a5L,0x821d9811ea580cbbL,
36205         0x8af52d3586e50c56L },
36206       { 0xdfbd9d47dbbf698bL,0x2961a1ea03dc1c73L,0x203d38f8e76a5df8L,
36207         0x08a53a686def707aL } },
36208     /* 34 << 238 */
36209     { { 0x26eefb481bee45d4L,0xb3cee3463c688036L,0x463c5315c42f2469L,
36210         0x19d84d2e81378162L },
36211       { 0x22d7c3c51c4d349fL,0x65965844163d59c5L,0xcf198c56b8abceaeL,
36212         0x6fb1fb1b628559d5L } },
36213     /* 35 << 238 */
36214     { { 0x8bbffd0607bf8fe3L,0x46259c583467734bL,0xd8953cea35f7f0d3L,
36215         0x1f0bece2d65b0ff1L },
36216       { 0xf7d5b4b3f3c72914L,0x29e8ea953cb53389L,0x4a365626836b6d46L,
36217         0xe849f910ea174fdeL } },
36218     /* 36 << 238 */
36219     { { 0x7ec62fbbf4737f21L,0xd8dba5ab6209f5acL,0x24b5d7a9a5f9adbeL,
36220         0x707d28f7a61dc768L },
36221       { 0x7711460bcaa999eaL,0xba7b174d1c92e4ccL,0x3c4bab6618d4bf2dL,
36222         0xb8f0c980eb8bd279L } },
36223     /* 37 << 238 */
36224     { { 0x024bea9a324b4737L,0xfba9e42332a83bcaL,0x6e635643a232dcedL,
36225         0x996193672571c8baL },
36226       { 0xe8c9f35754b7032bL,0xf936b3ba2442d54aL,0x2263f0f08290c65aL,
36227         0x48989780ee2c7fdbL } },
36228     /* 38 << 238 */
36229     { { 0xadc5d55a13d4f95eL,0x737cff85ad9b8500L,0x271c557b8a73f43dL,
36230         0xbed617a4e18bc476L },
36231       { 0x662454017dfd8ab2L,0xae7b89ae3a2870aaL,0x1b555f5323a7e545L,
36232         0x6791e247be057e4cL } },
36233     /* 39 << 238 */
36234     { { 0x860136ad324fa34dL,0xea1114474cbeae28L,0x023a4270bedd3299L,
36235         0x3d5c3a7fc1c35c34L },
36236       { 0xb0f6db678d0412d2L,0xd92625e2fcdc6b9aL,0x92ae5ccc4e28a982L,
36237         0xea251c3647a3ce7eL } },
36238     /* 40 << 238 */
36239     { { 0x9d658932790691bfL,0xed61058906b736aeL,0x712c2f04c0d63b6eL,
36240         0x5cf06fd5c63d488fL },
36241       { 0x97363facd9588e41L,0x1f9bf7622b93257eL,0xa9d1ffc4667acaceL,
36242         0x1cf4a1aa0a061ecfL } },
36243     /* 41 << 238 */
36244     { { 0x40e48a49dc1818d0L,0x0643ff39a3621ab0L,0x5768640ce39ef639L,
36245         0x1fc099ea04d86854L },
36246       { 0x9130b9c3eccd28fdL,0xd743cbd27eec54abL,0x052b146fe5b475b6L,
36247         0x058d9a82900a7d1fL } },
36248     /* 42 << 238 */
36249     { { 0x65e0229291262b72L,0x96f924f9bb0edf03L,0x5cfa59c8fe206842L,
36250         0xf60370045eafa720L },
36251       { 0x5f30699e18d7dd96L,0x381e8782cbab2495L,0x91669b46dd8be949L,
36252         0xb40606f526aae8efL } },
36253     /* 43 << 238 */
36254     { { 0x2812b839fc6751a4L,0x16196214fba800efL,0x4398d5ca4c1a2875L,
36255         0x720c00ee653d8349L },
36256       { 0xc2699eb0d820007cL,0x880ee660a39b5825L,0x70694694471f6984L,
36257         0xf7d16ea8e3dda99aL } },
36258     /* 44 << 238 */
36259     { { 0x28d675b2c0519a23L,0x9ebf94fe4f6952e3L,0xf28bb767a2294a8aL,
36260         0x85512b4dfe0af3f5L },
36261       { 0x18958ba899b16a0dL,0x95c2430cba7548a7L,0xb30d1b10a16be615L,
36262         0xe3ebbb9785bfb74cL } },
36263     /* 45 << 238 */
36264     { { 0xa3273cfe18549fdbL,0xf6e200bf4fcdb792L,0x54a76e1883aba56cL,
36265         0x73ec66f689ef6aa2L },
36266       { 0x8d17add7d1b9a305L,0xa959c5b9b7ae1b9dL,0x886435226bcc094aL,
36267         0xcc5616c4d7d429b9L } },
36268     /* 46 << 238 */
36269     { { 0xa6dada01e6a33f7cL,0xc6217a079d4e70adL,0xd619a81809c15b7cL,
36270         0xea06b3290e80c854L },
36271       { 0x174811cea5f5e7b9L,0x66dfc310787c65f4L,0x4ea7bd693316ab54L,
36272         0xc12c4acb1dcc0f70L } },
36273     /* 47 << 238 */
36274     { { 0xe4308d1a1e407dd9L,0xe8a3587c91afa997L,0xea296c12ab77b7a5L,
36275         0xb5ad49e4673c0d52L },
36276       { 0x40f9b2b27006085aL,0xa88ff34087bf6ec2L,0x978603b14e3066a6L,
36277         0xb3f99fc2b5e486e2L } },
36278     /* 48 << 238 */
36279     { { 0x07b53f5eb2e63645L,0xbe57e54784c84232L,0xd779c2167214d5cfL,
36280         0x617969cd029a3acaL },
36281       { 0xd17668cd8a7017a0L,0x77b4d19abe9b7ee8L,0x58fd0e939c161776L,
36282         0xa8c4f4efd5968a72L } },
36283     /* 49 << 238 */
36284     { { 0x296071cc67b3de77L,0xae3c0b8e634f7905L,0x67e440c28a7100c9L,
36285         0xbb8c3c1beb4b9b42L },
36286       { 0x6d71e8eac51b3583L,0x7591f5af9525e642L,0xf73a2f7b13f509f3L,
36287         0x618487aa5619ac9bL } },
36288     /* 50 << 238 */
36289     { { 0x3a72e5f79d61718aL,0x00413bcc7592d28cL,0x7d9b11d3963c35cfL,
36290         0x77623bcfb90a46edL },
36291       { 0xdeef273bdcdd2a50L,0x4a741f9b0601846eL,0x33b89e510ec6e929L,
36292         0xcb02319f8b7f22cdL } },
36293     /* 51 << 238 */
36294     { { 0xbbe1500d084bae24L,0x2f0ae8d7343d2693L,0xacffb5f27cdef811L,
36295         0xaa0c030a263fb94fL },
36296       { 0x6eef0d61a0f442deL,0xf92e181727b139d3L,0x1ae6deb70ad8bc28L,
36297         0xa89e38dcc0514130L } },
36298     /* 52 << 238 */
36299     { { 0x81eeb865d2fdca23L,0x5a15ee08cc8ef895L,0x768fa10a01905614L,
36300         0xeff5b8ef880ee19bL },
36301       { 0xf0c0cabbcb1c8a0eL,0x2e1ee9cdb8c838f9L,0x0587d8b88a4a14c0L,
36302         0xf6f278962ff698e5L } },
36303     /* 53 << 238 */
36304     { { 0xed38ef1c89ee6256L,0xf44ee1fe6b353b45L,0x9115c0c770e903b3L,
36305         0xc78ec0a1818f31dfL },
36306       { 0x6c003324b7dccbc6L,0xd96dd1f3163bbc25L,0x33aa82dd5cedd805L,
36307         0x123aae4f7f7eb2f1L } },
36308     /* 54 << 238 */
36309     { { 0x1723fcf5a26262cdL,0x1f7f4d5d0060ebd5L,0xf19c5c01b2eaa3afL,
36310         0x2ccb9b149790accfL },
36311       { 0x1f9c1cad52324aa6L,0x632005267247df54L,0x5732fe42bac96f82L,
36312         0x52fe771f01a1c384L } },
36313     /* 55 << 238 */
36314     { { 0x546ca13db1001684L,0xb56b4eeea1709f75L,0x266545a9d5db8672L,
36315         0xed971c901e8f3cfbL },
36316       { 0x4e7d8691e3a07b29L,0x7570d9ece4b696b9L,0xdc5fa0677bc7e9aeL,
36317         0x68b44cafc82c4844L } },
36318     /* 56 << 238 */
36319     { { 0x519d34b3bf44da80L,0x283834f95ab32e66L,0x6e6087976278a000L,
36320         0x1e62960e627312f6L },
36321       { 0x9b87b27be6901c55L,0x80e7853824fdbc1fL,0xbbbc09512facc27dL,
36322         0x06394239ac143b5aL } },
36323     /* 57 << 238 */
36324     { { 0x35bb4a40376c1944L,0x7cb6269463da1511L,0xafd29161b7148a3bL,
36325         0xa6f9d9ed4e2ea2eeL },
36326       { 0x15dc2ca2880dd212L,0x903c3813a61139a9L,0x2aa7b46d6c0f8785L,
36327         0x36ce2871901c60ffL } },
36328     /* 58 << 238 */
36329     { { 0xc683b028e10d9c12L,0x7573baa2032f33d3L,0x87a9b1f667a31b58L,
36330         0xfd3ed11af4ffae12L },
36331       { 0x83dcaa9a0cb2748eL,0x8239f0185d6fdf16L,0xba67b49c72753941L,
36332         0x2beec455c321cb36L } },
36333     /* 59 << 238 */
36334     { { 0x880156063f8b84ceL,0x764170838d38c86fL,0x054f1ca7598953ddL,
36335         0xc939e1104e8e7429L },
36336       { 0x9b1ac2b35a914f2fL,0x39e35ed3e74b8f9cL,0xd0debdb2781b2fb0L,
36337         0x1585638f2d997ba2L } },
36338     /* 60 << 238 */
36339     { { 0x9c4b646e9e2fce99L,0x68a210811e80857fL,0x06d54e443643b52aL,
36340         0xde8d6d630d8eb843L },
36341       { 0x7032156342146a0aL,0x8ba826f25eaa3622L,0x227a58bd86138787L,
36342         0x43b6c03c10281d37L } },
36343     /* 61 << 238 */
36344     { { 0x6326afbbb54dde39L,0x744e5e8adb6f2d5fL,0x48b2a99acff158e1L,
36345         0xa93c8fa0ef87918fL },
36346       { 0x2182f956de058c5cL,0x216235d2936f9e7aL,0xace0c0dbd2e31e67L,
36347         0xc96449bff23ac3e7L } },
36348     /* 62 << 238 */
36349     { { 0x7e9a2874170693bdL,0xa28e14fda45e6335L,0x5757f6b356427344L,
36350         0x822e4556acf8edf9L },
36351       { 0x2b7a6ee2e6a285cdL,0x5866f211a9df3af0L,0x40dde2ddf845b844L,
36352         0x986c3726110e5e49L } },
36353     /* 63 << 238 */
36354     { { 0x73680c2af7172277L,0x57b94f0f0cccb244L,0xbdff72672d438ca7L,
36355         0xbad1ce11cf4663fdL },
36356       { 0x9813ed9dd8f71caeL,0xf43272a6961fdaa6L,0xbeff0119bd6d1637L,
36357         0xfebc4f9130361978L } },
36358     /* 64 << 238 */
36359     { { 0x02b37a952f41deffL,0x0e44a59ae63b89b7L,0x673257dc143ff951L,
36360         0x19c02205d752baf4L },
36361       { 0x46c23069c4b7d692L,0x2e6392c3fd1502acL,0x6057b1a21b220846L,
36362         0xe51ff9460c1b5b63L } },
36363     /* 0 << 245 */
36364     { { 0x00, 0x00, 0x00, 0x00 },
36365       { 0x00, 0x00, 0x00, 0x00 } },
36366     /* 1 << 245 */
36367     { { 0x6e85cb51566c5c43L,0xcff9c9193597f046L,0x9354e90c4994d94aL,
36368         0xe0a393322147927dL },
36369       { 0x8427fac10dc1eb2bL,0x88cfd8c22ff319faL,0xe2d4e68401965274L,
36370         0xfa2e067d67aaa746L } },
36371     /* 2 << 245 */
36372     { { 0xb6d92a7f3e5f9f11L,0x9afe153ad6cb3b8eL,0x4d1a6dd7ddf800bdL,
36373         0xf6c13cc0caf17e19L },
36374       { 0x15f6c58e325fc3eeL,0x71095400a31dc3b2L,0x168e7c07afa3d3e7L,
36375         0x3f8417a194c7ae2dL } },
36376     /* 3 << 245 */
36377     { { 0xec234772813b230dL,0x634d0f5f17344427L,0x11548ab1d77fc56aL,
36378         0x7fab1750ce06af77L },
36379       { 0xb62c10a74f7c4f83L,0xa7d2edc4220a67d9L,0x1c404170921209a0L,
36380         0x0b9815a0face59f0L } },
36381     /* 4 << 245 */
36382     { { 0x2842589b319540c3L,0x18490f59a283d6f8L,0xa2731f84daae9fcbL,
36383         0x3db6d960c3683ba0L },
36384       { 0xc85c63bb14611069L,0xb19436af0788bf05L,0x905459df347460d2L,
36385         0x73f6e094e11a7db1L } },
36386     /* 5 << 245 */
36387     { { 0xdc7f938eb6357f37L,0xc5d00f792bd8aa62L,0xc878dcb92ca979fcL,
36388         0x37e83ed9eb023a99L },
36389       { 0x6b23e2731560bf3dL,0x1086e4591d0fae61L,0x782483169a9414bdL,
36390         0x1b956bc0f0ea9ea1L } },
36391     /* 6 << 245 */
36392     { { 0x7b85bb91c31b9c38L,0x0c5aa90b48ef57b5L,0xdedeb169af3bab6fL,
36393         0xe610ad732d373685L },
36394       { 0xf13870df02ba8e15L,0x0337edb68ca7f771L,0xe4acf747b62c036cL,
36395         0xd921d576b6b94e81L } },
36396     /* 7 << 245 */
36397     { { 0xdbc864392c422f7aL,0xfb635362ed348898L,0x83084668c45bfcd1L,
36398         0xc357c9e32b315e11L },
36399       { 0xb173b5405b2e5b8cL,0x7e946931e102b9a4L,0x17c890eb7b0fb199L,
36400         0xec225a83d61b662bL } },
36401     /* 8 << 245 */
36402     { { 0xf306a3c8ee3c76cbL,0x3cf11623d32a1f6eL,0xe6d5ab646863e956L,
36403         0x3b8a4cbe5c005c26L },
36404       { 0xdcd529a59ce6bb27L,0xc4afaa5204d4b16fL,0xb0624a267923798dL,
36405         0x85e56df66b307fabL } },
36406     /* 9 << 245 */
36407     { { 0x0281893c2bf29698L,0x91fc19a4d7ce7603L,0x75a5dca3ad9a558fL,
36408         0x40ceb3fa4d50bf77L },
36409       { 0x1baf6060bc9ba369L,0x927e1037597888c2L,0xd936bf1986a34c07L,
36410         0xd4cf10c1c34ae980L } },
36411     /* 10 << 245 */
36412     { { 0x3a3e5334859dd614L,0x9c475b5b18d0c8eeL,0x63080d1f07cd51d5L,
36413         0xc9c0d0a6b88b4326L },
36414       { 0x1ac98691c234296fL,0x2a0a83a494887fb6L,0x565114270cea9cf2L,
36415         0x5230a6e8a24802f5L } },
36416     /* 11 << 245 */
36417     { { 0xf7a2bf0f72e3d5c1L,0x377174464f21439eL,0xfedcbf259ce30334L,
36418         0xe0030a787ce202f9L },
36419       { 0x6f2d9ebf1202e9caL,0xe79dde6c75e6e591L,0xf52072aff1dac4f8L,
36420         0x6c8d087ebb9b404dL } },
36421     /* 12 << 245 */
36422     { { 0xad0fc73dbce913afL,0x909e587b458a07cbL,0x1300da84d4f00c8aL,
36423         0x425cd048b54466acL },
36424       { 0xb59cb9be90e9d8bfL,0x991616db3e431b0eL,0xd3aa117a531aecffL,
36425         0x91af92d359f4dc3bL } },
36426     /* 13 << 245 */
36427     { { 0x9b1ec292e93fda29L,0x76bb6c17e97d91bcL,0x7509d95faface1e6L,
36428         0x3653fe47be855ae3L },
36429       { 0x73180b280f680e75L,0x75eefd1beeb6c26cL,0xa4cdf29fb66d4236L,
36430         0x2d70a9976b5821d8L } },
36431     /* 14 << 245 */
36432     { { 0x7a3ee20720445c36L,0x71d1ac8259877174L,0x0fc539f7949f73e9L,
36433         0xd05cf3d7982e3081L },
36434       { 0x8758e20b7b1c7129L,0xffadcc20569e61f2L,0xb05d3a2f59544c2dL,
36435         0xbe16f5c19fff5e53L } },
36436     /* 15 << 245 */
36437     { { 0x73cf65b8aad58135L,0x622c2119037aa5beL,0x79373b3f646fd6a0L,
36438         0x0e029db50d3978cfL },
36439       { 0x8bdfc43794fba037L,0xaefbd687620797a6L,0x3fa5382bbd30d38eL,
36440         0x7627cfbf585d7464L } },
36441     /* 16 << 245 */
36442     { { 0xb2330fef4e4ca463L,0xbcef72873566cc63L,0xd161d2cacf780900L,
36443         0x135dc5395b54827dL },
36444       { 0x638f052e27bf1bc6L,0x10a224f007dfa06cL,0xe973586d6d3321daL,
36445         0x8b0c573826152c8fL } },
36446     /* 17 << 245 */
36447     { { 0x07ef4f2a34606074L,0x80fe7fe8a0f7047aL,0x3d1a8152e1a0e306L,
36448         0x32cf43d888da5222L },
36449       { 0xbf89a95f5f02ffe6L,0x3d9eb9a4806ad3eaL,0x012c17bb79c8e55eL,
36450         0xfdcd1a7499c81dacL } },
36451     /* 18 << 245 */
36452     { { 0x7043178bb9556098L,0x4090a1df801c3886L,0x759800ff9b67b912L,
36453         0x3e5c0304232620c8L },
36454       { 0x4b9d3c4b70dceecaL,0xbb2d3c15181f648eL,0xf981d8376e33345cL,
36455         0xb626289b0cf2297aL } },
36456     /* 19 << 245 */
36457     { { 0x766ac6598baebdcfL,0x1a28ae0975df01e5L,0xb71283da375876d8L,
36458         0x4865a96d607b9800L },
36459       { 0x25dd1bcd237936b2L,0x332f4f4b60417494L,0xd0923d68370a2147L,
36460         0x497f5dfbdc842203L } },
36461     /* 20 << 245 */
36462     { { 0x9dc74cbd32be5e0fL,0x7475bcb717a01375L,0x438477c950d872b1L,
36463         0xcec67879ffe1d63dL },
36464       { 0x9b006014d8578c70L,0xc9ad99a878bb6b8bL,0x6799008e11fb3806L,
36465         0xcfe81435cd44cab3L } },
36466     /* 21 << 245 */
36467     { { 0xa2ee15822f4fb344L,0xb8823450483fa6ebL,0x622d323d652c7749L,
36468         0xd8474a98beb0a15bL },
36469       { 0xe43c154d5d1c00d0L,0x7fd581d90e3e7aacL,0x2b44c6192525ddf8L,
36470         0x67a033ebb8ae9739L } },
36471     /* 22 << 245 */
36472     { { 0x113ffec19ef2d2e4L,0x1bf6767ed5a0ea7fL,0x57fff75e03714c0aL,
36473         0xa23c422e0a23e9eeL },
36474       { 0xdd5f6b2d540f83afL,0xc2c2c27e55ea46a7L,0xeb6b4246672a1208L,
36475         0xd13599f7ae634f7aL } },
36476     /* 23 << 245 */
36477     { { 0xcf914b5cd7b32c6eL,0x61a5a640eaf61814L,0x8dc3df8b208a1bbbL,
36478         0xef627fd6b6d79aa5L },
36479       { 0x44232ffcc4c86bc8L,0xe6f9231b061539feL,0x1d04f25a958b9533L,
36480         0x180cf93449e8c885L } },
36481     /* 24 << 245 */
36482     { { 0x896895959884aaf7L,0xb1959be307b348a6L,0x96250e573c147c87L,
36483         0xae0efb3add0c61f8L },
36484       { 0xed00745eca8c325eL,0x3c911696ecff3f70L,0x73acbc65319ad41dL,
36485         0x7b01a020f0b1c7efL } },
36486     /* 25 << 245 */
36487     { { 0xea32b29363a1483fL,0x89eabe717a248f96L,0x9c6231d3343157e5L,
36488         0x93a375e5df3c546dL },
36489       { 0xe76e93436a2afe69L,0xc4f89100e166c88eL,0x248efd0d4f872093L,
36490         0xae0eb3ea8fe0ea61L } },
36491     /* 26 << 245 */
36492     { { 0xaf89790d9d79046eL,0x4d650f2d6cee0976L,0xa3935d9a43071ecaL,
36493         0x66fcd2c9283b0bfeL },
36494       { 0x0e665eb5696605f1L,0xe77e5d07a54cd38dL,0x90ee050a43d950cfL,
36495         0x86ddebdad32e69b5L } },
36496     /* 27 << 245 */
36497     { { 0x6ad94a3dfddf7415L,0xf7fa13093f6e8d5aL,0xc4831d1de9957f75L,
36498         0x7de28501d5817447L },
36499       { 0x6f1d70789e2aeb6bL,0xba2b9ff4f67a53c2L,0x36963767df9defc3L,
36500         0x479deed30d38022cL } },
36501     /* 28 << 245 */
36502     { { 0xd2edb89b3a8631e8L,0x8de855de7a213746L,0xb2056cb7b00c5f11L,
36503         0xdeaefbd02c9b85e4L },
36504       { 0x03f39a8dd150892dL,0x37b84686218b7985L,0x36296dd8b7375f1aL,
36505         0x472cd4b1b78e898eL } },
36506     /* 29 << 245 */
36507     { { 0x15dff651e9f05de9L,0xd40450692ce98ba9L,0x8466a7ae9b38024cL,
36508         0xb910e700e5a6b5efL },
36509       { 0xae1c56eab3aa8f0dL,0xbab2a5077eee74a6L,0x0dca11e24b4c4620L,
36510         0xfd896e2e4c47d1f4L } },
36511     /* 30 << 245 */
36512     { { 0xeb45ae53308fbd93L,0x46cd5a2e02c36fdaL,0x6a3d4e90baa48385L,
36513         0xdd55e62e9dbe9960L },
36514       { 0xa1406aa02a81ede7L,0x6860dd14f9274ea7L,0xcfdcb0c280414f86L,
36515         0xff410b1022f94327L } },
36516     /* 31 << 245 */
36517     { { 0x5a33cc3849ad467bL,0xefb48b6c0a7335f1L,0x14fb54a4b153a360L,
36518         0x604aa9d2b52469ccL },
36519       { 0x5e9dc486754e48e9L,0x693cb45537471e8eL,0xfb2fd7cd8d3b37b6L,
36520         0x63345e16cf09ff07L } },
36521     /* 32 << 245 */
36522     { { 0x9910ba6b23a5d896L,0x1fe19e357fe4364eL,0x6e1da8c39a33c677L,
36523         0x15b4488b29fd9fd0L },
36524       { 0x1f4392541a1f22bfL,0x920a8a70ab8163e8L,0x3fd1b24907e5658eL,
36525         0xf2c4f79cb6ec839bL } },
36526     /* 33 << 245 */
36527     { { 0x1abbc3d04aa38d1bL,0x3b0db35cb5d9510eL,0x1754ac783e60dec0L,
36528         0x53272fd7ea099b33L },
36529       { 0x5fb0494f07a8e107L,0x4a89e1376a8191faL,0xa113b7f63c4ad544L,
36530         0x88a2e9096cb9897bL } },
36531     /* 34 << 245 */
36532     { { 0x17d55de3b44a3f84L,0xacb2f34417c6c690L,0x3208816810232390L,
36533         0xf2e8a61f6c733bf7L },
36534       { 0xa774aab69c2d7652L,0xfb5307e3ed95c5bcL,0xa05c73c24981f110L,
36535         0x1baae31ca39458c9L } },
36536     /* 35 << 245 */
36537     { { 0x1def185bcbea62e7L,0xe8ac9eaeeaf63059L,0x098a8cfd9921851cL,
36538         0xd959c3f13abe2f5bL },
36539       { 0xa4f1952520e40ae5L,0x320789e307a24aa1L,0x259e69277392b2bcL,
36540         0x58f6c6671918668bL } },
36541     /* 36 << 245 */
36542     { { 0xce1db2bbc55d2d8bL,0x41d58bb7f4f6ca56L,0x7650b6808f877614L,
36543         0x905e16baf4c349edL },
36544       { 0xed415140f661acacL,0x3b8784f0cb2270afL,0x3bc280ac8a402cbaL,
36545         0xd53f71460937921aL } },
36546     /* 37 << 245 */
36547     { { 0xc03c8ee5e5681e83L,0x62126105f6ac9e4aL,0x9503a53f936b1a38L,
36548         0x3d45e2d4782fecbdL },
36549       { 0x69a5c43976e8ae98L,0xb53b2eebbfb4b00eL,0xf167471272386c89L,
36550         0x30ca34a24268bce4L } },
36551     /* 38 << 245 */
36552     { { 0x7f1ed86c78341730L,0x8ef5beb8b525e248L,0xbbc489fdb74fbf38L,
36553         0x38a92a0e91a0b382L },
36554       { 0x7a77ba3f22433ccfL,0xde8362d6a29f05a9L,0x7f6a30ea61189afcL,
36555         0x693b550559ef114fL } },
36556     /* 39 << 245 */
36557     { { 0x50266bc0cd1797a1L,0xea17b47ef4b7af2dL,0xd6c4025c3df9483eL,
36558         0x8cbb9d9fa37b18c9L },
36559       { 0x91cbfd9c4d8424cfL,0xdb7048f1ab1c3506L,0x9eaf641f028206a3L,
36560         0xf986f3f925bdf6ceL } },
36561     /* 40 << 245 */
36562     { { 0x262143b5224c08dcL,0x2bbb09b481b50c91L,0xc16ed709aca8c84fL,
36563         0xa6210d9db2850ca8L },
36564       { 0x6d8df67a09cb54d6L,0x91eef6e0500919a4L,0x90f613810f132857L,
36565         0x9acede47f8d5028bL } },
36566     /* 41 << 245 */
36567     { { 0x844d1b7190b771c3L,0x563b71e4ba6426beL,0x2efa2e83bdb802ffL,
36568         0x3410cbabab5b4a41L },
36569       { 0x555b2d2630da84ddL,0xd0711ae9ee1cc29aL,0xcf3e8c602f547792L,
36570         0x03d7d5dedc678b35L } },
36571     /* 42 << 245 */
36572     { { 0x071a2fa8ced806b8L,0x222e6134697f1478L,0xdc16fd5dabfcdbbfL,
36573         0x44912ebf121b53b8L },
36574       { 0xac9436742496c27cL,0x8ea3176c1ffc26b0L,0xb6e224ac13debf2cL,
36575         0x524cc235f372a832L } },
36576     /* 43 << 245 */
36577     { { 0xd706e1d89f6f1b18L,0x2552f00544cce35bL,0x8c8326c2a88e31fcL,
36578         0xb5468b2cf9552047L },
36579       { 0xce683e883ff90f2bL,0x77947bdf2f0a5423L,0xd0a1b28bed56e328L,
36580         0xaee35253c20134acL } },
36581     /* 44 << 245 */
36582     { { 0x7e98367d3567962fL,0x379ed61f8188bffbL,0x73bba348faf130a1L,
36583         0x6c1f75e1904ed734L },
36584       { 0x189566423b4a79fcL,0xf20bc83d54ef4493L,0x836d425d9111eca1L,
36585         0xe5b5c318009a8dcfL } },
36586     /* 45 << 245 */
36587     { { 0x3360b25d13221bc5L,0x707baad26b3eeaf7L,0xd7279ed8743a95a1L,
36588         0x7450a875969e809fL },
36589       { 0x32b6bd53e5d0338fL,0x1e77f7af2b883bbcL,0x90da12cc1063ecd0L,
36590         0xe2697b58c315be47L } },
36591     /* 46 << 245 */
36592     { { 0x2771a5bdda85d534L,0x53e78c1fff980eeaL,0xadf1cf84900385e7L,
36593         0x7d3b14f6c9387b62L },
36594       { 0x170e74b0cb8f2bd2L,0x2d50b486827fa993L,0xcdbe8c9af6f32babL,
36595         0x55e906b0c3b93ab8L } },
36596     /* 47 << 245 */
36597     { { 0x747f22fc8fe280d1L,0xcd8e0de5b2e114abL,0x5ab7dbebe10b68b0L,
36598         0x9dc63a9ca480d4b2L },
36599       { 0x78d4bc3b4be1495fL,0x25eb3db89359122dL,0x3f8ac05b0809cbdcL,
36600         0xbf4187bbd37c702fL } },
36601     /* 48 << 245 */
36602     { { 0x84cea0691416a6a5L,0x8f860c7943ef881cL,0x41311f8a38038a5dL,
36603         0xe78c2ec0fc612067L },
36604       { 0x494d2e815ad73581L,0xb4cc9e0059604097L,0xff558aecf3612cbaL,
36605         0x35beef7a9e36c39eL } },
36606     /* 49 << 245 */
36607     { { 0x1845c7cfdbcf41b9L,0x5703662aaea997c0L,0x8b925afee402f6d8L,
36608         0xd0a1b1ae4dd72162L },
36609       { 0x9f47b37503c41c4bL,0xa023829b0391d042L,0x5f5045c3503b8b0aL,
36610         0x123c268898c010e5L } },
36611     /* 50 << 245 */
36612     { { 0x324ec0cc36ba06eeL,0xface31153dd2cc0cL,0xb364f3bef333e91fL,
36613         0xef8aff7328e832b0L },
36614       { 0x1e9bad042d05841bL,0x42f0e3df356a21e2L,0xa3270bcb4add627eL,
36615         0xb09a8158d322e711L } },
36616     /* 51 << 245 */
36617     { { 0x86e326a10fee104aL,0xad7788f83703f65dL,0x7e76543047bc4833L,
36618         0x6cee582b2b9b893aL },
36619       { 0x9cd2a167e8f55a7bL,0xefbee3c6d9e4190dL,0x33ee7185d40c2e9dL,
36620         0x844cc9c5a380b548L } },
36621     /* 52 << 245 */
36622     { { 0x323f8ecd66926e04L,0x0001e38f8110c1baL,0x8dbcac12fc6a7f07L,
36623         0xd65e1d580cec0827L },
36624       { 0xd2cd4141be76ca2dL,0x7895cf5ce892f33aL,0x956d230d367139d2L,
36625         0xa91abd3ed012c4c1L } },
36626     /* 53 << 245 */
36627     { { 0x34fa488387eb36bfL,0xc5f07102914b8fb4L,0x90f0e579adb9c95fL,
36628         0xfe6ea8cb28888195L },
36629       { 0x7b9b5065edfa9284L,0x6c510bd22b8c8d65L,0xd7b8ebefcbe8aafdL,
36630         0xedb3af9896b1da07L } },
36631     /* 54 << 245 */
36632     { { 0x28ff779d6295d426L,0x0c4f6ac73fa3ad7bL,0xec44d0548b8e2604L,
36633         0x9b32a66d8b0050e1L },
36634       { 0x1f943366f0476ce2L,0x7554d953a602c7b4L,0xbe35aca6524f2809L,
36635         0xb6881229fd4edbeaL } },
36636     /* 55 << 245 */
36637     { { 0xe8cd0c8f508efb63L,0x9eb5b5c86abcefc7L,0xf5621f5fb441ab4fL,
36638         0x79e6c046b76a2b22L },
36639       { 0x74a4792ce37a1f69L,0xcbd252cb03542b60L,0x785f65d5b3c20bd3L,
36640         0x8dea61434fabc60cL } },
36641     /* 56 << 245 */
36642     { { 0x45e21446de673629L,0x57f7aa1e703c2d21L,0xa0e99b7f98c868c7L,
36643         0x4e42f66d8b641676L },
36644       { 0x602884dc91077896L,0xa0d690cfc2c9885bL,0xfeb4da333b9a5187L,
36645         0x5f789598153c87eeL } },
36646     /* 57 << 245 */
36647     { { 0x2192dd4752b16dbaL,0xdeefc0e63524c1b1L,0x465ea76ee4383693L,
36648         0x79401711361b8d98L },
36649       { 0xa5f9ace9f21a15cbL,0x73d26163efee9aebL,0xcca844b3e677016cL,
36650         0x6c122b0757eaee06L } },
36651     /* 58 << 245 */
36652     { { 0xb782dce715f09690L,0x508b9b122dfc0fc9L,0x9015ab4b65d89fc6L,
36653         0x5e79dab7d6d5bb0fL },
36654       { 0x64f021f06c775aa2L,0xdf09d8cc37c7eca1L,0x9a761367ef2fa506L,
36655         0xed4ca4765b81eec6L } },
36656     /* 59 << 245 */
36657     { { 0x262ede3610bbb8b5L,0x0737ce830641ada3L,0x4c94288ae9831cccL,
36658         0x487fc1ce8065e635L },
36659       { 0xb13d7ab3b8bb3659L,0xdea5df3e855e4120L,0xb9a1857385eb0244L,
36660         0x1a1b8ea3a7cfe0a3L } },
36661     /* 60 << 245 */
36662     { { 0x3b83711967b0867cL,0x8d5e0d089d364520L,0x52dccc1ed930f0e3L,
36663         0xefbbcec7bf20bbafL },
36664       { 0x99cffcab0263ad10L,0xd8199e6dfcd18f8aL,0x64e2773fe9f10617L,
36665         0x0079e8e108704848L } },
36666     /* 61 << 245 */
36667     { { 0x1169989f8a342283L,0x8097799ca83012e6L,0xece966cb8a6a9001L,
36668         0x93b3afef072ac7fcL },
36669       { 0xe6893a2a2db3d5baL,0x263dc46289bf4fdcL,0x8852dfc9e0396673L,
36670         0x7ac708953af362b6L } },
36671     /* 62 << 245 */
36672     { { 0xbb9cce4d5c2f342bL,0xbf80907ab52d7aaeL,0x97f3d3cd2161bcd0L,
36673         0xb25b08340962744dL },
36674       { 0xc5b18ea56c3a1ddaL,0xfe4ec7eb06c92317L,0xb787b890ad1c4afeL,
36675         0xdccd9a920ede801aL } },
36676     /* 63 << 245 */
36677     { { 0x9ac6dddadb58da1fL,0x22bbc12fb8cae6eeL,0xc6f8bced815c4a43L,
36678         0x8105a92cf96480c7L },
36679       { 0x0dc3dbf37a859d51L,0xe3ec7ce63041196bL,0xd9f64b250d1067c9L,
36680         0xf23213213d1f8dd8L } },
36681     /* 64 << 245 */
36682     { { 0x8b5c619c76497ee8L,0x5d2b0ac6c717370eL,0x98204cb64fcf68e1L,
36683         0x0bdec21162bc6792L },
36684       { 0x6973ccefa63b1011L,0xf9e3fa97e0de1ac5L,0x5efb693e3d0e0c8bL,
36685         0x037248e9d2d4fcb4L } },
36686     /* 0 << 252 */
36687     { { 0x00, 0x00, 0x00, 0x00 },
36688       { 0x00, 0x00, 0x00, 0x00 } },
36689     /* 1 << 252 */
36690     { { 0x80802dc91ec34f9eL,0xd8772d3533810603L,0x3f06d66c530cb4f3L,
36691         0x7be5ed0dc475c129L },
36692       { 0xcb9e3c1931e82b10L,0xc63d2857c9ff6b4cL,0xb92118c692a1b45eL,
36693         0x0aec44147285bbcaL } },
36694     /* 2 << 252 */
36695     { { 0xfc189ae71e29a3efL,0xcbe906f04c93302eL,0xd0107914ceaae10eL,
36696         0xb7a23f34b68e19f8L },
36697       { 0xe9d875c2efd2119dL,0x03198c6efcadc9c8L,0x65591bf64da17113L,
36698         0x3cf0bbf83d443038L } },
36699     /* 3 << 252 */
36700     { { 0xae485bb72b724759L,0x945353e1b2d4c63aL,0x82159d07de7d6f2cL,
36701         0x389caef34ec5b109L },
36702       { 0x4a8ebb53db65ef14L,0x2dc2cb7edd99de43L,0x816fa3ed83f2405fL,
36703         0x73429bb9c14208a3L } },
36704     /* 4 << 252 */
36705     { { 0xb618d590b01e6e27L,0x047e2ccde180b2dcL,0xd1b299b504aea4a9L,
36706         0x412c9e1e9fa403a4L },
36707       { 0x88d28a3679407552L,0x49c50136f332b8e3L,0x3a1b6fcce668de19L,
36708         0x178851bc75122b97L } },
36709     /* 5 << 252 */
36710     { { 0xb1e13752fb85fa4cL,0xd61257ce383c8ce9L,0xd43da670d2f74daeL,
36711         0xa35aa23fbf846bbbL },
36712       { 0x5e74235d4421fc83L,0xf6df8ee0c363473bL,0x34d7f52a3c4aa158L,
36713         0x50d05aab9bc6d22eL } },
36714     /* 6 << 252 */
36715     { { 0x8c56e735a64785f4L,0xbc56637b5f29cd07L,0x53b2bb803ee35067L,
36716         0x50235a0fdc919270L },
36717       { 0x191ab6d8f2c4aa65L,0xc34758318396023bL,0x80400ba5f0f805baL,
36718         0x8881065b5ec0f80fL } },
36719     /* 7 << 252 */
36720     { { 0xc370e522cc1b5e83L,0xde2d4ad1860b8bfbL,0xad364df067b256dfL,
36721         0x8f12502ee0138997L },
36722       { 0x503fa0dc7783920aL,0xe80014adc0bc866aL,0x3f89b744d3064ba6L,
36723         0x03511dcdcba5dba5L } },
36724     /* 8 << 252 */
36725     { { 0x197dd46d95a7b1a2L,0x9c4e7ad63c6341fbL,0x426eca29484c2eceL,
36726         0x9211e489de7f4f8aL },
36727       { 0x14997f6ec78ef1f4L,0x2b2c091006574586L,0x17286a6e1c3eede8L,
36728         0x25f92e470f60e018L } },
36729     /* 9 << 252 */
36730     { { 0x805c564631890a36L,0x703ef60057feea5bL,0x389f747caf3c3030L,
36731         0xe0e5daeb54dd3739L },
36732       { 0xfe24a4c3c9c9f155L,0x7e4bf176b5393962L,0x37183de2af20bf29L,
36733         0x4a1bd7b5f95a8c3bL } },
36734     /* 10 << 252 */
36735     { { 0xa83b969946191d3dL,0x281fc8dd7b87f257L,0xb18e2c1354107588L,
36736         0x6372def79b2bafe8L },
36737       { 0xdaf4bb480d8972caL,0x3f2dd4b756167a3fL,0x1eace32d84310cf4L,
36738         0xe3bcefafe42700aaL } },
36739     /* 11 << 252 */
36740     { { 0x5fe5691ed785e73dL,0xa5db5ab62ea60467L,0x02e23d41dfc6514aL,
36741         0x35e8048ee03c3665L },
36742       { 0x3f8b118f1adaa0f8L,0x28ec3b4584ce1a5aL,0xe8cacc6e2c6646b8L,
36743         0x1343d185dbd0e40fL } },
36744     /* 12 << 252 */
36745     { { 0xe5d7f844caaa358cL,0x1a1db7e49924182aL,0xd64cd42d9c875d9aL,
36746         0xb37b515f042eeec8L },
36747       { 0x4d4dd4097b165fbeL,0xfc322ed9e206eff3L,0x7dee410259b7e17eL,
36748         0x55a481c08236ca00L } },
36749     /* 13 << 252 */
36750     { { 0x8c885312c23fc975L,0x1571580605d6297bL,0xa078868ef78edd39L,
36751         0x956b31e003c45e52L },
36752       { 0x470275d5ff7b33a6L,0xc8d5dc3a0c7e673fL,0x419227b47e2f2598L,
36753         0x8b37b6344c14a975L } },
36754     /* 14 << 252 */
36755     { { 0xd0667ed68b11888cL,0x5e0e8c3e803e25dcL,0x34e5d0dcb987a24aL,
36756         0x9f40ac3bae920323L },
36757       { 0x5463de9534e0f63aL,0xa128bf926b6328f9L,0x491ccd7cda64f1b7L,
36758         0x7ef1ec27c47bde35L } },
36759     /* 15 << 252 */
36760     { { 0xa857240fa36a2737L,0x35dc136663621bc1L,0x7a3a6453d4fb6897L,
36761         0x80f1a439c929319dL },
36762       { 0xfc18274bf8cb0ba0L,0xb0b537668078c5ebL,0xfb0d49241e01d0efL,
36763         0x50d7c67d372ab09cL } },
36764     /* 16 << 252 */
36765     { { 0xb4e370af3aeac968L,0xe4f7fee9c4b63266L,0xb4acd4c2e3ac5664L,
36766         0xf8910bd2ceb38cbfL },
36767       { 0x1c3ae50cc9c0726eL,0x15309569d97b40bfL,0x70884b7ffd5a5a1bL,
36768         0x3890896aef8314cdL } },
36769     /* 17 << 252 */
36770     { { 0x58e1515ca5618c93L,0xe665432b77d942d1L,0xb32181bfb6f767a8L,
36771         0x753794e83a604110L },
36772       { 0x09afeb7ce8c0dbccL,0x31e02613598673a3L,0x5d98e5577d46db00L,
36773         0xfc21fb8c9d985b28L } },
36774     /* 18 << 252 */
36775     { { 0xc9040116b0843e0bL,0x53b1b3a869b04531L,0xdd1649f085d7d830L,
36776         0xbb3bcc87cb7427e8L },
36777       { 0x77261100c93dce83L,0x7e79da61a1922a2aL,0x587a2b02f3149ce8L,
36778         0x147e1384de92ec83L } },
36779     /* 19 << 252 */
36780     { { 0x484c83d3af077f30L,0xea78f8440658b53aL,0x912076c2027aec53L,
36781         0xf34714e393c8177dL },
36782       { 0x37ef5d15c2376c84L,0x8315b6593d1aa783L,0x3a75c484ef852a90L,
36783         0x0ba0c58a16086bd4L } },
36784     /* 20 << 252 */
36785     { { 0x29688d7a529a6d48L,0x9c7f250dc2f19203L,0x123042fb682e2df9L,
36786         0x2b7587e7ad8121bcL },
36787       { 0x30fc0233e0182a65L,0xb82ecf87e3e1128aL,0x7168286193fb098fL,
36788         0x043e21ae85e9e6a7L } },
36789     /* 21 << 252 */
36790     { { 0xab5b49d666c834eaL,0x3be43e1847414287L,0xf40fb859219a2a47L,
36791         0x0e6559e9cc58df3cL },
36792       { 0xfe1dfe8e0c6615b4L,0x14abc8fd56459d70L,0x7be0fa8e05de0386L,
36793         0x8e63ef68e9035c7cL } },
36794     /* 22 << 252 */
36795     { { 0x116401b453b31e91L,0x0cba7ad44436b4d8L,0x9151f9a0107afd66L,
36796         0xafaca8d01f0ee4c4L },
36797       { 0x75fe5c1d9ee9761cL,0x3497a16bf0c0588fL,0x3ee2bebd0304804cL,
36798         0xa8fb9a60c2c990b9L } },
36799     /* 23 << 252 */
36800     { { 0xd14d32fe39251114L,0x36bf25bccac73366L,0xc9562c66dba7495cL,
36801         0x324d301b46ad348bL },
36802       { 0x9f46620cd670407eL,0x0ea8d4f1e3733a01L,0xd396d532b0c324e0L,
36803         0x5b211a0e03c317cdL } },
36804     /* 24 << 252 */
36805     { { 0x090d7d205ffe7b37L,0x3b7f3efb1747d2daL,0xa2cb525fb54fc519L,
36806         0x6e220932f66a971eL },
36807       { 0xddc160dfb486d440L,0x7fcfec463fe13465L,0x83da7e4e76e4c151L,
36808         0xd6fa48a1d8d302b5L } },
36809     /* 25 << 252 */
36810     { { 0xc6304f265872cd88L,0x806c1d3c278b90a1L,0x3553e725caf0bc1cL,
36811         0xff59e603bb9d8d5cL },
36812       { 0xa4550f327a0b85ddL,0xdec5720a93ecc217L,0x0b88b74169d62213L,
36813         0x7212f2455b365955L } },
36814     /* 26 << 252 */
36815     { { 0x20764111b5cae787L,0x13cb7f581dfd3124L,0x2dca77da1175aefbL,
36816         0xeb75466bffaae775L },
36817       { 0x74d76f3bdb6cff32L,0x7440f37a61fcda9aL,0x1bb3ac92b525028bL,
36818         0x20fbf8f7a1975f29L } },
36819     /* 27 << 252 */
36820     { { 0x982692e1df83097fL,0x28738f6c554b0800L,0xdc703717a2ce2f2fL,
36821         0x7913b93c40814194L },
36822       { 0x049245931fe89636L,0x7b98443ff78834a6L,0x11c6ab015114a5a1L,
36823         0x60deb383ffba5f4cL } },
36824     /* 28 << 252 */
36825     { { 0x4caa54c601a982e6L,0x1dd35e113491cd26L,0x973c315f7cbd6b05L,
36826         0xcab0077552494724L },
36827       { 0x04659b1f6565e15aL,0xbf30f5298c8fb026L,0xfc21641ba8a0de37L,
36828         0xe9c7a366fa5e5114L } },
36829     /* 29 << 252 */
36830     { { 0xdb849ca552f03ad8L,0xc7e8dbe9024e35c0L,0xa1a2bbaccfc3c789L,
36831         0xbf733e7d9c26f262L },
36832       { 0x882ffbf5b8444823L,0xb7224e886bf8483bL,0x53023b8b65bef640L,
36833         0xaabfec91d4d5f8cdL } },
36834     /* 30 << 252 */
36835     { { 0xa40e1510079ea1bdL,0x1ad9addcd05d5d26L,0xdb3f2eab13e68d4fL,
36836         0x1cff1ae2640f803fL },
36837       { 0xe0e7b749d4cee117L,0x8e9f275b4036d909L,0xce34e31d8f4d4c38L,
36838         0x22b37f69d75130fcL } },
36839     /* 31 << 252 */
36840     { { 0x83e0f1fdb4014604L,0xa8ce991989415078L,0x82375b7541792efeL,
36841         0x4f59bf5c97d4515bL },
36842       { 0xac4f324f923a277dL,0xd9bc9b7d650f3406L,0xc6fa87d18a39bc51L,
36843         0x825885305ccc108fL } },
36844     /* 32 << 252 */
36845     { { 0x5ced3c9f82e4c634L,0x8efb83143a4464f8L,0xe706381b7a1dca25L,
36846         0x6cd15a3c5a2a412bL },
36847       { 0x9347a8fdbfcd8fb5L,0x31db2eef6e54cd22L,0xc4aeb11ef8d8932fL,
36848         0x11e7c1ed344411afL } },
36849     /* 33 << 252 */
36850     { { 0x2653050cdc9a151eL,0x9edbfc083bb0a859L,0x926c81c7fd5691e7L,
36851         0x9c1b23426f39019aL },
36852       { 0x64a81c8b7f8474b9L,0x90657c0701761819L,0x390b333155e0375aL,
36853         0xc676c626b6ebc47dL } },
36854     /* 34 << 252 */
36855     { { 0x51623247b7d6dee8L,0x0948d92779659313L,0x99700161e9ab35edL,
36856         0x06cc32b48ddde408L },
36857       { 0x6f2fd664061ef338L,0x1606fa02c202e9edL,0x55388bc1929ba99bL,
36858         0xc4428c5e1e81df69L } },
36859     /* 35 << 252 */
36860     { { 0xce2028aef91b0b2aL,0xce870a23f03dfd3fL,0x66ec2c870affe8edL,
36861         0xb205fb46284d0c00L },
36862       { 0xbf5dffe744cefa48L,0xb6fc37a8a19876d7L,0xbecfa84c08b72863L,
36863         0xd7205ff52576374fL } },
36864     /* 36 << 252 */
36865     { { 0x80330d328887de41L,0x5de0df0c869ea534L,0x13f427533c56ea17L,
36866         0xeb1f6069452b1a78L },
36867       { 0x50474396e30ea15cL,0x575816a1c1494125L,0xbe1ce55bfe6bb38fL,
36868         0xb901a94896ae30f7L } },
36869     /* 37 << 252 */
36870     { { 0xe5af0f08d8fc3548L,0x5010b5d0d73bfd08L,0x993d288053fe655aL,
36871         0x99f2630b1c1309fdL },
36872       { 0xd8677bafb4e3b76fL,0x14e51ddcb840784bL,0x326c750cbf0092ceL,
36873         0xc83d306bf528320fL } },
36874     /* 38 << 252 */
36875     { { 0xc445671577d4715cL,0xd30019f96b703235L,0x207ccb2ed669e986L,
36876         0x57c824aff6dbfc28L },
36877       { 0xf0eb532fd8f92a23L,0x4a557fd49bb98fd2L,0xa57acea7c1e6199aL,
36878         0x0c6638208b94b1edL } },
36879     /* 39 << 252 */
36880     { { 0x9b42be8ff83a9266L,0xc7741c970101bd45L,0x95770c1107bd9cebL,
36881         0x1f50250a8b2e0744L },
36882       { 0xf762eec81477b654L,0xc65b900e15efe59aL,0x88c961489546a897L,
36883         0x7e8025b3c30b4d7cL } },
36884     /* 40 << 252 */
36885     { { 0xae4065ef12045cf9L,0x6fcb2caf9ccce8bdL,0x1fa0ba4ef2cf6525L,
36886         0xf683125dcb72c312L },
36887       { 0xa01da4eae312410eL,0x67e286776cd8e830L,0xabd9575298fb3f07L,
36888         0x05f11e11eef649a5L } },
36889     /* 41 << 252 */
36890     { { 0xba47faef9d3472c2L,0x3adff697c77d1345L,0x4761fa04dd15afeeL,
36891         0x64f1f61ab9e69462L },
36892       { 0xfa691fab9bfb9093L,0x3df8ae8fa1133dfeL,0xcd5f896758cc710dL,
36893         0xfbb88d5016c7fe79L } },
36894     /* 42 << 252 */
36895     { { 0x8e011b4ce88c50d1L,0x7532e807a8771c4fL,0x64c78a48e2278ee4L,
36896         0x0b283e833845072aL },
36897       { 0x98a6f29149e69274L,0xb96e96681868b21cL,0x38f0adc2b1a8908eL,
36898         0x90afcff71feb829dL } },
36899     /* 43 << 252 */
36900     { { 0x9915a383210b0856L,0xa5a80602def04889L,0x800e9af97c64d509L,
36901         0x81382d0bb8996f6fL },
36902       { 0x490eba5381927e27L,0x46c63b324af50182L,0x784c5fd9d3ad62ceL,
36903         0xe4fa1870f8ae8736L } },
36904     /* 44 << 252 */
36905     { { 0x4ec9d0bcd7466b25L,0x84ddbe1adb235c65L,0x5e2645ee163c1688L,
36906         0x570bd00e00eba747L },
36907       { 0xfa51b629128bfa0fL,0x92fce1bd6c1d3b68L,0x3e7361dcb66778b1L,
36908         0x9c7d249d5561d2bbL } },
36909     /* 45 << 252 */
36910     { { 0xa40b28bf0bbc6229L,0x1c83c05edfd91497L,0x5f9f5154f083df05L,
36911         0xbac38b3ceee66c9dL },
36912       { 0xf71db7e3ec0dfcfdL,0xf2ecda8e8b0a8416L,0x52fddd867812aa66L,
36913         0x2896ef104e6f4272L } },
36914     /* 46 << 252 */
36915     { { 0xff27186a0fe9a745L,0x08249fcd49ca70dbL,0x7425a2e6441cac49L,
36916         0xf4a0885aece5ff57L },
36917       { 0x6e2cb7317d7ead58L,0xf96cf7d61898d104L,0xafe67c9d4f2c9a89L,
36918         0x89895a501c7bf5bcL } },
36919     /* 47 << 252 */
36920     { { 0xdc7cb8e5573cecfaL,0x66497eaed15f03e6L,0x6bc0de693f084420L,
36921         0x323b9b36acd532b0L },
36922       { 0xcfed390a0115a3c1L,0x9414c40b2d65ca0eL,0x641406bd2f530c78L,
36923         0x29369a44833438f2L } },
36924     /* 48 << 252 */
36925     { { 0x996884f5903fa271L,0xe6da0fd2b9da921eL,0xa6f2f2695db01e54L,
36926         0x1ee3e9bd6876214eL },
36927       { 0xa26e181ce27a9497L,0x36d254e48e215e04L,0x42f32a6c252cabcaL,
36928         0x9948148780b57614L } },
36929     /* 49 << 252 */
36930     { { 0x4c4dfe6940d9cae1L,0x0586958011a10f09L,0xca287b573491b64bL,
36931         0x77862d5d3fd4a53bL },
36932       { 0xbf94856e50349126L,0x2be30bd171c5268fL,0x10393f19cbb650a6L,
36933         0x639531fe778cf9fdL } },
36934     /* 50 << 252 */
36935     { { 0x02556a11b2935359L,0xda38aa96af8c126eL,0x47dbe6c20960167fL,
36936         0x37bbabb6501901cdL },
36937       { 0xb6e979e02c947778L,0xd69a51757a1a1dc6L,0xc3ed50959d9faf0cL,
36938         0x4dd9c0961d5fa5f0L } },
36939     /* 51 << 252 */
36940     { { 0xa0c4304d64f16ea8L,0x8b1cac167e718623L,0x0b5765467c67f03eL,
36941         0x559cf5adcbd88c01L },
36942       { 0x074877bb0e2af19aL,0x1f717ec1a1228c92L,0x70bcb800326e8920L,
36943         0xec6e2c5c4f312804L } },
36944     /* 52 << 252 */
36945     { { 0x426aea7d3fca4752L,0xf12c09492211f62aL,0x24beecd87be7b6b5L,
36946         0xb77eaf4c36d7a27dL },
36947       { 0x154c2781fda78fd3L,0x848a83b0264eeabeL,0x81287ef04ffe2bc4L,
36948         0x7b6d88c6b6b6fc2aL } },
36949     /* 53 << 252 */
36950     { { 0x805fb947ce417d99L,0x4b93dcc38b916cc4L,0x72e65bb321273323L,
36951         0xbcc1badd6ea9886eL },
36952       { 0x0e2230114bc5ee85L,0xa561be74c18ee1e4L,0x762fd2d4a6bcf1f1L,
36953         0x50e6a5a495231489L } },
36954     /* 54 << 252 */
36955     { { 0xca96001fa00b500bL,0x5c098cfc5d7dcdf5L,0xa64e2d2e8c446a85L,
36956         0xbae9bcf1971f3c62L },
36957       { 0x4ec226838435a2c5L,0x8ceaed6c4bad4643L,0xe9f8fb47ccccf4e3L,
36958         0xbd4f3fa41ce3b21eL } },
36959     /* 55 << 252 */
36960     { { 0xd79fb110a3db3292L,0xe28a37dab536c66aL,0x279ce87b8e49e6a9L,
36961         0x70ccfe8dfdcec8e3L },
36962       { 0x2193e4e03ba464b2L,0x0f39d60eaca9a398L,0x7d7932aff82c12abL,
36963         0xd8ff50ed91e7e0f7L } },
36964     /* 56 << 252 */
36965     { { 0xea961058fa28a7e0L,0xc726cf250bf5ec74L,0xe74d55c8db229666L,
36966         0x0bd9abbfa57f5799L },
36967       { 0x7479ef074dfc47b3L,0xd9c65fc30c52f91dL,0x8e0283fe36a8bde2L,
36968         0xa32a8b5e7d4b7280L } },
36969     /* 57 << 252 */
36970     { { 0x6a677c6112e83233L,0x0fbb3512dcc9bf28L,0x562e8ea50d780f61L,
36971         0x0db8b22b1dc4e89cL },
36972       { 0x0a6fd1fb89be0144L,0x8c77d246ca57113bL,0x4639075dff09c91cL,
36973         0x5b47b17f5060824cL } },
36974     /* 58 << 252 */
36975     { { 0x58aea2b016287b52L,0xa1343520d0cd8eb0L,0x6148b4d0c5d58573L,
36976         0xdd2b6170291c68aeL },
36977       { 0xa61b39291da3b3b7L,0x5f946d7908c4ac10L,0x4105d4a57217d583L,
36978         0x5061da3d25e6de5eL } },
36979     /* 59 << 252 */
36980     { { 0x3113940dec1b4991L,0xf12195e136f485aeL,0xa7507fb2731a2ee0L,
36981         0x95057a8e6e9e196eL },
36982       { 0xa3c2c9112e130136L,0x97dfbb3633c60d15L,0xcaf3c581b300ee2bL,
36983         0x77f25d90f4bac8b8L } },
36984     /* 60 << 252 */
36985     { { 0xdb1c4f986d840cd6L,0x471d62c0e634288cL,0x8ec2f85ecec8a161L,
36986         0x41f37cbcfa6f4ae2L },
36987       { 0x6793a20f4b709985L,0x7a7bd33befa8985bL,0x2c6a3fbd938e6446L,
36988         0x190426192a8d47c1L } },
36989     /* 61 << 252 */
36990     { { 0x16848667cc36975fL,0x02acf1689d5f1dfbL,0x62d41ad4613baa94L,
36991         0xb56fbb929f684670L },
36992       { 0xce610d0de9e40569L,0x7b99c65f35489fefL,0x0c88ad1b3df18b97L,
36993         0x81b7d9be5d0e9edbL } },
36994     /* 62 << 252 */
36995     { { 0xd85218c0c716cc0aL,0xf4b5ff9085691c49L,0xa4fd666bce356ac6L,
36996         0x17c728954b327a7aL },
36997       { 0xf93d5085da6be7deL,0xff71530e3301d34eL,0x4cd96442d8f448e8L,
36998         0x9283d3312ed18ffaL } },
36999     /* 63 << 252 */
37000     { { 0x4d33dd992a849870L,0xa716964b41576335L,0xff5e3a9b179be0e5L,
37001         0x5b9d6b1b83b13632L },
37002       { 0x3b8bd7d4a52f313bL,0xc9dd95a0637a4660L,0x300359620b3e218fL,
37003         0xce1481a3c7b28a3cL } },
37004     /* 64 << 252 */
37005     { { 0xab41b43a43228d83L,0x24ae1c304ad63f99L,0x8e525f1a46a51229L,
37006         0x14af860fcd26d2b4L },
37007       { 0xd6baef613f714aa1L,0xf51865adeb78795eL,0xd3e21fcee6a9d694L,
37008         0x82ceb1dd8a37b527L } },
37009 };
37010 
37011 /* Multiply the point by the scalar and return the result.
37012  * If map is true then convert result to affine coordinates.
37013  *
37014  * Pre-computed table containing multiples of g times powers of 2.
37015  * Width between powers is 7 bits.
37016  * Accumulate into the result.
37017  *
37018  * r      Resulting point.
37019  * g      Point to scalar multiply.
37020  * k      Scalar to multiply by.
37021  * table  Pre-computed table of points.
37022  * map    Indicates whether to convert result to affine.
37023  * ct     Constant time required.
37024  * heap   Heap to use for allocation.
37025  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
37026  */
sp_256_ecc_mulmod_add_only_4(sp_point_256 * r,const sp_point_256 * g,const sp_table_entry_256 * table,const sp_digit * k,int map,int ct,void * heap)37027 static int sp_256_ecc_mulmod_add_only_4(sp_point_256* r, const sp_point_256* g,
37028         const sp_table_entry_256* table, const sp_digit* k, int map,
37029         int ct, void* heap)
37030 {
37031 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37032     sp_point_256* rt = NULL;
37033     sp_digit* tmp = NULL;
37034 #else
37035     sp_point_256 rt[2];
37036     sp_digit tmp[2 * 4 * 5];
37037 #endif
37038     sp_point_256* p = NULL;
37039     sp_digit* negy = NULL;
37040     int i;
37041     ecc_recode_256 v[37];
37042     int err = MP_OKAY;
37043 
37044     (void)g;
37045     (void)ct;
37046     (void)heap;
37047 
37048 
37049 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37050     rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
37051                                      DYNAMIC_TYPE_ECC);
37052     if (rt == NULL)
37053         err = MEMORY_E;
37054     if (err == MP_OKAY) {
37055         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap,
37056                                  DYNAMIC_TYPE_ECC);
37057         if (tmp == NULL)
37058             err = MEMORY_E;
37059     }
37060 #endif
37061 
37062     if (err == MP_OKAY) {
37063         negy = tmp;
37064         p = rt + 1;
37065     }
37066 
37067     if (err == MP_OKAY) {
37068         sp_256_ecc_recode_7_4(k, v);
37069 
37070         XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
37071         XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
37072 
37073         i = 36;
37074     #ifndef WC_NO_CACHE_RESISTANT
37075         if (ct) {
37076             sp_256_get_entry_65_4(rt, &table[i * 65], v[i].i);
37077         }
37078         else
37079     #endif
37080         {
37081             XMEMCPY(rt->x, table[i * 65 + v[i].i].x, sizeof(table->x));
37082             XMEMCPY(rt->y, table[i * 65 + v[i].i].y, sizeof(table->y));
37083         }
37084         rt->infinity = !v[i].i;
37085         for (--i; i>=0; i--) {
37086         #ifndef WC_NO_CACHE_RESISTANT
37087             if (ct) {
37088                 sp_256_get_entry_65_4(p, &table[i * 65], v[i].i);
37089             }
37090             else
37091         #endif
37092             {
37093                 XMEMCPY(p->x, table[i * 65 + v[i].i].x, sizeof(table->x));
37094                 XMEMCPY(p->y, table[i * 65 + v[i].i].y, sizeof(table->y));
37095             }
37096             p->infinity = !v[i].i;
37097             sp_256_sub_4(negy, p256_mod, p->y);
37098             sp_256_norm_4(negy);
37099             sp_256_cond_copy_4(p->y, negy, 0 - v[i].neg);
37100             sp_256_proj_point_add_qz1_4(rt, rt, p, tmp);
37101         }
37102         if (map != 0) {
37103             sp_256_map_4(r, rt, tmp);
37104         }
37105         else {
37106             XMEMCPY(r, rt, sizeof(sp_point_256));
37107         }
37108     }
37109 
37110 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37111     if (tmp != NULL)
37112 #endif
37113     {
37114         ForceZero(tmp, sizeof(sp_digit) * 2 * 4 * 5);
37115     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37116         XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
37117     #endif
37118     }
37119 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37120     if (rt != NULL)
37121         XFREE(rt, heap, DYNAMIC_TYPE_ECC);
37122 #endif
37123 
37124     return MP_OKAY;
37125 }
37126 
37127 /* Multiply the base point of P256 by the scalar and return the result.
37128  * If map is true then convert result to affine coordinates.
37129  *
37130  * r     Resulting point.
37131  * k     Scalar to multiply by.
37132  * map   Indicates whether to convert result to affine.
37133  * ct    Constant time required.
37134  * heap  Heap to use for allocation.
37135  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
37136  */
sp_256_ecc_mulmod_base_4(sp_point_256 * r,const sp_digit * k,int map,int ct,void * heap)37137 static int sp_256_ecc_mulmod_base_4(sp_point_256* r, const sp_digit* k,
37138         int map, int ct, void* heap)
37139 {
37140     return sp_256_ecc_mulmod_add_only_4(r, NULL, p256_table,
37141                                       k, map, ct, heap);
37142 }
37143 
37144 #endif /* WOLFSSL_SP_SMALL */
37145 /* Multiply the base point of P256 by the scalar and return the result.
37146  * If map is true then convert result to affine coordinates.
37147  *
37148  * km    Scalar to multiply by.
37149  * r     Resulting point.
37150  * map   Indicates whether to convert result to affine.
37151  * heap  Heap to use for allocation.
37152  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
37153  */
sp_ecc_mulmod_base_256(const mp_int * km,ecc_point * r,int map,void * heap)37154 int sp_ecc_mulmod_base_256(const mp_int* km, ecc_point* r, int map, void* heap)
37155 {
37156 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37157     sp_point_256* point = NULL;
37158     sp_digit* k = NULL;
37159 #else
37160     sp_point_256  point[1];
37161     sp_digit k[4];
37162 #endif
37163     int err = MP_OKAY;
37164 
37165 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37166     point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
37167                                          DYNAMIC_TYPE_ECC);
37168     if (point == NULL)
37169         err = MEMORY_E;
37170     if (err == MP_OKAY) {
37171         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4, heap,
37172                                DYNAMIC_TYPE_ECC);
37173         if (k == NULL)
37174             err = MEMORY_E;
37175     }
37176 #endif
37177 
37178     if (err == MP_OKAY) {
37179         sp_256_from_mp(k, 4, km);
37180 
37181             err = sp_256_ecc_mulmod_base_4(point, k, map, 1, heap);
37182     }
37183     if (err == MP_OKAY) {
37184         err = sp_256_point_to_ecc_point_4(point, r);
37185     }
37186 
37187 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37188     if (k != NULL)
37189         XFREE(k, heap, DYNAMIC_TYPE_ECC);
37190     if (point != NULL)
37191         XFREE(point, heap, DYNAMIC_TYPE_ECC);
37192 #endif
37193 
37194     return err;
37195 }
37196 
37197 /* Multiply the base point of P256 by the scalar, add point a and return
37198  * the result. If map is true then convert result to affine coordinates.
37199  *
37200  * km      Scalar to multiply by.
37201  * am      Point to add to scalar mulitply result.
37202  * inMont  Point to add is in montgomery form.
37203  * r       Resulting point.
37204  * map     Indicates whether to convert result to affine.
37205  * heap    Heap to use for allocation.
37206  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
37207  */
sp_ecc_mulmod_base_add_256(const mp_int * km,const ecc_point * am,int inMont,ecc_point * r,int map,void * heap)37208 int sp_ecc_mulmod_base_add_256(const mp_int* km, const ecc_point* am,
37209         int inMont, ecc_point* r, int map, void* heap)
37210 {
37211 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37212     sp_point_256* point = NULL;
37213     sp_digit* k = NULL;
37214 #else
37215     sp_point_256 point[2];
37216     sp_digit k[4 + 4 * 2 * 5];
37217 #endif
37218     sp_point_256* addP = NULL;
37219     sp_digit* tmp = NULL;
37220     int err = MP_OKAY;
37221 
37222 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37223     point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
37224                                          DYNAMIC_TYPE_ECC);
37225     if (point == NULL)
37226         err = MEMORY_E;
37227     if (err == MP_OKAY) {
37228         k = (sp_digit*)XMALLOC(
37229             sizeof(sp_digit) * (4 + 4 * 2 * 5),
37230             heap, DYNAMIC_TYPE_ECC);
37231         if (k == NULL)
37232             err = MEMORY_E;
37233     }
37234 #endif
37235 
37236     if (err == MP_OKAY) {
37237         addP = point + 1;
37238         tmp = k + 4;
37239 
37240         sp_256_from_mp(k, 4, km);
37241         sp_256_point_from_ecc_point_4(addP, am);
37242     }
37243     if ((err == MP_OKAY) && (!inMont)) {
37244         err = sp_256_mod_mul_norm_4(addP->x, addP->x, p256_mod);
37245     }
37246     if ((err == MP_OKAY) && (!inMont)) {
37247         err = sp_256_mod_mul_norm_4(addP->y, addP->y, p256_mod);
37248     }
37249     if ((err == MP_OKAY) && (!inMont)) {
37250         err = sp_256_mod_mul_norm_4(addP->z, addP->z, p256_mod);
37251     }
37252     if (err == MP_OKAY) {
37253             err = sp_256_ecc_mulmod_base_4(point, k, 0, 0, heap);
37254     }
37255     if (err == MP_OKAY) {
37256             sp_256_proj_point_add_4(point, point, addP, tmp);
37257 
37258         if (map) {
37259                 sp_256_map_4(point, point, tmp);
37260         }
37261 
37262         err = sp_256_point_to_ecc_point_4(point, r);
37263     }
37264 
37265 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37266     if (k != NULL)
37267         XFREE(k, heap, DYNAMIC_TYPE_ECC);
37268     if (point)
37269         XFREE(point, heap, DYNAMIC_TYPE_ECC);
37270 #endif
37271 
37272     return err;
37273 }
37274 
37275 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
37276                                                         defined(HAVE_ECC_VERIFY)
37277 /* Returns 1 if the number of zero.
37278  * Implementation is constant time.
37279  *
37280  * a  Number to check.
37281  * returns 1 if the number is zero and 0 otherwise.
37282  */
sp_256_iszero_4(const sp_digit * a)37283 static int sp_256_iszero_4(const sp_digit* a)
37284 {
37285     return (a[0] | a[1] | a[2] | a[3]) == 0;
37286 }
37287 
37288 #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
37289 /* Add 1 to a. (a = a + 1)
37290  *
37291  * a  A single precision integer.
37292  */
sp_256_add_one_4(sp_digit * a)37293 static void sp_256_add_one_4(sp_digit* a)
37294 {
37295     __asm__ __volatile__ (
37296         "ldp	x1, x2, [%[a], 0]\n\t"
37297         "adds	x1, x1, #1\n\t"
37298         "ldr	x3, [%[a], 16]\n\t"
37299         "adcs	x2, x2, xzr\n\t"
37300         "ldr	x4, [%[a], 24]\n\t"
37301         "adcs	x3, x3, xzr\n\t"
37302         "stp	x1, x2, [%[a], 0]\n\t"
37303         "adcs	x4, x4, xzr\n\t"
37304         "stp	x3, x4, [%[a], 16]\n\t"
37305         :
37306         : [a] "r" (a)
37307         : "memory", "x1", "x2", "x3", "x4"
37308     );
37309 }
37310 
37311 /* Read big endian unsigned byte array into r.
37312  *
37313  * r  A single precision integer.
37314  * size  Maximum number of bytes to convert
37315  * a  Byte array.
37316  * n  Number of bytes in array to read.
37317  */
sp_256_from_bin(sp_digit * r,int size,const byte * a,int n)37318 static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n)
37319 {
37320     int i;
37321     int j;
37322     byte* d;
37323 
37324     for (i = n - 1,j = 0; i >= 7; i -= 8) {
37325         r[j]  = ((sp_digit)a[i - 0] <<  0) |
37326                 ((sp_digit)a[i - 1] <<  8) |
37327                 ((sp_digit)a[i - 2] << 16) |
37328                 ((sp_digit)a[i - 3] << 24) |
37329                 ((sp_digit)a[i - 4] << 32) |
37330                 ((sp_digit)a[i - 5] << 40) |
37331                 ((sp_digit)a[i - 6] << 48) |
37332                 ((sp_digit)a[i - 7] << 56);
37333         j++;
37334     }
37335 
37336     if (i >= 0) {
37337         r[j] = 0;
37338 
37339         d = (byte*)r;
37340         switch (i) {
37341             case 6: d[n - 1 - 6] = a[6]; //fallthrough
37342             case 5: d[n - 1 - 5] = a[5]; //fallthrough
37343             case 4: d[n - 1 - 4] = a[4]; //fallthrough
37344             case 3: d[n - 1 - 3] = a[3]; //fallthrough
37345             case 2: d[n - 1 - 2] = a[2]; //fallthrough
37346             case 1: d[n - 1 - 1] = a[1]; //fallthrough
37347             case 0: d[n - 1 - 0] = a[0]; //fallthrough
37348         }
37349         j++;
37350     }
37351 
37352     for (; j < size; j++) {
37353         r[j] = 0;
37354     }
37355 }
37356 
37357 /* Generates a scalar that is in the range 1..order-1.
37358  *
37359  * rng  Random number generator.
37360  * k    Scalar value.
37361  * returns RNG failures, MEMORY_E when memory allocation fails and
37362  * MP_OKAY on success.
37363  */
sp_256_ecc_gen_k_4(WC_RNG * rng,sp_digit * k)37364 static int sp_256_ecc_gen_k_4(WC_RNG* rng, sp_digit* k)
37365 {
37366     int err;
37367     byte buf[32];
37368 
37369     do {
37370         err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
37371         if (err == 0) {
37372             sp_256_from_bin(k, 4, buf, (int)sizeof(buf));
37373             if (sp_256_cmp_4(k, p256_order2) <= 0) {
37374                 sp_256_add_one_4(k);
37375                 break;
37376             }
37377         }
37378     }
37379     while (err == 0);
37380 
37381     return err;
37382 }
37383 
37384 /* Makes a random EC key pair.
37385  *
37386  * rng   Random number generator.
37387  * priv  Generated private value.
37388  * pub   Generated public point.
37389  * heap  Heap to use for allocation.
37390  * returns ECC_INF_E when the point does not have the correct order, RNG
37391  * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
37392  */
sp_ecc_make_key_256(WC_RNG * rng,mp_int * priv,ecc_point * pub,void * heap)37393 int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
37394 {
37395 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37396     sp_point_256* point = NULL;
37397     sp_digit* k = NULL;
37398 #else
37399     #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
37400     sp_point_256 point[2];
37401     #else
37402     sp_point_256 point[1];
37403     #endif
37404     sp_digit k[4];
37405 #endif
37406 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
37407     sp_point_256* infinity = NULL;
37408 #endif
37409     int err = MP_OKAY;
37410 
37411 
37412     (void)heap;
37413 
37414 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37415     #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
37416     point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC);
37417     #else
37418     point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC);
37419     #endif
37420     if (point == NULL)
37421         err = MEMORY_E;
37422     if (err == MP_OKAY) {
37423         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4, heap,
37424                                DYNAMIC_TYPE_ECC);
37425         if (k == NULL)
37426             err = MEMORY_E;
37427     }
37428 #endif
37429 
37430     if (err == MP_OKAY) {
37431     #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
37432         infinity = point + 1;
37433     #endif
37434 
37435         err = sp_256_ecc_gen_k_4(rng, k);
37436     }
37437     if (err == MP_OKAY) {
37438             err = sp_256_ecc_mulmod_base_4(point, k, 1, 1, NULL);
37439     }
37440 
37441 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
37442     if (err == MP_OKAY) {
37443             err = sp_256_ecc_mulmod_4(infinity, point, p256_order, 1, 1, NULL);
37444     }
37445     if (err == MP_OKAY) {
37446         if (sp_256_iszero_4(point->x) || sp_256_iszero_4(point->y)) {
37447             err = ECC_INF_E;
37448         }
37449     }
37450 #endif
37451 
37452     if (err == MP_OKAY) {
37453         err = sp_256_to_mp(k, priv);
37454     }
37455     if (err == MP_OKAY) {
37456         err = sp_256_point_to_ecc_point_4(point, pub);
37457     }
37458 
37459 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37460     if (k != NULL)
37461         XFREE(k, heap, DYNAMIC_TYPE_ECC);
37462     if (point != NULL) {
37463         /* point is not sensitive, so no need to zeroize */
37464         XFREE(point, heap, DYNAMIC_TYPE_ECC);
37465     }
37466 #endif
37467 
37468     return err;
37469 }
37470 
37471 #ifdef HAVE_ECC_DHE
37472 /* Write r as big endian to byte array.
37473  * Fixed length number of bytes written: 32
37474  *
37475  * r  A single precision integer.
37476  * a  Byte array.
37477  */
sp_256_to_bin_4(sp_digit * r,byte * a)37478 static void sp_256_to_bin_4(sp_digit* r, byte* a)
37479 {
37480     int i;
37481     int j;
37482 
37483     for (i = 3, j = 0; i >= 0; i--) {
37484         a[j++] = r[i] >> 56;
37485         a[j++] = r[i] >> 48;
37486         a[j++] = r[i] >> 40;
37487         a[j++] = r[i] >> 32;
37488         a[j++] = r[i] >> 24;
37489         a[j++] = r[i] >> 16;
37490         a[j++] = r[i] >> 8;
37491         a[j++] = r[i] >> 0;
37492     }
37493 }
37494 
37495 /* Multiply the point by the scalar and serialize the X ordinate.
37496  * The number is 0 padded to maximum size on output.
37497  *
37498  * priv    Scalar to multiply the point by.
37499  * pub     Point to multiply.
37500  * out     Buffer to hold X ordinate.
37501  * outLen  On entry, size of the buffer in bytes.
37502  *         On exit, length of data in buffer in bytes.
37503  * heap    Heap to use for allocation.
37504  * returns BUFFER_E if the buffer is to small for output size,
37505  * MEMORY_E when memory allocation fails and MP_OKAY on success.
37506  */
sp_ecc_secret_gen_256(const mp_int * priv,const ecc_point * pub,byte * out,word32 * outLen,void * heap)37507 int sp_ecc_secret_gen_256(const mp_int* priv, const ecc_point* pub, byte* out,
37508                           word32* outLen, void* heap)
37509 {
37510 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37511     sp_point_256* point = NULL;
37512     sp_digit* k = NULL;
37513 #else
37514     sp_point_256 point[1];
37515     sp_digit k[4];
37516 #endif
37517     int err = MP_OKAY;
37518 
37519     if (*outLen < 32U) {
37520         err = BUFFER_E;
37521     }
37522 
37523 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37524     if (err == MP_OKAY) {
37525         point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
37526                                          DYNAMIC_TYPE_ECC);
37527         if (point == NULL)
37528             err = MEMORY_E;
37529     }
37530     if (err == MP_OKAY) {
37531         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4, heap,
37532                                DYNAMIC_TYPE_ECC);
37533         if (k == NULL)
37534             err = MEMORY_E;
37535     }
37536 #endif
37537 
37538     if (err == MP_OKAY) {
37539         sp_256_from_mp(k, 4, priv);
37540         sp_256_point_from_ecc_point_4(point, pub);
37541             err = sp_256_ecc_mulmod_4(point, point, k, 1, 1, heap);
37542     }
37543     if (err == MP_OKAY) {
37544         sp_256_to_bin_4(point->x, out);
37545         *outLen = 32;
37546     }
37547 
37548 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
37549     if (k != NULL)
37550         XFREE(k, heap, DYNAMIC_TYPE_ECC);
37551     if (point != NULL)
37552         XFREE(point, heap, DYNAMIC_TYPE_ECC);
37553 #endif
37554 
37555     return err;
37556 }
37557 #endif /* HAVE_ECC_DHE */
37558 
37559 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
37560 #endif
37561 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
37562 /* Sub b from a into a. (a -= b)
37563  *
37564  * a  A single precision integer and result.
37565  * b  A single precision integer.
37566  */
sp_256_sub_in_place_4(sp_digit * a,const sp_digit * b)37567 static sp_digit sp_256_sub_in_place_4(sp_digit* a, const sp_digit* b)
37568 {
37569     __asm__ __volatile__ (
37570         "ldp	x2, x3, [%[a], 0]\n\t"
37571         "ldp	x6, x7, [%[b], 0]\n\t"
37572         "subs	x2, x2, x6\n\t"
37573         "ldp	x4, x5, [%[a], 16]\n\t"
37574         "sbcs	x3, x3, x7\n\t"
37575         "ldp	x8, x9, [%[b], 16]\n\t"
37576         "sbcs	x4, x4, x8\n\t"
37577         "stp	x2, x3, [%[a], 0]\n\t"
37578         "sbcs	x5, x5, x9\n\t"
37579         "stp	x4, x5, [%[a], 16]\n\t"
37580         "csetm	%[a], cc\n\t"
37581         : [a] "+r" (a)
37582         : [b] "r" (b)
37583         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
37584     );
37585 
37586     return (sp_digit)a;
37587 }
37588 
37589 /* Mul a by digit b into r. (r = a * b)
37590  *
37591  * r  A single precision integer.
37592  * a  A single precision integer.
37593  * b  A single precision digit.
37594  */
sp_256_mul_d_4(sp_digit * r,const sp_digit * a,sp_digit b)37595 static void sp_256_mul_d_4(sp_digit* r, const sp_digit* a,
37596         sp_digit b)
37597 {
37598     __asm__ __volatile__ (
37599         "# A[0] * B\n\t"
37600         "ldp	x2, x3, [%[a]]\n\t"
37601         "ldp	x4, x5, [%[a], 16]\n\t"
37602         "umulh	x7, %[b], x2\n\t"
37603         "mul	x2, %[b], x2\n\t"
37604         "# A[1] * B\n\t"
37605         "mul	x8, %[b], x3\n\t"
37606         "umulh	x9, %[b], x3\n\t"
37607         "adds	x3, x7, x8\n\t"
37608         "# A[2] * B\n\t"
37609         "mul	x8, %[b], x4\n\t"
37610         "adc	x7, xzr, x9\n\t"
37611         "umulh	x9, %[b], x4\n\t"
37612         "adds	x4, x7, x8\n\t"
37613         "# A[3] * B\n\t"
37614         "mul	x8, %[b], x5\n\t"
37615         "adc	x7, xzr, x9\n\t"
37616         "umulh	x9, %[b], x5\n\t"
37617         "adds	x5, x7, x8\n\t"
37618         "str	x2, [%[r]]\n\t"
37619         "adc	x6, xzr, x9\n\t"
37620         "stp	x3, x4, [%[r], 8]\n\t"
37621         "stp	x5, x6, [%[r], 24]\n\t"
37622         :
37623         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
37624         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
37625     );
37626 }
37627 
37628 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
37629  *
37630  * d1   The high order half of the number to divide.
37631  * d0   The low order half of the number to divide.
37632  * div  The dividend.
37633  * returns the result of the division.
37634  */
div_256_word_4(sp_digit d1,sp_digit d0,sp_digit div)37635 static sp_digit div_256_word_4(sp_digit d1, sp_digit d0, sp_digit div)
37636 {
37637     sp_digit r;
37638 
37639     __asm__ __volatile__ (
37640         "lsr	x5, %[div], 32\n\t"
37641         "add	x5, x5, 1\n\t"
37642 
37643         "udiv	x3, %[d1], x5\n\t"
37644         "lsl	x6, x3, 32\n\t"
37645         "mul	x4, %[div], x6\n\t"
37646         "umulh	x3, %[div], x6\n\t"
37647         "subs	%[d0], %[d0], x4\n\t"
37648         "sbc	%[d1], %[d1], x3\n\t"
37649 
37650         "udiv	x3, %[d1], x5\n\t"
37651         "lsl	x3, x3, 32\n\t"
37652         "add	x6, x6, x3\n\t"
37653         "mul	x4, %[div], x3\n\t"
37654         "umulh	x3, %[div], x3\n\t"
37655         "subs	%[d0], %[d0], x4\n\t"
37656         "sbc	%[d1], %[d1], x3\n\t"
37657 
37658         "lsr	x3, %[d0], 32\n\t"
37659         "orr	x3, x3, %[d1], lsl 32\n\t"
37660 
37661         "udiv	x3, x3, x5\n\t"
37662         "add	x6, x6, x3\n\t"
37663         "mul	x4, %[div], x3\n\t"
37664         "umulh	x3, %[div], x3\n\t"
37665         "subs	%[d0], %[d0], x4\n\t"
37666         "sbc	%[d1], %[d1], x3\n\t"
37667 
37668         "lsr	x3, %[d0], 32\n\t"
37669         "orr	x3, x3, %[d1], lsl 32\n\t"
37670 
37671         "udiv	x3, x3, x5\n\t"
37672         "add	x6, x6, x3\n\t"
37673         "mul	x4, %[div], x3\n\t"
37674         "sub	%[d0], %[d0], x4\n\t"
37675 
37676         "udiv	x3, %[d0], %[div]\n\t"
37677         "add	%[r], x6, x3\n\t"
37678 
37679         : [r] "=r" (r)
37680         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
37681         : "x3", "x4", "x5", "x6"
37682     );
37683 
37684     return r;
37685 }
37686 
37687 /* AND m into each word of a and store in r.
37688  *
37689  * r  A single precision integer.
37690  * a  A single precision integer.
37691  * m  Mask to AND against each digit.
37692  */
sp_256_mask_4(sp_digit * r,const sp_digit * a,sp_digit m)37693 static void sp_256_mask_4(sp_digit* r, const sp_digit* a, sp_digit m)
37694 {
37695 #ifdef WOLFSSL_SP_SMALL
37696     int i;
37697 
37698     for (i=0; i<4; i++) {
37699         r[i] = a[i] & m;
37700     }
37701 #else
37702     r[0] = a[0] & m;
37703     r[1] = a[1] & m;
37704     r[2] = a[2] & m;
37705     r[3] = a[3] & m;
37706 #endif
37707 }
37708 
37709 /* Divide d in a and put remainder into r (m*d + r = a)
37710  * m is not calculated as it is not needed at this time.
37711  *
37712  * a  Number to be divided.
37713  * d  Number to divide with.
37714  * m  Multiplier result.
37715  * r  Remainder from the division.
37716  * returns MP_OKAY indicating success.
37717  */
sp_256_div_4(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)37718 static WC_INLINE int sp_256_div_4(const sp_digit* a, const sp_digit* d, sp_digit* m,
37719         sp_digit* r)
37720 {
37721     sp_digit t1[8], t2[5];
37722     sp_digit div, r1;
37723     int i;
37724 
37725     (void)m;
37726 
37727     div = d[3];
37728     XMEMCPY(t1, a, sizeof(*t1) * 2 * 4);
37729     for (i=3; i>=0; i--) {
37730         sp_digit hi = t1[4 + i] - (t1[4 + i] == div);
37731         r1 = div_256_word_4(hi, t1[4 + i - 1], div);
37732 
37733         sp_256_mul_d_4(t2, d, r1);
37734         t1[4 + i] += sp_256_sub_in_place_4(&t1[i], t2);
37735         t1[4 + i] -= t2[4];
37736         sp_256_mask_4(t2, d, t1[4 + i]);
37737         t1[4 + i] += sp_256_add_4(&t1[i], &t1[i], t2);
37738         sp_256_mask_4(t2, d, t1[4 + i]);
37739         t1[4 + i] += sp_256_add_4(&t1[i], &t1[i], t2);
37740     }
37741 
37742     r1 = sp_256_cmp_4(t1, d) >= 0;
37743     sp_256_cond_sub_4(r, t1, d, (sp_digit)0 - r1);
37744 
37745     return MP_OKAY;
37746 }
37747 
37748 /* Reduce a modulo m into r. (r = a mod m)
37749  *
37750  * r  A single precision number that is the reduced result.
37751  * a  A single precision number that is to be reduced.
37752  * m  A single precision number that is the modulus to reduce with.
37753  * returns MP_OKAY indicating success.
37754  */
sp_256_mod_4(sp_digit * r,const sp_digit * a,const sp_digit * m)37755 static WC_INLINE int sp_256_mod_4(sp_digit* r, const sp_digit* a, const sp_digit* m)
37756 {
37757     return sp_256_div_4(a, m, NULL, r);
37758 }
37759 
37760 #endif
37761 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
37762 /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
37763  *
37764  * r  Result of the multiplication.
37765  * a  First operand of the multiplication.
37766  * b  Second operand of the multiplication.
37767  */
sp_256_mont_mul_order_4(sp_digit * r,const sp_digit * a,const sp_digit * b)37768 static void sp_256_mont_mul_order_4(sp_digit* r, const sp_digit* a, const sp_digit* b)
37769 {
37770     sp_256_mul_4(r, a, b);
37771     sp_256_mont_reduce_order_4(r, p256_order, p256_mp_order);
37772 }
37773 
37774 #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
37775 #ifdef WOLFSSL_SP_SMALL
37776 /* Order-2 for the P256 curve. */
37777 static const uint64_t p256_order_minus_2[4] = {
37778     0xf3b9cac2fc63254fU,0xbce6faada7179e84U,0xffffffffffffffffU,
37779     0xffffffff00000000U
37780 };
37781 #else
37782 /* The low half of the order-2 of the P256 curve. */
37783 static const sp_int_digit p256_order_low[2] = {
37784     0xf3b9cac2fc63254fU,0xbce6faada7179e84U
37785 };
37786 #endif /* WOLFSSL_SP_SMALL */
37787 
37788 /* Square number mod the order of P256 curve. (r = a * a mod order)
37789  *
37790  * r  Result of the squaring.
37791  * a  Number to square.
37792  */
sp_256_mont_sqr_order_4(sp_digit * r,const sp_digit * a)37793 static void sp_256_mont_sqr_order_4(sp_digit* r, const sp_digit* a)
37794 {
37795     sp_256_sqr_4(r, a);
37796     sp_256_mont_reduce_order_4(r, p256_order, p256_mp_order);
37797 }
37798 
37799 #ifndef WOLFSSL_SP_SMALL
37800 /* Square number mod the order of P256 curve a number of times.
37801  * (r = a ^ n mod order)
37802  *
37803  * r  Result of the squaring.
37804  * a  Number to square.
37805  */
sp_256_mont_sqr_n_order_4(sp_digit * r,const sp_digit * a,int n)37806 static void sp_256_mont_sqr_n_order_4(sp_digit* r, const sp_digit* a, int n)
37807 {
37808     int i;
37809 
37810     sp_256_mont_sqr_order_4(r, a);
37811     for (i=1; i<n; i++) {
37812         sp_256_mont_sqr_order_4(r, r);
37813     }
37814 }
37815 #endif /* !WOLFSSL_SP_SMALL */
37816 
37817 /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
37818  * (r = 1 / a mod order)
37819  *
37820  * r   Inverse result.
37821  * a   Number to invert.
37822  * td  Temporary data.
37823  */
37824 
37825 #ifdef WOLFSSL_SP_NONBLOCK
37826 typedef struct sp_256_mont_inv_order_4_ctx {
37827     int state;
37828     int i;
37829 } sp_256_mont_inv_order_4_ctx;
sp_256_mont_inv_order_4_nb(sp_ecc_ctx_t * sp_ctx,sp_digit * r,const sp_digit * a,sp_digit * t)37830 static int sp_256_mont_inv_order_4_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
37831         sp_digit* t)
37832 {
37833     int err = FP_WOULDBLOCK;
37834     sp_256_mont_inv_order_4_ctx* ctx = (sp_256_mont_inv_order_4_ctx*)sp_ctx;
37835 
37836     typedef char ctx_size_test[sizeof(sp_256_mont_inv_order_4_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
37837     (void)sizeof(ctx_size_test);
37838 
37839     switch (ctx->state) {
37840     case 0:
37841         XMEMCPY(t, a, sizeof(sp_digit) * 4);
37842         ctx->i = 254;
37843         ctx->state = 1;
37844         break;
37845     case 1:
37846         sp_256_mont_sqr_order_4(t, t);
37847         ctx->state = 2;
37848         break;
37849     case 2:
37850         if ((p256_order_minus_2[ctx->i / 64] & ((sp_int_digit)1 << (ctx->i % 64))) != 0) {
37851             sp_256_mont_mul_order_4(t, t, a);
37852         }
37853         ctx->i--;
37854         ctx->state = (ctx->i == 0) ? 3 : 1;
37855         break;
37856     case 3:
37857         XMEMCPY(r, t, sizeof(sp_digit) * 4U);
37858         err = MP_OKAY;
37859         break;
37860     }
37861     return err;
37862 }
37863 #endif /* WOLFSSL_SP_NONBLOCK */
37864 
sp_256_mont_inv_order_4(sp_digit * r,const sp_digit * a,sp_digit * td)37865 static void sp_256_mont_inv_order_4(sp_digit* r, const sp_digit* a,
37866         sp_digit* td)
37867 {
37868 #ifdef WOLFSSL_SP_SMALL
37869     sp_digit* t = td;
37870     int i;
37871 
37872     XMEMCPY(t, a, sizeof(sp_digit) * 4);
37873     for (i=254; i>=0; i--) {
37874         sp_256_mont_sqr_order_4(t, t);
37875         if ((p256_order_minus_2[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) {
37876             sp_256_mont_mul_order_4(t, t, a);
37877         }
37878     }
37879     XMEMCPY(r, t, sizeof(sp_digit) * 4U);
37880 #else
37881     sp_digit* t = td;
37882     sp_digit* t2 = td + 2 * 4;
37883     sp_digit* t3 = td + 4 * 4;
37884     int i;
37885 
37886     /* t = a^2 */
37887     sp_256_mont_sqr_order_4(t, a);
37888     /* t = a^3 = t * a */
37889     sp_256_mont_mul_order_4(t, t, a);
37890     /* t2= a^c = t ^ 2 ^ 2 */
37891     sp_256_mont_sqr_n_order_4(t2, t, 2);
37892     /* t3= a^f = t2 * t */
37893     sp_256_mont_mul_order_4(t3, t2, t);
37894     /* t2= a^f0 = t3 ^ 2 ^ 4 */
37895     sp_256_mont_sqr_n_order_4(t2, t3, 4);
37896     /* t = a^ff = t2 * t3 */
37897     sp_256_mont_mul_order_4(t, t2, t3);
37898     /* t3= a^ff00 = t ^ 2 ^ 8 */
37899     sp_256_mont_sqr_n_order_4(t2, t, 8);
37900     /* t = a^ffff = t2 * t */
37901     sp_256_mont_mul_order_4(t, t2, t);
37902     /* t2= a^ffff0000 = t ^ 2 ^ 16 */
37903     sp_256_mont_sqr_n_order_4(t2, t, 16);
37904     /* t = a^ffffffff = t2 * t */
37905     sp_256_mont_mul_order_4(t, t2, t);
37906     /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64  */
37907     sp_256_mont_sqr_n_order_4(t2, t, 64);
37908     /* t2= a^ffffffff00000000ffffffff = t2 * t */
37909     sp_256_mont_mul_order_4(t2, t2, t);
37910     /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32  */
37911     sp_256_mont_sqr_n_order_4(t2, t2, 32);
37912     /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
37913     sp_256_mont_mul_order_4(t2, t2, t);
37914     /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
37915     for (i=127; i>=112; i--) {
37916         sp_256_mont_sqr_order_4(t2, t2);
37917         if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) {
37918             sp_256_mont_mul_order_4(t2, t2, a);
37919         }
37920     }
37921     /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
37922     sp_256_mont_sqr_n_order_4(t2, t2, 4);
37923     sp_256_mont_mul_order_4(t2, t2, t3);
37924     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
37925     for (i=107; i>=64; i--) {
37926         sp_256_mont_sqr_order_4(t2, t2);
37927         if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) {
37928             sp_256_mont_mul_order_4(t2, t2, a);
37929         }
37930     }
37931     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
37932     sp_256_mont_sqr_n_order_4(t2, t2, 4);
37933     sp_256_mont_mul_order_4(t2, t2, t3);
37934     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
37935     for (i=59; i>=32; i--) {
37936         sp_256_mont_sqr_order_4(t2, t2);
37937         if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) {
37938             sp_256_mont_mul_order_4(t2, t2, a);
37939         }
37940     }
37941     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
37942     sp_256_mont_sqr_n_order_4(t2, t2, 4);
37943     sp_256_mont_mul_order_4(t2, t2, t3);
37944     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
37945     for (i=27; i>=0; i--) {
37946         sp_256_mont_sqr_order_4(t2, t2);
37947         if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) {
37948             sp_256_mont_mul_order_4(t2, t2, a);
37949         }
37950     }
37951     /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
37952     sp_256_mont_sqr_n_order_4(t2, t2, 4);
37953     /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
37954     sp_256_mont_mul_order_4(r, t2, t3);
37955 #endif /* WOLFSSL_SP_SMALL */
37956 }
37957 
37958 #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
37959 #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
37960 #ifdef HAVE_ECC_SIGN
37961 #ifndef SP_ECC_MAX_SIG_GEN
37962 #define SP_ECC_MAX_SIG_GEN  64
37963 #endif
37964 
37965 /* Calculate second signature value S from R, k and private value.
37966  *
37967  * s = (r * x + e) / k
37968  *
37969  * s    Signature value.
37970  * r    First signature value.
37971  * k    Ephemeral private key.
37972  * x    Private key as a number.
37973  * e    Hash of message as a number.
37974  * tmp  Temporary storage for intermediate numbers.
37975  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
37976  */
sp_256_calc_s_4(sp_digit * s,const sp_digit * r,sp_digit * k,sp_digit * x,const sp_digit * e,sp_digit * tmp)37977 static int sp_256_calc_s_4(sp_digit* s, const sp_digit* r, sp_digit* k,
37978     sp_digit* x, const sp_digit* e, sp_digit* tmp)
37979 {
37980     int err;
37981     sp_digit carry;
37982     sp_int64 c;
37983     sp_digit* kInv = k;
37984 
37985     /* Conv k to Montgomery form (mod order) */
37986         sp_256_mul_4(k, k, p256_norm_order);
37987     err = sp_256_mod_4(k, k, p256_order);
37988     if (err == MP_OKAY) {
37989         sp_256_norm_4(k);
37990 
37991         /* kInv = 1/k mod order */
37992             sp_256_mont_inv_order_4(kInv, k, tmp);
37993         sp_256_norm_4(kInv);
37994 
37995         /* s = r * x + e */
37996             sp_256_mul_4(x, x, r);
37997         err = sp_256_mod_4(x, x, p256_order);
37998     }
37999     if (err == MP_OKAY) {
38000         sp_256_norm_4(x);
38001         carry = sp_256_add_4(s, e, x);
38002         sp_256_cond_sub_4(s, s, p256_order, 0 - carry);
38003         sp_256_norm_4(s);
38004         c = sp_256_cmp_4(s, p256_order);
38005         sp_256_cond_sub_4(s, s, p256_order,
38006             (sp_digit)0 - (sp_digit)(c >= 0));
38007         sp_256_norm_4(s);
38008 
38009         /* s = s * k^-1 mod order */
38010             sp_256_mont_mul_order_4(s, s, kInv);
38011         sp_256_norm_4(s);
38012     }
38013 
38014     return err;
38015 }
38016 
38017 /* Sign the hash using the private key.
38018  *   e = [hash, 256 bits] from binary
38019  *   r = (k.G)->x mod order
38020  *   s = (r * x + e) / k mod order
38021  * The hash is truncated to the first 256 bits.
38022  *
38023  * hash     Hash to sign.
38024  * hashLen  Length of the hash data.
38025  * rng      Random number generator.
38026  * priv     Private part of key - scalar.
38027  * rm       First part of result as an mp_int.
38028  * sm       Sirst part of result as an mp_int.
38029  * heap     Heap to use for allocation.
38030  * returns RNG failures, MEMORY_E when memory allocation fails and
38031  * MP_OKAY on success.
38032  */
38033 #ifdef WOLFSSL_SP_NONBLOCK
38034 typedef struct sp_ecc_sign_256_ctx {
38035     int state;
38036     union {
38037         sp_256_ecc_mulmod_4_ctx mulmod_ctx;
38038         sp_256_mont_inv_order_4_ctx mont_inv_order_ctx;
38039     };
38040     sp_digit e[2*4];
38041     sp_digit x[2*4];
38042     sp_digit k[2*4];
38043     sp_digit r[2*4];
38044     sp_digit tmp[3 * 2*4];
38045     sp_point_256 point;
38046     sp_digit* s;
38047     sp_digit* kInv;
38048     int i;
38049 } sp_ecc_sign_256_ctx;
38050 
sp_ecc_sign_256_nb(sp_ecc_ctx_t * sp_ctx,const byte * hash,word32 hashLen,WC_RNG * rng,mp_int * priv,mp_int * rm,mp_int * sm,mp_int * km,void * heap)38051 int sp_ecc_sign_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
38052     mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
38053 {
38054     int err = FP_WOULDBLOCK;
38055     sp_ecc_sign_256_ctx* ctx = (sp_ecc_sign_256_ctx*)sp_ctx->data;
38056 
38057     typedef char ctx_size_test[sizeof(sp_ecc_sign_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
38058     (void)sizeof(ctx_size_test);
38059 
38060     (void)heap;
38061 
38062     switch (ctx->state) {
38063     case 0: /* INIT */
38064         ctx->s = ctx->e;
38065         ctx->kInv = ctx->k;
38066         if (hashLen > 32U) {
38067             hashLen = 32U;
38068         }
38069 
38070         ctx->i = SP_ECC_MAX_SIG_GEN;
38071         ctx->state = 1;
38072         break;
38073     case 1: /* GEN */
38074         /* New random point. */
38075         if (km == NULL || mp_iszero(km)) {
38076             err = sp_256_ecc_gen_k_4(rng, ctx->k);
38077         }
38078         else {
38079             sp_256_from_mp(ctx->k, 4, km);
38080             mp_zero(km);
38081         }
38082         XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
38083         ctx->state = 2;
38084         break;
38085     case 2: /* MULMOD */
38086         err = sp_256_ecc_mulmod_4_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
38087             &ctx->point, &p256_base, ctx->k, 1, 1, heap);
38088         if (err == MP_OKAY) {
38089             ctx->state = 3;
38090         }
38091         break;
38092     case 3: /* MODORDER */
38093     {
38094         sp_int64 c;
38095         /* r = point->x mod order */
38096         XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 4U);
38097         sp_256_norm_4(ctx->r);
38098         c = sp_256_cmp_4(ctx->r, p256_order);
38099         sp_256_cond_sub_4(ctx->r, ctx->r, p256_order,
38100             (sp_digit)0 - (sp_digit)(c >= 0));
38101         sp_256_norm_4(ctx->r);
38102 
38103         sp_256_from_mp(ctx->x, 4, priv);
38104         sp_256_from_bin(ctx->e, 4, hash, (int)hashLen);
38105         ctx->state = 4;
38106         break;
38107     }
38108     case 4: /* KMODORDER */
38109         /* Conv k to Montgomery form (mod order) */
38110         sp_256_mul_4(ctx->k, ctx->k, p256_norm_order);
38111         err = sp_256_mod_4(ctx->k, ctx->k, p256_order);
38112         if (err == MP_OKAY) {
38113             sp_256_norm_4(ctx->k);
38114             XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
38115             ctx->state = 5;
38116         }
38117         break;
38118     case 5: /* KINV */
38119         /* kInv = 1/k mod order */
38120         err = sp_256_mont_inv_order_4_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
38121         if (err == MP_OKAY) {
38122             XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
38123             ctx->state = 6;
38124         }
38125         break;
38126     case 6: /* KINVNORM */
38127         sp_256_norm_4(ctx->kInv);
38128         ctx->state = 7;
38129         break;
38130     case 7: /* R */
38131         /* s = r * x + e */
38132         sp_256_mul_4(ctx->x, ctx->x, ctx->r);
38133         ctx->state = 8;
38134         break;
38135     case 8: /* S1 */
38136         err = sp_256_mod_4(ctx->x, ctx->x, p256_order);
38137         if (err == MP_OKAY)
38138             ctx->state = 9;
38139         break;
38140     case 9: /* S2 */
38141     {
38142         sp_digit carry;
38143         sp_int64 c;
38144         sp_256_norm_4(ctx->x);
38145         carry = sp_256_add_4(ctx->s, ctx->e, ctx->x);
38146         sp_256_cond_sub_4(ctx->s, ctx->s,
38147             p256_order, 0 - carry);
38148         sp_256_norm_4(ctx->s);
38149         c = sp_256_cmp_4(ctx->s, p256_order);
38150         sp_256_cond_sub_4(ctx->s, ctx->s, p256_order,
38151             (sp_digit)0 - (sp_digit)(c >= 0));
38152         sp_256_norm_4(ctx->s);
38153 
38154         /* s = s * k^-1 mod order */
38155         sp_256_mont_mul_order_4(ctx->s, ctx->s, ctx->kInv);
38156         sp_256_norm_4(ctx->s);
38157 
38158         /* Check that signature is usable. */
38159         if (sp_256_iszero_4(ctx->s) == 0) {
38160             ctx->state = 10;
38161             break;
38162         }
38163     #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
38164         ctx->i = 1;
38165     #endif
38166 
38167         /* not usable gen, try again */
38168         ctx->i--;
38169         if (ctx->i == 0) {
38170             err = RNG_FAILURE_E;
38171         }
38172         ctx->state = 1;
38173         break;
38174     }
38175     case 10: /* RES */
38176         err = sp_256_to_mp(ctx->r, rm);
38177         if (err == MP_OKAY) {
38178             err = sp_256_to_mp(ctx->s, sm);
38179         }
38180         break;
38181     }
38182 
38183     if (err == MP_OKAY && ctx->state != 10) {
38184         err = FP_WOULDBLOCK;
38185     }
38186     if (err != FP_WOULDBLOCK) {
38187         XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 4U);
38188         XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 4U);
38189         XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 4U);
38190         XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 4U);
38191         XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 4U);
38192     }
38193 
38194     return err;
38195 }
38196 #endif /* WOLFSSL_SP_NONBLOCK */
38197 
sp_ecc_sign_256(const byte * hash,word32 hashLen,WC_RNG * rng,const mp_int * priv,mp_int * rm,mp_int * sm,mp_int * km,void * heap)38198 int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng,
38199     const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
38200 {
38201 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38202     sp_digit* e = NULL;
38203     sp_point_256* point = NULL;
38204 #else
38205     sp_digit e[7 * 2 * 4];
38206     sp_point_256 point[1];
38207 #endif
38208     sp_digit* x = NULL;
38209     sp_digit* k = NULL;
38210     sp_digit* r = NULL;
38211     sp_digit* tmp = NULL;
38212     sp_digit* s = NULL;
38213     sp_int64 c;
38214     int err = MP_OKAY;
38215     int i;
38216 
38217     (void)heap;
38218 
38219 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38220     if (err == MP_OKAY) {
38221         point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
38222                                              DYNAMIC_TYPE_ECC);
38223         if (point == NULL)
38224             err = MEMORY_E;
38225     }
38226     if (err == MP_OKAY) {
38227         e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 4, heap,
38228                                DYNAMIC_TYPE_ECC);
38229         if (e == NULL)
38230             err = MEMORY_E;
38231     }
38232 #endif
38233 
38234     if (err == MP_OKAY) {
38235         x = e + 2 * 4;
38236         k = e + 4 * 4;
38237         r = e + 6 * 4;
38238         tmp = e + 8 * 4;
38239         s = e;
38240 
38241         if (hashLen > 32U) {
38242             hashLen = 32U;
38243         }
38244     }
38245 
38246     for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
38247         /* New random point. */
38248         if (km == NULL || mp_iszero(km)) {
38249             err = sp_256_ecc_gen_k_4(rng, k);
38250         }
38251         else {
38252             sp_256_from_mp(k, 4, km);
38253             mp_zero(km);
38254         }
38255         if (err == MP_OKAY) {
38256                 err = sp_256_ecc_mulmod_base_4(point, k, 1, 1, heap);
38257         }
38258 
38259         if (err == MP_OKAY) {
38260             /* r = point->x mod order */
38261             XMEMCPY(r, point->x, sizeof(sp_digit) * 4U);
38262             sp_256_norm_4(r);
38263             c = sp_256_cmp_4(r, p256_order);
38264             sp_256_cond_sub_4(r, r, p256_order,
38265                 (sp_digit)0 - (sp_digit)(c >= 0));
38266             sp_256_norm_4(r);
38267 
38268             sp_256_from_mp(x, 4, priv);
38269             sp_256_from_bin(e, 4, hash, (int)hashLen);
38270 
38271             err = sp_256_calc_s_4(s, r, k, x, e, tmp);
38272         }
38273 
38274         /* Check that signature is usable. */
38275         if ((err == MP_OKAY) && (sp_256_iszero_4(s) == 0)) {
38276             break;
38277         }
38278 #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
38279         i = 1;
38280 #endif
38281     }
38282 
38283     if (i == 0) {
38284         err = RNG_FAILURE_E;
38285     }
38286 
38287     if (err == MP_OKAY) {
38288         err = sp_256_to_mp(r, rm);
38289     }
38290     if (err == MP_OKAY) {
38291         err = sp_256_to_mp(s, sm);
38292     }
38293 
38294 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38295     if (e != NULL)
38296 #endif
38297     {
38298         ForceZero(e, sizeof(sp_digit) * 7 * 2 * 4);
38299     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38300         XFREE(e, heap, DYNAMIC_TYPE_ECC);
38301     #endif
38302     }
38303 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38304     if (point != NULL)
38305 #endif
38306     {
38307         ForceZero(point, sizeof(sp_point_256));
38308     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38309         XFREE(point, heap, DYNAMIC_TYPE_ECC);
38310     #endif
38311     }
38312 
38313     return err;
38314 }
38315 #endif /* HAVE_ECC_SIGN */
38316 
38317 #ifndef WOLFSSL_SP_SMALL
38318 /* Non-constant time modular inversion.
38319  *
38320  * @param  [out]  r   Resulting number.
38321  * @param  [in]   a   Number to invert.
38322  * @param  [in]   m   Modulus.
38323  * @return  MP_OKAY on success.
38324  */
sp_256_mod_inv_4(sp_digit * r,const sp_digit * a,const sp_digit * m)38325 static int sp_256_mod_inv_4(sp_digit* r, const sp_digit* a,
38326     const sp_digit* m)
38327 {
38328     __asm__ __volatile__ (
38329         "ldr	x20, [%[m], 0]\n\t"
38330         "ldr	x21, [%[m], 8]\n\t"
38331         "ldr	x22, [%[m], 16]\n\t"
38332         "ldr	%[m], [%[m], 24]\n\t"
38333         "ldr	x7, [%[a], 0]\n\t"
38334         "ldr	x8, [%[a], 8]\n\t"
38335         "ldr	x9, [%[a], 16]\n\t"
38336         "ldr	x10, [%[a], 24]\n\t"
38337         "mov	x3, x20\n\t"
38338         "mov	x4, x21\n\t"
38339         "mov	x5, x22\n\t"
38340         "mov	x6, %[m]\n\t"
38341         "mov	x11, xzr\n\t"
38342         "mov	x12, xzr\n\t"
38343         "mov	x13, xzr\n\t"
38344         "mov	x14, xzr\n\t"
38345         "mov	x15, 1\n\t"
38346         "mov	x16, xzr\n\t"
38347         "mov	x17, xzr\n\t"
38348         "mov	x19, xzr\n\t"
38349         "cmp	x6, 0\n\t"
38350         "b.eq	10f\n\t"
38351         "mov	x25, 256\n\t"
38352         "clz	x23, x6\n\t"
38353         "sub	x23, x25, x23\n\t"
38354         "b	13f\n\t"
38355         "\n10:\n\t"
38356         "cmp	x5, 0\n\t"
38357         "b.eq	11f\n\t"
38358         "mov	x25, 192\n\t"
38359         "clz	x23, x5\n\t"
38360         "sub	x23, x25, x23\n\t"
38361         "b	13f\n\t"
38362         "\n11:\n\t"
38363         "cmp	x4, 0\n\t"
38364         "b.eq	12f\n\t"
38365         "mov	x25, 128\n\t"
38366         "clz	x23, x4\n\t"
38367         "sub	x23, x25, x23\n\t"
38368         "b	13f\n\t"
38369         "\n12:\n\t"
38370         "mov	x25, 64\n\t"
38371         "clz	x23, x3\n\t"
38372         "sub	x23, x25, x23\n\t"
38373         "\n13:\n\t"
38374         "cmp	x10, 0\n\t"
38375         "b.eq	20f\n\t"
38376         "mov	x25, 256\n\t"
38377         "clz	x24, x10\n\t"
38378         "sub	x24, x25, x24\n\t"
38379         "b	23f\n\t"
38380         "\n20:\n\t"
38381         "cmp	x9, 0\n\t"
38382         "b.eq	21f\n\t"
38383         "mov	x25, 192\n\t"
38384         "clz	x24, x9\n\t"
38385         "sub	x24, x25, x24\n\t"
38386         "b	23f\n\t"
38387         "\n21:\n\t"
38388         "cmp	x8, 0\n\t"
38389         "b.eq	22f\n\t"
38390         "mov	x25, 128\n\t"
38391         "clz	x24, x8\n\t"
38392         "sub	x24, x25, x24\n\t"
38393         "b	23f\n\t"
38394         "\n22:\n\t"
38395         "mov	x25, 64\n\t"
38396         "clz	x24, x7\n\t"
38397         "sub	x24, x25, x24\n\t"
38398         "\n23:\n\t"
38399         "tst	x7, 1\n\t"
38400         "b.ne	90f\n\t"
38401         "\n1:\n\t"
38402         "lsr	x7, x7, 1\n\t"
38403         "lsr	x26, x8, 1\n\t"
38404         "lsr	x27, x9, 1\n\t"
38405         "orr	x7, x7, x8, lsl 63\n\t"
38406         "orr	x8, x26, x9, lsl 63\n\t"
38407         "orr	x9, x27, x10, lsl 63\n\t"
38408         "lsr	x10, x10, 1\n\t"
38409         "sub	x24, x24, 1\n\t"
38410         "ands	x25, x15, 1\n\t"
38411         "b.eq	2f\n\t"
38412         "adds	x15, x15, x20\n\t"
38413         "adcs	x16, x16, x21\n\t"
38414         "adcs	x17, x17, x22\n\t"
38415         "adcs	x19, x19, %[m]\n\t"
38416         "cset	x25, cs\n\t"
38417         "\n2:\n\t"
38418         "lsr	x15, x15, 1\n\t"
38419         "lsr	x26, x16, 1\n\t"
38420         "lsr	x27, x17, 1\n\t"
38421         "lsr	x28, x19, 1\n\t"
38422         "orr	x15, x15, x16, lsl 63\n\t"
38423         "orr	x16, x26, x17, lsl 63\n\t"
38424         "orr	x17, x27, x19, lsl 63\n\t"
38425         "orr	x19, x28, x25, lsl 63\n\t"
38426         "tst	x7, 1\n\t"
38427         "b.eq	1b\n\t"
38428         "\n90:\n\t"
38429         "cmp	x23, 1\n\t"
38430         "b.eq	100f\n\t"
38431         "cmp	x24, 1\n\t"
38432         "b.eq	101f\n\t"
38433         "cmp	x23, x24\n\t"
38434         "b.hi	91f\n\t"
38435         "b.cc	92f\n\t"
38436         "cmp	x6, x10\n\t"
38437         "b.hi	91f\n\t"
38438         "b.cc	92f\n\t"
38439         "cmp	x5, x9\n\t"
38440         "b.hi	91f\n\t"
38441         "b.cc	92f\n\t"
38442         "cmp	x4, x8\n\t"
38443         "b.hi	91f\n\t"
38444         "b.cc	92f\n\t"
38445         "cmp	x3, x7\n\t"
38446         "b.cc	92f\n\t"
38447         "\n91:\n\t"
38448         "subs	x3, x3, x7\n\t"
38449         "sbcs	x4, x4, x8\n\t"
38450         "sbcs	x5, x5, x9\n\t"
38451         "sbc	x6, x6, x10\n\t"
38452         "subs	x11, x11, x15\n\t"
38453         "sbcs	x12, x12, x16\n\t"
38454         "sbcs	x13, x13, x17\n\t"
38455         "sbcs	x14, x14, x19\n\t"
38456         "b.cs	30f\n\t"
38457         "adds	x11, x11, x20\n\t"
38458         "adcs	x12, x12, x21\n\t"
38459         "adcs	x13, x13, x22\n\t"
38460         "adc	x14, x14, %[m]\n\t"
38461         "\n30:\n\t"
38462         "cmp	x6, 0\n\t"
38463         "b.eq	40f\n\t"
38464         "mov	x25, 256\n\t"
38465         "clz	x23, x6\n\t"
38466         "sub	x23, x25, x23\n\t"
38467         "b	43f\n\t"
38468         "\n40:\n\t"
38469         "cmp	x5, 0\n\t"
38470         "b.eq	41f\n\t"
38471         "mov	x25, 192\n\t"
38472         "clz	x23, x5\n\t"
38473         "sub	x23, x25, x23\n\t"
38474         "b	43f\n\t"
38475         "\n41:\n\t"
38476         "cmp	x4, 0\n\t"
38477         "b.eq	42f\n\t"
38478         "mov	x25, 128\n\t"
38479         "clz	x23, x4\n\t"
38480         "sub	x23, x25, x23\n\t"
38481         "b	43f\n\t"
38482         "\n42:\n\t"
38483         "mov	x25, 64\n\t"
38484         "clz	x23, x3\n\t"
38485         "sub	x23, x25, x23\n\t"
38486         "\n43:\n\t"
38487         "\n50:\n\t"
38488         "lsr	x3, x3, 1\n\t"
38489         "lsr	x26, x4, 1\n\t"
38490         "lsr	x27, x5, 1\n\t"
38491         "orr	x3, x3, x4, lsl 63\n\t"
38492         "orr	x4, x26, x5, lsl 63\n\t"
38493         "orr	x5, x27, x6, lsl 63\n\t"
38494         "lsr	x6, x6, 1\n\t"
38495         "sub	x23, x23, 1\n\t"
38496         "ands	x25, x11, 1\n\t"
38497         "b.eq	51f\n\t"
38498         "adds	x11, x11, x20\n\t"
38499         "adcs	x12, x12, x21\n\t"
38500         "adcs	x13, x13, x22\n\t"
38501         "adcs	x14, x14, %[m]\n\t"
38502         "cset	x25, cs\n\t"
38503         "\n51:\n\t"
38504         "lsr	x11, x11, 1\n\t"
38505         "lsr	x26, x12, 1\n\t"
38506         "lsr	x27, x13, 1\n\t"
38507         "lsr	x28, x14, 1\n\t"
38508         "orr	x11, x11, x12, lsl 63\n\t"
38509         "orr	x12, x26, x13, lsl 63\n\t"
38510         "orr	x13, x27, x14, lsl 63\n\t"
38511         "orr	x14, x28, x25, lsl 63\n\t"
38512         "tst	x3, 1\n\t"
38513         "b.eq	50b\n\t"
38514         "b	90b\n\t"
38515         "\n92:\n\t"
38516         "subs	x7, x7, x3\n\t"
38517         "sbcs	x8, x8, x4\n\t"
38518         "sbcs	x9, x9, x5\n\t"
38519         "sbc	x10, x10, x6\n\t"
38520         "subs	x15, x15, x11\n\t"
38521         "sbcs	x16, x16, x12\n\t"
38522         "sbcs	x17, x17, x13\n\t"
38523         "sbcs	x19, x19, x14\n\t"
38524         "b.cs	60f\n\t"
38525         "adds	x15, x15, x20\n\t"
38526         "adcs	x16, x16, x21\n\t"
38527         "adcs	x17, x17, x22\n\t"
38528         "adc	x19, x19, %[m]\n\t"
38529         "\n60:\n\t"
38530         "cmp	x10, 0\n\t"
38531         "b.eq	70f\n\t"
38532         "mov	x25, 256\n\t"
38533         "clz	x24, x10\n\t"
38534         "sub	x24, x25, x24\n\t"
38535         "b	73f\n\t"
38536         "\n70:\n\t"
38537         "cmp	x9, 0\n\t"
38538         "b.eq	71f\n\t"
38539         "mov	x25, 192\n\t"
38540         "clz	x24, x9\n\t"
38541         "sub	x24, x25, x24\n\t"
38542         "b	73f\n\t"
38543         "\n71:\n\t"
38544         "cmp	x8, 0\n\t"
38545         "b.eq	72f\n\t"
38546         "mov	x25, 128\n\t"
38547         "clz	x24, x8\n\t"
38548         "sub	x24, x25, x24\n\t"
38549         "b	73f\n\t"
38550         "\n72:\n\t"
38551         "mov	x25, 64\n\t"
38552         "clz	x24, x7\n\t"
38553         "sub	x24, x25, x24\n\t"
38554         "\n73:\n\t"
38555         "\n80:\n\t"
38556         "lsr	x7, x7, 1\n\t"
38557         "lsr	x26, x8, 1\n\t"
38558         "lsr	x27, x9, 1\n\t"
38559         "orr	x7, x7, x8, lsl 63\n\t"
38560         "orr	x8, x26, x9, lsl 63\n\t"
38561         "orr	x9, x27, x10, lsl 63\n\t"
38562         "lsr	x10, x10, 1\n\t"
38563         "sub	x24, x24, 1\n\t"
38564         "ands	x25, x15, 1\n\t"
38565         "b.eq	81f\n\t"
38566         "adds	x15, x15, x20\n\t"
38567         "adcs	x16, x16, x21\n\t"
38568         "adcs	x17, x17, x22\n\t"
38569         "adcs	x19, x19, %[m]\n\t"
38570         "cset	x25, cs\n\t"
38571         "\n81:\n\t"
38572         "lsr	x15, x15, 1\n\t"
38573         "lsr	x26, x16, 1\n\t"
38574         "lsr	x27, x17, 1\n\t"
38575         "lsr	x28, x19, 1\n\t"
38576         "orr	x15, x15, x16, lsl 63\n\t"
38577         "orr	x16, x26, x17, lsl 63\n\t"
38578         "orr	x17, x27, x19, lsl 63\n\t"
38579         "orr	x19, x28, x25, lsl 63\n\t"
38580         "tst	x7, 1\n\t"
38581         "b.eq	80b\n\t"
38582         "b	90b\n\t"
38583         "\n100:\n\t"
38584         "str	x11, [%[r], 0]\n\t"
38585         "str	x12, [%[r], 8]\n\t"
38586         "str	x13, [%[r], 16]\n\t"
38587         "str	x14, [%[r], 24]\n\t"
38588         "b	102f\n\t"
38589         "\n101:\n\t"
38590         "str	x15, [%[r], 0]\n\t"
38591         "str	x16, [%[r], 8]\n\t"
38592         "str	x17, [%[r], 16]\n\t"
38593         "str	x19, [%[r], 24]\n\t"
38594         "\n102:\n\t"
38595         : [m] "+r" (m)
38596         : [r] "r" (r), [a] "r" (a)
38597         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
38598     );
38599 
38600     return MP_OKAY;
38601 }
38602 
38603 #endif /* WOLFSSL_SP_SMALL */
38604 
38605 /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
38606  *
38607  * p1   First point to add and holds result.
38608  * p2   Second point to add.
38609  * tmp  Temporary storage for intermediate numbers.
38610  */
sp_256_add_points_4(sp_point_256 * p1,const sp_point_256 * p2,sp_digit * tmp)38611 static void sp_256_add_points_4(sp_point_256* p1, const sp_point_256* p2,
38612     sp_digit* tmp)
38613 {
38614 
38615         sp_256_proj_point_add_4(p1, p1, p2, tmp);
38616     if (sp_256_iszero_4(p1->z)) {
38617         if (sp_256_iszero_4(p1->x) && sp_256_iszero_4(p1->y)) {
38618                 sp_256_proj_point_dbl_4(p1, p2, tmp);
38619         }
38620         else {
38621             /* Y ordinate is not used from here - don't set. */
38622             p1->x[0] = 0;
38623             p1->x[1] = 0;
38624             p1->x[2] = 0;
38625             p1->x[3] = 0;
38626             XMEMCPY(p1->z, p256_norm_mod, sizeof(p256_norm_mod));
38627         }
38628     }
38629 }
38630 
38631 /* Calculate the verification point: [e/s]G + [r/s]Q
38632  *
38633  * p1    Calculated point.
38634  * p2    Public point and temporary.
38635  * s     Second part of signature as a number.
38636  * u1    Temporary number.
38637  * u2    Temproray number.
38638  * heap  Heap to use for allocation.
38639  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
38640  */
sp_256_calc_vfy_point_4(sp_point_256 * p1,sp_point_256 * p2,sp_digit * s,sp_digit * u1,sp_digit * u2,sp_digit * tmp,void * heap)38641 static int sp_256_calc_vfy_point_4(sp_point_256* p1, sp_point_256* p2,
38642     sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
38643 {
38644     int err;
38645 
38646 #ifndef WOLFSSL_SP_SMALL
38647     err = sp_256_mod_inv_4(s, s, p256_order);
38648     if (err == MP_OKAY)
38649 #endif /* !WOLFSSL_SP_SMALL */
38650     {
38651         sp_256_mul_4(s, s, p256_norm_order);
38652         err = sp_256_mod_4(s, s, p256_order);
38653     }
38654     if (err == MP_OKAY) {
38655         sp_256_norm_4(s);
38656 #ifdef WOLFSSL_SP_SMALL
38657         {
38658             sp_256_mont_inv_order_4(s, s, tmp);
38659             sp_256_mont_mul_order_4(u1, u1, s);
38660             sp_256_mont_mul_order_4(u2, u2, s);
38661         }
38662 #else
38663         {
38664             sp_256_mont_mul_order_4(u1, u1, s);
38665             sp_256_mont_mul_order_4(u2, u2, s);
38666         }
38667 #endif /* WOLFSSL_SP_SMALL */
38668         {
38669             err = sp_256_ecc_mulmod_base_4(p1, u1, 0, 0, heap);
38670         }
38671     }
38672     if ((err == MP_OKAY) && sp_256_iszero_4(p1->z)) {
38673         p1->infinity = 1;
38674     }
38675     if (err == MP_OKAY) {
38676             err = sp_256_ecc_mulmod_4(p2, p2, u2, 0, 0, heap);
38677     }
38678     if ((err == MP_OKAY) && sp_256_iszero_4(p2->z)) {
38679         p2->infinity = 1;
38680     }
38681 
38682     if (err == MP_OKAY) {
38683         sp_256_add_points_4(p1, p2, tmp);
38684     }
38685 
38686     return err;
38687 }
38688 
38689 #ifdef HAVE_ECC_VERIFY
38690 /* Verify the signature values with the hash and public key.
38691  *   e = Truncate(hash, 256)
38692  *   u1 = e/s mod order
38693  *   u2 = r/s mod order
38694  *   r == (u1.G + u2.Q)->x mod order
38695  * Optimization: Leave point in projective form.
38696  *   (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
38697  *   (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
38698  * The hash is truncated to the first 256 bits.
38699  *
38700  * hash     Hash to sign.
38701  * hashLen  Length of the hash data.
38702  * rng      Random number generator.
38703  * priv     Private part of key - scalar.
38704  * rm       First part of result as an mp_int.
38705  * sm       Sirst part of result as an mp_int.
38706  * heap     Heap to use for allocation.
38707  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
38708  */
38709 #ifdef WOLFSSL_SP_NONBLOCK
38710 typedef struct sp_ecc_verify_256_ctx {
38711     int state;
38712     union {
38713         sp_256_ecc_mulmod_4_ctx mulmod_ctx;
38714         sp_256_mont_inv_order_4_ctx mont_inv_order_ctx;
38715         sp_256_proj_point_dbl_4_ctx dbl_ctx;
38716         sp_256_proj_point_add_4_ctx add_ctx;
38717     };
38718     sp_digit u1[2*4];
38719     sp_digit u2[2*4];
38720     sp_digit s[2*4];
38721     sp_digit tmp[2*4 * 5];
38722     sp_point_256 p1;
38723     sp_point_256 p2;
38724 } sp_ecc_verify_256_ctx;
38725 
sp_ecc_verify_256_nb(sp_ecc_ctx_t * sp_ctx,const byte * hash,word32 hashLen,const mp_int * pX,const mp_int * pY,const mp_int * pZ,const mp_int * rm,const mp_int * sm,int * res,void * heap)38726 int sp_ecc_verify_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
38727     word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
38728     const mp_int* rm, const mp_int* sm, int* res, void* heap)
38729 {
38730     int err = FP_WOULDBLOCK;
38731     sp_ecc_verify_256_ctx* ctx = (sp_ecc_verify_256_ctx*)sp_ctx->data;
38732 
38733     typedef char ctx_size_test[sizeof(sp_ecc_verify_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
38734     (void)sizeof(ctx_size_test);
38735 
38736     switch (ctx->state) {
38737     case 0: /* INIT */
38738         if (hashLen > 32U) {
38739             hashLen = 32U;
38740         }
38741 
38742         sp_256_from_bin(ctx->u1, 4, hash, (int)hashLen);
38743         sp_256_from_mp(ctx->u2, 4, rm);
38744         sp_256_from_mp(ctx->s, 4, sm);
38745         sp_256_from_mp(ctx->p2.x, 4, pX);
38746         sp_256_from_mp(ctx->p2.y, 4, pY);
38747         sp_256_from_mp(ctx->p2.z, 4, pZ);
38748         ctx->state = 1;
38749         break;
38750     case 1: /* NORMS0 */
38751         sp_256_mul_4(ctx->s, ctx->s, p256_norm_order);
38752         err = sp_256_mod_4(ctx->s, ctx->s, p256_order);
38753         if (err == MP_OKAY)
38754             ctx->state = 2;
38755         break;
38756     case 2: /* NORMS1 */
38757         sp_256_norm_4(ctx->s);
38758         XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
38759         ctx->state = 3;
38760         break;
38761     case 3: /* NORMS2 */
38762         err = sp_256_mont_inv_order_4_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
38763         if (err == MP_OKAY) {
38764             ctx->state = 4;
38765         }
38766         break;
38767     case 4: /* NORMS3 */
38768         sp_256_mont_mul_order_4(ctx->u1, ctx->u1, ctx->s);
38769         ctx->state = 5;
38770         break;
38771     case 5: /* NORMS4 */
38772         sp_256_mont_mul_order_4(ctx->u2, ctx->u2, ctx->s);
38773         XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
38774         ctx->state = 6;
38775         break;
38776     case 6: /* MULBASE */
38777         err = sp_256_ecc_mulmod_4_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p256_base, ctx->u1, 0, 0, heap);
38778         if (err == MP_OKAY) {
38779             if (sp_256_iszero_4(ctx->p1.z)) {
38780                 ctx->p1.infinity = 1;
38781             }
38782             XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
38783             ctx->state = 7;
38784         }
38785         break;
38786     case 7: /* MULMOD */
38787         err = sp_256_ecc_mulmod_4_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
38788         if (err == MP_OKAY) {
38789             if (sp_256_iszero_4(ctx->p2.z)) {
38790                 ctx->p2.infinity = 1;
38791             }
38792             XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
38793             ctx->state = 8;
38794         }
38795         break;
38796     case 8: /* ADD */
38797         err = sp_256_proj_point_add_4_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
38798         if (err == MP_OKAY)
38799             ctx->state = 9;
38800         break;
38801     case 9: /* MONT */
38802         /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
38803         /* Reload r and convert to Montgomery form. */
38804         sp_256_from_mp(ctx->u2, 4, rm);
38805         err = sp_256_mod_mul_norm_4(ctx->u2, ctx->u2, p256_mod);
38806         if (err == MP_OKAY)
38807             ctx->state = 10;
38808         break;
38809     case 10: /* SQR */
38810         /* u1 = r.z'.z' mod prime */
38811         sp_256_mont_sqr_4(ctx->p1.z, ctx->p1.z, p256_mod, p256_mp_mod);
38812         ctx->state = 11;
38813         break;
38814     case 11: /* MUL */
38815         sp_256_mont_mul_4(ctx->u1, ctx->u2, ctx->p1.z, p256_mod, p256_mp_mod);
38816         ctx->state = 12;
38817         break;
38818     case 12: /* RES */
38819     {
38820         sp_int64 c = 0;
38821         err = MP_OKAY; /* math okay, now check result */
38822         *res = (int)(sp_256_cmp_4(ctx->p1.x, ctx->u1) == 0);
38823         if (*res == 0) {
38824             sp_digit carry;
38825 
38826             /* Reload r and add order. */
38827             sp_256_from_mp(ctx->u2, 4, rm);
38828             carry = sp_256_add_4(ctx->u2, ctx->u2, p256_order);
38829             /* Carry means result is greater than mod and is not valid. */
38830             if (carry == 0) {
38831                 sp_256_norm_4(ctx->u2);
38832 
38833                 /* Compare with mod and if greater or equal then not valid. */
38834                 c = sp_256_cmp_4(ctx->u2, p256_mod);
38835             }
38836         }
38837         if ((*res == 0) && (c < 0)) {
38838             /* Convert to Montogomery form */
38839             err = sp_256_mod_mul_norm_4(ctx->u2, ctx->u2, p256_mod);
38840             if (err == MP_OKAY) {
38841                 /* u1 = (r + 1*order).z'.z' mod prime */
38842                 sp_256_mont_mul_4(ctx->u1, ctx->u2, ctx->p1.z, p256_mod,
38843                                                             p256_mp_mod);
38844                 *res = (int)(sp_256_cmp_4(ctx->p1.x, ctx->u1) == 0);
38845             }
38846         }
38847         break;
38848     }
38849     } /* switch */
38850 
38851     if (err == MP_OKAY && ctx->state != 12) {
38852         err = FP_WOULDBLOCK;
38853     }
38854 
38855     return err;
38856 }
38857 #endif /* WOLFSSL_SP_NONBLOCK */
38858 
sp_ecc_verify_256(const byte * hash,word32 hashLen,const mp_int * pX,const mp_int * pY,const mp_int * pZ,const mp_int * rm,const mp_int * sm,int * res,void * heap)38859 int sp_ecc_verify_256(const byte* hash, word32 hashLen, const mp_int* pX,
38860     const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
38861     int* res, void* heap)
38862 {
38863 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38864     sp_digit* u1 = NULL;
38865     sp_point_256* p1 = NULL;
38866 #else
38867     sp_digit  u1[16 * 4];
38868     sp_point_256 p1[2];
38869 #endif
38870     sp_digit* u2 = NULL;
38871     sp_digit* s = NULL;
38872     sp_digit* tmp = NULL;
38873     sp_point_256* p2 = NULL;
38874     sp_digit carry;
38875     sp_int64 c = 0;
38876     int err = MP_OKAY;
38877 
38878 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38879     if (err == MP_OKAY) {
38880         p1 = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
38881                                              DYNAMIC_TYPE_ECC);
38882         if (p1 == NULL)
38883             err = MEMORY_E;
38884     }
38885     if (err == MP_OKAY) {
38886         u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 4, heap,
38887                                                               DYNAMIC_TYPE_ECC);
38888         if (u1 == NULL)
38889             err = MEMORY_E;
38890     }
38891 #endif
38892 
38893     if (err == MP_OKAY) {
38894         u2  = u1 + 2 * 4;
38895         s   = u1 + 4 * 4;
38896         tmp = u1 + 6 * 4;
38897         p2 = p1 + 1;
38898 
38899         if (hashLen > 32U) {
38900             hashLen = 32U;
38901         }
38902 
38903         sp_256_from_bin(u1, 4, hash, (int)hashLen);
38904         sp_256_from_mp(u2, 4, rm);
38905         sp_256_from_mp(s, 4, sm);
38906         sp_256_from_mp(p2->x, 4, pX);
38907         sp_256_from_mp(p2->y, 4, pY);
38908         sp_256_from_mp(p2->z, 4, pZ);
38909 
38910         err = sp_256_calc_vfy_point_4(p1, p2, s, u1, u2, tmp, heap);
38911     }
38912     if (err == MP_OKAY) {
38913         /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
38914         /* Reload r and convert to Montgomery form. */
38915         sp_256_from_mp(u2, 4, rm);
38916         err = sp_256_mod_mul_norm_4(u2, u2, p256_mod);
38917     }
38918 
38919     if (err == MP_OKAY) {
38920         /* u1 = r.z'.z' mod prime */
38921         sp_256_mont_sqr_4(p1->z, p1->z, p256_mod, p256_mp_mod);
38922         sp_256_mont_mul_4(u1, u2, p1->z, p256_mod, p256_mp_mod);
38923         *res = (int)(sp_256_cmp_4(p1->x, u1) == 0);
38924         if (*res == 0) {
38925             /* Reload r and add order. */
38926             sp_256_from_mp(u2, 4, rm);
38927             carry = sp_256_add_4(u2, u2, p256_order);
38928             /* Carry means result is greater than mod and is not valid. */
38929             if (carry == 0) {
38930                 sp_256_norm_4(u2);
38931 
38932                 /* Compare with mod and if greater or equal then not valid. */
38933                 c = sp_256_cmp_4(u2, p256_mod);
38934             }
38935         }
38936         if ((*res == 0) && (c < 0)) {
38937             /* Convert to Montogomery form */
38938             err = sp_256_mod_mul_norm_4(u2, u2, p256_mod);
38939             if (err == MP_OKAY) {
38940                 /* u1 = (r + 1*order).z'.z' mod prime */
38941                 sp_256_mont_mul_4(u1, u2, p1->z, p256_mod,
38942                     p256_mp_mod);
38943                 *res = (sp_256_cmp_4(p1->x, u1) == 0);
38944             }
38945         }
38946     }
38947 
38948 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38949     if (u1 != NULL)
38950         XFREE(u1, heap, DYNAMIC_TYPE_ECC);
38951     if (p1 != NULL)
38952         XFREE(p1, heap, DYNAMIC_TYPE_ECC);
38953 #endif
38954 
38955     return err;
38956 }
38957 #endif /* HAVE_ECC_VERIFY */
38958 
38959 #ifdef HAVE_ECC_CHECK_KEY
38960 /* Check that the x and y oridinates are a valid point on the curve.
38961  *
38962  * point  EC point.
38963  * heap   Heap to use if dynamically allocating.
38964  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
38965  * not on the curve and MP_OKAY otherwise.
38966  */
sp_256_ecc_is_point_4(const sp_point_256 * point,void * heap)38967 static int sp_256_ecc_is_point_4(const sp_point_256* point,
38968     void* heap)
38969 {
38970 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38971     sp_digit* t1 = NULL;
38972 #else
38973     sp_digit t1[4 * 4];
38974 #endif
38975     sp_digit* t2 = NULL;
38976     int err = MP_OKAY;
38977 
38978 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
38979     t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 4, heap, DYNAMIC_TYPE_ECC);
38980     if (t1 == NULL)
38981         err = MEMORY_E;
38982 #endif
38983     (void)heap;
38984 
38985     if (err == MP_OKAY) {
38986         t2 = t1 + 2 * 4;
38987 
38988         sp_256_sqr_4(t1, point->y);
38989         (void)sp_256_mod_4(t1, t1, p256_mod);
38990         sp_256_sqr_4(t2, point->x);
38991         (void)sp_256_mod_4(t2, t2, p256_mod);
38992         sp_256_mul_4(t2, t2, point->x);
38993         (void)sp_256_mod_4(t2, t2, p256_mod);
38994         (void)sp_256_sub_4(t2, p256_mod, t2);
38995         sp_256_mont_add_4(t1, t1, t2, p256_mod);
38996 
38997         sp_256_mont_add_4(t1, t1, point->x, p256_mod);
38998         sp_256_mont_add_4(t1, t1, point->x, p256_mod);
38999         sp_256_mont_add_4(t1, t1, point->x, p256_mod);
39000 
39001         if (sp_256_cmp_4(t1, p256_b) != 0) {
39002             err = MP_VAL;
39003         }
39004     }
39005 
39006 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39007     if (t1 != NULL)
39008         XFREE(t1, heap, DYNAMIC_TYPE_ECC);
39009 #endif
39010 
39011     return err;
39012 }
39013 
39014 /* Check that the x and y oridinates are a valid point on the curve.
39015  *
39016  * pX  X ordinate of EC point.
39017  * pY  Y ordinate of EC point.
39018  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
39019  * not on the curve and MP_OKAY otherwise.
39020  */
sp_ecc_is_point_256(const mp_int * pX,const mp_int * pY)39021 int sp_ecc_is_point_256(const mp_int* pX, const mp_int* pY)
39022 {
39023 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39024     sp_point_256* pub = NULL;
39025 #else
39026     sp_point_256 pub[1];
39027 #endif
39028     const byte one[1] = { 1 };
39029     int err = MP_OKAY;
39030 
39031 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39032     pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
39033                                        DYNAMIC_TYPE_ECC);
39034     if (pub == NULL)
39035         err = MEMORY_E;
39036 #endif
39037 
39038     if (err == MP_OKAY) {
39039         sp_256_from_mp(pub->x, 4, pX);
39040         sp_256_from_mp(pub->y, 4, pY);
39041         sp_256_from_bin(pub->z, 4, one, (int)sizeof(one));
39042 
39043         err = sp_256_ecc_is_point_4(pub, NULL);
39044     }
39045 
39046 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39047     if (pub != NULL)
39048         XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
39049 #endif
39050 
39051     return err;
39052 }
39053 
39054 /* Check that the private scalar generates the EC point (px, py), the point is
39055  * on the curve and the point has the correct order.
39056  *
39057  * pX     X ordinate of EC point.
39058  * pY     Y ordinate of EC point.
39059  * privm  Private scalar that generates EC point.
39060  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
39061  * not on the curve, ECC_INF_E if the point does not have the correct order,
39062  * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
39063  * MP_OKAY otherwise.
39064  */
sp_ecc_check_key_256(const mp_int * pX,const mp_int * pY,const mp_int * privm,void * heap)39065 int sp_ecc_check_key_256(const mp_int* pX, const mp_int* pY,
39066     const mp_int* privm, void* heap)
39067 {
39068 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39069     sp_digit* priv = NULL;
39070     sp_point_256* pub = NULL;
39071 #else
39072     sp_digit priv[4];
39073     sp_point_256 pub[2];
39074 #endif
39075     sp_point_256* p = NULL;
39076     const byte one[1] = { 1 };
39077     int err = MP_OKAY;
39078 
39079 
39080     /* Quick check the lengs of public key ordinates and private key are in
39081      * range. Proper check later.
39082      */
39083     if (((mp_count_bits(pX) > 256) ||
39084         (mp_count_bits(pY) > 256) ||
39085         ((privm != NULL) && (mp_count_bits(privm) > 256)))) {
39086         err = ECC_OUT_OF_RANGE_E;
39087     }
39088 
39089 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39090     if (err == MP_OKAY) {
39091         pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
39092                                            DYNAMIC_TYPE_ECC);
39093         if (pub == NULL)
39094             err = MEMORY_E;
39095     }
39096     if (err == MP_OKAY && privm) {
39097         priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4, heap,
39098                                   DYNAMIC_TYPE_ECC);
39099         if (priv == NULL)
39100             err = MEMORY_E;
39101     }
39102 #endif
39103 
39104     if (err == MP_OKAY) {
39105         p = pub + 1;
39106 
39107         sp_256_from_mp(pub->x, 4, pX);
39108         sp_256_from_mp(pub->y, 4, pY);
39109         sp_256_from_bin(pub->z, 4, one, (int)sizeof(one));
39110         if (privm)
39111             sp_256_from_mp(priv, 4, privm);
39112 
39113         /* Check point at infinitiy. */
39114         if ((sp_256_iszero_4(pub->x) != 0) &&
39115             (sp_256_iszero_4(pub->y) != 0)) {
39116             err = ECC_INF_E;
39117         }
39118     }
39119 
39120     /* Check range of X and Y */
39121     if ((err == MP_OKAY) &&
39122             ((sp_256_cmp_4(pub->x, p256_mod) >= 0) ||
39123              (sp_256_cmp_4(pub->y, p256_mod) >= 0))) {
39124         err = ECC_OUT_OF_RANGE_E;
39125     }
39126 
39127     if (err == MP_OKAY) {
39128         /* Check point is on curve */
39129         err = sp_256_ecc_is_point_4(pub, heap);
39130     }
39131 
39132     if (err == MP_OKAY) {
39133         /* Point * order = infinity */
39134             err = sp_256_ecc_mulmod_4(p, pub, p256_order, 1, 1, heap);
39135     }
39136     /* Check result is infinity */
39137     if ((err == MP_OKAY) && ((sp_256_iszero_4(p->x) == 0) ||
39138                              (sp_256_iszero_4(p->y) == 0))) {
39139         err = ECC_INF_E;
39140     }
39141 
39142     if (privm) {
39143         if (err == MP_OKAY) {
39144             /* Base * private = point */
39145                 err = sp_256_ecc_mulmod_base_4(p, priv, 1, 1, heap);
39146         }
39147         /* Check result is public key */
39148         if ((err == MP_OKAY) &&
39149                 ((sp_256_cmp_4(p->x, pub->x) != 0) ||
39150                  (sp_256_cmp_4(p->y, pub->y) != 0))) {
39151             err = ECC_PRIV_KEY_E;
39152         }
39153     }
39154 
39155 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39156     if (pub != NULL)
39157         XFREE(pub, heap, DYNAMIC_TYPE_ECC);
39158     if (priv != NULL)
39159         XFREE(priv, heap, DYNAMIC_TYPE_ECC);
39160 #endif
39161 
39162     return err;
39163 }
39164 #endif
39165 #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
39166 /* Add two projective EC points together.
39167  * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
39168  *
39169  * pX   First EC point's X ordinate.
39170  * pY   First EC point's Y ordinate.
39171  * pZ   First EC point's Z ordinate.
39172  * qX   Second EC point's X ordinate.
39173  * qY   Second EC point's Y ordinate.
39174  * qZ   Second EC point's Z ordinate.
39175  * rX   Resultant EC point's X ordinate.
39176  * rY   Resultant EC point's Y ordinate.
39177  * rZ   Resultant EC point's Z ordinate.
39178  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
39179  */
sp_ecc_proj_add_point_256(mp_int * pX,mp_int * pY,mp_int * pZ,mp_int * qX,mp_int * qY,mp_int * qZ,mp_int * rX,mp_int * rY,mp_int * rZ)39180 int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
39181                               mp_int* qX, mp_int* qY, mp_int* qZ,
39182                               mp_int* rX, mp_int* rY, mp_int* rZ)
39183 {
39184 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39185     sp_digit* tmp = NULL;
39186     sp_point_256* p = NULL;
39187 #else
39188     sp_digit tmp[2 * 4 * 5];
39189     sp_point_256 p[2];
39190 #endif
39191     sp_point_256* q = NULL;
39192     int err = MP_OKAY;
39193 
39194 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39195     if (err == MP_OKAY) {
39196         p = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, NULL,
39197                                          DYNAMIC_TYPE_ECC);
39198         if (p == NULL)
39199             err = MEMORY_E;
39200     }
39201     if (err == MP_OKAY) {
39202         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, NULL,
39203                                  DYNAMIC_TYPE_ECC);
39204         if (tmp == NULL) {
39205             err = MEMORY_E;
39206         }
39207     }
39208 #endif
39209 
39210     if (err == MP_OKAY) {
39211         q = p + 1;
39212 
39213         sp_256_from_mp(p->x, 4, pX);
39214         sp_256_from_mp(p->y, 4, pY);
39215         sp_256_from_mp(p->z, 4, pZ);
39216         sp_256_from_mp(q->x, 4, qX);
39217         sp_256_from_mp(q->y, 4, qY);
39218         sp_256_from_mp(q->z, 4, qZ);
39219         p->infinity = sp_256_iszero_4(p->x) &
39220                       sp_256_iszero_4(p->y);
39221         q->infinity = sp_256_iszero_4(q->x) &
39222                       sp_256_iszero_4(q->y);
39223 
39224             sp_256_proj_point_add_4(p, p, q, tmp);
39225     }
39226 
39227     if (err == MP_OKAY) {
39228         err = sp_256_to_mp(p->x, rX);
39229     }
39230     if (err == MP_OKAY) {
39231         err = sp_256_to_mp(p->y, rY);
39232     }
39233     if (err == MP_OKAY) {
39234         err = sp_256_to_mp(p->z, rZ);
39235     }
39236 
39237 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39238     if (tmp != NULL)
39239         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
39240     if (p != NULL)
39241         XFREE(p, NULL, DYNAMIC_TYPE_ECC);
39242 #endif
39243 
39244     return err;
39245 }
39246 
39247 /* Double a projective EC point.
39248  * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
39249  *
39250  * pX   EC point's X ordinate.
39251  * pY   EC point's Y ordinate.
39252  * pZ   EC point's Z ordinate.
39253  * rX   Resultant EC point's X ordinate.
39254  * rY   Resultant EC point's Y ordinate.
39255  * rZ   Resultant EC point's Z ordinate.
39256  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
39257  */
sp_ecc_proj_dbl_point_256(mp_int * pX,mp_int * pY,mp_int * pZ,mp_int * rX,mp_int * rY,mp_int * rZ)39258 int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
39259                               mp_int* rX, mp_int* rY, mp_int* rZ)
39260 {
39261 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39262     sp_digit* tmp = NULL;
39263     sp_point_256* p = NULL;
39264 #else
39265     sp_digit tmp[2 * 4 * 2];
39266     sp_point_256 p[1];
39267 #endif
39268     int err = MP_OKAY;
39269 
39270 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39271     if (err == MP_OKAY) {
39272         p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
39273                                          DYNAMIC_TYPE_ECC);
39274         if (p == NULL)
39275             err = MEMORY_E;
39276     }
39277     if (err == MP_OKAY) {
39278         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 2, NULL,
39279                                  DYNAMIC_TYPE_ECC);
39280         if (tmp == NULL)
39281             err = MEMORY_E;
39282     }
39283 #endif
39284 
39285     if (err == MP_OKAY) {
39286         sp_256_from_mp(p->x, 4, pX);
39287         sp_256_from_mp(p->y, 4, pY);
39288         sp_256_from_mp(p->z, 4, pZ);
39289         p->infinity = sp_256_iszero_4(p->x) &
39290                       sp_256_iszero_4(p->y);
39291 
39292             sp_256_proj_point_dbl_4(p, p, tmp);
39293     }
39294 
39295     if (err == MP_OKAY) {
39296         err = sp_256_to_mp(p->x, rX);
39297     }
39298     if (err == MP_OKAY) {
39299         err = sp_256_to_mp(p->y, rY);
39300     }
39301     if (err == MP_OKAY) {
39302         err = sp_256_to_mp(p->z, rZ);
39303     }
39304 
39305 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39306     if (tmp != NULL)
39307         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
39308     if (p != NULL)
39309         XFREE(p, NULL, DYNAMIC_TYPE_ECC);
39310 #endif
39311 
39312     return err;
39313 }
39314 
39315 /* Map a projective EC point to affine in place.
39316  * pZ will be one.
39317  *
39318  * pX   EC point's X ordinate.
39319  * pY   EC point's Y ordinate.
39320  * pZ   EC point's Z ordinate.
39321  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
39322  */
sp_ecc_map_256(mp_int * pX,mp_int * pY,mp_int * pZ)39323 int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
39324 {
39325 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39326     sp_digit* tmp = NULL;
39327     sp_point_256* p = NULL;
39328 #else
39329     sp_digit tmp[2 * 4 * 4];
39330     sp_point_256 p[1];
39331 #endif
39332     int err = MP_OKAY;
39333 
39334 
39335 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39336     if (err == MP_OKAY) {
39337         p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
39338                                          DYNAMIC_TYPE_ECC);
39339         if (p == NULL)
39340             err = MEMORY_E;
39341     }
39342     if (err == MP_OKAY) {
39343         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 4, NULL,
39344                                  DYNAMIC_TYPE_ECC);
39345         if (tmp == NULL)
39346             err = MEMORY_E;
39347     }
39348 #endif
39349     if (err == MP_OKAY) {
39350         sp_256_from_mp(p->x, 4, pX);
39351         sp_256_from_mp(p->y, 4, pY);
39352         sp_256_from_mp(p->z, 4, pZ);
39353         p->infinity = sp_256_iszero_4(p->x) &
39354                       sp_256_iszero_4(p->y);
39355 
39356             sp_256_map_4(p, p, tmp);
39357     }
39358 
39359     if (err == MP_OKAY) {
39360         err = sp_256_to_mp(p->x, pX);
39361     }
39362     if (err == MP_OKAY) {
39363         err = sp_256_to_mp(p->y, pY);
39364     }
39365     if (err == MP_OKAY) {
39366         err = sp_256_to_mp(p->z, pZ);
39367     }
39368 
39369 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39370     if (tmp != NULL)
39371         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
39372     if (p != NULL)
39373         XFREE(p, NULL, DYNAMIC_TYPE_ECC);
39374 #endif
39375 
39376     return err;
39377 }
39378 #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
39379 #ifdef HAVE_COMP_KEY
39380 /* Find the square root of a number mod the prime of the curve.
39381  *
39382  * y  The number to operate on and the result.
39383  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
39384  */
sp_256_mont_sqrt_4(sp_digit * y)39385 static int sp_256_mont_sqrt_4(sp_digit* y)
39386 {
39387 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39388     sp_digit* t1 = NULL;
39389 #else
39390     sp_digit t1[4 * 4];
39391 #endif
39392     sp_digit* t2 = NULL;
39393     int err = MP_OKAY;
39394 
39395 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39396     t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 4, NULL, DYNAMIC_TYPE_ECC);
39397     if (t1 == NULL) {
39398         err = MEMORY_E;
39399     }
39400 #endif
39401 
39402     if (err == MP_OKAY) {
39403         t2 = t1 + 2 * 4;
39404 
39405         {
39406             /* t2 = y ^ 0x2 */
39407             sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod);
39408             /* t1 = y ^ 0x3 */
39409             sp_256_mont_mul_4(t1, t2, y, p256_mod, p256_mp_mod);
39410             /* t2 = y ^ 0xc */
39411             sp_256_mont_sqr_n_4(t2, t1, 2, p256_mod, p256_mp_mod);
39412             /* t1 = y ^ 0xf */
39413             sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod);
39414             /* t2 = y ^ 0xf0 */
39415             sp_256_mont_sqr_n_4(t2, t1, 4, p256_mod, p256_mp_mod);
39416             /* t1 = y ^ 0xff */
39417             sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod);
39418             /* t2 = y ^ 0xff00 */
39419             sp_256_mont_sqr_n_4(t2, t1, 8, p256_mod, p256_mp_mod);
39420             /* t1 = y ^ 0xffff */
39421             sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod);
39422             /* t2 = y ^ 0xffff0000 */
39423             sp_256_mont_sqr_n_4(t2, t1, 16, p256_mod, p256_mp_mod);
39424             /* t1 = y ^ 0xffffffff */
39425             sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod);
39426             /* t1 = y ^ 0xffffffff00000000 */
39427             sp_256_mont_sqr_n_4(t1, t1, 32, p256_mod, p256_mp_mod);
39428             /* t1 = y ^ 0xffffffff00000001 */
39429             sp_256_mont_mul_4(t1, t1, y, p256_mod, p256_mp_mod);
39430             /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
39431             sp_256_mont_sqr_n_4(t1, t1, 96, p256_mod, p256_mp_mod);
39432             /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
39433             sp_256_mont_mul_4(t1, t1, y, p256_mod, p256_mp_mod);
39434             sp_256_mont_sqr_n_4(y, t1, 94, p256_mod, p256_mp_mod);
39435         }
39436     }
39437 
39438 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39439     if (t1 != NULL)
39440         XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
39441 #endif
39442 
39443     return err;
39444 }
39445 
39446 
39447 /* Uncompress the point given the X ordinate.
39448  *
39449  * xm    X ordinate.
39450  * odd   Whether the Y ordinate is odd.
39451  * ym    Calculated Y ordinate.
39452  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
39453  */
sp_ecc_uncompress_256(mp_int * xm,int odd,mp_int * ym)39454 int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
39455 {
39456 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39457     sp_digit* x = NULL;
39458 #else
39459     sp_digit x[4 * 4];
39460 #endif
39461     sp_digit* y = NULL;
39462     int err = MP_OKAY;
39463 
39464 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39465     x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 4, NULL, DYNAMIC_TYPE_ECC);
39466     if (x == NULL)
39467         err = MEMORY_E;
39468 #endif
39469 
39470     if (err == MP_OKAY) {
39471         y = x + 2 * 4;
39472 
39473         sp_256_from_mp(x, 4, xm);
39474         err = sp_256_mod_mul_norm_4(x, x, p256_mod);
39475     }
39476     if (err == MP_OKAY) {
39477         /* y = x^3 */
39478         {
39479             sp_256_mont_sqr_4(y, x, p256_mod, p256_mp_mod);
39480             sp_256_mont_mul_4(y, y, x, p256_mod, p256_mp_mod);
39481         }
39482         /* y = x^3 - 3x */
39483         sp_256_mont_sub_4(y, y, x, p256_mod);
39484         sp_256_mont_sub_4(y, y, x, p256_mod);
39485         sp_256_mont_sub_4(y, y, x, p256_mod);
39486         /* y = x^3 - 3x + b */
39487         err = sp_256_mod_mul_norm_4(x, p256_b, p256_mod);
39488     }
39489     if (err == MP_OKAY) {
39490         sp_256_mont_add_4(y, y, x, p256_mod);
39491         /* y = sqrt(x^3 - 3x + b) */
39492         err = sp_256_mont_sqrt_4(y);
39493     }
39494     if (err == MP_OKAY) {
39495         XMEMSET(y + 4, 0, 4U * sizeof(sp_digit));
39496         sp_256_mont_reduce_4(y, p256_mod, p256_mp_mod);
39497         if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
39498             sp_256_mont_sub_4(y, p256_mod, y, p256_mod);
39499         }
39500 
39501         err = sp_256_to_mp(y, ym);
39502     }
39503 
39504 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
39505     if (x != NULL)
39506         XFREE(x, NULL, DYNAMIC_TYPE_ECC);
39507 #endif
39508 
39509     return err;
39510 }
39511 #endif
39512 #endif /* !WOLFSSL_SP_NO_256 */
39513 #ifdef WOLFSSL_SP_384
39514 
39515 /* Point structure to use. */
39516 typedef struct sp_point_384 {
39517     /* X ordinate of point. */
39518     sp_digit x[2 * 6];
39519     /* Y ordinate of point. */
39520     sp_digit y[2 * 6];
39521     /* Z ordinate of point. */
39522     sp_digit z[2 * 6];
39523     /* Indicates point is at infinity. */
39524     int infinity;
39525 } sp_point_384;
39526 
39527 /* The modulus (prime) of the curve P384. */
39528 static const sp_digit p384_mod[6] = {
39529     0x00000000ffffffffL,0xffffffff00000000L,0xfffffffffffffffeL,
39530     0xffffffffffffffffL,0xffffffffffffffffL,0xffffffffffffffffL
39531 };
39532 /* The Montgomery normalizer for modulus of the curve P384. */
39533 static const sp_digit p384_norm_mod[6] = {
39534     0xffffffff00000001L,0x00000000ffffffffL,0x0000000000000001L,
39535     0x0000000000000000L,0x0000000000000000L,0x0000000000000000L
39536 };
39537 /* The Montgomery multiplier for modulus of the curve P384. */
39538 static sp_digit p384_mp_mod = 0x0000000100000001;
39539 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
39540                                             defined(HAVE_ECC_VERIFY)
39541 /* The order of the curve P384. */
39542 static const sp_digit p384_order[6] = {
39543     0xecec196accc52973L,0x581a0db248b0a77aL,0xc7634d81f4372ddfL,
39544     0xffffffffffffffffL,0xffffffffffffffffL,0xffffffffffffffffL
39545 };
39546 #endif
39547 /* The order of the curve P384 minus 2. */
39548 static const sp_digit p384_order2[6] = {
39549     0xecec196accc52971L,0x581a0db248b0a77aL,0xc7634d81f4372ddfL,
39550     0xffffffffffffffffL,0xffffffffffffffffL,0xffffffffffffffffL
39551 };
39552 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
39553 /* The Montgomery normalizer for order of the curve P384. */
39554 static const sp_digit p384_norm_order[6] = {
39555     0x1313e695333ad68dL,0xa7e5f24db74f5885L,0x389cb27e0bc8d220L,
39556     0x0000000000000000L,0x0000000000000000L,0x0000000000000000L
39557 };
39558 #endif
39559 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
39560 /* The Montgomery multiplier for order of the curve P384. */
39561 static sp_digit p384_mp_order = 0x6ed46089e88fdc45L;
39562 #endif
39563 #ifdef WOLFSSL_SP_SMALL
39564 /* The base point of curve P384. */
39565 static const sp_point_384 p384_base = {
39566     /* X ordinate */
39567     {
39568         0x3a545e3872760ab7L,0x5502f25dbf55296cL,0x59f741e082542a38L,
39569         0x6e1d3b628ba79b98L,0x8eb1c71ef320ad74L,0xaa87ca22be8b0537L,
39570         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
39571         (sp_digit)0
39572     },
39573     /* Y ordinate */
39574     {
39575         0x7a431d7c90ea0e5fL,0x0a60b1ce1d7e819dL,0xe9da3113b5f0b8c0L,
39576         0xf8f41dbd289a147cL,0x5d9e98bf9292dc29L,0x3617de4a96262c6fL,
39577         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
39578         (sp_digit)0
39579     },
39580     /* Z ordinate */
39581     {
39582         0x0000000000000001L,0x0000000000000000L,0x0000000000000000L,
39583         0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,
39584         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
39585         (sp_digit)0
39586     },
39587     /* infinity */
39588     0
39589 };
39590 #endif /* WOLFSSL_SP_SMALL */
39591 #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
39592 static const sp_digit p384_b[6] = {
39593     0x2a85c8edd3ec2aefL,0xc656398d8a2ed19dL,0x0314088f5013875aL,
39594     0x181d9c6efe814112L,0x988e056be3f82d19L,0xb3312fa7e23ee7e4L
39595 };
39596 #endif
39597 
39598 #ifdef WOLFSSL_SP_SMALL
39599 /* Multiply a and b into r. (r = a * b)
39600  *
39601  * r  A single precision integer.
39602  * a  A single precision integer.
39603  * b  A single precision integer.
39604  */
sp_384_mul_6(sp_digit * r,const sp_digit * a,const sp_digit * b)39605 static void sp_384_mul_6(sp_digit* r, const sp_digit* a, const sp_digit* b)
39606 {
39607     sp_digit tmp[12];
39608 
39609     __asm__ __volatile__ (
39610         "mov	x5, 0\n\t"
39611         "mov	x6, 0\n\t"
39612         "mov	x7, 0\n\t"
39613         "mov	x8, 0\n\t"
39614         "\n1:\n\t"
39615         "subs	x3, x5, 40\n\t"
39616         "csel	x3, xzr, x3, cc\n\t"
39617         "sub	x4, x5, x3\n\t"
39618         "\n2:\n\t"
39619         "ldr	x10, [%[a], x3]\n\t"
39620         "ldr	x11, [%[b], x4]\n\t"
39621         "mul	x9, x10, x11\n\t"
39622         "umulh	x10, x10, x11\n\t"
39623         "adds	x6, x6, x9\n\t"
39624         "adcs	x7, x7, x10\n\t"
39625         "adc	x8, x8, xzr\n\t"
39626         "add	x3, x3, #8\n\t"
39627         "sub	x4, x4, #8\n\t"
39628         "cmp	x3, 48\n\t"
39629         "b.eq	3f\n\t"
39630         "cmp	x3, x5\n\t"
39631         "b.le	2b\n\t"
39632         "\n3:\n\t"
39633         "str	x6, [%[r], x5]\n\t"
39634         "mov	x6, x7\n\t"
39635         "mov	x7, x8\n\t"
39636         "mov	x8, #0\n\t"
39637         "add	x5, x5, #8\n\t"
39638         "cmp	x5, 80\n\t"
39639         "b.le	1b\n\t"
39640         "str	x6, [%[r], x5]\n\t"
39641         :
39642         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
39643         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
39644     );
39645 
39646     XMEMCPY(r, tmp, sizeof(tmp));
39647 }
39648 
39649 #else
39650 /* Multiply a and b into r. (r = a * b)
39651  *
39652  * r  A single precision integer.
39653  * a  A single precision integer.
39654  * b  A single precision integer.
39655  */
sp_384_mul_6(sp_digit * r,const sp_digit * a,const sp_digit * b)39656 static void sp_384_mul_6(sp_digit* r, const sp_digit* a, const sp_digit* b)
39657 {
39658     __asm__ __volatile__ (
39659         "ldp	x8, x9, [%[a], 0]\n\t"
39660         "ldp	x10, x11, [%[a], 16]\n\t"
39661         "ldp	x12, x13, [%[a], 32]\n\t"
39662         "ldp	x14, x15, [%[b], 0]\n\t"
39663         "ldp	x16, x17, [%[b], 16]\n\t"
39664         "ldp	x19, x20, [%[b], 32]\n\t"
39665         "#  A[0] * B[0]\n\t"
39666         "mul	x3, x8, x14\n\t"
39667         "umulh	x4, x8, x14\n\t"
39668         "str	x3, [%[r]]\n\t"
39669         "#  A[0] * B[1]\n\t"
39670         "mul	x6, x8, x15\n\t"
39671         "umulh	x7, x8, x15\n\t"
39672         "adds	x4, x4, x6\n\t"
39673         "#  A[1] * B[0]\n\t"
39674         "mul	x6, x9, x14\n\t"
39675         "adc	x5, xzr, x7\n\t"
39676         "umulh	x7, x9, x14\n\t"
39677         "adds	x4, x4, x6\n\t"
39678         "adcs	x5, x5, x7\n\t"
39679         "str	x4, [%[r], 8]\n\t"
39680         "adc	x3, xzr, xzr\n\t"
39681         "#  A[0] * B[2]\n\t"
39682         "mul	x6, x8, x16\n\t"
39683         "umulh	x7, x8, x16\n\t"
39684         "adds	x5, x5, x6\n\t"
39685         "#  A[1] * B[1]\n\t"
39686         "mul	x6, x9, x15\n\t"
39687         "adcs	x3, x3, x7\n\t"
39688         "umulh	x7, x9, x15\n\t"
39689         "adc	x4, xzr, xzr\n\t"
39690         "adds	x5, x5, x6\n\t"
39691         "#  A[2] * B[0]\n\t"
39692         "mul	x6, x10, x14\n\t"
39693         "adcs	x3, x3, x7\n\t"
39694         "umulh	x7, x10, x14\n\t"
39695         "adc	x4, x4, xzr\n\t"
39696         "adds	x5, x5, x6\n\t"
39697         "adcs	x3, x3, x7\n\t"
39698         "str	x5, [%[r], 16]\n\t"
39699         "adc	x4, x4, xzr\n\t"
39700         "#  A[0] * B[3]\n\t"
39701         "mul	x6, x8, x17\n\t"
39702         "umulh	x7, x8, x17\n\t"
39703         "adds	x3, x3, x6\n\t"
39704         "#  A[1] * B[2]\n\t"
39705         "mul	x6, x9, x16\n\t"
39706         "adcs	x4, x4, x7\n\t"
39707         "umulh	x7, x9, x16\n\t"
39708         "adc	x5, xzr, xzr\n\t"
39709         "adds	x3, x3, x6\n\t"
39710         "#  A[2] * B[1]\n\t"
39711         "mul	x6, x10, x15\n\t"
39712         "adcs	x4, x4, x7\n\t"
39713         "umulh	x7, x10, x15\n\t"
39714         "adc	x5, x5, xzr\n\t"
39715         "adds	x3, x3, x6\n\t"
39716         "#  A[3] * B[0]\n\t"
39717         "mul	x6, x11, x14\n\t"
39718         "adcs	x4, x4, x7\n\t"
39719         "umulh	x7, x11, x14\n\t"
39720         "adc	x5, x5, xzr\n\t"
39721         "adds	x3, x3, x6\n\t"
39722         "adcs	x4, x4, x7\n\t"
39723         "str	x3, [%[r], 24]\n\t"
39724         "adc	x5, x5, xzr\n\t"
39725         "#  A[0] * B[4]\n\t"
39726         "mul	x6, x8, x19\n\t"
39727         "umulh	x7, x8, x19\n\t"
39728         "adds	x4, x4, x6\n\t"
39729         "#  A[1] * B[3]\n\t"
39730         "mul	x6, x9, x17\n\t"
39731         "adcs	x5, x5, x7\n\t"
39732         "umulh	x7, x9, x17\n\t"
39733         "adc	x3, xzr, xzr\n\t"
39734         "adds	x4, x4, x6\n\t"
39735         "#  A[2] * B[2]\n\t"
39736         "mul	x6, x10, x16\n\t"
39737         "adcs	x5, x5, x7\n\t"
39738         "umulh	x7, x10, x16\n\t"
39739         "adc	x3, x3, xzr\n\t"
39740         "adds	x4, x4, x6\n\t"
39741         "#  A[3] * B[1]\n\t"
39742         "mul	x6, x11, x15\n\t"
39743         "adcs	x5, x5, x7\n\t"
39744         "umulh	x7, x11, x15\n\t"
39745         "adc	x3, x3, xzr\n\t"
39746         "adds	x4, x4, x6\n\t"
39747         "#  A[4] * B[0]\n\t"
39748         "mul	x6, x12, x14\n\t"
39749         "adcs	x5, x5, x7\n\t"
39750         "umulh	x7, x12, x14\n\t"
39751         "adc	x3, x3, xzr\n\t"
39752         "adds	x4, x4, x6\n\t"
39753         "adcs	x5, x5, x7\n\t"
39754         "str	x4, [%[r], 32]\n\t"
39755         "adc	x3, x3, xzr\n\t"
39756         "#  A[0] * B[5]\n\t"
39757         "mul	x6, x8, x20\n\t"
39758         "umulh	x7, x8, x20\n\t"
39759         "adds	x5, x5, x6\n\t"
39760         "#  A[1] * B[4]\n\t"
39761         "mul	x6, x9, x19\n\t"
39762         "adcs	x3, x3, x7\n\t"
39763         "umulh	x7, x9, x19\n\t"
39764         "adc	x4, xzr, xzr\n\t"
39765         "adds	x5, x5, x6\n\t"
39766         "#  A[2] * B[3]\n\t"
39767         "mul	x6, x10, x17\n\t"
39768         "adcs	x3, x3, x7\n\t"
39769         "umulh	x7, x10, x17\n\t"
39770         "adc	x4, x4, xzr\n\t"
39771         "adds	x5, x5, x6\n\t"
39772         "#  A[3] * B[2]\n\t"
39773         "mul	x6, x11, x16\n\t"
39774         "adcs	x3, x3, x7\n\t"
39775         "umulh	x7, x11, x16\n\t"
39776         "adc	x4, x4, xzr\n\t"
39777         "adds	x5, x5, x6\n\t"
39778         "#  A[4] * B[1]\n\t"
39779         "mul	x6, x12, x15\n\t"
39780         "adcs	x3, x3, x7\n\t"
39781         "umulh	x7, x12, x15\n\t"
39782         "adc	x4, x4, xzr\n\t"
39783         "adds	x5, x5, x6\n\t"
39784         "#  A[5] * B[0]\n\t"
39785         "mul	x6, x13, x14\n\t"
39786         "adcs	x3, x3, x7\n\t"
39787         "umulh	x7, x13, x14\n\t"
39788         "adc	x4, x4, xzr\n\t"
39789         "adds	x5, x5, x6\n\t"
39790         "adcs	x3, x3, x7\n\t"
39791         "str	x5, [%[r], 40]\n\t"
39792         "adc	x4, x4, xzr\n\t"
39793         "#  A[1] * B[5]\n\t"
39794         "mul	x6, x9, x20\n\t"
39795         "umulh	x7, x9, x20\n\t"
39796         "adds	x3, x3, x6\n\t"
39797         "#  A[2] * B[4]\n\t"
39798         "mul	x6, x10, x19\n\t"
39799         "adcs	x4, x4, x7\n\t"
39800         "umulh	x7, x10, x19\n\t"
39801         "adc	x5, xzr, xzr\n\t"
39802         "adds	x3, x3, x6\n\t"
39803         "#  A[3] * B[3]\n\t"
39804         "mul	x6, x11, x17\n\t"
39805         "adcs	x4, x4, x7\n\t"
39806         "umulh	x7, x11, x17\n\t"
39807         "adc	x5, x5, xzr\n\t"
39808         "adds	x3, x3, x6\n\t"
39809         "#  A[4] * B[2]\n\t"
39810         "mul	x6, x12, x16\n\t"
39811         "adcs	x4, x4, x7\n\t"
39812         "umulh	x7, x12, x16\n\t"
39813         "adc	x5, x5, xzr\n\t"
39814         "adds	x3, x3, x6\n\t"
39815         "#  A[5] * B[1]\n\t"
39816         "mul	x6, x13, x15\n\t"
39817         "adcs	x4, x4, x7\n\t"
39818         "umulh	x7, x13, x15\n\t"
39819         "adc	x5, x5, xzr\n\t"
39820         "adds	x3, x3, x6\n\t"
39821         "adcs	x4, x4, x7\n\t"
39822         "str	x3, [%[r], 48]\n\t"
39823         "adc	x5, x5, xzr\n\t"
39824         "#  A[2] * B[5]\n\t"
39825         "mul	x6, x10, x20\n\t"
39826         "umulh	x7, x10, x20\n\t"
39827         "adds	x4, x4, x6\n\t"
39828         "#  A[3] * B[4]\n\t"
39829         "mul	x6, x11, x19\n\t"
39830         "adcs	x5, x5, x7\n\t"
39831         "umulh	x7, x11, x19\n\t"
39832         "adc	x3, xzr, xzr\n\t"
39833         "adds	x4, x4, x6\n\t"
39834         "#  A[4] * B[3]\n\t"
39835         "mul	x6, x12, x17\n\t"
39836         "adcs	x5, x5, x7\n\t"
39837         "umulh	x7, x12, x17\n\t"
39838         "adc	x3, x3, xzr\n\t"
39839         "adds	x4, x4, x6\n\t"
39840         "#  A[5] * B[2]\n\t"
39841         "mul	x6, x13, x16\n\t"
39842         "adcs	x5, x5, x7\n\t"
39843         "umulh	x7, x13, x16\n\t"
39844         "adc	x3, x3, xzr\n\t"
39845         "adds	x4, x4, x6\n\t"
39846         "adcs	x5, x5, x7\n\t"
39847         "str	x4, [%[r], 56]\n\t"
39848         "adc	x3, x3, xzr\n\t"
39849         "#  A[3] * B[5]\n\t"
39850         "mul	x6, x11, x20\n\t"
39851         "umulh	x7, x11, x20\n\t"
39852         "adds	x5, x5, x6\n\t"
39853         "#  A[4] * B[4]\n\t"
39854         "mul	x6, x12, x19\n\t"
39855         "adcs	x3, x3, x7\n\t"
39856         "umulh	x7, x12, x19\n\t"
39857         "adc	x4, xzr, xzr\n\t"
39858         "adds	x5, x5, x6\n\t"
39859         "#  A[5] * B[3]\n\t"
39860         "mul	x6, x13, x17\n\t"
39861         "adcs	x3, x3, x7\n\t"
39862         "umulh	x7, x13, x17\n\t"
39863         "adc	x4, x4, xzr\n\t"
39864         "adds	x5, x5, x6\n\t"
39865         "adcs	x3, x3, x7\n\t"
39866         "str	x5, [%[r], 64]\n\t"
39867         "adc	x4, x4, xzr\n\t"
39868         "#  A[4] * B[5]\n\t"
39869         "mul	x6, x12, x20\n\t"
39870         "umulh	x7, x12, x20\n\t"
39871         "adds	x3, x3, x6\n\t"
39872         "#  A[5] * B[4]\n\t"
39873         "mul	x6, x13, x19\n\t"
39874         "adcs	x4, x4, x7\n\t"
39875         "umulh	x7, x13, x19\n\t"
39876         "adc	x5, xzr, xzr\n\t"
39877         "adds	x3, x3, x6\n\t"
39878         "adcs	x4, x4, x7\n\t"
39879         "str	x3, [%[r], 72]\n\t"
39880         "adc	x5, x5, xzr\n\t"
39881         "#  A[5] * B[5]\n\t"
39882         "mul	x6, x13, x20\n\t"
39883         "umulh	x7, x13, x20\n\t"
39884         "adds	x4, x4, x6\n\t"
39885         "adc	x5, x5, x7\n\t"
39886         "stp	x4, x5, [%[r], 80]\n\t"
39887         :
39888         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
39889         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20"
39890     );
39891 }
39892 
39893 #endif /* WOLFSSL_SP_SMALL */
39894 #ifdef WOLFSSL_SP_SMALL
39895 /* Square a and put result in r. (r = a * a)
39896  *
39897  * r  A single precision integer.
39898  * a  A single precision integer.
39899  */
sp_384_sqr_6(sp_digit * r,const sp_digit * a)39900 static void sp_384_sqr_6(sp_digit* r, const sp_digit* a)
39901 {
39902     sp_digit tmp[12];
39903 
39904     __asm__ __volatile__ (
39905         "mov	x6, 0\n\t"
39906         "mov	x7, 0\n\t"
39907         "mov	x8, 0\n\t"
39908         "mov	x5, 0\n\t"
39909         "\n1:\n\t"
39910         "subs	x3, x5, 40\n\t"
39911         "csel	x3, xzr, x3, cc\n\t"
39912         "sub	x4, x5, x3\n\t"
39913         "\n2:\n\t"
39914         "cmp	x4, x3\n\t"
39915         "b.eq	4f\n\t"
39916         "ldr	x10, [%[a], x3]\n\t"
39917         "ldr	x11, [%[a], x4]\n\t"
39918         "mul	x9, x10, x11\n\t"
39919         "umulh	x10, x10, x11\n\t"
39920         "adds	x6, x6, x9\n\t"
39921         "adcs	x7, x7, x10\n\t"
39922         "adc	x8, x8, xzr\n\t"
39923         "adds	x6, x6, x9\n\t"
39924         "adcs	x7, x7, x10\n\t"
39925         "adc	x8, x8, xzr\n\t"
39926         "b.al	5f\n\t"
39927         "\n4:\n\t"
39928         "ldr	x10, [%[a], x3]\n\t"
39929         "mul	x9, x10, x10\n\t"
39930         "umulh	x10, x10, x10\n\t"
39931         "adds	x6, x6, x9\n\t"
39932         "adcs	x7, x7, x10\n\t"
39933         "adc	x8, x8, xzr\n\t"
39934         "\n5:\n\t"
39935         "add	x3, x3, #8\n\t"
39936         "sub	x4, x4, #8\n\t"
39937         "cmp	x3, 48\n\t"
39938         "b.eq	3f\n\t"
39939         "cmp	x3, x4\n\t"
39940         "b.gt	3f\n\t"
39941         "cmp	x3, x5\n\t"
39942         "b.le	2b\n\t"
39943         "\n3:\n\t"
39944         "str	x6, [%[r], x5]\n\t"
39945         "mov	x6, x7\n\t"
39946         "mov	x7, x8\n\t"
39947         "mov	x8, #0\n\t"
39948         "add	x5, x5, #8\n\t"
39949         "cmp	x5, 80\n\t"
39950         "b.le	1b\n\t"
39951         "str	x6, [%[r], x5]\n\t"
39952         :
39953         : [r] "r" (tmp), [a] "r" (a)
39954         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
39955     );
39956 
39957     XMEMCPY(r, tmp, sizeof(tmp));
39958 }
39959 
39960 #else
39961 /* Square a and put result in r. (r = a * a)
39962  *
39963  * All registers version.
39964  *
39965  * r  A single precision integer.
39966  * a  A single precision integer.
39967  */
sp_384_sqr_6(sp_digit * r,const sp_digit * a)39968 static void sp_384_sqr_6(sp_digit* r, const sp_digit* a)
39969 {
39970     __asm__ __volatile__ (
39971         "ldp       x16, x17, [%[a], 0]\n\t"
39972         "ldp       x19, x20, [%[a], 16]\n\t"
39973         "ldp       x21, x22, [%[a], 32]\n\t"
39974         "#  A[0] * A[1]\n\t"
39975         "mul	x6, x16, x17\n\t"
39976         "umulh	x7, x16, x17\n\t"
39977         "#  A[0] * A[2]\n\t"
39978         "mul	x4, x16, x19\n\t"
39979         "umulh	x5, x16, x19\n\t"
39980         "adds	x7, x7, x4\n\t"
39981         "#  A[0] * A[3]\n\t"
39982         "mul	x4, x16, x20\n\t"
39983         "adc	x8, xzr, x5\n\t"
39984         "umulh	x5, x16, x20\n\t"
39985         "adds	x8, x8, x4\n\t"
39986         "#  A[1] * A[2]\n\t"
39987         "mul	x4, x17, x19\n\t"
39988         "adc	x9, xzr, x5\n\t"
39989         "umulh	x5, x17, x19\n\t"
39990         "adds	x8, x8, x4\n\t"
39991         "#  A[0] * A[4]\n\t"
39992         "mul	x4, x16, x21\n\t"
39993         "adcs	x9, x9, x5\n\t"
39994         "umulh	x5, x16, x21\n\t"
39995         "adc	x10, xzr, xzr\n\t"
39996         "adds	x9, x9, x4\n\t"
39997         "#  A[1] * A[3]\n\t"
39998         "mul	x4, x17, x20\n\t"
39999         "adc	x10, x10, x5\n\t"
40000         "umulh	x5, x17, x20\n\t"
40001         "adds	x9, x9, x4\n\t"
40002         "#  A[0] * A[5]\n\t"
40003         "mul	x4, x16, x22\n\t"
40004         "adcs	x10, x10, x5\n\t"
40005         "umulh	x5, x16, x22\n\t"
40006         "adc	x11, xzr, xzr\n\t"
40007         "adds	x10, x10, x4\n\t"
40008         "#  A[1] * A[4]\n\t"
40009         "mul	x4, x17, x21\n\t"
40010         "adc	x11, x11, x5\n\t"
40011         "umulh	x5, x17, x21\n\t"
40012         "adds	x10, x10, x4\n\t"
40013         "#  A[2] * A[3]\n\t"
40014         "mul	x4, x19, x20\n\t"
40015         "adcs	x11, x11, x5\n\t"
40016         "umulh	x5, x19, x20\n\t"
40017         "adc	x12, xzr, xzr\n\t"
40018         "adds	x10, x10, x4\n\t"
40019         "#  A[1] * A[5]\n\t"
40020         "mul	x4, x17, x22\n\t"
40021         "adcs	x11, x11, x5\n\t"
40022         "umulh	x5, x17, x22\n\t"
40023         "adc	x12, x12, xzr\n\t"
40024         "adds	x11, x11, x4\n\t"
40025         "#  A[2] * A[4]\n\t"
40026         "mul	x4, x19, x21\n\t"
40027         "adcs	x12, x12, x5\n\t"
40028         "umulh	x5, x19, x21\n\t"
40029         "adc	x13, xzr, xzr\n\t"
40030         "adds	x11, x11, x4\n\t"
40031         "#  A[2] * A[5]\n\t"
40032         "mul	x4, x19, x22\n\t"
40033         "adcs	x12, x12, x5\n\t"
40034         "umulh	x5, x19, x22\n\t"
40035         "adc	x13, x13, xzr\n\t"
40036         "adds	x12, x12, x4\n\t"
40037         "#  A[3] * A[4]\n\t"
40038         "mul	x4, x20, x21\n\t"
40039         "adcs	x13, x13, x5\n\t"
40040         "umulh	x5, x20, x21\n\t"
40041         "adc	x14, xzr, xzr\n\t"
40042         "adds	x12, x12, x4\n\t"
40043         "#  A[3] * A[5]\n\t"
40044         "mul	x4, x20, x22\n\t"
40045         "adcs	x13, x13, x5\n\t"
40046         "umulh	x5, x20, x22\n\t"
40047         "adc	x14, x14, xzr\n\t"
40048         "adds	x13, x13, x4\n\t"
40049         "#  A[4] * A[5]\n\t"
40050         "mul	x4, x21, x22\n\t"
40051         "adcs	x14, x14, x5\n\t"
40052         "umulh	x5, x21, x22\n\t"
40053         "adc	x15, xzr, xzr\n\t"
40054         "adds	x14, x14, x4\n\t"
40055         "adc	x15, x15, x5\n\t"
40056         "# Double\n\t"
40057         "adds	x6, x6, x6\n\t"
40058         "adcs	x7, x7, x7\n\t"
40059         "adcs	x8, x8, x8\n\t"
40060         "adcs	x9, x9, x9\n\t"
40061         "adcs	x10, x10, x10\n\t"
40062         "adcs	x11, x11, x11\n\t"
40063         "adcs	x12, x12, x12\n\t"
40064         "adcs	x13, x13, x13\n\t"
40065         "adcs	x14, x14, x14\n\t"
40066         "#  A[0] * A[0]\n\t"
40067         "mul	x5, x16, x16\n\t"
40068         "adcs	x15, x15, x15\n\t"
40069         "umulh	x2, x16, x16\n\t"
40070         "cset  x16, cs\n\t"
40071         "#  A[1] * A[1]\n\t"
40072         "mul	x3, x17, x17\n\t"
40073         "adds	x6, x6, x2\n\t"
40074         "umulh	x4, x17, x17\n\t"
40075         "adcs	x7, x7, x3\n\t"
40076         "#  A[2] * A[2]\n\t"
40077         "mul	x2, x19, x19\n\t"
40078         "adcs	x8, x8, x4\n\t"
40079         "umulh	x3, x19, x19\n\t"
40080         "adcs	x9, x9, x2\n\t"
40081         "#  A[3] * A[3]\n\t"
40082         "mul	x4, x20, x20\n\t"
40083         "adcs	x10, x10, x3\n\t"
40084         "umulh	x2, x20, x20\n\t"
40085         "adcs	x11, x11, x4\n\t"
40086         "#  A[4] * A[4]\n\t"
40087         "mul	x3, x21, x21\n\t"
40088         "adcs	x12, x12, x2\n\t"
40089         "umulh	x4, x21, x21\n\t"
40090         "adcs	x13, x13, x3\n\t"
40091         "#  A[5] * A[5]\n\t"
40092         "mul	x2, x22, x22\n\t"
40093         "adcs	x14, x14, x4\n\t"
40094         "umulh	x3, x22, x22\n\t"
40095         "adcs	x15, x15, x2\n\t"
40096         "stp	x5, x6, [%[r], 0]\n\t"
40097         "adc	x16, x16, x3\n\t"
40098         "stp	x7, x8, [%[r], 16]\n\t"
40099         "stp	x9, x10, [%[r], 32]\n\t"
40100         "stp	x11, x12, [%[r], 48]\n\t"
40101         "stp	x13, x14, [%[r], 64]\n\t"
40102         "stp	x15, x16, [%[r], 80]\n\t"
40103         :
40104         : [r] "r" (r), [a] "r" (a)
40105         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x16", "x17", "x19", "x20", "x21", "x22"
40106     );
40107 }
40108 
40109 #endif /* WOLFSSL_SP_SMALL */
40110 /* Add b to a into r. (r = a + b)
40111  *
40112  * r  A single precision integer.
40113  * a  A single precision integer.
40114  * b  A single precision integer.
40115  */
sp_384_add_6(sp_digit * r,const sp_digit * a,const sp_digit * b)40116 static sp_digit sp_384_add_6(sp_digit* r, const sp_digit* a,
40117         const sp_digit* b)
40118 {
40119     __asm__ __volatile__ (
40120         "ldp	x3, x4, [%[a], 0]\n\t"
40121         "ldp	x7, x8, [%[b], 0]\n\t"
40122         "adds	x3, x3, x7\n\t"
40123         "ldp	x5, x6, [%[a], 16]\n\t"
40124         "adcs	x4, x4, x8\n\t"
40125         "ldp	x9, x10, [%[b], 16]\n\t"
40126         "adcs	x5, x5, x9\n\t"
40127         "stp	x3, x4, [%[r], 0]\n\t"
40128         "adcs	x6, x6, x10\n\t"
40129         "stp	x5, x6, [%[r], 16]\n\t"
40130         "ldr		x3, [%[a], 32]\n\t"
40131         "ldr		x4, [%[a], 40]\n\t"
40132         "ldr		x7, [%[b], 32]\n\t"
40133         "ldr		x8, [%[b], 40]\n\t"
40134         "adcs	x3, x3, x7\n\t"
40135         "adcs	x4, x4, x8\n\t"
40136         "str		x3, [%[r], 32]\n\t"
40137         "str		x4, [%[r], 40]\n\t"
40138         "cset	%[r], cs\n\t"
40139         : [r] "+r" (r)
40140         : [a] "r" (a), [b] "r" (b)
40141         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
40142     );
40143 
40144     return (sp_digit)r;
40145 }
40146 
40147 /* Sub b from a into r. (r = a - b)
40148  *
40149  * r  A single precision integer.
40150  * a  A single precision integer.
40151  * b  A single precision integer.
40152  */
sp_384_sub_6(sp_digit * r,const sp_digit * a,const sp_digit * b)40153 static sp_digit sp_384_sub_6(sp_digit* r, const sp_digit* a,
40154         const sp_digit* b)
40155 {
40156     __asm__ __volatile__ (
40157         "ldp	x3, x4, [%[a], 0]\n\t"
40158         "ldp	x7, x8, [%[b], 0]\n\t"
40159         "subs	x3, x3, x7\n\t"
40160         "ldp	x5, x6, [%[a], 16]\n\t"
40161         "sbcs	x4, x4, x8\n\t"
40162         "ldp	x9, x10, [%[b], 16]\n\t"
40163         "sbcs	x5, x5, x9\n\t"
40164         "stp	x3, x4, [%[r], 0]\n\t"
40165         "sbcs	x6, x6, x10\n\t"
40166         "stp	x5, x6, [%[r], 16]\n\t"
40167         "ldr		x3, [%[a], 32]\n\t"
40168         "ldr		x4, [%[a], 40]\n\t"
40169         "ldr		x7, [%[b], 32]\n\t"
40170         "ldr		x8, [%[b], 40]\n\t"
40171         "sbcs	x3, x3, x7\n\t"
40172         "sbcs	x4, x4, x8\n\t"
40173         "str		x3, [%[r], 32]\n\t"
40174         "str		x4, [%[r], 40]\n\t"
40175         "csetm	%[r], cc\n\t"
40176         : [r] "+r" (r)
40177         : [a] "r" (a), [b] "r" (b)
40178         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
40179     );
40180 
40181     return (sp_digit)r;
40182 }
40183 
40184 /* Multiply a number by Montgomery normalizer mod modulus (prime).
40185  *
40186  * r  The resulting Montgomery form number.
40187  * a  The number to convert.
40188  * m  The modulus (prime).
40189  * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
40190  */
sp_384_mod_mul_norm_6(sp_digit * r,const sp_digit * a,const sp_digit * m)40191 static int sp_384_mod_mul_norm_6(sp_digit* r, const sp_digit* a, const sp_digit* m)
40192 {
40193 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
40194     int64_t* t = NULL;
40195 #else
40196     int64_t t[2 * 12];
40197 #endif
40198     int64_t* a32 = NULL;
40199     int64_t o;
40200     int err = MP_OKAY;
40201 
40202     (void)m;
40203 
40204 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
40205     t = (int64_t*)XMALLOC(sizeof(int64_t) * 2 * 12, NULL, DYNAMIC_TYPE_ECC);
40206     if (t == NULL)
40207         err = MEMORY_E;
40208 #endif
40209 
40210     if (err == MP_OKAY) {
40211         a32 = t + 12;
40212 
40213         a32[0] = a[0] & 0xffffffff;
40214         a32[1] = a[0] >> 32;
40215         a32[2] = a[1] & 0xffffffff;
40216         a32[3] = a[1] >> 32;
40217         a32[4] = a[2] & 0xffffffff;
40218         a32[5] = a[2] >> 32;
40219         a32[6] = a[3] & 0xffffffff;
40220         a32[7] = a[3] >> 32;
40221         a32[8] = a[4] & 0xffffffff;
40222         a32[9] = a[4] >> 32;
40223         a32[10] = a[5] & 0xffffffff;
40224         a32[11] = a[5] >> 32;
40225 
40226         /*  1  0  0  0  0  0  0  0  1  1  0 -1 */
40227         t[0] = 0 + a32[0] + a32[8] + a32[9] - a32[11];
40228         /* -1  1  0  0  0  0  0  0 -1  0  1  1 */
40229         t[1] = 0 - a32[0] + a32[1] - a32[8] + a32[10] + a32[11];
40230         /*  0 -1  1  0  0  0  0  0  0 -1  0  1 */
40231         t[2] = 0 - a32[1] + a32[2] - a32[9] + a32[11];
40232         /*  1  0 -1  1  0  0  0  0  1  1 -1 -1 */
40233         t[3] = 0 + a32[0] - a32[2] + a32[3] + a32[8] + a32[9] - a32[10] - a32[11];
40234         /*  1  1  0 -1  1  0  0  0  1  2  1 -2 */
40235         t[4] = 0 + a32[0] + a32[1] - a32[3] + a32[4] + a32[8] + 2 * a32[9] + a32[10] -  2 * a32[11];
40236         /*  0  1  1  0 -1  1  0  0  0  1  2  1 */
40237         t[5] = 0 + a32[1] + a32[2] - a32[4] + a32[5] + a32[9] + 2 * a32[10] + a32[11];
40238         /*  0  0  1  1  0 -1  1  0  0  0  1  2 */
40239         t[6] = 0 + a32[2] + a32[3] - a32[5] + a32[6] + a32[10] + 2 * a32[11];
40240         /*  0  0  0  1  1  0 -1  1  0  0  0  1 */
40241         t[7] = 0 + a32[3] + a32[4] - a32[6] + a32[7] + a32[11];
40242         /*  0  0  0  0  1  1  0 -1  1  0  0  0 */
40243         t[8] = 0 + a32[4] + a32[5] - a32[7] + a32[8];
40244         /*  0  0  0  0  0  1  1  0 -1  1  0  0 */
40245         t[9] = 0 + a32[5] + a32[6] - a32[8] + a32[9];
40246         /*  0  0  0  0  0  0  1  1  0 -1  1  0 */
40247         t[10] = 0 + a32[6] + a32[7] - a32[9] + a32[10];
40248         /*  0  0  0  0  0  0  0  1  1  0 -1  1 */
40249         t[11] = 0 + a32[7] + a32[8] - a32[10] + a32[11];
40250 
40251         t[1] += t[0] >> 32; t[0] &= 0xffffffff;
40252         t[2] += t[1] >> 32; t[1] &= 0xffffffff;
40253         t[3] += t[2] >> 32; t[2] &= 0xffffffff;
40254         t[4] += t[3] >> 32; t[3] &= 0xffffffff;
40255         t[5] += t[4] >> 32; t[4] &= 0xffffffff;
40256         t[6] += t[5] >> 32; t[5] &= 0xffffffff;
40257         t[7] += t[6] >> 32; t[6] &= 0xffffffff;
40258         t[8] += t[7] >> 32; t[7] &= 0xffffffff;
40259         t[9] += t[8] >> 32; t[8] &= 0xffffffff;
40260         t[10] += t[9] >> 32; t[9] &= 0xffffffff;
40261         t[11] += t[10] >> 32; t[10] &= 0xffffffff;
40262         o     = t[11] >> 32; t[11] &= 0xffffffff;
40263         t[0] += o;
40264         t[1] -= o;
40265         t[3] += o;
40266         t[4] += o;
40267         t[1] += t[0] >> 32; t[0] &= 0xffffffff;
40268         t[2] += t[1] >> 32; t[1] &= 0xffffffff;
40269         t[3] += t[2] >> 32; t[2] &= 0xffffffff;
40270         t[4] += t[3] >> 32; t[3] &= 0xffffffff;
40271         t[5] += t[4] >> 32; t[4] &= 0xffffffff;
40272         t[6] += t[5] >> 32; t[5] &= 0xffffffff;
40273         t[7] += t[6] >> 32; t[6] &= 0xffffffff;
40274         t[8] += t[7] >> 32; t[7] &= 0xffffffff;
40275         t[9] += t[8] >> 32; t[8] &= 0xffffffff;
40276         t[10] += t[9] >> 32; t[9] &= 0xffffffff;
40277         t[11] += t[10] >> 32; t[10] &= 0xffffffff;
40278 
40279         r[0] = (t[1] << 32) | t[0];
40280         r[1] = (t[3] << 32) | t[2];
40281         r[2] = (t[5] << 32) | t[4];
40282         r[3] = (t[7] << 32) | t[6];
40283         r[4] = (t[9] << 32) | t[8];
40284         r[5] = (t[11] << 32) | t[10];
40285     }
40286 
40287 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
40288     if (t != NULL)
40289         XFREE(t, NULL, DYNAMIC_TYPE_ECC);
40290 #endif
40291 
40292     return err;
40293 }
40294 
40295 /* Convert an mp_int to an array of sp_digit.
40296  *
40297  * r  A single precision integer.
40298  * size  Maximum number of bytes to convert
40299  * a  A multi-precision integer.
40300  */
sp_384_from_mp(sp_digit * r,int size,const mp_int * a)40301 static void sp_384_from_mp(sp_digit* r, int size, const mp_int* a)
40302 {
40303 #if DIGIT_BIT == 64
40304     int j;
40305 
40306     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
40307 
40308     for (j = a->used; j < size; j++) {
40309         r[j] = 0;
40310     }
40311 #elif DIGIT_BIT > 64
40312     int i;
40313     int j = 0;
40314     word32 s = 0;
40315 
40316     r[0] = 0;
40317     for (i = 0; i < a->used && j < size; i++) {
40318         r[j] |= ((sp_digit)a->dp[i] << s);
40319         r[j] &= 0xffffffffffffffffl;
40320         s = 64U - s;
40321         if (j + 1 >= size) {
40322             break;
40323         }
40324         /* lint allow cast of mismatch word32 and mp_digit */
40325         r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
40326         while ((s + 64U) <= (word32)DIGIT_BIT) {
40327             s += 64U;
40328             r[j] &= 0xffffffffffffffffl;
40329             if (j + 1 >= size) {
40330                 break;
40331             }
40332             if (s < (word32)DIGIT_BIT) {
40333                 /* lint allow cast of mismatch word32 and mp_digit */
40334                 r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
40335             }
40336             else {
40337                 r[++j] = (sp_digit)0;
40338             }
40339         }
40340         s = (word32)DIGIT_BIT - s;
40341     }
40342 
40343     for (j++; j < size; j++) {
40344         r[j] = 0;
40345     }
40346 #else
40347     int i;
40348     int j = 0;
40349     int s = 0;
40350 
40351     r[0] = 0;
40352     for (i = 0; i < a->used && j < size; i++) {
40353         r[j] |= ((sp_digit)a->dp[i]) << s;
40354         if (s + DIGIT_BIT >= 64) {
40355             r[j] &= 0xffffffffffffffffl;
40356             if (j + 1 >= size) {
40357                 break;
40358             }
40359             s = 64 - s;
40360             if (s == DIGIT_BIT) {
40361                 r[++j] = 0;
40362                 s = 0;
40363             }
40364             else {
40365                 r[++j] = a->dp[i] >> s;
40366                 s = DIGIT_BIT - s;
40367             }
40368         }
40369         else {
40370             s += DIGIT_BIT;
40371         }
40372     }
40373 
40374     for (j++; j < size; j++) {
40375         r[j] = 0;
40376     }
40377 #endif
40378 }
40379 
40380 /* Convert a point of type ecc_point to type sp_point_384.
40381  *
40382  * p   Point of type sp_point_384 (result).
40383  * pm  Point of type ecc_point.
40384  */
sp_384_point_from_ecc_point_6(sp_point_384 * p,const ecc_point * pm)40385 static void sp_384_point_from_ecc_point_6(sp_point_384* p,
40386         const ecc_point* pm)
40387 {
40388     XMEMSET(p->x, 0, sizeof(p->x));
40389     XMEMSET(p->y, 0, sizeof(p->y));
40390     XMEMSET(p->z, 0, sizeof(p->z));
40391     sp_384_from_mp(p->x, 6, pm->x);
40392     sp_384_from_mp(p->y, 6, pm->y);
40393     sp_384_from_mp(p->z, 6, pm->z);
40394     p->infinity = 0;
40395 }
40396 
40397 /* Convert an array of sp_digit to an mp_int.
40398  *
40399  * a  A single precision integer.
40400  * r  A multi-precision integer.
40401  */
sp_384_to_mp(const sp_digit * a,mp_int * r)40402 static int sp_384_to_mp(const sp_digit* a, mp_int* r)
40403 {
40404     int err;
40405 
40406     err = mp_grow(r, (384 + DIGIT_BIT - 1) / DIGIT_BIT);
40407     if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
40408 #if DIGIT_BIT == 64
40409         XMEMCPY(r->dp, a, sizeof(sp_digit) * 6);
40410         r->used = 6;
40411         mp_clamp(r);
40412 #elif DIGIT_BIT < 64
40413         int i;
40414         int j = 0;
40415         int s = 0;
40416 
40417         r->dp[0] = 0;
40418         for (i = 0; i < 6; i++) {
40419             r->dp[j] |= (mp_digit)(a[i] << s);
40420             r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
40421             s = DIGIT_BIT - s;
40422             r->dp[++j] = (mp_digit)(a[i] >> s);
40423             while (s + DIGIT_BIT <= 64) {
40424                 s += DIGIT_BIT;
40425                 r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
40426                 if (s == SP_WORD_SIZE) {
40427                     r->dp[j] = 0;
40428                 }
40429                 else {
40430                     r->dp[j] = (mp_digit)(a[i] >> s);
40431                 }
40432             }
40433             s = 64 - s;
40434         }
40435         r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
40436         mp_clamp(r);
40437 #else
40438         int i;
40439         int j = 0;
40440         int s = 0;
40441 
40442         r->dp[0] = 0;
40443         for (i = 0; i < 6; i++) {
40444             r->dp[j] |= ((mp_digit)a[i]) << s;
40445             if (s + 64 >= DIGIT_BIT) {
40446     #if DIGIT_BIT != 32 && DIGIT_BIT != 64
40447                 r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
40448     #endif
40449                 s = DIGIT_BIT - s;
40450                 r->dp[++j] = a[i] >> s;
40451                 s = 64 - s;
40452             }
40453             else {
40454                 s += 64;
40455             }
40456         }
40457         r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
40458         mp_clamp(r);
40459 #endif
40460     }
40461 
40462     return err;
40463 }
40464 
40465 /* Convert a point of type sp_point_384 to type ecc_point.
40466  *
40467  * p   Point of type sp_point_384.
40468  * pm  Point of type ecc_point (result).
40469  * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
40470  * MP_OKAY.
40471  */
sp_384_point_to_ecc_point_6(const sp_point_384 * p,ecc_point * pm)40472 static int sp_384_point_to_ecc_point_6(const sp_point_384* p, ecc_point* pm)
40473 {
40474     int err;
40475 
40476     err = sp_384_to_mp(p->x, pm->x);
40477     if (err == MP_OKAY) {
40478         err = sp_384_to_mp(p->y, pm->y);
40479     }
40480     if (err == MP_OKAY) {
40481         err = sp_384_to_mp(p->z, pm->z);
40482     }
40483 
40484     return err;
40485 }
40486 
40487 /* Conditionally copy a into r using the mask m.
40488  * m is -1 to copy and 0 when not.
40489  *
40490  * r  A single precision number to copy over.
40491  * a  A single precision number to copy.
40492  * m  Mask value to apply.
40493  */
sp_384_cond_copy_6(sp_digit * r,const sp_digit * a,sp_digit m)40494 static void sp_384_cond_copy_6(sp_digit* r, const sp_digit* a, sp_digit m)
40495 {
40496     __asm__ __volatile__ (
40497         "ldp	x3, x4, [%[r], 0]\n\t"
40498         "ldp	x5, x6, [%[r], 16]\n\t"
40499         "ldp	x7, x8, [%[r], 32]\n\t"
40500         "ldp	x9, x10, [%[a], 0]\n\t"
40501         "ldp	x11, x12, [%[a], 16]\n\t"
40502         "ldp	x13, x14, [%[a], 32]\n\t"
40503         "eor	x9, x9, x3\n\t"
40504         "eor	x10, x10, x4\n\t"
40505         "eor	x11, x11, x5\n\t"
40506         "eor	x12, x12, x6\n\t"
40507         "eor	x13, x13, x7\n\t"
40508         "eor	x14, x14, x8\n\t"
40509         "and	x9, x9, %[m]\n\t"
40510         "and	x10, x10, %[m]\n\t"
40511         "and	x11, x11, %[m]\n\t"
40512         "and	x12, x12, %[m]\n\t"
40513         "and	x13, x13, %[m]\n\t"
40514         "and	x14, x14, %[m]\n\t"
40515         "eor	x3, x3, x9\n\t"
40516         "eor	x4, x4, x10\n\t"
40517         "eor	x5, x5, x11\n\t"
40518         "eor	x6, x6, x12\n\t"
40519         "eor	x7, x7, x13\n\t"
40520         "eor	x8, x8, x14\n\t"
40521         "stp	x3, x4, [%[r], 0]\n\t"
40522         "stp	x5, x6, [%[r], 16]\n\t"
40523         "stp	x7, x8, [%[r], 32]\n\t"
40524         :
40525         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
40526         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14"
40527     );
40528 }
40529 
40530 /* Reduce the number back to 384 bits using Montgomery reduction.
40531  *
40532  * a   A single precision number to reduce in place.
40533  * m   The single precision number representing the modulus.
40534  * mp  The digit representing the negative inverse of m mod 2^n.
40535  */
sp_384_mont_reduce_6(sp_digit * a,const sp_digit * m,sp_digit mp)40536 SP_NOINLINE static void sp_384_mont_reduce_6(sp_digit* a, const sp_digit* m,
40537         sp_digit mp)
40538 {
40539     __asm__ __volatile__ (
40540         "ldp	x7, x8, [%[a], #0]\n\t"
40541         "ldp	x9, x10, [%[a], #16]\n\t"
40542         "ldp	x11, x12, [%[a], #32]\n\t"
40543         "mov	x6, xzr\n\t"
40544         "# a[0-7] += m[0-5] * mu[0..1] = m[0-5] * (a[0..1] * mp)\n\t"
40545         "ldp	x13, x14, [%[a], #48]\n\t"
40546         "lsl	x2, x8, 32\n\t"
40547         "lsl	x1, x7, 32\n\t"
40548         "orr	x2, x2, x7, lsr 32\n\t"
40549         "adds	x1, x1, x7\n\t"
40550         "adc	x2, x2, x8\n\t"
40551         "add	x2, x2, x7\n\t"
40552         "lsl	x3, x1, 32\n\t"
40553         "lsl	x4, x2, 32\n\t"
40554         "orr	x4, x4, x1, lsr 32\n\t"
40555         "lsr	x5, x2, 32\n\t"
40556         "adds	x7, x7, x3\n\t"
40557         "adcs	x8, x8, x4\n\t"
40558         "adcs	x9, x9, x5\n\t"
40559         "adcs	x10, x10, xzr\n\t"
40560         "adcs	x11, x11, xzr\n\t"
40561         "adcs	x12, x12, xzr\n\t"
40562         "adcs	x13, x13, x1\n\t"
40563         "adcs	x14, x14, x2\n\t"
40564         "adcs	x6, x6, xzr\n\t"
40565         "adds	x3, x3, x2\n\t"
40566         "adcs	x4, x4, x1\n\t"
40567         "adcs	x5, x5, x2\n\t"
40568         "adcs	x2, xzr, xzr\n\t"
40569         "subs	x9, x9, x4\n\t"
40570         "sbcs	x10, x10, x5\n\t"
40571         "sbcs	x11, x11, x2\n\t"
40572         "sbcs	x12, x12, xzr\n\t"
40573         "sbcs	x13, x13, xzr\n\t"
40574         "sbcs	x14, x14, xzr\n\t"
40575         "sbc	x6, x6, xzr\n\t"
40576         "# a[2-9] += m[0-5] * mu[0..1] = m[0-5] * (a[2..3] * mp)\n\t"
40577         "ldp	x7, x8, [%[a], #64]\n\t"
40578         "lsl	x2, x10, 32\n\t"
40579         "lsl	x1, x9, 32\n\t"
40580         "orr	x2, x2, x9, lsr 32\n\t"
40581         "adds	x1, x1, x9\n\t"
40582         "adc	x2, x2, x10\n\t"
40583         "add	x2, x2, x9\n\t"
40584         "lsl	x3, x1, 32\n\t"
40585         "lsl	x4, x2, 32\n\t"
40586         "orr	x4, x4, x1, lsr 32\n\t"
40587         "lsr	x5, x2, 32\n\t"
40588         "adds	x7, x7, x6\n\t"
40589         "adcs	x8, x8, xzr\n\t"
40590         "adc	x6, xzr, xzr\n\t"
40591         "adds	x9, x9, x3\n\t"
40592         "adcs	x10, x10, x4\n\t"
40593         "adcs	x11, x11, x5\n\t"
40594         "adcs	x12, x12, xzr\n\t"
40595         "adcs	x13, x13, xzr\n\t"
40596         "adcs	x14, x14, xzr\n\t"
40597         "adcs	x7, x7, x1\n\t"
40598         "adcs	x8, x8, x2\n\t"
40599         "adcs	x6, x6, xzr\n\t"
40600         "adds	x3, x3, x2\n\t"
40601         "adcs	x4, x4, x1\n\t"
40602         "adcs	x5, x5, x2\n\t"
40603         "adcs	x2, xzr, xzr\n\t"
40604         "subs	x11, x11, x4\n\t"
40605         "sbcs	x12, x12, x5\n\t"
40606         "sbcs	x13, x13, x2\n\t"
40607         "sbcs	x14, x14, xzr\n\t"
40608         "sbcs	x7, x7, xzr\n\t"
40609         "sbcs	x8, x8, xzr\n\t"
40610         "sbc	x6, x6, xzr\n\t"
40611         "# a[4-11] += m[0-5] * mu[0..1] = m[0-5] * (a[4..5] * mp)\n\t"
40612         "ldp	x9, x10, [%[a], #80]\n\t"
40613         "lsl	x2, x12, 32\n\t"
40614         "lsl	x1, x11, 32\n\t"
40615         "orr	x2, x2, x11, lsr 32\n\t"
40616         "adds	x1, x1, x11\n\t"
40617         "adc	x2, x2, x12\n\t"
40618         "add	x2, x2, x11\n\t"
40619         "lsl	x3, x1, 32\n\t"
40620         "lsl	x4, x2, 32\n\t"
40621         "orr	x4, x4, x1, lsr 32\n\t"
40622         "lsr	x5, x2, 32\n\t"
40623         "adds	x9, x9, x6\n\t"
40624         "adcs	x10, x10, xzr\n\t"
40625         "adc	x6, xzr, xzr\n\t"
40626         "adds	x11, x11, x3\n\t"
40627         "adcs	x12, x12, x4\n\t"
40628         "adcs	x13, x13, x5\n\t"
40629         "adcs	x14, x14, xzr\n\t"
40630         "adcs	x7, x7, xzr\n\t"
40631         "adcs	x8, x8, xzr\n\t"
40632         "adcs	x9, x9, x1\n\t"
40633         "adcs	x10, x10, x2\n\t"
40634         "adcs	x6, x6, xzr\n\t"
40635         "adds	x3, x3, x2\n\t"
40636         "adcs	x4, x4, x1\n\t"
40637         "adcs	x5, x5, x2\n\t"
40638         "adcs	x2, xzr, xzr\n\t"
40639         "subs	x13, x13, x4\n\t"
40640         "sbcs	x14, x14, x5\n\t"
40641         "sbcs	x7, x7, x2\n\t"
40642         "sbcs	x8, x8, xzr\n\t"
40643         "sbcs	x9, x9, xzr\n\t"
40644         "sbcs	x10, x10, xzr\n\t"
40645         "sbc	x6, x6, xzr\n\t"
40646         "# Subtract mod if carry\n\t"
40647         "neg	x6, x6\n\t"
40648         "mov	x5, -2\n\t"
40649         "lsr	x3, x6, 32\n\t"
40650         "lsl	x4, x6, 32\n\t"
40651         "and	x5, x5, x6\n\t"
40652         "subs	x13, x13, x3\n\t"
40653         "sbcs	x14, x14, x4\n\t"
40654         "sbcs	x7, x7, x5\n\t"
40655         "sbcs	x8, x8, x6\n\t"
40656         "sbcs	x9, x9, x6\n\t"
40657         "sbc	x10, x10, x6\n\t"
40658         "stp	x13, x14, [%[a], #0]\n\t"
40659         "stp	x7, x8, [%[a], #16]\n\t"
40660         "stp	x9, x10, [%[a], #32]\n\t"
40661         :
40662         : [a] "r" (a), [m] "r" (m), [mp] "r" (mp)
40663         : "memory", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14"
40664     );
40665 }
40666 
40667 /* Reduce the number back to 384 bits using Montgomery reduction.
40668  *
40669  * a   A single precision number to reduce in place.
40670  * m   The single precision number representing the modulus.
40671  * mp  The digit representing the negative inverse of m mod 2^n.
40672  */
sp_384_mont_reduce_order_6(sp_digit * a,const sp_digit * m,sp_digit mp)40673 SP_NOINLINE static void sp_384_mont_reduce_order_6(sp_digit* a, const sp_digit* m,
40674         sp_digit mp)
40675 {
40676 
40677     __asm__ __volatile__ (
40678         "ldp	x14, x15, [%[m], 0]\n\t"
40679         "ldp	x16, x17, [%[m], 16]\n\t"
40680         "ldp	x19, x20, [%[m], 32]\n\t"
40681         "mov	x3, xzr\n\t"
40682         "# i = 6\n\t"
40683         "mov	x4, 6\n\t"
40684         "ldp	x12, x13, [%[a], 0]\n\t"
40685         "\n1:\n\t"
40686         "# mu = a[i] * mp\n\t"
40687         "mul	x9, %[mp], x12\n\t"
40688         "# a[i+0] += m[0] * mu\n\t"
40689         "mul	x7, x14, x9\n\t"
40690         "umulh	x8, x14, x9\n\t"
40691         "adds	x12, x12, x7\n\t"
40692         "# a[i+1] += m[1] * mu\n\t"
40693         "mul	x7, x15, x9\n\t"
40694         "adc	x6, x8, xzr\n\t"
40695         "umulh	x8, x15, x9\n\t"
40696         "adds	x12, x13, x7\n\t"
40697         "# a[i+2] += m[2] * mu\n\t"
40698         "ldr	x13, [%[a], 16]\n\t"
40699         "adc	x5, x8, xzr\n\t"
40700         "mul	x7, x16, x9\n\t"
40701         "adds	x12, x12, x6\n\t"
40702         "umulh	x8, x16, x9\n\t"
40703         "adc	x5, x5, xzr\n\t"
40704         "adds	x13, x13, x7\n\t"
40705         "# a[i+3] += m[3] * mu\n\t"
40706         "ldr	x10, [%[a], 24]\n\t"
40707         "adc	x6, x8, xzr\n\t"
40708         "mul	x7, x17, x9\n\t"
40709         "adds	x13, x13, x5\n\t"
40710         "umulh	x8, x17, x9\n\t"
40711         "adc	x6, x6, xzr\n\t"
40712         "adds	x10, x10, x7\n\t"
40713         "# a[i+4] += m[4] * mu\n\t"
40714         "ldr	x11, [%[a], 32]\n\t"
40715         "adc	x5, x8, xzr\n\t"
40716         "adds	x10, x10, x6\n\t"
40717         "mul	x7, x19, x9\n\t"
40718         "adc	x5, x5, xzr\n\t"
40719         "umulh	x8, x19, x9\n\t"
40720         "str	x10, [%[a], 24]\n\t"
40721         "adds	x11, x11, x7\n\t"
40722         "# a[i+5] += m[5] * mu\n\t"
40723         "ldr	x10, [%[a], 40]\n\t"
40724         "adc	x6, x8, xzr\n\t"
40725         "adds	x11, x11, x5\n\t"
40726         "mul	x7, x20, x9\n\t"
40727         "adc	x6, x6, xzr\n\t"
40728         "umulh	x8, x20, x9\n\t"
40729         "adds	x6, x6, x7\n\t"
40730         "adcs	x8, x8, x3\n\t"
40731         "str	x11, [%[a], 32]\n\t"
40732         "cset  x3, cs\n\t"
40733         "adds	x10, x10, x6\n\t"
40734         "ldr	x11, [%[a], 48]\n\t"
40735         "str	x10, [%[a], 40]\n\t"
40736         "adcs	x11, x11, x8\n\t"
40737         "str	x11, [%[a], 48]\n\t"
40738         "adc	x3, x3, xzr\n\t"
40739         "subs	x4, x4, 1\n\t"
40740         "add	%[a], %[a], 8\n\t"
40741         "bne	1b\n\t"
40742         "# x12 and x13 hold a[0] and a[1]\n\t"
40743         "# Create mask\n\t"
40744         "neg       x3, x3\n\t"
40745         "mov   x9, %[a]\n\t"
40746         "sub   %[a], %[a], 48\n\t"
40747         "# Subtract masked modulus\n\t"
40748         "# x12 and x13 hold a[0] and a[1]\n\t"
40749         "and       x14, x14, x3\n\t"
40750         "ldp       x11, x10, [x9, 16]\n\t"
40751         "and       x15, x15, x3\n\t"
40752         "subs      x12, x12, x14\n\t"
40753         "and       x16, x16, x3\n\t"
40754         "sbcs      x13, x13, x15\n\t"
40755         "and       x17, x17, x3\n\t"
40756         "sbcs      x11, x11, x16\n\t"
40757         "stp       x12, x13, [%[a], 0]\n\t"
40758         "sbcs      x10, x10, x17\n\t"
40759         "stp       x11, x10, [%[a], 16]\n\t"
40760         "ldp       x12, x13, [x9, 32]\n\t"
40761         "and       x19, x19, x3\n\t"
40762         "and       x20, x20, x3\n\t"
40763         "sbcs      x12, x12, x19\n\t"
40764         "sbcs      x13, x13, x20\n\t"
40765         "stp       x12, x13, [%[a], 32]\n\t"
40766         : [a] "+r" (a)
40767         : [m] "r" (m), [mp] "r" (mp)
40768         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20"
40769     );
40770 
40771 }
40772 
40773 /* Multiply two Montgomery form numbers mod the modulus (prime).
40774  * (r = a * b mod m)
40775  *
40776  * r   Result of multiplication.
40777  * a   First number to multiply in Montgomery form.
40778  * b   Second number to multiply in Montgomery form.
40779  * m   Modulus (prime).
40780  * mp  Montgomery mulitplier.
40781  */
sp_384_mont_mul_6(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m,sp_digit mp)40782 static void sp_384_mont_mul_6(sp_digit* r, const sp_digit* a,
40783         const sp_digit* b, const sp_digit* m, sp_digit mp)
40784 {
40785     sp_384_mul_6(r, a, b);
40786     sp_384_mont_reduce_6(r, m, mp);
40787 }
40788 
40789 /* Square the Montgomery form number. (r = a * a mod m)
40790  *
40791  * r   Result of squaring.
40792  * a   Number to square in Montgomery form.
40793  * m   Modulus (prime).
40794  * mp  Montgomery mulitplier.
40795  */
sp_384_mont_sqr_6(sp_digit * r,const sp_digit * a,const sp_digit * m,sp_digit mp)40796 static void sp_384_mont_sqr_6(sp_digit* r, const sp_digit* a,
40797         const sp_digit* m, sp_digit mp)
40798 {
40799     sp_384_sqr_6(r, a);
40800     sp_384_mont_reduce_6(r, m, mp);
40801 }
40802 
40803 #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
40804 /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
40805  *
40806  * r   Result of squaring.
40807  * a   Number to square in Montgomery form.
40808  * n   Number of times to square.
40809  * m   Modulus (prime).
40810  * mp  Montgomery mulitplier.
40811  */
sp_384_mont_sqr_n_6(sp_digit * r,const sp_digit * a,int n,const sp_digit * m,sp_digit mp)40812 static void sp_384_mont_sqr_n_6(sp_digit* r, const sp_digit* a, int n,
40813         const sp_digit* m, sp_digit mp)
40814 {
40815     sp_384_mont_sqr_6(r, a, m, mp);
40816     for (; n > 1; n--) {
40817         sp_384_mont_sqr_6(r, r, m, mp);
40818     }
40819 }
40820 
40821 #endif /* !WOLFSSL_SP_SMALL | HAVE_COMP_KEY */
40822 #ifdef WOLFSSL_SP_SMALL
40823 /* Mod-2 for the P384 curve. */
40824 static const uint64_t p384_mod_minus_2[6] = {
40825     0x00000000fffffffdU,0xffffffff00000000U,0xfffffffffffffffeU,
40826     0xffffffffffffffffU,0xffffffffffffffffU,0xffffffffffffffffU
40827 };
40828 #endif /* !WOLFSSL_SP_SMALL */
40829 
40830 /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
40831  * P384 curve. (r = 1 / a mod m)
40832  *
40833  * r   Inverse result.
40834  * a   Number to invert.
40835  * td  Temporary data.
40836  */
sp_384_mont_inv_6(sp_digit * r,const sp_digit * a,sp_digit * td)40837 static void sp_384_mont_inv_6(sp_digit* r, const sp_digit* a, sp_digit* td)
40838 {
40839 #ifdef WOLFSSL_SP_SMALL
40840     sp_digit* t = td;
40841     int i;
40842 
40843     XMEMCPY(t, a, sizeof(sp_digit) * 6);
40844     for (i=382; i>=0; i--) {
40845         sp_384_mont_sqr_6(t, t, p384_mod, p384_mp_mod);
40846         if (p384_mod_minus_2[i / 64] & ((sp_digit)1 << (i % 64)))
40847             sp_384_mont_mul_6(t, t, a, p384_mod, p384_mp_mod);
40848     }
40849     XMEMCPY(r, t, sizeof(sp_digit) * 6);
40850 #else
40851     sp_digit* t1 = td;
40852     sp_digit* t2 = td + 2 * 6;
40853     sp_digit* t3 = td + 4 * 6;
40854     sp_digit* t4 = td + 6 * 6;
40855     sp_digit* t5 = td + 8 * 6;
40856 
40857     /* 0x2 */
40858     sp_384_mont_sqr_6(t1, a, p384_mod, p384_mp_mod);
40859     /* 0x3 */
40860     sp_384_mont_mul_6(t5, t1, a, p384_mod, p384_mp_mod);
40861     /* 0xc */
40862     sp_384_mont_sqr_n_6(t1, t5, 2, p384_mod, p384_mp_mod);
40863     /* 0xf */
40864     sp_384_mont_mul_6(t2, t5, t1, p384_mod, p384_mp_mod);
40865     /* 0x1e */
40866     sp_384_mont_sqr_6(t1, t2, p384_mod, p384_mp_mod);
40867     /* 0x1f */
40868     sp_384_mont_mul_6(t4, t1, a, p384_mod, p384_mp_mod);
40869     /* 0x3e0 */
40870     sp_384_mont_sqr_n_6(t1, t4, 5, p384_mod, p384_mp_mod);
40871     /* 0x3ff */
40872     sp_384_mont_mul_6(t2, t4, t1, p384_mod, p384_mp_mod);
40873     /* 0x7fe0 */
40874     sp_384_mont_sqr_n_6(t1, t2, 5, p384_mod, p384_mp_mod);
40875     /* 0x7fff */
40876     sp_384_mont_mul_6(t4, t4, t1, p384_mod, p384_mp_mod);
40877     /* 0x3fff8000 */
40878     sp_384_mont_sqr_n_6(t1, t4, 15, p384_mod, p384_mp_mod);
40879     /* 0x3fffffff */
40880     sp_384_mont_mul_6(t2, t4, t1, p384_mod, p384_mp_mod);
40881     /* 0xfffffffc */
40882     sp_384_mont_sqr_n_6(t3, t2, 2, p384_mod, p384_mp_mod);
40883     /* 0xfffffffd */
40884     sp_384_mont_mul_6(r, t3, a, p384_mod, p384_mp_mod);
40885     /* 0xffffffff */
40886     sp_384_mont_mul_6(t3, t5, t3, p384_mod, p384_mp_mod);
40887     /* 0xfffffffc0000000 */
40888     sp_384_mont_sqr_n_6(t1, t2, 30, p384_mod, p384_mp_mod);
40889     /* 0xfffffffffffffff */
40890     sp_384_mont_mul_6(t2, t2, t1, p384_mod, p384_mp_mod);
40891     /* 0xfffffffffffffff000000000000000 */
40892     sp_384_mont_sqr_n_6(t1, t2, 60, p384_mod, p384_mp_mod);
40893     /* 0xffffffffffffffffffffffffffffff */
40894     sp_384_mont_mul_6(t2, t2, t1, p384_mod, p384_mp_mod);
40895     /* 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
40896     sp_384_mont_sqr_n_6(t1, t2, 120, p384_mod, p384_mp_mod);
40897     /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
40898     sp_384_mont_mul_6(t2, t2, t1, p384_mod, p384_mp_mod);
40899     /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
40900     sp_384_mont_sqr_n_6(t1, t2, 15, p384_mod, p384_mp_mod);
40901     /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
40902     sp_384_mont_mul_6(t2, t4, t1, p384_mod, p384_mp_mod);
40903     /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 */
40904     sp_384_mont_sqr_n_6(t1, t2, 33, p384_mod, p384_mp_mod);
40905     /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff */
40906     sp_384_mont_mul_6(t2, t3, t1, p384_mod, p384_mp_mod);
40907     /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000000000000 */
40908     sp_384_mont_sqr_n_6(t1, t2, 96, p384_mod, p384_mp_mod);
40909     /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd */
40910     sp_384_mont_mul_6(r, r, t1, p384_mod, p384_mp_mod);
40911 
40912 #endif /* WOLFSSL_SP_SMALL */
40913 }
40914 
40915 /* Compare a with b in constant time.
40916  *
40917  * a  A single precision integer.
40918  * b  A single precision integer.
40919  * return -ve, 0 or +ve if a is less than, equal to or greater than b
40920  * respectively.
40921  */
sp_384_cmp_6(const sp_digit * a,const sp_digit * b)40922 static sp_int64 sp_384_cmp_6(const sp_digit* a, const sp_digit* b)
40923 {
40924 #ifdef WOLFSSL_SP_SMALL
40925     __asm__ __volatile__ (
40926         "mov	x2, -1\n\t"
40927         "mov	x3, 1\n\t"
40928         "mov	x4, -1\n\t"
40929         "mov	x5, 40\n\t"
40930         "1:\n\t"
40931         "ldr	x6, [%[a], x5]\n\t"
40932         "ldr	x7, [%[b], x5]\n\t"
40933         "and	x6, x6, x4\n\t"
40934         "and	x7, x7, x4\n\t"
40935         "subs	x6, x6, x7\n\t"
40936         "csel	x2, x3, x2, hi\n\t"
40937         "csel	x2, x4, x2, lo\n\t"
40938         "csel	x4, x4, xzr, eq\n\t"
40939         "subs	x5, x5, #8\n\t"
40940         "b.cs	1b\n\t"
40941         "eor	%[a], x2, x4\n\t"
40942         : [a] "+r" (a)
40943         : [b] "r" (b)
40944         : "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16"
40945     );
40946 #else
40947     __asm__ __volatile__ (
40948         "mov	x2, -1\n\t"
40949         "mov	x3, 1\n\t"
40950         "mov	x4, -1\n\t"
40951         "ldp	x5, x6, [%[a], 0]\n\t"
40952         "ldp	x7, x8, [%[a], 16]\n\t"
40953         "ldp	x9, x10, [%[a], 32]\n\t"
40954         "ldp	x11, x12, [%[b], 0]\n\t"
40955         "ldp	x13, x14, [%[b], 16]\n\t"
40956         "ldp	x15, x16, [%[b], 32]\n\t"
40957         "and	x10, x10, x4\n\t"
40958         "and	x16, x16, x4\n\t"
40959         "subs	x10, x10, x16\n\t"
40960         "csel	x2, x4, x2, lo\n\t"
40961         "csel	x4, x4, xzr, eq\n\t"
40962         "csel	x2, x3, x2, hi\n\t"
40963         "and	x9, x9, x4\n\t"
40964         "and	x15, x15, x4\n\t"
40965         "subs	x9, x9, x15\n\t"
40966         "csel	x2, x4, x2, lo\n\t"
40967         "csel	x4, x4, xzr, eq\n\t"
40968         "csel	x2, x3, x2, hi\n\t"
40969         "and	x8, x8, x4\n\t"
40970         "and	x14, x14, x4\n\t"
40971         "subs	x8, x8, x14\n\t"
40972         "csel	x2, x4, x2, lo\n\t"
40973         "csel	x4, x4, xzr, eq\n\t"
40974         "csel	x2, x3, x2, hi\n\t"
40975         "and	x7, x7, x4\n\t"
40976         "and	x13, x13, x4\n\t"
40977         "subs	x7, x7, x13\n\t"
40978         "csel	x2, x4, x2, lo\n\t"
40979         "csel	x4, x4, xzr, eq\n\t"
40980         "csel	x2, x3, x2, hi\n\t"
40981         "and	x6, x6, x4\n\t"
40982         "and	x12, x12, x4\n\t"
40983         "subs	x6, x6, x12\n\t"
40984         "csel	x2, x4, x2, lo\n\t"
40985         "csel	x4, x4, xzr, eq\n\t"
40986         "csel	x2, x3, x2, hi\n\t"
40987         "and	x5, x5, x4\n\t"
40988         "and	x11, x11, x4\n\t"
40989         "subs	x5, x5, x11\n\t"
40990         "csel	x2, x4, x2, lo\n\t"
40991         "csel	x4, x4, xzr, eq\n\t"
40992         "csel	x2, x3, x2, hi\n\t"
40993         "eor	%[a], x2, x4\n\t"
40994         : [a] "+r" (a)
40995         : [b] "r" (b)
40996         : "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16"
40997     );
40998 #endif
40999 
41000     return (sp_int64)a;
41001 }
41002 
41003 /* Normalize the values in each word to 64.
41004  *
41005  * a  Array of sp_digit to normalize.
41006  */
41007 #define sp_384_norm_6(a)
41008 
41009 /* Conditionally subtract b from a using the mask m.
41010  * m is -1 to subtract and 0 when not copying.
41011  *
41012  * r  A single precision number representing condition subtract result.
41013  * a  A single precision number to subtract from.
41014  * b  A single precision number to subtract.
41015  * m  Mask value to apply.
41016  */
sp_384_cond_sub_6(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)41017 static sp_digit sp_384_cond_sub_6(sp_digit* r, const sp_digit* a, const sp_digit* b,
41018         sp_digit m)
41019 {
41020     __asm__ __volatile__ (
41021 
41022         "ldp	x5, x7, [%[b], 0]\n\t"
41023         "ldp	x11, x12, [%[b], 16]\n\t"
41024         "ldp	x4, x6, [%[a], 0]\n\t"
41025         "and	x5, x5, %[m]\n\t"
41026         "ldp	x9, x10, [%[a], 16]\n\t"
41027         "and	x7, x7, %[m]\n\t"
41028         "subs	x4, x4, x5\n\t"
41029         "and	x11, x11, %[m]\n\t"
41030         "sbcs	x6, x6, x7\n\t"
41031         "and	x12, x12, %[m]\n\t"
41032         "sbcs	x9, x9, x11\n\t"
41033         "stp	x4, x6, [%[r], 0]\n\t"
41034         "sbcs	x10, x10, x12\n\t"
41035         "stp	x9, x10, [%[r], 16]\n\t"
41036         "ldp	x5, x7, [%[b], 32]\n\t"
41037         "ldp	x4, x6, [%[a], 32]\n\t"
41038         "and	x5, x5, %[m]\n\t"
41039         "and	x7, x7, %[m]\n\t"
41040         "sbcs	x4, x4, x5\n\t"
41041         "sbcs	x6, x6, x7\n\t"
41042         "stp	x4, x6, [%[r], 32]\n\t"
41043         "csetm	%[r], cc\n\t"
41044         : [r] "+r" (r)
41045         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
41046         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
41047     );
41048 
41049     return (sp_digit)r;
41050 }
41051 
41052 /* Map the Montgomery form projective coordinate point to an affine point.
41053  *
41054  * r  Resulting affine coordinate point.
41055  * p  Montgomery form projective coordinate point.
41056  * t  Temporary ordinate data.
41057  */
sp_384_map_6(sp_point_384 * r,const sp_point_384 * p,sp_digit * t)41058 static void sp_384_map_6(sp_point_384* r, const sp_point_384* p,
41059     sp_digit* t)
41060 {
41061     sp_digit* t1 = t;
41062     sp_digit* t2 = t + 2*6;
41063     sp_int64 n;
41064 
41065     sp_384_mont_inv_6(t1, p->z, t + 2*6);
41066 
41067     sp_384_mont_sqr_6(t2, t1, p384_mod, p384_mp_mod);
41068     sp_384_mont_mul_6(t1, t2, t1, p384_mod, p384_mp_mod);
41069 
41070     /* x /= z^2 */
41071     sp_384_mont_mul_6(r->x, p->x, t2, p384_mod, p384_mp_mod);
41072     XMEMSET(r->x + 6, 0, sizeof(r->x) / 2U);
41073     sp_384_mont_reduce_6(r->x, p384_mod, p384_mp_mod);
41074     /* Reduce x to less than modulus */
41075     n = sp_384_cmp_6(r->x, p384_mod);
41076     sp_384_cond_sub_6(r->x, r->x, p384_mod, 0 - ((n >= 0) ?
41077                 (sp_digit)1 : (sp_digit)0));
41078     sp_384_norm_6(r->x);
41079 
41080     /* y /= z^3 */
41081     sp_384_mont_mul_6(r->y, p->y, t1, p384_mod, p384_mp_mod);
41082     XMEMSET(r->y + 6, 0, sizeof(r->y) / 2U);
41083     sp_384_mont_reduce_6(r->y, p384_mod, p384_mp_mod);
41084     /* Reduce y to less than modulus */
41085     n = sp_384_cmp_6(r->y, p384_mod);
41086     sp_384_cond_sub_6(r->y, r->y, p384_mod, 0 - ((n >= 0) ?
41087                 (sp_digit)1 : (sp_digit)0));
41088     sp_384_norm_6(r->y);
41089 
41090     XMEMSET(r->z, 0, sizeof(r->z));
41091     r->z[0] = 1;
41092 
41093 }
41094 
41095 /* Add two Montgomery form numbers (r = a + b % m).
41096  *
41097  * r   Result of addition.
41098  * a   First number to add in Montgomery form.
41099  * b   Second number to add in Montgomery form.
41100  * m   Modulus (prime).
41101  */
sp_384_mont_add_6(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m)41102 static void sp_384_mont_add_6(sp_digit* r, const sp_digit* a, const sp_digit* b,
41103         const sp_digit* m)
41104 {
41105     sp_digit o;
41106 
41107     o = sp_384_add_6(r, a, b);
41108     sp_384_cond_sub_6(r, r, m, 0 - o);
41109 }
41110 
41111 /* Double a Montgomery form number (r = a + a % m).
41112  *
41113  * r   Result of doubling.
41114  * a   Number to double in Montgomery form.
41115  * m   Modulus (prime).
41116  */
sp_384_mont_dbl_6(sp_digit * r,const sp_digit * a,const sp_digit * m)41117 static void sp_384_mont_dbl_6(sp_digit* r, const sp_digit* a, const sp_digit* m)
41118 {
41119     sp_digit o;
41120 
41121     o = sp_384_add_6(r, a, a);
41122     sp_384_cond_sub_6(r, r, m, 0 - o);
41123 }
41124 
41125 /* Triple a Montgomery form number (r = a + a + a % m).
41126  *
41127  * r   Result of Tripling.
41128  * a   Number to triple in Montgomery form.
41129  * m   Modulus (prime).
41130  */
sp_384_mont_tpl_6(sp_digit * r,const sp_digit * a,const sp_digit * m)41131 static void sp_384_mont_tpl_6(sp_digit* r, const sp_digit* a, const sp_digit* m)
41132 {
41133     sp_digit o;
41134 
41135     o = sp_384_add_6(r, a, a);
41136     sp_384_cond_sub_6(r, r, m, 0 - o);
41137     o = sp_384_add_6(r, r, a);
41138     sp_384_cond_sub_6(r, r, m, 0 - o);
41139 }
41140 
41141 /* Conditionally add a and b using the mask m.
41142  * m is -1 to add and 0 when not.
41143  *
41144  * r  A single precision number representing conditional add result.
41145  * a  A single precision number to add with.
41146  * b  A single precision number to add.
41147  * m  Mask value to apply.
41148  */
sp_384_cond_add_6(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)41149 static sp_digit sp_384_cond_add_6(sp_digit* r, const sp_digit* a, const sp_digit* b,
41150         sp_digit m)
41151 {
41152 #ifdef WOLFSSL_SP_SMALL
41153     sp_digit c = 0;
41154 
41155     __asm__ __volatile__ (
41156         "mov	x8, #0\n\t"
41157         "1:\n\t"
41158         "adds	%[c], %[c], #-1\n\t"
41159         "ldr	x4, [%[a], x8]\n\t"
41160         "ldr	x5, [%[b], x8]\n\t"
41161         "and	x5, x5, %[m]\n\t"
41162         "adcs	x4, x4, x5\n\t"
41163         "cset	%[c], cs\n\t"
41164         "str	x4, [%[r], x8]\n\t"
41165         "add	x8, x8, #8\n\t"
41166         "cmp	x8, 48\n\t"
41167         "b.lt	1b\n\t"
41168         : [c] "+r" (c)
41169         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
41170         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
41171     );
41172 
41173     return c;
41174 #else
41175     __asm__ __volatile__ (
41176 
41177         "ldp	x5, x7, [%[b], 0]\n\t"
41178         "ldp	x11, x12, [%[b], 16]\n\t"
41179         "ldp	x4, x6, [%[a], 0]\n\t"
41180         "and	x5, x5, %[m]\n\t"
41181         "ldp	x9, x10, [%[a], 16]\n\t"
41182         "and	x7, x7, %[m]\n\t"
41183         "adds	x4, x4, x5\n\t"
41184         "and	x11, x11, %[m]\n\t"
41185         "adcs	x6, x6, x7\n\t"
41186         "and	x12, x12, %[m]\n\t"
41187         "adcs	x9, x9, x11\n\t"
41188         "stp	x4, x6, [%[r], 0]\n\t"
41189         "adcs	x10, x10, x12\n\t"
41190         "stp	x9, x10, [%[r], 16]\n\t"
41191         "ldp	x5, x7, [%[b], 32]\n\t"
41192         "ldp	x4, x6, [%[a], 32]\n\t"
41193         "and	x5, x5, %[m]\n\t"
41194         "and	x7, x7, %[m]\n\t"
41195         "adcs	x4, x4, x5\n\t"
41196         "adcs	x6, x6, x7\n\t"
41197         "stp	x4, x6, [%[r], 32]\n\t"
41198         "cset	%[r], cs\n\t"
41199         : [r] "+r" (r)
41200         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
41201         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
41202     );
41203 
41204     return (sp_digit)r;
41205 #endif /* WOLFSSL_SP_SMALL */
41206 }
41207 
41208 /* Subtract two Montgomery form numbers (r = a - b % m).
41209  *
41210  * r   Result of subtration.
41211  * a   Number to subtract from in Montgomery form.
41212  * b   Number to subtract with in Montgomery form.
41213  * m   Modulus (prime).
41214  */
sp_384_mont_sub_6(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m)41215 static void sp_384_mont_sub_6(sp_digit* r, const sp_digit* a, const sp_digit* b,
41216         const sp_digit* m)
41217 {
41218     sp_digit o;
41219 
41220     o = sp_384_sub_6(r, a, b);
41221     sp_384_cond_add_6(r, r, m, o);
41222 }
41223 
sp_384_rshift1_6(sp_digit * r,sp_digit * a)41224 static void sp_384_rshift1_6(sp_digit* r, sp_digit* a)
41225 {
41226     __asm__ __volatile__ (
41227         "ldp	x2, x3, [%[a]]\n\t"
41228         "ldp	x4, x5, [%[a], 16]\n\t"
41229         "ldp	x6, x7, [%[a], 32]\n\t"
41230         "lsr	x11, x6, 1\n\t"
41231         "lsr	x10, x5, 1\n\t"
41232         "lsr	x9, x4, 1\n\t"
41233         "lsr	x8, x3, 1\n\t"
41234         "lsr	x2, x2, 1\n\t"
41235         "orr	x2, x2, x3, lsl 63\n\t"
41236         "orr	x3, x8, x4, lsl 63\n\t"
41237         "orr	x4, x9, x5, lsl 63\n\t"
41238         "orr	x5, x10, x6, lsl 63\n\t"
41239         "orr	x6, x11, x7, lsl 63\n\t"
41240         "lsr	x7, x7, 1\n\t"
41241         "stp	x2, x3, [%[r]]\n\t"
41242         "stp	x4, x5, [%[r], 16]\n\t"
41243         "stp	x6, x7, [%[r], 32]\n\t"
41244         :
41245         : [r] "r" (r), [a] "r" (a)
41246         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
41247     );
41248 }
41249 
41250 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
41251  *
41252  * r  Result of division by 2.
41253  * a  Number to divide.
41254  * m  Modulus (prime).
41255  */
sp_384_div2_6(sp_digit * r,const sp_digit * a,const sp_digit * m)41256 static void sp_384_div2_6(sp_digit* r, const sp_digit* a, const sp_digit* m)
41257 {
41258     sp_digit o;
41259 
41260     o = sp_384_cond_add_6(r, a, m, 0 - (a[0] & 1));
41261     sp_384_rshift1_6(r, r);
41262     r[5] |= o << 63;
41263 }
41264 
41265 /* Double the Montgomery form projective point p.
41266  *
41267  * r  Result of doubling point.
41268  * p  Point to double.
41269  * t  Temporary ordinate data.
41270  */
41271 #ifdef WOLFSSL_SP_NONBLOCK
41272 typedef struct sp_384_proj_point_dbl_6_ctx {
41273     int state;
41274     sp_digit* t1;
41275     sp_digit* t2;
41276     sp_digit* x;
41277     sp_digit* y;
41278     sp_digit* z;
41279 } sp_384_proj_point_dbl_6_ctx;
41280 
sp_384_proj_point_dbl_6_nb(sp_ecc_ctx_t * sp_ctx,sp_point_384 * r,const sp_point_384 * p,sp_digit * t)41281 static int sp_384_proj_point_dbl_6_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t)
41282 {
41283     int err = FP_WOULDBLOCK;
41284     sp_384_proj_point_dbl_6_ctx* ctx = (sp_384_proj_point_dbl_6_ctx*)sp_ctx->data;
41285 
41286     typedef char ctx_size_test[sizeof(sp_384_proj_point_dbl_6_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
41287     (void)sizeof(ctx_size_test);
41288 
41289     switch (ctx->state) {
41290     case 0:
41291         ctx->t1 = t;
41292         ctx->t2 = t + 2*6;
41293         ctx->x = r->x;
41294         ctx->y = r->y;
41295         ctx->z = r->z;
41296 
41297         /* Put infinity into result. */
41298         if (r != p) {
41299             r->infinity = p->infinity;
41300         }
41301         ctx->state = 1;
41302         break;
41303     case 1:
41304         /* T1 = Z * Z */
41305         sp_384_mont_sqr_6(ctx->t1, p->z, p384_mod, p384_mp_mod);
41306         ctx->state = 2;
41307         break;
41308     case 2:
41309         /* Z = Y * Z */
41310         sp_384_mont_mul_6(ctx->z, p->y, p->z, p384_mod, p384_mp_mod);
41311         ctx->state = 3;
41312         break;
41313     case 3:
41314         /* Z = 2Z */
41315         sp_384_mont_dbl_6(ctx->z, ctx->z, p384_mod);
41316         ctx->state = 4;
41317         break;
41318     case 4:
41319         /* T2 = X - T1 */
41320         sp_384_mont_sub_6(ctx->t2, p->x, ctx->t1, p384_mod);
41321         ctx->state = 5;
41322         break;
41323     case 5:
41324         /* T1 = X + T1 */
41325         sp_384_mont_add_6(ctx->t1, p->x, ctx->t1, p384_mod);
41326         ctx->state = 6;
41327         break;
41328     case 6:
41329         /* T2 = T1 * T2 */
41330         sp_384_mont_mul_6(ctx->t2, ctx->t1, ctx->t2, p384_mod, p384_mp_mod);
41331         ctx->state = 7;
41332         break;
41333     case 7:
41334         /* T1 = 3T2 */
41335         sp_384_mont_tpl_6(ctx->t1, ctx->t2, p384_mod);
41336         ctx->state = 8;
41337         break;
41338     case 8:
41339         /* Y = 2Y */
41340         sp_384_mont_dbl_6(ctx->y, p->y, p384_mod);
41341         ctx->state = 9;
41342         break;
41343     case 9:
41344         /* Y = Y * Y */
41345         sp_384_mont_sqr_6(ctx->y, ctx->y, p384_mod, p384_mp_mod);
41346         ctx->state = 10;
41347         break;
41348     case 10:
41349         /* T2 = Y * Y */
41350         sp_384_mont_sqr_6(ctx->t2, ctx->y, p384_mod, p384_mp_mod);
41351         ctx->state = 11;
41352         break;
41353     case 11:
41354         /* T2 = T2/2 */
41355         sp_384_div2_6(ctx->t2, ctx->t2, p384_mod);
41356         ctx->state = 12;
41357         break;
41358     case 12:
41359         /* Y = Y * X */
41360         sp_384_mont_mul_6(ctx->y, ctx->y, p->x, p384_mod, p384_mp_mod);
41361         ctx->state = 13;
41362         break;
41363     case 13:
41364         /* X = T1 * T1 */
41365         sp_384_mont_sqr_6(ctx->x, ctx->t1, p384_mod, p384_mp_mod);
41366         ctx->state = 14;
41367         break;
41368     case 14:
41369         /* X = X - Y */
41370         sp_384_mont_sub_6(ctx->x, ctx->x, ctx->y, p384_mod);
41371         ctx->state = 15;
41372         break;
41373     case 15:
41374         /* X = X - Y */
41375         sp_384_mont_sub_6(ctx->x, ctx->x, ctx->y, p384_mod);
41376         ctx->state = 16;
41377         break;
41378     case 16:
41379         /* Y = Y - X */
41380         sp_384_mont_sub_6(ctx->y, ctx->y, ctx->x, p384_mod);
41381         ctx->state = 17;
41382         break;
41383     case 17:
41384         /* Y = Y * T1 */
41385         sp_384_mont_mul_6(ctx->y, ctx->y, ctx->t1, p384_mod, p384_mp_mod);
41386         ctx->state = 18;
41387         break;
41388     case 18:
41389         /* Y = Y - T2 */
41390         sp_384_mont_sub_6(ctx->y, ctx->y, ctx->t2, p384_mod);
41391         ctx->state = 19;
41392         /* fall-through */
41393     case 19:
41394         err = MP_OKAY;
41395         break;
41396     }
41397 
41398     if (err == MP_OKAY && ctx->state != 19) {
41399         err = FP_WOULDBLOCK;
41400     }
41401 
41402     return err;
41403 }
41404 #endif /* WOLFSSL_SP_NONBLOCK */
41405 
sp_384_proj_point_dbl_6(sp_point_384 * r,const sp_point_384 * p,sp_digit * t)41406 static void sp_384_proj_point_dbl_6(sp_point_384* r, const sp_point_384* p, sp_digit* t)
41407 {
41408     sp_digit* t1 = t;
41409     sp_digit* t2 = t + 2*6;
41410     sp_digit* x;
41411     sp_digit* y;
41412     sp_digit* z;
41413 
41414     x = r->x;
41415     y = r->y;
41416     z = r->z;
41417     /* Put infinity into result. */
41418     if (r != p) {
41419         r->infinity = p->infinity;
41420     }
41421 
41422     /* T1 = Z * Z */
41423     sp_384_mont_sqr_6(t1, p->z, p384_mod, p384_mp_mod);
41424     /* Z = Y * Z */
41425     sp_384_mont_mul_6(z, p->y, p->z, p384_mod, p384_mp_mod);
41426     /* Z = 2Z */
41427     sp_384_mont_dbl_6(z, z, p384_mod);
41428     /* T2 = X - T1 */
41429     sp_384_mont_sub_6(t2, p->x, t1, p384_mod);
41430     /* T1 = X + T1 */
41431     sp_384_mont_add_6(t1, p->x, t1, p384_mod);
41432     /* T2 = T1 * T2 */
41433     sp_384_mont_mul_6(t2, t1, t2, p384_mod, p384_mp_mod);
41434     /* T1 = 3T2 */
41435     sp_384_mont_tpl_6(t1, t2, p384_mod);
41436     /* Y = 2Y */
41437     sp_384_mont_dbl_6(y, p->y, p384_mod);
41438     /* Y = Y * Y */
41439     sp_384_mont_sqr_6(y, y, p384_mod, p384_mp_mod);
41440     /* T2 = Y * Y */
41441     sp_384_mont_sqr_6(t2, y, p384_mod, p384_mp_mod);
41442     /* T2 = T2/2 */
41443     sp_384_div2_6(t2, t2, p384_mod);
41444     /* Y = Y * X */
41445     sp_384_mont_mul_6(y, y, p->x, p384_mod, p384_mp_mod);
41446     /* X = T1 * T1 */
41447     sp_384_mont_sqr_6(x, t1, p384_mod, p384_mp_mod);
41448     /* X = X - Y */
41449     sp_384_mont_sub_6(x, x, y, p384_mod);
41450     /* X = X - Y */
41451     sp_384_mont_sub_6(x, x, y, p384_mod);
41452     /* Y = Y - X */
41453     sp_384_mont_sub_6(y, y, x, p384_mod);
41454     /* Y = Y * T1 */
41455     sp_384_mont_mul_6(y, y, t1, p384_mod, p384_mp_mod);
41456     /* Y = Y - T2 */
41457     sp_384_mont_sub_6(y, y, t2, p384_mod);
41458 }
41459 
41460 /* Double the Montgomery form projective point p a number of times.
41461  *
41462  * r  Result of repeated doubling of point.
41463  * p  Point to double.
41464  * n  Number of times to double
41465  * t  Temporary ordinate data.
41466  */
sp_384_proj_point_dbl_n_6(sp_point_384 * p,int n,sp_digit * t)41467 static void sp_384_proj_point_dbl_n_6(sp_point_384* p, int n,
41468     sp_digit* t)
41469 {
41470     sp_digit* w = t;
41471     sp_digit* a = t + 2*6;
41472     sp_digit* b = t + 4*6;
41473     sp_digit* t1 = t + 6*6;
41474     sp_digit* t2 = t + 8*6;
41475     sp_digit* x;
41476     sp_digit* y;
41477     sp_digit* z;
41478 
41479     x = p->x;
41480     y = p->y;
41481     z = p->z;
41482 
41483     /* Y = 2*Y */
41484     sp_384_mont_dbl_6(y, y, p384_mod);
41485     /* W = Z^4 */
41486     sp_384_mont_sqr_6(w, z, p384_mod, p384_mp_mod);
41487     sp_384_mont_sqr_6(w, w, p384_mod, p384_mp_mod);
41488 
41489 #ifndef WOLFSSL_SP_SMALL
41490     while (--n > 0)
41491 #else
41492     while (--n >= 0)
41493 #endif
41494     {
41495         /* A = 3*(X^2 - W) */
41496         sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod);
41497         sp_384_mont_sub_6(t1, t1, w, p384_mod);
41498         sp_384_mont_tpl_6(a, t1, p384_mod);
41499         /* B = X*Y^2 */
41500         sp_384_mont_sqr_6(t1, y, p384_mod, p384_mp_mod);
41501         sp_384_mont_mul_6(b, t1, x, p384_mod, p384_mp_mod);
41502         /* X = A^2 - 2B */
41503         sp_384_mont_sqr_6(x, a, p384_mod, p384_mp_mod);
41504         sp_384_mont_dbl_6(t2, b, p384_mod);
41505         sp_384_mont_sub_6(x, x, t2, p384_mod);
41506         /* Z = Z*Y */
41507         sp_384_mont_mul_6(z, z, y, p384_mod, p384_mp_mod);
41508         /* t2 = Y^4 */
41509         sp_384_mont_sqr_6(t1, t1, p384_mod, p384_mp_mod);
41510 #ifdef WOLFSSL_SP_SMALL
41511         if (n != 0)
41512 #endif
41513         {
41514             /* W = W*Y^4 */
41515             sp_384_mont_mul_6(w, w, t1, p384_mod, p384_mp_mod);
41516         }
41517         /* y = 2*A*(B - X) - Y^4 */
41518         sp_384_mont_sub_6(y, b, x, p384_mod);
41519         sp_384_mont_mul_6(y, y, a, p384_mod, p384_mp_mod);
41520         sp_384_mont_dbl_6(y, y, p384_mod);
41521         sp_384_mont_sub_6(y, y, t1, p384_mod);
41522     }
41523 #ifndef WOLFSSL_SP_SMALL
41524     /* A = 3*(X^2 - W) */
41525     sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod);
41526     sp_384_mont_sub_6(t1, t1, w, p384_mod);
41527     sp_384_mont_tpl_6(a, t1, p384_mod);
41528     /* B = X*Y^2 */
41529     sp_384_mont_sqr_6(t1, y, p384_mod, p384_mp_mod);
41530     sp_384_mont_mul_6(b, t1, x, p384_mod, p384_mp_mod);
41531     /* X = A^2 - 2B */
41532     sp_384_mont_sqr_6(x, a, p384_mod, p384_mp_mod);
41533     sp_384_mont_dbl_6(t2, b, p384_mod);
41534     sp_384_mont_sub_6(x, x, t2, p384_mod);
41535     /* Z = Z*Y */
41536     sp_384_mont_mul_6(z, z, y, p384_mod, p384_mp_mod);
41537     /* t2 = Y^4 */
41538     sp_384_mont_sqr_6(t1, t1, p384_mod, p384_mp_mod);
41539     /* y = 2*A*(B - X) - Y^4 */
41540     sp_384_mont_sub_6(y, b, x, p384_mod);
41541     sp_384_mont_mul_6(y, y, a, p384_mod, p384_mp_mod);
41542     sp_384_mont_dbl_6(y, y, p384_mod);
41543     sp_384_mont_sub_6(y, y, t1, p384_mod);
41544 #endif
41545     /* Y = Y/2 */
41546     sp_384_div2_6(y, y, p384_mod);
41547 }
41548 
41549 /* Compare two numbers to determine if they are equal.
41550  * Constant time implementation.
41551  *
41552  * a  First number to compare.
41553  * b  Second number to compare.
41554  * returns 1 when equal and 0 otherwise.
41555  */
sp_384_cmp_equal_6(const sp_digit * a,const sp_digit * b)41556 static int sp_384_cmp_equal_6(const sp_digit* a, const sp_digit* b)
41557 {
41558     return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
41559             (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5])) == 0;
41560 }
41561 
41562 /* Add two Montgomery form projective points.
41563  *
41564  * r  Result of addition.
41565  * p  First point to add.
41566  * q  Second point to add.
41567  * t  Temporary ordinate data.
41568  */
41569 
41570 #ifdef WOLFSSL_SP_NONBLOCK
41571 typedef struct sp_384_proj_point_add_6_ctx {
41572     int state;
41573     sp_384_proj_point_dbl_6_ctx dbl_ctx;
41574     const sp_point_384* ap[2];
41575     sp_point_384* rp[2];
41576     sp_digit* t1;
41577     sp_digit* t2;
41578     sp_digit* t3;
41579     sp_digit* t4;
41580     sp_digit* t5;
41581     sp_digit* x;
41582     sp_digit* y;
41583     sp_digit* z;
41584 } sp_384_proj_point_add_6_ctx;
41585 
sp_384_proj_point_add_6_nb(sp_ecc_ctx_t * sp_ctx,sp_point_384 * r,const sp_point_384 * p,const sp_point_384 * q,sp_digit * t)41586 static int sp_384_proj_point_add_6_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
41587     const sp_point_384* p, const sp_point_384* q, sp_digit* t)
41588 {
41589     int err = FP_WOULDBLOCK;
41590     sp_384_proj_point_add_6_ctx* ctx = (sp_384_proj_point_add_6_ctx*)sp_ctx->data;
41591 
41592     /* Ensure only the first point is the same as the result. */
41593     if (q == r) {
41594         const sp_point_384* a = p;
41595         p = q;
41596         q = a;
41597     }
41598 
41599     typedef char ctx_size_test[sizeof(sp_384_proj_point_add_6_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
41600     (void)sizeof(ctx_size_test);
41601 
41602     switch (ctx->state) {
41603     case 0: /* INIT */
41604         ctx->t1 = t;
41605         ctx->t2 = t + 2*6;
41606         ctx->t3 = t + 4*6;
41607         ctx->t4 = t + 6*6;
41608         ctx->t5 = t + 8*6;
41609 
41610         ctx->state = 1;
41611         break;
41612     case 1:
41613         /* Check double */
41614         (void)sp_384_sub_6(ctx->t1, p384_mod, q->y);
41615         sp_384_norm_6(ctx->t1);
41616         if ((sp_384_cmp_equal_6(p->x, q->x) & sp_384_cmp_equal_6(p->z, q->z) &
41617             (sp_384_cmp_equal_6(p->y, q->y) | sp_384_cmp_equal_6(p->y, ctx->t1))) != 0)
41618         {
41619             XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
41620             ctx->state = 2;
41621         }
41622         else {
41623             ctx->state = 3;
41624         }
41625         break;
41626     case 2:
41627         err = sp_384_proj_point_dbl_6_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
41628         if (err == MP_OKAY)
41629             ctx->state = 27; /* done */
41630         break;
41631     case 3:
41632     {
41633         int i;
41634         ctx->rp[0] = r;
41635 
41636         /*lint allow cast to different type of pointer*/
41637         ctx->rp[1] = (sp_point_384*)t; /*lint !e9087 !e740*/
41638         XMEMSET(ctx->rp[1], 0, sizeof(sp_point_384));
41639         ctx->x = ctx->rp[p->infinity | q->infinity]->x;
41640         ctx->y = ctx->rp[p->infinity | q->infinity]->y;
41641         ctx->z = ctx->rp[p->infinity | q->infinity]->z;
41642 
41643         ctx->ap[0] = p;
41644         ctx->ap[1] = q;
41645         for (i=0; i<6; i++) {
41646             r->x[i] = ctx->ap[p->infinity]->x[i];
41647         }
41648         for (i=0; i<6; i++) {
41649             r->y[i] = ctx->ap[p->infinity]->y[i];
41650         }
41651         for (i=0; i<6; i++) {
41652             r->z[i] = ctx->ap[p->infinity]->z[i];
41653         }
41654         r->infinity = ctx->ap[p->infinity]->infinity;
41655 
41656         ctx->state = 4;
41657         break;
41658     }
41659     case 4:
41660         /* U1 = X1*Z2^2 */
41661         sp_384_mont_sqr_6(ctx->t1, q->z, p384_mod, p384_mp_mod);
41662         ctx->state = 5;
41663         break;
41664     case 5:
41665         sp_384_mont_mul_6(ctx->t3, ctx->t1, q->z, p384_mod, p384_mp_mod);
41666         ctx->state = 6;
41667         break;
41668     case 6:
41669         sp_384_mont_mul_6(ctx->t1, ctx->t1, ctx->x, p384_mod, p384_mp_mod);
41670         ctx->state = 7;
41671         break;
41672     case 7:
41673         /* U2 = X2*Z1^2 */
41674         sp_384_mont_sqr_6(ctx->t2, ctx->z, p384_mod, p384_mp_mod);
41675         ctx->state = 8;
41676         break;
41677     case 8:
41678         sp_384_mont_mul_6(ctx->t4, ctx->t2, ctx->z, p384_mod, p384_mp_mod);
41679         ctx->state = 9;
41680         break;
41681     case 9:
41682         sp_384_mont_mul_6(ctx->t2, ctx->t2, q->x, p384_mod, p384_mp_mod);
41683         ctx->state = 10;
41684         break;
41685     case 10:
41686         /* S1 = Y1*Z2^3 */
41687         sp_384_mont_mul_6(ctx->t3, ctx->t3, ctx->y, p384_mod, p384_mp_mod);
41688         ctx->state = 11;
41689         break;
41690     case 11:
41691         /* S2 = Y2*Z1^3 */
41692         sp_384_mont_mul_6(ctx->t4, ctx->t4, q->y, p384_mod, p384_mp_mod);
41693         ctx->state = 12;
41694         break;
41695     case 12:
41696         /* H = U2 - U1 */
41697         sp_384_mont_sub_6(ctx->t2, ctx->t2, ctx->t1, p384_mod);
41698         ctx->state = 13;
41699         break;
41700     case 13:
41701         /* R = S2 - S1 */
41702         sp_384_mont_sub_6(ctx->t4, ctx->t4, ctx->t3, p384_mod);
41703         ctx->state = 14;
41704         break;
41705     case 14:
41706         /* Z3 = H*Z1*Z2 */
41707         sp_384_mont_mul_6(ctx->z, ctx->z, q->z, p384_mod, p384_mp_mod);
41708         ctx->state = 15;
41709         break;
41710     case 15:
41711         sp_384_mont_mul_6(ctx->z, ctx->z, ctx->t2, p384_mod, p384_mp_mod);
41712         ctx->state = 16;
41713         break;
41714     case 16:
41715         /* X3 = R^2 - H^3 - 2*U1*H^2 */
41716         sp_384_mont_sqr_6(ctx->x, ctx->t4, p384_mod, p384_mp_mod);
41717         ctx->state = 17;
41718         break;
41719     case 17:
41720         sp_384_mont_sqr_6(ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
41721         ctx->state = 18;
41722         break;
41723     case 18:
41724         sp_384_mont_mul_6(ctx->y, ctx->t1, ctx->t5, p384_mod, p384_mp_mod);
41725         ctx->state = 19;
41726         break;
41727     case 19:
41728         sp_384_mont_mul_6(ctx->t5, ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
41729         ctx->state = 20;
41730         break;
41731     case 20:
41732         sp_384_mont_sub_6(ctx->x, ctx->x, ctx->t5, p384_mod);
41733         ctx->state = 21;
41734         break;
41735     case 21:
41736         sp_384_mont_dbl_6(ctx->t1, ctx->y, p384_mod);
41737         ctx->state = 22;
41738         break;
41739     case 22:
41740         sp_384_mont_sub_6(ctx->x, ctx->x, ctx->t1, p384_mod);
41741         ctx->state = 23;
41742         break;
41743     case 23:
41744         /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
41745         sp_384_mont_sub_6(ctx->y, ctx->y, ctx->x, p384_mod);
41746         ctx->state = 24;
41747         break;
41748     case 24:
41749         sp_384_mont_mul_6(ctx->y, ctx->y, ctx->t4, p384_mod, p384_mp_mod);
41750         ctx->state = 25;
41751         break;
41752     case 25:
41753         sp_384_mont_mul_6(ctx->t5, ctx->t5, ctx->t3, p384_mod, p384_mp_mod);
41754         ctx->state = 26;
41755         break;
41756     case 26:
41757         sp_384_mont_sub_6(ctx->y, ctx->y, ctx->t5, p384_mod);
41758         ctx->state = 27;
41759         /* fall-through */
41760     case 27:
41761         err = MP_OKAY;
41762         break;
41763     }
41764 
41765     if (err == MP_OKAY && ctx->state != 27) {
41766         err = FP_WOULDBLOCK;
41767     }
41768     return err;
41769 }
41770 #endif /* WOLFSSL_SP_NONBLOCK */
41771 
sp_384_proj_point_add_6(sp_point_384 * r,const sp_point_384 * p,const sp_point_384 * q,sp_digit * t)41772 static void sp_384_proj_point_add_6(sp_point_384* r,
41773         const sp_point_384* p, const sp_point_384* q, sp_digit* t)
41774 {
41775     const sp_point_384* ap[2];
41776     sp_point_384* rp[2];
41777     sp_digit* t1 = t;
41778     sp_digit* t2 = t + 2*6;
41779     sp_digit* t3 = t + 4*6;
41780     sp_digit* t4 = t + 6*6;
41781     sp_digit* t5 = t + 8*6;
41782     sp_digit* x;
41783     sp_digit* y;
41784     sp_digit* z;
41785     int i;
41786 
41787     /* Ensure only the first point is the same as the result. */
41788     if (q == r) {
41789         const sp_point_384* a = p;
41790         p = q;
41791         q = a;
41792     }
41793 
41794     /* Check double */
41795     (void)sp_384_sub_6(t1, p384_mod, q->y);
41796     sp_384_norm_6(t1);
41797     if ((sp_384_cmp_equal_6(p->x, q->x) & sp_384_cmp_equal_6(p->z, q->z) &
41798         (sp_384_cmp_equal_6(p->y, q->y) | sp_384_cmp_equal_6(p->y, t1))) != 0) {
41799         sp_384_proj_point_dbl_6(r, p, t);
41800     }
41801     else {
41802         rp[0] = r;
41803 
41804         /*lint allow cast to different type of pointer*/
41805         rp[1] = (sp_point_384*)t; /*lint !e9087 !e740*/
41806         XMEMSET(rp[1], 0, sizeof(sp_point_384));
41807         x = rp[p->infinity | q->infinity]->x;
41808         y = rp[p->infinity | q->infinity]->y;
41809         z = rp[p->infinity | q->infinity]->z;
41810 
41811         ap[0] = p;
41812         ap[1] = q;
41813         for (i=0; i<6; i++) {
41814             r->x[i] = ap[p->infinity]->x[i];
41815         }
41816         for (i=0; i<6; i++) {
41817             r->y[i] = ap[p->infinity]->y[i];
41818         }
41819         for (i=0; i<6; i++) {
41820             r->z[i] = ap[p->infinity]->z[i];
41821         }
41822         r->infinity = ap[p->infinity]->infinity;
41823 
41824         /* U1 = X1*Z2^2 */
41825         sp_384_mont_sqr_6(t1, q->z, p384_mod, p384_mp_mod);
41826         sp_384_mont_mul_6(t3, t1, q->z, p384_mod, p384_mp_mod);
41827         sp_384_mont_mul_6(t1, t1, x, p384_mod, p384_mp_mod);
41828         /* U2 = X2*Z1^2 */
41829         sp_384_mont_sqr_6(t2, z, p384_mod, p384_mp_mod);
41830         sp_384_mont_mul_6(t4, t2, z, p384_mod, p384_mp_mod);
41831         sp_384_mont_mul_6(t2, t2, q->x, p384_mod, p384_mp_mod);
41832         /* S1 = Y1*Z2^3 */
41833         sp_384_mont_mul_6(t3, t3, y, p384_mod, p384_mp_mod);
41834         /* S2 = Y2*Z1^3 */
41835         sp_384_mont_mul_6(t4, t4, q->y, p384_mod, p384_mp_mod);
41836         /* H = U2 - U1 */
41837         sp_384_mont_sub_6(t2, t2, t1, p384_mod);
41838         /* R = S2 - S1 */
41839         sp_384_mont_sub_6(t4, t4, t3, p384_mod);
41840         /* Z3 = H*Z1*Z2 */
41841         sp_384_mont_mul_6(z, z, q->z, p384_mod, p384_mp_mod);
41842         sp_384_mont_mul_6(z, z, t2, p384_mod, p384_mp_mod);
41843         /* X3 = R^2 - H^3 - 2*U1*H^2 */
41844         sp_384_mont_sqr_6(x, t4, p384_mod, p384_mp_mod);
41845         sp_384_mont_sqr_6(t5, t2, p384_mod, p384_mp_mod);
41846         sp_384_mont_mul_6(y, t1, t5, p384_mod, p384_mp_mod);
41847         sp_384_mont_mul_6(t5, t5, t2, p384_mod, p384_mp_mod);
41848         sp_384_mont_sub_6(x, x, t5, p384_mod);
41849         sp_384_mont_dbl_6(t1, y, p384_mod);
41850         sp_384_mont_sub_6(x, x, t1, p384_mod);
41851         /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
41852         sp_384_mont_sub_6(y, y, x, p384_mod);
41853         sp_384_mont_mul_6(y, y, t4, p384_mod, p384_mp_mod);
41854         sp_384_mont_mul_6(t5, t5, t3, p384_mod, p384_mp_mod);
41855         sp_384_mont_sub_6(y, y, t5, p384_mod);
41856     }
41857 }
41858 
41859 /* Double the Montgomery form projective point p a number of times.
41860  *
41861  * r  Result of repeated doubling of point.
41862  * p  Point to double.
41863  * n  Number of times to double
41864  * t  Temporary ordinate data.
41865  */
sp_384_proj_point_dbl_n_store_6(sp_point_384 * r,const sp_point_384 * p,int n,int m,sp_digit * t)41866 static void sp_384_proj_point_dbl_n_store_6(sp_point_384* r,
41867         const sp_point_384* p, int n, int m, sp_digit* t)
41868 {
41869     sp_digit* w = t;
41870     sp_digit* a = t + 2*6;
41871     sp_digit* b = t + 4*6;
41872     sp_digit* t1 = t + 6*6;
41873     sp_digit* t2 = t + 8*6;
41874     sp_digit* x = r[2*m].x;
41875     sp_digit* y = r[(1<<n)*m].y;
41876     sp_digit* z = r[2*m].z;
41877     int i;
41878     int j;
41879 
41880     for (i=0; i<6; i++) {
41881         x[i] = p->x[i];
41882     }
41883     for (i=0; i<6; i++) {
41884         y[i] = p->y[i];
41885     }
41886     for (i=0; i<6; i++) {
41887         z[i] = p->z[i];
41888     }
41889 
41890     /* Y = 2*Y */
41891     sp_384_mont_dbl_6(y, y, p384_mod);
41892     /* W = Z^4 */
41893     sp_384_mont_sqr_6(w, z, p384_mod, p384_mp_mod);
41894     sp_384_mont_sqr_6(w, w, p384_mod, p384_mp_mod);
41895     j = m;
41896     for (i=1; i<=n; i++) {
41897         j *= 2;
41898 
41899         /* A = 3*(X^2 - W) */
41900         sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod);
41901         sp_384_mont_sub_6(t1, t1, w, p384_mod);
41902         sp_384_mont_tpl_6(a, t1, p384_mod);
41903         /* B = X*Y^2 */
41904         sp_384_mont_sqr_6(t2, y, p384_mod, p384_mp_mod);
41905         sp_384_mont_mul_6(b, t2, x, p384_mod, p384_mp_mod);
41906         x = r[j].x;
41907         /* X = A^2 - 2B */
41908         sp_384_mont_sqr_6(x, a, p384_mod, p384_mp_mod);
41909         sp_384_mont_dbl_6(t1, b, p384_mod);
41910         sp_384_mont_sub_6(x, x, t1, p384_mod);
41911         /* Z = Z*Y */
41912         sp_384_mont_mul_6(r[j].z, z, y, p384_mod, p384_mp_mod);
41913         z = r[j].z;
41914         /* t2 = Y^4 */
41915         sp_384_mont_sqr_6(t2, t2, p384_mod, p384_mp_mod);
41916         if (i != n) {
41917             /* W = W*Y^4 */
41918             sp_384_mont_mul_6(w, w, t2, p384_mod, p384_mp_mod);
41919         }
41920         /* y = 2*A*(B - X) - Y^4 */
41921         sp_384_mont_sub_6(y, b, x, p384_mod);
41922         sp_384_mont_mul_6(y, y, a, p384_mod, p384_mp_mod);
41923         sp_384_mont_dbl_6(y, y, p384_mod);
41924         sp_384_mont_sub_6(y, y, t2, p384_mod);
41925 
41926         /* Y = Y/2 */
41927         sp_384_div2_6(r[j].y, y, p384_mod);
41928         r[j].infinity = 0;
41929     }
41930 }
41931 
41932 /* Add two Montgomery form projective points.
41933  *
41934  * ra  Result of addition.
41935  * rs  Result of subtraction.
41936  * p   First point to add.
41937  * q   Second point to add.
41938  * t   Temporary ordinate data.
41939  */
sp_384_proj_point_add_sub_6(sp_point_384 * ra,sp_point_384 * rs,const sp_point_384 * p,const sp_point_384 * q,sp_digit * t)41940 static void sp_384_proj_point_add_sub_6(sp_point_384* ra,
41941         sp_point_384* rs, const sp_point_384* p, const sp_point_384* q,
41942         sp_digit* t)
41943 {
41944     sp_digit* t1 = t;
41945     sp_digit* t2 = t + 2*6;
41946     sp_digit* t3 = t + 4*6;
41947     sp_digit* t4 = t + 6*6;
41948     sp_digit* t5 = t + 8*6;
41949     sp_digit* t6 = t + 10*6;
41950     sp_digit* x = ra->x;
41951     sp_digit* y = ra->y;
41952     sp_digit* z = ra->z;
41953     sp_digit* xs = rs->x;
41954     sp_digit* ys = rs->y;
41955     sp_digit* zs = rs->z;
41956 
41957 
41958     XMEMCPY(x, p->x, sizeof(p->x) / 2);
41959     XMEMCPY(y, p->y, sizeof(p->y) / 2);
41960     XMEMCPY(z, p->z, sizeof(p->z) / 2);
41961     ra->infinity = 0;
41962     rs->infinity = 0;
41963 
41964     /* U1 = X1*Z2^2 */
41965     sp_384_mont_sqr_6(t1, q->z, p384_mod, p384_mp_mod);
41966     sp_384_mont_mul_6(t3, t1, q->z, p384_mod, p384_mp_mod);
41967     sp_384_mont_mul_6(t1, t1, x, p384_mod, p384_mp_mod);
41968     /* U2 = X2*Z1^2 */
41969     sp_384_mont_sqr_6(t2, z, p384_mod, p384_mp_mod);
41970     sp_384_mont_mul_6(t4, t2, z, p384_mod, p384_mp_mod);
41971     sp_384_mont_mul_6(t2, t2, q->x, p384_mod, p384_mp_mod);
41972     /* S1 = Y1*Z2^3 */
41973     sp_384_mont_mul_6(t3, t3, y, p384_mod, p384_mp_mod);
41974     /* S2 = Y2*Z1^3 */
41975     sp_384_mont_mul_6(t4, t4, q->y, p384_mod, p384_mp_mod);
41976     /* H = U2 - U1 */
41977     sp_384_mont_sub_6(t2, t2, t1, p384_mod);
41978     /* RS = S2 + S1 */
41979     sp_384_mont_add_6(t6, t4, t3, p384_mod);
41980     /* R = S2 - S1 */
41981     sp_384_mont_sub_6(t4, t4, t3, p384_mod);
41982     /* Z3 = H*Z1*Z2 */
41983     /* ZS = H*Z1*Z2 */
41984     sp_384_mont_mul_6(z, z, q->z, p384_mod, p384_mp_mod);
41985     sp_384_mont_mul_6(z, z, t2, p384_mod, p384_mp_mod);
41986     XMEMCPY(zs, z, sizeof(p->z)/2);
41987     /* X3 = R^2 - H^3 - 2*U1*H^2 */
41988     /* XS = RS^2 - H^3 - 2*U1*H^2 */
41989     sp_384_mont_sqr_6(x, t4, p384_mod, p384_mp_mod);
41990     sp_384_mont_sqr_6(xs, t6, p384_mod, p384_mp_mod);
41991     sp_384_mont_sqr_6(t5, t2, p384_mod, p384_mp_mod);
41992     sp_384_mont_mul_6(y, t1, t5, p384_mod, p384_mp_mod);
41993     sp_384_mont_mul_6(t5, t5, t2, p384_mod, p384_mp_mod);
41994     sp_384_mont_sub_6(x, x, t5, p384_mod);
41995     sp_384_mont_sub_6(xs, xs, t5, p384_mod);
41996     sp_384_mont_dbl_6(t1, y, p384_mod);
41997     sp_384_mont_sub_6(x, x, t1, p384_mod);
41998     sp_384_mont_sub_6(xs, xs, t1, p384_mod);
41999     /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
42000     /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */
42001     sp_384_mont_sub_6(ys, y, xs, p384_mod);
42002     sp_384_mont_sub_6(y, y, x, p384_mod);
42003     sp_384_mont_mul_6(y, y, t4, p384_mod, p384_mp_mod);
42004     sp_384_sub_6(t6, p384_mod, t6);
42005     sp_384_mont_mul_6(ys, ys, t6, p384_mod, p384_mp_mod);
42006     sp_384_mont_mul_6(t5, t5, t3, p384_mod, p384_mp_mod);
42007     sp_384_mont_sub_6(y, y, t5, p384_mod);
42008     sp_384_mont_sub_6(ys, ys, t5, p384_mod);
42009 }
42010 
42011 /* Structure used to describe recoding of scalar multiplication. */
42012 typedef struct ecc_recode_384 {
42013     /* Index into pre-computation table. */
42014     uint8_t i;
42015     /* Use the negative of the point. */
42016     uint8_t neg;
42017 } ecc_recode_384;
42018 
42019 /* The index into pre-computation table to use. */
42020 static const uint8_t recode_index_6_6[66] = {
42021      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
42022     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
42023     32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
42024     16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
42025      0,  1,
42026 };
42027 
42028 /* Whether to negate y-ordinate. */
42029 static const uint8_t recode_neg_6_6[66] = {
42030      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
42031      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
42032      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
42033      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
42034      0,  0,
42035 };
42036 
42037 /* Recode the scalar for multiplication using pre-computed values and
42038  * subtraction.
42039  *
42040  * k  Scalar to multiply by.
42041  * v  Vector of operations to perform.
42042  */
sp_384_ecc_recode_6_6(const sp_digit * k,ecc_recode_384 * v)42043 static void sp_384_ecc_recode_6_6(const sp_digit* k, ecc_recode_384* v)
42044 {
42045     int i;
42046     int j;
42047     uint8_t y;
42048     int carry = 0;
42049     int o;
42050     sp_digit n;
42051 
42052     j = 0;
42053     n = k[j];
42054     o = 0;
42055     for (i=0; i<65; i++) {
42056         y = (int8_t)n;
42057         if (o + 6 < 64) {
42058             y &= 0x3f;
42059             n >>= 6;
42060             o += 6;
42061         }
42062         else if (o + 6 == 64) {
42063             n >>= 6;
42064             if (++j < 6)
42065                 n = k[j];
42066             o = 0;
42067         }
42068         else if (++j < 6) {
42069             n = k[j];
42070             y |= (uint8_t)((n << (64 - o)) & 0x3f);
42071             o -= 58;
42072             n >>= o;
42073         }
42074 
42075         y += (uint8_t)carry;
42076         v[i].i = recode_index_6_6[y];
42077         v[i].neg = recode_neg_6_6[y];
42078         carry = (y >> 6) + v[i].neg;
42079     }
42080 }
42081 
42082 #ifndef WC_NO_CACHE_RESISTANT
42083 /* Touch each possible point that could be being copied.
42084  *
42085  * r      Point to copy into.
42086  * table  Table - start of the entires to access
42087  * idx    Index of entry to retrieve.
42088  */
sp_384_get_point_33_6(sp_point_384 * r,const sp_point_384 * table,int idx)42089 static void sp_384_get_point_33_6(sp_point_384* r, const sp_point_384* table,
42090     int idx)
42091 {
42092     int i;
42093     sp_digit mask;
42094 
42095     r->x[0] = 0;
42096     r->x[1] = 0;
42097     r->x[2] = 0;
42098     r->x[3] = 0;
42099     r->x[4] = 0;
42100     r->x[5] = 0;
42101     r->y[0] = 0;
42102     r->y[1] = 0;
42103     r->y[2] = 0;
42104     r->y[3] = 0;
42105     r->y[4] = 0;
42106     r->y[5] = 0;
42107     r->z[0] = 0;
42108     r->z[1] = 0;
42109     r->z[2] = 0;
42110     r->z[3] = 0;
42111     r->z[4] = 0;
42112     r->z[5] = 0;
42113     for (i = 1; i < 33; i++) {
42114         mask = 0 - (i == idx);
42115         r->x[0] |= mask & table[i].x[0];
42116         r->x[1] |= mask & table[i].x[1];
42117         r->x[2] |= mask & table[i].x[2];
42118         r->x[3] |= mask & table[i].x[3];
42119         r->x[4] |= mask & table[i].x[4];
42120         r->x[5] |= mask & table[i].x[5];
42121         r->y[0] |= mask & table[i].y[0];
42122         r->y[1] |= mask & table[i].y[1];
42123         r->y[2] |= mask & table[i].y[2];
42124         r->y[3] |= mask & table[i].y[3];
42125         r->y[4] |= mask & table[i].y[4];
42126         r->y[5] |= mask & table[i].y[5];
42127         r->z[0] |= mask & table[i].z[0];
42128         r->z[1] |= mask & table[i].z[1];
42129         r->z[2] |= mask & table[i].z[2];
42130         r->z[3] |= mask & table[i].z[3];
42131         r->z[4] |= mask & table[i].z[4];
42132         r->z[5] |= mask & table[i].z[5];
42133     }
42134 }
42135 #endif /* !WC_NO_CACHE_RESISTANT */
42136 /* Multiply the point by the scalar and return the result.
42137  * If map is true then convert result to affine coordinates.
42138  *
42139  * Window technique of 6 bits. (Add-Sub variation.)
42140  * Calculate 0..32 times the point. Use function that adds and
42141  * subtracts the same two points.
42142  * Recode to add or subtract one of the computed points.
42143  * Double to push up.
42144  * NOT a sliding window.
42145  *
42146  * r     Resulting point.
42147  * g     Point to multiply.
42148  * k     Scalar to multiply by.
42149  * map   Indicates whether to convert result to affine.
42150  * ct    Constant time required.
42151  * heap  Heap to use for allocation.
42152  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
42153  */
sp_384_ecc_mulmod_win_add_sub_6(sp_point_384 * r,const sp_point_384 * g,const sp_digit * k,int map,int ct,void * heap)42154 static int sp_384_ecc_mulmod_win_add_sub_6(sp_point_384* r, const sp_point_384* g,
42155         const sp_digit* k, int map, int ct, void* heap)
42156 {
42157 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42158     sp_point_384* t = NULL;
42159     sp_digit* tmp = NULL;
42160 #else
42161     sp_point_384 t[33+2];
42162     sp_digit tmp[2 * 6 * 6];
42163 #endif
42164     sp_point_384* rt = NULL;
42165     sp_point_384* p = NULL;
42166     sp_digit* negy;
42167     int i;
42168     ecc_recode_384 v[65];
42169     int err = MP_OKAY;
42170 
42171     /* Constant time used for cache attack resistance implementation. */
42172     (void)ct;
42173     (void)heap;
42174 
42175 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42176     t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) *
42177         (33+2), heap, DYNAMIC_TYPE_ECC);
42178     if (t == NULL)
42179         err = MEMORY_E;
42180     if (err == MP_OKAY) {
42181         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 6 * 6,
42182                                  heap, DYNAMIC_TYPE_ECC);
42183         if (tmp == NULL)
42184             err = MEMORY_E;
42185     }
42186 #endif
42187 
42188     if (err == MP_OKAY) {
42189         rt = t + 33;
42190         p  = t + 33+1;
42191 
42192         /* t[0] = {0, 0, 1} * norm */
42193         XMEMSET(&t[0], 0, sizeof(t[0]));
42194         t[0].infinity = 1;
42195         /* t[1] = {g->x, g->y, g->z} * norm */
42196         err = sp_384_mod_mul_norm_6(t[1].x, g->x, p384_mod);
42197     }
42198     if (err == MP_OKAY) {
42199         err = sp_384_mod_mul_norm_6(t[1].y, g->y, p384_mod);
42200     }
42201     if (err == MP_OKAY) {
42202         err = sp_384_mod_mul_norm_6(t[1].z, g->z, p384_mod);
42203     }
42204 
42205     if (err == MP_OKAY) {
42206         t[1].infinity = 0;
42207         /* t[2] ... t[32]  */
42208         sp_384_proj_point_dbl_n_store_6(t, &t[ 1], 5, 1, tmp);
42209         sp_384_proj_point_add_6(&t[ 3], &t[ 2], &t[ 1], tmp);
42210         sp_384_proj_point_dbl_6(&t[ 6], &t[ 3], tmp);
42211         sp_384_proj_point_add_sub_6(&t[ 7], &t[ 5], &t[ 6], &t[ 1], tmp);
42212         sp_384_proj_point_dbl_6(&t[10], &t[ 5], tmp);
42213         sp_384_proj_point_add_sub_6(&t[11], &t[ 9], &t[10], &t[ 1], tmp);
42214         sp_384_proj_point_dbl_6(&t[12], &t[ 6], tmp);
42215         sp_384_proj_point_dbl_6(&t[14], &t[ 7], tmp);
42216         sp_384_proj_point_add_sub_6(&t[15], &t[13], &t[14], &t[ 1], tmp);
42217         sp_384_proj_point_dbl_6(&t[18], &t[ 9], tmp);
42218         sp_384_proj_point_add_sub_6(&t[19], &t[17], &t[18], &t[ 1], tmp);
42219         sp_384_proj_point_dbl_6(&t[20], &t[10], tmp);
42220         sp_384_proj_point_dbl_6(&t[22], &t[11], tmp);
42221         sp_384_proj_point_add_sub_6(&t[23], &t[21], &t[22], &t[ 1], tmp);
42222         sp_384_proj_point_dbl_6(&t[24], &t[12], tmp);
42223         sp_384_proj_point_dbl_6(&t[26], &t[13], tmp);
42224         sp_384_proj_point_add_sub_6(&t[27], &t[25], &t[26], &t[ 1], tmp);
42225         sp_384_proj_point_dbl_6(&t[28], &t[14], tmp);
42226         sp_384_proj_point_dbl_6(&t[30], &t[15], tmp);
42227         sp_384_proj_point_add_sub_6(&t[31], &t[29], &t[30], &t[ 1], tmp);
42228 
42229         negy = t[0].y;
42230 
42231         sp_384_ecc_recode_6_6(k, v);
42232 
42233         i = 64;
42234     #ifndef WC_NO_CACHE_RESISTANT
42235         if (ct) {
42236             sp_384_get_point_33_6(rt, t, v[i].i);
42237             rt->infinity = !v[i].i;
42238         }
42239         else
42240     #endif
42241         {
42242             XMEMCPY(rt, &t[v[i].i], sizeof(sp_point_384));
42243         }
42244         for (--i; i>=0; i--) {
42245             sp_384_proj_point_dbl_n_6(rt, 6, tmp);
42246 
42247         #ifndef WC_NO_CACHE_RESISTANT
42248             if (ct) {
42249                 sp_384_get_point_33_6(p, t, v[i].i);
42250                 p->infinity = !v[i].i;
42251             }
42252             else
42253         #endif
42254             {
42255                 XMEMCPY(p, &t[v[i].i], sizeof(sp_point_384));
42256             }
42257             sp_384_sub_6(negy, p384_mod, p->y);
42258             sp_384_norm_6(negy);
42259             sp_384_cond_copy_6(p->y, negy, (sp_digit)0 - v[i].neg);
42260             sp_384_proj_point_add_6(rt, rt, p, tmp);
42261         }
42262 
42263         if (map != 0) {
42264             sp_384_map_6(r, rt, tmp);
42265         }
42266         else {
42267             XMEMCPY(r, rt, sizeof(sp_point_384));
42268         }
42269     }
42270 
42271 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42272     if (t != NULL)
42273         XFREE(t, heap, DYNAMIC_TYPE_ECC);
42274     if (tmp != NULL)
42275         XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
42276 #endif
42277 
42278     return err;
42279 }
42280 
42281 #ifndef WC_NO_CACHE_RESISTANT
42282 /* A table entry for pre-computed points. */
42283 typedef struct sp_table_entry_384 {
42284     sp_digit x[6];
42285     sp_digit y[6];
42286 } sp_table_entry_384;
42287 
42288 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
42289 #endif /* FP_ECC | WOLFSSL_SP_SMALL */
42290 /* Add two Montgomery form projective points. The second point has a q value of
42291  * one.
42292  * Only the first point can be the same pointer as the result point.
42293  *
42294  * r  Result of addition.
42295  * p  First point to add.
42296  * q  Second point to add.
42297  * t  Temporary ordinate data.
42298  */
sp_384_proj_point_add_qz1_6(sp_point_384 * r,const sp_point_384 * p,const sp_point_384 * q,sp_digit * t)42299 static void sp_384_proj_point_add_qz1_6(sp_point_384* r, const sp_point_384* p,
42300         const sp_point_384* q, sp_digit* t)
42301 {
42302     const sp_point_384* ap[2];
42303     sp_point_384* rp[2];
42304     sp_digit* t1 = t;
42305     sp_digit* t2 = t + 2*6;
42306     sp_digit* t3 = t + 4*6;
42307     sp_digit* t4 = t + 6*6;
42308     sp_digit* t5 = t + 8*6;
42309     sp_digit* x;
42310     sp_digit* y;
42311     sp_digit* z;
42312     int i;
42313 
42314     /* Check double */
42315     (void)sp_384_sub_6(t1, p384_mod, q->y);
42316     sp_384_norm_6(t1);
42317     if ((sp_384_cmp_equal_6(p->x, q->x) & sp_384_cmp_equal_6(p->z, q->z) &
42318         (sp_384_cmp_equal_6(p->y, q->y) | sp_384_cmp_equal_6(p->y, t1))) != 0) {
42319         sp_384_proj_point_dbl_6(r, p, t);
42320     }
42321     else {
42322         rp[0] = r;
42323 
42324         /*lint allow cast to different type of pointer*/
42325         rp[1] = (sp_point_384*)t; /*lint !e9087 !e740*/
42326         XMEMSET(rp[1], 0, sizeof(sp_point_384));
42327         x = rp[p->infinity | q->infinity]->x;
42328         y = rp[p->infinity | q->infinity]->y;
42329         z = rp[p->infinity | q->infinity]->z;
42330 
42331         ap[0] = p;
42332         ap[1] = q;
42333         for (i=0; i<6; i++) {
42334             r->x[i] = ap[p->infinity]->x[i];
42335         }
42336         for (i=0; i<6; i++) {
42337             r->y[i] = ap[p->infinity]->y[i];
42338         }
42339         for (i=0; i<6; i++) {
42340             r->z[i] = ap[p->infinity]->z[i];
42341         }
42342         r->infinity = ap[p->infinity]->infinity;
42343 
42344         /* U2 = X2*Z1^2 */
42345         sp_384_mont_sqr_6(t2, z, p384_mod, p384_mp_mod);
42346         sp_384_mont_mul_6(t4, t2, z, p384_mod, p384_mp_mod);
42347         sp_384_mont_mul_6(t2, t2, q->x, p384_mod, p384_mp_mod);
42348         /* S2 = Y2*Z1^3 */
42349         sp_384_mont_mul_6(t4, t4, q->y, p384_mod, p384_mp_mod);
42350         /* H = U2 - X1 */
42351         sp_384_mont_sub_6(t2, t2, x, p384_mod);
42352         /* R = S2 - Y1 */
42353         sp_384_mont_sub_6(t4, t4, y, p384_mod);
42354         /* Z3 = H*Z1 */
42355         sp_384_mont_mul_6(z, z, t2, p384_mod, p384_mp_mod);
42356         /* X3 = R^2 - H^3 - 2*X1*H^2 */
42357         sp_384_mont_sqr_6(t1, t4, p384_mod, p384_mp_mod);
42358         sp_384_mont_sqr_6(t5, t2, p384_mod, p384_mp_mod);
42359         sp_384_mont_mul_6(t3, x, t5, p384_mod, p384_mp_mod);
42360         sp_384_mont_mul_6(t5, t5, t2, p384_mod, p384_mp_mod);
42361         sp_384_mont_sub_6(x, t1, t5, p384_mod);
42362         sp_384_mont_dbl_6(t1, t3, p384_mod);
42363         sp_384_mont_sub_6(x, x, t1, p384_mod);
42364         /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
42365         sp_384_mont_sub_6(t3, t3, x, p384_mod);
42366         sp_384_mont_mul_6(t3, t3, t4, p384_mod, p384_mp_mod);
42367         sp_384_mont_mul_6(t5, t5, y, p384_mod, p384_mp_mod);
42368         sp_384_mont_sub_6(y, t3, t5, p384_mod);
42369     }
42370 }
42371 
42372 #ifdef FP_ECC
42373 /* Convert the projective point to affine.
42374  * Ordinates are in Montgomery form.
42375  *
42376  * a  Point to convert.
42377  * t  Temporary data.
42378  */
sp_384_proj_to_affine_6(sp_point_384 * a,sp_digit * t)42379 static void sp_384_proj_to_affine_6(sp_point_384* a, sp_digit* t)
42380 {
42381     sp_digit* t1 = t;
42382     sp_digit* t2 = t + 2 * 6;
42383     sp_digit* tmp = t + 4 * 6;
42384 
42385     sp_384_mont_inv_6(t1, a->z, tmp);
42386 
42387     sp_384_mont_sqr_6(t2, t1, p384_mod, p384_mp_mod);
42388     sp_384_mont_mul_6(t1, t2, t1, p384_mod, p384_mp_mod);
42389 
42390     sp_384_mont_mul_6(a->x, a->x, t2, p384_mod, p384_mp_mod);
42391     sp_384_mont_mul_6(a->y, a->y, t1, p384_mod, p384_mp_mod);
42392     XMEMCPY(a->z, p384_norm_mod, sizeof(p384_norm_mod));
42393 }
42394 
42395 /* Generate the pre-computed table of points for the base point.
42396  *
42397  * width = 6
42398  * 64 entries
42399  * 64 bits between
42400  *
42401  * a      The base point.
42402  * table  Place to store generated point data.
42403  * tmp    Temporary data.
42404  * heap  Heap to use for allocation.
42405  */
sp_384_gen_stripe_table_6(const sp_point_384 * a,sp_table_entry_384 * table,sp_digit * tmp,void * heap)42406 static int sp_384_gen_stripe_table_6(const sp_point_384* a,
42407         sp_table_entry_384* table, sp_digit* tmp, void* heap)
42408 {
42409 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42410     sp_point_384* t = NULL;
42411 #else
42412     sp_point_384 t[3];
42413 #endif
42414     sp_point_384* s1 = NULL;
42415     sp_point_384* s2 = NULL;
42416     int i;
42417     int j;
42418     int err = MP_OKAY;
42419 
42420     (void)heap;
42421 
42422 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42423     t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
42424                                      DYNAMIC_TYPE_ECC);
42425     if (t == NULL)
42426         err = MEMORY_E;
42427 #endif
42428 
42429     if (err == MP_OKAY) {
42430         s1 = t + 1;
42431         s2 = t + 2;
42432 
42433         err = sp_384_mod_mul_norm_6(t->x, a->x, p384_mod);
42434     }
42435     if (err == MP_OKAY) {
42436         err = sp_384_mod_mul_norm_6(t->y, a->y, p384_mod);
42437     }
42438     if (err == MP_OKAY) {
42439         err = sp_384_mod_mul_norm_6(t->z, a->z, p384_mod);
42440     }
42441     if (err == MP_OKAY) {
42442         t->infinity = 0;
42443         sp_384_proj_to_affine_6(t, tmp);
42444 
42445         XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
42446         s1->infinity = 0;
42447         XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
42448         s2->infinity = 0;
42449 
42450         /* table[0] = {0, 0, infinity} */
42451         XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
42452         /* table[1] = Affine version of 'a' in Montgomery form */
42453         XMEMCPY(table[1].x, t->x, sizeof(table->x));
42454         XMEMCPY(table[1].y, t->y, sizeof(table->y));
42455 
42456         for (i=1; i<6; i++) {
42457             sp_384_proj_point_dbl_n_6(t, 64, tmp);
42458             sp_384_proj_to_affine_6(t, tmp);
42459             XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
42460             XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
42461         }
42462 
42463         for (i=1; i<6; i++) {
42464             XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
42465             XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
42466             for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
42467                 XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
42468                 XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
42469                 sp_384_proj_point_add_qz1_6(t, s1, s2, tmp);
42470                 sp_384_proj_to_affine_6(t, tmp);
42471                 XMEMCPY(table[j].x, t->x, sizeof(table->x));
42472                 XMEMCPY(table[j].y, t->y, sizeof(table->y));
42473             }
42474         }
42475     }
42476 
42477 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42478     if (t != NULL)
42479         XFREE(t, heap, DYNAMIC_TYPE_ECC);
42480 #endif
42481 
42482     return err;
42483 }
42484 
42485 #endif /* FP_ECC */
42486 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
42487 #ifndef WC_NO_CACHE_RESISTANT
42488 /* Touch each possible entry that could be being copied.
42489  *
42490  * r      Point to copy into.
42491  * table  Table - start of the entires to access
42492  * idx    Index of entry to retrieve.
42493  */
sp_384_get_entry_64_6(sp_point_384 * r,const sp_table_entry_384 * table,int idx)42494 static void sp_384_get_entry_64_6(sp_point_384* r,
42495     const sp_table_entry_384* table, int idx)
42496 {
42497     int i;
42498     sp_digit mask;
42499 
42500     r->x[0] = 0;
42501     r->x[1] = 0;
42502     r->x[2] = 0;
42503     r->x[3] = 0;
42504     r->x[4] = 0;
42505     r->x[5] = 0;
42506     r->y[0] = 0;
42507     r->y[1] = 0;
42508     r->y[2] = 0;
42509     r->y[3] = 0;
42510     r->y[4] = 0;
42511     r->y[5] = 0;
42512     for (i = 1; i < 64; i++) {
42513         mask = 0 - (i == idx);
42514         r->x[0] |= mask & table[i].x[0];
42515         r->x[1] |= mask & table[i].x[1];
42516         r->x[2] |= mask & table[i].x[2];
42517         r->x[3] |= mask & table[i].x[3];
42518         r->x[4] |= mask & table[i].x[4];
42519         r->x[5] |= mask & table[i].x[5];
42520         r->y[0] |= mask & table[i].y[0];
42521         r->y[1] |= mask & table[i].y[1];
42522         r->y[2] |= mask & table[i].y[2];
42523         r->y[3] |= mask & table[i].y[3];
42524         r->y[4] |= mask & table[i].y[4];
42525         r->y[5] |= mask & table[i].y[5];
42526     }
42527 }
42528 #endif /* !WC_NO_CACHE_RESISTANT */
42529 /* Multiply the point by the scalar and return the result.
42530  * If map is true then convert result to affine coordinates.
42531  *
42532  * Stripe implementation.
42533  * Pre-generated: 2^0, 2^64, ...
42534  * Pre-generated: products of all combinations of above.
42535  * 6 doubles and adds (with qz=1)
42536  *
42537  * r      Resulting point.
42538  * k      Scalar to multiply by.
42539  * table  Pre-computed table.
42540  * map    Indicates whether to convert result to affine.
42541  * ct     Constant time required.
42542  * heap   Heap to use for allocation.
42543  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
42544  */
sp_384_ecc_mulmod_stripe_6(sp_point_384 * r,const sp_point_384 * g,const sp_table_entry_384 * table,const sp_digit * k,int map,int ct,void * heap)42545 static int sp_384_ecc_mulmod_stripe_6(sp_point_384* r, const sp_point_384* g,
42546         const sp_table_entry_384* table, const sp_digit* k, int map,
42547         int ct, void* heap)
42548 {
42549 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42550     sp_point_384* rt = NULL;
42551     sp_digit* t = NULL;
42552 #else
42553     sp_point_384 rt[2];
42554     sp_digit t[2 * 6 * 6];
42555 #endif
42556     sp_point_384* p = NULL;
42557     int i;
42558     int j;
42559     int y;
42560     int x;
42561     int err = MP_OKAY;
42562 
42563     (void)g;
42564     /* Constant time used for cache attack resistance implementation. */
42565     (void)ct;
42566     (void)heap;
42567 
42568 
42569 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42570     rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
42571                                       DYNAMIC_TYPE_ECC);
42572     if (rt == NULL)
42573         err = MEMORY_E;
42574     if (err == MP_OKAY) {
42575         t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 6 * 6, heap,
42576                                DYNAMIC_TYPE_ECC);
42577         if (t == NULL)
42578             err = MEMORY_E;
42579     }
42580 #endif
42581 
42582     if (err == MP_OKAY) {
42583         p = rt + 1;
42584 
42585         XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
42586         XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
42587 
42588         y = 0;
42589         x = 63;
42590         for (j=0; j<6; j++) {
42591             y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
42592             x += 64;
42593         }
42594     #ifndef WC_NO_CACHE_RESISTANT
42595         if (ct) {
42596             sp_384_get_entry_64_6(rt, table, y);
42597         } else
42598     #endif
42599         {
42600             XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
42601             XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
42602         }
42603         rt->infinity = !y;
42604         for (i=62; i>=0; i--) {
42605             y = 0;
42606             x = i;
42607             for (j=0; j<6; j++) {
42608                 y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
42609                 x += 64;
42610             }
42611 
42612             sp_384_proj_point_dbl_6(rt, rt, t);
42613         #ifndef WC_NO_CACHE_RESISTANT
42614             if (ct) {
42615                 sp_384_get_entry_64_6(p, table, y);
42616             }
42617             else
42618         #endif
42619             {
42620                 XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
42621                 XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
42622             }
42623             p->infinity = !y;
42624             sp_384_proj_point_add_qz1_6(rt, rt, p, t);
42625         }
42626 
42627         if (map != 0) {
42628             sp_384_map_6(r, rt, t);
42629         }
42630         else {
42631             XMEMCPY(r, rt, sizeof(sp_point_384));
42632         }
42633     }
42634 
42635 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42636     if (t != NULL)
42637         XFREE(t, heap, DYNAMIC_TYPE_ECC);
42638     if (rt != NULL)
42639         XFREE(rt, heap, DYNAMIC_TYPE_ECC);
42640 #endif
42641 
42642     return err;
42643 }
42644 
42645 #endif /* FP_ECC | WOLFSSL_SP_SMALL */
42646 #ifdef FP_ECC
42647 #ifndef FP_ENTRIES
42648     #define FP_ENTRIES 16
42649 #endif
42650 
42651 /* Cache entry - holds precomputation tables for a point. */
42652 typedef struct sp_cache_384_t {
42653     /* X ordinate of point that table was generated from. */
42654     sp_digit x[6];
42655     /* Y ordinate of point that table was generated from. */
42656     sp_digit y[6];
42657     /* Precomputation table for point. */
42658     sp_table_entry_384 table[64];
42659     /* Count of entries in table. */
42660     uint32_t cnt;
42661     /* Point and table set in entry. */
42662     int set;
42663 } sp_cache_384_t;
42664 
42665 /* Cache of tables. */
42666 static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
42667 /* Index of last entry in cache. */
42668 static THREAD_LS_T int sp_cache_384_last = -1;
42669 /* Cache has been initialized. */
42670 static THREAD_LS_T int sp_cache_384_inited = 0;
42671 
42672 #ifndef HAVE_THREAD_LS
42673     static volatile int initCacheMutex_384 = 0;
42674     static wolfSSL_Mutex sp_cache_384_lock;
42675 #endif
42676 
42677 /* Get the cache entry for the point.
42678  *
42679  * g      [in]   Point scalar multipling.
42680  * cache  [out]  Cache table to use.
42681  */
sp_ecc_get_cache_384(const sp_point_384 * g,sp_cache_384_t ** cache)42682 static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
42683 {
42684     int i;
42685     int j;
42686     uint32_t least;
42687 
42688     if (sp_cache_384_inited == 0) {
42689         for (i=0; i<FP_ENTRIES; i++) {
42690             sp_cache_384[i].set = 0;
42691         }
42692         sp_cache_384_inited = 1;
42693     }
42694 
42695     /* Compare point with those in cache. */
42696     for (i=0; i<FP_ENTRIES; i++) {
42697         if (!sp_cache_384[i].set)
42698             continue;
42699 
42700         if (sp_384_cmp_equal_6(g->x, sp_cache_384[i].x) &
42701                            sp_384_cmp_equal_6(g->y, sp_cache_384[i].y)) {
42702             sp_cache_384[i].cnt++;
42703             break;
42704         }
42705     }
42706 
42707     /* No match. */
42708     if (i == FP_ENTRIES) {
42709         /* Find empty entry. */
42710         i = (sp_cache_384_last + 1) % FP_ENTRIES;
42711         for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
42712             if (!sp_cache_384[i].set) {
42713                 break;
42714             }
42715         }
42716 
42717         /* Evict least used. */
42718         if (i == sp_cache_384_last) {
42719             least = sp_cache_384[0].cnt;
42720             for (j=1; j<FP_ENTRIES; j++) {
42721                 if (sp_cache_384[j].cnt < least) {
42722                     i = j;
42723                     least = sp_cache_384[i].cnt;
42724                 }
42725             }
42726         }
42727 
42728         XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
42729         XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
42730         sp_cache_384[i].set = 1;
42731         sp_cache_384[i].cnt = 1;
42732     }
42733 
42734     *cache = &sp_cache_384[i];
42735     sp_cache_384_last = i;
42736 }
42737 #endif /* FP_ECC */
42738 
42739 /* Multiply the base point of P384 by the scalar and return the result.
42740  * If map is true then convert result to affine coordinates.
42741  *
42742  * r     Resulting point.
42743  * g     Point to multiply.
42744  * k     Scalar to multiply by.
42745  * map   Indicates whether to convert result to affine.
42746  * ct    Constant time required.
42747  * heap  Heap to use for allocation.
42748  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
42749  */
sp_384_ecc_mulmod_6(sp_point_384 * r,const sp_point_384 * g,const sp_digit * k,int map,int ct,void * heap)42750 static int sp_384_ecc_mulmod_6(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
42751         int map, int ct, void* heap)
42752 {
42753 #ifndef FP_ECC
42754     return sp_384_ecc_mulmod_win_add_sub_6(r, g, k, map, ct, heap);
42755 #else
42756     sp_digit tmp[2 * 6 * 7];
42757     sp_cache_384_t* cache;
42758     int err = MP_OKAY;
42759 
42760 #ifndef HAVE_THREAD_LS
42761     if (initCacheMutex_384 == 0) {
42762          wc_InitMutex(&sp_cache_384_lock);
42763          initCacheMutex_384 = 1;
42764     }
42765     if (wc_LockMutex(&sp_cache_384_lock) != 0)
42766        err = BAD_MUTEX_E;
42767 #endif /* HAVE_THREAD_LS */
42768 
42769     if (err == MP_OKAY) {
42770         sp_ecc_get_cache_384(g, &cache);
42771         if (cache->cnt == 2)
42772             sp_384_gen_stripe_table_6(g, cache->table, tmp, heap);
42773 
42774 #ifndef HAVE_THREAD_LS
42775         wc_UnLockMutex(&sp_cache_384_lock);
42776 #endif /* HAVE_THREAD_LS */
42777 
42778         if (cache->cnt < 2) {
42779             err = sp_384_ecc_mulmod_win_add_sub_6(r, g, k, map, ct, heap);
42780         }
42781         else {
42782             err = sp_384_ecc_mulmod_stripe_6(r, g, cache->table, k,
42783                     map, ct, heap);
42784         }
42785     }
42786 
42787     return err;
42788 #endif
42789 }
42790 
42791 #else
42792 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
42793 #endif /* FP_ECC | WOLFSSL_SP_SMALL */
42794 #ifdef FP_ECC
42795 /* Generate the pre-computed table of points for the base point.
42796  *
42797  * width = 8
42798  * 256 entries
42799  * 48 bits between
42800  *
42801  * a      The base point.
42802  * table  Place to store generated point data.
42803  * tmp    Temporary data.
42804  * heap  Heap to use for allocation.
42805  */
sp_384_gen_stripe_table_6(const sp_point_384 * a,sp_table_entry_384 * table,sp_digit * tmp,void * heap)42806 static int sp_384_gen_stripe_table_6(const sp_point_384* a,
42807         sp_table_entry_384* table, sp_digit* tmp, void* heap)
42808 {
42809 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42810     sp_point_384* t = NULL;
42811 #else
42812     sp_point_384 t[3];
42813 #endif
42814     sp_point_384* s1 = NULL;
42815     sp_point_384* s2 = NULL;
42816     int i;
42817     int j;
42818     int err = MP_OKAY;
42819 
42820     (void)heap;
42821 
42822 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42823     t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
42824                                      DYNAMIC_TYPE_ECC);
42825     if (t == NULL)
42826         err = MEMORY_E;
42827 #endif
42828 
42829     if (err == MP_OKAY) {
42830         s1 = t + 1;
42831         s2 = t + 2;
42832 
42833         err = sp_384_mod_mul_norm_6(t->x, a->x, p384_mod);
42834     }
42835     if (err == MP_OKAY) {
42836         err = sp_384_mod_mul_norm_6(t->y, a->y, p384_mod);
42837     }
42838     if (err == MP_OKAY) {
42839         err = sp_384_mod_mul_norm_6(t->z, a->z, p384_mod);
42840     }
42841     if (err == MP_OKAY) {
42842         t->infinity = 0;
42843         sp_384_proj_to_affine_6(t, tmp);
42844 
42845         XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
42846         s1->infinity = 0;
42847         XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
42848         s2->infinity = 0;
42849 
42850         /* table[0] = {0, 0, infinity} */
42851         XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
42852         /* table[1] = Affine version of 'a' in Montgomery form */
42853         XMEMCPY(table[1].x, t->x, sizeof(table->x));
42854         XMEMCPY(table[1].y, t->y, sizeof(table->y));
42855 
42856         for (i=1; i<8; i++) {
42857             sp_384_proj_point_dbl_n_6(t, 48, tmp);
42858             sp_384_proj_to_affine_6(t, tmp);
42859             XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
42860             XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
42861         }
42862 
42863         for (i=1; i<8; i++) {
42864             XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
42865             XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
42866             for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
42867                 XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
42868                 XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
42869                 sp_384_proj_point_add_qz1_6(t, s1, s2, tmp);
42870                 sp_384_proj_to_affine_6(t, tmp);
42871                 XMEMCPY(table[j].x, t->x, sizeof(table->x));
42872                 XMEMCPY(table[j].y, t->y, sizeof(table->y));
42873             }
42874         }
42875     }
42876 
42877 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42878     if (t != NULL)
42879         XFREE(t, heap, DYNAMIC_TYPE_ECC);
42880 #endif
42881 
42882     return err;
42883 }
42884 
42885 #endif /* FP_ECC */
42886 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL)
42887 #ifndef WC_NO_CACHE_RESISTANT
42888 /* Touch each possible entry that could be being copied.
42889  *
42890  * r      Point to copy into.
42891  * table  Table - start of the entires to access
42892  * idx    Index of entry to retrieve.
42893  */
sp_384_get_entry_256_6(sp_point_384 * r,const sp_table_entry_384 * table,int idx)42894 static void sp_384_get_entry_256_6(sp_point_384* r,
42895     const sp_table_entry_384* table, int idx)
42896 {
42897     int i;
42898     sp_digit mask;
42899 
42900     r->x[0] = 0;
42901     r->x[1] = 0;
42902     r->x[2] = 0;
42903     r->x[3] = 0;
42904     r->x[4] = 0;
42905     r->x[5] = 0;
42906     r->y[0] = 0;
42907     r->y[1] = 0;
42908     r->y[2] = 0;
42909     r->y[3] = 0;
42910     r->y[4] = 0;
42911     r->y[5] = 0;
42912     for (i = 1; i < 256; i++) {
42913         mask = 0 - (i == idx);
42914         r->x[0] |= mask & table[i].x[0];
42915         r->x[1] |= mask & table[i].x[1];
42916         r->x[2] |= mask & table[i].x[2];
42917         r->x[3] |= mask & table[i].x[3];
42918         r->x[4] |= mask & table[i].x[4];
42919         r->x[5] |= mask & table[i].x[5];
42920         r->y[0] |= mask & table[i].y[0];
42921         r->y[1] |= mask & table[i].y[1];
42922         r->y[2] |= mask & table[i].y[2];
42923         r->y[3] |= mask & table[i].y[3];
42924         r->y[4] |= mask & table[i].y[4];
42925         r->y[5] |= mask & table[i].y[5];
42926     }
42927 }
42928 #endif /* !WC_NO_CACHE_RESISTANT */
42929 /* Multiply the point by the scalar and return the result.
42930  * If map is true then convert result to affine coordinates.
42931  *
42932  * Stripe implementation.
42933  * Pre-generated: 2^0, 2^48, ...
42934  * Pre-generated: products of all combinations of above.
42935  * 8 doubles and adds (with qz=1)
42936  *
42937  * r      Resulting point.
42938  * k      Scalar to multiply by.
42939  * table  Pre-computed table.
42940  * map    Indicates whether to convert result to affine.
42941  * ct     Constant time required.
42942  * heap   Heap to use for allocation.
42943  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
42944  */
sp_384_ecc_mulmod_stripe_6(sp_point_384 * r,const sp_point_384 * g,const sp_table_entry_384 * table,const sp_digit * k,int map,int ct,void * heap)42945 static int sp_384_ecc_mulmod_stripe_6(sp_point_384* r, const sp_point_384* g,
42946         const sp_table_entry_384* table, const sp_digit* k, int map,
42947         int ct, void* heap)
42948 {
42949 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42950     sp_point_384* rt = NULL;
42951     sp_digit* t = NULL;
42952 #else
42953     sp_point_384 rt[2];
42954     sp_digit t[2 * 6 * 6];
42955 #endif
42956     sp_point_384* p = NULL;
42957     int i;
42958     int j;
42959     int y;
42960     int x;
42961     int err = MP_OKAY;
42962 
42963     (void)g;
42964     /* Constant time used for cache attack resistance implementation. */
42965     (void)ct;
42966     (void)heap;
42967 
42968 
42969 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
42970     rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
42971                                       DYNAMIC_TYPE_ECC);
42972     if (rt == NULL)
42973         err = MEMORY_E;
42974     if (err == MP_OKAY) {
42975         t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 6 * 6, heap,
42976                                DYNAMIC_TYPE_ECC);
42977         if (t == NULL)
42978             err = MEMORY_E;
42979     }
42980 #endif
42981 
42982     if (err == MP_OKAY) {
42983         p = rt + 1;
42984 
42985         XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
42986         XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
42987 
42988         y = 0;
42989         x = 47;
42990         for (j=0; j<8; j++) {
42991             y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
42992             x += 48;
42993         }
42994     #ifndef WC_NO_CACHE_RESISTANT
42995         if (ct) {
42996             sp_384_get_entry_256_6(rt, table, y);
42997         } else
42998     #endif
42999         {
43000             XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
43001             XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
43002         }
43003         rt->infinity = !y;
43004         for (i=46; i>=0; i--) {
43005             y = 0;
43006             x = i;
43007             for (j=0; j<8; j++) {
43008                 y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
43009                 x += 48;
43010             }
43011 
43012             sp_384_proj_point_dbl_6(rt, rt, t);
43013         #ifndef WC_NO_CACHE_RESISTANT
43014             if (ct) {
43015                 sp_384_get_entry_256_6(p, table, y);
43016             }
43017             else
43018         #endif
43019             {
43020                 XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
43021                 XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
43022             }
43023             p->infinity = !y;
43024             sp_384_proj_point_add_qz1_6(rt, rt, p, t);
43025         }
43026 
43027         if (map != 0) {
43028             sp_384_map_6(r, rt, t);
43029         }
43030         else {
43031             XMEMCPY(r, rt, sizeof(sp_point_384));
43032         }
43033     }
43034 
43035 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
43036     if (t != NULL)
43037         XFREE(t, heap, DYNAMIC_TYPE_ECC);
43038     if (rt != NULL)
43039         XFREE(rt, heap, DYNAMIC_TYPE_ECC);
43040 #endif
43041 
43042     return err;
43043 }
43044 
43045 #endif /* FP_ECC | WOLFSSL_SP_SMALL */
43046 #ifdef FP_ECC
43047 #ifndef FP_ENTRIES
43048     #define FP_ENTRIES 16
43049 #endif
43050 
43051 /* Cache entry - holds precomputation tables for a point. */
43052 typedef struct sp_cache_384_t {
43053     /* X ordinate of point that table was generated from. */
43054     sp_digit x[6];
43055     /* Y ordinate of point that table was generated from. */
43056     sp_digit y[6];
43057     /* Precomputation table for point. */
43058     sp_table_entry_384 table[256];
43059     /* Count of entries in table. */
43060     uint32_t cnt;
43061     /* Point and table set in entry. */
43062     int set;
43063 } sp_cache_384_t;
43064 
43065 /* Cache of tables. */
43066 static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
43067 /* Index of last entry in cache. */
43068 static THREAD_LS_T int sp_cache_384_last = -1;
43069 /* Cache has been initialized. */
43070 static THREAD_LS_T int sp_cache_384_inited = 0;
43071 
43072 #ifndef HAVE_THREAD_LS
43073     static volatile int initCacheMutex_384 = 0;
43074     static wolfSSL_Mutex sp_cache_384_lock;
43075 #endif
43076 
43077 /* Get the cache entry for the point.
43078  *
43079  * g      [in]   Point scalar multipling.
43080  * cache  [out]  Cache table to use.
43081  */
sp_ecc_get_cache_384(const sp_point_384 * g,sp_cache_384_t ** cache)43082 static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
43083 {
43084     int i;
43085     int j;
43086     uint32_t least;
43087 
43088     if (sp_cache_384_inited == 0) {
43089         for (i=0; i<FP_ENTRIES; i++) {
43090             sp_cache_384[i].set = 0;
43091         }
43092         sp_cache_384_inited = 1;
43093     }
43094 
43095     /* Compare point with those in cache. */
43096     for (i=0; i<FP_ENTRIES; i++) {
43097         if (!sp_cache_384[i].set)
43098             continue;
43099 
43100         if (sp_384_cmp_equal_6(g->x, sp_cache_384[i].x) &
43101                            sp_384_cmp_equal_6(g->y, sp_cache_384[i].y)) {
43102             sp_cache_384[i].cnt++;
43103             break;
43104         }
43105     }
43106 
43107     /* No match. */
43108     if (i == FP_ENTRIES) {
43109         /* Find empty entry. */
43110         i = (sp_cache_384_last + 1) % FP_ENTRIES;
43111         for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
43112             if (!sp_cache_384[i].set) {
43113                 break;
43114             }
43115         }
43116 
43117         /* Evict least used. */
43118         if (i == sp_cache_384_last) {
43119             least = sp_cache_384[0].cnt;
43120             for (j=1; j<FP_ENTRIES; j++) {
43121                 if (sp_cache_384[j].cnt < least) {
43122                     i = j;
43123                     least = sp_cache_384[i].cnt;
43124                 }
43125             }
43126         }
43127 
43128         XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
43129         XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
43130         sp_cache_384[i].set = 1;
43131         sp_cache_384[i].cnt = 1;
43132     }
43133 
43134     *cache = &sp_cache_384[i];
43135     sp_cache_384_last = i;
43136 }
43137 #endif /* FP_ECC */
43138 
43139 /* Multiply the base point of P384 by the scalar and return the result.
43140  * If map is true then convert result to affine coordinates.
43141  *
43142  * r     Resulting point.
43143  * g     Point to multiply.
43144  * k     Scalar to multiply by.
43145  * map   Indicates whether to convert result to affine.
43146  * ct    Constant time required.
43147  * heap  Heap to use for allocation.
43148  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
43149  */
sp_384_ecc_mulmod_6(sp_point_384 * r,const sp_point_384 * g,const sp_digit * k,int map,int ct,void * heap)43150 static int sp_384_ecc_mulmod_6(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
43151         int map, int ct, void* heap)
43152 {
43153 #ifndef FP_ECC
43154     return sp_384_ecc_mulmod_win_add_sub_6(r, g, k, map, ct, heap);
43155 #else
43156     sp_digit tmp[2 * 6 * 7];
43157     sp_cache_384_t* cache;
43158     int err = MP_OKAY;
43159 
43160 #ifndef HAVE_THREAD_LS
43161     if (initCacheMutex_384 == 0) {
43162          wc_InitMutex(&sp_cache_384_lock);
43163          initCacheMutex_384 = 1;
43164     }
43165     if (wc_LockMutex(&sp_cache_384_lock) != 0)
43166        err = BAD_MUTEX_E;
43167 #endif /* HAVE_THREAD_LS */
43168 
43169     if (err == MP_OKAY) {
43170         sp_ecc_get_cache_384(g, &cache);
43171         if (cache->cnt == 2)
43172             sp_384_gen_stripe_table_6(g, cache->table, tmp, heap);
43173 
43174 #ifndef HAVE_THREAD_LS
43175         wc_UnLockMutex(&sp_cache_384_lock);
43176 #endif /* HAVE_THREAD_LS */
43177 
43178         if (cache->cnt < 2) {
43179             err = sp_384_ecc_mulmod_win_add_sub_6(r, g, k, map, ct, heap);
43180         }
43181         else {
43182             err = sp_384_ecc_mulmod_stripe_6(r, g, cache->table, k,
43183                     map, ct, heap);
43184         }
43185     }
43186 
43187     return err;
43188 #endif
43189 }
43190 
43191 #endif /* !WC_NO_CACHE_RESISTANT */
43192 /* Multiply the point by the scalar and return the result.
43193  * If map is true then convert result to affine coordinates.
43194  *
43195  * km    Scalar to multiply by.
43196  * p     Point to multiply.
43197  * r     Resulting point.
43198  * map   Indicates whether to convert result to affine.
43199  * heap  Heap to use for allocation.
43200  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
43201  */
sp_ecc_mulmod_384(const mp_int * km,const ecc_point * gm,ecc_point * r,int map,void * heap)43202 int sp_ecc_mulmod_384(const mp_int* km, const ecc_point* gm, ecc_point* r,
43203         int map, void* heap)
43204 {
43205 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
43206     sp_point_384* point = NULL;
43207     sp_digit* k = NULL;
43208 #else
43209     sp_point_384 point[1];
43210     sp_digit k[6];
43211 #endif
43212     int err = MP_OKAY;
43213 
43214 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
43215     point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
43216                                          DYNAMIC_TYPE_ECC);
43217     if (point == NULL)
43218         err = MEMORY_E;
43219     if (err == MP_OKAY) {
43220         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6, heap,
43221                                DYNAMIC_TYPE_ECC);
43222         if (k == NULL)
43223             err = MEMORY_E;
43224     }
43225 #endif
43226 
43227     if (err == MP_OKAY) {
43228         sp_384_from_mp(k, 6, km);
43229         sp_384_point_from_ecc_point_6(point, gm);
43230 
43231             err = sp_384_ecc_mulmod_6(point, point, k, map, 1, heap);
43232     }
43233     if (err == MP_OKAY) {
43234         err = sp_384_point_to_ecc_point_6(point, r);
43235     }
43236 
43237 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
43238     if (k != NULL)
43239         XFREE(k, heap, DYNAMIC_TYPE_ECC);
43240     if (point != NULL)
43241         XFREE(point, heap, DYNAMIC_TYPE_ECC);
43242 #endif
43243 
43244     return err;
43245 }
43246 
43247 /* Multiply the point by the scalar, add point a and return the result.
43248  * If map is true then convert result to affine coordinates.
43249  *
43250  * km      Scalar to multiply by.
43251  * p       Point to multiply.
43252  * am      Point to add to scalar mulitply result.
43253  * inMont  Point to add is in montgomery form.
43254  * r       Resulting point.
43255  * map     Indicates whether to convert result to affine.
43256  * heap    Heap to use for allocation.
43257  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
43258  */
sp_ecc_mulmod_add_384(const mp_int * km,const ecc_point * gm,const ecc_point * am,int inMont,ecc_point * r,int map,void * heap)43259 int sp_ecc_mulmod_add_384(const mp_int* km, const ecc_point* gm,
43260     const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
43261 {
43262 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
43263     sp_point_384* point = NULL;
43264     sp_digit* k = NULL;
43265 #else
43266     sp_point_384 point[2];
43267     sp_digit k[6 + 6 * 2 * 6];
43268 #endif
43269     sp_point_384* addP = NULL;
43270     sp_digit* tmp = NULL;
43271     int err = MP_OKAY;
43272 
43273 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
43274     point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
43275                                          DYNAMIC_TYPE_ECC);
43276     if (point == NULL)
43277         err = MEMORY_E;
43278     if (err == MP_OKAY) {
43279         k = (sp_digit*)XMALLOC(
43280             sizeof(sp_digit) * (6 + 6 * 2 * 6), heap,
43281             DYNAMIC_TYPE_ECC);
43282         if (k == NULL)
43283             err = MEMORY_E;
43284     }
43285 #endif
43286 
43287     if (err == MP_OKAY) {
43288         addP = point + 1;
43289         tmp = k + 6;
43290 
43291         sp_384_from_mp(k, 6, km);
43292         sp_384_point_from_ecc_point_6(point, gm);
43293         sp_384_point_from_ecc_point_6(addP, am);
43294     }
43295     if ((err == MP_OKAY) && (!inMont)) {
43296         err = sp_384_mod_mul_norm_6(addP->x, addP->x, p384_mod);
43297     }
43298     if ((err == MP_OKAY) && (!inMont)) {
43299         err = sp_384_mod_mul_norm_6(addP->y, addP->y, p384_mod);
43300     }
43301     if ((err == MP_OKAY) && (!inMont)) {
43302         err = sp_384_mod_mul_norm_6(addP->z, addP->z, p384_mod);
43303     }
43304     if (err == MP_OKAY) {
43305             err = sp_384_ecc_mulmod_6(point, point, k, 0, 0, heap);
43306     }
43307     if (err == MP_OKAY) {
43308             sp_384_proj_point_add_6(point, point, addP, tmp);
43309 
43310         if (map) {
43311                 sp_384_map_6(point, point, tmp);
43312         }
43313 
43314         err = sp_384_point_to_ecc_point_6(point, r);
43315     }
43316 
43317 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
43318     if (k != NULL)
43319         XFREE(k, heap, DYNAMIC_TYPE_ECC);
43320     if (point != NULL)
43321         XFREE(point, heap, DYNAMIC_TYPE_ECC);
43322 #endif
43323 
43324     return err;
43325 }
43326 
43327 #ifdef WOLFSSL_SP_SMALL
43328 #ifndef WC_NO_CACHE_RESISTANT
43329 /* Striping precomputation table.
43330  * 6 points combined into a table of 64 points.
43331  * Distance of 64 between points.
43332  */
43333 static const sp_table_entry_384 p384_table[64] = {
43334     /* 0 */
43335     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
43336       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
43337     /* 1 */
43338     { { 0x3dd0756649c0b528L,0x20e378e2a0d6ce38L,0x879c3afc541b4d6eL,
43339         0x6454868459a30effL,0x812ff723614ede2bL,0x4d3aadc2299e1513L },
43340       { 0x23043dad4b03a4feL,0xa1bfa8bf7bb4a9acL,0x8bade7562e83b050L,
43341         0xc6c3521968f4ffd9L,0xdd8002263969a840L,0x2b78abc25a15c5e9L } },
43342     /* 2 */
43343     { { 0xa54768dab1b43eefL,0x13e41f47e14fda22L,0x774df203faef6863L,
43344         0xf795a034bd7471b3L,0xf0958718b47de2e9L,0xc92f7888e1160cffL },
43345       { 0x86ded97b0146c790L,0x015918f5480a4b7bL,0x05588920424e8459L,
43346         0x37455914eecf8b2bL,0xe7d3df1fb968a6faL,0x07a0ffd6bad0719fL } },
43347     /* 3 */
43348     { { 0xda37cd535c54db6fL,0x0e37890a91f06c5cL,0x1730ef7be7ae7db5L,
43349         0x2b3dcd51ff045f54L,0xf5db3c3c72cc8451L,0x3165d6efcf0c185cL },
43350       { 0x177c4f6bf5958d78L,0xcb29d22f8d676a9fL,0x3bcf0068792ac96dL,
43351         0x60d1c6b719df5641L,0x426e412a68a099f8L,0xf9ca0c5c9f74d52bL } },
43352     /* 4 */
43353     { { 0xf186d6bcc88d568aL,0x872bc4c7528535ddL,0xc9e7432edfe64dc3L,
43354         0xd9fc4832d795ea57L,0xf4ffdb81c845af2bL,0x66d7e7882b670517L },
43355       { 0xa7c1be04d7b7a1c6L,0xbed88479d5b2a249L,0x62ff8aba03f2ef6dL,
43356         0x60ecaac420dc701dL,0x9f4b559f4ff10119L,0x0582c9313cd54fd0L } },
43357     /* 5 */
43358     { { 0x394fb84de86e3f64L,0xfe4a36e7ff13314eL,0xa1e44b14dc261ec2L,
43359         0x3924e50a7420408fL,0x637e330242ed7626L,0xeb657b10fd711ba4L },
43360       { 0xc16d01c5340949bbL,0x30e043267f1f42c7L,0xe7465819b056d872L,
43361         0x3386f1c6886fb3dbL,0x5be463a5be56f774L,0xa96fd3b74694e15aL } },
43362     /* 6 */
43363     { { 0x95dd5ee5a98b4254L,0xea328205aa845e67L,0x98640fb5a1e36348L,
43364         0xd1bc5c251add5ee7L,0xc3158a423d11b799L,0x5feb68ed47c83d54L },
43365       { 0x7c5a1204963a207bL,0x2f2b2c7eee4671f8L,0xb63d291cd42867a6L,
43366         0x0b073620139530f4L,0xbe149492abb05b99L,0x21417da455accd2aL } },
43367     /* 7 */
43368     { { 0x9408555e9e5eba15L,0x416250137b7572c5L,0xfa53ee50bfff6ea7L,
43369         0x3d682de1e7b178c3L,0xb3e8769dec329f53L,0x1ab8c82e9eb524f4L },
43370       { 0x5bbd538dde2f1eb9L,0x1d1b0bea2b19c51eL,0xf785f9b98cb06eeeL,
43371         0x5cff29c6f58f21d5L,0x44aaa52245cbaef3L,0xd60c19427de40246L } },
43372     /* 8 */
43373     { { 0x378205de2f9fbe67L,0xc4afcb837f728e44L,0xdbcec06c682e00f1L,
43374         0xf2a145c3114d5423L,0xa01d98747a52463eL,0xfc0935b17d717b0aL },
43375       { 0x9653bc4fd4d01f95L,0x9aa83ea89560ad34L,0xf77943dcaf8e3f3fL,
43376         0x70774a10e86fe16eL,0x6b62e6f1bf9ffdcfL,0x8a72f39e588745c9L } },
43377     /* 9 */
43378     { { 0x73ade4da2341c342L,0xdd326e54ea704422L,0x336c7d983741cef3L,
43379         0x1eafa00d59e61549L,0xcd3ed892bd9a3efdL,0x03faf26cc5c6c7e4L },
43380       { 0x087e2fcf3045f8acL,0x14a65532174f1e73L,0x2cf84f28fe0af9a7L,
43381         0xddfd7a842cdc935bL,0x4c0f117b6929c895L,0x356572d64c8bcfccL } },
43382     /* 10 */
43383     { { 0x984a6aed6420bc66L,0x6d90e0e0896a24a6L,0xe0adb93a18713003L,
43384         0xf00d424c1a8369fcL,0x636ebf14712ae802L,0xee39ff8ebe9d739aL },
43385       { 0xb330dd3e94f6d1dcL,0x6ba6780eb7731cf8L,0x4e569408198be5a2L,
43386         0x6639523b0193a22cL,0x6978cc9d91aa1455L,0x62062d8f329f9763L } },
43387     /* 11 */
43388     { { 0x7159107d80efff78L,0xf8ed5f8e8e4c39d5L,0x64a2265cc15e679cL,
43389         0xfc514e17a6d96c81L,0x59c86545f093e0a8L,0x804b0a588b5a336aL },
43390       { 0x94c32118cb9dcbcaL,0x2deb0e385d45251dL,0xd1092b0986869572L,
43391         0x073bf838fb2e9f97L,0x76b6d7d6de700fcbL,0xd2a6d110f2ddce5fL } },
43392     /* 12 */
43393     { { 0x6da7ccd0229de19eL,0x5050d45df0aa039dL,0xf9f01d68d9e7a861L,
43394         0x6d8b9f2000aa05f2L,0xae3d9698742cd4d9L,0x43e477abd560c394L },
43395       { 0x73d594991cb6dd81L,0x689162b2fac3f62eL,0xd6187ca864d1d0d5L,
43396         0xe8421a0d2f067457L,0x9b266acbea7c3a8dL,0x707e0e6e44df5cb3L } },
43397     /* 13 */
43398     { { 0x604b2a1a026511a0L,0xd4f6cf16256f4076L,0x7d823347b315a642L,
43399         0x8f805833786aa438L,0x9883df85f04bb4b3L,0x02bc10305bba6d84L },
43400       { 0xfe39a024a72c03acL,0xa980db635f2dbfd0L,0xcd53149f4f259ec6L,
43401         0xe969079b43f53f97L,0xd3849fdb42f9f27cL,0xd2cfd3f842653dc9L } },
43402     /* 14 */
43403     { { 0xbf69fe6a6abe7d80L,0x4932288192bb50e2L,0xc9e2f7fb61e8b18dL,
43404         0x24c74788f6c82421L,0xe79e5e3011c0b244L,0xd6612c70e0484571L },
43405       { 0x7863ff927ef82d17L,0x692790feb0a1b01cL,0xa2d6ffb5afe51546L,
43406         0xacdb43f26cf550c6L,0x3b3243dfaecfaf8fL,0x9557335ac233bcd9L } },
43407     /* 15 */
43408     { { 0x25e08c8faff5b387L,0x112c11e2d06208ceL,0x61031c1765234214L,
43409         0xba06f5550514764dL,0xfaacf6f39bd197d0L,0xe4b032321464a57fL },
43410       { 0x00c19adfe35dcd69L,0x81b75730a1c2646cL,0x47baa4fee0c50e32L,
43411         0xe9297832bcaddb3bL,0x1768d2f9d712c6cfL,0xfcef29fdb82e9eeaL } },
43412     /* 16 */
43413     { { 0xdbe04c3044ce3ad8L,0x995fbb1b4ce8aad5L,0xdbf8b54670911457L,
43414         0x9e683b5b3f7a1757L,0x7b89a08a9c7bd62cL,0x448865a40b3fc97eL },
43415       { 0x0ac9abfc3bb01e94L,0xa07760421e756124L,0x0aa6c335d9deed97L,
43416         0xe270580f72603e08L,0x70857a946c783bb2L,0xa0047774caa929aeL } },
43417     /* 17 */
43418     { { 0x56211190a353e889L,0x052917c3190eb198L,0xadfd85b03eee3d12L,
43419         0xde1d761779fd9c91L,0x05be51b7bf500159L,0x271f07178fcb87f1L },
43420       { 0x02673e273a75ac71L,0xb1b7246eda12da8dL,0xb25647928f5fb8c0L,
43421         0x0a22cbe1063b1d7fL,0xb0d7a7365649976eL,0x8f8e6e289e96b15dL } },
43422     /* 18 */
43423     { { 0x8fc113f98312351cL,0xe837b9e0c5eff002L,0x7cb9ef074dad72fcL,
43424         0x18a8d43eb5eb7ee3L,0x2cf3ae844925efdbL,0x376e9e857756ec6aL },
43425       { 0xf77a79c8a3e3705fL,0x2d590b7d6c5fbab3L,0xa59713e27a4766c3L,
43426         0xb5da6a6861544174L,0xadb04a8adab1fe76L,0x03b6138d375143b4L } },
43427     /* 19 */
43428     { { 0x20d88a80c1bfa043L,0x88806999672583ceL,0x195a89eaaea9b605L,
43429         0x0b9b4e8532bac07bL,0x8279965683868df6L,0x83c58afab52711a9L },
43430       { 0xb895c13d1c869283L,0x00f98d046206dde6L,0x76caaa22884bf311L,
43431         0x22b2137f995b29a5L,0x7f645809b098b07bL,0xa540c8a6050e2552L } },
43432     /* 20 */
43433     { { 0x47980509e562d904L,0xe736f89d031e112cL,0xbc6bfb0765d8ae25L,
43434         0xe9ed4cc4ca459646L,0xf540e90e2fff67ffL,0x836280eb1a314e11L },
43435       { 0xa710b25041610627L,0xefc22b1573a9f9a2L,0x60f20789456498c0L,
43436         0x417920438052f4e7L,0x5c850903d5c0e80dL,0x52df5275bf1d8815L } },
43437     /* 21 */
43438     { { 0x25539de98ece218dL,0xb36574a8dca420baL,0x9d1812680e0d07feL,
43439         0xea79a5f5ad3ed34fL,0x8b739ad57c9277cfL,0xd88659886ee9a930L },
43440       { 0xaf07bfb621591a3eL,0xe0138c6508f3524fL,0xd3128f1297ee315eL,
43441         0x67f8641e21045f63L,0x3e1a96b140c73a2dL,0x8976b70305f51122L } },
43442     /* 22 */
43443     { { 0xdeaf635731960db4L,0x680b054e5948d7f7L,0x0841e40fd272bb5cL,
43444         0x94d37db26e36117dL,0xaf2d001547f63ec8L,0x82665cdc47493309L },
43445       { 0xfe90e844abbe3851L,0x8357709afb79bc0cL,0x811a64d2b6bcc044L,
43446         0x1937c988882b3415L,0xe8b28724e267b271L,0x84d1eed0af89ed33L } },
43447     /* 23 */
43448     { { 0x52b8234f54c894a7L,0xfe54146fa2d11b70L,0x6412b5eb0aab6097L,
43449         0xa62499906a13a9daL,0xd2b1eb50adc448caL,0xe7ab51f9b115ab92L },
43450       { 0x4638ee62e76551d8L,0x74c3c1e1afe9c98dL,0x59000ad060d77322L,
43451         0x0a4b105ba06adc9aL,0xcdaeb4a496a6f616L,0x8c79c4a1864b49dcL } },
43452     /* 24 */
43453     { { 0xc09c32d1c0b1bf15L,0x005d510f88d74e44L,0x031f9a9afc2c089eL,
43454         0x08aac7294ba183f0L,0xf227a7ceaf2245ebL,0xb4ec33cbb3a864ffL },
43455       { 0xdb76decd570a24f3L,0xea59387a12283a9eL,0x81b7c569341ef9a4L,
43456         0xad7c98bd8d77833aL,0x2182133b49ca80ffL,0x1de1d456085802b7L } },
43457     /* 25 */
43458     { { 0xeead25b2e1c02860L,0xb2ae43694ff42d2eL,0x4b39a2ddfd61c1b0L,
43459         0x29c826ea968718a5L,0x877fdf15d9751a0aL,0x00b321dfb54affdfL },
43460       { 0x3c7c0778d4d5dbf7L,0x858a0fdccfc47423L,0xbd8e6544185b3063L,
43461         0xa22c3ef62da46a04L,0x5c2d84016a6c0ce1L,0x260246eddd6329aeL } },
43462     /* 26 */
43463     { { 0x71753fc00c6463f6L,0x7ec14c015c6c9e33L,0x28b9ab9441ce6153L,
43464         0x3a1ac251a6702c8dL,0x2b124bc49ed6cb1fL,0x7a11c4be4fc7383fL },
43465       { 0x1414913509fac991L,0xf7c188d3cb1ee336L,0x754bc47391c3f406L,
43466         0x71d34587cad39500L,0x213dd1a7dd0399a1L,0x8457a8f671d05899L } },
43467     /* 27 */
43468     { { 0xa921ca662e9c06d3L,0x1d8974e89ba6521fL,0xbb465c775f79f791L,
43469         0x8f983f083a3954c8L,0x8492f8398b3935dcL,0x2b87d9c290c04426L },
43470       { 0xcec76ea403e60a28L,0x648e9830aa631308L,0x7b542f791eb86b73L,
43471         0xfc8cc9a3150d854dL,0x2be86940bfcc83feL,0x2e58a13ac88c7585L } },
43472     /* 28 */
43473     { { 0x19249a8fd1bc237fL,0xdec1c6a563505555L,0xc8256977bad2a93bL,
43474         0x78533659fc598170L,0x888a6578ee7e53cbL,0x28783b0e33766db3L },
43475       { 0xcf791e56e42c28f2L,0xfbf8dde8f9c37f4cL,0xf0ffaf1712c05395L,
43476         0xd27d21e9daf2f012L,0xf90432da9a7be009L,0xa459c036a8012f28L } },
43477     /* 29 */
43478     { { 0x4d99a7cac8b1c6d4L,0x8088818825c899c0L,0xbd27e9be2ebdeb3dL,
43479         0x73c3e0aa054e77c1L,0x180c848498534ce5L,0x750d52f754ffa9cdL },
43480       { 0x5f26eeb16f702f4cL,0x427fc6e4cc76d8f4L,0x93126b8d026b631dL,
43481         0x5356b93917e145a7L,0xc79ca872c0be7c84L,0x3fca7cad4b615fb7L } },
43482     /* 30 */
43483     { { 0xed48fe78d0241021L,0x252b14a0142f7f8eL,0x19ab85c6db573a09L,
43484         0x546c3960f3df906fL,0xc688f4b22c810ea8L,0xbccf0cca5ff9e108L },
43485       { 0x34f4609e3f2cc69bL,0xf3b1efe414afe4f4L,0x5d809cef37a8ef74L,
43486         0xa8d1978a176ba328L,0x75dde11fdf59ecb9L,0x34eeeaffa9916ee2L } },
43487     /* 31 */
43488     { { 0xe7f603f248e83c85L,0xa94a539cfa581815L,0x5a61a596dba360b7L,
43489         0x6cc51dd16a77ef79L,0x4ff36ae0fdbceb9dL,0xfcff65323e8a9c07L },
43490       { 0x0ba0ce5436d4d0b8L,0x98087a452464efc2L,0xd456843bcc1a2ba7L,
43491         0x677384a53853e04cL,0x625d32d56c7971deL,0x86882509f724b331L } },
43492     /* 32 */
43493     { { 0xc20fb9111a42e5e7L,0x075a678b81d12863L,0x12bcbc6a5cc0aa89L,
43494         0x5279c6ab4fb9f01eL,0xbc8e178911ae1b89L,0xae74a706c290003cL },
43495       { 0x9949d6ec79df3f45L,0xba18e26296c8d37fL,0x68de6ee2dd2275bfL,
43496         0xa9e4fff8c419f1d5L,0xbc759ca4a52b5a40L,0xff18cbd863b0996dL } },
43497     /* 33 */
43498     { { 0x684a681892a5eeeaL,0x1f5b193242a09264L,0x30bd8695d98a2f34L,
43499         0x6e775e019a8601fcL,0x8126bdc24ca956f8L,0x149e73d9e5595daaL },
43500       { 0x876428401f851e83L,0x4b8863dbd3a7c4a0L,0xe1e43b3d8c95d7d9L,
43501         0x7f1e307ea60fd528L,0xbf2fa5d134341610L,0x11ad4a8181c502d3L } },
43502     /* 34 */
43503     { { 0xc7df022e782dd401L,0xd15aa9a9a7bcc543L,0x6aa42774b94df1d0L,
43504         0xab2660c30592a13eL,0xaf4e40809ffc40c7L,0x01152c8d9cd52b10L },
43505       { 0x649de1d99034a33aL,0x2b9d0ef0d758abfcL,0xdddd0bc2d458adddL,
43506         0xe5366ac9c09837f8L,0xa003abbb7b1ae35fL,0x880062887ab1fddeL } },
43507     /* 35 */
43508     { { 0x6b6c8f055288f1b4L,0xba05407c033738b4L,0x26cac3a941a955e3L,
43509         0x28f1692f8e0e0601L,0x2032cb36842c4887L,0x6adeba457d76b20fL },
43510       { 0xd282c2ce654c6f5cL,0x30584ca5be9ba4f1L,0x45d766a01b2c528bL,
43511         0xe918bad7c0c6f8ccL,0x1e050b2a0560f070L,0x4fc95de12d6dd010L } },
43512     /* 36 */
43513     { { 0x2bb26072150191d5L,0xea2617618108dcf6L,0x4dfa1303e6083c63L,
43514         0xfa4e0709e2876fb8L,0xf901fed0b1668763L,0xf01c53aeb82c967aL },
43515       { 0xb43e59d39ed827e8L,0xb58e157e57774eefL,0x57ee54e31b83dceeL,
43516         0x3d896f32613aa922L,0x69d40667b5c7bfc5L,0xd402b5cb77a2c0d8L } },
43517     /* 37 */
43518     { { 0xabeb70127d3c9923L,0x412ada8dd7ecb93aL,0xeb64dc910b71ae2fL,
43519         0x52ef537aa9ab061aL,0x0863970fc1b55faeL,0xfaff5fb9b1182dbdL },
43520       { 0x5551d6fed0abaa17L,0x7bb3e02072d641f6L,0x939d7793aa9d288cL,
43521         0x1450f8bf9078e2c2L,0x24ccd102a086b6aeL,0x57d1796f6a3f8a5fL } },
43522     /* 38 */
43523     { { 0x1023120683ce1f76L,0xd16d4b9f03ee406fL,0x9d39c39883caa4b7L,
43524         0x875732f5ce299b93L,0x1e6a425d2f121f4aL,0x4b1f1d835d8c3279L },
43525       { 0xe655f58856dd6a6cL,0x23f106475843fd34L,0x932b7d942bad6ce2L,
43526         0x70a0580e6772a52eL,0x3240118ac88537afL,0x9ccb2ca9d2407224L } },
43527     /* 39 */
43528     { { 0xa6a40db8710f2324L,0xb3567518c2a8a09aL,0x8816442841b5650aL,
43529         0x2a352ed27570ba50L,0x23ee46b94c85d77eL,0x643aceffd858a8c3L },
43530       { 0xe067908de3f02e82L,0x8d5869f2ffb8cf81L,0x4713f0820bc8ad7eL,
43531         0xe1ee44c780057c40L,0xb34395087d2cf34eL,0x4307b0e10336a207L } },
43532     /* 40 */
43533     { { 0xe9c1e45746e4d003L,0xa23978c394332057L,0x0e2f300829575db6L,
43534         0x50a51ff490441e9eL,0x38ce3ed0508d4a07L,0x6a997411cfd7224eL },
43535       { 0x4d147c31da6b1e1dL,0xedf604b2da8a3547L,0x7a1b8cf0d5e9ceedL,
43536         0xd74e501213544e6aL,0xcc49f8da4ad968f9L,0xfb87e604cc69ada9L } },
43537     /* 41 */
43538     { { 0xde79409bdf166882L,0xd645b836d46cc527L,0xda4a02f3b6c3eb28L,
43539         0x845e3c5900e7cf86L,0x733bdc9b604c6d80L,0xe3a1244b847acd97L },
43540       { 0x421312d6d128842cL,0x81f71feaa1c598efL,0xc619465545eaf796L,
43541         0x1ffb85121f338b6cL,0xe7aed7106632f064L,0xf8d1ffb7f5b6e510L } },
43542     /* 42 */
43543     { { 0x7d3f031f3eace851L,0xef43ab7025923624L,0xbae811881af6cdecL,
43544         0xb7e93b49ea862112L,0xe35a4fc6af23aba2L,0xc52e1fc0aecc593eL },
43545       { 0xbffa292428148b99L,0xd08040fc89e3d795L,0x7da320032db47b3aL,
43546         0xe78b44e5a0eb7aa3L,0xd1648ec8f0ec090bL,0x4048dba7740fe871L } },
43547     /* 43 */
43548     { { 0x6fddb89fa00a14acL,0x844f991508aa06e7L,0x6d5ac4a9f76aca7dL,
43549         0xfba1ba85e9fa4d51L,0x159633bbb2ea0fc7L,0xa2eb0e4b76ba2854L },
43550       { 0x8a858155c11f5398L,0x30a96e535e8ea044L,0x696210c197e05a47L,
43551         0x86e55f9415036f4bL,0x0c93ea9c6a96d9d7L,0xb7ba506179eba3daL } },
43552     /* 44 */
43553     { { 0xd305c733cd94d7b2L,0x9ea33e363e7955b2L,0x78a98855bc73812fL,
43554         0xfb1b791d48a3a9a0L,0x6e5107ee04014aafL,0x0412b2c00ea07de0L },
43555       { 0xdd3a2408ddcaca68L,0x5d18e69ae3344f29L,0x3ce65481f9017408L,
43556         0x50abb4568cbd64fbL,0x442fa5098916a9ebL,0x16b3ddc7c538c410L } },
43557     /* 45 */
43558     { { 0x6757dbfd25e331abL,0x0efde50ba3eaafbcL,0x1cd46222d531d29cL,
43559         0x1b713ca93561cb2bL,0x7d07334bfb5bc99dL,0x95dba43e885a417dL },
43560       { 0x1c9c3f3f77823a59L,0x43533ba83220cb7fL,0x1b918bc182e3e401L,
43561         0x66a039aacd3fec87L,0x1d39dbb02dad36d5L,0x554025959dc04be4L } },
43562     /* 46 */
43563     { { 0xdf39920847744933L,0x4264f7ea82524dd6L,0xdb57ec08e5182c6dL,
43564         0x2d6778e705c5e7bfL,0x3f37793f96f53ea2L,0x6472cbae05c47e48L },
43565       { 0x9e6dd60fbf78067cL,0xa2817ec2cef34088L,0xde4715b8168edde9L,
43566         0x6c57105146bf31e1L,0x98113fbbc4272bc0L,0x03bb7922cc3b90c3L } },
43567     /* 47 */
43568     { { 0xe0f23be157d88fefL,0x4125c55b0ca27a01L,0xeadf527e14a71262L,
43569         0x1f2e803ccc4e9a04L,0x32e07b47d68c4fcfL,0x1577fab79db5070bL },
43570       { 0xd786d6e57831990aL,0xf64ff4b154fbde40L,0x4bac5b034f9450aeL,
43571         0x06ae25e055116af9L,0x33d84ea2d7b4fcfcL,0x44a92e73569c3b9eL } },
43572     /* 48 */
43573     { { 0xf5bdccbabad0cb7fL,0x370f43ca958edd05L,0x3dd8232b04904a26L,
43574         0x3f8106682f4458e8L,0xdfcb67b99b3ace7eL,0x54e42f2d3e1241fcL },
43575       { 0xe30f3fb0db889300L,0x4ca0184b483e51fcL,0x5a32d097a638dac6L,
43576         0x567a2b5ec62a1db0L,0x2a756ba3c446456cL,0x6919026dd9f8d5c0L } },
43577     /* 49 */
43578     { { 0x7f6493fc4fec874aL,0x8bb8a674d47a0770L,0x90bad2a652bd4f0cL,
43579         0x16badbe2f5733b07L,0x93be07cf93a1f802L,0x1e37a01541c395f7L },
43580       { 0xfe2c0fd6216582b3L,0xdcd98bc81627180dL,0x41e037268e8c9f1eL,
43581         0x93dbc22cfe8f45afL,0x5728c8a6ff45e059L,0x4f2f15cfca4a98cdL } },
43582     /* 50 */
43583     { { 0xdbe2ec5d656e7d76L,0x84ad1b4bae2757bbL,0xc9297e7a0d4fec75L,
43584         0xfcc673eecad3ba87L,0xb0f77621dfd1671aL,0x5c386e449704a8c7L },
43585       { 0xce78f03f3e29256dL,0x0b185938c3a6ed2fL,0x7b1e2fae7824819bL,
43586         0x5a85d7f1f2d9313cL,0x238bd27973595b0fL,0x5fbf6b675c1cd2dcL } },
43587     /* 51 */
43588     { { 0x84d1ffb88a3e2412L,0xf01605926515f2feL,0x0e26ea9889905340L,
43589         0xbfd7a1b7203bd3d4L,0x5301273a88ea0bdaL,0x2f424475b28dd43eL },
43590       { 0x31014a2b33c28afaL,0xffbdea0c01e220eaL,0x681c64e8460b81d5L,
43591         0xdbe6f7286a91e1d5L,0x068bf36332619ad5L,0x4946291f27976c74L } },
43592     /* 52 */
43593     { { 0xa081a9462068e4b0L,0x1a8f5df609bfdad0L,0x5fbba5bcef28dd35L,
43594         0xa3e60d4f031ff71eL,0x2d47689b702ca18eL,0xd283f247c9b8e66bL },
43595       { 0x63e65dd7859ea140L,0x123da61f42aacdc3L,0xa8a9e893336f680cL,
43596         0x1cc4e12ac23d43acL,0x421e80d586a1fff8L,0x833d60d543deecc9L } },
43597     /* 53 */
43598     { { 0x3c25b57c29014f8fL,0xa19fcb1e35d8e122L,0x916c0e3ceda32ac8L,
43599         0x9a23d289f36b6096L,0x5099038439a39871L,0xdc5b77b661c64196L },
43600       { 0x5a7d9917942bf2b6L,0xd21853934f41cf6dL,0x90ff1016fcc45c2fL,
43601         0x9891093deb8938aaL,0xe3c49b1baac4e6e9L,0x0f21a1d1d7a8e91eL } },
43602     /* 54 */
43603     { { 0x3a808e336f364b7eL,0x6a96d1b8bfa17359L,0x3387ec8552b36545L,
43604         0x2fde350af712180cL,0x9219d6f4703a2183L,0x8ba27e0086457946L },
43605       { 0x7446bca0ed80a9afL,0xbaf78b6f7203637aL,0x0304129d497c9d0fL,
43606         0x6df1e0356a883b68L,0x93ea2bb5e8018c47L,0xc86fd77cdb46443cL } },
43607     /* 55 */
43608     { { 0x8de865d255dc2427L,0x74f7f83d6f72d126L,0xee1111786c7e665aL,
43609         0x272a8b3dddf44f12L,0xad3546449164eb4fL,0x2ffbdb586859d68fL },
43610       { 0xbefd36c509701865L,0x63c256162c983d01L,0x15a7ba0b2eb68703L,
43611         0x3318a82b5bb0fafcL,0x8e930fa9a0804f38L,0xb7459eb6be60ed1dL } },
43612     /* 56 */
43613     { { 0xace01c514260b948L,0x04a6080f49210f78L,0x0d1eef6b2241b00dL,
43614         0x85a25069ef63912aL,0xcc96c4ec13dd8bc2L,0x90f14d1140d7e234L },
43615       { 0xae33f18ca69c8dc3L,0x76921f2a9adfa431L,0x18158ccf048c9f49L,
43616         0x90bcf7fbfb8fb345L,0x0d50b4dc38b3ff5dL,0x3914ea0b59ef84a8L } },
43617     /* 57 */
43618     { { 0x4929d3f9d4e37cf3L,0x622183d1b24c24c0L,0x65cec0675f904d34L,
43619         0x65f9931a8a6f76faL,0xeed975b0e73282f2L,0xa045552a5e1625fdL },
43620       { 0xfd6b3e02f8fe8e42L,0x5f9f40256203907cL,0x8307eedb42b2c264L,
43621         0x2fb3ee719f757e92L,0x4502f2ecdc157ea8L,0xd976e7755d1cc0d5L } },
43622     /* 58 */
43623     { { 0xe46fb9a28fe1946eL,0xe91df3ed63bdde6eL,0x2e995306e9c28432L,
43624         0x7b3a6fe10988235bL,0xc55199f077f92a71L,0x47dd034853cb7950L },
43625       { 0xead52de2b727a6d1L,0xb87c9f75eea9c8daL,0xf3e2f3280d944f21L,
43626         0xce82734edd751eddL,0xfb83225ce616cedcL,0x15850e4b4a31eb49L } },
43627     /* 59 */
43628     { { 0x92c4b6d50196ad3aL,0x0205ea484e1205e4L,0x8e08a97c0afc5affL,
43629         0xda8687c6727827ebL,0x2eace83106e398aaL,0x3a086c0f6d69e4e8L },
43630       { 0x5ff9b7aaf286e62aL,0xc428503962aae55eL,0x4ebd4258d9530a3fL,
43631         0x57ea313a8afc7fcbL,0x6d30a67522c18879L,0xd3c00cc994afb659L } },
43632     /* 60 */
43633     { { 0x53ee47c5dee0d48bL,0xbd9e84ad9dfa2397L,0x2d581e12f81ba5e2L,
43634         0x26269f4f132cd325L,0x9e6224df58860a5fL,0x9306c607ff55522aL },
43635       { 0xb48af6d4146950e5L,0x09920ed00436805eL,0x3a1bc276cdce7eaeL,
43636         0x55ba728ac39a425eL,0x6a04d4e6d961d03eL,0x13891c66736e684aL } },
43637     /* 61 */
43638     { { 0x7c75175a04cd04d6L,0xb76f9bd909c27a17L,0xa0cff6d408e5fe36L,
43639         0xc9097695dcd5ef90L,0x26bea24585e28054L,0x658e03c61580f068L },
43640       { 0x0da9f75e811eed27L,0x086e5e04aca0d2eeL,0xd4c157faa53a6787L,
43641         0x2e9266d2b40a595cL,0x8f1cb52698fa0820L,0x32a74240a1aef514L } },
43642     /* 62 */
43643     { { 0xeb42e3d91ae86e7cL,0xd6956c8ce04a5026L,0x4c0b8b980f4302ebL,
43644         0xde43c938b37211fdL,0x9fa6a158e7090f80L,0x5f3c9afc73c47fb6L },
43645       { 0x2dc4f109f850a4d0L,0x56e63a4b6fd49d6aL,0x8e80a0694cbff048L,
43646         0x18d8b8cf2284afb0L,0x61dd086dc89363a1L,0x034c2202c37342a4L } },
43647     /* 63 */
43648     { { 0x1ae0c4e11c718580L,0x303f48a6bf99a0bfL,0xa5551e4491ae219fL,
43649         0xdc41d9bd55a05287L,0xd5aa73e36872b123L,0x6fd94b0ce6395bf6L },
43650       { 0xbb95fdbac00afbc1L,0x9cd96208497cac10L,0x8adbd8c1ca51afeaL,
43651         0x94fedafbf3bc5f5fL,0x29c0217bdf9f5371L,0x5c13eb4bd9024634L } },
43652 };
43653 
43654 /* Multiply the base point of P384 by the scalar and return the result.
43655  * If map is true then convert result to affine coordinates.
43656  *
43657  * Stripe implementation.
43658  * Pre-generated: 2^0, 2^64, ...
43659  * Pre-generated: products of all combinations of above.
43660  * 6 doubles and adds (with qz=1)
43661  *
43662  * r     Resulting point.
43663  * k     Scalar to multiply by.
43664  * map   Indicates whether to convert result to affine.
43665  * ct    Constant time required.
43666  * heap  Heap to use for allocation.
43667  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
43668  */
sp_384_ecc_mulmod_base_6(sp_point_384 * r,const sp_digit * k,int map,int ct,void * heap)43669 static int sp_384_ecc_mulmod_base_6(sp_point_384* r, const sp_digit* k,
43670         int map, int ct, void* heap)
43671 {
43672     return sp_384_ecc_mulmod_stripe_6(r, &p384_base, p384_table,
43673                                       k, map, ct, heap);
43674 }
43675 
43676 #else
43677 /* Striping precomputation table.
43678  * 8 points combined into a table of 256 points.
43679  * Distance of 48 between points.
43680  */
43681 static const sp_table_entry_384 p384_table[256] = {
43682     /* 0 */
43683     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
43684       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
43685     /* 1 */
43686     { { 0x3dd0756649c0b528L,0x20e378e2a0d6ce38L,0x879c3afc541b4d6eL,
43687         0x6454868459a30effL,0x812ff723614ede2bL,0x4d3aadc2299e1513L },
43688       { 0x23043dad4b03a4feL,0xa1bfa8bf7bb4a9acL,0x8bade7562e83b050L,
43689         0xc6c3521968f4ffd9L,0xdd8002263969a840L,0x2b78abc25a15c5e9L } },
43690     /* 2 */
43691     { { 0x298647532b0c535bL,0x90dd695370506296L,0x038cd6b4216ab9acL,
43692         0x3df9b7b7be12d76aL,0x13f4d9785f347bdbL,0x222c5c9c13e94489L },
43693       { 0x5f8e796f2680dc64L,0x120e7cb758352417L,0x254b5d8ad10740b8L,
43694         0xc38b8efb5337dee6L,0xf688c2e194f02247L,0x7b5c75f36c25bc4cL } },
43695     /* 3 */
43696     { { 0xe26a3cc39edffea5L,0x35bbfd1c37d7e9fcL,0xf0e7700d9bde3ef6L,
43697         0x0380eb471a538f5aL,0x2e9da8bb05bf9eb3L,0xdbb93c731a460c3eL },
43698       { 0x37dba260f526b605L,0x95d4978efd785537L,0x24ed793aed72a04aL,
43699         0x2694837776005b1aL,0x99f557b99e681f82L,0xae5f9557d64954efL } },
43700     /* 4 */
43701     { { 0x24480c57f26feef9L,0xc31a26943a0e1240L,0x735002c3273e2bc7L,
43702         0x8c42e9c53ef1ed4cL,0x028babf67f4948e8L,0x6a502f438a978632L },
43703       { 0xf5f13a46b74536feL,0x1d218babd8a9f0ebL,0x30f36bcc37232768L,
43704         0xc5317b31576e8c18L,0xef1d57a69bbcb766L,0x917c4930b3e3d4dcL } },
43705     /* 5 */
43706     { { 0x11426e2ee349ddd0L,0x9f117ef99b2fc250L,0xff36b480ec0174a6L,
43707         0x4f4bde7618458466L,0x2f2edb6d05806049L,0x8adc75d119dfca92L },
43708       { 0xa619d097b7d5a7ceL,0x874275e5a34411e9L,0x5403e0470da4b4efL,
43709         0x2ebaafd977901d8fL,0x5e63ebcea747170fL,0x12a369447f9d8036L } },
43710     /* 6 */
43711     { { 0x28f9c07a4fc52870L,0xce0b37481a53a961L,0xd550fa180e1828d9L,
43712         0xa24abaf76adb225aL,0xd11ed0a56e58a348L,0xf3d811e6948acb62L },
43713       { 0x8618dd774c61ed22L,0x0bb747f980b47c9dL,0x22bf796fde6b8559L,
43714         0xfdfd1c6d680a21e9L,0xc0db15772af2c9ddL,0xa09379e6c1e90f3dL } },
43715     /* 7 */
43716     { { 0x386c66efe085c629L,0x5fc2a461095bc89aL,0x1353d631203f4b41L,
43717         0x7ca1972b7e4bd8f5L,0xb077380aa7df8ce9L,0xd8a90389ee7e4ea3L },
43718       { 0x1bc74dc7e7b14461L,0xdc2cb0140c9c4f78L,0x52b4b3a684ef0a10L,
43719         0xbde6ea5d20327fe2L,0xb71ec435660f9615L,0xeede5a04b8ad8173L } },
43720     /* 8 */
43721     { { 0x5584cbb3893b9a2dL,0x820c660b00850c5dL,0x4126d8267df2d43dL,
43722         0xdd5bbbf00109e801L,0x85b92ee338172f1cL,0x609d4f93f31430d9L },
43723       { 0x1e059a07eadaf9d6L,0x70e6536c0f125fb0L,0xd6220751560f20e7L,
43724         0xa59489ae7aaf3a9aL,0x7b70e2f664bae14eL,0x0dd0370176d08249L } },
43725     /* 9 */
43726     { { 0x4cc13be88510521fL,0x87315ba9f724cc17L,0xb49d83bb353dc263L,
43727         0x8b677efe0c279257L,0x510a1c1cc93c9537L,0x33e30cd8a4702c99L },
43728       { 0xf0ffc89d2208353fL,0x0170fa8dced42b2bL,0x090851ed26e2a5f5L,
43729         0x81276455ecb52c96L,0x0646c4e17fe1adf4L,0x513f047eb0868eabL } },
43730     /* 10 */
43731     { { 0xc07611f4df5bdf53L,0x45d331a758b11a6dL,0x58965daf1c4ee394L,
43732         0xba8bebe75a5878d1L,0xaecc0a1882dd3025L,0xcf2a3899a923eb8bL },
43733       { 0xf98c9281d24fd048L,0x841bfb598bbb025dL,0xb8ddf8cec9ab9d53L,
43734         0x538a4cb67fef044eL,0x092ac21f23236662L,0xa919d3850b66f065L } },
43735     /* 11 */
43736     { { 0x3db03b4085d480d8L,0x8cd9f4791b287a7dL,0x8f24dc754a8f3baeL,
43737         0x482eb8003db41892L,0x38bf9eb39c56e0f5L,0x8b9773209a91dc6fL },
43738       { 0xa31b05b27209cfc2L,0x4c49bf8505b2db70L,0x56462498d619527bL,
43739         0x3fe510391fac51baL,0xfb04f55eab4b8342L,0xc07c10dc04c6eabfL } },
43740     /* 12 */
43741     { { 0xad22fe4cdb32f048L,0x5f23bf91475ed6dfL,0xa50ce0c0aa66b6cbL,
43742         0xdf627a89f03405c0L,0x3674837df95e2d6aL,0x081c95b6ba42e64eL },
43743       { 0xeba3e036e71d6cebL,0xb45bcccf6c6b0271L,0x67b47e630684701dL,
43744         0x60f8f942e712523fL,0x824234725cd47adcL,0x83027d7987649cbbL } },
43745     /* 13 */
43746     { { 0xb3929ea63615b0b8L,0xb41441fda54dac41L,0x8995d556b5b6a368L,
43747         0xa80d4529167ef05eL,0xf6bcb4a16d25a27fL,0x210d6a4c7bd55b68L },
43748       { 0xf3804abb25351130L,0x1d2df699903e37ebL,0x5f201efc084c25c8L,
43749         0x31a28c87a1c68e91L,0x81dad253563f62a5L,0x5dd6de70d6c415d4L } },
43750     /* 14 */
43751     { { 0x29f470fd846612ceL,0x986f3eecda18d997L,0x6b84c1612f34af86L,
43752         0x5ef0a40846ddaf8bL,0x14405a00e49e795fL,0x5f491b16aa2f7a37L },
43753       { 0xc7f07ae4db41b38dL,0xef7d119e18fbfcaaL,0x3a18e07614443b19L,
43754         0x4356841a79a19926L,0x91f4a91ce2226fbeL,0xdc77248c3cc88721L } },
43755     /* 15 */
43756     { { 0xd570ff1ae4b1ec9dL,0x21d23e0ee7eef706L,0x3cde40f4ca19e086L,
43757         0x7d6523c4cd4bb270L,0x16c1f06cbf13aa6cL,0x5aa7245ad14c4b60L },
43758       { 0x37f8146744b74de8L,0x839e7a17620a934eL,0xf74d14e8de8b1aa1L,
43759         0x8789fa51f30d75e2L,0x09b24052c81c261eL,0x654e267833c565eeL } },
43760     /* 16 */
43761     { { 0x378205de2f9fbe67L,0xc4afcb837f728e44L,0xdbcec06c682e00f1L,
43762         0xf2a145c3114d5423L,0xa01d98747a52463eL,0xfc0935b17d717b0aL },
43763       { 0x9653bc4fd4d01f95L,0x9aa83ea89560ad34L,0xf77943dcaf8e3f3fL,
43764         0x70774a10e86fe16eL,0x6b62e6f1bf9ffdcfL,0x8a72f39e588745c9L } },
43765     /* 17 */
43766     { { 0x73ade4da2341c342L,0xdd326e54ea704422L,0x336c7d983741cef3L,
43767         0x1eafa00d59e61549L,0xcd3ed892bd9a3efdL,0x03faf26cc5c6c7e4L },
43768       { 0x087e2fcf3045f8acL,0x14a65532174f1e73L,0x2cf84f28fe0af9a7L,
43769         0xddfd7a842cdc935bL,0x4c0f117b6929c895L,0x356572d64c8bcfccL } },
43770     /* 18 */
43771     { { 0x7ecbac017d8c1bbaL,0x6058f9c390b0f3d5L,0xaee116e3f6197d0fL,
43772         0xc4dd70684033b128L,0xf084dba6c209b983L,0x97c7c2cf831dbc4aL },
43773       { 0x2f4e61ddf96010e8L,0xd97e4e20529faa17L,0x4ee6666069d37f20L,
43774         0xccc139ed3d366d72L,0x690b6ee213488e0fL,0x7cad1dc5f3a6d533L } },
43775     /* 19 */
43776     { { 0x660a9a81da57a41fL,0xe74a0412ec0039b6L,0x42343c6b5e1dad15L,
43777         0x284f3ff546681d4cL,0xb51087f163749e89L,0x070f23cc6f9f2f13L },
43778       { 0x542211da5d186e14L,0x84748f37fddb0dffL,0x41a3aab4db1f4180L,
43779         0x25ed667ba6402d0eL,0x2f2924a902f58355L,0x5844ee7cfa44a689L } },
43780     /* 20 */
43781     { { 0xfab086073f3b236fL,0x19e9d41d81e221daL,0xf3f6571e3927b428L,
43782         0x4348a9337550f1f6L,0x7167b996a85e62f0L,0x62d437597f5452bfL },
43783       { 0xd85feb9ef2955926L,0x440a561f6df78353L,0x389668ec9ca36b59L,
43784         0x052bf1a1a22da016L,0xbdfbff72f6093254L,0x94e50f28e22209f3L } },
43785     /* 21 */
43786     { { 0x90b2e5b33062e8afL,0xa8572375e8a3d369L,0x3fe1b00b201db7b1L,
43787         0xe926def0ee651aa2L,0x6542c9beb9b10ad7L,0x098e309ba2fcbe74L },
43788       { 0x779deeb3fff1d63fL,0x23d0e80a20bfd374L,0x8452bb3b8768f797L,
43789         0xcf75bb4d1f952856L,0x8fe6b40029ea3faaL,0x12bd3e4081373a53L } },
43790     /* 22 */
43791     { { 0xc023780d104cbba5L,0x6207e747fa35dd4cL,0x35c239281ca9b6a3L,
43792         0x4ff19be897987b10L,0xb8476bbf8022eee8L,0xaa0a4a14d3bbe74dL },
43793       { 0x20f94331187d4543L,0x3215387079f6e066L,0x83b0f74eac7e82e1L,
43794         0xa7748ba2828f06abL,0xc5f0298ac26ef35fL,0x0f0c50708e9a7dbdL } },
43795     /* 23 */
43796     { { 0x0c5c244cdef029ddL,0x3dabc687850661b8L,0x9992b865fe11d981L,
43797         0xe9801b8f6274dbadL,0xe54e6319098da242L,0x9929a91a91a53d08L },
43798       { 0x37bffd7235285887L,0xbc759425f1418102L,0x9280cc35fd2e6e20L,
43799         0x735c600cfbc42ee5L,0xb7ad28648837619aL,0xa3627231a778c57bL } },
43800     /* 24 */
43801     { { 0xae799b5c91361ed8L,0x47d71b756c63366cL,0x54cdd5211b265a6aL,
43802         0xe0215a5998d77b74L,0x4424d9b7bab29db0L,0x8b0ffacc7fd9e536L },
43803       { 0x46d85d1237b5d9efL,0x5b106d62bfa91747L,0xed0479f85f99ba2dL,
43804         0x0e6f39231d104de4L,0x83a84c8425e8983fL,0xa9507e0af8105a70L } },
43805     /* 25 */
43806     { { 0xf6c68a6e14cf381cL,0xaf9d27bdc22e31ccL,0x23568d4daa8a5ccbL,
43807         0xe431eec0e338e4d2L,0xf1a828fe8f52ad1fL,0xdb6a0579e86acd80L },
43808       { 0x2885672e4507832aL,0x73fc275f887e5289L,0x65f8027805610d08L,
43809         0x8d9b4554075ff5b0L,0x3a8e8fb109f712b5L,0x39f0ac862ebe9cf2L } },
43810     /* 26 */
43811     { { 0xd8fabf784c52edf5L,0xdcd737e5a589ae53L,0x94918bf0d791ab17L,
43812         0xb5fbd956bcff06c9L,0xf6d3032edca46d45L,0x2cdff7e141a3e486L },
43813       { 0x6674b3ba61f47ec8L,0x8a882163eef84608L,0xa257c7054c687f90L,
43814         0xe30cb2edf6cdf227L,0x2c4c64ca7f6ea846L,0x186fa17ccc6bcd3cL } },
43815     /* 27 */
43816     { { 0x48a3f5361dfcb91eL,0x83595e13646d358aL,0xbd15827b91128798L,
43817         0x3ce612b82187757aL,0x873150a161bd7372L,0xf4684530b662f568L },
43818       { 0x8833950b401896f6L,0xe11cb89a77f3e090L,0xb2f12cac48e7f4a5L,
43819         0x313dd769f606677eL,0xfdcf08b316579f93L,0x6429cec946b8f22bL } },
43820     /* 28 */
43821     { { 0x4984dd54bb75f9a4L,0x4aef06b929d3b570L,0xb5f84ca23d6e4c1eL,
43822         0x24c61c11b083ef35L,0xce4a7392392ca9ffL,0x865d65176730a800L },
43823       { 0xca3dfe76722b4a2bL,0x12c04bf97b083e0eL,0x803ce5b51b86b8a5L,
43824         0x3fc7632d6a7e3e0cL,0xc89970c2c81adbe4L,0x3cbcd3ad120e16b1L } },
43825     /* 29 */
43826     { { 0xfbfb4cc7ec30ce93L,0x10ed6c7db72720a2L,0xec675bf747b55500L,
43827         0x90725903333ff7c3L,0xc7c3973e5075bfc0L,0xb049ecb007acf31bL },
43828       { 0xb4076eaf4f58839cL,0x101896daa2b05e4fL,0x3f6033b0ab40c66eL,
43829         0x19ee9eebc8d864baL,0xeb6cf15547bf6d2aL,0x8e5a9663f826477dL } },
43830     /* 30 */
43831     { { 0x69e62fddf7fbd5e1L,0x38ecfe5476912b1dL,0x845a3d56d1da3bfbL,
43832         0x0494950e1c86f0d4L,0x83cadbf93bc36ce8L,0x41fce5724fccc8d1L },
43833       { 0x05f939c28332c144L,0xb17f248b0871e46eL,0x3d8534e266e8aff6L,
43834         0x1d06f1dc3b85c629L,0xdb06a32ea3131b73L,0xf295184d8b3f64e5L } },
43835     /* 31 */
43836     { { 0xd9653ff736ddc103L,0x25f43e3795ef606fL,0x09e301fcfe06dce8L,
43837         0x85af234130b6eebfL,0x79b12b530ff56b20L,0x9b4fb499fe9a3c6bL },
43838       { 0x0154f89251d27ac2L,0xd33167e356ca5389L,0x7828ec1fafc065a6L,
43839         0x0959a2587f746c9bL,0xb18f1be30c44f837L,0xa7946117c4132fdbL } },
43840     /* 32 */
43841     { { 0xc0426b775e3c647bL,0xbfcbd9398cf05348L,0x31d312e3172c0d3dL,
43842         0x5f49fde6ee754737L,0x895530f06da7ee61L,0xcf281b0ae8b3a5fbL },
43843       { 0xfd14973541b8a543L,0x41a625a73080dd30L,0xe2baae07653908cfL,
43844         0xc3d01436ba02a278L,0xa0d0222e7b21b8f8L,0xfdc270e9d7ec1297L } },
43845     /* 33 */
43846     { { 0x00873c0cbc7f41d6L,0xd976113e1b7ad641L,0x2a536ff4238443fbL,
43847         0x030d00e241e62e45L,0x532e98675f545fc6L,0xcd0331088e91208cL },
43848       { 0xd1a04c999797612cL,0xd4393e02eea674e2L,0xd56fa69ee19742a1L,
43849         0xdd2ab48085f0590eL,0xa5cefc5248a2243dL,0x48cc67b654383f41L } },
43850     /* 34 */
43851     { { 0x4e50430efc14ab48L,0x195b7f4f26706a74L,0x2fe8a228cc881ff6L,
43852         0xb1b968e2d945013dL,0x936aa5794b92162bL,0x4fb766b7364e754aL },
43853       { 0x13f93bca31e1ff7fL,0x696eb5cace4f2691L,0xff754bf8a2b09e02L,
43854         0x58f13c9ce58e3ff8L,0xb757346f1678c0b0L,0xd54200dba86692b3L } },
43855     /* 35 */
43856     { { 0x9a030bbd6dda1265L,0xf7b4f3fce89718ddL,0xa6a4931f936065b8L,
43857         0xbce72d875f72241cL,0x6cbb51cb65775857L,0xc71618154e993675L },
43858       { 0xe81a0f792ee32189L,0xef2fab26277dc0b2L,0x9e64f6feb71f469fL,
43859         0xb448ce33dfdaf859L,0x3f5c1c4cbe6b5df1L,0xfb8dfb001de45f7bL } },
43860     /* 36 */
43861     { { 0xc7345fa74d5bb921L,0x5c7e04be4d2b667eL,0x47ed3a80282d7a3eL,
43862         0x5c2777f87e47b2a4L,0x89b3b10008488e2eL,0x9aad77c2b2eb5b45L },
43863       { 0xd681bca7daac34aeL,0x2452e4e526afb326L,0x0c88792441a1ee14L,
43864         0x743b04d4c2407adeL,0xcb5e999bfc17a2acL,0x4dca2f824a701a06L } },
43865     /* 37 */
43866     { { 0x68e31ca61127bc1aL,0xa3edd59b17ead3beL,0x67b6b645e25f5a15L,
43867         0x76221794a420e15eL,0x794fd83b4b1e872eL,0x7cab3f03b2dece1bL },
43868       { 0x7119bf15ca9b3586L,0xa55459244d250bd7L,0x173633eacc6bcf24L,
43869         0x9bd308c2b1b6f884L,0x3bae06f5447d38c3L,0x54dcc135f341fe1cL } },
43870     /* 38 */
43871     { { 0x56d3598d943caf0dL,0xce044ea9225ff133L,0x9edf6a7c563fadeaL,
43872         0x632eb94473e8dc27L,0x814b467e3190dcabL,0x2d4f4f316dbb1e31L },
43873       { 0x8d69811ca143b7caL,0x4ec1ac32de7cf950L,0x223ab5fd37b5fe82L,
43874         0xe82616e49390f1d9L,0xabff4b2075804610L,0x11b9be15875b08f0L } },
43875     /* 39 */
43876     { { 0x4ae31a3d3bbe682cL,0xbc7c5d2674eef2ddL,0x92afd10a3c47dd40L,
43877         0xec7e0a3bc14ab9e1L,0x6a6c3dd1b2e495e4L,0x085ee5e9309bcd85L },
43878       { 0xf381a9088c2e67fdL,0x32083a80e261eaf2L,0x0fcd6a4996deee15L,
43879         0xe3b8fb035e524c79L,0x8dc360d91d5b08b9L,0x3a06e2c87f26719fL } },
43880     /* 40 */
43881     { { 0x5cd9f5a87237cac0L,0x93f0b59d43586794L,0x4384a764e94f6c4eL,
43882         0x8304ed2bb62782d3L,0x0b8db8b3cde06015L,0x4336dd535dbe190fL },
43883       { 0x5744355392ab473aL,0x031c7275be5ed046L,0x3e78678c21909aa4L,
43884         0x4ab7e04f99202ddbL,0x2648d2066977e635L,0xd427d184093198beL } },
43885     /* 41 */
43886     { { 0x822848f50f9b5a31L,0xbb003468baadb62aL,0x233a04723357559cL,
43887         0x49ef688079aee843L,0xa89867a0aeb9e1e3L,0xc151931b1f6f9a55L },
43888       { 0xd264eb0bad74251eL,0x37b9b2634abf295eL,0xb600921b04960d10L,
43889         0x0de53dbc4da77dc0L,0x01d9bab3d2b18697L,0xad54ec7af7156ddfL } },
43890     /* 42 */
43891     { { 0x8e74dc3579efdc58L,0x456bd3694ff68ddbL,0x724e74ccd32096a5L,
43892         0xe41cff42386783d0L,0xa04c7f217c70d8a4L,0x41199d2fe61a19a2L },
43893       { 0xd389a3e029c05dd2L,0x535f2a6be7e3fda9L,0x26ecf72d7c2b4df8L,
43894         0x678275f4fe745294L,0x6319c9cc9d23f519L,0x1e05a02d88048fc4L } },
43895     /* 43 */
43896     { { 0x75cc8e2ed4d5ffe8L,0xf8bb4896dbea17f2L,0x35059790cee3cb4aL,
43897         0x4c06ee85a47c6165L,0xf98fff2592935d2fL,0x34c4a57232ffd7c7L },
43898       { 0xc4b14806ea0376a2L,0x2ea5e7504f115e02L,0x532d76e21e55d7c0L,
43899         0x68dc9411f31044daL,0x9272e46571b77993L,0xadaa38bb93a8cfd5L } },
43900     /* 44 */
43901     { { 0x4bf0c7127d4ed72aL,0xda0e9264ba1f79a3L,0x48c0258bf4c39ea4L,
43902         0xa5394ed82a715138L,0x4af511cebf06c660L,0xfcebceefec5c37cdL },
43903       { 0xf23b75aa779ae8c1L,0xdeff59ccad1e606eL,0xf3f526fd22755c82L,
43904         0x64c5ab44bb32cefdL,0xa96e11a2915bdefdL,0xab19746a1143813eL } },
43905     /* 45 */
43906     { { 0x43c78585ec837d7dL,0xca5b6fbcb8ee0ba4L,0x34e924d9d5dbb5eeL,
43907         0x3f4fa104bb4f1ca5L,0x15458b72398640f7L,0x4231faa9d7f407eaL },
43908       { 0x53e0661ef96e6896L,0x554e4c69d03b0f9dL,0xd4fcb07b9c7858d1L,
43909         0x7e95279352cb04faL,0x5f5f15748974e7f7L,0x2e3fa5586b6d57c8L } },
43910     /* 46 */
43911     { { 0x42cd48036a9951a8L,0xa8b15b8842792ad0L,0x18e8bcf9abb29a73L,
43912         0xbfd9a092409933e8L,0x760a3594efb88dc4L,0x1441886340724458L },
43913       { 0x162a56ee99caedc7L,0x8fb12ecd91d101c9L,0xea671967393202daL,
43914         0x1aac8c4aa4ccd796L,0x7db050361cf185a8L,0x0c9f86cd8cfd095aL } },
43915     /* 47 */
43916     { { 0x9a72814710b2a556L,0x767ca964327b70b2L,0x04ed9e125e3799b7L,
43917         0x6781d2dc22a3eb2aL,0x5bd116eb0d9450acL,0xeccac1fca7ebe08aL },
43918       { 0xde68444fdc2d6e94L,0x3621f42935ecf21bL,0x14e2d54329e03a2cL,
43919         0x53e42cd57d3e7f0aL,0xbba26c0973ed00b9L,0x00297c39c57d2272L } },
43920     /* 48 */
43921     { { 0x3aaaab10b8243a7dL,0x6eeef93e8fa58c5bL,0xf866fca39ae7f764L,
43922         0x64105a2661ab04d3L,0xa3578d8a03945d66L,0xb08cd3e4791b848cL },
43923       { 0x45edc5f8756d2411L,0xd4a790d9a755128cL,0xc2cf096349e5f6a0L,
43924         0xc66d267df649beaaL,0x3ce6d9688467039eL,0x50046c6b42f7816fL } },
43925     /* 49 */
43926     { { 0x92ae160266425043L,0x1ff66afdf08db890L,0x386f5a7f8f162ce5L,
43927         0x18d2dea0fcf5598fL,0x78372b3a1a8ca18eL,0xdf0d20eb8cd0e6f7L },
43928       { 0x7edd5e1d75bb4045L,0x252a47ceb96d94b7L,0xbdb293582c626776L,
43929         0x853c394340dd1031L,0x9dc9becf7d5f47fdL,0x27c2302fbae4044aL } },
43930     /* 50 */
43931     { { 0x2d1d208a8f2d49ceL,0x0d91aa02162df0a2L,0x9c5cce8709a07f65L,
43932         0xdf07238b84339012L,0x5028e2c8419442cdL,0x2dcbd35872062abaL },
43933       { 0xb5fbc3cbe4680967L,0x2a7bc6459f92d72cL,0x806c76e1116c369dL,
43934         0x5c50677a3177e8d8L,0x753739eb4569df57L,0x2d481ef636c3f40bL } },
43935     /* 51 */
43936     { { 0x1a2d39fdfea1103eL,0xeaae559295f81b17L,0xdbd0aa18f59b264aL,
43937         0x90c39c1acb592ee0L,0xdf62f80d9750cca3L,0xda4d8283df97cc6cL },
43938       { 0x0a6dd3461e201067L,0x1531f85969fb1f6bL,0x4895e5521d60121fL,
43939         0x0b21aab04c041c91L,0x9d896c46bcc1ccf8L,0xd24da3b33141bde7L } },
43940     /* 52 */
43941     { { 0x575a053753b0a354L,0x392ff2f40c6ddcd8L,0x0b8e8cff56157b94L,
43942         0x073e57bd3b1b80d1L,0x2a75e0f03fedee15L,0x752380e4aa8e6f19L },
43943       { 0x1f4e227c6558ffe9L,0x3a34861819ec5415L,0xab382d5ef7997085L,
43944         0x5e6deaffddc46ac2L,0xe5144078fc8d094cL,0xf674fe51f60e37c6L } },
43945     /* 53 */
43946     { { 0x6fb87ae5af63408fL,0xa39c36a9cd75a737L,0x7833313fcf4c618dL,
43947         0xfbcd4482f034c88dL,0x4469a76139b35288L,0x77a711c566b5d9c9L },
43948       { 0x4a695dc7944f8d65L,0xe6da5f65161aaba8L,0x8654e9c324601669L,
43949         0xbc8b93f528ae7491L,0x5f1d1e838f5580d8L,0x8ccf9a1acea32cc8L } },
43950     /* 54 */
43951     { { 0x28ab110c7196fee2L,0x75799d63874c8945L,0xa262934829aedaddL,
43952         0x9714cc7b2be88ff4L,0xf71293cfd58d60d6L,0xda6b6cb332a564e9L },
43953       { 0xf43fddb13dd821c2L,0xf2f2785f90dd323dL,0x91246419048489f8L,
43954         0x61660f26d24c6749L,0x961d9e8cc803c15cL,0x631c6158faadc4c9L } },
43955     /* 55 */
43956     { { 0xacf2ebe0fd752366L,0xb93c340e139be88bL,0x98f664850f20179eL,
43957         0x14820254ff1da785L,0x5278e2764f85c16eL,0xa246ee457aab1913L },
43958       { 0x43861eb453763b33L,0xc49f03fc45c0bc0dL,0xafff16bcad6b1ea1L,
43959         0xce33908b6fd49c99L,0x5c51e9bff7fde8c3L,0x076a7a39ff142c5eL } },
43960     /* 56 */
43961     { { 0x04639dfe9e338d10L,0x8ee6996ff42b411bL,0x960461d1a875cef2L,
43962         0x1057b6d695b4d0baL,0x27639252a906e0bcL,0x2c19f09ae1c20f8aL },
43963       { 0x5b8fc3f0eef4c43dL,0xe2e1b1a807a84aa9L,0x5f455528835d2bdbL,
43964         0x0f4aee4d207132ddL,0xe9f8338c3907f675L,0x7a874dc90e0531f0L } },
43965     /* 57 */
43966     { { 0x84b22d4597c27050L,0xbd0b8df759e70bf8L,0xb4d6740579738b9bL,
43967         0x47f4d5f5cd917c4fL,0x9099c4ce13ce6e33L,0x942bfd39521d0f8bL },
43968       { 0x5028f0f6a43b566dL,0xaf6e866921bff7deL,0x83f6f856c44232cdL,
43969         0x65680579f915069aL,0xd12095a2ecfecb85L,0xcf7f06aedb01ba16L } },
43970     /* 58 */
43971     { { 0x0f56e3c48ef96c80L,0xd521f2b33ddb609cL,0x2be941027dc1450dL,
43972         0x2d21a07102a91fe2L,0x2e6f74fa1efa37deL,0x9a9a90b8156c28a1L },
43973       { 0xc54ea9ea9dc7dfcbL,0xc74e66fc2c2c1d62L,0x9f23f96749d3e067L,
43974         0x1c7c3a4654dd38adL,0xc70058845946cee3L,0x8985636845cc045dL } },
43975     /* 59 */
43976     { { 0x29da7cd4fce73946L,0x8f697db523168563L,0x8e235e9ccba92ec6L,
43977         0x55d4655f9f91d3eaL,0xf3689f23aa50a6cdL,0xdcf21c2621e6a1a0L },
43978       { 0xcffbc82e61b818bfL,0xc74a2f96da47a243L,0x234e980a8bc1a0cfL,
43979         0xf35fd6b57929cb6dL,0x81468e12efe17d6cL,0xddea6ae558b2dafbL } },
43980     /* 60 */
43981     { { 0x294de8877e787b2eL,0x258acc1f39a9310dL,0x92d9714aac14265dL,
43982         0x18b5591c708b48a0L,0x27cc6bb0e1abbf71L,0xc0581fa3568307b9L },
43983       { 0x9e0f58a3f24d4d58L,0xfebe9bb8e0ce2327L,0x91fd6a419d1be702L,
43984         0x9a7d8a45facac993L,0xabc0a08c9e50d66dL,0x02c342f706498201L } },
43985     /* 61 */
43986     { { 0xccd71407157bdbc2L,0x72fa89c6ad0e1605L,0xb1d3da2bb92a015fL,
43987         0x8ad9e7cda0a3fe56L,0x160edcbd24f06737L,0x79d4db3361275be6L },
43988       { 0xd3d31fd95f3497c4L,0x8cafeaee04192fb0L,0xe13ca74513a50af3L,
43989         0x188261678c85aae5L,0xce06cea89eb556ffL,0x2eef1995bdb549f3L } },
43990     /* 62 */
43991     { { 0x8ed7d3eb50596edcL,0xaa359362905243a2L,0xa212c2c2a4b6d02bL,
43992         0x611fd727c4fbec68L,0x8a0b8ff7b84f733dL,0xd85a6b905f0daf0eL },
43993       { 0x60e899f5d4091cf7L,0x4fef2b672eff2768L,0xc1f195cb10c33964L,
43994         0x8275d36993626a8fL,0xc77904f40d6c840aL,0x88d8b7fd7a868acdL } },
43995     /* 63 */
43996     { { 0x85f237237bd98425L,0xd4463992c70b154eL,0xcbb00ee296687a2eL,
43997         0x905fdbf7c83214fdL,0x2019d29313593684L,0x0428c393ef51218eL },
43998       { 0x40c7623f981e909aL,0x925133857be192daL,0x48fe480f4010907eL,
43999         0xdd7a187c3120b459L,0xc9d7702da1fd8f3cL,0x66e4753be358efc5L } },
44000     /* 64 */
44001     { { 0x070d34e116973cf4L,0x20aee08b7e4f34f7L,0x269af9b95eb8ad29L,
44002         0xdde0a036a6a45ddaL,0xa18b528e63df41e0L,0x03cc71b2a260df2aL },
44003       { 0x24a6770aa06b1dd7L,0x5bfa9c119d2675d3L,0x73c1e2a196844432L,
44004         0x3660558d131a6cf0L,0xb0289c832ee79454L,0xa6aefb01c6d8ddcdL } },
44005     /* 65 */
44006     { { 0xba1464b401ab5245L,0x9b8d0b6dc48d93ffL,0x939867dc93ad272cL,
44007         0xbebe085eae9fdc77L,0x73ae5103894ea8bdL,0x740fc89a39ac22e1L },
44008       { 0x5e28b0a328e23b23L,0x2352722ee13104d0L,0xf4667a18b0a2640dL,
44009         0xac74a72e49bb37c3L,0x79f734f0e81e183aL,0xbffe5b6c3fd9c0ebL } },
44010     /* 66 */
44011     { { 0xb1a358f5c6a2123fL,0x927b2d95fe28df6dL,0x89702753f199d2f9L,
44012         0x0a73754c1a3f82dcL,0x063d029d777affe1L,0x5439817edae6d34dL },
44013       { 0xf7979eef6b8b83c4L,0x615cb2149d945682L,0x8f0e4facc5e57eaeL,
44014         0x042b89b8113047ddL,0x888356dc93f36508L,0xbf008d185fd1f32fL } },
44015     /* 67 */
44016     { { 0x8012aa244e8068dbL,0xc72cc641a5729a47L,0x3c33df2c43f0691dL,
44017         0xfa0573471d92145fL,0xaefc0f2fb97f7946L,0x813d75cb2f8121bfL },
44018       { 0x05613c724383bba6L,0xa924ce70a4224b3fL,0xe59cecbe5f2179a6L,
44019         0x78e2e8aa79f62b61L,0x3ac2cc3b53ad8079L,0x55518d71d8f4fa96L } },
44020     /* 68 */
44021     { { 0x03cf292200623f3bL,0x095c71115f29ebffL,0x42d7224780aa6823L,
44022         0x044c7ba17458c0b0L,0xca62f7ef0959ec20L,0x40ae2ab7f8ca929fL },
44023       { 0xb8c5377aa927b102L,0x398a86a0dc031771L,0x04908f9dc216a406L,
44024         0xb423a73a918d3300L,0x634b0ff1e0b94739L,0xe29de7252d69f697L } },
44025     /* 69 */
44026     { { 0x744d14008435af04L,0x5f255b1dfec192daL,0x1f17dc12336dc542L,
44027         0x5c90c2a7636a68a8L,0x960c9eb77704ca1eL,0x9de8cf1e6fb3d65aL },
44028       { 0xc60fee0d511d3d06L,0x466e2313f9eb52c7L,0x743c0f5f206b0914L,
44029         0x42f55bac2191aa4dL,0xcefc7c8fffebdbc2L,0xd4fa6081e6e8ed1cL } },
44030     /* 70 */
44031     { { 0xb5e405d3b0ab9645L,0xaeec7f98d5f1f711L,0x8ad42311585c2a6eL,
44032         0x045acb9e512c6944L,0xae106c4ea90db1c6L,0xb89f33d5898e6563L },
44033       { 0x43b07cd97fed2ce4L,0xf9934e17dd815b20L,0x6778d4d50a81a349L,
44034         0x9e616ade52918061L,0xfa06db06d7e67112L,0x1da23cf188488091L } },
44035     /* 71 */
44036     { { 0x821c46b342f2c4b5L,0x931513ef66059e47L,0x7030ae4366f50cd1L,
44037         0x43b536c943e7b127L,0x006258cf5fca5360L,0xe4e3ee796b557abfL },
44038       { 0xbb6b390024c8b22fL,0x2eb5e2c1fcbf1054L,0x937b18c9567492afL,
44039         0xf09432e4acf53957L,0x585f5a9d1dbf3a56L,0xf86751fdbe0887cfL } },
44040     /* 72 */
44041     { { 0x157399cb9d10e0b2L,0x1c0d595660dc51b7L,0x1d496b8a1f583090L,
44042         0x6658bc2688590484L,0x88c08ab703213f28L,0x8d2e0f737ae58de4L },
44043       { 0x9b79bc95486cfee6L,0x036a26c7e9e5bc57L,0x1ad03601cd8ae97aL,
44044         0x06907f87ff3a0494L,0x078f4bbf2c7eb584L,0xe3731bf57e8d0a5aL } },
44045     /* 73 */
44046     { { 0x72f2282be1cd0abeL,0xd4f9015e87efefa2L,0x9d1898066c3834bdL,
44047         0x9c8cdcc1b8a29cedL,0x0601b9f4fee82ebcL,0x371052bc7206a756L },
44048       { 0x76fa109246f32562L,0xdaad534c17351bb4L,0xc3d64c37b3636bb5L,
44049         0x038a8c5145d54e00L,0x301e618032c09e7cL,0x9764eae795735151L } },
44050     /* 74 */
44051     { { 0x8791b19fcbd5256aL,0x4007e0f26ca13a3bL,0x03b794604cf06904L,
44052         0xb18a9c22b6c17589L,0xa1cb7d7d81d45908L,0x6e13fa9d21bb68f1L },
44053       { 0x47183c62a71e6e16L,0x5cf0ef8ee18749edL,0x2c9c7f9b2e5ed409L,
44054         0x042eeacce6e117e1L,0xb86d481613fb5a7fL,0xea1cf0edc9e5feb1L } },
44055     /* 75 */
44056     { { 0x6e6573c9cea4cc9bL,0x5417961dafcec8f3L,0x804bf02aa438b6f6L,
44057         0xb894b03cdcd4ea88L,0xd0f807e93799571fL,0x3466a7f5862156e8L },
44058       { 0x51e59acd56515664L,0x55b0f93ca3c5eb0bL,0x84a06b026a4279dbL,
44059         0x5c850579c5fae08eL,0xcf07b8dba663a1a2L,0x49a36bbcf46ffc8dL } },
44060     /* 76 */
44061     { { 0xe47f5acc46d93106L,0x65b7ade0aa897c9cL,0x37cf4c9412d7e4beL,
44062         0xa2ae9b80d4b2caa9L,0x5e7ce09ce60357a3L,0x29f77667c8ecd5f9L },
44063       { 0xdf6868f5a8a0b1c5L,0x240858cf62978ad8L,0x0f7ac101dc0002a1L,
44064         0x1d28a9d7ffe9aa05L,0x744984d65b962c97L,0xa8a7c00b3d28c8b2L } },
44065     /* 77 */
44066     { { 0x7c58a852ae11a338L,0xa78613f1d1af96e7L,0x7e9767d25355cc73L,
44067         0x6ba37009792a2de6L,0x7d60f618124386b2L,0xab09b53111157674L },
44068       { 0x95a0484198eb9dd0L,0xe6c17acc15070328L,0xafc6da45489c6e49L,
44069         0xab45a60abb211530L,0xc58d65927d7ea933L,0xa3ef3c65095642c6L } },
44070     /* 78 */
44071     { { 0x89d420e9df010879L,0x9d25255d39576179L,0x9cdefd50e39513b6L,
44072         0xe4efe45bd5d1c313L,0xc0149de73f7af771L,0x55a6b4f4340ab06bL },
44073       { 0xf1325251ebeaf771L,0x2ab44128878d4288L,0xfcd5832e18e05afeL,
44074         0xef52a348cc1fb62bL,0x2bd08274c1c4792aL,0x345c5846877c6dc7L } },
44075     /* 79 */
44076     { { 0xde15ceb0bea65e90L,0x0987f72b2416d99cL,0x44db578dfd863decL,
44077         0xf617b74bac6a3578L,0x9e62bd7adb48e999L,0x877cae61eab1a1beL },
44078       { 0x23adddaa3a358610L,0x2fc4d6d1325e2b07L,0x897198f51585754eL,
44079         0xf741852cb392b584L,0x9927804cb55f7de1L,0xe9e6c4ed1aa8efaeL } },
44080     /* 80 */
44081     { { 0x867db63998683186L,0xfb5cf424ddcc4ea9L,0xcc9a7ffed4f0e7bdL,
44082         0x7c57f71c7a779f7eL,0x90774079d6b25ef2L,0x90eae903b4081680L },
44083       { 0xdf2aae5e0ee1fcebL,0x3ff1da24e86c1a1fL,0x80f587d6ca193edfL,
44084         0xa5695523dc9b9d6aL,0x7b84090085920303L,0x1efa4dfcba6dbdefL } },
44085     /* 81 */
44086     { { 0xfbd838f9e0540015L,0x2c323946c39077dcL,0x8b1fb9e6ad619124L,
44087         0x9612440c0ca62ea8L,0x9ad9b52c2dbe00ffL,0xf52abaa1ae197643L },
44088       { 0xd0e898942cac32adL,0xdfb79e4262a98f91L,0x65452ecf276f55cbL,
44089         0xdb1ac0d27ad23e12L,0xf68c5f6ade4986f0L,0x389ac37b82ce327dL } },
44090     /* 82 */
44091     { { 0x511188b4f8e60f5bL,0x7fe6701548aa2adaL,0xdb333cb8381abca2L,
44092         0xb15e6d9ddaf3fc97L,0x4b24f6eb36aabc03L,0xc59789df72a748b4L },
44093       { 0x26fcb8a529cf5279L,0x7a3c6bfc01ad9a6cL,0x866cf88d4b8bac9bL,
44094         0xf4c899899c80d041L,0xf0a0424170add148L,0x5a02f47945d81a41L } },
44095     /* 83 */
44096     { { 0xfa5c877cc1c90202L,0xd099d440f8ac7570L,0x428a5b1bd17881f7L,
44097         0x61e267db5b2501d7L,0xf889bf04f2e4465bL,0x4da3ae0876aa4cb8L },
44098       { 0x3ef0fe26e3e66861L,0x5e7729533318b86dL,0xc3c35fbc747396dfL,
44099         0x5115a29c439ffd37L,0xbfc4bd97b2d70374L,0x088630ea56246b9dL } },
44100     /* 84 */
44101     { { 0xcd96866db8a9e8c9L,0xa11963b85bb8091eL,0xc7f90d53045b3cd2L,
44102         0x755a72b580f36504L,0x46f8b39921d3751cL,0x4bffdc9153c193deL },
44103       { 0xcd15c049b89554e7L,0x353c6754f7a26be6L,0x79602370bd41d970L,
44104         0xde16470b12b176c0L,0x56ba117540c8809dL,0xe2db35c3e435fb1eL } },
44105     /* 85 */
44106     { { 0xd71e4aab6328e33fL,0x5486782baf8136d1L,0x07a4995f86d57231L,
44107         0xf1f0a5bd1651a968L,0xa5dc5b2476803b6dL,0x5c587cbc42dda935L },
44108       { 0x2b6cdb32bae8b4c0L,0x66d1598bb1331138L,0x4a23b2d25d7e9614L,
44109         0x93e402a674a8c05dL,0x45ac94e6da7ce82eL,0xeb9f8281e463d465L } },
44110     /* 86 */
44111     { { 0x34e0f9d1fecf5b9bL,0xa115b12bf206966aL,0x5591cf3b1eaa0534L,
44112         0x5f0293cbfb1558f9L,0x1c8507a41bc703a5L,0x92e6b81c862c1f81L },
44113       { 0xcc9ebc66cdaf24e3L,0x68917ecd72fcfc70L,0x6dc9a9308157ba48L,
44114         0x5d425c08b06ab2b2L,0x362f8ce736e929c4L,0x09f6f57c62e89324L } },
44115     /* 87 */
44116     { { 0x1c7d6b78d29375fbL,0xfabd851ee35d1157L,0xf6f62dcd4243ea47L,
44117         0x1dd924608fe30b0fL,0x08166dfaffc6e709L,0xc6c4c6930881e6a7L },
44118       { 0x20368f87d6a53fb0L,0x38718e9f9eb4d1f9L,0x03f08acdafd7e790L,
44119         0x0835eb4472fe2a1cL,0x7e05090388076e5dL,0x538f765ea638e731L } },
44120     /* 88 */
44121     { { 0x0e0249d9c2663b4bL,0xe700ab5b47cd38ddL,0xb192559d2c46559fL,
44122         0x8f9f74a84bcde66dL,0xad1615233e2aced5L,0xc155c0473dd03a5bL },
44123       { 0x346a87993be454ebL,0x66ee94db83b7dccdL,0x1f6d8378ab9d2abeL,
44124         0x4a396dd27733f355L,0x419bd40af53553c2L,0xd0ead98d731dd943L } },
44125     /* 89 */
44126     { { 0x908e0b0eec142408L,0x98943cb94114b310L,0x03dbf7d81742b1d7L,
44127         0xd270df6b693412f4L,0xc50654948f69e20cL,0xa76a90c3697e43a1L },
44128       { 0xe0fa33844624825aL,0x82e48c0b8acc34c2L,0x7b24bd14e9a14f2bL,
44129         0x4f5dd5e24db30803L,0x0c77a9e7932da0a3L,0x20db90f274c653dcL } },
44130     /* 90 */
44131     { { 0x261179b70e6c5fd9L,0xf8bec1236c982eeaL,0x47683338d4957b7eL,
44132         0xcc47e6640a72f66aL,0xbd54bf6a1bad9350L,0xdfbf4c6af454e95aL },
44133       { 0x3f7a7afa6907f4faL,0x7311fae0865ca735L,0x24737ab82a496adaL,
44134         0x13e425f115feb79bL,0xe9e97c50a1b93c21L,0xb26b6eac4ddd3eb5L } },
44135     /* 91 */
44136     { { 0x81cab9f52a2e5f2bL,0xf93caf29bf385ac4L,0xf4bf35c3c909963aL,
44137         0x081e730074c9143cL,0x3ea57fa8c281b4c5L,0xe497905c9b340741L },
44138       { 0xf556dd8a55ab3cfbL,0xd444b96b518db6adL,0x34f5425a5ef4b955L,
44139         0xdda7a3acecd26aa3L,0xb57da11bda655e97L,0x02da3effc2024c70L } },
44140     /* 92 */
44141     { { 0xe24b00366481d0d9L,0x3740dbe5818fdfe2L,0xc1fc1f45190fda00L,
44142         0x329c92803cf27fdeL,0x7435cb536934f43eL,0x2b505a5d7884e8feL },
44143       { 0x6cfcc6a6711adcc9L,0xf034325c531e21e1L,0xa2f4a9679b2a8a99L,
44144         0x9d5f38423c21bdffL,0xb25c781131b57d66L,0xdb5344d80b8093b9L } },
44145     /* 93 */
44146     { { 0x0d72e667ae50a2f5L,0x9b7f8d8ae4a861d1L,0xa129f70f330df1cbL,
44147         0xe90aa5d7e04fefc3L,0xff561ecbe72c3ae1L,0x0d8fb428cdb955faL },
44148       { 0xd2235f73d7663784L,0xc05baec67e2c456aL,0xe5c292e42adbfcccL,
44149         0x4fd17988efb110d5L,0x27e57734d19d49f3L,0x188ac4ce84f679feL } },
44150     /* 94 */
44151     { { 0x7ee344cfa796c53eL,0xbbf6074d0868009bL,0x1f1594f7474a1295L,
44152         0x66776edcac11632dL,0x1862278b04e2fa5aL,0x52665cf2c854a89aL },
44153       { 0x7e3764648104ab58L,0x167759137204fd6dL,0x86ca06a544ea1199L,
44154         0xaa3f765b1c9240ddL,0x5f8501a924746149L,0x7b982e30dcd251d7L } },
44155     /* 95 */
44156     { { 0xe44e9efcc15f3060L,0x5ad62f2ea87ebbe6L,0x36499d41c79500d4L,
44157         0xa66d6dc0336fa9d1L,0xf8afc4955afd3b1fL,0x1d8ccb24e5c9822bL },
44158       { 0x4031422b79d7584bL,0xc54a0580ea3f20ddL,0x3f837c8f958468c5L,
44159         0x3d82f110fbea7735L,0x679a87787dffe2fcL,0x48eba63b20704803L } },
44160     /* 96 */
44161     { { 0x89b10d41df46e2f6L,0x13ab57f819514367L,0x067372b91d469c87L,
44162         0x0c195afa4f6c5798L,0xea43a12a272c9acfL,0x9dadd8cb678abdacL },
44163       { 0xcce56c6be182579aL,0x86febadb2d26c2d8L,0x1c668ee12a44745cL,
44164         0x580acd8698dc047aL,0x5a2b79cc51b9ec2dL,0x007da6084054f6a0L } },
44165     /* 97 */
44166     { { 0x9e3ca35217b00dd0L,0x046779cb0e81a7a6L,0xb999fef3d482d871L,
44167         0xe6f38134d9233fbcL,0x112c3001f48cd0e0L,0x934e75763c6c66aeL },
44168       { 0xb44d4fc3d73234dcL,0xfcae2062864eafc1L,0x843afe2526bef21aL,
44169         0x61355107f3b75fdfL,0x8367a5aa794c2e6bL,0x3d2629b18548a372L } },
44170     /* 98 */
44171     { { 0x6230618f437cfaf8L,0x5b8742cb2032c299L,0x949f72472293643aL,
44172         0xb8040f1a09464f79L,0x049462d24f254143L,0xabd6b522366c7e76L },
44173       { 0x119b392bd5338f55L,0x1a80a9ce01495a0cL,0xf3118ca7f8d7537eL,
44174         0xb715adc26bf4b762L,0x24506165a8482b6cL,0xd958d7c696a7c84dL } },
44175     /* 99 */
44176     { { 0x9ad8aa87bdc21f31L,0xadb3cab48063e58cL,0xefd86283b07dd7b8L,
44177         0xc7b9b7621be7c6b4L,0x2ef58741015582deL,0xc970c52e299addf3L },
44178       { 0x78f02e2a22f24d66L,0xefec1d1074cc100aL,0xaf2a6a3909316e1aL,
44179         0xce7c22055849dd49L,0x9c1fe75c96bffc4cL,0xcad98fd27ba06ec0L } },
44180     /* 100 */
44181     { { 0xed76e2d0b648b73eL,0xa9f92ce51cfd285eL,0xa8c86c062ed13de1L,
44182         0x1d3a574ea5191a93L,0x385cdf8b1ad1b8bfL,0xbbecc28a47d2cfe3L },
44183       { 0x98d326c069cec548L,0x4f5bc1ddf240a0b2L,0x241a706229057236L,
44184         0x0fc6e9c5c68294a4L,0x4d04838ba319f17aL,0x8b612cf19ffc1c6fL } },
44185     /* 101 */
44186     { { 0x9bb0b5014c3830ebL,0x3d08f83c8ee0d0c5L,0xa4a6264279ba9389L,
44187         0x5d5d40449cbc2914L,0xae9eb83e074c46f0L,0x63bb758f74ead7d6L },
44188       { 0x1c40d2eac6bb29e0L,0x95aa2d874b02f41eL,0x9298917553cb199aL,
44189         0xdd91bafe51584f6dL,0x3715efb931a1aaecL,0xc1b6ae5b46780f9eL } },
44190     /* 102 */
44191     { { 0xcded3e4b42772f41L,0x3a700d5d3bcb79d1L,0x4430d50e80feee60L,
44192         0x444ef1fcf5e5d4bbL,0xc660194fe6e358ffL,0xe68a2f326a91b43cL },
44193       { 0x5842775c977fe4d2L,0x78fdef5c7e2a41ebL,0x5f3bec02ff8df00eL,
44194         0xf4b840cd5852525dL,0x0870483a4e6988bdL,0x39499e39cc64b837L } },
44195     /* 103 */
44196     { { 0xfc05de80b08df5feL,0x0c12957c63ba0362L,0xea379414d5cf1428L,
44197         0xc559132a54ef6216L,0x33d5f12fb9e65cf8L,0x09c602781695d663L },
44198       { 0x3ac1ced461f7a2fbL,0xdd838444d4f5eeb8L,0x82a38c6c8318fcadL,
44199         0x315be2e5e9f1a864L,0x317b5771442daf47L,0x81b5904a95aa5f9eL } },
44200     /* 104 */
44201     { { 0x6b6b1c508b21d232L,0x87f3dbc08c2cba75L,0xa7e74b46ae9f0fafL,
44202         0x036a0985bb7b8079L,0x4f185b908d974a25L,0x5aa7cef0d9af5ec9L },
44203       { 0xe0566a7057dcfffcL,0x6ea311dab8453225L,0x72ea1a8d23368aa9L,
44204         0xed9b208348cd552dL,0xb987967cc80ea435L,0xad735c756c104173L } },
44205     /* 105 */
44206     { { 0xaea85ab3cee76ef4L,0x44997444af1d2b93L,0x0851929beacb923fL,
44207         0xb080b59051e3bc0cL,0xc4ee1d8659be68a2L,0xf00de21964b26cdaL },
44208       { 0x8d7fb5c0f2e90d4dL,0x00e219a777d9ec64L,0xc4e6febd5d1c491cL,
44209         0x080e37541a8f4585L,0x4a9b86c848d2af9cL,0x2ed70db6b6679851L } },
44210     /* 106 */
44211     { { 0xaee44116586f25cbL,0xf7b6861fa0fcf70fL,0x55d2cd2018a350e8L,
44212         0x861bf3e592dc286fL,0x9ab18ffa6226aba7L,0xd15827bea9857b03L },
44213       { 0x26c1f54792e6acefL,0x422c63c8ac1fbac3L,0xa2d8760dfcbfd71dL,
44214         0x35f6a539b2511224L,0xbaa88fa1048d1a21L,0x49f1abe9ebf999dbL } },
44215     /* 107 */
44216     { { 0x16f9f4f4f7492b73L,0xcf28ec1ecb392b1aL,0x45b130d469ca6ffcL,
44217         0x28ba8d40b72efa58L,0xace987c75ca066f5L,0x3e3992464ad022ebL },
44218       { 0x63a2d84e752555bbL,0xaaa93b4a9c2ae394L,0xcd80424ec89539caL,
44219         0x6d6b5a6daa119a99L,0xbd50334c379f2629L,0x899e925eef3cc7d3L } },
44220     /* 108 */
44221     { { 0xb7ff3651bf825dc4L,0x0f741cc440b9c462L,0x771ff5a95cc4fb5bL,
44222         0xcb9e9c9b47fd56feL,0xbdf053db5626c0d3L,0xa97ce675f7e14098L },
44223       { 0x68afe5a36c934f5eL,0x6cd5e148ccefc46fL,0xc7758570d7a88586L,
44224         0x49978f5edd558d40L,0xa1d5088a64ae00c1L,0x58f2a720f1d65bb2L } },
44225     /* 109 */
44226     { { 0x66fdda4a3e4daedbL,0x38318c1265d1b052L,0x28d910a24c4bbf5cL,
44227         0x762fe5c478a9cd14L,0x08e5ebaad2cc0aeeL,0xd2cdf257ca0c654cL },
44228       { 0x48f7c58b08b717d2L,0x3807184a386cd07aL,0x3240f626ae7d0112L,
44229         0x03e9361bc43917b0L,0xf261a87620aea018L,0x53f556a47e1e6372L } },
44230     /* 110 */
44231     { { 0xc84cee562f512a90L,0x24b3c0041b0ea9f1L,0x0ee15d2de26cc1eaL,
44232         0xd848762cf0c9ef7dL,0x1026e9c5d5341435L,0x8f5b73dcfdb16b31L },
44233       { 0x1f69bef2d2c75d95L,0x8d33d581be064ddaL,0x8c024c1257ed35e6L,
44234         0xf8d435f9c309c281L,0xfd295061d6960193L,0x66618d78e9e49541L } },
44235     /* 111 */
44236     { { 0x571cfd458ce382deL,0x175806eede900ddeL,0x6184996534aba3b5L,
44237         0xe899778ade7aec95L,0xe8f00f6eff4aa97fL,0xae971cb5010b0c6dL },
44238       { 0x1827eebc3af788f1L,0xd46229ffe413fe2dL,0x8a15455b4741c9b4L,
44239         0x5f02e690f8e424ebL,0x40a1202edae87712L,0x49b3bda264944f6dL } },
44240     /* 112 */
44241     { { 0xd63c6067035b2d69L,0xb507150d6bed91b0L,0x1f35f82f7afb39b2L,
44242         0xb9bd9c0116012b66L,0x00d97960ed0a5f50L,0xed7054512716f7c9L },
44243       { 0x1576eff4127abdb4L,0x6850d698f01e701cL,0x9fa7d7493fc87e2fL,
44244         0x0b6bcc6fb0ce3e48L,0xf4fbe1f5f7d8c1c0L,0xcf75230e02719cc6L } },
44245     /* 113 */
44246     { { 0x6761d6c2722d94edL,0xd1ec3f213718820eL,0x65a40b7025d0e7c6L,
44247         0xd67f830ebaf3cf31L,0x633b3807b93ea430L,0x17faa0ea0bc96c69L },
44248       { 0xe6bf3482df866b98L,0x205c1ee9a9db52d4L,0x51ef9bbdff9ab869L,
44249         0x3863dad175eeb985L,0xef216c3bd3cf442aL,0x3fb228e3f9c8e321L } },
44250     /* 114 */
44251     { { 0x94f9b70c0760ac07L,0xf3c9ccae9d79bf4dL,0x73cea084c5ffc83dL,
44252         0xef50f943dc49c38eL,0xf467a2aebc9e7330L,0x5ee534b644ea7fbaL },
44253       { 0x20cb627203609e7fL,0x0984435562fdc9f0L,0xaf5c8e580f1457f7L,
44254         0xd1f50a6cb4b25941L,0x77cb247c2ec82395L,0xa5f3e1e5da3dca33L } },
44255     /* 115 */
44256     { { 0x023489d67d85fa94L,0x0ba405372db9ce47L,0x0fdf7a1faed7aad1L,
44257         0xa57b0d739a4ccb40L,0x48fcec995b18967cL,0xf30b5b6eb7274d24L },
44258       { 0x7ccb4773c81c5338L,0xb85639e6a3ed6bd0L,0x7d9df95f1d56eadaL,
44259         0xe256d57f0a1607adL,0x6da7ffdc957574d6L,0x65f8404601c7a8c4L } },
44260     /* 116 */
44261     { { 0x8d45d0cbcba1e7f1L,0xef0a08c002b55f64L,0x771ca31b17e19892L,
44262         0xe1843ecb4885907eL,0x67797ebc364ce16aL,0x816d2b2d8df4b338L },
44263       { 0xe870b0e539aa8671L,0x9f0db3e4c102b5f5L,0x342966591720c697L,
44264         0x0ad4c89e613c0d2aL,0x1af900b2418ddd61L,0xe087ca72d336e20eL } },
44265     /* 117 */
44266     { { 0x222831ffaba10079L,0x0dc5f87b6d64fff2L,0x445479073e8cb330L,
44267         0xe815aaa2702a33fbL,0x338d6b2e5fba3215L,0x0f7535cb79f549c8L },
44268       { 0x471ecd972ee95923L,0x1e868b37c6d1c09fL,0x2bc7b8ecc666ef4eL,
44269         0xf5416589808a4bfcL,0xf23e9ee23fbc4d2eL,0x4357236c2d75125bL } },
44270     /* 118 */
44271     { { 0xfe176d95ba9cdb1bL,0x45a1ca012f82791eL,0x97654af24de4cca2L,
44272         0xbdbf9d0e5cc4bcb9L,0xf6a7df50ad97ac0aL,0xc52112b061359fd6L },
44273       { 0x696d9ce34f05eae3L,0x903adc02e943ac2bL,0xa90753470848be17L,
44274         0x1e20f1702a3973e5L,0xe1aacc1c6feb67e9L,0x2ca0ac32e16bc6b9L } },
44275     /* 119 */
44276     { { 0xffea12e4ef871eb5L,0x94c2f25da8bf0a7aL,0x4d1e4c2a78134eaaL,
44277         0x11ed16fb0360fb10L,0x4029b6db85fc11beL,0x5e9f7ab7f4d390faL },
44278       { 0x5076d72f30646612L,0xa0afed1ddda1d0d8L,0x2902225785a1d103L,
44279         0xcb499e174e276bcdL,0x16d1da7151246c3dL,0xc72d56d3589a0443L } },
44280     /* 120 */
44281     { { 0xdf5ffc74dae5bb45L,0x99068c4a261bd6dcL,0xdc0afa7aaa98ec7bL,
44282         0xedd2ee00f121e96dL,0x163cc7be1414045cL,0xb0b1bbce335af50eL },
44283       { 0xd440d78501a06293L,0xcdebab7c6552e644L,0x48cb8dbc8c757e46L,
44284         0x81f9cf783cabe3cbL,0xddd02611b123f59aL,0x3dc7b88eeeb3784dL } },
44285     /* 121 */
44286     { { 0xe1b8d398c4741456L,0xa9dfa9026032a121L,0x1cbfc86d1263245bL,
44287         0xf411c7625244718cL,0x96521d5405b0fc54L,0x1afab46edbaa4985L },
44288       { 0xa75902ba8674b4adL,0x486b43ad5ad87d12L,0x72b1c73636e0d099L,
44289         0x39890e07bb6cd6d6L,0x8128999c59bace4eL,0xd8da430b7b535e33L } },
44290     /* 122 */
44291     { { 0x39f65642c6b75791L,0x050947a621806bfbL,0x0ca3e3701362ef84L,
44292         0x9bc60aed8c3d2391L,0x9b488671732e1ddcL,0x12d10d9ea98ee077L },
44293       { 0xb6f2822d3651b7dcL,0x6345a5ba80abd138L,0x62033262472d3c84L,
44294         0xd54a1d40acc57527L,0x6ea46b3a424447cbL,0x5bc410572fb1a496L } },
44295     /* 123 */
44296     { { 0xe70c57a3a751cd0eL,0x190d8419eba3c7d6L,0xb1c3bee79d47d55aL,
44297         0xda941266f912c6d8L,0x12e9aacc407a6ad6L,0xd6ce5f116e838911L },
44298       { 0x063ca97b70e1f2ceL,0xa3e47c728213d434L,0xa016e24184df810aL,
44299         0x688ad7b0dfd881a4L,0xa37d99fca89bf0adL,0xd8e3f339a23c2d23L } },
44300     /* 124 */
44301     { { 0xbdf53163750bed6fL,0x808abc3283e68b0aL,0x85a366275bb08a33L,
44302         0xf72a3a0f6b0e4abeL,0xf7716d19faf0c6adL,0x22dcc0205379b25fL },
44303       { 0x7400bf8df9a56e11L,0x6cb8bad756a47f21L,0x7c97176f7a6eb644L,
44304         0xe8fd84f7d1f5b646L,0x98320a9444ddb054L,0x07071ba31dde86f5L } },
44305     /* 125 */
44306     { { 0x6fdfa0e598f8fcb9L,0x89cec8e094d0d70cL,0xa0899397106d20a8L,
44307         0x915bfb9aba8acc9cL,0x1370c94b5507e01cL,0x83246a608a821ffbL },
44308       { 0xa8273a9fbe3c378fL,0x7e54478935a25be9L,0x6cfa49724dd929d7L,
44309         0x987fed9d365bd878L,0x4982ac945c29a7aeL,0x4589a5d75ddd7ec5L } },
44310     /* 126 */
44311     { { 0x9fabb174a95540a9L,0x7cfb886f0162c5b0L,0x17be766bea3dee18L,
44312         0xff7da41fe88e624cL,0xad0b71eb8b919c38L,0x86a522e0f31ff9a9L },
44313       { 0xbc8e6f72868bc259L,0x6130c6383ccef9e4L,0x09f1f4549a466555L,
44314         0x8e6c0f0919b2bfb4L,0x945c46c90ca7bb22L,0xacd871684dafb67bL } },
44315     /* 127 */
44316     { { 0x090c72ca10c53841L,0xc20ae01b55a4fcedL,0x03f7ebd5e10234adL,
44317         0xb3f42a6a85892064L,0xbdbc30c0b4a14722L,0x971bc4378ca124ccL },
44318       { 0x6f79f46d517ff2ffL,0x6a9c96e2ecba947bL,0x5e79f2f462925122L,
44319         0x30a96bb16a4e91f1L,0x1147c9232d4c72daL,0x65bc311f5811e4dfL } },
44320     /* 128 */
44321     { { 0x87c7dd7d139b3239L,0x8b57824e4d833baeL,0xbcbc48789fff0015L,
44322         0x8ffcef8b909eaf1aL,0x9905f4eef1443a78L,0x020dd4a2e15cbfedL },
44323       { 0xca2969eca306d695L,0xdf940cadb93caf60L,0x67f7fab787ea6e39L,
44324         0x0d0ee10ff98c4fe5L,0xc646879ac19cb91eL,0x4b4ea50c7d1d7ab4L } },
44325     /* 129 */
44326     { { 0x19e409457a0db57eL,0xe6017cad9a8c9702L,0xdbf739e51be5cff9L,
44327         0x3646b3cda7a938a2L,0x0451108568350dfcL,0xad3bd6f356e098b5L },
44328       { 0x935ebabfee2e3e3eL,0xfbd01702473926cbL,0x7c735b029e9fb5aaL,
44329         0xc52a1b852e3feff0L,0x9199abd3046b405aL,0xe306fcec39039971L } },
44330     /* 130 */
44331     { { 0xd6d9aec823e4712cL,0x7ca8376cc3c198eeL,0xe6d8318731bebd8aL,
44332         0xed57aff3d88bfef3L,0x72a645eecf44edc7L,0xd4e63d0b5cbb1517L },
44333       { 0x98ce7a1cceee0ecfL,0x8f0126335383ee8eL,0x3b879078a6b455e8L,
44334         0xcbcd3d96c7658c06L,0x721d6fe70783336aL,0xf21a72635a677136L } },
44335     /* 131 */
44336     { { 0x19d8b3cd9586ba11L,0xd9e0aeb28a5c0480L,0xe4261dbf2230ef5cL,
44337         0x095a9dee02e6bf09L,0x8963723c80dc7784L,0x5c97dbaf145157b1L },
44338       { 0x97e744344bc4503eL,0x0fb1cb3185a6b370L,0x3e8df2becd205d4bL,
44339         0x497dd1bcf8f765daL,0x92ef95c76c988a1aL,0x3f924baa64dc4cfaL } },
44340     /* 132 */
44341     { { 0x6bf1b8dd7268b448L,0xd4c28ba1efd79b94L,0x2fa1f8c8e4e3551fL,
44342         0x769e3ad45c9187a9L,0x28843b4d40326c0dL,0xfefc809450d5d669L },
44343       { 0x30c85bfd90339366L,0x4eeb56f15ccf6c3aL,0x0e72b14928ccd1dcL,
44344         0x73ee85b5f2ce978eL,0xcdeb2bf33165bb23L,0x8106c9234e410abfL } },
44345     /* 133 */
44346     { { 0xc8df01617d02f4eeL,0x8a78154718e21225L,0x4ea895eb6acf9e40L,
44347         0x8b000cb56e5a633dL,0xf31d86d57e981ffbL,0xf5c8029c4475bc32L },
44348       { 0x764561ce1b568973L,0x2f809b81a62996ecL,0x9e513d64da085408L,
44349         0xc27d815de61ce309L,0x0da6ff99272999e0L,0xbd284779fead73f7L } },
44350     /* 134 */
44351     { { 0x6033c2f99b1cdf2bL,0x2a99cf06bc5fa151L,0x7d27d25912177b3bL,
44352         0xb1f15273c4485483L,0x5fd57d81102e2297L,0x3d43e017c7f6acb7L },
44353       { 0x41a8bb0b3a70eb28L,0x67de2d8e3e80b06bL,0x09245a4170c28de5L,
44354         0xad7dbcb1a7b26023L,0x70b08a352cbc6c1eL,0xb504fb669b33041fL } },
44355     /* 135 */
44356     { { 0xa8e85ab5f97a27c2L,0x6ac5ec8bc10a011bL,0x55745533ffbcf161L,
44357         0x01780e8565790a60L,0xe451bf8599ee75b0L,0x8907a63b39c29881L },
44358       { 0x76d46738260189edL,0x284a443647bd35cbL,0xd74e8c4020cab61eL,
44359         0x6264bf8c416cf20aL,0xfa5a6c955fd820ceL,0xfa7154d0f24bb5fcL } },
44360     /* 136 */
44361     { { 0x18482cec9b3f5034L,0x962d445acd9e68fdL,0x266fb1d695746f23L,
44362         0xc66ade5a58c94a4bL,0xdbbda826ed68a5b6L,0x05664a4d7ab0d6aeL },
44363       { 0xbcd4fe51025e32fcL,0x61a5aebfa96df252L,0xd88a07e231592a31L,
44364         0x5d9d94de98905517L,0x96bb40105fd440e7L,0x1b0c47a2e807db4cL } },
44365     /* 137 */
44366     { { 0x5c2a6ac808223878L,0xba08c269e65a5558L,0xd22b1b9b9bbc27fdL,
44367         0x919171bf72b9607dL,0x9ab455f9e588dc58L,0x6d54916e23662d93L },
44368       { 0x8da8e9383b1de0c1L,0xa84d186a804f278fL,0xbf4988ccd3461695L,
44369         0xf5eae3bee10eb0cbL,0x1ff8b68fbf2a66edL,0xa68daf67c305b570L } },
44370     /* 138 */
44371     { { 0xc1004cff44b2e045L,0x91b5e1364b1c05d4L,0x53ae409088a48a07L,
44372         0x73fb2995ea11bb1aL,0x320485703d93a4eaL,0xcce45de83bfc8a5fL },
44373       { 0xaff4a97ec2b3106eL,0x9069c630b6848b4fL,0xeda837a6ed76241cL,
44374         0x8a0daf136cc3f6cfL,0x199d049d3da018a8L,0xf867c6b1d9093ba3L } },
44375     /* 139 */
44376     { { 0xe4d42a5656527296L,0xae26c73dce71178dL,0x70a0adac6c251664L,
44377         0x813483ae5dc0ae1dL,0x7574eacddaab2dafL,0xc56b52dcc2d55f4fL },
44378       { 0x872bc16795f32923L,0x4be175815bdd2a89L,0x9b57f1e7a7699f00L,
44379         0x5fcd9c723ac2de02L,0x83af3ba192377739L,0xa64d4e2bfc50b97fL } },
44380     /* 140 */
44381     { { 0x2172dae20e552b40L,0x62f49725d34d52e8L,0x7930ee4007958f98L,
44382         0x56da2a90751fdd74L,0xf1192834f53e48c3L,0x34d2ac268e53c343L },
44383       { 0x1073c21813111286L,0x201dac14da9d9827L,0xec2c29dbee95d378L,
44384         0x9316f1191f3ee0b1L,0x7890c9f0544ce71cL,0xd77138af27612127L } },
44385     /* 141 */
44386     { { 0x78045e6d3b4ad1cdL,0xcd86b94e4aa49bc1L,0x57e51f1dfd677a16L,
44387         0xd9290935fa613697L,0x7a3f959334f4d893L,0x8c9c248b5d5fcf9bL },
44388       { 0x9f23a4826f70d4e9L,0x1727345463190ae9L,0x4bdd7c135b081a48L,
44389         0x1e2de38928d65271L,0x0bbaaa25e5841d1fL,0xc4c18a79746772e5L } },
44390     /* 142 */
44391     { { 0x10ee2681593375acL,0x4f3288be7dd5e113L,0x9a97b2fb240f3538L,
44392         0xfa11089f1de6b1e2L,0x516da5621351bc58L,0x573b61192dfa85b5L },
44393       { 0x89e966836cba7df5L,0xf299be158c28ab40L,0xe91c9348ad43fcbfL,
44394         0xe9bbc7cc9a1cefb3L,0xc8add876738b2775L,0x6e3b1f2e775eaa01L } },
44395     /* 143 */
44396     { { 0x0365a888b677788bL,0x634ae8c43fd6173cL,0x304987619e498dbeL,
44397         0x08c43e6dc8f779abL,0x068ae3844c09aca9L,0x2380c70b2018d170L },
44398       { 0xcf77fbc3a297c5ecL,0xdacbc853ca457948L,0x3690de04336bec7eL,
44399         0x26bbac6414eec461L,0xd1c23c7e1f713abfL,0xf08bbfcde6fd569eL } },
44400     /* 144 */
44401     { { 0x5f8163f484770ee3L,0x0e0c7f94744a1706L,0x9c8f05f7e1b2d46dL,
44402         0x417eafe7d01fd99aL,0x2ba15df511440e5bL,0xdc5c552a91a6fbcfL },
44403       { 0x86271d74a270f721L,0x32c0a075a004485bL,0x9d1a87e38defa075L,
44404         0xb590a7acbf0d20feL,0x430c41c28feda1f5L,0x454d287958f6ec24L } },
44405     /* 145 */
44406     { { 0x52b7a6357c525435L,0x3d9ef57f37c4bdbcL,0x2bb93e9edffcc475L,
44407         0xf7b8ba987710f3beL,0x42ee86da21b727deL,0x55ac3f192e490d01L },
44408       { 0x487e3a6ec0c1c390L,0x036fb345446cde7bL,0x089eb276496ae951L,
44409         0xedfed4d971ed1234L,0x661b0dd5900f0b46L,0x11bd6f1b8582f0d3L } },
44410     /* 146 */
44411     { { 0x5cf9350f076bc9d1L,0x15d903becf3cd2c3L,0x21cfc8c225af031cL,
44412         0xe0ad32488b1cc657L,0xdd9fb96370014e87L,0xf0f3a5a1297f1658L },
44413       { 0xbb908fbaf1f703aaL,0x2f9cc4202f6760baL,0x00ceec6666a38b51L,
44414         0x4deda33005d645daL,0xb9cf5c72f7de3394L,0xaeef65021ad4c906L } },
44415     /* 147 */
44416     { { 0x0583c8b17a19045dL,0xae7c3102d052824cL,0x2a234979ff6cfa58L,
44417         0xfe9dffc962c733c0L,0x3a7fa2509c0c4b09L,0x516437bb4fe21805L },
44418       { 0x9454e3d5c2a23ddbL,0x0726d887289c104eL,0x8977d9184fd15243L,
44419         0xc559e73f6d7790baL,0x8fd3e87d465af85fL,0xa2615c745feee46bL } },
44420     /* 148 */
44421     { { 0xc8d607a84335167dL,0x8b42d804e0f5c887L,0x5f9f13df398d11f9L,
44422         0x5aaa508720740c67L,0x83da9a6aa3d9234bL,0xbd3a5c4e2a54bad1L },
44423       { 0xdd13914c2db0f658L,0x29dcb66e5a3f373aL,0xbfd62df55245a72bL,
44424         0x19d1802391e40847L,0xd9df74dbb136b1aeL,0x72a06b6b3f93bc5bL } },
44425     /* 149 */
44426     { { 0x6da19ec3ad19d96fL,0xb342daa4fb2a4099L,0x0e61633a662271eaL,
44427         0x3bcece81ce8c054bL,0x7cc8e0618bd62dc6L,0xae189e19ee578d8bL },
44428       { 0x73e7a25ddced1eedL,0xc1257f0a7875d3abL,0x2cb2d5a21cfef026L,
44429         0xd98ef39bb1fdf61cL,0xcd8e6f6924e83e6cL,0xd71e7076c7b7088bL } },
44430     /* 150 */
44431     { { 0x339368309d4245bfL,0x22d962172ac2953bL,0xb3bf5a8256c3c3cdL,
44432         0x50c9be910d0699e8L,0xec0944638f366459L,0x6c056dba513b7c35L },
44433       { 0x687a6a83045ab0e3L,0x8d40b57f445c9295L,0x0f345048a16f5954L,
44434         0x64b5c6393d8f0a87L,0x106353a29f71c5e2L,0xdd58b475874f0dd4L } },
44435     /* 151 */
44436     { { 0x67ec084f62230c72L,0xf14f6cca481385e3L,0xf58bb4074cda7774L,
44437         0xe15011b1aa2dbb6bL,0xd488369d0c035ab1L,0xef83c24a8245f2fdL },
44438       { 0xfb57328f9fdc2538L,0x79808293191fe46aL,0xe28f5c4432ede548L,
44439         0x1b3cda99ea1a022cL,0x39e639b73df2ec7fL,0x77b6272b760e9a18L } },
44440     /* 152 */
44441     { { 0x2b1d51bda65d56d5L,0x3a9b71f97ea696e0L,0x95250ecc9904f4c4L,
44442         0x8bc4d6ebe75774b7L,0x0e343f8aeaeeb9aaL,0xc473c1d1930e04cbL },
44443       { 0x282321b1064cd8aeL,0xf4b4371e5562221cL,0xc1cc81ecd1bf1221L,
44444         0xa52a07a9e2c8082fL,0x350d8e59ba64a958L,0x29e4f3de6fb32c9aL } },
44445     /* 153 */
44446     { { 0x0aa9d56cba89aaa5L,0xf0208ac0c4c6059eL,0x7400d9c6bd6ddca4L,
44447         0xb384e475f2c2f74aL,0x4c1061fcb1562dd3L,0x3924e2482e153b8dL },
44448       { 0xf38b8d98849808abL,0x29bf3260a491aa36L,0x85159ada88220edeL,
44449         0x8b47915bbe5bc422L,0xa934d72ed7300967L,0xc4f303982e515d0dL } },
44450     /* 154 */
44451     { { 0xe3e9ee421b1de38bL,0xa124e25a42636760L,0x90bf73c090165b1aL,
44452         0x21802a34146434c5L,0x54aa83f22e1fa109L,0x1d4bd03ced9c51e9L },
44453       { 0xc2d96a38798751e6L,0xed27235f8c3507f5L,0xb5fb80e2c8c24f88L,
44454         0xf873eefad37f4f78L,0x7229fd74f224ba96L,0x9dcd91999edd7149L } },
44455     /* 155 */
44456     { { 0xee9f81a64e94f22aL,0xe5609892f71ec341L,0x6c818ddda998284eL,
44457         0x9fd472953b54b098L,0x47a6ac030e8a7cc9L,0xde684e5eb207a382L },
44458       { 0x4bdd1ecd2b6b956bL,0x09084414f01b3583L,0xe2f80b3255233b14L,
44459         0x5a0fec54ef5ebc5eL,0x74cf25e6bf8b29a2L,0x1c757fa07f29e014L } },
44460     /* 156 */
44461     { { 0x1bcb5c4aeb0fdfe4L,0xd7c649b3f0899367L,0xaef68e3f05bc083bL,
44462         0x57a06e46a78aa607L,0xa2136ecc21223a44L,0x89bd648452f5a50bL },
44463       { 0x724411b94455f15aL,0x23dfa97008a9c0fdL,0x7b0da4d16db63befL,
44464         0x6f8a7ec1fb162443L,0xc1ac9ceee98284fbL,0x085a582b33566022L } },
44465     /* 157 */
44466     { { 0x15cb61f9ec1f138aL,0x11c9a230668f0c28L,0xac829729df93f38fL,
44467         0xcef256984048848dL,0x3f686da02bba8fbfL,0xed5fea78111c619aL },
44468       { 0x9b4f73bcd6d1c833L,0x5095160686e7bf80L,0xa2a73508042b1d51L,
44469         0x9ef6ea495fb89ec2L,0xf1008ce95ef8b892L,0x78a7e6849ae8568bL } },
44470     /* 158 */
44471     { { 0x3fe83a7c10470cd8L,0x92734682f86df000L,0xb5dac06bda9409b5L,
44472         0x1e7a966094939c5fL,0xdec6c1505cc116dcL,0x1a52b40866bac8ccL },
44473       { 0x5303a3656e864045L,0x45eae72a9139efc1L,0x83bec6466f31d54fL,
44474         0x2fb4a86f6e958a6dL,0x6760718e4ff44030L,0x008117e3e91ae0dfL } },
44475     /* 159 */
44476     { { 0x5d5833ba384310a2L,0xbdfb4edc1fd6c9fcL,0xb9a4f102849c4fb8L,
44477         0xe5fb239a581c1e1fL,0xba44b2e7d0a9746dL,0x78f7b7683bd942b9L },
44478       { 0x076c8ca1c87607aeL,0x82b23c2ed5caaa7eL,0x6a581f392763e461L,
44479         0xca8a5e4a3886df11L,0xc87e90cf264e7f22L,0x04f74870215cfcfcL } },
44480     /* 160 */
44481     { { 0x5285d116141d161cL,0x67cd2e0e93c4ed17L,0x12c62a647c36187eL,
44482         0xf5329539ed2584caL,0xc4c777c442fbbd69L,0x107de7761bdfc50aL },
44483       { 0x9976dcc5e96beebdL,0xbe2aff95a865a151L,0x0e0a9da19d8872afL,
44484         0x5e357a3da63c17ccL,0xd31fdfd8e15cc67cL,0xc44bbefd7970c6d8L } },
44485     /* 161 */
44486     { { 0x703f83e24c0c62f1L,0x9b1e28ee4e195572L,0x6a82858bfe26ccedL,
44487         0xd381c84bc43638faL,0x94f72867a5ba43d8L,0x3b4a783d10b82743L },
44488       { 0xee1ad7b57576451eL,0xc3d0b59714b6b5c8L,0x3dc30954fcacc1b8L,
44489         0x55df110e472c9d7bL,0x97c86ed702f8a328L,0xd043341388dc098fL } },
44490     /* 162 */
44491     { { 0x1a60d1522ca8f2feL,0x61640948491bd41fL,0x6dae29a558dfe035L,
44492         0x9a615bea278e4863L,0xbbdb44779ad7c8e5L,0x1c7066302ceac2fcL },
44493       { 0x5e2b54c699699b4bL,0xb509ca6d239e17e8L,0x728165feea063a82L,
44494         0x6b5e609db6a22e02L,0x12813905b26ee1dfL,0x07b9f722439491faL } },
44495     /* 163 */
44496     { { 0x1592ec1448ff4e49L,0x3e4e9f176d644129L,0x7acf82881156acc0L,
44497         0x5aa34ba8bb092b0bL,0xcd0f90227d38393dL,0x416724ddea4f8187L },
44498       { 0x3c4e641cc0139e73L,0xe0fe46cf91e4d87dL,0xedb3c792cab61f8aL,
44499         0x4cb46de4d3868753L,0xe449c21d20f1098aL,0x5e5fd059f5b8ea6eL } },
44500     /* 164 */
44501     { { 0x7fcadd4675856031L,0x89c7a4cdeaf2fbd0L,0x1af523ce7a87c480L,
44502         0xe5fc109561d9ae90L,0x3fb5864fbcdb95f5L,0xbeb5188ebb5b2c7dL },
44503       { 0x3d1563c33ae65825L,0x116854c40e57d641L,0x11f73d341942ebd3L,
44504         0x24dc5904c06955b3L,0x8a0d4c83995a0a62L,0xfb26b86d5d577b7dL } },
44505     /* 165 */
44506     { { 0xc53108e7c686ae17L,0x9090d739d1c1da56L,0x4583b0139aec50aeL,
44507         0xdd9a088ba49a6ab2L,0x28192eeaf382f850L,0xcc8df756f5fe910eL },
44508       { 0x877823a39cab7630L,0x64984a9afb8e7fc1L,0x5448ef9c364bfc16L,
44509         0xbbb4f871c44e2a9aL,0x901a41ab435c95e9L,0xc6c23e5faaa50a06L } },
44510     /* 166 */
44511     { { 0xb78016c19034d8ddL,0x856bb44b0b13e79bL,0x85c6409ab3241a05L,
44512         0x8d2fe19a2d78ed21L,0xdcc7c26d726eddf2L,0x3ccaff5f25104f04L },
44513       { 0x397d7edc6b21f843L,0xda88e4dde975de4cL,0x5273d3964f5ab69eL,
44514         0x537680e39aae6cc0L,0xf749cce53e6f9461L,0x021ddbd9957bffd3L } },
44515     /* 167 */
44516     { { 0x7b64585f777233cfL,0xfe6771f60942a6f0L,0x636aba7adfe6eef0L,
44517         0x63bbeb5686038029L,0xacee5842de8fcf36L,0x48d9aa99d4a20524L },
44518       { 0xcff7a74c0da5e57aL,0xc232593ce549d6c9L,0x68504bccf0f2287bL,
44519         0x6d7d098dbc8360b5L,0xeac5f1495b402f41L,0x61936f11b87d1bf1L } },
44520     /* 168 */
44521     { { 0xaa9da167b8153a9dL,0xa49fe3ac9e83ecf0L,0x14c18f8e1b661384L,
44522         0x61c24dab38434de1L,0x3d973c3a283dae96L,0xc99baa0182754fc9L },
44523       { 0x477d198f4c26b1e3L,0x12e8e186a7516202L,0x386e52f6362addfaL,
44524         0x31e8f695c3962853L,0xdec2af136aaedb60L,0xfcfdb4c629cf74acL } },
44525     /* 169 */
44526     { { 0x6b3ee958cca40298L,0xc3878153f2f5d195L,0x0c565630ed2eae5bL,
44527         0xd089b37e3a697cf2L,0xc2ed2ac7ad5029eaL,0x7e5cdfad0f0dda6aL },
44528       { 0xf98426dfd9b86202L,0xed1960b14335e054L,0x1fdb02463f14639eL,
44529         0x17f709c30db6c670L,0xbfc687ae773421e1L,0x13fefc4a26c1a8acL } },
44530     /* 170 */
44531     { { 0xe361a1987ffa0a5fL,0xf4b26102c63fe109L,0x264acbc56c74e111L,
44532         0x4af445fa77abebafL,0x448c4fdd24cddb75L,0x0b13157d44506eeaL },
44533       { 0x22a6b15972e9993dL,0x2c3c57e485e5ecbeL,0xa673560bfd83e1a1L,
44534         0x6be23f82c3b8c83bL,0x40b13a9640bbe38eL,0x66eea033ad17399bL } },
44535     /* 171 */
44536     { { 0x49fc6e95b4c6c693L,0xefc735de36af7d38L,0xe053343d35fe42fcL,
44537         0xf0aa427c6a9ab7c3L,0xc79f04364a0fcb24L,0x1628724393ebbc50L },
44538       { 0x5c3d6bd016927e1eL,0x40158ed2673b984cL,0xa7f86fc84cd48b9aL,
44539         0x1643eda660ea282dL,0x45b393eae2a1beedL,0x664c839e19571a94L } },
44540     /* 172 */
44541     { { 0x5774575027eeaf94L,0x2875c925ea99e1e7L,0xc127e7ba5086adeaL,
44542         0x765252a086fe424fL,0x1143cc6c2b6c0281L,0xc9bb2989d671312dL },
44543       { 0x880c337c51acb0a5L,0xa3710915d3c60f78L,0x496113c09262b6edL,
44544         0x5d25d9f89ce48182L,0x53b6ad72b3813586L,0x0ea3bebc4c0e159cL } },
44545     /* 173 */
44546     { { 0xcaba450ac5e49beaL,0x684e54157c05da59L,0xa2e9cab9de7ac36cL,
44547         0x4ca79b5f2e6f957bL,0xef7b024709b817b1L,0xeb3049907d89df0fL },
44548       { 0x508f730746fe5096L,0x695810e82e04eaafL,0x88ef1bd93512f76cL,
44549         0x776613513ebca06bL,0xf7d4863accf158b7L,0xb2a81e4494ee57daL } },
44550     /* 174 */
44551     { { 0xff288e5b6d53e6baL,0xa90de1a914484ea2L,0x2fadb60ced33c8ecL,
44552         0x579d6ef328b66a40L,0x4f2dd6ddec24372dL,0xe9e33fc91d66ec7dL },
44553       { 0x110899d2039eab6eL,0xa31a667a3e97bb5eL,0x6200166dcfdce68eL,
44554         0xbe83ebae5137d54bL,0x085f7d874800acdfL,0xcf4ab1330c6f8c86L } },
44555     /* 175 */
44556     { { 0x03f65845931e08fbL,0x6438551e1506e2c0L,0x5791f0dc9c36961fL,
44557         0x68107b29e3dcc916L,0x83242374f495d2caL,0xd8cfb6636ee5895bL },
44558       { 0x525e0f16a0349b1bL,0x33cd2c6c4a0fab86L,0x46c12ee82af8dda9L,
44559         0x7cc424ba71e97ad3L,0x69766ddf37621eb0L,0x95565f56a5f0d390L } },
44560     /* 176 */
44561     { { 0xe0e7bbf21a0f5e94L,0xf771e1151d82d327L,0x10033e3dceb111faL,
44562         0xd269744dd3426638L,0xbdf2d9da00d01ef6L,0x1cb80c71a049ceafL },
44563       { 0x17f183289e21c677L,0x6452af0519c8f98bL,0x35b9c5f780b67997L,
44564         0x5c2e1cbe40f8f3d4L,0x43f9165666d667caL,0x9faaa059cf9d6e79L } },
44565     /* 177 */
44566     { { 0x8ad246180a078fe6L,0xf6cc73e6464fd1ddL,0x4d2ce34dc3e37448L,
44567         0x624950c5e3271b5fL,0x62910f5eefc5af72L,0x8b585bf8aa132bc6L },
44568       { 0x11723985a839327fL,0x34e2d27d4aac252fL,0x402f59ef6296cc4eL,
44569         0x00ae055c47053de9L,0xfc22a97228b4f09bL,0xa9e86264fa0c180eL } },
44570     /* 178 */
44571     { { 0x0b7b6224bc310eccL,0x8a1a74f167fa14edL,0x87dd09607214395cL,
44572         0xdf1b3d09f5c91128L,0x39ff23c686b264a8L,0xdc2d49d03e58d4c5L },
44573       { 0x2152b7d3a9d6f501L,0xf4c32e24c04094f7L,0xc6366596d938990fL,
44574         0x084d078f94fb207fL,0xfd99f1d7328594cbL,0x36defa64cb2d96b3L } },
44575     /* 179 */
44576     { { 0x4619b78113ed7cbeL,0x95e500159784bd0eL,0x2a32251c2c7705feL,
44577         0xa376af995f0dd083L,0x55425c6c0361a45bL,0x812d2cef1f291e7bL },
44578       { 0xccf581a05fd94972L,0x26e20e39e56dc383L,0x0093685d63dbfbf0L,
44579         0x1fc164cc36b8c575L,0xb9c5ab81390ef5e7L,0x40086beb26908c66L } },
44580     /* 180 */
44581     { { 0xe5e54f7937e3c115L,0x69b8ee8cc1445a8aL,0x79aedff2b7659709L,
44582         0xe288e1631b46fbe6L,0xdb4844f0d18d7bb7L,0xe0ea23d048aa6424L },
44583       { 0x714c0e4ef3d80a73L,0x87a0aa9e3bd64f98L,0x8844b8a82ec63080L,
44584         0xe0ac9c30255d81a3L,0x86151237455397fcL,0x0b9794642f820155L } },
44585     /* 181 */
44586     { { 0x127a255a4ae03080L,0x232306b4580a89fbL,0x04e8cd6a6416f539L,
44587         0xaeb70dee13b02a0eL,0xa3038cf84c09684aL,0xa710ec3c28e433eeL },
44588       { 0x77a72567681b1f7dL,0x86fbce952fc28170L,0xd3408683f5735ac8L,
44589         0x3a324e2a6bd68e93L,0x7ec74353c027d155L,0xab60354cd4427177L } },
44590     /* 182 */
44591     { { 0x32a5342aef4c209dL,0x2ba7527408d62704L,0x4bb4af6fc825d5feL,
44592         0x1c3919ced28e7ff1L,0x1dfc2fdcde0340f6L,0xc6580baf29f33ba9L },
44593       { 0xae121e7541d442cbL,0x4c7727fd3a4724e4L,0xe556d6a4524f3474L,
44594         0x87e13cc7785642a2L,0x182efbb1a17845fdL,0xdcec0cf14e144857L } },
44595     /* 183 */
44596     { { 0x1cb89541e9539819L,0xc8cb3b4f9d94dbf1L,0x1d353f63417da578L,
44597         0xb7a697fb8053a09eL,0x8d841731c35d8b78L,0x85748d6fb656a7a9L },
44598       { 0x1fd03947c1859c5dL,0x6ce965c1535d22a2L,0x1966a13e0ca3aadcL,
44599         0x9802e41d4fb14effL,0xa9048cbb76dd3fcdL,0x89b182b5e9455bbaL } },
44600     /* 184 */
44601     { { 0xd777ad6a43360710L,0x841287ef55e9936bL,0xbaf5c67004a21b24L,
44602         0xf2c0725f35ad86f1L,0x338fa650c707e72eL,0x2bf8ed2ed8883e52L },
44603       { 0xb0212cf4b56e0d6aL,0x50537e126843290cL,0xd8b184a198b3dc6fL,
44604         0xd2be9a350210b722L,0x407406db559781eeL,0x5a78d5910bc18534L } },
44605     /* 185 */
44606     { { 0x4d57aa2ad748b02cL,0xbe5b3451a12b3b95L,0xadca7a4564711258L,
44607         0x597e091a322153dbL,0xf327100632eb1eabL,0xbd9adcba2873f301L },
44608       { 0xd1dc79d138543f7fL,0x00022092921b1fefL,0x86db3ef51e5df8edL,
44609         0x888cae049e6b944aL,0x71bd29ec791a32b4L,0xd3516206a6d1c13eL } },
44610     /* 186 */
44611     { { 0x2ef6b95255924f43L,0xd2f401ae4f9de8d5L,0xfc73e8d7adc68042L,
44612         0x627ea70c0d9d1bb4L,0xc3bb3e3ebbf35679L,0x7e8a254ad882dee4L },
44613       { 0x08906f50b5924407L,0xf14a0e61a1ad444aL,0xaa0efa2165f3738eL,
44614         0xd60c7dd6ae71f161L,0x9e8390faf175894dL,0xd115cd20149f4c00L } },
44615     /* 187 */
44616     { { 0x2f2e2c1da52abf77L,0xc2a0dca554232568L,0xed423ea254966dccL,
44617         0xe48c93c7cd0dd039L,0x1e54a225176405c7L,0x1efb5b1670d58f2eL },
44618       { 0xa751f9d994fb1471L,0xfdb31e1f67d2941dL,0xa6c74eb253733698L,
44619         0xd3155d1189a0f64aL,0x4414cfe4a4b8d2b6L,0x8d5a4be8f7a8e9e3L } },
44620     /* 188 */
44621     { { 0x5c96b4d452669e98L,0x4547f9228fd42a03L,0xcf5c1319d285174eL,
44622         0x805cd1ae064bffa0L,0x50e8bc4f246d27e7L,0xf89ef98fd5781e11L },
44623       { 0xb4ff95f6dee0b63fL,0xad850047222663a4L,0x026918604d23ce9cL,
44624         0x3e5309ce50019f59L,0x27e6f72269a508aeL,0xe9376652267ba52cL } },
44625     /* 189 */
44626     { { 0xa04d289cc0368708L,0xc458872f5e306e1dL,0x76fa23de33112feaL,
44627         0x718e39746efde42eL,0xf0c98cdc1d206091L,0x5fa3ca6214a71987L },
44628       { 0xeee8188bdcaa9f2aL,0x312cc732589a860dL,0xf9808dd6c63aeb1fL,
44629         0x70fd43db4ea62b53L,0x2c2bfe34890b6e97L,0x105f863cfa426aa6L } },
44630     /* 190 */
44631     { { 0x0b29795db38059adL,0x5686b77e90647ea0L,0xeff0470edb473a3eL,
44632         0x278d2340f9b6d1e2L,0xebbff95bbd594ec7L,0xf4b72334d3a7f23dL },
44633       { 0x2a285980a5a83f0bL,0x0786c41a9716a8b3L,0x138901bd22511812L,
44634         0xd1b55221e2fede6eL,0x0806e264df4eb590L,0x6c4c897e762e462eL } },
44635     /* 191 */
44636     { { 0xd10b905fb4b41d9dL,0x826ca4664523a65bL,0x535bbd13b699fa37L,
44637         0x5b9933d773bc8f90L,0x9332d61fcd2118adL,0x158c693ed4a65fd0L },
44638       { 0x4ddfb2a8e6806e63L,0xe31ed3ecb5de651bL,0xf9460e51819bc69aL,
44639         0x6229c0d62c76b1f8L,0xbb78f231901970a3L,0x31f3820f9cee72b8L } },
44640     /* 192 */
44641     { { 0xe931caf2c09e1c72L,0x0715f29812990cf4L,0x33aad81d943262d8L,
44642         0x5d292b7a73048d3fL,0xb152aaa4dc7415f6L,0xc3d10fd90fd19587L },
44643       { 0xf76b35c575ddadd0L,0x9f5f4a511e7b694cL,0x2f1ab7ebc0663025L,
44644         0x01c9cc87920260b0L,0xc4b1f61a05d39da6L,0x6dcd76c4eb4a9c4eL } },
44645     /* 193 */
44646     { { 0x0ba0916ffdc83f01L,0x354c8b449553e4f9L,0xa6cc511affc5e622L,
44647         0xb954726ae95be787L,0xcb04811575b41a62L,0xfa2ae6cdebfde989L },
44648       { 0x6376bbc70f24659aL,0x13a999fd4c289c43L,0xc7134184ec9abd8bL,
44649         0x28c02bf6a789ab04L,0xff841ebcd3e526ecL,0x442b191e640893a8L } },
44650     /* 194 */
44651     { { 0x4cac6c62fa2b6e20L,0x97f29e9bf6d69861L,0x228ab1dbbc96d12dL,
44652         0x6eb913275e8e108dL,0xd4b3d4d140771245L,0x61b20623ca8a803aL },
44653       { 0x2c2f3b41a6a560b1L,0x879e1d403859fcf4L,0x7cdb5145024dbfc3L,
44654         0x55d08f153bfa5315L,0x2f57d773aa93823aL,0xa97f259cc6a2c9a2L } },
44655     /* 195 */
44656     { { 0xc306317be58edbbbL,0x25ade51c79dfdf13L,0x6b5beaf116d83dd6L,
44657         0xe8038a441dd8f925L,0x7f00143cb2a87b6bL,0xa885d00df5b438deL },
44658       { 0xe9f76790cf9e48bdL,0xf0bdf9f0a5162768L,0x0436709fad7b57cbL,
44659         0x7e151c12f7c15db7L,0x3514f0225d90ee3bL,0x2e84e8032c361a8dL } },
44660     /* 196 */
44661     { { 0x2277607d563ec8d8L,0xa661811fe3934cb7L,0x3ca72e7af58fd5deL,
44662         0x7989da0462294c6aL,0x88b3708bf6bbefe9L,0x0d524cf753ed7c82L },
44663       { 0x69f699ca2f30c073L,0xf0fa264b9dc1dcf3L,0x44ca456805f0aaf6L,
44664         0x0f5b23c7d19b9bafL,0x39193f41eabd1107L,0x9e3e10ad2a7c9b83L } },
44665     /* 197 */
44666     { { 0xa90824f0d4ae972fL,0x43eef02bc6e846e7L,0x7e46061229d2160aL,
44667         0x29a178acfe604e91L,0x23056f044eb184b2L,0x4fcad55feb54cdf4L },
44668       { 0xa0ff96f3ae728d15L,0x8a2680c6c6a00331L,0x5f84cae07ee52556L,
44669         0x5e462c3ac5a65dadL,0x5d2b81dfe2d23f4fL,0x6e47301bc5b1eb07L } },
44670     /* 198 */
44671     { { 0x77411d68af8219b9L,0xcb883ce651b1907aL,0x25c87e57101383b5L,
44672         0x9c7d9859982f970dL,0xaa6abca5118305d2L,0x725fed2f9013a5dbL },
44673       { 0x487cdbafababd109L,0xc0f8cf5687586528L,0xa02591e68ad58254L,
44674         0xc071b1d1debbd526L,0x927dfe8b961e7e31L,0x55f895f99263dfe1L } },
44675     /* 199 */
44676     { { 0xf899b00db175645bL,0x51f3a627b65b4b92L,0xa2f3ac8db67399efL,
44677         0xe717867fe400bc20L,0x42cc90201967b952L,0x3d5967513ecd1de1L },
44678       { 0xd41ebcdedb979775L,0x99ba61bc6a2e7e88L,0x039149a5321504f2L,
44679         0xe7dc231427ba2fadL,0x9f556308b57d8368L,0x2b6d16c957da80a7L } },
44680     /* 200 */
44681     { { 0x84af5e76279ad982L,0x9bb4c92d9c8b81a6L,0xd79ad44e0e698e67L,
44682         0xe8be9048265fc167L,0xf135f7e60c3a4cccL,0xa0a10d38b8863a33L },
44683       { 0xe197247cd386efd9L,0x0eefd3f9b52346c2L,0xc22415f978607bc8L,
44684         0xa2a8f862508674ceL,0xa72ad09ec8c9d607L,0xcd9f0ede50fa764fL } },
44685     /* 201 */
44686     { { 0x063391c7d1a46d4dL,0x2df51c119eb01693L,0xc5849800849e83deL,
44687         0x48fd09aa8ad08382L,0xa405d873aa742736L,0xee49e61ee1f9600cL },
44688       { 0xd76676be48c76f73L,0xd9c100f601274b2aL,0x110bb67c83f8718dL,
44689         0xec85a42002fc0d73L,0xc0449e1e744656adL,0x28ce737637d9939bL } },
44690     /* 202 */
44691     { { 0x97e9af7244544ac7L,0xf2c658d5ba010426L,0x732dec39fb3adfbdL,
44692         0xd12faf91a2df0b07L,0x8ac267252171e208L,0xf820cdc85b24fa54L },
44693       { 0x307a6eea94f4cf77L,0x18c783d2944a33c6L,0x4b939d4c0b741ac5L,
44694         0x1d7acd153ffbb6e4L,0x06a248587a255e44L,0x14fbc494ce336d50L } },
44695     /* 203 */
44696     { { 0x9b920c0c51584e3cL,0xc7733c59f7e54027L,0xe24ce13988422bbeL,
44697         0x11ada812523bd6abL,0xde068800b88e6defL,0x7b872671fe8c582dL },
44698       { 0x4e746f287de53510L,0x492f8b99f7971968L,0x1ec80bc77d928ac2L,
44699         0xb3913e48432eb1b5L,0xad08486632028f6eL,0x122bb8358fc2f38bL } },
44700     /* 204 */
44701     { { 0x0a9f3b1e3b0b29c3L,0x837b64324fa44151L,0xb9905c9217b28ea7L,
44702         0xf39bc93798451750L,0xcd383c24ce8b6da1L,0x299f57db010620b2L },
44703       { 0x7b6ac39658afdce3L,0xa15206b33d05ef47L,0xa0ae37e2b9bb02ffL,
44704         0x107760ab9db3964cL,0xe29de9a067954beaL,0x446a1ad8431c3f82L } },
44705     /* 205 */
44706     { { 0xc6fecea05c6b8195L,0xd744a7c5f49e71b9L,0xa8e96acc177a7ae7L,
44707         0x1a05746c358773a7L,0xa416214637567369L,0xaa0217f787d1c971L },
44708       { 0x61e9d15877fd3226L,0x0f6f2304e4f600beL,0xa9c4cebc7a6dff07L,
44709         0xd15afa0109f12a24L,0x2bbadb228c863ee9L,0xa28290e4e5eb8c78L } },
44710     /* 206 */
44711     { { 0x55b87fa03e9de330L,0x12b26066195c145bL,0xe08536e0a920bef0L,
44712         0x7bff6f2c4d195adcL,0x7f319e9d945f4187L,0xf9848863f892ce47L },
44713       { 0xd0efc1d34fe37657L,0x3c58de825cf0e45aL,0x626ad21a8b0ccbbeL,
44714         0xd2a31208af952fc5L,0x81791995eb437357L,0x5f19d30f98e95d4fL } },
44715     /* 207 */
44716     { { 0x72e83d9a0e6865bbL,0x22f5af3bf63456a6L,0x409e9c73463c8d9eL,
44717         0x40e9e578dfe6970eL,0x876b6efa711b91caL,0x895512cf942625a3L },
44718       { 0x84c8eda8cb4e462bL,0x84c0154a4412e7c8L,0x04325db1ceb7b71fL,
44719         0x1537dde366f70877L,0xf3a093991992b9acL,0xa7316606d498ae77L } },
44720     /* 208 */
44721     { { 0x13990d2fcad260f5L,0x76c3be29eec0e8c0L,0x7dc5bee00f7bd7d5L,
44722         0x9be167d2efebda4bL,0xcce3dde69122b87eL,0x75a28b0982b5415cL },
44723       { 0xf6810bcde84607a6L,0xc6d581286f4dbf0dL,0xfead577d1b4dafebL,
44724         0x9bc440b2066b28ebL,0x53f1da978b17e84bL,0x0459504bcda9a575L } },
44725     /* 209 */
44726     { { 0x13e39a02329e5836L,0x2c9e7d51f717269dL,0xc5ac58d6f26c963bL,
44727         0x3b0c6c4379967bf5L,0x60bbea3f55908d9dL,0xd84811e7f07c9ad1L },
44728       { 0xfe7609a75bd20e4aL,0xe4325dd20a70baa8L,0x3711f370b3600386L,
44729         0x97f9562fd0924302L,0x040dc0c34acc4436L,0xfd6d725cde79cdd4L } },
44730     /* 210 */
44731     { { 0xb3efd0e3cf13eafbL,0x21009cbb5aa0ae5fL,0xe480c55379022279L,
44732         0x755cf334b2fc9a6dL,0x8564a5bf07096ae7L,0xddd649d0bd238139L },
44733       { 0xd0de10b18a045041L,0x6e05b413c957d572L,0x5c5ff8064e0fb25cL,
44734         0xd933179b641162fbL,0x42d48485e57439f9L,0x70c5bd0a8a8d72aaL } },
44735     /* 211 */
44736     { { 0xa767173897bdf646L,0xaa1485b4ab329f7cL,0xce3e11d6f8f25fdfL,
44737         0x76a3fc7ec6221824L,0x045f281ff3924740L,0x24557d4e96d13a9aL },
44738       { 0x875c804bdd4c27cdL,0x11c5f0f40f5c7feaL,0xac8c880bdc55ff7eL,
44739         0x2acddec51103f101L,0x38341a21f99faa89L,0xc7b67a2cce9d6b57L } },
44740     /* 212 */
44741     { { 0x9a0d724f8e357586L,0x1d7f4ff5df648da0L,0x9c3e6c9bfdee62a5L,
44742         0x0499cef00389b372L,0xe904050d98eab879L,0xe8eef1b66c051617L },
44743       { 0xebf5bfebc37e3ca9L,0x7c5e946da4e0b91dL,0x790973142c4bea28L,
44744         0x81f6c109ee67b2b7L,0xaf237d9bdafc5edeL,0xd2e602012abb04c7L } },
44745     /* 213 */
44746     { { 0x6156060c8a4f57bfL,0xf9758696ff11182aL,0x8336773c6296ef00L,
44747         0x9c054bceff666899L,0xd6a11611719cd11cL,0x9824a641dbe1acfaL },
44748       { 0x0b7b7a5fba89fd01L,0xf8d3b809889f79d8L,0xc5e1ea08f578285cL,
44749         0x7ac74536ae6d8288L,0x5d37a2007521ef5fL,0x5ecc4184b260a25dL } },
44750     /* 214 */
44751     { { 0xddcebb19a708c8d3L,0xe63ed04fc63f81ecL,0xd045f5a011873f95L,
44752         0x3b5ad54479f276d5L,0x81272a3d425ae5b3L,0x8bfeb50110ce1605L },
44753       { 0x4233809c888228bfL,0x4bd82acfb2aff7dfL,0x9c68f1800cbd4a7fL,
44754         0xfcd771246b44323dL,0x60c0fcf6891db957L,0xcfbb4d8904da8f7fL } },
44755     /* 215 */
44756     { { 0x9a6a5df93b26139aL,0x3e076a83b2cc7eb8L,0x47a8e82d5a964bcdL,
44757         0x8a4e2a39b9278d6bL,0x93506c98e4443549L,0x06497a8ff1e0d566L },
44758       { 0x3dee8d992b1efa05L,0x2da63ca845393e33L,0xa4af7277cf0579adL,
44759         0xaf4b46393236d8eaL,0x6ccad95b32b617f5L,0xce76d8b8b88bb124L } },
44760     /* 216 */
44761     { { 0x63d2537a083843dcL,0x89eb35141e4153b4L,0x5175ebc4ea9afc94L,
44762         0x7a6525808ed1aed7L,0x67295611d85e8297L,0x8dd2d68bb584b73dL },
44763       { 0x237139e60133c3a4L,0x9de838ab4bd278eaL,0xe829b072c062fcd9L,
44764         0x70730d4f63ba8706L,0x6080483fd3cd05ecL,0x872ab5b80c85f84dL } },
44765     /* 217 */
44766     { { 0xfc0776d3999d4d49L,0xa3eb59deec3f45e7L,0xbc990e440dae1fc1L,
44767         0x33596b1ea15371ffL,0xd447dcb29bc7ab25L,0xcd5b63e935979582L },
44768       { 0xae3366fa77d1ff11L,0x59f28f05edee6903L,0x6f43fed1a4433bf2L,
44769         0x15409c9bdf9ce00eL,0x21b5cdedaca9c5dcL,0xf9f3359582d7bdb4L } },
44770     /* 218 */
44771     { { 0x959443789422c792L,0x239ea923c958b8bfL,0x4b61a247df076541L,
44772         0x4d29ce85bb9fc544L,0x9a692a670b424559L,0x6e0ca5a00e486900L },
44773       { 0x6b79a78285b3beceL,0x41f35e39c61f9892L,0xff82099aae747f82L,
44774         0x58c8ae3fd0ca59d6L,0x4ac930e299406b5fL,0x2ce04eb99df24243L } },
44775     /* 219 */
44776     { { 0x4366b9941ac37b82L,0xff0c728d25b04d83L,0x1f55136119c47b7cL,
44777         0xdbf2d5edbeff13e7L,0xf78efd51e12a683dL,0x82cd85b9989cf9c4L },
44778       { 0xe23c6db6e0cb5d37L,0x818aeebd72ee1a15L,0x8212aafd28771b14L,
44779         0x7bc221d91def817dL,0xdac403a29445c51fL,0x711b051712c3746bL } },
44780     /* 220 */
44781     { { 0x0ed9ed485ea99eccL,0xf799500db8cab5e1L,0xa8ec87dcb570cbdcL,
44782         0x52cfb2c2d35dfaecL,0x8d31fae26e4d80a4L,0xe6a37dc9dcdeabe5L },
44783       { 0x5d365a341deca452L,0x09a5f8a50d68b44eL,0x59238ea5a60744b1L,
44784         0xf2fedc0dbb4249e9L,0xe395c74ea909b2e3L,0xe156d1a539388250L } },
44785     /* 221 */
44786     { { 0xd796b3d047181ae9L,0xbaf44ba844197808L,0xe693309434cf3facL,
44787         0x41aa6adec3bd5c46L,0x4fda75d8eed947c6L,0xacd9d4129ea5a525L },
44788       { 0x65cc55a3d430301bL,0x3c9a5bcf7b52ea49L,0x22d319cf159507f0L,
44789         0x2ee0b9b5de74a8ddL,0x20c26a1e877ac2b6L,0x387d73da92e7c314L } },
44790     /* 222 */
44791     { { 0x13c4833e8cd3fdacL,0x76fcd473332e5b8eL,0xff671b4be2fe1fd3L,
44792         0x4d734e8b5d98d8ecL,0xb1ead3c6514bbc11L,0xd14ca8587b390494L },
44793       { 0x95a443af5d2d37e9L,0x73c6ea7300464622L,0xa44aeb4b15755044L,
44794         0xba3f8575fab58feeL,0x9779dbc9dc680a6fL,0xe1ee5f5a7b37ddfcL } },
44795     /* 223 */
44796     { { 0xcd0b464812d29f46L,0x93295b0b0ed53137L,0xbfe2609480bef6c9L,
44797         0xa656578854248b00L,0x69c43fca80e7f9c4L,0x2190837bbe141ea1L },
44798       { 0x875e159aa1b26cfbL,0x90ca9f877affe852L,0x15e6550d92ca598eL,
44799         0xe3e0945d1938ad11L,0xef7636bb366ef937L,0xb6034d0bb39869e5L } },
44800     /* 224 */
44801     { { 0x4d255e3026d8356eL,0xf83666edd314626fL,0x421ddf61d0c8ed64L,
44802         0x96e473c526677b61L,0xdad4af7e9e9b18b3L,0xfceffd4aa9393f75L },
44803       { 0x843138a111c731d5L,0x05bcb3a1b2f141d9L,0x20e1fa95617b7671L,
44804         0xbefce81288ccec7bL,0x582073dc90f1b568L,0xf572261a1f055cb7L } },
44805     /* 225 */
44806     { { 0xf314827736973088L,0xc008e70886a9f980L,0x1b795947e046c261L,
44807         0xdf1e6a7dca76bca0L,0xabafd88671acddf0L,0xff7054d91364d8f4L },
44808       { 0x2cf63547e2260594L,0x468a5372d73b277eL,0xc7419e24ef9bd35eL,
44809         0x2b4a1c2024043cc3L,0xa28f047a890b39cdL,0xdca2cea146f9a2e3L } },
44810     /* 226 */
44811     { { 0xab78873653277538L,0xa734e225cf697738L,0x66ee1d1e6b22e2c1L,
44812         0x2c615389ebe1d212L,0xf36cad4002bb0766L,0x120885c33e64f207L },
44813       { 0x59e77d5690fbfec2L,0xf9e781aad7a574aeL,0x801410b05d045e53L,
44814         0xd3b5f0aaa91b5f0eL,0xb3d1df007fbb3521L,0x11c4b33ec72bee9aL } },
44815     /* 227 */
44816     { { 0xd32b983283c3a7f3L,0x8083abcf88d8a354L,0xdeb1640450f4ec5aL,
44817         0x18d747f0641e2907L,0x4e8978aef1bbf03eL,0x932447dc88a0cd89L },
44818       { 0x561e0febcf3d5897L,0xfc3a682f13600e6dL,0xc78b9d73d16a6b73L,
44819         0xe713feded29bf580L,0x0a22522308d69e5cL,0x3a924a571ff7fda4L } },
44820     /* 228 */
44821     { { 0xfb64554cb4093beeL,0xa6d65a25a58c6ec0L,0x4126994d43d0ed37L,
44822         0xa5689a5155152d44L,0xb8e5ea8c284caa8dL,0x33f05d4fd1f25538L },
44823       { 0xe0fdfe091b615d6eL,0x2ded7e8f705507daL,0xdd5631e517bbcc80L,
44824         0x4f87453e267fd11fL,0xc6da723fff89d62dL,0x55cbcae2e3cda21dL } },
44825     /* 229 */
44826     { { 0x336bc94e6b4e84f3L,0x728630314ef72c35L,0x6d85fdeeeeb57f99L,
44827         0x7f4e3272a42ece1bL,0x7f86cbb536f0320aL,0xf09b6a2b923331e6L },
44828       { 0x21d3ecf156778435L,0x2977ba998323b2d2L,0x6a1b57fb1704bc0fL,
44829         0xd777cf8b389f048aL,0x9ce2174fac6b42cdL,0x404e2bff09e6c55aL } },
44830     /* 230 */
44831     { { 0x9b9b135e204c5ddbL,0x9dbfe0443eff550eL,0x35eab4bfec3be0f6L,
44832         0x8b4c3f0d0a43e56fL,0x4c1c66730e73f9b3L,0x92ed38bd2c78c905L },
44833       { 0xc7003f6aa386e27cL,0xb9c4f46faced8507L,0xea024ec859df5464L,
44834         0x4af96152429572eaL,0x279cd5e2e1fc1194L,0xaa376a03281e358cL } },
44835     /* 231 */
44836     { { 0x078592233cdbc95cL,0xaae1aa6aef2e337aL,0xc040108d472a8544L,
44837         0x80c853e68d037b7dL,0xd221315c8c7eee24L,0x195d38568ee47752L },
44838       { 0xd4b1ba03dacd7fbeL,0x4b5ac61ed3e0c52bL,0x68d3c0526aab7b52L,
44839         0xf0d7248c660e3feaL,0xafdb3f893145efb4L,0xa73fd9a38f40936dL } },
44840     /* 232 */
44841     { { 0x891b9ef3bb1b17ceL,0x14023667c6127f31L,0x12b2e58d305521fdL,
44842         0x3a47e449e3508088L,0xe49fc84bff751507L,0x4023f7225310d16eL },
44843       { 0xa608e5edb73399faL,0xf12632d8d532aa3eL,0x13a2758e845e8415L,
44844         0xae4b6f851fc2d861L,0x3879f5b1339d02f2L,0x446d22a680d99ebdL } },
44845     /* 233 */
44846     { { 0x0f5023024be164f1L,0x8d09d2d688b81920L,0x514056f1984aceffL,
44847         0xa5c4ddf075e9e80dL,0x38cb47e6df496a93L,0x899e1d6b38df6bf7L },
44848       { 0x69e87e88b59eb2a6L,0x280d9d639b47f38bL,0x599411ea3654e955L,
44849         0xcf8dd4fd969aa581L,0xff5c2baf530742a7L,0xa43915361a373085L } },
44850     /* 234 */
44851     { { 0x6ace72a3a8a4bdd2L,0xc656cdd1b68ef702L,0xd4a33e7e90c4dad8L,
44852         0x4aece08a9d951c50L,0xea8005ae085d68e6L,0xfdd7a7d76f7502b8L },
44853       { 0xce6fb0a698d6fa45L,0x228f86721104eb8cL,0xd23d8787da09d7dcL,
44854         0x5521428b2ae93065L,0x95faba3dea56c366L,0xedbe50390a88aca5L } },
44855     /* 235 */
44856     { { 0xd64da0adbfb26c82L,0xe5d70b3c952c2f9cL,0xf5e8f365f7e77f68L,
44857         0x7234e00208f2d695L,0xfaf900eed12e7be6L,0x27dc69344acf734eL },
44858       { 0x80e4ff5ec260a46aL,0x7da5ebce2dc31c28L,0x485c5d73ca69f552L,
44859         0xcdfb6b2969cc84c2L,0x031c5afeed6d4ecaL,0xc7bbf4c822247637L } },
44860     /* 236 */
44861     { { 0x9d5b72c749fe01b2L,0x34785186793a91b8L,0xa3ba3c54cf460438L,
44862         0x73e8e43d3ab21b6fL,0x50cde8e0be57b8abL,0x6488b3a7dd204264L },
44863       { 0xa9e398b3dddc4582L,0x1698c1a95bec46feL,0x7f1446ef156d3843L,
44864         0x3fd25dd8770329a2L,0x05b1221a2c710668L,0x65b2dc2aa72ee6cfL } },
44865     /* 237 */
44866     { { 0x21a885f7cd021d63L,0x3f344b15fea61f08L,0xad5ba6ddc5cf73e6L,
44867         0x154d0d8f227a8b23L,0x9b74373cdc559311L,0x4feab71598620fa1L },
44868       { 0x5098938e7d9ec924L,0x84d54a5e6d47e550L,0x1a2d1bdc1b617506L,
44869         0x99fe1782615868a4L,0x171da7803005a924L,0xa70bf5ed7d8f79b6L } },
44870     /* 238 */
44871     { { 0x0bc1250dfe2216c5L,0x2c37e2507601b351L,0xb6300175d6f06b7eL,
44872         0x4dde8ca18bfeb9b7L,0x4f210432b82f843dL,0x8d70e2f9b1ac0afdL },
44873       { 0x25c73b78aae91abbL,0x0230dca3863028f2L,0x8b923ecfe5cf30b7L,
44874         0xed754ec25506f265L,0x8e41b88c729a5e39L,0xee67cec2babf889bL } },
44875     /* 239 */
44876     { { 0xe183acf51be46c65L,0x9789538fe7565d7aL,0x87873391d9627b4eL,
44877         0xbf4ac4c19f1d9187L,0x5db99f634691f5c8L,0xa68df80374a1fb98L },
44878       { 0x3c448ed1bf92b5faL,0xa098c8413e0bdc32L,0x8e74cd5579bf016cL,
44879         0x5df0d09c115e244dL,0x9418ad013410b66eL,0x8b6124cb17a02130L } },
44880     /* 240 */
44881     { { 0x425ec3afc26e3392L,0xc07f8470a1722e00L,0xdcc28190e2356b43L,
44882         0x4ed97dffb1ef59a6L,0xc22b3ad1c63028c1L,0x070723c268c18988L },
44883       { 0x70da302f4cf49e7dL,0xc5e87c933f12a522L,0x74acdd1d18594148L,
44884         0xad5f73abca74124cL,0xe72e4a3ed69fd478L,0x615938687b117cc3L } },
44885     /* 241 */
44886     { { 0x7b7b9577a9aa0486L,0x6e41fb35a063d557L,0xb017d5c7da9047d7L,
44887         0x8c74828068a87ba9L,0xab45fa5cdf08ad93L,0xcd9fb2174c288a28L },
44888       { 0x595446425747843dL,0x34d64c6ca56111e3L,0x12e47ea14bfce8d5L,
44889         0x17740e056169267fL,0x5c49438eeed03fb5L,0x9da30add4fc3f513L } },
44890     /* 242 */
44891     { { 0xc4e85282ccfa5200L,0x2707608f6a19b13dL,0xdcb9a53df5726e2fL,
44892         0x612407c9e9427de5L,0x3e5a17e1d54d582aL,0xb99877de655ae118L },
44893       { 0x6f0e972b015254deL,0x92a56db1f0a6f7c5L,0xd297e4e1a656f8b2L,
44894         0x99fe0052ad981983L,0xd3652d2f07cfed84L,0xc784352e843c1738L } },
44895     /* 243 */
44896     { { 0x6ee90af07e9b2d8aL,0xac8d701857cf1964L,0xf6ed903171f28efcL,
44897         0x7f70d5a96812b20eL,0x27b557f4f1c61eeeL,0xf1c9bd57c6263758L },
44898       { 0x5cf7d0142a1a6194L,0xdd614e0b1890ab84L,0x3ef9de100e93c2a6L,
44899         0xf98cf575e0cd91c5L,0x504ec0c614befc32L,0xd0513a666279d68cL } },
44900     /* 244 */
44901     { { 0xa8eadbada859fb6aL,0xcf8346e7db283666L,0x7b35e61a3e22e355L,
44902         0x293ece2c99639c6bL,0xfa0162e256f241c8L,0xd2e6c7b9bf7a1ddaL },
44903       { 0xd0de625340075e63L,0x2405aa61f9ec8286L,0x2237830a8fe45494L,
44904         0x4fd01ac7364e9c8cL,0x4d9c3d21904ba750L,0xd589be14af1b520bL } },
44905     /* 245 */
44906     { { 0x13576a4f4662e53bL,0x35ec2f51f9077676L,0x66297d1397c0af97L,
44907         0xed3201fe9e598b58L,0x49bc752a5e70f604L,0xb54af535bb12d951L },
44908       { 0x36ea4c2b212c1c76L,0x18f5bbc7eb250dfdL,0xa0d466cc9a0a1a46L,
44909         0x52564da4dac2d917L,0x206559f48e95fab5L,0x7487c1909ca67a33L } },
44910     /* 246 */
44911     { { 0x75abfe37dde98e9cL,0x99b90b262a411199L,0x1b410996dcdb1f7cL,
44912         0xab346f118b3b5675L,0x04852193f1f8ae1eL,0x1ec4d2276b8b98c1L },
44913       { 0xba3bc92645452baaL,0x387d1858acc4a572L,0x9478eff6e51f171eL,
44914         0xf357077d931e1c00L,0xffee77cde54c8ca8L,0xfb4892ff551dc9a4L } },
44915     /* 247 */
44916     { { 0x5b1bdad02db8dff8L,0xd462f4fd5a2285a2L,0x1d6aad8eda00b461L,
44917         0x43fbefcf41306d1bL,0x428e86f36a13fe19L,0xc8b2f11817f89404L },
44918       { 0x762528aaf0d51afbL,0xa3e2fea4549b1d06L,0x86fad8f2ea3ddf66L,
44919         0x0d9ccc4b4fbdd206L,0xcde97d4cc189ff5aL,0xc36793d6199f19a6L } },
44920     /* 248 */
44921     { { 0xea38909b51b85197L,0xffb17dd0b4c92895L,0x0eb0878b1ddb3f3fL,
44922         0xb05d28ffc57cf0f2L,0xd8bde2e71abd57e2L,0x7f2be28dc40c1b20L },
44923       { 0x6554dca2299a2d48L,0x5130ba2e8377982dL,0x8863205f1071971aL,
44924         0x15ee62827cf2825dL,0xd4b6c57f03748f2bL,0xa9e3f4da430385a0L } },
44925     /* 249 */
44926     { { 0x33eb7cec83fbc9c6L,0x24a311c74541777eL,0xc81377f74f0767fcL,
44927         0x12adae364ab702daL,0xb7fcb6db2a779696L,0x4a6fb28401cea6adL },
44928       { 0x5e8b1d2acdfc73deL,0xd0efae8d1b02fd32L,0x3f99c190d81d8519L,
44929         0x3c18f7fafc808971L,0x41f713e751b7ae7bL,0x0a4b3435f07fc3f8L } },
44930     /* 250 */
44931     { { 0x7dda3c4c019b7d2eL,0x631c8d1ad4dc4b89L,0x5489cd6e1cdb313cL,
44932         0xd44aed104c07bb06L,0x8f97e13a75f000d1L,0x0e9ee64fdda5df4dL },
44933       { 0xeaa99f3b3e346910L,0x622f6921fa294ad7L,0x22aaa20d0d0b2fe9L,
44934         0x4fed2f991e5881baL,0x9af3b2d6c1571802L,0x919e67a8dc7ee17cL } },
44935     /* 251 */
44936     { { 0xc724fe4c76250533L,0x8a2080e57d817ef8L,0xa2afb0f4172c9751L,
44937         0x9b10cdeb17c0702eL,0xbf3975e3c9b7e3e9L,0x206117df1cd0cdc5L },
44938       { 0xfb049e61be05ebd5L,0xeb0bb55c16c782c0L,0x13a331b8ab7fed09L,
44939         0xf6c58b1d632863f0L,0x6264ef6e4d3b6195L,0x92c51b639a53f116L } },
44940     /* 252 */
44941     { { 0xa57c7bc8288b364dL,0x4a562e087b41e5c4L,0x699d21c6698a9a11L,
44942         0xa4ed9581f3f849b9L,0xa223eef39eb726baL,0x13159c23cc2884f9L },
44943       { 0x73931e583a3f4963L,0x965003890ada6a81L,0x3ee8a1c65ab2950bL,
44944         0xeedf4949775fab52L,0x63d652e14f2671b6L,0xfed4491c3c4e2f55L } },
44945     /* 253 */
44946     { { 0x335eadc3f4eb453eL,0x5ff74b63cadd1a5bL,0x6933d0d75d84a91aL,
44947         0x9ca3eeb9b49ba337L,0x1f6faccec04c15b8L,0x4ef19326dc09a7e4L },
44948       { 0x53d2d3243dca3233L,0x0ee40590a2259d4bL,0x18c22edb5546f002L,
44949         0x9242980109ea6b71L,0xaada0addb0e91e61L,0x5fe53ef499963c50L } },
44950     /* 254 */
44951     { { 0x372dd06b90c28c65L,0x1765242c119ce47dL,0xc041fb806b22fc82L,
44952         0x667edf07b0a7ccc1L,0xc79599e71261beceL,0xbc69d9ba19cff22aL },
44953       { 0x009d77cd13c06819L,0x635a66aee282b79dL,0x4edac4a6225b1be8L,
44954         0x57d4f4e4524008f9L,0xee299ac5b056af84L,0xcc38444c3a0bc386L } },
44955     /* 255 */
44956     { { 0x490643b1cd4c2356L,0x740a4851750547beL,0x643eaf29d4944c04L,
44957         0xba572479299a98a0L,0x48b29f16ee05fdf9L,0x33fb4f61089b2d7bL },
44958       { 0x86704902a950f955L,0x97e1034dfedc3ddfL,0x211320b605fbb6a2L,
44959         0x23d7b93f432299bbL,0x1fe1a0578590e4a3L,0x8e1d0586f58c0ce6L } },
44960 };
44961 
44962 /* Multiply the base point of P384 by the scalar and return the result.
44963  * If map is true then convert result to affine coordinates.
44964  *
44965  * Stripe implementation.
44966  * Pre-generated: 2^0, 2^48, ...
44967  * Pre-generated: products of all combinations of above.
44968  * 8 doubles and adds (with qz=1)
44969  *
44970  * r     Resulting point.
44971  * k     Scalar to multiply by.
44972  * map   Indicates whether to convert result to affine.
44973  * ct    Constant time required.
44974  * heap  Heap to use for allocation.
44975  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
44976  */
sp_384_ecc_mulmod_base_6(sp_point_384 * r,const sp_digit * k,int map,int ct,void * heap)44977 static int sp_384_ecc_mulmod_base_6(sp_point_384* r, const sp_digit* k,
44978         int map, int ct, void* heap)
44979 {
44980     return sp_384_ecc_mulmod_stripe_6(r, &p384_base, p384_table,
44981                                       k, map, ct, heap);
44982 }
44983 
44984 #endif /* WC_NO_CACHE_RESISTANT */
44985 #else
44986 /* The index into pre-computation table to use. */
44987 static const uint8_t recode_index_6_7[130] = {
44988      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
44989     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
44990     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
44991     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
44992     64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49,
44993     48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33,
44994     32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
44995     16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
44996      0,  1,
44997 };
44998 
44999 /* Whether to negate y-ordinate. */
45000 static const uint8_t recode_neg_6_7[130] = {
45001      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
45002      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
45003      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
45004      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
45005      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
45006      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
45007      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
45008      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
45009      0,  0,
45010 };
45011 
45012 /* Recode the scalar for multiplication using pre-computed values and
45013  * subtraction.
45014  *
45015  * k  Scalar to multiply by.
45016  * v  Vector of operations to perform.
45017  */
sp_384_ecc_recode_7_6(const sp_digit * k,ecc_recode_384 * v)45018 static void sp_384_ecc_recode_7_6(const sp_digit* k, ecc_recode_384* v)
45019 {
45020     int i;
45021     int j;
45022     uint8_t y;
45023     int carry = 0;
45024     int o;
45025     sp_digit n;
45026 
45027     j = 0;
45028     n = k[j];
45029     o = 0;
45030     for (i=0; i<55; i++) {
45031         y = (int8_t)n;
45032         if (o + 7 < 64) {
45033             y &= 0x7f;
45034             n >>= 7;
45035             o += 7;
45036         }
45037         else if (o + 7 == 64) {
45038             n >>= 7;
45039             if (++j < 6)
45040                 n = k[j];
45041             o = 0;
45042         }
45043         else if (++j < 6) {
45044             n = k[j];
45045             y |= (uint8_t)((n << (64 - o)) & 0x7f);
45046             o -= 57;
45047             n >>= o;
45048         }
45049 
45050         y += (uint8_t)carry;
45051         v[i].i = recode_index_6_7[y];
45052         v[i].neg = recode_neg_6_7[y];
45053         carry = (y >> 7) + v[i].neg;
45054     }
45055 }
45056 
45057 #ifndef WC_NO_CACHE_RESISTANT
45058 /* Touch each possible entry that could be being copied.
45059  *
45060  * r      Point to copy into.
45061  * table  Table - start of the entires to access
45062  * idx    Index of entry to retrieve.
45063  */
sp_384_get_entry_65_6(sp_point_384 * r,const sp_table_entry_384 * table,int idx)45064 static void sp_384_get_entry_65_6(sp_point_384* r,
45065     const sp_table_entry_384* table, int idx)
45066 {
45067     int i;
45068     sp_digit mask;
45069 
45070     r->x[0] = 0;
45071     r->x[1] = 0;
45072     r->x[2] = 0;
45073     r->x[3] = 0;
45074     r->x[4] = 0;
45075     r->x[5] = 0;
45076     r->y[0] = 0;
45077     r->y[1] = 0;
45078     r->y[2] = 0;
45079     r->y[3] = 0;
45080     r->y[4] = 0;
45081     r->y[5] = 0;
45082     for (i = 1; i < 65; i++) {
45083         mask = 0 - (i == idx);
45084         r->x[0] |= mask & table[i].x[0];
45085         r->x[1] |= mask & table[i].x[1];
45086         r->x[2] |= mask & table[i].x[2];
45087         r->x[3] |= mask & table[i].x[3];
45088         r->x[4] |= mask & table[i].x[4];
45089         r->x[5] |= mask & table[i].x[5];
45090         r->y[0] |= mask & table[i].y[0];
45091         r->y[1] |= mask & table[i].y[1];
45092         r->y[2] |= mask & table[i].y[2];
45093         r->y[3] |= mask & table[i].y[3];
45094         r->y[4] |= mask & table[i].y[4];
45095         r->y[5] |= mask & table[i].y[5];
45096     }
45097 }
45098 #endif /* !WC_NO_CACHE_RESISTANT */
45099 static const sp_table_entry_384 p384_table[3575] = {
45100     /* 0 << 0 */
45101     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
45102       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
45103     /* 1 << 0 */
45104     { { 0x3dd0756649c0b528L,0x20e378e2a0d6ce38L,0x879c3afc541b4d6eL,
45105         0x6454868459a30effL,0x812ff723614ede2bL,0x4d3aadc2299e1513L },
45106       { 0x23043dad4b03a4feL,0xa1bfa8bf7bb4a9acL,0x8bade7562e83b050L,
45107         0xc6c3521968f4ffd9L,0xdd8002263969a840L,0x2b78abc25a15c5e9L } },
45108     /* 2 << 0 */
45109     { { 0xc8229e55783dde91L,0x8e6c8f2e022b53f0L,0x3504e6f0ff9d48a1L,
45110         0xda821495f0687f50L,0x9c90a4fd2de4b506L,0xdb93b776427460c3L },
45111       { 0x42ea84633140bfdaL,0xe8e8e4a8c2aaccd8L,0x15e4f18bdc588258L,
45112         0x09f1fe415172bad9L,0x070d430900b0e684L,0xe34947f7123df0c2L } },
45113     /* 3 << 0 */
45114     { { 0x05e4dbe6c1dc4073L,0xc54ea9fff04f779cL,0x6b2034e9a170ccf0L,
45115         0x3a48d732d51c6c3eL,0xe36f7e2d263aa470L,0xd283fe68e7c1c3acL },
45116       { 0x7e284821c04ee157L,0x92d789a77ae0e36dL,0x132663c04ef67446L,
45117         0x68012d5ad2e1d0b4L,0xf6db68b15102b339L,0x465465fc983292afL } },
45118     /* 4 << 0 */
45119     { { 0x0aae8477ebb68f2cL,0x30594ccbee0421e3L,0x2e4f153b0aecac46L,
45120         0x078358d4736400adL,0xfb40f647d685d979L,0xcfeee6dd34179228L },
45121       { 0x54f3e8e79b3a03b2L,0xe74bb7f17bfec97eL,0x8e3e61a34c542ad1L,
45122         0x147162d30418c693L,0xe607b9e33820017dL,0x50946875303df319L } },
45123     /* 5 << 0 */
45124     { { 0xbb595eba68f1f0dfL,0xc185c0cbcc873466L,0x7f1eb1b5293c703bL,
45125         0x60db2cf5aacc05e6L,0xc676b987e2e8e4c6L,0xe1bb26b11d178ffbL },
45126       { 0x2b694ba07073fa21L,0x22c16e2e72f34566L,0x80b61b3101c35b99L,
45127         0x4b237faf982c0411L,0xe6c5944024de236dL,0x4db1c9d6e209e4a3L } },
45128     /* 6 << 0 */
45129     { { 0x7eb5c9317d56dad8L,0xcb2454b339d3413aL,0xec52930f580d57f2L,
45130         0x2a33f6661bdf6015L,0x4f0f6a962b02d33bL,0xc482e189f0430c40L },
45131       { 0x3f62b16ea7b08203L,0x739ac69d5b3d4dceL,0x8bd4bffcb79e33b0L,
45132         0x93c9e5f61b546f05L,0x586d8ededf21559aL,0xc9962152af2a9ebaL } },
45133     /* 7 << 0 */
45134     { { 0xdf13b9d17d69222bL,0x4ce6415f874774b1L,0x731edcf8211faa95L,
45135         0x5f4215d1659753edL,0xf893db589db2df55L,0x932c9f811c89025bL },
45136       { 0x0996b2207706a61eL,0x135349d5a8641c79L,0x65aad76f50130844L,
45137         0x0ff37c0401fff780L,0xf57f238e693b0706L,0xd90a16b6af6c9b3eL } },
45138     /* 8 << 0 */
45139     { { 0x23f60a05dd9bcbbaL,0x9e336de5ae9b587aL,0x1c5c2e7193d7e30fL,
45140         0x1d9aebd64f3ddb37L,0x1c7b5fe116b66423L,0x5db4f184349cd9b1L },
45141       { 0x0d2cfe83e6655a44L,0x836dbb36b7e55e87L,0x701754bf7d8686e4L,
45142         0xe9923263a42dbba2L,0x7008d943c48ecf0eL,0x3c0c6dd70d27ef61L } },
45143     /* 9 << 0 */
45144     { { 0x2f5d200e2353b92fL,0xe35d87293fd7e4f9L,0x26094833a96d745dL,
45145         0xdc351dc13cbfff3fL,0x26d464c6dad54d6aL,0x5cab1d1d53636c6aL },
45146       { 0xf2813072b18ec0b0L,0x3777e270d742aa2fL,0x27f061c7033ca7c2L,
45147         0xa6ecaccc68ead0d8L,0x7d9429f4ee69a754L,0xe770633431e8f5c6L } },
45148     /* 10 << 0 */
45149     { { 0x845539d3c8d99c02L,0x2a15a9a6e58d6787L,0xe9f6368eab225fa3L,
45150         0x54a612d7eb32cabeL,0xc2f646025c4845ecL,0xa91a5280db1c212eL },
45151       { 0xbb971f78e67b5fceL,0x03a530eb13b9e85cL,0x592ac0ba794eabfdL,
45152         0x81961b8ccfd7fd1dL,0x3e03370a47a9b8aaL,0x6eb995bec80174e8L } },
45153     /* 11 << 0 */
45154     { { 0xc7708b19b68b8c7dL,0x4532077c44377abaL,0x0dcc67706cdad64fL,
45155         0x01b8bf56147b6602L,0xf8d89885f0561d79L,0x9c19e9fc7ba9c437L },
45156       { 0x764eb146bdc4ba25L,0x604fe46bac144b83L,0x3ce813298a77e780L,
45157         0x2e070f36fe9e682eL,0x41821d0c3a53287aL,0x9aa62f9f3533f918L } },
45158     /* 12 << 0 */
45159     { { 0x3db8477270313de0L,0xd4258cc55d970420L,0x03aced26c8edfee1L,
45160         0xf67eb42235d77d83L,0x523c40dbcf9ab45cL,0x627b415f9c35b26dL },
45161       { 0xfacc45e48be55ed8L,0x80d60af627aa651aL,0x8c79848fd0e102acL,
45162         0x40c64a4e66bed5afL,0x0329eab1f7942f0eL,0x0c6e430ef9c4af3dL } },
45163     /* 13 << 0 */
45164     { { 0x9b7aeb7e75ccbdfbL,0xb25e28c5f6749a95L,0x8a7a8e4633b7d4aeL,
45165         0xdb5203a8d9c1bd56L,0xd2657265ed22df97L,0xb51c56e18cf23c94L },
45166       { 0xf4d394596c3d812dL,0xd8e88f1a87cae0c2L,0x789a2a48cf4d0fe3L,
45167         0xb7feac2dfec38d60L,0x81fdbd1c3b490ec3L,0x4617adb7cc6979e1L } },
45168     /* 14 << 0 */
45169     { { 0x5865e5018f75244cL,0xd02225fb01ec909fL,0xca6b1af8b1f85c2aL,
45170         0x44ce05ff88957166L,0x8058994c5710c0c9L,0x46d227c432f6b1baL },
45171       { 0xbe4b4a9003cb68e5L,0x540b8b82730a99d1L,0x1ecc8585e11dbbbfL,
45172         0x72445345d9c3b691L,0x647d24db13690a74L,0x4429839ddefbadf5L } },
45173     /* 15 << 0 */
45174     { { 0x446ad8884709f4a9L,0x2b7210e2ec3dabd8L,0x83ccf19550e07b34L,
45175         0x59500917789b3075L,0x0fc01fd4eb085993L,0xfb62d26f4903026bL },
45176       { 0x2309cc9d6fe989bbL,0x61609cbd144bd586L,0x4b23d3a0de06610cL,
45177         0xdddc2866d898f470L,0x8733fc41400c5797L,0x5a68c6fed0bc2716L } },
45178     /* 16 << 0 */
45179     { { 0xda6e8a7f7c33ed91L,0x992afb5b0ecdd2d8L,0x37cf65517917652aL,
45180         0x317b63ea2887d5ffL,0x37065f5313bdc3faL,0xa10896aa435abaa1L },
45181       { 0x9b21615fefabca26L,0xeb07ddea230cf00dL,0x914871dc154d410fL,
45182         0xb333bdfbc88ee148L,0x51c305c6a72d1967L,0x659db48181ef2513L } },
45183     /* 17 << 0 */
45184     { { 0x8903e1304b4a3cd0L,0x3ea4ea4c8ff1f43eL,0xe6fc3f2af655a10dL,
45185         0x7be3737d524ffefcL,0x9f6928555330455eL,0x524f166ee475ce70L },
45186       { 0x3fcc69cd6c12f055L,0x4e23b6ffd5b9c0daL,0x49ce6993336bf183L,
45187         0xf87d6d854a54504aL,0x25eb5df1b3c2677aL,0xac37986f55b164c9L } },
45188     /* 18 << 0 */
45189     { { 0x5dfee73ce5b82700L,0x198fd3f0f38f6662L,0x3bd1c8f62edb0dbdL,
45190         0x55a96a6879909f08L,0x68a2324355671693L,0x57505d8d67497030L },
45191       { 0x8a60717f75c64513L,0x54b867b7f78aa7deL,0xc266eb8441129858L,
45192         0x6ffcfc7ca4cfd9bbL,0x9bdd6a092945a757L,0x91700b247eb1be63L } },
45193     /* 19 << 0 */
45194     { { 0x82a2ed4abaa84c08L,0x22c4cc5f41a8c912L,0xca109c3b154aad5eL,
45195         0x23891298fc38538eL,0xb3b6639c539802aeL,0xfa0f1f450390d706L },
45196       { 0x46b78e5db0dc21d0L,0xa8c72d3cc3da2eacL,0x9170b3786ff2f643L,
45197         0x3f5a799bb67f30c3L,0x15d1dc778264b672L,0xa1d47b23e9577764L } },
45198     /* 20 << 0 */
45199     { { 0xad610a2d94a70ec1L,0xcd96f20591e71d16L,0x713466708cbaffc7L,
45200         0xf78cff0cd467f03aL,0x98ca8dd42d96c936L,0x1d1cdf7b5f223465L },
45201       { 0xe27a189460d4db60L,0x25f546ab321828ffL,0x9933fb25dccd4df3L,
45202         0x422da643ffe6132bL,0x5e01b72b4718bbc7L,0xab9dd81052ebfb01L } },
45203     /* 21 << 0 */
45204     { { 0x08265e510422ce2fL,0x88e0d496dd2f9e21L,0x30128aa06177f75dL,
45205         0x2e59ab62bd9ebe69L,0x1b1a0f6c5df0e537L,0xab16c626dac012b5L },
45206       { 0x8014214b008c5de7L,0xaa740a9e38f17beaL,0x262ebb498a149098L,
45207         0xb454111e8527cd59L,0x266ad15aacea5817L,0x21824f411353ccbaL } },
45208     /* 22 << 0 */
45209     { { 0x4f595351262bb775L,0x981b788d16f325b8L,0xccd57831927ed783L,
45210         0xc382472ebe0e1fdbL,0xfd7a8b13f0681fcaL,0xe082882d69059095L },
45211       { 0x4d1c3049faa71fdcL,0xf9d62fd9c9576c69L,0x7b1ab489cbf837b7L,
45212         0xc764edf840d0fcf7L,0x50fc847215809cddL,0x671d69c98fcd8418L } },
45213     /* 23 << 0 */
45214     { { 0xd1b4e74d12e3683bL,0x990ed20b569b8ef6L,0xb9d3dd25429c0a18L,
45215         0x1c75b8ab2a351783L,0x61e4ca2b905432f0L,0x80826a69eea8f224L },
45216       { 0x7fc33a6bec52abadL,0x0bcca3f0a65e4813L,0x7ad8a132a527cebeL,
45217         0xf0138950eaf22c7eL,0x282d2437566718c1L,0x9dfccb0de2212559L } },
45218     /* 24 << 0 */
45219     { { 0x259f272cfab816a7L,0x20c1b8e0d809afcdL,0x540c045a409c930bL,
45220         0x563361909bd5c2f7L,0x38076e8fca77d74fL,0x4f13f901fc55723fL },
45221       { 0x890932d7bd3d10c3L,0x98d82ad1da247ec8L,0xdf5579fa4bea82ddL,
45222         0xe8277439a0f9ad3aL,0x1395a87966a4e904L,0x150808e625a302c9L } },
45223     /* 25 << 0 */
45224     { { 0x1e93722758ce3b83L,0xbb280dfa3cb3fb36L,0x57d0f3d2e2be174aL,
45225         0x9bd51b99208abe1eL,0x3809ab50de248024L,0xc29c6e2ca5bb7331L },
45226       { 0x9944fd2e61124f05L,0x83ccbc4e9009e391L,0x01628f059424a3ccL,
45227         0xd6a2f51dea8e4344L,0xda3e1a3d4cebc96eL,0x1fe6fb42e97809dcL } },
45228     /* 26 << 0 */
45229     { { 0x6423197d2afd473dL,0xb0391b37897b93f5L,0x6efedb8023bf0b90L,
45230         0x808497b7b0bba4a7L,0xf14b309f03fa90f2L,0x37a45bdb091cbb80L },
45231       { 0xedda4ae48a8f5dcbL,0xdb3f422d95e16d6eL,0x25c7b9146f5f24c7L,
45232         0x5d512df99d42a727L,0xbf2c0862697c08fdL,0x47d98a9df092241cL } },
45233     /* 27 << 0 */
45234     { { 0xa04482d2467d66e4L,0xcf1912934d78291dL,0x8e0d4168482396f9L,
45235         0x7228e2d5d18f14d0L,0x2f7e8d509c6a58feL,0xe8ca780e373e5aecL },
45236       { 0x42aad1d61b68e9f8L,0x58a6d7f569e2f8f4L,0xd779adfe31da1beaL,
45237         0x7d26540638c85a85L,0x67e67195d44d3cdfL,0x17820a0bc5134ed7L } },
45238     /* 28 << 0 */
45239     { { 0xc76afaa373b64643L,0x4169b4117b3c1220L,0x550e0bee8ff22c6fL,
45240         0x8fb0c597a4da3e15L,0xd8232f8b4e492aa8L,0x55be5764d37da1a2L },
45241       { 0xf1bc89b628e77f9eL,0x9ff769c4875fee0fL,0x184bd4733ad6983aL,
45242         0xc48ee6f3b033c112L,0x792377fbf8eb8319L,0x05cdca3fe7988176L } },
45243     /* 29 << 0 */
45244     { { 0x019d6ac5d3021470L,0x25846b66780443d6L,0xce3c15ed55c97647L,
45245         0x3dc22d490e3feb0fL,0x2065b7cba7df26e4L,0xc8b00ae8187cea1fL },
45246       { 0x1a5284a0865dded3L,0x293c164920c83de2L,0xab178d26cce851b3L,
45247         0x8e6db10b404505fbL,0xf6f57e7190c82033L,0x1d2a1c015977f16cL } },
45248     /* 30 << 0 */
45249     { { 0x6a7a3464d0cbcea0L,0x76aad8b813126388L,0x519b9fd50a183232L,
45250         0x15f9abe1feb6b100L,0x7002990485ba4143L,0x92cea8f4c4360dd8L },
45251       { 0xdc6c5d1dc12748a1L,0x1846eefcdd3eb156L,0x3117dd04d47a41dcL,
45252         0x96c21b29f6a167f2L,0xf569446a27555692L,0x941292e500f88cb2L } },
45253     /* 31 << 0 */
45254     { { 0xa39c89317c8906a4L,0xb6e7ecdd9e821ee6L,0x2ecf8340f0df4fe6L,
45255         0xd42f7dc953c14965L,0x1afb51a3e3ba8285L,0x6c07c4040a3305d1L },
45256       { 0xdab83288127fc1daL,0xbc0a699b374c4b08L,0x402a9bab42eb20ddL,
45257         0xd7dd464f045a7a1cL,0x5b3d0d6d36beecc4L,0x475a3e756398a19dL } },
45258     /* 32 << 0 */
45259     { { 0xad852b878c0a64a4L,0x0d784cf208f779d5L,0x1896b9fcc651b1ddL,
45260         0xba8953d612e8dc87L,0x3a9865baa631cfb0L,0x5dd2a4a0626b3d79L },
45261       { 0x1148bc72687c20bbL,0xa372dfc2f2a52bfdL,0x77315f9e9448fd08L,
45262         0x4bcb06f00a2377b6L,0x73b42725b35b4ff0L,0xc510ad93aabca99fL } },
45263     /* 33 << 0 */
45264     { { 0x61333a382fb3ba63L,0xdf330d9d5b943c86L,0xbbc7c7ee955ef3afL,
45265         0xda631fc160f09efbL,0x68af622641d5c400L,0xcc9e97a46c833e9dL },
45266       { 0x7fd73e8e3a625e76L,0x13bf6124c209e55eL,0x08467cea48b90b91L,
45267         0x8a416eb9bb6f0abaL,0x6fcc93a1b8c31072L,0xa7fd2b619057dad7L } },
45268     /* 34 << 0 */
45269     { { 0x80b309dd2ada5bf4L,0x0648c2cd2d668c41L,0x45700722abb9102fL,
45270         0x9d6ac102b4e25201L,0x7ec2bc1cd50b3e6dL,0xcdb55e6ba07b7caeL },
45271       { 0xebcbda0786da3943L,0x470ddc68f8a57f48L,0x9e1418a4554557c3L,
45272         0x02d00cfb8a76b2d6L,0x03c050a061520726L,0xa964eefbfdadd24eL } },
45273     /* 35 << 0 */
45274     { { 0x58a5b5433720ec9bL,0xbb3800d52d7c2fb4L,0x4a508620dde6bd0aL,
45275         0x65f16273a02583fdL,0x832bd8e34fc78523L,0xd6149f75e9417bc6L },
45276       { 0xfeb026e93deeb52aL,0x0ce18088a55e0956L,0x50018998988092a2L,
45277         0x22f19fab28f35eeeL,0xac8a877f52ccd35cL,0xb13a8ad830e23f26L } },
45278     /* 36 << 0 */
45279     { { 0xf216aa2531238ed0L,0x4a13260770b1b757L,0xa39180d45c2c7ce1L,
45280         0x9f82b7fbab52606cL,0x6f01faee26946e78L,0x1608643883061d37L },
45281       { 0x597edf370fb077bcL,0x1d11bc5ed6e28138L,0x10209418c167fd20L,
45282         0x6a3258ec33f55675L,0xdf33eed7b73401b1L,0xf699887b806085b7L } },
45283     /* 37 << 0 */
45284     { { 0x0202d57de44f61a3L,0x4027704bb5630ef2L,0xa129e2dff5b54a5dL,
45285         0xacb60a7597482b86L,0x9261ede87ef27114L,0x1eba28f3defc58b5L },
45286       { 0x6c91c0c98be5589eL,0x2f1643d514594beeL,0x2ea912435d2ca034L,
45287         0xb50649a894047d1fL,0x284fcbb5638ca337L,0xfa0e07b7fe85bf85L } },
45288     /* 38 << 0 */
45289     { { 0x4703cd85891f8ffeL,0x018843c01c0d7702L,0xf3d752f5ad6cbeacL,
45290         0x479ecf018173fb32L,0x6b464412bc9a48c7L,0x47ba96091da7b147L },
45291       { 0x91af26eaabc13488L,0x87c183c3e1a0e06cL,0xdae2479844956b93L,
45292         0xf300e1c648347f9aL,0x129be314974320a4L,0x1f466694520618f2L } },
45293     /* 39 << 0 */
45294     { { 0x7d894f80506e0e42L,0xd984244a8e3d2c46L,0x6d7edf642b7f006fL,
45295         0x36a1cd6dde9b6230L,0xc9985040b76c0665L,0x587df4d6b89b1fc2L },
45296       { 0x4c0638476a71ae7aL,0x7b2b0ab3e8294747L,0x345c553ab53153b8L,
45297         0xb646e453436d9fe2L,0x1a95355f1cd60340L,0x2d7bc128074968fbL } },
45298     /* 40 << 0 */
45299     { { 0x6048c6949399c38aL,0x43a53ff21beb359eL,0x86fcfe4760be3ebcL,
45300         0xae78bc3a3134216cL,0x3b021cf316d7a9adL,0x51c4b1b36a4d6e81L },
45301       { 0x54b9cd8db593d816L,0x1df8cc84a69ea3a3L,0x98ff87f7370eb744L,
45302         0x63a00a0a60e0aa2aL,0xdbb22c9ddeb46e6cL,0xdfd92b6da914bb01L } },
45303     /* 41 << 0 */
45304     { { 0xad148e87bca6d14cL,0x41dfd24d456a201eL,0x73a82933a80d68f3L,
45305         0x89746c8d852ca035L,0xe3bc778895fd71aeL,0x8764cd2cda92245dL },
45306       { 0xa2fe2c4782eb23e2L,0x5ac762e00f3c9d6eL,0x57860ce121646f31L,
45307         0xbdc9d6c34f9f589aL,0x679952c7d193272eL,0x82ea702eeb18f1c5L } },
45308     /* 42 << 0 */
45309     { { 0x18ef56cd5d76b881L,0x31b22efc5df46c66L,0x4b21c4f3eb6c7e62L,
45310         0x3fd72a308f234c86L,0xe983e169ffff96c7L,0x7438b4933c1e593cL },
45311       { 0x863a23a3a553e8e3L,0x0d959ba9796d9129L,0x25d0caaeda1eadf4L,
45312         0xe739fb61eaa67763L,0x50029568472a7175L,0xdb6829c2f002bb6eL } },
45313     /* 43 << 0 */
45314     { { 0x37fa935500846d44L,0x09112fc50578bc8cL,0xdad9f5b239c4943dL,
45315         0x7314f5f0416dbd86L,0x5cf095a901fefb56L,0x35178bad22dab393L },
45316       { 0xcf79fc1b36baf1a7L,0x1b7ee42d749e5498L,0xbce78aa9ede314bbL,
45317         0xaaf8e0f6bd0628dfL,0xa974b09415cbf948L,0x8f3f1f63c9632b78L } },
45318     /* 44 << 0 */
45319     { { 0x1c5f0e5b36a400d3L,0xae97af8bf240b30aL,0x767b4ad7f8f99b51L,
45320         0xd50a288981ea36c2L,0x04ce2a21986c5ce6L,0x9c7e7754a320d352L },
45321       { 0xc3336331bbad8346L,0x7cc82a4df1698fb2L,0xc680176505c7ad6cL,
45322         0x47678afb27dda8e5L,0xade6096d02e543aeL,0x5fb28e322a1dd73bL } },
45323     /* 45 << 0 */
45324     { { 0xd4c411564fddda5bL,0xd4af65c673ad9112L,0xffe8e0bb39eb8f59L,
45325         0xb0040c0e8d6fcf13L,0x99e1c0c61f2bb599L,0x9c94c858b2ac3405L },
45326       { 0x8f8878d76eeed85dL,0x62b2f54351fcca3fL,0xeb3b44a9e5b56918L,
45327         0x16f96676b7234e93L,0x17477722bd2af19eL,0x42eb2979db83a485L } },
45328     /* 46 << 0 */
45329     { { 0xa618d7479fc4f435L,0x9f24fba649ddd10eL,0x60976b01b472d789L,
45330         0x9266634957719f54L,0xd9c79db800541257L,0x374aa9069481ed0dL },
45331       { 0x60efb1147fdc2d7aL,0xa1590c30ecf58643L,0xd7a198a4185a849cL,
45332         0x19ab802314eb4ab9L,0xc82d5998ec090d06L,0xfc539eb3e259c7dbL } },
45333     /* 47 << 0 */
45334     { { 0x6f888f7df0c668caL,0x65c788785f0dc66cL,0xbfb185125f5b07a0L,
45335         0x780abff7d878acd0L,0x504f21b1570cf950L,0xea5b37c5da233371L },
45336       { 0x487ae8bd22437ed1L,0x9c701758249cf9b7L,0xf86562a898fb34ffL,
45337         0xdfeea1a265e0fc91L,0xeef006912e20fc23L,0xac9dfec7dfa72a8bL } },
45338     /* 48 << 0 */
45339     { { 0x3ccf806ab35bf6cfL,0x2d368d48e7f30c2bL,0x4f504e06ea52bef9L,
45340         0x40d01ff53a7d2f3cL,0x62e5c5d3e73a1bc9L,0x66e4794bae7d7400L },
45341       { 0x3d30625e5ffef312L,0x4580609da766ddf1L,0x5c3ca10d04bab985L,
45342         0x2605ca009da2a2caL,0x48eab00eb5c9462cL,0x271e42a12624a583L } },
45343     /* 49 << 0 */
45344     { { 0xfa5c3aef697136c6L,0x8ea5af63a5ea6fb8L,0xa669156542e365a4L,
45345         0x47c56c115b6e3386L,0x1197832bcea03f56L,0x0b470bb250e4ea9eL },
45346       { 0x3113c74313b25712L,0x8d6c174ed2497d48L,0xfc4486ee49c9ebe8L,
45347         0x2487edd57f82bdd3L,0x771e64415b57be2fL,0x2d1cc518e28b2bdbL } },
45348     /* 50 << 0 */
45349     { { 0xa96763d2fba32d1fL,0x172cfe4ecb5af900L,0x510bd675cb2ec3f1L,
45350         0xbeabb91ac3c90051L,0x9cbf755b46f97ac7L,0xa820e8303a5d50d1L },
45351       { 0x83a9f17e308c4545L,0xdf7dc7053048461aL,0x6124642f0f32b151L,
45352         0xc1b444139333e405L,0x6f7bfa7e13a4f7d6L,0x6f58fa8b7181c2a1L } },
45353     /* 51 << 0 */
45354     { { 0x2c4ccac72070ac8dL,0x1947c0caec4a22b8L,0xa5e0fb598c5a78d9L,
45355         0x464ae8d241a84de7L,0x3dba16e9daaabc27L,0x16634a504f35cb3cL },
45356       { 0xadc18bf9b16ec84fL,0x324d067e7359dd35L,0xdaeac0c3570543f0L,
45357         0x0b2240003c887d36L,0xc69489e2373f1a0dL,0x518b047dcbaa0d97L } },
45358     /* 52 << 0 */
45359     { { 0x8f6468656f9201b9L,0x8a944b316b326232L,0x5687d1dca6ccfd35L,
45360         0x0bedaa85e5377c00L,0x252b48f5cd8d7d77L,0x4b820d9b31d83660L },
45361       { 0xa9e5af3ccae07f15L,0x0a8930fc1208b9faL,0x6d0a166ced3c3b7aL,
45362         0x90e2aead7f78aaf8L,0x222465866e5ede76L,0xc5cc339dcba1fd4bL } },
45363     /* 53 << 0 */
45364     { { 0x3b1bddc6fbde49efL,0xdaed7c268a0915ccL,0x0b0110610f0422a2L,
45365         0xcf485c74a7c54b16L,0x642ec4e615c3aae2L,0xa8ba8f10e0f383eaL },
45366       { 0x2a2054b495618501L,0xebec6442089efa8bL,0x5786a19a4e2fa83eL,
45367         0xd2c71ad139069963L,0xadc93d9a481765e2L,0xedf2e3eb7ecc9485L } },
45368     /* 54 << 0 */
45369     { { 0x11853add834e6c54L,0xab2f15202175fbf4L,0xcff00bd23c9b5a41L,
45370         0x075134ebabd64a6aL,0x48c075daaadd6150L,0x4576a6497cb89442L },
45371       { 0x340a767034adeda3L,0x8dbb571c77fcd1f4L,0x0bf879d693b44ea6L,
45372         0x1ae1dd97d13444bbL,0x6e9e86bb7b1eb77aL,0x420eb673906a2949L } },
45373     /* 55 << 0 */
45374     { { 0xbcab5f60069f3367L,0xfd6622bc1718ec3cL,0xa4fb7867e3a142d6L,
45375         0x6078d8bf085faeb3L,0xfa5cbfda60f4554fL,0xb3fcd5d1690cd408L },
45376       { 0x4ebdee7d281f7884L,0x82af23aa180a63a7L,0x8de3107c3d079f61L,
45377         0x17c6b5cbbe2334f8L,0x6a91e73997d0fa06L,0x7460257314ceeed4L } },
45378     /* 56 << 0 */
45379     { { 0x483350a5ebb8cdadL,0xd4215b4fc7a8baa1L,0x8b6fc785e692fdd2L,
45380         0x2629ba4fd1deca25L,0xe9981ea6820da79fL,0x7772a913e6436cc1L },
45381       { 0xd141235c553fb41dL,0x28179e6cc852f64bL,0xb623a1aeeb8cc21cL,
45382         0x05826192490bb572L,0x56fefff326f349ceL,0x31ff648e0f88b82dL } },
45383     /* 57 << 0 */
45384     { { 0xb14ba61cf97f865cL,0x73bae4c1694b8b0dL,0xa14967dfac4bbf62L,
45385         0x1e9dd1509bf446e0L,0xc052f3eb1c99ceefL,0x814d7fa07a78c189L },
45386       { 0xa101a483ab74b05dL,0x7788c258a1737b65L,0x0d60bab7e809a13cL,
45387         0x8f427bc473c81d5bL,0xd2e130552952c1fcL,0x0a823b9a4b26df63L } },
45388     /* 58 << 0 */
45389     { { 0x941c5c257d0be180L,0x341cf9d9c46785afL,0xdab9dc0015b0fa13L,
45390         0xa58db4ea4f96af4fL,0x9e9520bf57acc87aL,0x104cec0666ac72e0L },
45391       { 0x9f3f7baa1929e675L,0xb8b4ac9ffa80380aL,0xb5f157aa569b57d8L,
45392         0xe11699e909fa58a1L,0xc08595e35548fbeaL,0x2b51995f794da901L } },
45393     /* 59 << 0 */
45394     { { 0xaf467ce227bf64c9L,0xdfca6897f929974cL,0x64473b595c322738L,
45395         0x96a917cf1ed0e315L,0x3703435b0de64db9L,0x9ba039679267b646L },
45396       { 0xdf0c2aae3a522fbeL,0x41bdb741b335eff0L,0xaccf2edd7b059703L,
45397         0x6fb34b3028463cceL,0x96d9ba0bd9e3ca19L,0xff336f12504655c1L } },
45398     /* 60 << 0 */
45399     { { 0xc711d5d1c425543eL,0xa61fada6fb4f60e8L,0x0402d5c4eb809f85L,
45400         0x84b7c2fed74cccd4L,0x61bba736a55b5277L,0x95bb80cece47968cL },
45401       { 0x09f92adc16eb7b95L,0xf0e0f4f7e682aa29L,0xacd70b86ad2a20fcL,
45402         0xbb45a51f948a8375L,0x29fc3b284892e676L,0x8dd21bf0b4ea4f51L } },
45403     /* 61 << 0 */
45404     { { 0x48da1fd3fc60a6e0L,0x54fb5a34222241e8L,0x6035e34f772ae080L,
45405         0x5ff77ff2332982d0L,0x2366467300fe51fdL,0xc93ea049ef6ba006L },
45406       { 0x6640f1177d381266L,0x394d32cd6ae9f4acL,0xe6a7885370d303ebL,
45407         0x0dda19ffe5275767L,0xb0a6c77201466d23L,0xc4cc11451fc69829L } },
45408     /* 62 << 0 */
45409     { { 0x49a04dc0f5acf772L,0x1e659730c1fb476eL,0x0c7d749907dbb9afL,
45410         0x03b9f1cebfec21daL,0xd194b7054b14d117L,0xcb4c0a54561fedf2L },
45411       { 0xaf623d3f21da4d42L,0x5f5e9b1fd630c145L,0x65609e59d9ff0abaL,
45412         0x3d2508922ba9239bL,0xcac324ec82c4faa7L,0x0902cc23149446b8L } },
45413     /* 63 << 0 */
45414     { { 0xc5c0e6d7aaed89c0L,0x6ce8ead6149a1896L,0x7a50f7458c949f8fL,
45415         0xcd7e35f76e2b71aaL,0xf6159e519a049f7aL,0x1c9bf0b0f1e52d1eL },
45416       { 0x3bb6c1f518202c80L,0x8d3a5f621ecd7b1aL,0x3bb034e888d17f19L,
45417         0xdc89bd4997d4048dL,0xf5af7b8e3735df22L,0x52bb3712a0a689e8L } },
45418     /* 64 << 0 */
45419     { { 0xed4de4f88e89b258L,0x957c980f297a9a37L,0xe04b3d30f8a0580dL,
45420         0xa309199dca57b7bdL,0xfc8e87cf3be44d56L,0x4f5d5ab6d1b30e5cL },
45421       { 0xb213c6a030a9325bL,0x0fd1c52df091bc01L,0xfe51bbbf1090fedeL,
45422         0x6d97cabc301fe259L,0x3ee127895ecd3fe8L,0x888b708b9404ca51L } },
45423     /* 0 << 7 */
45424     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
45425       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
45426     /* 1 << 7 */
45427     { { 0xe484fd9f8258030fL,0x0f4fa5eff21af80aL,0xc0dd449e7c1c3984L,
45428         0xf313389118eb5195L,0x0336aab8777a16d2L,0xa6661cc4c241720aL },
45429       { 0x678db970a7efacd0L,0x228968656461e382L,0x5d85a0e4a022c7a4L,
45430         0xb01f1e0434a02a6bL,0x2657eedda5791ce3L,0x239dcab2a277ac5bL } },
45431     /* 2 << 7 */
45432     { { 0x9a7a5b426ae54da1L,0xcfcadaab7040b022L,0x7539438e3d9f0e61L,
45433         0x013c6719e328c2e2L,0x7f4a706ccccbf891L,0xa335ab82735a2d28L },
45434       { 0x46694ef03d984124L,0x0e0bdfabc166b337L,0x9d54ed8b423d47e4L,
45435         0x8075a8cbf44c9180L,0xd4f5b184abe9b384L,0x424dd00b41abdc75L } },
45436     /* 3 << 7 */
45437     { { 0x99a710b1400f1d87L,0xec3ca386ee47be8bL,0x3a00dcad37168feeL,
45438         0x1a69d6741765a0dfL,0x85233afe917c4909L,0xa3aa97a4e9bd6210L },
45439       { 0x01010526310885f3L,0x21c5de3fb5007b08L,0x5df0c6efee8ddabdL,
45440         0x5d17d45a0f6dfdefL,0xb73d831a251c9f79L,0x397779e6cb1df19dL } },
45441     /* 4 << 7 */
45442     { { 0x5e2cb07fd7801edfL,0xf9fa2c0b3adc065aL,0xa296c53fd4de1f25L,
45443         0xd408060c838f7169L,0x68e19d7b2e8a6ce7L,0x2cc6e06c94b58671L },
45444       { 0x93d02a07c1cb6151L,0xa10fb4cf35003126L,0x6aa069f51aa3bc4eL,
45445         0x0e44fbf0dd09b142L,0xe264f343832e5945L,0x5dca2adc1fc166acL } },
45446     /* 5 << 7 */
45447     { { 0x5f63e391d7afb4c6L,0x85208bcd2bcb4a76L,0x10022d53c3da8fd7L,
45448         0x607538c007e50047L,0xdbdb0e7212793242L,0x8e6b9f6135eb668fL },
45449       { 0xbe5632887e1da455L,0x5e73e1a06e544e82L,0x0c28a5d29a2da4deL,
45450         0x62b30a8822326300L,0x470764f16013086eL,0xcbe2c34cd3ef5fbbL } },
45451     /* 6 << 7 */
45452     { { 0x9ee4f522b0f6c604L,0x5b8a689d52736e58L,0x0d5f396db7edb07cL,
45453         0x09b3457c2e829063L,0xf1d28188f83495daL,0xba2511e6cce559b8L },
45454       { 0x17cbaf57d8f90669L,0x3ba19a1c514eacf0L,0x298208995145b8fdL,
45455         0x92cb5da81a33b1a7L,0xca49fe334c5149e9L,0x5c499b661772b4c0L } },
45456     /* 7 << 7 */
45457     { { 0xb98266b132508180L,0xf5008b926719d49dL,0x50c513f98069ffe6L,
45458         0x99ceb828a7c6f38eL,0x375b8a8225e2a436L,0xb8197f6c416c073dL },
45459       { 0x01663a25eadf09ddL,0xfa2ca1571d7ff230L,0xf3b65b2545284aa4L,
45460         0x144dbefe648bd565L,0x6095ed8ab4c24e35L,0xe1f1fa3696ff2020L } },
45461     /* 8 << 7 */
45462     { { 0x56ad7582a0eb176aL,0x085b5a366e19aa00L,0x85f2c6ffe2c8b036L,
45463         0x55c6d357fcd7336bL,0xb1ecc56d22a46acdL,0x8e0f976736277ac7L },
45464       { 0xa4ed11e901878921L,0xd38355667f4fb650L,0x5fdaba45266158aaL,
45465         0x6f0b27fd89e0dff0L,0x32ef7ae2eb6b02d0L,0x2f145871cc1b46e1L } },
45466     /* 9 << 7 */
45467     { { 0xc7698dfd4b449cfeL,0x78aacb7bd1517720L,0xaf0f6ef574cd5f32L,
45468         0x026f1826f17954e3L,0x33ef67ab2453185bL,0x82f0fcc90a420c0fL },
45469       { 0x5b444b3645f154b1L,0xb27c4ece70d17f90L,0x6417e0d039282194L,
45470         0xebfb5fa001aa4f4fL,0x9cc5d0b573932754L,0xe8b56699704ffd85L } },
45471     /* 10 << 7 */
45472     { { 0xc112733b9d4075dcL,0x349281c187737549L,0xbb7d8e0181009785L,
45473         0x7640a3e2bfe16c4fL,0x4e34813ec1d9f810L,0x61985fbc8d2605d7L },
45474       { 0x2a544cd8e3f66442L,0x48879af56a7c9e94L,0x9e6157bacec18a7eL,
45475         0xa555fc9511b882d6L,0x4305a4dd04f86563L,0xc58ed7631d0fd96eL } },
45476     /* 11 << 7 */
45477     { { 0xaaeec0f9b726e2edL,0x243ba6614493d146L,0xd799c3408980a9fbL,
45478         0x886e4f44ed060f57L,0x52126b82c1f83f6eL,0x8b4978441df301ceL },
45479       { 0xeb2a98abcdc4e434L,0x87dec119474e2c77L,0xcbbc613092eb1528L,
45480         0xb0b0bcf7c454f37eL,0x404d97a7e1a919d3L,0x26d1baa825e62c30L } },
45481     /* 12 << 7 */
45482     { { 0xf04145e82d2696b3L,0xaffb66acf4fb2928L,0x9ffcba4e12aa299fL,
45483         0xcc5ec24991b3b517L,0x9edcd4616f81c747L,0x0a96090a77a883ebL },
45484       { 0x9b0bab58a2aa4badL,0x76359a5e8f9b84e7L,0xfe8cd81e438a9d43L,
45485         0xf40e2b5e25ca8b3cL,0x4254030067bc720cL,0x883002a46b2446a3L } },
45486     /* 13 << 7 */
45487     { { 0x4b43bd3206c3aa7bL,0x83ca2db60a470b08L,0x07c1036c06f22f37L,
45488         0x312e04d7bbb46ed2L,0x6a1d70a40193e5f6L,0xc69720e8ba8a3f38L },
45489       { 0x2c003429468a04b1L,0x885c43bfbc83fe25L,0x65a65259393e00e8L,
45490         0x7154c7ac2af17741L,0x682224d331dda744L,0x6183dd8bc80b57f5L } },
45491     /* 14 << 7 */
45492     { { 0x80e1cd16c496089aL,0x7a59f4c06ec2000fL,0x67a019d509ddce06L,
45493         0x52573e3e70c4b032L,0x16d253e14d3ba57eL,0xa43c6d42162504f7L },
45494       { 0xa237bbf952ff95e4L,0x81187e659acb7273L,0x4b13531a1f384daeL,
45495         0x39067f3398125165L,0xe98fb141672dccc1L,0x594baca0a75e27b5L } },
45496     /* 15 << 7 */
45497     { { 0x85e12293c205465bL,0x57bbcfb1b71cbe44L,0x201ed45c1bc85881L,
45498         0xccbc39d5ccbe7dacL,0xc509b77f9277f310L,0x171b603aca1b70efL },
45499       { 0x9b99605504d2dbbeL,0x986d6323451c918dL,0x75ad922f63c6fb03L,
45500         0x69e2cca49630182fL,0x1389a2b7f7b34d1fL,0xa66a80323d4f7c7fL } },
45501     /* 16 << 7 */
45502     { { 0xe65245cef6e9f82cL,0x9e234dfff6da7b5aL,0x5677c121bad2c806L,
45503         0xc52dec32060fcf24L,0x78d070675d78cccaL,0x630002ea1bc8b6fbL },
45504       { 0xc5cb86beeb2e99aeL,0xf13981e78551d16fL,0xfbb7cdf2c92a70d7L,
45505         0x5a9ff1f1f53cd2a1L,0xfdbe6b7a984f1139L,0x4403d046a470a9f1L } },
45506     /* 17 << 7 */
45507     { { 0xdf8c9325efcc63faL,0xe0d35cd966563147L,0x140b9a8bc144d7b9L,
45508         0x492bfbd70c17c75fL,0x3cbc2b644c5c4d8bL,0xfecfaf47ff8a3328L },
45509       { 0xaf341aa179b8c3d5L,0x5e72713ff04f29e6L,0x652219fb9f5b6fb6L,
45510         0x9deeba3f0764460fL,0xb8c2bfa5fa069d0fL,0x5d3e6fefe57be3e2L } },
45511     /* 18 << 7 */
45512     { { 0x52c9b94decd84cacL,0x34c2d0ad446dc59bL,0x5563701d951878ceL,
45513         0x92e2fc1c843c9b1cL,0x2309a5f13dfc7a98L,0xdaf117dc0c57a156L },
45514       { 0x5739190d359fb843L,0xd433e9bb4b88e3a8L,0x4d6bb0e2c47a1f45L,
45515         0x511eaa33d7b59627L,0x42ef82c5e389e532L,0x641a0bdcd75f4c08L } },
45516     /* 19 << 7 */
45517     { { 0x3ae32dbdc7e30cc3L,0x0c970135af5d0ea3L,0x8fc38e50bd9a0528L,
45518         0xdb0506791bfa634aL,0xf3514fbd245cb0dcL,0x3a3c8c6982319ddeL },
45519       { 0x92136baf6426632fL,0xabc3e24aabdd5641L,0x8ccae1429cc004baL,
45520         0x6c9834d8b3ee0d66L,0xa807ab63e1f7e8d7L,0xb4598e2a220aea7cL } },
45521     /* 20 << 7 */
45522     { { 0x19821469d678d1a3L,0xf9fa42e60df2f58dL,0x1177daf49f284ba0L,
45523         0x6dd2ad3d2a201dafL,0x667b0e383d427075L,0x39b76d1d4212b65aL },
45524       { 0xc6720ae0bf3612fcL,0x72559d98775f8137L,0x466e8e4476c48a09L,
45525         0xa05f8eb07fb5428aL,0x7fa1fbce5e36b7d3L,0x13bab84f8d1fdcd1L } },
45526     /* 21 << 7 */
45527     { { 0xf1876140ed6f3524L,0x47171ee5cb94b2adL,0x56d836abcb8de844L,
45528         0x346e80890d3b4271L,0x0110df1fdabf6a02L,0x6850fba1f571cb92L },
45529       { 0x490cd9af6209f064L,0x41f32d5f1cf5636cL,0x558bb7ddc328f9dcL,
45530         0x44abd0b9d32e3e4dL,0x2c42a5607fc2ff0eL,0x8b1dc5e12c9931f5L } },
45531     /* 22 << 7 */
45532     { { 0x6a35f6efdca1ce69L,0x04216d3184de3658L,0x3c3010df732f31b1L,
45533         0xe4421a872c1444b8L,0x17c987a3c59c1ccbL,0xd67159dba297df1bL },
45534       { 0xd13aa7a0bc96041dL,0x686d7b77f44c3d8fL,0x6c2e505f09b2b933L,
45535         0x8c04eb8256161b34L,0x61785cb4b344bec6L,0x60b4d06cbf8b0b45L } },
45536     /* 23 << 7 */
45537     { { 0xe5b055481883c1bcL,0xd5bc37684597b8afL,0xa71ae49adb2fae11L,
45538         0xc1ac1b3e050327f0L,0xd990b2a668f3cb1aL,0x566e5175b74a3228L },
45539       { 0x348d382957909fe3L,0xe849dd8dd03c2374L,0x4f31a278150fb5b4L,
45540         0xbfe265cf168c0798L,0x2737c156ce6a34beL,0x4478d6ae4aa6b73fL } },
45541     /* 24 << 7 */
45542     { { 0xb5b16cd48d040c69L,0xfdaba315f95a2dc4L,0xc9fef34961ce4704L,
45543         0x5fe87a0ddbb53ed6L,0x3f0ccc7973d70f93L,0x4601d1bc46724a1aL },
45544       { 0x5c4a15ae24f08565L,0x5eda1e8aaa577320L,0xe31ebb35bb32d307L,
45545         0xcdc6f13bdc770a0eL,0xbe3ae514c434c2f8L,0x57c7fdf63a0ef0d1L } },
45546     /* 25 << 7 */
45547     { { 0x85165ea2d71c01a5L,0x3935171c99a29e59L,0x2aa1b5837d326190L,
45548         0xb1d702f8e79f3959L,0x94100c65c6ddffd0L,0xd1d56d626a9c54c6L },
45549       { 0x5c93b4cf7ce12b66L,0xfc28574bb32a90caL,0xcd654a96e755969cL,
45550         0xa06f436cd1bec664L,0x9b27c110ffb6f3e6L,0x529b77d317b476c4L } },
45551     /* 26 << 7 */
45552     { { 0x04c3d9e162ccecd4L,0x6050bc1221cb59a1L,0xb33847543cbb7e07L,
45553         0xef2201ac4cf1be50L,0x99c3dda42d2ac886L,0xad19cb0ab776eff3L },
45554       { 0xd326dd7f5a3d9036L,0x9fe56af2e5b27667L,0x3d849fc072cea4d1L,
45555         0x262a0cbcd6aa9e3cL,0x8286211885401b09L,0x8ec71d4b98fe8047L } },
45556     /* 27 << 7 */
45557     { { 0x9b769cc43c6b2de7L,0x433d4c26acb13b6dL,0x52878f517530ef4fL,
45558         0xd0e7ce94b0c5354aL,0x5b094d461d92dbc1L,0x75f681449e4ffb31L },
45559       { 0xb9b9e97351b9d1e1L,0xc147ba4698661569L,0x2a06f4cb7a239309L,
45560         0xd5cb5ad420928958L,0xbde0283bd5bdf5c6L,0xb91664a082e43c18L } },
45561     /* 28 << 7 */
45562     { { 0x8fc0cfa6e51d078aL,0x431d9dd5744ca779L,0x37a4f3120e96e887L,
45563         0x9c3624fa03ea5144L,0x47d5ecda0b1127f4L,0x018ad424807cf96dL },
45564       { 0x58ba530f586b16b9L,0xec7271ed72f47883L,0x8d2918da0281ac88L,
45565         0x6d0f14ef002330c9L,0x1a90a01591dc35caL,0xeb8e71e9c81607dcL } },
45566     /* 29 << 7 */
45567     { { 0x2eab9c5ee6d01fd3L,0xe030e6d23fa77f57L,0xff41311877edc0e9L,
45568         0x7817766bb47ca351L,0x70c987e36cb15abaL,0xc3c867ace19c5aa4L },
45569       { 0xc24ec23ea05c3810L,0x3965a165c4f0f350L,0x52af99cf7c0d8e5bL,
45570         0x2d95d23c106e0b12L,0x27507b297f6d44d3L,0x33da846858b191f9L } },
45571     /* 30 << 7 */
45572     { { 0x8e5785629aa664e0L,0xf3a1cfc329a97c9bL,0x91ce3b404037bd09L,
45573         0x34c447b07f9f2482L,0xebe360164010c2a6L,0x7b8b9b3afdc0a861L },
45574       { 0x0e60c49199c4ff9fL,0xf1cf53b1053e703bL,0xabeae550dd974a16L,
45575         0x28ac5a34994ea50eL,0x9384617d27329793L,0xd04db83ddad0aec7L } },
45576     /* 31 << 7 */
45577     { { 0xcb0ec2bd4b1537bcL,0xd0de683cbac6569bL,0x0688dbee5c96afb7L,
45578         0x7c7d192f3324ab6fL,0x1455b1e6165fe655L,0x32d135a1ccfe9e1cL },
45579       { 0x05a80a2af9e1a86fL,0xdc946c70479c71f1L,0xf8b9ad985aaa0ff3L,
45580         0x78cf198ef195bbceL,0xadbc082dfcee6b59L,0xe6e1fa844cd19e25L } },
45581     /* 32 << 7 */
45582     { { 0xeb06571c0f547ebaL,0xf292c38d6246c0dcL,0xa185966726eed224L,
45583         0x8d9e56e46100e387L,0x470506b9dc6298d1L,0xb19e084cf3350ad0L },
45584       { 0x83eb62a812abd898L,0x70f152cc2222342cL,0xb089e880e1bd4a82L,
45585         0xd4d1e70fcaf3b3fcL,0xd0b1ec6395ffd65cL,0x79f27f3a9b184ebbL } },
45586     /* 33 << 7 */
45587     { { 0xb4a7435231a3e816L,0xba8a0af2fd4ada3aL,0x1622289dd8fed2e4L,
45588         0xb71e579e31d3745cL,0xb090650704a50576L,0xc98b5f20123f900fL },
45589       { 0x3799ee82d3587b21L,0xafdd6dc79d9abe55L,0x4053ee2aba64b9d7L,
45590         0xa816246657b3f258L,0xd9b5c4c4690b1169L,0x32c1d3afd091d158L } },
45591     /* 34 << 7 */
45592     { { 0xff5a9c58de97d0d7L,0xec086138feede4acL,0x55b14035ebf47cecL,
45593         0xc0b3e061c619fe18L,0x5644c092ead4ebe9L,0xa1a4f7a41e5e0a61L },
45594       { 0x8698da06d179219cL,0x86f560bc3f88f732L,0x6ad10b3f1e34a23dL,
45595         0xd4326bb71307ede6L,0xc93cd2a19b3045adL,0x5a0b733dd8a5160aL } },
45596     /* 35 << 7 */
45597     { { 0x68ef87cdeaedf10dL,0x5ce97a07bed10cb6L,0x9b8dbd896ed762c1L,
45598         0x1a72b05333c1dcd8L,0x6718eff90f97cfa6L,0x02f886e57dda698bL },
45599       { 0x9db378a8c724f4c7L,0x5b55b8383fa6548aL,0x9935a70ecb24bdf9L,
45600         0xf5da6936e9de8ae0L,0x3b3a10a79b0c4bcfL,0xe4e6a6e86361c492L } },
45601     /* 36 << 7 */
45602     { { 0xb37fc581c634a8f8L,0x06f06c93de1d01acL,0x0f2dac8452fed4ccL,
45603         0x1673c81bda53f81fL,0x963e500e61e11c94L,0xe86ff87e2144d55fL },
45604       { 0x343ddf389bbaec76L,0x16a13527806df1edL,0x1361b5ac0a9edd65L,
45605         0xf20507fe33c0124fL,0xdf64ec1e4e8e0d18L,0x3f6a42e27860a8f2L } },
45606     /* 37 << 7 */
45607     { { 0xe6db1c43d38266a7L,0x55bee1a3adec0d4dL,0xe41c403ed56d2f9dL,
45608         0x5fb703f24d3cd93cL,0x4d7ae8c53d2a7ccaL,0x65c8ac50ffa5fff2L },
45609       { 0x128814ec264dfa80L,0x08d1372ea642513fL,0xfc5ea1615343a57bL,
45610         0xc70a6f2f9a2f3f3cL,0xfe61c499df4963f1L,0x2b711eee5cea1508L } },
45611     /* 38 << 7 */
45612     { { 0xfc3e9fb252f9a4f3L,0x8bbeeff32180cd36L,0x274312dbd6438c99L,
45613         0xbd30984a55612a57L,0x344006d609381db3L,0xd9b696f62bcac509L },
45614       { 0x481e4ea3bef646d0L,0x213033d430561b68L,0xf46bf9a05453f623L,
45615         0x2af3c4a46d848d97L,0xc35e55a543efa02eL,0x8da254342462874dL } },
45616     /* 39 << 7 */
45617     { { 0x1f7fda656a12b927L,0xf628cfac876b9303L,0x1904a0b5d0d0d0b2L,
45618         0x46d486f6f2894b1dL,0xd35cb5610d243bfeL,0xe759579b851a568eL },
45619       { 0xb99572e2c1aeda5cL,0x872e16fb1c54cd1eL,0xf5ec9e42a60fdc40L,
45620         0x59b03a6201a4b019L,0x9c5e7f87e272e064L,0x6240282f24c918a2L } },
45621     /* 40 << 7 */
45622     { { 0xc2467f9ab92a9a13L,0x0c3ee8eb6add349aL,0x59250eda45e99644L,
45623         0x22ce0635c8a2df27L,0xec7b643e312e8698L,0x334ccf2eaebd1587L },
45624       { 0x0c1c68736bca2900L,0x00beb4c209826cb1L,0x12dbb586cde6b725L,
45625         0x8d7cee6c66dfed41L,0xc38deba2014de4c8L,0xa3ba6ec76248442dL } },
45626     /* 41 << 7 */
45627     { { 0x870be3ebef38abf3L,0x6e0cf541f74dc605L,0x499976bcda4bc168L,
45628         0x5513c6122548b3b8L,0x5b9a054c3f647360L,0xa47f9f8bde929154L },
45629       { 0xa2ae9ccbb8ec35b4L,0x934c5c0a4d9857e3L,0xc9dd66cc4b4f01ffL,
45630         0x42a1afa2e5b5e147L,0xc284e464f3d9b380L,0x67845404e21bbe63L } },
45631     /* 42 << 7 */
45632     { { 0x9ec1ed3342ec772dL,0xa77e1ecf5501609bL,0xb059e214a02906f8L,
45633         0x35b2ebceb28e4d14L,0xb8453ec22cf036eaL,0xe621234b2518fe75L },
45634       { 0x079d7d11f03cd158L,0x357492f91b2f011aL,0x3c2186da0661992aL,
45635         0x7adc1c0fe5df978aL,0x88d329db5300cdccL,0xd915c2444c0d644dL } },
45636     /* 43 << 7 */
45637     { { 0x1b9797a8f0ff03f6L,0x00dafe43f41c9284L,0x1e565c33f2bdc817L,
45638         0x63b77ad9784b1a5dL,0x3304540e74aa6079L,0x630524f3d7181d2bL },
45639       { 0xb4fe5fcca2804658L,0x1e48e50b9e393a6eL,0xb5bccd49397a94a5L,
45640         0x95394743eef17accL,0x4d67ba5226dd1687L,0x80965c3432349d9fL } },
45641     /* 44 << 7 */
45642     { { 0x1d70669e49f1216eL,0x8645472fa5fca474L,0x9242e8ddfc400357L,
45643         0xe7ac31548623996fL,0x37b9e68ce61aecb5L,0x7d2e10fdb997e4c9L },
45644       { 0xc0cb59a6c2086dc9L,0xb38e2032d7952172L,0x78eaecf6eebac939L,
45645         0xece490b42f5dbaaeL,0xdb17501dcdc32565L,0x59bd392ab133bf99L } },
45646     /* 45 << 7 */
45647     { { 0x71554fae07de21a7L,0x3dd66b8bcc42db25L,0x9da85c0f0636e9a4L,
45648         0x61fef273904930d8L,0xcc8f527b73369e81L,0x4207dfab7caeacd8L },
45649       { 0x99e5d1404fc763d7L,0x5cc6a3739f4e8947L,0x9ef14ec1cde33eaeL,
45650         0x25eb3aa8095872d2L,0x0db8268d7d9e6dd9L,0x38846510c2ccfe92L } },
45651     /* 46 << 7 */
45652     { { 0xce6197e822d0a502L,0x69df7f8e09d45970L,0x0274f48b7eb4718dL,
45653         0x47461334a8c22b75L,0x89cebf17bf25b9abL,0x57c042f6fdfea412L },
45654       { 0xb19c338644346b96L,0xdba17de06ba014c4L,0x6697687a5f844d69L,
45655         0xf16dee4c1a66c6faL,0x7f916e47fdafd0d7L,0x1c3842d2340f158cL } },
45656     /* 47 << 7 */
45657     { { 0x417c9ab760efab2aL,0x1745d5c2f0065f75L,0x1a7d86f2ed71b350L,
45658         0x6d4d504feee5c850L,0x4ae7ee0da657b859L,0x1f72ded53c302a3fL },
45659       { 0x08779fdae7b22e51L,0xb04c1c0446d90bfdL,0x4dc97219712f96d0L,
45660         0xb15e8c0041a6be82L,0x384a02cca3804090L,0xcea45861babd1ee5L } },
45661     /* 48 << 7 */
45662     { { 0x3c686079d42aeb95L,0xc162e5e985e3ea0fL,0x34cf58611bbb2455L,
45663         0x7650de1d8773b064L,0x3b7562c6d2bab35dL,0x83191b4433d0741bL },
45664       { 0x4b604db03a6bd9cfL,0x87cd84db074aed21L,0x02a042d2d4f91f9cL,
45665         0x5a5d52e5e42c2a67L,0x31291acd1d5f216aL,0x9c3971bccd6203c8L } },
45666     /* 49 << 7 */
45667     { { 0xec931d6599e9ec3fL,0xe9d780c64bd554d9L,0xa580534502eca45cL,
45668         0x84701f1ac1276ca3L,0xcb7ba786d5f9438bL,0xf3a27508c85f663aL },
45669       { 0x044df512118c9421L,0x1109fd431039871bL,0x7865443de2378386L,
45670         0x7a5e2d49e70297abL,0x112763ca6824d2b3L,0x8a05f2c90e84bba5L } },
45671     /* 50 << 7 */
45672     { { 0xde3bfdebff044924L,0xd7f2a5181a0458f9L,0xc03df0c00139d557L,
45673         0x7a958c60cd3ad0d4L,0xec9f2f9759a43584L,0x5e0fbba950d8b4b6L },
45674       { 0x5fbc5e3888245837L,0x17235805a267a54aL,0xdc24a508db55d65bL,
45675         0x431e4d5623c704d1L,0xb1f85b2277585f9cL,0xb288f25ed0b1c374L } },
45676     /* 51 << 7 */
45677     { { 0xd8fd5b405a37c029L,0x5c9d827fe4d37effL,0xe024d7952e046275L,
45678         0x0661277f913c55c6L,0x21ee10eb904b3679L,0x32c582e066778adfL },
45679       { 0xc353ab1fba8d17daL,0x1d4ab06b5658ea17L,0xb908cb88a2d70bb4L,
45680         0xfc215909a98daaebL,0x7aea6c8777000e24L,0x19e0acbe38446e20L } },
45681     /* 52 << 7 */
45682     { { 0x1bc3803e2f98532bL,0x39d0c3258754d142L,0xa7b035c5d739eaefL,
45683         0xd36ddeb8fbfdea2dL,0x7df72a94bdf64f2aL,0xab4ad6b880bc3c47L },
45684       { 0xdf386df3877fa482L,0x4b94260470519bc3L,0xa3399d91d20e1e04L,
45685         0x7f5208b797cf58ccL,0x528f6a2814424c00L,0x83d74730bd900d10L } },
45686     /* 53 << 7 */
45687     { { 0x501c657f34ded7f1L,0x9071027e12fa53bbL,0x395e16aedff079ccL,
45688         0xea95dc84770ac4b2L,0x4d2aa60a41355974L,0xe04effa507f12473L },
45689       { 0x38ca98385cd1c738L,0x3c067a0b683c0dbaL,0x55ad2dec67589842L,
45690         0xe51550f7dfdae3c8L,0x21a56717214d51aeL,0x75b6a4a012a0fdcdL } },
45691     /* 54 << 7 */
45692     { { 0xd63605266a4ea95bL,0x180f72d403e67090L,0x7faf4529751c8c9fL,
45693         0x1ab7b50d00e4252aL,0xc0e69adf34811274L,0x5c4c83495e99c6ccL },
45694       { 0xcc9467f29a9e02a9L,0x5402c2da5c4fc719L,0x1dff8c5d3f6d5bddL,
45695         0x88a7d27a2c653c3cL,0x067f31183a050dc7L,0xca0f7dafc4f0236eL } },
45696     /* 55 << 7 */
45697     { { 0xa09306e9ca177c3bL,0xea84f03ed0552a4dL,0x7ae9024f3c00d359L,
45698         0xe189ebc33aa619faL,0x4adeefac8354579bL,0x90168ef9699db1ebL },
45699       { 0x75319141ad87490aL,0x7b48fe7629c1bf84L,0x00ae82c7a2235f2aL,
45700         0x6292c9cf68562b59L,0x0b6500943935ca20L,0x39f22cb027f33addL } },
45701     /* 56 << 7 */
45702     { { 0x92e4c851aa1ef488L,0x4f91fc22846528a9L,0xaa2f5d2d5dc13a84L,
45703         0xba06aa68f1072d4dL,0xf4f3b17c5e3a2ba9L,0xff36a5355e4dde77L },
45704       { 0xe8ef143aae17dddcL,0xcc82631ba1fcd4ecL,0x97db807ec7d3963bL,
45705         0xe4aff04521d85ce2L,0x2d6480e674667392L,0xc8ce97f3a55d0b3fL } },
45706     /* 57 << 7 */
45707     { { 0x1a32b8457962a675L,0xd78efd71723d217dL,0x9b03d6573b41a2c5L,
45708         0x1116f33589a380b1L,0x2c0359af931ee15bL,0x8a53744f239ba4c4L },
45709       { 0x4801397dc78cdc83L,0xc43b9f0434ae4453L,0x9cc8f6cec356a35bL,
45710         0xd5a74c2a648b39e6L,0xa54d668c0d5e78fbL,0x36257047cfcb8f6aL } },
45711     /* 58 << 7 */
45712     { { 0xabeef3461549c215L,0xfec59db2ce4aee45L,0xa1743a0f5305df83L,
45713         0x9d598abdf211bacfL,0xd14609dd52a513fdL,0xd3dc446be00d4ad0L },
45714       { 0xbd8883e9b272211aL,0xe991e57757879fd6L,0x5a093d372b732171L,
45715         0xdd901071f55f18dbL,0x87f04c0034fecfd1L,0x2c07df27c94f6a5bL } },
45716     /* 59 << 7 */
45717     { { 0x518e3ced1c17df0cL,0xf8971149ff5dbc4eL,0x5fec8bfe0ac9d27cL,
45718         0x41d68852489eed7dL,0xf48ef4bf3c3c4725L,0x3b8d9eee7681eceaL },
45719       { 0x7743ededdaae4bdcL,0xb9665ef5d1bcf697L,0x9d77f535471bb958L,
45720         0xb5db5b96d752b2ddL,0x2cd3c919c368982dL,0xf8297660e9cff6d7L } },
45721     /* 60 << 7 */
45722     { { 0x39e7da1028946a2eL,0x4e628a96c3a76f7cL,0x43b8b808e9f6000aL,
45723         0x86cbd25ca48bbb79L,0x5ce825e273092951L,0x43a6031df0cbee32L },
45724       { 0x6d685a594923485dL,0x8d4483ed81a17f47L,0xf61d329bbc379719L,
45725         0x9deef7d0f6596ee8L,0x0314a572541b1222L,0xe2b34d387ea7d376L } },
45726     /* 61 << 7 */
45727     { { 0x05ff6faa31f43d37L,0xfb83f23211b801f6L,0x238792d519b223a4L,
45728         0x28edadcce004f601L,0xf77747b3bdeb7597L,0x2178dbe21e6575d4L },
45729       { 0xd48ec49842870ba2L,0x7733661d15dca6dfL,0x08212e2f83393416L,
45730         0xffa1bfe2614c545cL,0xfaf4ab8494254145L,0xd8f9eb48000d250cL } },
45731     /* 62 << 7 */
45732     { { 0x9ff4f289a66132a2L,0xc54fb8001e098994L,0x09d3cd6624cc2471L,
45733         0x6d0f74167838e14bL,0x7438cd2dc540cbdaL,0x193b16817d6fa8b4L },
45734       { 0x487a7dedab33c6f3L,0x625eb8cf02f5aa09L,0xd8039682501323bdL,
45735         0x9de122e38e216951L,0x40a8fbde0711c51aL,0xf192b5c283a474c3L } },
45736     /* 63 << 7 */
45737     { { 0x3782cbda57e04e9cL,0xec639886e41b30dfL,0x4cd14afd12d2f686L,
45738         0x0aa093ee8b768113L,0x6cfc12cdad598f9dL,0xe4a62f1194bcce0fL },
45739       { 0xd5035fab150ad4f2L,0xb3cd4871ae2e8da4L,0x49c9e78271ad9c3dL,
45740         0xdcafeb34825690cdL,0xc05fb7a38c246f85L,0xefe16be3a82cc013L } },
45741     /* 64 << 7 */
45742     { { 0xd42777314c14ee0eL,0xda8146d15e881c3fL,0x6b0746b099f1867cL,
45743         0x1ec73d72602dd4ccL,0x27fae51538081120L,0x6a677bdc2f8b2f2dL },
45744       { 0xb924af64d60544e9L,0x1439e183dcfc6b16L,0x4e88e9ae068565acL,
45745         0x8a3dbd25a9a4f146L,0xdb4a3e483f93f734L,0xb1971c058f1d33bcL } },
45746     /* 0 << 14 */
45747     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
45748       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
45749     /* 1 << 14 */
45750     { { 0x721bb8363a7f43c3L,0xab5b3108c12dca0fL,0x9cc9a78934853870L,
45751         0x78b604a7af598c4fL,0xd370375e476f27c8L,0x9f0415b80b15cba5L },
45752       { 0x2bcfd9a4d400dc1fL,0x2a6fe03b4bc62dddL,0xb05a6464a211b19fL,
45753         0xce059d419990b504L,0x011c5f87d94951d3L,0x13cec08900d9c7b0L } },
45754     /* 2 << 14 */
45755     { { 0xf365419f9b280fd9L,0x13e3b12746365672L,0x8a91c165c41880aaL,
45756         0x3eb27a97f9712fbdL,0xa6587aec76c55678L,0x7c3a04b702cd79cfL },
45757       { 0xfc878f9cda712eb8L,0x076e61170fca3e02L,0x09a184d8caf6df5eL,
45758         0xd32bf232aabcde75L,0xf601d0de03de597aL,0x85d2b5fcc5da2858L } },
45759     /* 3 << 14 */
45760     { { 0x3075a7636c888df8L,0x6305c20472e21527L,0x6b1d683e8798aad9L,
45761         0x0d09624680706369L,0x91db5e7f7b854739L,0x0e63cc6e02d72332L },
45762       { 0xe929e3ea1f7ff6ccL,0xd53a18a145595925L,0x867916cb93af8be1L,
45763         0x757e9f56c5c305eeL,0x3f9071c75c83063cL,0xccc0f92d7f6d5bb7L } },
45764     /* 4 << 14 */
45765     { { 0xb6029961ae899afaL,0x8eedd66e681b6e1bL,0x82db693b4df3e5b1L,
45766         0xb5131488a0c3e357L,0xbfb01ff3ccb2f577L,0x28ea947027a72cc3L },
45767       { 0x26170928e39e325eL,0x42d4876b84f80188L,0x0bec6a634c872d76L,
45768         0xa0a7cc90b14d9c9fL,0x8a32d2c44f6c7778L,0xe7cd346e3b889a4cL } },
45769     /* 5 << 14 */
45770     { { 0xab35a14f5a4a3753L,0x1d0d5a142bbbd563L,0x54cfffc5998d4514L,
45771         0x1c02f381a77ed59bL,0xe4a7a6ab21c9c190L,0x50059df54a9adb60L },
45772       { 0x2d0383ba34bd7008L,0x894889bedf1a4f41L,0xe541c62612ac407dL,
45773         0xcc0e417964c3b62bL,0xdb8ca1f33a0978b2L,0x4ef45a2d287e8c6cL } },
45774     /* 6 << 14 */
45775     { { 0xea95b5c9437f2efbL,0x67d3e9b58e52ce8eL,0xfb33102488ff5455L,
45776         0x883ec9fcc3101dedL,0x056218e20ca5f1f9L,0x4c9b2483bccc65d8L },
45777       { 0x13199b26123db2ecL,0xbc1d82479aff90dbL,0xc4a9311d367516f6L,
45778         0x3b40c867cb6e90d6L,0xff674ff84034415cL,0x2787db45a1821e7eL } },
45779     /* 7 << 14 */
45780     { { 0xacc263fcadeb8508L,0xb52ebcd719854c90L,0x3d54e7805f2ce0aaL,
45781         0x2fc056a97e02e760L,0x47e7173e32da5f93L,0x1d468de3fa893134L },
45782       { 0x9adc877dd73396b5L,0x430826afeeb00c82L,0xfde2c3da96a673caL,
45783         0x467575ad33e43f9cL,0xc3b2c3a1ec1df2f0L,0xf0348e6f2252a8a6L } },
45784     /* 8 << 14 */
45785     { { 0x860ef794609683acL,0xf0631ad39af1c522L,0x322c83662ee7f522L,
45786         0x58ccd95f54122af0L,0x7454880c2bbb2d80L,0xea173d8286d8d577L },
45787       { 0xd5a3057cea1cc801L,0xfd08d482bbb2a189L,0x26aac99ec3c512f8L,
45788         0xc3eac036556d891eL,0x866c3aa7bf9f6112L,0x7c4c8fb9c144f7e9L } },
45789     /* 9 << 14 */
45790     { { 0x989eef73a9109d83L,0xbe43bd378edd17dfL,0x14a63abd1b17029bL,
45791         0xfd14ae365ff76860L,0x689dd0a6b8730632L,0x01eb37f147342f9aL },
45792       { 0x619bab45e6c446a3L,0x93d26fc97abddba4L,0xda6c120486ffa4cdL,
45793         0xc608937548758279L,0xaf074ea3034a7230L,0xf220244b82ce176dL } },
45794     /* 10 << 14 */
45795     { { 0xc0c1eb0f8343f5ddL,0xa205e66a0126fa2dL,0x37530a3244fd8be4L,
45796         0x3c7af6f696ab64cfL,0x1f04305076657202L,0x2c59d31c828f3fb1L },
45797       { 0xa61cba51e7f5926eL,0xb2de427391ebeb81L,0x976f2c34bb855476L,
45798         0x0c6c02c3269e4f86L,0xc69bed8fe2e01fffL,0x19aa421c480bf7b4L } },
45799     /* 11 << 14 */
45800     { { 0xb32e8e229affa929L,0x69ebb533bb7db327L,0x10ac3360a8a8d088L,
45801         0x066cffa7c485517fL,0x2393e74c12b8eebaL,0xb3a8825a596c8412L },
45802       { 0xe2b99fc3bc8b6b92L,0xd7716da085ca802dL,0x92f6693f4de5101fL,
45803         0xe8b0442304be34eaL,0x05b44ef648324966L,0xa89d9499413df57fL } },
45804     /* 12 << 14 */
45805     { { 0xad0d24c7b617206bL,0xb8be483f9dd13f59L,0xa55134ff7655aa29L,
45806         0xa3d103857a5e217eL,0xfbb9eeb53a21b295L,0x1de71555c84a136dL },
45807       { 0x7579398e0b7487b3L,0xc6ca9575a14dce87L,0x99b32e1e46452257L,
45808         0x99d54955479d8f2cL,0xc2a8a6a1930b80efL,0x58d9db81656c850bL } },
45809     /* 13 << 14 */
45810     { { 0x0c8fe2e04d89b43aL,0xe4d923e77a04e492L,0x49ecb701617df01cL,
45811         0x6d80f249bff9a819L,0xf01e604acb7f86c1L,0xd6d3a6664b7f1455L },
45812       { 0x657801c19188fb17L,0x339d79450dc92875L,0xca798cf57ec0b757L,
45813         0xc0808852a62301c2L,0x2dda13558266c908L,0x22bcde8f5e55da21L } },
45814     /* 14 << 14 */
45815     { { 0x6c85a0eda682508cL,0x8350b515edcce6c8L,0xa84a67656f95898dL,
45816         0x55b0ae971e419847L,0x11115c6edd6a885dL,0x6f0beaf64fb174a4L },
45817       { 0xaaae44b2815af3afL,0xcf0697b9927a2c1cL,0x37639d62d7d645eeL,
45818         0x157b7eda2effec37L,0xb55e50759b9c66e6L,0x33a66a1f85f597ecL } },
45819     /* 15 << 14 */
45820     { { 0x8260c5339b49bb46L,0x3f3df9d6437cac27L,0xd0723229d972d2a8L,
45821         0xe544a216d0dd92abL,0xeea4a0f5a03588f6L,0x54006166b218dec0L },
45822       { 0x0fae2be85778113bL,0xbb9618d68d570227L,0x3ba87360297a47aaL,
45823         0x9483a8399a76dd6eL,0xa803edaf6eb061b7L,0x6790050cf8067cf4L } },
45824     /* 16 << 14 */
45825     { { 0x171898aa8f7782b6L,0x8b7a706b499b3a81L,0xbc0e835ffdb2c1baL,
45826         0x4ee30281591f5aafL,0xfd71de3bcc272c6aL,0x532800c46e93f68aL },
45827       { 0x35ee08048365c576L,0x6c2bcc94cd4c0221L,0x49f37ff5957b2ff6L,
45828         0x315d8e7e5ec029c0L,0x33230602ef324c12L,0xf5847f9b966b2578L } },
45829     /* 17 << 14 */
45830     { { 0xed88aa550bf098d0L,0xbc9888fd75f90180L,0x9040919207713428L,
45831         0x38922bbc1a1f71ddL,0xa430fb65bfbf0f55L,0xa258b9ba867c1998L },
45832       { 0xa7f69b03b7294c58L,0x2ec0c5de84dbc1e5L,0x41c9e5207dba8d62L,
45833         0x545573f1795d8285L,0x1c24a375d3075041L,0x687e1cc8fb6b88dcL } },
45834     /* 18 << 14 */
45835     { { 0xc29b123e1453b1e1L,0xefb0778820059b44L,0x15554ade9291671eL,
45836         0xeb5a1980429dea37L,0xf96dacbb6c4b867dL,0x4f5563d6abab4d68L },
45837       { 0xb5b0ecffcbe76297L,0x5a22996a51d6bd43L,0x0088ec95b7e5cfc6L,
45838         0x4863a5a1fe373e05L,0x42b7925bc244d93dL,0x85bad13540117113L } },
45839     /* 19 << 14 */
45840     { { 0x01725fbe8201fae2L,0xee4d7d382dc34bbbL,0xaddf878afd7c35bdL,
45841         0x56522d5865536719L,0x595c3dd8f772d4cfL,0xd87c5b6045af30b9L },
45842       { 0x9cc20b9de7992d5dL,0xdfd53d58d56f1964L,0xaf2947bdc7d42a68L,
45843         0x9322b73dd19e8ad3L,0xa73a9e843243a6d7L,0x9c7dc57992c203d3L } },
45844     /* 20 << 14 */
45845     { { 0x86283e21f9daa551L,0x47fd23f81f696f1bL,0x7d029b1bb9784a9aL,
45846         0x7c7798bea0c0acb5L,0x41241c716d7c682bL,0x11c6c1131d33c2b0L },
45847       { 0x5d469ca23565cf32L,0xa949f022bad4bdbfL,0x3d054cc2a13cf4cdL,
45848         0x13bd21669e3ce279L,0x01bc70e68a4beafcL,0xb39e351d8aba087eL } },
45849     /* 21 << 14 */
45850     { { 0x92efa2ebfa6cb068L,0x934209b29235050bL,0xc446ee28d5000c05L,
45851         0xd4e51912862fb7ecL,0xa53940f111193db0L,0x5f2ef2aa82a7fc57L },
45852       { 0x1a6b30ecb0210f49L,0x4ab1dac73899548aL,0xb116cc3186737a03L,
45853         0x56cb33809ebfa5b6L,0x8ac3b61fdfd918b2L,0x65867e3ca102e1feL } },
45854     /* 22 << 14 */
45855     { { 0x26072a5d82357232L,0x3762764e9f0fd2f1L,0x9c5813f60c16733eL,
45856         0xea2e0e03718951d4L,0xae195bd469e63818L,0x241a4afcfa2f9a6eL },
45857       { 0x0e97519f9165d59aL,0x416bd37358e5af1bL,0xc4e811288197b7ecL,
45858         0x4145be2c9c6ba0d0L,0xc82cb2a17d40b98aL,0xc3c28487bccfa8b8L } },
45859     /* 23 << 14 */
45860     { { 0x920949a810476d2fL,0x5b387bbe2502c026L,0xd1d61a9acd7f026bL,
45861         0x81003d7ceea9a3f8L,0x6191c15fba5b78aaL,0xacbed41e30ad7befL },
45862       { 0x1427f1fd6740f72cL,0xb4b5e7c93c475735L,0x6a374d1773029d5dL,
45863         0xc1e4bfdacd622400L,0x670b9e36c2686dccL,0x1bb236e08dd4085dL } },
45864     /* 24 << 14 */
45865     { { 0x84aa863ea4ee10a1L,0x24d805a687919ccdL,0x553f3206b5c399b2L,
45866         0x775b92173cc109bdL,0x25c01263fe384088L,0xa3c4418bd5f743cfL },
45867       { 0x3d69705ddf91f1f0L,0x547d46269ebddad1L,0x0198ab1a2626cebdL,
45868         0xaf8320f285b1afe8L,0xb9c0968ce17e6efdL,0xfedc75c290215bb6L } },
45869     /* 25 << 14 */
45870     { { 0x1d375f7dcee34c76L,0x2295f8dbaa486096L,0xd18577928285cb84L,
45871         0x53fe6bd5e8c46c3bL,0x6f6cb6c068ba071dL,0x654ab4e8964e0f1bL },
45872       { 0xc70857a9edf6aa40L,0xc313c7852fd26360L,0xd705a86a995998d9L,
45873         0x413d35efd6989c8dL,0xddc0b2070df131bbL,0x21f64be59c7d70f8L } },
45874     /* 26 << 14 */
45875     { { 0x8061d340143ff74dL,0x59e94fc6a23aa7b3L,0xf7c79a0b914c3b81L,
45876         0x5a836211702c6ae7L,0x2570d63c718123c3L,0x7e86d11ec9f5ce3cL },
45877       { 0x80f03f9717bcce3bL,0x073975b1465a7446L,0x29f66de7cb357aceL,
45878         0xe87bd12c04894fb0L,0xfc501a2651a0b5aeL,0x20a3170c02207a3bL } },
45879     /* 27 << 14 */
45880     { { 0xaab1f0fa2785a18eL,0xa50192fdb37c657aL,0xe7073b27f0c8a908L,
45881         0xf3e0451b2c82fce1L,0x8237e128c290240fL,0xc1c631621bbf66cdL },
45882       { 0x9bbcc2afb6639b7cL,0x07643d299bf0e0c6L,0xf7f070c7671c5be5L,
45883         0xb09a423a9870ac6aL,0x324503506656cda2L,0x4f404be80584abc2L } },
45884     /* 28 << 14 */
45885     { { 0x3ee52d8f5fe63bd4L,0x09f8405c7a7da77cL,0x35ce95c61881a757L,
45886         0x0a8cf9d9c13e3707L,0xe71258d548d2d3f6L,0xcf4fd6910bbe7c0dL },
45887       { 0xbd6496e1fb9479f1L,0x711c669aab8cb3a2L,0xcbe8501358cfdfb4L,
45888         0x655c902b59275b4aL,0x7e0ff05b20f722baL,0xcb00031d42b17aadL } },
45889     /* 29 << 14 */
45890     { { 0xc568cee0cef0ae1dL,0x1b3422ca7a55aae0L,0x8dcce5058bb536b8L,
45891         0x12df74bee92759c9L,0x029abaf02ef962c4L,0x5d30b4359bb1240fL },
45892       { 0xc62fe8e7d03a850eL,0x67da35b5b08dcab6L,0x6f4d4e75e8ca1131L,
45893         0x53d6fbf81bd5bf97L,0x596d850ceaa0b2c6L,0x32e918240e8d39b5L } },
45894     /* 30 << 14 */
45895     { { 0x3360ff11d54bf1a4L,0xbab994cb5c79494bL,0x953ad553757d7771L,
45896         0xf17f14f068b58ed5L,0x223615317523c422L,0xf0f05f965ebf0d49L },
45897       { 0x3386676549182267L,0xf87eccc1ad71c3ebL,0xd7708e18913d8dcaL,
45898         0x27fe27e1b193eef9L,0x33376365cc45e65dL,0x599b4778d700ac20L } },
45899     /* 31 << 14 */
45900     { { 0xb118f73509ebb3c5L,0x7299c7844d0d36efL,0x409ef9cde10b249fL,
45901         0x040f91d0156401b9L,0x6b9fa5b107467a49L,0x2ede334334415300L },
45902       { 0x0b3abc9c0edc8055L,0x58f850958ca04aa2L,0xeb0d3202e568b6a6L,
45903         0x5e57bb1a159dce4cL,0x8d3780e03b68641eL,0x78eb21a0d9f50517L } },
45904     /* 32 << 14 */
45905     { { 0xda643272ed068028L,0x86b52135a91fb87fL,0x23865a7c35b43943L,
45906         0x6ac015884606bbf2L,0x9660ab721559fb9aL,0x1fcb09e73ce2f1a5L },
45907       { 0x62af29ab793d2f0cL,0xad5aaef53aee7efcL,0xee9f29b744c11037L,
45908         0xb2a19cf1d36c2571L,0xb87d88e265b552b7L,0xd8b4f172beb253d4L } },
45909     /* 33 << 14 */
45910     { { 0x6776241470c50124L,0x157c591f57d0eb9bL,0x99e1e2d769b4bcc2L,
45911         0x81c2b923a9d94ed3L,0xbdd9294fecbf3becL,0x3825c29a4c4fb135L },
45912       { 0x431d9f26e915cc2eL,0xc4fb48afec1a4835L,0x97f426c09ada831dL,
45913         0x0be0cf81d5c48eddL,0x166ee4243d02771fL,0x810bb518b09de508L } },
45914     /* 34 << 14 */
45915     { { 0x9f4dd8185038ba67L,0x5ff1572801111ed1L,0x900d44f163de4d57L,
45916         0xa36c1a67d5db5e67L,0x2f01142e2bf5cea7L,0x1519ae1f59aefbf4L },
45917       { 0x7b963d1f6d989fcaL,0xa5bb3cb85fce44e1L,0x61087c9672fd3285L,
45918         0xfb2fc6c1c597ef26L,0x5548e25c81e70a6aL,0xa6c53d67a229d7bbL } },
45919     /* 35 << 14 */
45920     { { 0x9d11a26ab9678e36L,0x8142106fbe07b082L,0x3c31548b322fda75L,
45921         0xa87215ceb7299565L,0xb5229b119ea80113L,0x7221a40f43ae700eL },
45922       { 0x1ad48de8cc00aef7L,0xc4573660d266daa8L,0x1cb020a65761657bL,
45923         0x9e799be24588c895L,0x3d209df968561484L,0xa0fb323295fec6d8L } },
45924     /* 36 << 14 */
45925     { { 0x9292138a3acde05fL,0x7b23f51a50f9e7f0L,0x6ad891a1af59b585L,
45926         0xbd394db79654da39L,0xcb8c47315f7c6edbL,0x367bbb5d6d2d6e5aL },
45927       { 0x8df2c759f51dd55eL,0xce0924d8e6c3517dL,0x49c46188097a8072L,
45928         0x47169f40980170a7L,0x56198937b96df7ebL,0x09572534531fb3b6L } },
45929     /* 37 << 14 */
45930     { { 0x04c18873d2eef240L,0x5752cce75106879cL,0x4b7fbe6bd9736e37L,
45931         0x7c7f1de4c85990afL,0x0cda6f07a2324ca7L,0x0894eafa4d80c28eL },
45932       { 0x24bd95890ae7e6d9L,0x050d526aaba494a3L,0x4b05455ee583fb5dL,
45933         0x3b5fb27c6049bb23L,0xc7c9da6ecb5b411eL,0xc1f2528ebc38336dL } },
45934     /* 38 << 14 */
45935     { { 0x8b177119d62ff4b1L,0xb0c02e2783150269L,0xdbeee1f8428f9e51L,
45936         0x2a55661225ff00dbL,0xb4ebcf98cd0d526aL,0xc69f721fc0efa6abL },
45937       { 0x0ceeceb516e29d31L,0x0bf4510127d1c530L,0xad942f1f42a7383dL,
45938         0x2cf389eb03b8fa98L,0x1aa647651ec6acf0L,0xf7ac647c202433b9L } },
45939     /* 39 << 14 */
45940     { { 0x880bfb2caa7fcbf4L,0x18c2b739731cd693L,0xd093ada3ae39b46eL,
45941         0xd48a288796c6fb7cL,0xed7c405daf96bbfcL,0x6b63b9ee256335e4L },
45942       { 0xfd4795ec7ee8e89cL,0x4f3fa1ccb07320d6L,0xe16c594206b0078dL,
45943         0xb8c95b563a0b2914L,0x2b5b5ab42b337970L,0xcf612b4cb9f75ea9L } },
45944     /* 40 << 14 */
45945     { { 0xbfe63081596eecd6L,0x20eb6fb0a3a194fbL,0x4497ec2b8751a73eL,
45946         0xf90e9e4cf88ba0e5L,0xd5a9c5d55974eca2L,0x9fc120ade4f3e171L },
45947       { 0x9ae058a633330640L,0xbda3227855bc8aaaL,0x7851cdbc1c9688a9L,
45948         0xf68d7d9e1d950edfL,0xc89c645074e06425L,0x62406f3b6116d386L } },
45949     /* 41 << 14 */
45950     { { 0x1094390070e509fdL,0x0a8e3db09af61ad1L,0xa487a61538d7aa57L,
45951         0xa9d56bc5ed020b3bL,0x7ed2294f638b35f8L,0x53d6870dc95fb42eL },
45952       { 0x85e828494c2207d7L,0xf88831baf0556be9L,0x64a547979fe416c3L,
45953         0xd61b652e779bebaeL,0xd3f43e2f2c0ccce6L,0xd5119f341f680ab7L } },
45954     /* 42 << 14 */
45955     { { 0x466f42a1191938bdL,0x95ec31c036f1dae5L,0xa7f350d2feaa8b55L,
45956         0x66434577555c505cL,0x0c668e73f55d1ca4L,0xd6af5ba4a7bd7449L },
45957       { 0x581e14ac1a79d8c9L,0x9761d9763054e915L,0x928e7415d69220a6L,
45958         0xc5bf4bb405bc4a22L,0xad033b7c45d52313L,0x4e67962c75d66dc7L } },
45959     /* 43 << 14 */
45960     { { 0xc60e17b2e2300049L,0x731c2fa54107f308L,0x848f6db7cc2982b3L,
45961         0xf251c21085275d38L,0xf5cac5b2128c8a96L,0x3c012933405b27f0L },
45962       { 0x9b0a61520b8b15b7L,0xb1c32dc691fa4548L,0xbe7b7654f366d677L,
45963         0x7e1f33277147a660L,0x11e31a0eeae310bcL,0x3edef63c1b86b525L } },
45964     /* 44 << 14 */
45965     { { 0x6f7e7259c6334c8cL,0xe34cba49b4f2333bL,0x157bf099211d08c5L,
45966         0x9e39c5442988a4daL,0x796ed9f17a998311L,0x3f4da896d8d349e6L },
45967       { 0x8ab75656fab28acaL,0x3e215d5342d14b21L,0x50008fd7bec23301L,
45968         0xd6ee4853446e2c56L,0x203ff1c880da14bcL,0x27a4bfbbc333ba74L } },
45969     /* 45 << 14 */
45970     { { 0x745e69dfb3d54e52L,0x1ab2a03e7c405cbfL,0xda71141e0bc431b5L,
45971         0xb3a47e71aafa7c19L,0x5329594fa88a4905L,0x489b5928973aba07L },
45972       { 0xbe31a4d37350ad6dL,0x177e5285478a42a4L,0x45a101bf848eba6aL,
45973         0x4287dfd949936d31L,0xbc4c491dc82823c9L,0x87c816aaeb8b8055L } },
45974     /* 46 << 14 */
45975     { { 0x66f5337cf309ced6L,0x897cbcb9eb5ed3cbL,0xeffb601762c35fd5L,
45976         0xb4b702f081fd31f3L,0xd5203833f66f6120L,0x1d2d5ef318a84d91L },
45977       { 0x22f9fae70edb3857L,0x034197b3cef00765L,0x16d8c6b493643908L,
45978         0x90ac59e16c51708bL,0xbed18da32edffd9dL,0xc90ac893e750df1eL } },
45979     /* 47 << 14 */
45980     { { 0x4a0af827bdb07e48L,0x5588631e131f46ebL,0xda550ce1e503169dL,
45981         0x0e16b540f2cf2f14L,0xea19a70dc79930abL,0x5654aa5fa8925651L },
45982       { 0x2f1a14906104f9c7L,0x98420d6c654cf319L,0xf967467f3ca96df3L,
45983         0x6abe4e32dee1fc07L,0x913bdf2bbd07d17cL,0xf96f70eda8ef9068L } },
45984     /* 48 << 14 */
45985     { { 0xa0096d10b7f8286aL,0x493e88563015be8dL,0xa221d57c17f70125L,
45986         0x4f932f4fe425eb77L,0xf0fa00df78ddfe95L,0x68165f257866f01fL },
45987       { 0x01345af4b1693425L,0x3fc8d3a6bad5603fL,0x4269006f0bf46cf5L,
45988         0x96e3b6b77e340ce9L,0x2a4bda69df7c68b7L,0x9649d8b91b6574c2L } },
45989     /* 49 << 14 */
45990     { { 0x98f55e59112ef290L,0xa5516c3568909cdaL,0x40407393235165f1L,
45991         0x6eeeae510991970cL,0xae79ce1faaa6d26fL,0x8bc719b441d43f67L },
45992       { 0x4a7af92a39cc89a3L,0xf6d14f9a85c8ab12L,0xb9bfca97eb8d4851L,
45993         0x926b8155cd52b2f3L,0xdd17dbd48fa94f9fL,0xaf68726447cac5cbL } },
45994     /* 50 << 14 */
45995     { { 0x39d7c1729517c2c0L,0x6f795181166e2f50L,0x9f6ecb5dc0ad8b54L,
45996         0xb480afac8e75ce4bL,0xf51569203dd5ad07L,0x87c855e73799b80dL },
45997       { 0xea8c34d9538ebc9eL,0x67bebb6a957b303aL,0xc6511b7b4dfc6d7bL,
45998         0x9a40cf5885b02ee1L,0xf4fffbbdecc59a6fL,0xe85a7c115cebfbcaL } },
45999     /* 51 << 14 */
46000     { { 0xffa0118c4a33265cL,0x4c4051d583e0bb83L,0xcde22f8d7007d078L,
46001         0xae9ebbc2932cba29L,0x297c2252f7a82223L,0x662814f41a09fbdaL },
46002       { 0x3bfd965640be805aL,0xe49901e592acce09L,0x4e201930bbb6bb43L,
46003         0xfe94eb4dcc018aa2L,0x454d8c611dcf97a5L,0x11d8e3a230f1011dL } },
46004     /* 52 << 14 */
46005     { { 0xe745ee2c36cc8b1bL,0xb40c94e6e328c813L,0x4144aecd8bd107b9L,
46006         0xc35567890ea88fd2L,0x017460e30492a810L,0x0c63cd4410b8bea1L },
46007       { 0x9123e9a3c890f74cL,0x940fe6590cea499cL,0xbe306232c82e1bdeL,
46008         0x40544f6bc041d7ecL,0x46de1f3b477a7dafL,0x336551f6951f1295L } },
46009     /* 53 << 14 */
46010     { { 0x2a61217a09b3b9a1L,0x0736704635b71125L,0xfddbf1933df24d57L,
46011         0x33ddabcb4592d748L,0x2fa9ff8a25309e3aL,0xdca2dd2892a0e76aL },
46012       { 0x706350255dfbd02cL,0xe01c2553b6306b8dL,0xb14132905e91ddecL,
46013         0xf45221866f6de6fbL,0x2d48d001b440319aL,0x926e9b64fe67f843L } },
46014     /* 54 << 14 */
46015     { { 0x5580401264e2c160L,0xe154925a9a6c256bL,0xce2df32922260b79L,
46016         0x74824410c546d756L,0x2a1d0a5f79887083L,0xa2c040c5da3f7d48L },
46017       { 0x74058ecbc14f96b8L,0xe69c09d73415e476L,0xe5a93bb47a443fc0L,
46018         0xe1bb24800c31d7b0L,0x4701d669f4ab0610L,0x0ad815841eeb23e9L } },
46019     /* 55 << 14 */
46020     { { 0x823cd737d72b5925L,0xee09efb9fa38cb06L,0x6828dced4a21e81eL,
46021         0xab67b37bf365e481L,0x3995edd2b5a7c630L,0x4c24ac8806930b7cL },
46022       { 0xfd7264d36dedce0eL,0xdcab1e333e76fe1aL,0x6b40889a89a94f97L,
46023         0x7a1fd432b2a3b0e3L,0x121efaea3ffe933eL,0xa81f6c6f843c3553L } },
46024     /* 56 << 14 */
46025     { { 0x26301455e5488aceL,0xdf39099881a20dc7L,0xac7d6049ee06c7f3L,
46026         0x547e8df33f248fe7L,0x5fc4b74213743dceL,0xa97721bc4c398630L },
46027       { 0x6b7877cc258aea47L,0x1cedce562d5c28d6L,0x7e930e419428d66eL,
46028         0x42c80757b97faf54L,0x091fe5ab3812e632L,0x2c29fd42e2e359bbL } },
46029     /* 57 << 14 */
46030     { { 0x2d9e65a61d7b990aL,0x8a9ab4bee2a8a6a9L,0x8658c36985e3eea6L,
46031         0xf352787df0de0b23L,0x872db1de1161aa92L,0xf2648c972190acbfL },
46032       { 0x9a34f1d09de72e41L,0x13860f846c086516L,0x2e9211b824127c21L,
46033         0x4e1623bba3697c37L,0x41d71f1df579c733L,0x33f0ebf7ca9f68aeL } },
46034     /* 58 << 14 */
46035     { { 0x9b51f4ca9f5a40c2L,0x38b59573682e2132L,0x5765e89dc556998cL,
46036         0x102fe894698a4a8cL,0x0bbcae977c6964d6L,0x8548f2c6dd7bb12cL },
46037       { 0x32c11ed9e49848d9L,0x1ee1b525135aefc2L,0xade5d14e812a5e4bL,
46038         0x0e122e7e15bb167bL,0x321594d4ec5c3594L,0xbcea8723a7c02afeL } },
46039     /* 59 << 14 */
46040     { { 0xdbf91edcaf87c75aL,0x9710003266582706L,0xb10cb32b1133a7b3L,
46041         0x70f5d71767e068daL,0x8d937e56b8e0c9a2L,0xd8a2652ee2a9afd7L },
46042       { 0x94d6cae9cc90c6ccL,0x3512f3abe94f68ffL,0x931ea6f09331ad40L,
46043         0x71621013daa3d4f1L,0x591c40bfb668a992L,0x5494cc174c6868e5L } },
46044     /* 60 << 14 */
46045     { { 0x7981826070ececc7L,0x8cc0b6e071cfc0e1L,0x998df6590276a6bcL,
46046         0xffb5bec11a43be05L,0xb93b1543f2beb640L,0x337703d456f3719bL },
46047       { 0xce74c17cd40a7375L,0x6aef79cab1aece94L,0xc5bdfb388876d218L,
46048         0xf71ce9cccea91445L,0x471cdbd1ed6e5f5dL,0xe0cc79cf10e56c08L } },
46049     /* 61 << 14 */
46050     { { 0x2b17e181794ebe48L,0x6111c897f28cdd32L,0x4d59199062dfeee5L,
46051         0x7b9d070241b14904L,0xa1ad534d5fea4804L,0xc08915d953b16c22L },
46052       { 0xa57c883e8ac9ddedL,0x589474dcda1d1bf0L,0x31cbf32ce9aa8e7dL,
46053         0x2abe9b60f0930d84L,0x604731b0cbdd031aL,0xbc35b1e4e9e1b3c1L } },
46054     /* 62 << 14 */
46055     { { 0x39300d55efeff954L,0xa9cf57f34fe9cffdL,0xe3315321b15aebbdL,
46056         0x26354c57b840b080L,0x2c690488476abf35L,0xa7303fe6d480cf33L },
46057       { 0xa50865295706c3b1L,0x4c26034eed0b2342L,0xf08d67be9ae9c452L,
46058         0xd4dbb9f5046c7d0dL,0x4435f1a3f9e5393bL,0xf47aae68cd4d5de8L } },
46059     /* 63 << 14 */
46060     { { 0xce9e5ddc06d5f48bL,0x22c1cd3e0ef642baL,0x2ad48eb9e9b8a960L,
46061         0x330074883ce26679L,0x495e62428d2de642L,0xcba5bf37e03b1a77L },
46062       { 0x9382c92de716624dL,0x410d212350a33e4fL,0xe55ee116e953e7edL,
46063         0x27e9a0584b840616L,0x560a5e4939473bd8L,0xbc1e795b382f3a95L } },
46064     /* 64 << 14 */
46065     { { 0x31bdb48372876ae8L,0xe3325d98961ed1bfL,0x18c042469b6fc64dL,
46066         0x0dcc15fa15786b8cL,0x81acdb068e63da4aL,0xd3a4b643dada70fbL },
46067       { 0x46361afedea424ebL,0xdc2d2cae89b92970L,0xf389b61b615694e6L,
46068         0x7036def1872951d2L,0x40fd3bdad93badc7L,0x45ab6321380a68d3L } },
46069     /* 0 << 21 */
46070     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
46071       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
46072     /* 1 << 21 */
46073     { { 0xc5cf8997ce0b5b72L,0x350adde19d7154baL,0x8139681e307b254aL,
46074         0xcc87fb5775cd94d7L,0x90e7027478684954L,0xc4fdf4c095ceb991L },
46075       { 0x91bbc0ab8762c84cL,0x5e09e226ce09e8adL,0x1cb83d704b93d45fL,
46076         0xe2299024f541da1fL,0x3eef7ce14b7ffd10L,0x53ee63bbb3fc1b9aL } },
46077     /* 2 << 21 */
46078     { { 0xe5004e8003682f59L,0xccdb9cb7f642ac0fL,0x405f50d1bd869f77L,
46079         0xecffa54de7ebea2cL,0x3354dc22d87620baL,0x01bb2988b1c01ff4L },
46080       { 0xd9370076e16477fdL,0x45303d2a2e71ba4bL,0xc0de76273291e5c5L,
46081         0x5cfebd87f0a7ca55L,0xde1162809e592a30L,0xdd26e577a78ebce4L } },
46082     /* 3 << 21 */
46083     { { 0x1e9b23b9ff1735a8L,0xc3bf3d5b2b0e4b7bL,0xd4cc00fe59b7721cL,
46084         0xd5c36f9c9e2f4cebL,0xdeca06bac90af70eL,0x42676f12416ee799L },
46085       { 0x0d7afe1b6f748c6fL,0x0b7a6de539c39d55L,0x11e43d6ee6eaed18L,
46086         0x5baf8602496087e0L,0xf833634fb1a3a66eL,0x25098c8a79398677L } },
46087     /* 4 << 21 */
46088     { { 0xe141e763d4720770L,0xb9739e70ddb3b450L,0x46e6cde496131446L,
46089         0x0458a5d5cb6c2ef7L,0xb7747634532f9fd8L,0xf62d372116544457L },
46090       { 0xbfacb4ded3100854L,0x70788a31b39d3f62L,0x9b543220f22d92e4L,
46091         0xaa4590f655723258L,0xc7b6730e01ddb8bcL,0xae252cf869e1e7bdL } },
46092     /* 5 << 21 */
46093     { { 0xc618cf0ddd4b8d8dL,0x471cda8640dcfbfbL,0xba0dd7ac08882ce6L,
46094         0x58e5d2f56cd336e7L,0xcdda8301af096540L,0xf6d268463cf31600L },
46095       { 0x6150cd982197efd5L,0x4440fbfa55fb0877L,0xca31871c90757f1dL,
46096         0xc4a1faacbdd756c8L,0xc9d4ac1bcbb8421eL,0x3c0c2914b17c43beL } },
46097     /* 6 << 21 */
46098     { { 0x46fdb65caa6fe9eaL,0xe0d48e5e05494cd9L,0x5adef5704afbf837L,
46099         0xc96ba4b91c9e2cadL,0x1e8158f7054a158cL,0x47be73209e38b88dL },
46100       { 0x9b99971e6d2993ecL,0xac9b0bfadf980eccL,0x9da09642d96ca391L,
46101         0xd67105369bf4305cL,0x40cc1adfa0dfafaeL,0xe27e32f8a209699bL } },
46102     /* 7 << 21 */
46103     { { 0xeaaddeb836e87d82L,0xc12587a71ffd7210L,0xf93d2f5c731f6838L,
46104         0xb96594e8f7097a65L,0x08d6717ab016e8d3L,0x9c378de81984d825L },
46105       { 0x627d41e7cb2a0c26L,0x1f447501c697ceb1L,0x8dc40831c760550bL,
46106         0x70ad48707fac97b0L,0x5ac7f22e7021c170L,0xa6f730e4929d5931L } },
46107     /* 8 << 21 */
46108     { { 0x7d27d71fd186cb09L,0x67cb7f4e3bc213c7L,0x418cafeb6075b2cfL,
46109         0xc0d691e6d93a06f7L,0xc16a95259dd001b9L,0xa0583230026f17b9L },
46110       { 0x4c1041b07845900bL,0x2874079147a22aaeL,0x8d08efd62c1758e9L,
46111         0x9cc6f207e6c3229aL,0xec69e902082d8924L,0x9cfa1deaf331dfe7L } },
46112     /* 9 << 21 */
46113     { { 0x7b5ab2afbce81cd9L,0xd25fa34b12028b49L,0xf9d65e6b63a659beL,
46114         0x6f88f1ddfffb943cL,0x38eb0d02b871cd5fL,0x732afedc558ad949L },
46115       { 0x4093ab05367d424eL,0xf73b23ad29de1be7L,0xce1c0093e7a50181L,
46116         0x6d05cbbe1e412cb9L,0xd3c1148b773a394cL,0xe04b5fdd38e50316L } },
46117     /* 10 << 21 */
46118     { { 0x1793535b8d0ce0f4L,0xe9b054b1ab73f7daL,0xd82a3ac1ee7bc6e2L,
46119         0xb28ad846b847f39eL,0x40975fa2fc10c012L,0x8de998619aafe68eL },
46120       { 0xa73f442584878534L,0xbe3118cb7a36a0d7L,0x3763a49e8fa37fc9L,
46121         0xf3f8ef82361f32b9L,0xea66f9978c1aebc4L,0x88600d648d9d024cL } },
46122     /* 11 << 21 */
46123     { { 0x11f842ca150a3325L,0xbae115c3185a385fL,0xddf9643637561bb0L,
46124         0xecea0cd9a4115fe4L,0x297720665893a694L,0x837e6880df408cfbL },
46125       { 0xfeb8f511e0a7fb68L,0xd21869dfa062b60fL,0xe2b60f46ca6a5e72L,
46126         0x64bbec184931d188L,0xfb09c90fe3ef3378L,0x67cbeffacd767337L } },
46127     /* 12 << 21 */
46128     { { 0xd35832381b289f6eL,0x10dac54a0aeb3bcaL,0x4df1c08d6692339aL,
46129         0x2968edec20054647L,0x34072618d74235a4L,0x00b4a7ae71d6064aL },
46130       { 0x23a8900e25c23f8fL,0xda0cb7fad7d0f1b5L,0x266211c56c8ecdbbL,
46131         0x0a4351b97bc27e4dL,0x98d54c97fc234258L,0x5ba534071e1a4dfaL } },
46132     /* 13 << 21 */
46133     { { 0xf07cfcdd77f083bdL,0x89bcae29d46712c6L,0x2089c3ab0f09bb8bL,
46134         0x3ede5a2a6b9a4028L,0x27ee18fe013066deL,0xc2bebbb416fcdda3L },
46135       { 0x6b3926af3a87cd68L,0xf52f0ef9f9a7b831L,0x4a39660a1ffc01b2L,
46136         0xe98f718d91aa6719L,0x8b0626f111d48e8dL,0x4a6a2e5b2bd93db3L } },
46137     /* 14 << 21 */
46138     { { 0xc3ddb6123ef24470L,0x98b66569bb3f99edL,0xccc537153a97a015L,
46139         0x0d9a6b4d04937b8cL,0x854d081ad9a575f7L,0x347bf0c0127fbd90L },
46140       { 0x6baa47a5c30987f1L,0x164b390dbfd0b503L,0x6672d1afe6a1f565L,
46141         0x9a50ee5828d5bb14L,0x2e23ab480d0226fcL,0x33eb052365cdbdbaL } },
46142     /* 15 << 21 */
46143     { { 0xa32d1a27d904eb73L,0x6fcad8d0c43c978dL,0x8cf1e7a19c0842f5L,
46144         0x2a6fa6d800328ae2L,0xa5905f67a1e3b06dL,0x458c8badaa8df96aL },
46145       { 0xee5b20c0b0d4b89bL,0x352ae0c4815c1af8L,0x546a7d7e6dd73b70L,
46146         0xa99882225f753229L,0xa38eb5d7efde47e2L,0x8290aaed92635ab1L } },
46147     /* 16 << 21 */
46148     { { 0x8ec4335fabe7c60eL,0x01f198c10a6a9fb5L,0x3ff96de001141ab6L,
46149         0xb21acc2c2eca98a1L,0x6154849010fdf648L,0x2c01a99cd1403e8bL },
46150       { 0xf1a35f306fa509d7L,0xf7715fe3e3f08e9fL,0x89c26c077fc9a752L,
46151         0x8d2535fe420d48a0L,0x80ec5ddd52fe2e73L,0x041b8df071704f39L } },
46152     /* 17 << 21 */
46153     { { 0x96882074659a0a12L,0xdb0d63032a6bb752L,0x2a1fb2d740c2194dL,
46154         0xeb6b45ba2c184444L,0x10ee44368c179d33L,0x906d0e509391917fL },
46155       { 0x11bead88ca3bcba2L,0x25914dae4253fb99L,0x0445b31013c25404L,
46156         0x2a2eac6d515f53baL,0xa746a1d662bf0a11L,0xc7576a4c6573c4f1L } },
46157     /* 18 << 21 */
46158     { { 0xec159ed060c5bee9L,0x80282ff007746414L,0x8d53f05f40a97a54L,
46159         0xc92d8789f5d4eedeL,0x1edd798132344c09L,0x3bb9a444a92c7b36L },
46160       { 0xbf130f5cdd6c8903L,0xd270e7cf676fcab9L,0xac49744bdc5ae6f9L,
46161         0xbd0ccfcb40e39281L,0x222efa16a981b3f7L,0x92bcd2d700aeeadfL } },
46162     /* 19 << 21 */
46163     { { 0xecfdb91489c73e10L,0x83a5168becffe79cL,0x6a0d57c123e97ffbL,
46164         0x774121ca4b130cc3L,0x8556fdc5486967a6L,0x1249448d5fe4a7f5L },
46165       { 0x8c2c14440e93c114L,0xcde258573bc68985L,0x697ba7b0952758a2L,
46166         0x0d962b377aee19e3L,0xdb31fe8582c4c640L,0x6ecfaf36c89b4b85L } },
46167     /* 20 << 21 */
46168     { { 0xf1e8c5a0e06b40eeL,0xa55909fe59836af3L,0x77a13be8a3a4ed95L,
46169         0x47408650bbbcde0aL,0x95b455c2b4fba7b7L,0x4983f5ca4321117aL },
46170       { 0x37bab5d1e18d304fL,0x0edf3733f1d29206L,0xe23e4db4dab91670L,
46171         0x602a5265923ab7c4L,0x53ee98c6eb920a03L,0x1b592b626f25489cL } },
46172     /* 21 << 21 */
46173     { { 0x66c981d9d3543689L,0x20500cd7bb8f53bdL,0x807d43605179af77L,
46174         0x7280a7b27c286404L,0x75a74e630976a65fL,0x2ba9ad9df11c3bdfL },
46175       { 0x23f38f950ec6c760L,0xcad599102b858cc1L,0x4d9adb7efec23c19L,
46176         0xbabb6e45095e85c5L,0xfab66a97e5dac2e4L,0xcde4b15a08baf1f4L } },
46177     /* 22 << 21 */
46178     { { 0x148aad3207089d6aL,0x3ab5b0790303c267L,0x7d13995bc3153026L,
46179         0xeba27c192287f305L,0x5faa453367ae45bdL,0xbbb561db2f4e9488L },
46180       { 0x254d8977c8493163L,0x60d468fc5c544164L,0x0b6309a3a2758037L,
46181         0x8480e16b1f9add24L,0xf1d99fd2902ec661L,0xd32df254cb6dd6f4L } },
46182     /* 23 << 21 */
46183     { { 0x9a17f5c3610178b9L,0x75dded80bada5aadL,0x158249c23dbeb289L,
46184         0x1d0671cac300cf49L,0xa1649bd0886902f2L,0x79b0d6ed7d13be62L },
46185       { 0x78253e7549e2327aL,0x5629cc509af110ecL,0x4373a20059f8765cL,
46186         0x739f33289d9c5f3aL,0x3c7d5cfe9a5f997eL,0xf044d90d0559357eL } },
46187     /* 24 << 21 */
46188     { { 0x20aa15d97ab838e6L,0x6cefdd5a0c827ed1L,0xe2f205caef579e8fL,
46189         0xad27e38b325981bfL,0x087b8284c3438be8L,0x2095dfcf422360d9L },
46190       { 0x87cdf5ad76d096bfL,0xf1b97ce1e022adc3L,0xa71240c189104665L,
46191         0xeb5a175c9c1578e8L,0xbd66910ad150ffa2L,0xac277af811459a28L } },
46192     /* 25 << 21 */
46193     { { 0x7db4df62417fb54dL,0xf6c1e7f04dfb7c05L,0xfdcbd3777aa8ceb5L,
46194         0x0364b3bd89c24333L,0x8a721718fdd3dcafL,0x9a6015dcec2848f1L },
46195       { 0xd6571930d35ad1a9L,0x154a929199369196L,0xf3be7e228e514732L,
46196         0xfa3eef28b7fd3aacL,0x0bc3b2a69f60d298L,0xf6327920febfca58L } },
46197     /* 26 << 21 */
46198     { { 0x3b9de1baf8dc6030L,0xacc4224a2107fd1eL,0xa7d32fe86dcef0d2L,
46199         0x353d5e88dd83fb28L,0xd552c3ce50bfb0b2L,0x69bc0e686cc8ee7dL },
46200       { 0x965c0ca21d9c74d9L,0x5cd163a406ac3ecdL,0x57910a828e98b581L,
46201         0x1d0fa7523d992afbL,0x862d3184e7d12701L,0xab6a288c6c7d161aL } },
46202     /* 27 << 21 */
46203     { { 0x04caa9caf4f2b3e9L,0xcdb896141af43dd4L,0xb09444fd4e74ee8bL,
46204         0x9428849fec05d35cL,0xe29bb0e94765c0e5L,0x138c45f176d25d2eL },
46205       { 0xbf041131a0184d83L,0xaf321573991ddc4cL,0x058760a8ef31df7dL,
46206         0xe0b94b57f80dcf5fL,0x75572221850a4a6eL,0xc735580c104a4a1fL } },
46207     /* 28 << 21 */
46208     { { 0x9ba102f1a6b735daL,0xe073232edfbe7d06L,0xa8ac24ba57266a16L,
46209         0x07458ea42d5c4bb0L,0xfbdd0f0574868e1bL,0x73fa612a3921fe7aL },
46210       { 0x26f6714b0b32d8e2L,0x7a3cb2b48bceb95eL,0x756a68c6290f204aL,
46211         0x148fbb787fdf2b7eL,0x639ece6c57fe0da0L,0x315aee1e9a92b7e7L } },
46212     /* 29 << 21 */
46213     { { 0x22dc170769d10661L,0x8d89cd1c71fd40f7L,0xa22f11bfa2545040L,
46214         0x1247d019d44c2446L,0x8d17daaba08235c7L,0x7e6863b9fae7874dL },
46215       { 0x6d57431c0490d338L,0xc1459e61809d1f9aL,0x4eb14dce95b64852L,
46216         0x8d3a04e6a7b5a861L,0xfed631ee7bfa24a7L,0xf8f86f27af11723bL } },
46217     /* 30 << 21 */
46218     { { 0xb43b14146e63c833L,0x497a5f98c1ec160aL,0x112223de83eb3709L,
46219         0x293964a88d100b9bL,0x6db1d1931e3b2db3L,0x264bc83d71eced39L },
46220       { 0x8418eb43aa89c967L,0x51d41bff76f8620aL,0xa4017ee5cc416467L,
46221         0x1cc527231e216e36L,0x76ba536ce8069a6fL,0xa239b54acb77b981L } },
46222     /* 31 << 21 */
46223     { { 0xa05f2dbc37544476L,0xf18dbcd71b797f65L,0xc78131376d50cd5eL,
46224         0x2b509a4d6dee11daL,0xfc0f0584beba1b6aL,0x3282624a9d53bd6bL },
46225       { 0xa0944e5c16b7187bL,0x468a79b8aa2f99e9L,0x32e4644b38bc4ed9L,
46226         0x5bc375d7e7cf71feL,0xe18e3c0956617861L,0xbce9ccbce69255bfL } },
46227     /* 32 << 21 */
46228     { { 0x498808edc65fafceL,0x3676a7cc4e806bc3L,0x796e25f176c6b964L,
46229         0x1aced64bac474261L,0xa62470fc29a460c1L,0x77501dce5e751e48L },
46230       { 0xcc00053b6d9e3641L,0x2b5bc4ae9a3f5a0bL,0xddaccc2e3f9ca178L,
46231         0xad33f34a0b80d1b0L,0x6a76df9364642225L,0xc145f36f778e761bL } },
46232     /* 33 << 21 */
46233     { { 0x377fc5ac575e74f6L,0xfefeb2327736739fL,0x62ba076a9fc2d5c5L,
46234         0x6f3c6084baf0269aL,0xce2917688fa7c145L,0xa60bb8905b3f2333L },
46235       { 0xa811055dd900095aL,0x92d95e7b385bd4f2L,0xba54f444d33c2a43L,
46236         0xc1b131327d12754fL,0xdcdb54821556f5e3L,0x55377fc539ca4b94L } },
46237     /* 34 << 21 */
46238     { { 0x455f65d1a0cbee78L,0x554eccb566225edbL,0x306400b47a4e014fL,
46239         0xef3e02eb7b67025aL,0x7d4efbaa997a633aL,0xd43c6eb8672c90b2L },
46240       { 0x0ed2d88d7519da07L,0x864377854b9d51e8L,0xd5900a2e2e3ab57cL,
46241         0xc02f046b69bb0a39L,0x06d825a6bff12faaL,0xa12e5b0d5d3ac267L } },
46242     /* 35 << 21 */
46243     { { 0x1716be5ba10508b4L,0x8706acbe7e37fbebL,0x3881f54e44e3d127L,
46244         0x54e20622a864d77dL,0x26a194616b83325eL,0x0d57be814c15a8f4L },
46245       { 0xb10c0cd07b53b476L,0x3d016ea097d39c64L,0x4d7df7c15315bdadL,
46246         0x6fe5a1acf060cf4dL,0xd5e3d05396846b79L,0xebc878f79e3c8028L } },
46247     /* 36 << 21 */
46248     { { 0x5b849ed8d0d193acL,0xe983abf773950501L,0x5ca162770854a569L,
46249         0xb0b284d26904bdceL,0x9c769d269d4fadecL,0x98e5e9b912677284L },
46250       { 0xd9246836b557f2cfL,0xbd47433069d46374L,0xbce8b27b9b063a22L,
46251         0x08da2eca37c5ba26L,0x9e742de8d4b26479L,0x643b752c102aa36cL } },
46252     /* 37 << 21 */
46253     { { 0xb72fae566fad22d5L,0x1e921426cf2fd62bL,0x9f31293d4c225102L,
46254         0x78d43a621975afbbL,0xce2787303cfee30eL,0xb88590d77a82613eL },
46255       { 0x42f86567560b932aL,0xc2d98915a7c9ed68L,0xe70e41fb349a9750L,
46256         0x7e7fdd2c79f9582bL,0xf3d6ab07da737c0bL,0xba247c0b9f3cf823L } },
46257     /* 38 << 21 */
46258     { { 0x4bebaf153dffdbd3L,0xc37d4a04fcc967a6L,0xeabab9aca0435a65L,
46259         0xf23d1d58f9ae9c52L,0xce229a798cc8f7b6L,0x4a61e6ebf5e11e61L },
46260       { 0x770e1dc6b20f2d8bL,0x199d20e8cfb9e820L,0x9fd709c4c381a22bL,
46261         0x6f53a358b1d52a98L,0x4b1a018c66f511faL,0xc7d2d49375d3a666L } },
46262     /* 39 << 21 */
46263     { { 0x3b2db5e5550791d3L,0x034ed5665bbb686eL,0xf019f161e033e3eeL,
46264         0x33198653acd2f0b5L,0x368d89e41ee8273cL,0xa7ac3b507f26daffL },
46265       { 0x73d8d7df006c0037L,0x98b5937de73cf271L,0xc3bc340be917247dL,
46266         0x799ea890e45f37afL,0x27be0f5a25e8dd2fL,0xd70ec41c3bb16923L } },
46267     /* 40 << 21 */
46268     { { 0xd30302352679072fL,0x73dfdc0f95dad4c8L,0x53649b575c4630f1L,
46269         0x60197fc08d098d74L,0x9c295d54647f5cbcL,0xfa5f1bc6c0813efcL },
46270       { 0xf6e08007d2e49417L,0x4f7d4b3dab579569L,0x7af3e08e11d9b388L,
46271         0x073ec38a5db61c65L,0x9b480cb89db4dc4dL,0x9be2ce7e372fa82aL } },
46272     /* 41 << 21 */
46273     { { 0xd87c0b55ed1b6d83L,0x3b47443adfae29cdL,0x16c5b0e52147bfdeL,
46274         0x98812fd0663cbdbcL,0xe3cea04955ffe911L,0xfc1e9d9cc5df31caL },
46275       { 0x7ffa90f9902c4ab1L,0x2cf973c3669a857fL,0x89243cfc94b109adL,
46276         0x222d6fdb536ee544L,0xa48b1b15fd488c22L,0x7120e3f0f318ba27L } },
46277     /* 42 << 21 */
46278     { { 0xfbb8a3cd47813054L,0xa2d7255d462ac3f3L,0x341bc10babdfa7adL,
46279         0x01efa884ceb9ea50L,0x30fa0f903f5bd09cL,0x8aa309453abd108aL },
46280       { 0x0ab7fe23f9ecab6fL,0x0585f72a5ec032bcL,0x686a7d71cf9f4fcdL,
46281         0x096bbf04f769be8dL,0xa309931250b64584L,0x67be53402e216060L } },
46282     /* 43 << 21 */
46283     { { 0x4e14fa6eef252e90L,0x2ca968579b7db6f2L,0xf80772e3653f1662L,
46284         0x4f89e666cd28bb05L,0x7fa800cc77eef62eL,0xa3f6ef5963b2f3e2L },
46285       { 0x438d564bc81e600aL,0x8978912de14c1434L,0x33732892ea695891L,
46286         0xaf6aef0b1dc8caceL,0xcbf9580b7c509cb1L,0x2db9fbc11ed6fbdfL } },
46287     /* 44 << 21 */
46288     { { 0x408805a1fa7052bdL,0xe4eb27f75f825c13L,0x0a0cc8fa37ee34a7L,
46289         0x737b99a40c59156fL,0x78c2a5d8e1b55c30L,0x89d70b62bcbb2196L },
46290       { 0x07ad36911e862a0fL,0xaa1c9118c41cc693L,0x7e6f544c4e1f7359L,
46291         0xa5f4f5891bf9474fL,0xa711efd9ef56df82L,0x0428edb7e3de91fcL } },
46292     /* 45 << 21 */
46293     { { 0x67f403610905be0fL,0xffe68b80c12178bcL,0x41bef79ec6a673aeL,
46294         0x347e8ba81bc77376L,0xd49956d60e589da2L,0xadd54508fed84dabL },
46295       { 0x18868a4a462749f4L,0x2048cd88ed323e71L,0x7b27932aa28d1f02L,
46296         0x3cf6107412e4ddccL,0x0f6198631360ecc5L,0x40e5e08b1330d33bL } },
46297     /* 46 << 21 */
46298     { { 0x79b68071e3ad573bL,0xcb070412723966f5L,0xf4610fd1964b453fL,
46299         0xfdc9dbbc8bcee838L,0x3e191f3bb5ca4f20L,0x90d85084c02e0af0L },
46300       { 0x4e3f57a70ee64025L,0x63f339acdea07a5cL,0xf255b5045eb4081aL,
46301         0xe42bd241b4cbb0bbL,0xafa58985ff68c5c3L,0xd36cf7175b55e6e5L } },
46302     /* 47 << 21 */
46303     { { 0xf2b06f4b95d37e50L,0x7da1d2af3747c79eL,0x18a37dad6ad0092cL,
46304         0x9f4a6f081a8f207bL,0xeb1fd3f2cf0fed15L,0xfb9911e4384eb46bL },
46305       { 0x5f07c680b87cb035L,0xc49935d189e1531aL,0x718f6bd09ea02056L,
46306         0xadafb67b18a4ca31L,0x26cb0f368477f396L,0xec7775df62ec2172L } },
46307     /* 48 << 21 */
46308     { { 0xdffb03aec10b43aeL,0x39b1266e9433a54bL,0x4c262521b19fe0dbL,
46309         0x0ec1e54f3d5c7feeL,0x2856510b05e68e1eL,0x49382c1edc80b8a6L },
46310       { 0x80a509312471bdd5L,0xe8cde18581974aa9L,0xca6112ee28235c52L,
46311         0xd28a0eb8301f9653L,0x22b11e26e11fcdf8L,0x97e6fc5de4d735f3L } },
46312     /* 49 << 21 */
46313     { { 0x7fc264d35b253506L,0x1a11dd9cdfe2be8fL,0x2cbcf79c711185a3L,
46314         0x2208200a46806ddcL,0xf2764b6524e75d8aL,0x71a71bcdfcb43c25L },
46315       { 0xddd0cd3586a895caL,0x5ec28b469e2caf5dL,0xeb749df9f6614957L,
46316         0xdae1dd77eddd371fL,0x7ce493b556dde554L,0xc1627c06d6e5653cL } },
46317     /* 50 << 21 */
46318     { { 0x7926553cdea7472aL,0xe1e9480d3ba7f351L,0x242a641b1b6a2fe5L,
46319         0xf4af10091f790122L,0x5a2e2f95967810a0L,0xf1eaec6e2ed57598L },
46320       { 0x34a32da96b9f2421L,0xdc32daa8dd820372L,0x8b2539fc37a067ecL,
46321         0x2a495112820969ffL,0xea7c1829a699c283L,0xb4a1083dc2c58cbbL } },
46322     /* 51 << 21 */
46323     { { 0x1bcc30812e59d7a4L,0x557be0b2fac34690L,0x5b2868db673254faL,
46324         0x62e150a49e1302c3L,0xe29e9b445772138eL,0xc76bf4fd7ccb31daL },
46325       { 0x8d687bbb34c905c9L,0xf4f207030786eeb2L,0xe56a494c38deb469L,
46326         0x759e75e2cc6bbfa8L,0xb11903aaa59eb766L,0x3f6928c5c68b3bf8L } },
46327     /* 52 << 21 */
46328     { { 0x27fa09ebcdded185L,0x763b655c36d090e3L,0xbc586674dd864c93L,
46329         0xa1f84ff34c7074b8L,0xdf5261d17cf08435L,0xc57860f6fbdaff3fL },
46330       { 0xfa49af22252d7f08L,0x2367bf8c8db5f89fL,0xad6443ce6dade92dL,
46331         0xdc5265138d1af3f1L,0x62a282ecc720ce46L,0x1769b74c9808b416L } },
46332     /* 53 << 21 */
46333     { { 0x4ee11333ec598f02L,0x4613ba038c7eaad5L,0x48e0bfe61b1ccd1dL,
46334         0x6e115b6b507b705aL,0xc4d38e4992874d89L,0x30460a066dc59fc4L },
46335       { 0x75de8dcba0f7ea87L,0xba96718125101367L,0x9d7b03314a742660L,
46336         0xb4ca381d8c304133L,0xb87b896d65846055L,0x8dd96f0513d381dfL } },
46337     /* 54 << 21 */
46338     { { 0x43716f0c3e25b7b3L,0x00caad210aeb5d75L,0xbfee232559a6cb66L,
46339         0x06c1d812ad059aaaL,0x42d0af57c8bcc046L,0x37968ef70e409a85L },
46340       { 0xc5c3812ee3be328eL,0xaaa74bf166547ad7L,0xb292af92a15a0db1L,
46341         0xc0645385e5d5cdbcL,0x2dcf4ca937ec2c28L,0x3f75d089f0cb1694L } },
46342     /* 55 << 21 */
46343     { { 0x7e71fba26c0204d3L,0x6191ad249a40b4aeL,0xe2c7ab6bdda24cecL,
46344         0x5a8fc77e95b26a2dL,0xa6d8b2e43f1c7e44L,0x42d485e4e0a0e08bL },
46345       { 0x8697386ed7e3b896L,0x5b960d76ee7e58caL,0xda950e9a3fce610cL,
46346         0xb85c7842803c67dbL,0xed8a53535e62ff2aL,0xfe6b0e2c4d674e7fL } },
46347     /* 56 << 21 */
46348     { { 0x46a2a08be26d822eL,0x63537bc689d6d6deL,0x28c556a2b3df9fbcL,
46349         0x81d3161eb121d512L,0x4e27ce0b123bc86cL,0x1ebadb85bfb240d1L },
46350       { 0x86edb71a1156314dL,0xf8ac56fd113961bdL,0x2f6bc6d8067f586fL,
46351         0xf558b8833fe8e532L,0xe9433e2321a7997fL,0xb86f039c87e53b9bL } },
46352     /* 57 << 21 */
46353     { { 0xc022a16d78329681L,0xc3da7bf76b1226d5L,0x47ef18daa85c69e3L,
46354         0x4614f0ee45cecdbaL,0x9126fc2640f19d1eL,0xcdecb2693f5ca09aL },
46355       { 0xb62a831257a020e3L,0x5f9a8ddc8330d472L,0x37e58ab3eb208a24L,
46356         0xe64ed285ee4b8687L,0x752fa22a74a82625L,0xa67e24609b25fbafL } },
46357     /* 58 << 21 */
46358     { { 0x89e3d770e6b94044L,0x50f50d1675a1a8c9L,0xe73c51d95344c139L,
46359         0x97a8dd8411723e9bL,0xba0663c57de5dcf2L,0xf26eee6c3a6b588fL },
46360       { 0x6275b2a9211b989eL,0x32ab4b311608f16eL,0x9e47b2943fdde5b5L,
46361         0x63c50a50614bae9eL,0xffe4ef05e31c05e7L,0x2fea9142b7db4ba7L } },
46362     /* 59 << 21 */
46363     { { 0x27f286db0874c6f6L,0x26de6376e6ec0054L,0x56458a082ca84fc7L,
46364         0x07bcd4011fccf1b2L,0xb8548e74bae6f486L,0x0ea5857a0de2964fL },
46365       { 0x8e8df866e50fd2a4L,0x3b07d1a8710fc74aL,0x3e4cc4f5a1fe92b9L,
46366         0x7380d0836e52d244L,0x4d75e1c12796278bL,0x9eb279258d33f4d5L } },
46367     /* 60 << 21 */
46368     { { 0xce7abd1ba225f084L,0x696e1eaff803ee75L,0x66f2789989415775L,
46369         0x14df21a29eb4991eL,0x012a6413fe2a0769L,0x022cf1c8626f421cL },
46370       { 0xd4644d0460ab4299L,0xa43cc1732a8d453fL,0x7c4ab8c20ed14031L,
46371         0xd5854b98e14605f7L,0xd9a98c51fa7ff2cdL,0x7dbe8cbc46baf2c0L } },
46372     /* 61 << 21 */
46373     { { 0xf26574593c42ae9eL,0x7c3e5c13bbc289fcL,0xb815fe3fe096e7bfL,
46374         0x3eb67095da54264eL,0xbf5ca7c4ff3f8128L,0x8fc4a3f865db4dd4L },
46375       { 0x3af47b17ee382cfdL,0x8854132fd95520f4L,0x3387b11d33c5588eL,
46376         0x5d7eb66c0c662f93L,0xcad581933b18885eL,0x8d1c069a6f23c209L } },
46377     /* 62 << 21 */
46378     { { 0xa9498fb5212ee678L,0xa8824b696ade4a39L,0x422c074e0a406cc2L,
46379         0x7d38de650a2beef0L,0x482d16f81eed5bbfL,0x1c882006f18380a1L },
46380       { 0xf90f6c2bb98445e2L,0x36aa980b2c738d70L,0x4caff65b6785ad58L,
46381         0x1c282becf95863f8L,0x59ad267c5350b79fL,0x53ea042721cedec9L } },
46382     /* 63 << 21 */
46383     { { 0x5cc362909fa3481cL,0x1321acdd7292ac86L,0xcc30550378f4d6abL,
46384         0xf7917237e7d9154eL,0x591e5ba81fb39377L,0x0a387e4f7c541c76L },
46385       { 0x99685212a38570cfL,0x5cce35c8624cd61bL,0x375c68133aed79d0L,
46386         0xf72d4b068197e487L,0xcd672f7d129775c5L,0x944ef37f1cd768f6L } },
46387     /* 64 << 21 */
46388     { { 0x9c66a32becc5f6daL,0xe4ff40431719ba2cL,0x8c6cfab721e716efL,
46389         0x32c8fccb96ed74e6L,0x475890dd0b110c83L,0xdfada95f5cb4eefeL },
46390       { 0x9d7b89a693240fe1L,0x6afdb2d0210b776fL,0xc3f0b55bca7a7d52L,
46391         0xa6e56a0655d04585L,0x818e221c4257acc5L,0x05207b63fcb8d39eL } },
46392     /* 0 << 28 */
46393     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
46394       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
46395     /* 1 << 28 */
46396     { { 0x0a74da82d8ada6ccL,0xc6b98a3cbea55457L,0x896c26bb57c2f5acL,
46397         0x981e2f72845d45e4L,0xca152b877e9a7d36L,0x49666d457b582e8fL },
46398       { 0xea3b9bda49fc20b9L,0x5bcbc84a7c71f153L,0xd346fc5d5748a654L,
46399         0x7ac2f217622665eeL,0xbb5efe7fb6f16e27L,0xb1810a70644c9dc8L } },
46400     /* 2 << 28 */
46401     { { 0x98d089819bc5917bL,0x9f90885d187fac5dL,0x651b18287cfc13dbL,
46402         0x2d606e4c8655a658L,0xba64d3c563c91b71L,0x36c7d7d8b82a5090L },
46403       { 0x2d1dff02cab1d598L,0xa95788d7be78f90dL,0x1ac2ee6b0ea1fe01L,
46404         0xc100b60cd5c1273cL,0x4496084ceae603e7L,0x7fcaaf5f77c2fdfbL } },
46405     /* 3 << 28 */
46406     { { 0xa93fec0861b06e05L,0x0bebc26b7dfe6802L,0xc00b45a5cce5662fL,
46407         0x2e8a0a7f83a9a4a9L,0x6e0cdebbc0bbeb63L,0xc56a20fe63ccd80fL },
46408       { 0xfc10fa08b51f1f89L,0x4848392020ad9243L,0xfda69cc66bf53af8L,
46409         0x474b7440f10bb6c9L,0xcda9db3b1e7625e1L,0xe2f62c1e1dc7f3cbL } },
46410     /* 4 << 28 */
46411     { { 0xe8e3225a6abdd842L,0x8c85f18f3b367b02L,0xf147a4219f42edb9L,
46412         0x6d4bc00d0d411d4dL,0xa1a13a2770014bb4L,0xb896d97bfa10166fL },
46413       { 0xb2a1dfa70c302c6dL,0x0a24bd5d808a63a4L,0x8409a3a2f88c7359L,
46414         0x071f3838347726a0L,0xd18a551c27507bb9L,0xe0c4cc34b359b167L } },
46415     /* 5 << 28 */
46416     { { 0xeaaaf4602a44610fL,0x94d330b10392ac47L,0x989b9b673fe123f1L,
46417         0xe2ca56ddd8fd0129L,0x77d6d0cd624982a4L,0x55d4b2c371e1fec7L },
46418       { 0x3e9a04a0360e013cL,0x1d227ea9c9cde585L,0xac2b08e24fed8f86L,
46419         0xa1d1357ce199e8dbL,0x7cf06ec8e99cc964L,0xd9bc3a7fd85ec63bL } },
46420     /* 6 << 28 */
46421     { { 0x7d111c67017c633cL,0xadd9e9bd7d128a9cL,0x4cd8730c6db857e9L,
46422         0x3c9c03e9f4b46d12L,0xd42f0242a78472dcL,0x3fc0bcb2260841bbL },
46423       { 0x6332b11a8783f828L,0x65229d2af7be37ddL,0x402f28eee7e8944aL,
46424         0x3d1bab505ab28372L,0x6944e82cad5e1ff3L,0x65a94c0de8c75729L } },
46425     /* 7 << 28 */
46426     { { 0xa151dcbc2f7f3633L,0x4305312a98969226L,0x947afc00604d46e1L,
46427         0xc3c9d57572f3e28cL,0xce4c1cbd14b1cd1dL,0x8fe9a81df80dea45L },
46428       { 0x50920f3a9685f603L,0x51d380f00b80d89eL,0x19978ba13f798e32L,
46429         0x1294aaa6c5edde47L,0x280002c2be714a1eL,0xd998669ef212603cL } },
46430     /* 8 << 28 */
46431     { { 0xa44f6ef880e9d9f3L,0xaa7621e91d14d618L,0xcb0e4ed80eaf6671L,
46432         0x2bf485f8181514a2L,0x74670e180a2927eaL,0xe1b5461612c14645L },
46433       { 0x4068c0742a67ed61L,0xd10c7a57739063caL,0x391b651d698b2816L,
46434         0xf310d1696da14fa8L,0xa089be6bd8a578b1L,0xa314b3a844389ad7L } },
46435     /* 9 << 28 */
46436     { { 0x688ce85068fd73ecL,0x2cfb41040db1f500L,0x5d943b8d5b9bbc41L,
46437         0x861867f5403f3973L,0xc331110a2c766363L,0xb28a6bc153aaceeeL },
46438       { 0x2ab6e7aaadbee7a4L,0x316ca45c2f2b9569L,0xcac646e561d2428aL,
46439         0x6fd28dadc7cb6291L,0x2e28f68741e20ff4L,0x8cfe90eebd189d34L } },
46440     /* 10 << 28 */
46441     { { 0x09b8ed53339da6adL,0xe40727af26f54b8eL,0xc4a105979990fdb2L,
46442         0xb808656b5108236aL,0xb4411363aa4bd584L,0x19e90149288a0328L },
46443       { 0x5795d8a8fb0592f8L,0x313c68833213c929L,0x62eecb5b48f79d47L,
46444         0x3afcfdbab29ca224L,0x0072847d40075b08L,0x078eef3dd1fe0c8fL } },
46445     /* 11 << 28 */
46446     { { 0x719b51f20ca20aaeL,0x01ad630824b47b92L,0xd32460c2d3c807deL,
46447         0x8497786b0a1785f5L,0x8bd521355d714ee5L,0xc267724ed00f741eL },
46448       { 0xe5578dca9c266820L,0x97ff60085b62d484L,0x84c70e92e3bd1869L,
46449         0x412759e34dfa679fL,0x6bccc33fce497e18L,0xfb92405669056198L } },
46450     /* 12 << 28 */
46451     { { 0x664ff05368ed0760L,0xc3cdc99138fae9feL,0x3fe057aaf1f30a86L,
46452         0xbae990222d08c72aL,0x4f5faf3f6f09e13fL,0x44461a4413d26b29L },
46453       { 0xc2504c1bf95418edL,0x12766ea7db3ff26cL,0x2f956e9507a22399L,
46454         0x2716e70f5a00cdd3L,0x80c020140e9fba99L,0xbe587ac30519875dL } },
46455     /* 13 << 28 */
46456     { { 0x5e4bb6b83b23d2a1L,0x819a7c7705c9888cL,0x59e4c48ad0fec7f7L,
46457         0x4b212b21d6bb71abL,0x370cb90bcbf213f2L,0xf1ea07e0817549b0L },
46458       { 0x20e3115351a37b92L,0x30f9e70158d444c0L,0x7ac3a37b0b791ab7L,
46459         0xe456fd475265e4cfL,0x3e3f27ca29580ae8L,0x5d68a40daa2a1654L } },
46460     /* 14 << 28 */
46461     { { 0x14203d8720cbb917L,0x284e0c9db2a7424eL,0x99eb2911cefe7139L,
46462         0xa709c50f42925411L,0xa5a7543e5c79a13aL,0xe262025c6f45f023L },
46463       { 0x3966fd18828b9f40L,0xc660846913693115L,0xd7dfbcf644373027L,
46464         0x8e73fe6bbade7645L,0x88267c7b1de0dbd8L,0x1231ac99ce4e8c9eL } },
46465     /* 15 << 28 */
46466     { { 0xfd928bd90ba99806L,0x799ac97d1a864172L,0x5436a8cd129682b9L,
46467         0x4bcacda54e96fecbL,0x453af995c5db1451L,0x8fd382e07073b98fL },
46468       { 0x17165b8a644a7bbdL,0xd17d2d80b6118620L,0x2a4bf1b2c8cd1bcfL,
46469         0xdc7aad959ccc119aL,0x6d34084c3bcdbeadL,0xcbc5c5557e0663c8L } },
46470     /* 16 << 28 */
46471     { { 0xba86aec170128295L,0x83a09b65c12f35ceL,0x8978ff0789df2f80L,
46472         0x85750cfd97a773d5L,0x806bb730fc3f35f6L,0x04503422fed868c9L },
46473       { 0xdc0fcde086ffdbaeL,0x8f4297e11860f43bL,0xfefb7d028d3ad6cdL,
46474         0x5c652b5997293550L,0x32e12942ed5cfbbaL,0x06192aaf98800d22L } },
46475     /* 17 << 28 */
46476     { { 0x9bb8cf660002f389L,0x217219af51505913L,0xfea1388999ef8797L,
46477         0xad1b2383235597c4L,0x85ffabb70a3e3536L,0xd8235d9da00c725aL },
46478       { 0xfa9b0f4ba704dac0L,0x99d76ddc2f57fb9aL,0x5ed3683b18428507L,
46479         0x9e42bc54435307f2L,0x3167de67b4f36896L,0x8a0f99a0d539d713L } },
46480     /* 18 << 28 */
46481     { { 0xf0b92b8a4642d9b2L,0xce97828a3f50c883L,0xa33d62936f0b1194L,
46482         0x23417e0f3692f5b5L,0xc79b9491fb0b95bdL,0x5410e8c95e836b2aL },
46483       { 0x2b84078d29798fc7L,0xa8732e78d6628695L,0x39da93f898c766aaL,
46484         0x0797832d305e464bL,0x246069ab163f9f4bL,0xb867dcef53fb6170L } },
46485     /* 19 << 28 */
46486     { { 0x949c63730ced5c37L,0x6f8cd6e4fdb6464eL,0xbea902ae2e056dd4L,
46487         0x43871371fa0d560cL,0x162128e9e9ec2208L,0x84deda5c25060c6aL },
46488       { 0xa8a8a27c14160ed1L,0xf24bf3dda33b53cdL,0xd12038a976a6d272L,
46489         0xe64d6384ee8f2b15L,0xc404d580d3e91d69L,0x62cdb886a4888d17L } },
46490     /* 20 << 28 */
46491     { { 0xccf0fb423c9eb0caL,0x8703c6694aa03b40L,0x44c735a74001af07L,
46492         0x9616dd932e874ed1L,0x5c2e8520474ba621L,0xddf13cd3fa93d8b4L },
46493       { 0xd68c9b4575df1b67L,0x4cd242288f80d389L,0x0f1a16bcc09f47fcL,
46494         0xc414dc6a9cd4842aL,0xbb0fa94f1f353c6dL,0x405124551950d073L } },
46495     /* 21 << 28 */
46496     { { 0xbfe176f2dfb520a6L,0xf51917bced96d0abL,0x8131985078b11135L,
46497         0x6397f1288f006a55L,0x9877f30e576b5132L,0xe0cd103bec781571L },
46498       { 0xb4bf74e5bcfd5046L,0x04333aa4be9cc561L,0xc6dd1dbc1e066ca1L,
46499         0x03c926e1d3718e62L,0x13bf83d404309072L,0x79649ba0ba28ac51L } },
46500     /* 22 << 28 */
46501     { { 0xcb1a73c55abfe8a1L,0xe9e2e220deae1d92L,0x2d953d00514befaeL,
46502         0x74024df9b7940bcaL,0x9a2cad0cd13f4a3aL,0x8790b699360795fcL },
46503       { 0x63957f3b5e9982eaL,0x491bf3155b7d256eL,0x5708bd4dd23324e7L,
46504         0x9f11ddd397c4c8c2L,0x1823762f5b7f5162L,0xc45a3976cbfc9dd2L } },
46505     /* 23 << 28 */
46506     { { 0x806134cd30731f5cL,0x04522c23487c778cL,0x99b6e6a1651640a5L,
46507         0xe2d20ed87e9898d1L,0xcad25762069e56d9L,0xd4184f6e29ddfc7bL },
46508       { 0x1017badcc1aeaa34L,0x7d3700e7f3c62e08L,0x203dcf8d5e42399bL,
46509         0x05986c66b72795c7L,0x0b56ad9cc0925f02L,0x1f0e895bfe0e3bd3L } },
46510     /* 24 << 28 */
46511     { { 0x935b9e244d2edd5fL,0xfeb46fb5efb287b8L,0xa51700a3f5018b92L,
46512         0xc328beba23864e2aL,0x113b5c9a995f70c1L,0xc0b11c22da1b5d51L },
46513       { 0x9b99b907f4a360cbL,0xf4ee9995adf0b094L,0xf67c7cf2f94b3f0eL,
46514         0x664a51a1dcaf10ccL,0xa3709ccce937a669L,0xea97bace4862f098L } },
46515     /* 25 << 28 */
46516     { { 0x62c7dd9ed537ed6bL,0x8a82ae7ccc168feeL,0x96fcf8d19d00a4a9L,
46517         0xfeef6ec205096874L,0xc828c68969f4485fL,0xdc4903a6322563f0L },
46518       { 0x5339cad7d3280a32L,0x42ae434909ff15cfL,0x94cdb7790bbb6af4L,
46519         0x480f8a5515721529L,0xc2f9c4dc0ff28eb2L,0x9d2a405e1ff6e3d5L } },
46520     /* 26 << 28 */
46521     { { 0xfeebe7d29309e729L,0xd322c38aa30a4eb9L,0x18cb0ce12f4f5c8eL,
46522         0x08a073a04262105eL,0x6ca92585933f888aL,0xf4a080c903ca1489L },
46523       { 0x5e678c7949c8daf0L,0xcd6ef6ba5abfcf82L,0x61faba612a4fc564L,
46524         0x7cacb3dcee0b306eL,0x9fcfafadb5aae2a9L,0x193e841c4b8fb04bL } },
46525     /* 27 << 28 */
46526     { { 0x4db6f5f07ed99ce4L,0x1257bd9c2456059bL,0x546c764b43d3590eL,
46527         0x6d5062adebba72d6L,0x6858f04e2e8d99fcL,0x46554047b4eeee5fL },
46528       { 0xff433f63535f2da3L,0xd76777542b76d2e8L,0xeb6be9c88e838a3fL,
46529         0xb7a2d2c1145f8bf4L,0xf3ba128703bb278aL,0xd88cd51530c4a1a4L } },
46530     /* 28 << 28 */
46531     { { 0x51758334c942a3f5L,0x7cc01e8832182ba6L,0x772af25774de4fe6L,
46532         0xb1b3c448e9667bf8L,0x71cb27388079caf6L,0x48890c641d823a40L },
46533       { 0x47a5887b0e9edbdaL,0x916dfb0cbe089e5aL,0x3185090e1eb42ddfL,
46534         0x3c7eaa13b7f3af26L,0x940ed8c79e9963b2L,0xd85e77db3426ac10L } },
46535     /* 29 << 28 */
46536     { { 0xf21b47bfd7bbbfa1L,0xf757cb309ea0ea77L,0x6df7f53783b2a6dbL,
46537         0xb0808cf99eb8ed81L,0xc526bb6b64edb3b6L,0x24f1612068f72d82L },
46538       { 0x3e2e6af8f01cee94L,0xd2e01f947847ca60L,0x079dac3539e68ac2L,
46539         0xc30720b270cedeaaL,0x2f97f968fa6bf057L,0x2dba403babf6a743L } },
46540     /* 30 << 28 */
46541     { { 0xed99932452c802f1L,0x99f6864c5cb78b2eL,0x8f8a0a709b9c3693L,
46542         0x0b931016e2f598bbL,0x7edbb1b3a614fc15L,0xa0321b50e79f74c2L },
46543       { 0x834f3ee994bfa457L,0x5ffa9613006907b4L,0xa37e9b83d779b46cL,
46544         0x7a21743cf33b791eL,0x6646b89dcc28a011L,0x9b975ef8e2ba76f8L } },
46545     /* 31 << 28 */
46546     { { 0x166c7151ec72cbfcL,0x3d1f2450c9e519ceL,0xfdcc648e7efc0fa1L,
46547         0x3f5f90cf6db6d516L,0x8a5dd3df145830f8L,0x4d9938da4e5858e6L },
46548       { 0xe598f9d4dede1584L,0x2de5a26cf5c8f4e4L,0x495b750f364e20f6L,
46549         0x29291c445b718188L,0xe560d9ee3733ce27L,0x99b9d27d5b9d206cL } },
46550     /* 32 << 28 */
46551     { { 0x162cdf342efffd95L,0x92111fdad59086e8L,0x4478d114454eb977L,
46552         0x8ce403d8dea38a67L,0xd459633b7435728aL,0x3a7be4e3a63b0504L },
46553       { 0x0c74066b335dba3eL,0x4e8fb1d7c6ea6ee5L,0x3398b588a99690edL,
46554         0x4949517c3ad77562L,0xf9824f09cbbb60eeL,0x9fdcafdf85660becL } },
46555     /* 33 << 28 */
46556     { { 0x368bea127aa62889L,0x6096730506e1046fL,0xe69be05e564f219cL,
46557         0x064b9d7c01eab75cL,0xf16ccc9e0152981dL,0x708827acb178a3deL },
46558       { 0x320f6a8a93248b89L,0x532acc568084908eL,0xe494cd1f6ab586d3L,
46559         0x59c74cacabbdcde3L,0x3ccf84a62259abeeL,0x6657d1fad96bd141L } },
46560     /* 34 << 28 */
46561     { { 0x5d3a8252aa0a9dcdL,0x540e037af97fe26aL,0x4cbb768ca3f68f56L,
46562         0xf9608732652d7058L,0x5fae0f9f72cea8b9L,0x1a7edfd97d980da5L },
46563       { 0x9f00ee611791c34dL,0x6c95404c2bc25810L,0xabb1089e043a9faeL,
46564         0xe36fe9e1a7881ae0L,0xf163dc460fc04e9dL,0xb6955f2f129c7940L } },
46565     /* 35 << 28 */
46566     { { 0xa22ebfc7c23bcd94L,0xa653b119684fe9f2L,0xe469e28646b59d70L,
46567         0x0720daf3dad96b47L,0x5066df7871288c07L,0x7648d7d82905b5a2L },
46568       { 0xc6ab9c5c0a30a65aL,0xa00539f34930712aL,0x6a64738c7e894bdeL,
46569         0xd7f3a7459e8eafdfL,0x652a58ff8ce9f7b2L,0x7c9d02e4cb3782bdL } },
46570     /* 36 << 28 */
46571     { { 0xf26bd8618875d9e8L,0x22e2380dbea9c273L,0x5f15183791995508L,
46572         0xb97f40a6648aa1c6L,0x7478f5f83977d848L,0x21e876ae35b57de6L },
46573       { 0xf620b180a93fc7f6L,0xf49bd07e1b148996L,0xfb0857261c4f60e1L,
46574         0x6a6653af7ad6b84dL,0x913a2d022e05b686L,0x94746629407dda9aL } },
46575     /* 37 << 28 */
46576     { { 0xc662b0f68a97c714L,0x69fbf7d1b8fbbb02L,0xf3bb5a9c5cdff85dL,
46577         0xfade6eb036ee44f3L,0x6eb4b8266d0905c8L,0x6ab3e4a4391a34d6L },
46578       { 0xf490046478e7bdb1L,0x8bcd4bf23272c400L,0xdf9a81b78d2c9573L,
46579         0xb9a0ea166af43695L,0x3298a5d071fe768aL,0x53eeeb4333e87bd2L } },
46580     /* 38 << 28 */
46581     { { 0x87cdbfe6bb531d08L,0x384bcd0357957992L,0xc654e2c942008cffL,
46582         0xd12b50285002e06aL,0x41a34286a67db410L,0x31a109d99d6b2c01L },
46583       { 0x14d642da2ed35f38L,0xa06a846048ffd04fL,0x8291190cbdbeef68L,
46584         0xc8106239e43bb0c9L,0x4d7aa992c4bea448L,0x107b86efba3dd9b5L } },
46585     /* 39 << 28 */
46586     { { 0x3d870c3144fc1cd3L,0x34409eec0085e7b3L,0x67d5c1340d0395e6L,
46587         0x9c30dedae3f36689L,0x988ac951d268cc91L,0xdb05825bd2c9dfdfL },
46588       { 0x30ccc3b75d349fd5L,0x63383c0f60c3a79bL,0x4f45c81732c71964L,
46589         0x456679642fef028cL,0x82454c12cf4053f0L,0x7c1310fbed8077f0L } },
46590     /* 40 << 28 */
46591     { { 0xb8465d16da684157L,0xdadde1abb238faaeL,0xe2cd45e7c6b9bea8L,
46592         0x7251d4a15cf413d5L,0x615cea8baae1765bL,0x75aa831813f36885L },
46593       { 0x7d5b0bf7b8767cc1L,0xec38a8ff8022968cL,0x034805b62a07faebL,
46594         0x916f9eb033b7321eL,0x34963633c0c577ceL,0x8ee07efdabb8d3ceL } },
46595     /* 41 << 28 */
46596     { { 0x498606fc2d15a409L,0x2398e109d5fdcb60L,0x8ed8fcbc36540c3cL,
46597         0x94404e2bc1db3193L,0xe62b808b28db1c38L,0x545b60871ad1d686L },
46598       { 0xe8bf6489740f4264L,0x7ee76fe71809505cL,0xaa95b8c86f45a011L,
46599         0x9bd6111b55c715c3L,0xc5c736bc33165913L,0xf1e8cdf282f6c7a9L } },
46600     /* 42 << 28 */
46601     { { 0xeb09e7fa949d05b5L,0x49394c1b8d014014L,0x644874d73eb7abd7L,
46602         0x89c666e5679d2a01L,0x6ea98cbbd315bc8eL,0xd919142a37fa5a26L },
46603       { 0x042fbac56d0239b6L,0xbff2b086837c510fL,0x21e4d279d9883ed7L,
46604         0x6416e0239713c2b2L,0x3742c6d14ea05144L,0xff591d8fd5b00fb2L } },
46605     /* 43 << 28 */
46606     { { 0x0ae21b83c138ed42L,0xf1b0895a2ff30df8L,0x4d5d634d9559c6e1L,
46607         0xfd02f3a3098e5c4aL,0x7bc6b63152bb211dL,0x498a68fffb69f0ecL },
46608       { 0xd6fd5f443e69b479L,0x5ea1877d8c740d2eL,0xfaaff5f0ca605f02L,
46609         0xb3022f9839a03f5bL,0x3feb7c13aa253725L,0x119097a89dc33a73L } },
46610     /* 44 << 28 */
46611     { { 0xa0bd6c0da8a29345L,0xc676b6c55d7f5ef9L,0x303b6d7c20ad7259L,
46612         0x06542a19d8fe09a7L,0x5a06653ca959014aL,0xf45fd79a5bcfe0cbL },
46613       { 0x29058d984e583468L,0xf1bd25e60cd7afc0L,0x2a88246ef7dbe54cL,
46614         0x680eaff835e0ef3dL,0x5942c97f726e59b9L,0x43e971398d5c0825L } },
46615     /* 45 << 28 */
46616     { { 0x6656b318f7378bf8L,0xf9a838df182f1a29L,0x0d62dc5ede475756L,
46617         0x97564544585bcab5L,0x3e99f44c857a13cfL,0x8c3a0a940cbdde00L },
46618       { 0xa7be375833dd2d24L,0x629040f1bbb1c7eeL,0x0bb2ced27f0eab7aL,
46619         0xb86f1e1e9f474277L,0x60539a544a14ac4eL,0x9860f986aa90977fL } },
46620     /* 46 << 28 */
46621     { { 0x143fdef1fe944aacL,0xfd6700fdd24f606cL,0x5dad2e41737404a9L,
46622         0xb16c5d42953abdccL,0x132b5cd995be01c9L,0x2bf605d86fd01c6bL },
46623       { 0xed62526c8803881dL,0x3429579201788c26L,0x553f8e0f8d62ab25L,
46624         0x3b2df9cf9850ff9bL,0xb320ec40acb513b3L,0x86d61c988875dfe7L } },
46625     /* 47 << 28 */
46626     { { 0xe5fbda4daab3cc32L,0x556fcd2535d469a0L,0x414673d91c02fb7bL,
46627         0xc14ee9fd8bfe6a4cL,0x8ba0959d1133d9f3L,0x086a7c94e94338ddL },
46628       { 0x92c2f484cdd5a1b9L,0x97bb21f6ea0e0f9eL,0x99756b285411da59L,
46629         0x4b79c4663be739b3L,0x73502d3e706078fdL,0x6bb794100da7aea4L } },
46630     /* 48 << 28 */
46631     { { 0x2daddb11a406d4d7L,0xb02b5da5a2a33d81L,0xb73ce82721a6aa89L,
46632         0x10919587467506deL,0x0927724c428d8daaL,0x0ede991f7c17adfdL },
46633       { 0x8518dab1bf7ddb3dL,0x04b091c42a54e1b8L,0x5943c37f89e7a398L,
46634         0x8e63f5e8e273f6f3L,0xc6d0352b83143d22L,0x30e43182ebd1628eL } },
46635     /* 49 << 28 */
46636     { { 0x9bc5af5aedf58e50L,0x31a3beeeb0d51722L,0x5789fcf98cd467aaL,
46637         0x85d974897793faafL,0xcf09224ecc18f367L,0x4f293783ec7957b4L },
46638       { 0xb044c854c0be350cL,0x027caaf72a63996cL,0x5341b3f3cb85de2fL,
46639         0x0d261d80b106359aL,0xf63bfe7a8456af12L,0xa954c4400174c82cL } },
46640     /* 50 << 28 */
46641     { { 0xaf752854b02aceb3L,0x000c5c4222c194b3L,0x7e953b78ebd2e61aL,
46642         0x44dd61b4b9d68960L,0x282ef4216d454ed1L,0xffed862aa402ca61L },
46643       { 0x5fffddeed3e189e2L,0xf36379990daffe3dL,0x1b09a625857a8a00L,
46644         0x3e64ff63c1ced62aL,0x9acc484d10b63647L,0x5a470aef3afc8675L } },
46645     /* 51 << 28 */
46646     { { 0xe21acfec09ebdbaeL,0x512c66a729b064faL,0x15c08e1191835db7L,
46647         0x78fff5d665203a4aL,0x99259d961c73615cL,0x85b444b9f36024bbL },
46648       { 0x4909772df16932deL,0xcc4a526899a3863bL,0xe54557bd2ebff8faL,
46649         0x1a9b05b709bee4c1L,0x0d2ce396bdb2b785L,0xbd15bcec8ce7ef40L } },
46650     /* 52 << 28 */
46651     { { 0x606658a99991167eL,0xb8773e1572c4b43dL,0x6cb364cde025abceL,
46652         0xafa58e9b0c5a653eL,0xa7e35a54134a68bfL,0xcb831d42ba4d9db6L },
46653       { 0xae37348ede83ef97L,0x4ac64a6a62ddd553L,0x5feb5e0d715bb6b4L,
46654         0xf876efae043424b2L,0x7b56a291ad91a9efL,0x817c7053356f3adeL } },
46655     /* 53 << 28 */
46656     { { 0x0dbd99249e88115fL,0xecb57472bc568c61L,0xfa4f4a47c1058746L,
46657         0xb19006014d92c079L,0xe693577091026a8cL,0xebde8e65eefe8740L },
46658       { 0xe8bc6b3480a93b35L,0xc1c8fc0635518beeL,0xf7f4b448a47cdd36L,
46659         0xe4d040e0db4f3e42L,0x025fbdfb88345042L,0xfe6cc10f3fbe045dL } },
46660     /* 54 << 28 */
46661     { { 0x63ba344a1c20cb4fL,0x55f11c207e8cccf6L,0xe66e1641b5b1046cL,
46662         0x51cf6dbe758a460bL,0xe786a81e91bb5101L,0x6f4a976209cd4365L },
46663       { 0xe88b4d03fc565022L,0x46006d0ebfdf8ec6L,0x10a3e85781f4e635L,
46664         0x28ea91360a4a2e82L,0xf890ea9e757b38dcL,0x89c6789261312e2aL } },
46665     /* 55 << 28 */
46666     { { 0x8ce54e2a65d9fc54L,0x4776c1f13bfc0c09L,0x5d15fced99476b22L,
46667         0x2c5399bc1142dc7bL,0x6faef9d96c6ad87bL,0x4f238e48ca5126cbL },
46668       { 0xbc7136d607849dc2L,0xc840ccb1e30377a8L,0x30e0f0373a371bafL,
46669         0x5b8eef9bdfce4735L,0x1662184e514bb217L,0x010ebb8579e0918dL } },
46670     /* 56 << 28 */
46671     { { 0x3d6e8d6d8dff7dffL,0x6b6c194ad5be4ad1L,0x57b93f2db6fcd08bL,
46672         0x99f09948f3761f23L,0x4062f3d6ac8b018fL,0x4b58ac05a27af72cL },
46673       { 0x4abcc81504d0cdfdL,0xa50043e0bda4b02fL,0xe11297e527a9c083L,
46674         0x2b2d8d529779c5b3L,0x3de3d330dfdecfedL,0xfe2487caae7fc522L } },
46675     /* 57 << 28 */
46676     { { 0xc510bb0b7e7a66ceL,0x54a3e0111332f2c3L,0x6331badedc885f5cL,
46677         0x1a73c8aedc47d8b2L,0xc657edbb95d4e933L,0x30994aa335dc3ccdL },
46678       { 0x832d586fafe5be42L,0x3392b07ad44de522L,0x1bcea9a62982450cL,
46679         0x8237bf2b3709f75bL,0xfa4f2501ea9d03f0L,0xcf492df7bdacd276L } },
46680     /* 58 << 28 */
46681     { { 0x2d0f7f28af4ecf83L,0xc2863ae4d48229efL,0xc989ff3d7001268dL,
46682         0x7f07adb6ba225adeL,0x1564c1db450a15ddL,0x3bfea98c6524d417L },
46683       { 0xee3cd3ef2cc20833L,0x055c569dba767b1aL,0xef2eaf51351b1279L,
46684         0x4e02b1d163b809d2L,0xf0e943d00a14c115L,0x2bb3bc3f32f55210L } },
46685     /* 59 << 28 */
46686     { { 0x8f577dd79ed385ffL,0xdbcf0548a1fdcac6L,0x38555497c2352ff2L,
46687         0x33e2ed85eb9edab2L,0xbe4bd6db9e649ecbL,0xea3668f72c6e7488L },
46688       { 0x841627b8f4b91b7bL,0x2d61a0f7d487c7a7L,0x1932b198142d1dc2L,
46689         0x06dbb39a1a792783L,0x5be16e570bede1faL,0x4d3b197bdffceb55L } },
46690     /* 60 << 28 */
46691     { { 0x1c2fc5088f7a83e5L,0xa7c56233b9970c92L,0x949c71738bafa66fL,
46692         0x1e299b2d5bbb0490L,0xb9a79e7c18fcb9e8L,0xe6372ce69cb5cc50L },
46693       { 0x114fc628f465c6aaL,0xc55395208cb797f6L,0x7df94ed7a73ad211L,
46694         0x41eb8e1f8e0cd008L,0xb028725a004cbb0dL,0x1340186d372c1656L } },
46695     /* 61 << 28 */
46696     { { 0x5162886c203a829aL,0x60dbd8d464416392L,0x60589a51b5a10685L,
46697         0xa79ca259113476a8L,0xbf4f71100d7b37dcL,0x1a1b3fdf78bbb029L },
46698       { 0x2954d3454799a0bdL,0x7459eac788c256efL,0x61ac72653800707cL,
46699         0xd861f7764cc84f7dL,0x29f4e5bf84faae3aL,0x7975c9555aa1236cL } },
46700     /* 62 << 28 */
46701     { { 0x65f28419238c3c84L,0xf07d83ed90f1ecd1L,0x10307e1bf6567704L,
46702         0xa94dddb389d17845L,0xaa56f72788f39175L,0x01cf57e2a7aa55f7L },
46703       { 0x98f4340e77f21e8cL,0x8cd3e0a2adb036c0L,0x5c49ebf4af6b46ddL,
46704         0x312a2c32455f6897L,0x52fb4f488b517f06L,0xb0f373d442beff4bL } },
46705     /* 63 << 28 */
46706     { { 0xd9694bd9af44f9ceL,0xaf2cfbbc1ee29f43L,0xaf352b1c880f80ddL,
46707         0x3fdabd2142297787L,0xf5a2acc21c7916b3L,0x6154b3f2cc0d85f0L },
46708       { 0xb9ff2bea0bc58e86L,0x359eb0750561c3d1L,0xbb5a318fb93be593L,
46709         0x34af9320bff0b3b3L,0x3cbe89341d967c37L,0xd08e5f46a8e9a750L } },
46710     /* 64 << 28 */
46711     { { 0x4074ee27978029bbL,0xa9394bdabae0d0c0L,0xaa01d53972cecb4bL,
46712         0x4b0cf1279a7dd9c4L,0x3e3e3f165bc787cfL,0xdf48f7e1942de53fL },
46713       { 0x0cc69719567b9d0eL,0x631e33158d0d2750L,0x9fedc1e292314a09L,
46714         0x7547d22614a1adcbL,0x405561a48662b86aL,0x149fa2b1f5480b7dL } },
46715     /* 0 << 35 */
46716     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
46717       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
46718     /* 1 << 35 */
46719     { { 0x923d0b44bda4aaa7L,0xced14ce4fee29f7bL,0x1656be009cf5b87dL,
46720         0x13a37d0d1d61103dL,0x1d705880fb652393L,0x870a31bbed712ed8L },
46721       { 0x15ad02e6ad7c21e3L,0xf004e447c36c2831L,0x56aa376cba2b3ffdL,
46722         0xc3be2b2f9745443cL,0x47c8a870eb903660L,0x976c303e6c6c192dL } },
46723     /* 2 << 35 */
46724     { { 0x148bd39cf4fb80d4L,0x469b208cfff04e65L,0xf397fbe2ce548415L,
46725         0x441e5c2c87fdde9fL,0x6366b49ffee9c179L,0x38d02bd32938dc71L },
46726       { 0x26d450fac49c5444L,0x4569f95d2b23d3d7L,0x5f68bf4d298fd876L,
46727         0xe86df047544768b6L,0x40b69a32f8491267L,0xcbf3adf9f917c71aL } },
46728     /* 3 << 35 */
46729     { { 0x32498d4d8125489cL,0x965e8d07a5a46ae0L,0x6cea5e47e96a7e29L,
46730         0xf78293a4668039ffL,0x62548a96f63edd32L,0xe8e6af95a83e8256L },
46731       { 0x76e60c3b0db6263bL,0xa1ee4b0621b3d668L,0xa17dbf8b9e49b0b5L,
46732         0x4b29ba127eb366fdL,0x5e0ed781d29b565fL,0x8cb50d53199b36f9L } },
46733     /* 4 << 35 */
46734     { { 0xa66c703529aa3150L,0xd038a5ab479e61fcL,0xdee33e96b5ab5410L,
46735         0xd068929c7c57d123L,0x0839a208f1d6ad37L,0x8f523dab123f8178L },
46736       { 0xb3e5e524a67d3840L,0x88bda75e52eb59dfL,0x513a0ab7389f2dd3L,
46737         0x3197a145890bba6fL,0x61add75b6f66bf09L,0x5c9dfc154eef1722L } },
46738     /* 5 << 35 */
46739     { { 0x66dc285007769b1bL,0xe07fb7414d71fac4L,0x5ae688a6c2abbe60L,
46740         0x08ae92fadcbfd296L,0xbc291256b43044d1L,0x0e1d71ed9fcdf213L },
46741       { 0xf0c5b28102485685L,0x5d3f9302e3f68f42L,0xbbbfac50ffe4f036L,
46742         0xb5b5f26174fdba44L,0x4ebe1d070d746760L,0xbb0f7812c37f04b7L } },
46743     /* 6 << 35 */
46744     { { 0x810b6ab36df1199dL,0xc229308bb4f293b7L,0x3cf838dd89897750L,
46745         0x3e391e4e7a336c9aL,0x70148337176f89c0L,0x54b15bacbc4f1e22L },
46746       { 0x32b104f92c0f2885L,0x2c39cefa67034f2aL,0xb8310437bf178ac1L,
46747         0x722299f5c99370d5L,0x0a493cf0332b93a8L,0x00e0ab41a420f719L } },
46748     /* 7 << 35 */
46749     { { 0xf25925434cab24daL,0x52be9bbce7c3b9c5L,0xaab7a8b64660d1a0L,
46750         0x09738b819a9600f4L,0x58f0c86637de9e3cL,0x0aea5cc15db31f4fL },
46751       { 0xe480406f499868beL,0x0d8fc7f0f6913a44L,0x7282364435f2e14eL,
46752         0xb147b31045e37a93L,0xb1e7aa5bf15c1af7L,0xa8685068b03e7713L } },
46753     /* 8 << 35 */
46754     { { 0x21feb7fc21c34c2bL,0xab6a553addb0140eL,0x03a6557624b04e6fL,
46755         0x2531f186342cb0adL,0x088c4d54a24f6426L,0x9a0ee15c06a873eaL },
46756       { 0xdbe0253fd33bc748L,0xdad3339f5db8ac9eL,0xeaaf368173e65901L,
46757         0x71f1fab2ccbfa504L,0xb7b845224b0e163eL,0xe0fca8373c779f3bL } },
46758     /* 9 << 35 */
46759     { { 0x710988eb46baf373L,0x8cceb935b57d5018L,0x1864603fa45fdf17L,
46760         0x3dcaae73ef48e6d0L,0xadd9420b590322c5L,0x947783e39b135f67L },
46761       { 0xfde763688bf5049fL,0xf00e4c182caa4023L,0x4d3b0f23d355b3d6L,
46762         0x181fabcc20d5799dL,0x29499b40ab2ad0afL,0xf6e66328f9a938aaL } },
46763     /* 10 << 35 */
46764     { { 0xcd7b3c42bcbe922dL,0x2fe02b3b95dd1a5cL,0xeb66bcbd24ef5c38L,
46765         0x7edcc21ce579c309L,0x7b19d49116f6c900L,0x36019ecdb6317c2cL },
46766       { 0x554ba55391d9001cL,0xa5e30b9814f31e44L,0x3d1fe33bffda4032L,
46767         0x5dfec4782306675cL,0xbe59305e000c91e7L,0x3c4e52a325a6b879L } },
46768     /* 11 << 35 */
46769     { { 0x02fcc14ec5ea88acL,0xca29bb6d56d093b6L,0x876aeda90e6fe94dL,
46770         0xfa11a142d7225a9dL,0xfea3ca053d03fed8L,0x435854c6c54d5962L },
46771       { 0xd770737454a6dfd5L,0xb8960017a3e55d02L,0xd4015a0c04d65c3eL,
46772         0x397f93d1e98a1204L,0xb0efa2e55f3ed850L,0x18f244698a3ec67bL } },
46773     /* 12 << 35 */
46774     { { 0xa35802f5d62cd9f9L,0x0ca9c15d4148436eL,0x261a991d472b9d21L,
46775         0xd81a1ed6a2f8e875L,0x942f213a699b6d63L,0x041a12fc0ae57758L },
46776       { 0x61191c82bd70aabbL,0x3776eb8bee4c23b3L,0xabe23e8652511222L,
46777         0x66dd967d30dabb91L,0x77650c597ed27424L,0x08ea2ebdab25a050L } },
46778     /* 13 << 35 */
46779     { { 0xa410ba3ab6cb5a02L,0x6eb40d15d07c5c6bL,0x0de81e9107dcc811L,
46780         0x996f46eb2631b7afL,0x5a350ba75b7a22f3L,0xf42b24e7634159afL },
46781       { 0x07bae0abc30952fdL,0x3488cda2d644e0b0L,0x23ae40d0e2111e12L,
46782         0x650af54ec80cdb56L,0x0f33a30b7d4aa2a8L,0x4e8d3e98442a00e8L } },
46783     /* 14 << 35 */
46784     { { 0xa624ab3759a8bc95L,0x4b7e3fa61c971228L,0xe8229c4273aa694bL,
46785         0x0cc31029779288abL,0xf8eff30f57575e0eL,0xee5e01947d52803eL },
46786       { 0x32d87e558a78f632L,0x48a06031e454904eL,0xaa2cb8dd16c6e626L,
46787         0xadd098ac2c140452L,0xd25f285d2d3031b1L,0xfb5fbbe175b59543L } },
46788     /* 15 << 35 */
46789     { { 0x2297041fd7a21503L,0xfe7738c2657f03f0L,0x994a8deb168fa34aL,
46790         0x0c772e02a53c4fdbL,0x67f835d150124cd3L,0x0e0d26356993cbbeL },
46791       { 0x9857ed845257f11dL,0xdc23a728ac556942L,0xf0e1bb29deb32a7fL,
46792         0xb8c3c43fee0d70f4L,0xc294b0efc60ad214L,0xa4d438dc679067caL } },
46793     /* 16 << 35 */
46794     { { 0x520b0bb905c755e4L,0xa2c2c59bf89f0048L,0x85c1c73a73c23975L,
46795         0x6e4dec49783aabbaL,0x69f0c69bb0463155L,0x61a42b949c97b17bL },
46796       { 0x55af24a945d331a3L,0x4b0e63f8f5fe81fdL,0x4034283d708671c4L,
46797         0x200ddab35fd9001aL,0xe45f28e4342eaf3bL,0x3e8375b41ba936c4L } },
46798     /* 17 << 35 */
46799     { { 0xcde014bbc613b1faL,0x5ad97babcdf992c2L,0x9fe05b9fea13e2d8L,
46800         0x93b553e290c4031fL,0xd62bc0818c727bebL,0x284fb61f888306caL },
46801       { 0xa63f8dcd1101abd6L,0xfe02dc120e962b27L,0xab169958115301e7L,
46802         0x8822f954462209baL,0xb3ba3e721198428aL,0x9a73ed38d74c88f8L } },
46803     /* 18 << 35 */
46804     { { 0x7db497e17da2f887L,0x0995648b683f3507L,0x50e3ff74f5935bd2L,
46805         0xdec083e2708c88dcL,0xbcc3bc3125129bccL,0x7a3fd7a80a407b41L },
46806       { 0x46ab826c25e0ab93L,0x28e891ec54944cfcL,0x637be168f55c6cbfL,
46807         0xfa34e9942a65216eL,0xd23e99afe3a43c84L,0x6d09d189e6fd958bL } },
46808     /* 19 << 35 */
46809     { { 0x8aa6ca1381bbd283L,0x3a0633f4ee167a15L,0x7f297c8b9e3b18e6L,
46810         0xbead8a50c71fea64L,0xa11b2fdd457aebbfL,0xd7fc286f85bc7bd2L },
46811       { 0x2922ae5bad1c9d9dL,0xa07741c2ef9ac174L,0x24dab2d457fa8f9fL,
46812         0xd7078d946116a870L,0x4b45107834117a37L,0x19a4dd21c73c857dL } },
46813     /* 20 << 35 */
46814     { { 0xa2f9b4e4bac5d14bL,0x9f904a3eb8699164L,0x63585978fec79b4fL,
46815         0xbcc9b60ebff45cd8L,0x2e515592a5d63de5L,0xc47a048c3bcc637aL },
46816       { 0x0523810643aba777L,0xf6818e4c77e67aacL,0x9d5827d238f962b3L,
46817         0x28a904c6a003988dL,0xc06bc833551f4575L,0x61f6bcc2221cffefL } },
46818     /* 21 << 35 */
46819     { { 0xf7cfbbe5055a5623L,0x1f8af775e66d2a5bL,0x0cac440268831d8cL,
46820         0xd25185890d0e6f2fL,0xf17838a3182f90f1L,0xefdf6f20737f163dL },
46821       { 0xc3198af0542242e9L,0xf77c3d28209efb0bL,0x1df6d0da8de7be08L,
46822         0x22ef7367901a6590L,0xfa9b4af44b776d27L,0xdc49102c88ace4f6L } },
46823     /* 22 << 35 */
46824     { { 0x60c7d148bafa9cc9L,0x0afc5fe2516b87fbL,0x02e20acff795ff60L,
46825         0xd1ba069151f32975L,0x8547e7f757be2399L,0x4bdf6abfa0d1b33eL },
46826       { 0xc793832fa06077f9L,0xad55cccb2d874993L,0x5e217b27314387d8L,
46827         0x744d7b06e7f2ec4cL,0x761aa86d24fa58b1L,0x41400d9657dd313dL } },
46828     /* 23 << 35 */
46829     { { 0xd17f68da759d20f0L,0xc141ca6827b7eaa7L,0x3796db8bdaff5c66L,
46830         0x067119dca1e5220bL,0x174f11777158ddbbL,0xa80365d8cf8bf75eL },
46831       { 0x0a79f74933567f05L,0x8c2826123c99bb4fL,0xe448c2bdcd6ae726L,
46832         0x1ae05aac2ad4b0e0L,0xf90dddcb16442420L,0x37465a1ea75c28e3L } },
46833     /* 24 << 35 */
46834     { { 0xf58e05c53178468fL,0xa17c8b868328a2efL,0x1bb22cb44ce0c2f8L,
46835         0x1ab807b51aab9089L,0x2aafa8c91e76fafdL,0x58cdf95fb4801546L },
46836       { 0x2c1e4ef8d5d699f1L,0x1583a2aa4cd433bdL,0x571dcaec7f4f9b10L,
46837         0xf62b696b27156c5eL,0x77d2443448820bb9L,0x94e4cfcc11dd3e55L } },
46838     /* 25 << 35 */
46839     { { 0xc3fd1feac00e6c7fL,0xf4e42ddabd322507L,0x1ce3e0da023469ebL,
46840         0xf81769d2d788b1c2L,0x505cec4c62353342L,0xd4049907ba759922L },
46841       { 0x9ff98f06618ee939L,0xfa63b3606bd55f31L,0x3fcce488cc4d2515L,
46842         0xeb6e92e91d629e19L,0xcae4190bff892af7L,0x3e7b780dca80cb44L } },
46843     /* 26 << 35 */
46844     { { 0xbc923fdfaf54b58bL,0x2aef31d88767acdeL,0xfbebb8f07f28a3d4L,
46845         0xce5feafe694fe977L,0x606afb0ac9da1ee5L,0x559866a0b74f7c42L },
46846       { 0xd935191fdc85f22cL,0x5c3002d7c8ce3240L,0xecd278c198452214L,
46847         0x665b3176821a3606L,0xce05a914baf26fb7L,0xa178860b60e4e8b8L } },
46848     /* 27 << 35 */
46849     { { 0x135c82b55000cc19L,0x34537edf8b2c55b4L,0xfcb6aac2b37acc8cL,
46850         0xa882e25e8ce8d7f5L,0x531756e98c7ff1eeL,0xdcdaced9ad6312b0L },
46851       { 0x309a469b7f3aef9dL,0xf306e32588d8772fL,0xe7e6f3abd4dc0d90L,
46852         0x816b01ae49878940L,0x1cb084e84ba5e2c8L,0x395af25b005d08b3L } },
46853     /* 28 << 35 */
46854     { { 0x3832cfd59093efcaL,0x3fda8380ed8b34d7L,0x874ec122e2bd4004L,
46855         0x3761e9c44270b9ccL,0x6eb2fb1166e640d5L,0x2a45ad23e6dfd0fdL },
46856       { 0xdcb3272bf8dd082cL,0x7d84341f17486485L,0x0f46b1fda4ca2644L,
46857         0x81a1ab1e82baf37dL,0xbb1d72713b322f65L,0x1571e326f4038252L } },
46858     /* 29 << 35 */
46859     { { 0x4e00aa41d9acdec7L,0xb2b701bf9f80dff4L,0xc366ce97d5e71e0eL,
46860         0x28c2b4e9ed09255bL,0xef54a1a535086ba6L,0xee2e43f2a1c8b39eL },
46861       { 0x346f22f5d9143a78L,0x71fc5c06f1053377L,0x1789f7644737b5bfL,
46862         0xc9f83ee8b0df2648L,0xf91a29e9073ee793L,0x18eb801e3ab450a1L } },
46863     /* 30 << 35 */
46864     { { 0x1c3df0914085f0b6L,0xc60c47f5cede211bL,0x7bdead8650b6e857L,
46865         0xc68645be2cf9aad6L,0x8d970a94d01540f6L,0x9346f253782ec6a1L },
46866       { 0x3da31263c1b23981L,0x53076158dbabfb68L,0x22947b9f743dfba4L,
46867         0x872e60061c56f47aL,0xe973d81c2b3b8417L,0xb98216184b1fed56L } },
46868     /* 31 << 35 */
46869     { { 0x29fa699b8873de48L,0x64f9e1124932447fL,0x4fb0e009e4c20d43L,
46870         0x748a0cdf78016262L,0x4891badb7bd23ea8L,0xf1300a437f56368cL },
46871       { 0x178efa9de8f1f8bbL,0xc31cdb4098a31dd6L,0xc2d5bfbad2c43f9cL,
46872         0xf377e2cc8678d990L,0xd42d274808d19833L,0x2d72fd4de5ad5e63L } },
46873     /* 32 << 35 */
46874     { { 0xb083ba6aec074aeaL,0x46fac5ef7f0b505bL,0x95367a21fc82dc03L,
46875         0x227be26a9d3679d8L,0xc70f6d6c7e9724c0L,0xcd68c757f9ebec0fL },
46876       { 0x29dde03e8ff321b2L,0xf84ad7bb031939dcL,0xdaf590c90f602f4bL,
46877         0x17c5288849722bc4L,0xa8df99f0089b22b6L,0xc21bc5d4e59b9b90L } },
46878     /* 33 << 35 */
46879     { { 0x44e6089f006e422dL,0xb4a99bc45b029c6eL,0xd14bd00e6f289edcL,
46880         0x8ebbedfa25c50773L,0x5bdad80851d3ade5L,0xe4e70c3094727960L },
46881       { 0x29b759e863ab2622L,0xe20ad36b134d5982L,0x27c8387f4070e06eL,
46882         0x9fae222556593896L,0x299a0f0c3b199172L,0x476fe70977a39ca4L } },
46883     /* 34 << 35 */
46884     { { 0xc91a3d2ef4d0d8a4L,0x450193a819e05a78L,0x0e59e0b89eec69eeL,
46885         0x2ba20f00138fbf46L,0x5c9fea780e8ae694L,0x62c81c8cc6b73372L },
46886       { 0x2a1df446ff0997a2L,0x929364ab692bb930L,0x4c4a956436cb618cL,
46887         0xc55020a0526be5dbL,0x151f18a02c64c026L,0x2ec5becd61724143L } },
46888     /* 35 << 35 */
46889     { { 0x139c7d788713439bL,0x46f7bd4b1e19b1caL,0x74259a28b47977d7L,
46890         0x89a912cb8ab1817aL,0x4428e45f06419142L,0x11b9c4836b34a2d5L },
46891       { 0xb613563a29487118L,0x81f4502ab6249a60L,0xe28685843d4ddecfL,
46892         0x138c97297bd250dfL,0x733f2201aaac4593L,0xee6b85ad5d061887L } },
46893     /* 36 << 35 */
46894     { { 0xbff288ed74006fd8L,0x388c5a34ded657eeL,0x47d400a2d61a2995L,
46895         0x54c684af1eba1f65L,0xd1ba6975b1b4452bL,0xb23dda26f2f8283aL },
46896       { 0x6bff7acf86803147L,0x839571e5e8ea5923L,0xc89e1048dbc4ccc5L,
46897         0x1fa0221120102232L,0xbf7b8f902d4e4406L,0x14c5de43576aba0eL } },
46898     /* 37 << 35 */
46899     { { 0x6c55807bfd2f9b11L,0xb01d9f7239e338efL,0x94f6531135628879L,
46900         0xae51cf0b0ec6f5b4L,0x387223cfd36b9719L,0xeeb02cc6f2fb192cL },
46901       { 0x867611ec43c9e89cL,0x5b15785f97930887L,0xb792b88b57ab078bL,
46902         0x0c54de110bdc03cdL,0x5785811a30d0eee3L,0xb73bb98436b88b00L } },
46903     /* 38 << 35 */
46904     { { 0x0d0ba3c06fba6f94L,0x7f7e0f5cf29713c2L,0xa8cce53ba6b94d6cL,
46905         0xbea99382df40fd27L,0xb3ff1c56bcd4f8b2L,0x19124644418f108fL },
46906       { 0x6fc5260727c26f18L,0xbc5e23d682c7c8f9L,0x12aa5e8e099b8cb3L,
46907         0x9d94d88614c579f9L,0x5c629d7a47395f32L,0x9cd280633efbbea0L } },
46908     /* 39 << 35 */
46909     { { 0xf0bbf8e88edb7b56L,0x9a76ad71adeb43ccL,0xd99a92528643e982L,
46910         0x6468ff05cf17f5b5L,0xe6589476d56b985eL,0xdca4273cbe446b3dL },
46911       { 0xd430e3a47b9dbac1L,0xe075c00f4cfe735dL,0x3ba43fef12395845L,
46912         0x6895f0c3dcb49ce9L,0xd868006aa92843dbL,0x968a8ceec0d5bc9eL } },
46913     /* 40 << 35 */
46914     { { 0xc0387b57f440fe92L,0xce8bad38e291c443L,0x022052e5f9e88be0L,
46915         0x6f949fe261615c9cL,0xf4874e2d84725fc1L,0x06fb244b73a394ebL },
46916       { 0xb70553c678208bd8L,0xab1829c028704d28L,0x1453ee1a807b160bL,
46917         0xa1da80c34649d33aL,0x072e02e056c32ee1L,0x79baa98f3f590646L } },
46918     /* 41 << 35 */
46919     { { 0x1613a710b0fef3f2L,0x9ae438012edeec54L,0x07824d08579c3130L,
46920         0xc2beaf806ba2b1fbL,0x7df3c459fc9e85e5L,0x8debf613dbd63acbL },
46921       { 0x2774ab78f04f3526L,0x36e7ff55a5285219L,0xf2adccaf4ab04c77L,
46922         0x14add3d8aa43fbfeL,0x387e4965e3026ac4L,0x154801a1c77391ddL } },
46923     /* 42 << 35 */
46924     { { 0x28687291933bc404L,0x6a13b0cc9ba35fa8L,0xd3d1746931c5d126L,
46925         0x1c81ce5df9727cfbL,0x14f66be860b464eaL,0x0bbdefb8c10ea9f6L },
46926       { 0x5679a0e5e8d06c95L,0x380161d83dbfd6e3L,0x6cdd31f20523e6d1L,
46927         0x2ff419e0c4b4c439L,0xc7439153e217782cL,0xb1b74383f6dc5d95L } },
46928     /* 43 << 35 */
46929     { { 0xcf0d1d2d03746e38L,0x8476c982916e077eL,0x93de41516dfdc6d3L,
46930         0x15010d26b78cf13fL,0xbab5a5de97cb08c0L,0x37f0673014a31939L },
46931       { 0x777c709f6819b0f4L,0xe3c2d2f7114a32e7L,0xf0227e19ec047092L,
46932         0xe1416f34b817e1e1L,0x4d7db41419c6c3f6L,0xf12a13a9d01aecb1L } },
46933     /* 44 << 35 */
46934     { { 0xa09e68e61f023abeL,0xbc432449aae2d6c8L,0x61e22f727cb683dfL,
46935         0x0b5bbc0fd81a0e89L,0x18ea4e774581f128L,0x28df9961cd70a12aL },
46936       { 0xb0d3b19f8b8bc10bL,0x0805d1439844e7f8L,0xe3ed3d40675ab6a9L,
46937         0x026d1200f75e2859L,0x1802457b8bb10969L,0xf94c62b3eadab8caL } },
46938     /* 45 << 35 */
46939     { { 0x518e9c4220d03ce7L,0x6c44676187811010L,0x07ff38f99d9be611L,
46940         0x5c2bac105cf0cfd2L,0x4e5cc677d5881c2dL,0x02dc395f08e39281L },
46941       { 0xc3ef99142044f4e9L,0x0203508c20c8c831L,0xd1276c030e0524c9L,
46942         0x5525c0af5402f999L,0x5c9a43aa49c2371bL,0x6d7b6700d28cbb59L } },
46943     /* 46 << 35 */
46944     { { 0xdec3ab0f7bae55e1L,0x6bae4baf56152625L,0x1d597c0c839b5d6aL,
46945         0x243692a966b3b169L,0x37f2ca8eb01c6d34L,0x5baa355aae5c05baL },
46946       { 0xe0b84c28af384b13L,0x6a2c9386667cd513L,0xc361a75d78319608L,
46947         0x0c317ac596ca528dL,0xe243aa8672f0a5e0L,0xedcf9f5fa1d1677eL } },
46948     /* 47 << 35 */
46949     { { 0x88e5cf3f74a0a7d2L,0xa25a3883cac23d4fL,0x7be2fc2ba6eb3d72L,
46950         0x188be28d391326cdL,0xeca6aa726f3db24fL,0x237cd6f70b9a11a1L },
46951       { 0xafeca5436fecffeaL,0xa32291510e6d18f3L,0x46699e2500dd8b76L,
46952         0x5edb4b1a331eaa12L,0xecf6d8a472ce0658L,0xd91af8da6b80e9e2L } },
46953     /* 48 << 35 */
46954     { { 0x7af5da7b63ec62d4L,0x74dc387261dbdee2L,0x7d08dbd360b519a4L,
46955         0x4e785f79459ef257L,0xe3e7d5a485fa9e7fL,0xea60c815e9b5665fL },
46956       { 0x2e570d18c209caf9L,0x7bae108371818d1eL,0x5db42a0a398d749aL,
46957         0x149740ff4f555604L,0x72e4f06bbcee0abdL,0x0ecc0cb581ad0830L } },
46958     /* 49 << 35 */
46959     { { 0x43550eea0a34451dL,0x8b0b97e9c3aa33e3L,0xdd974528da22dbdeL,
46960         0x0337c64dabff3ed2L,0xb50da9e9230cc211L,0x931f891c004d17d0L },
46961       { 0x8b7f9ccbff366019L,0x5483938033d76a4bL,0x52fceec1950ef740L,
46962         0x5b19b50cd18125d1L,0xbbb661f55b9011c7L,0xfbf0ec747beda7fdL } },
46963     /* 50 << 35 */
46964     { { 0xebca6bbec047276bL,0xcda078e05c3018c5L,0x4620dedda223af10L,
46965         0x962f389ad02fd60cL,0x901fab93baab3894L,0x5ecbbd7506eab11eL },
46966       { 0x865dc95e62203b9cL,0x04a599844acf85edL,0x877e94647607236eL,
46967         0x09592a5684609563L,0x6535176ace76d699L,0x44f2d997ce8812e9L } },
46968     /* 51 << 35 */
46969     { { 0xa09c9ab62285b330L,0x6058d94a9b145627L,0x7b4b4141da3c3571L,
46970         0xc9347a16033b665cL,0x95e9b4f01a33d052L,0x35520f3cd46c67b1L },
46971       { 0x24938cb136042a9aL,0x5eeaec9de73b7354L,0xed47914931f08616L,
46972         0xb0187b2b713a2114L,0x03c49947e3b76d73L,0x79b5778a2e94fc7eL } },
46973     /* 52 << 35 */
46974     { { 0x6bb19d2162de1ccfL,0x3810bdb3339162c2L,0xeb56c72b6aa09df6L,
46975         0xac66c58d1d415050L,0x922cd7e74ad9cc85L,0x09e3585f91168090L },
46976       { 0xffc9a98d31b918a6L,0xc273e186c73c7513L,0xd506753f12a77342L,
46977         0xe288a471e5edd613L,0x0f358d310cacf05eL,0xfbadfa2d9a63fcfcL } },
46978     /* 53 << 35 */
46979     { { 0x020e282989cf155bL,0xa1fa6eaac7f481edL,0xba422e09c5c89724L,
46980         0x43da4df7cad8186eL,0x1bea459cba3ca738L,0xe9f0afdd0c64bc9bL },
46981       { 0x4c3b3b8e3592686eL,0x7e6938a7b43ea3f7L,0x8e01a54e7ba7dad8L,
46982         0x33ecd36ea9c68839L,0x1abd6e125e7e993bL,0x29947e126531feb6L } },
46983     /* 54 << 35 */
46984     { { 0xb0fe9b7912a193a0L,0xfa19ad4be4bbd264L,0xd5bf0e5409918851L,
46985         0xd07d8e5729cf45b0L,0x228e67cc7744259dL,0x786ea24843ed0fc4L },
46986       { 0x7f700231873cd08dL,0x394db4a70ef49109L,0x699047c06a8197f7L,
46987         0xf5b168443021ff8fL,0x4c8bb55026621cabL,0x6f28b013065208f1L } },
46988     /* 55 << 35 */
46989     { { 0x2fb3a7601f809545L,0x8006902ae93849c6L,0x37cc848c9bd9e1bcL,
46990         0xf4cd31559d0f6340L,0x357772ac4baef442L,0x0f46d0f77d533f1bL },
46991       { 0x4121411fd9c12bd0L,0x304083dedb70e364L,0xff6b7a1ccecbeb3dL,
46992         0xb444b5972aadc899L,0x29ec79bfdb8b3731L,0x864d8d917fbd8982L } },
46993     /* 56 << 35 */
46994     { { 0xa79feacac241c5bfL,0xc86df4c017861e6dL,0xaecd1722a699282eL,
46995         0xcce5e345a0464190L,0x0a79c23deca4f6d4L,0x64603ff16a6e7967L },
46996       { 0x02e24234aa7312c2L,0xa9e1fc7791a1b587L,0x1daef29f94526a4bL,
46997         0xa7db710a62ead861L,0xb387fec78869446bL,0xee2171015db19f08L } },
46998     /* 57 << 35 */
46999     { { 0x79a0feabe64fb245L,0x5799eea096a4e94cL,0x2592e7a333b063a6L,
47000         0x2cac3c2ef1063574L,0xb9cea04a7f4755d4L,0xb8e40abaa0bf858dL },
47001       { 0xe1723d963ffa32a3L,0x6547b4402701eb1eL,0x16ec552a4da9b337L,
47002         0x75f7f4a8fe0555eeL,0xf97e465014f1c2b2L,0x5495fce3d9ccf8a2L } },
47003     /* 58 << 35 */
47004     { { 0xffd160fb62c1b457L,0x62efe01fc4d91f7fL,0xc54f75b5208dd413L,
47005         0x089514d3e78124d0L,0x752a9ae8c2945054L,0x466636fbdbffa78bL },
47006       { 0x32936281a265949eL,0xd657c0f084b4d11fL,0x199d8641af455a47L,
47007         0x1eb24cc7dbd9852aL,0xd2ce80f856bfbbafL,0x1b31b23ceb862890L } },
47008     /* 59 << 35 */
47009     { { 0xc866d2a5fcd5aaf4L,0x4ac2b7f57e21250eL,0xa78cd3cbc50b4a92L,
47010         0x2485c3435a5c541bL,0x555db4dc7ef371eeL,0xcd9d6d9c1304f782L },
47011       { 0xae86a22974b4d57aL,0x68c93bc8dd4cdd8fL,0x7b95411098b9fd49L,
47012         0x0dd480b9399d8d4bL,0x0e27be29f2665c52L,0xce8a1ef9d920a5c8L } },
47013     /* 60 << 35 */
47014     { { 0x10a6bd0cfc0395b9L,0xe30bf6d06a5e8107L,0xc8aa2483167930d4L,
47015         0xee75885006e7e1c2L,0x4ee64cfcedcb7788L,0x9498e9bbf2f1d7ecL },
47016       { 0x084d2350ae0fcdb4L,0x4398ee677f4d25ccL,0xc1ddca395db85bfaL,
47017         0xefd4819747961197L,0xbd16037f2265195cL,0x1c61a6fc56daae6dL } },
47018     /* 61 << 35 */
47019     { { 0x640cf6b17f7c8c50L,0xdffddf2209d44051L,0x837275314e3c038eL,
47020         0x3164d1875aa8d8a1L,0xb37590bcfceb1066L,0x5e4fab4200d489f6L },
47021       { 0xc1e5dca3f8105ea2L,0xfdd1b0751c7f8679L,0x571d7dd14f14ac54L,
47022         0x84cc453155cfb741L,0x49d0b1be48823448L,0x8365f1f3f798b5d9L } },
47023     /* 62 << 35 */
47024     { { 0x9f2409cb6a564a3cL,0x9266799ae5134e54L,0x39aa3697fac47921L,
47025         0xdf3db1f32c0b4dbdL,0xfa37a085f096ec03L,0xb99cfe05afaa0f3fL },
47026       { 0xc9e00e43df458860L,0xbeb7e60ace2bb0b0L,0xdfe2be57cac8d7e0L,
47027         0x6ec03d799162b2ffL,0xdfe3a6225d1122dcL,0x9f04dcc8b6014310L } },
47028     /* 63 << 35 */
47029     { { 0x30471bf9b42ba5c0L,0x19073fd0c9d26763L,0x92817e8059c1017cL,
47030         0x29248f743da195b3L,0x029d7e7be928767bL,0xf1a3a08a049a0080L },
47031       { 0x8ec4f3e6e20c1d68L,0xae815a11f3ad30feL,0xdd0a6083f76f43afL,
47032         0x197d29fe49465bebL,0xf1a40ae996316f4bL,0xec47d65e59bafbc0L } },
47033     /* 64 << 35 */
47034     { { 0x6f57752951c2bb65L,0x4a0c1c284b874bdbL,0x19a1842778b96c6dL,
47035         0xa674f9922f593505L,0x5abeeec46b7209d6L,0x42d15d0147cf5fffL },
47036       { 0xe24509b7b49e3b4eL,0x81be939c639ee6e8L,0x7f7daf595761e8e3L,
47037         0xed5cfcb8d420a288L,0x365b29eb7a0ff696L,0x7d14680599a1ac8fL } },
47038     /* 0 << 42 */
47039     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
47040       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
47041     /* 1 << 42 */
47042     { { 0x9ee1ec3aadcdaa68L,0xd98c498fdcbb6548L,0x32b9737588102ac0L,
47043         0xdd296cf9c08527f4L,0xb74f8145fae3dfbeL,0x84131eb96cd7cc4fL },
47044       { 0xa0f2fe7a927ff15bL,0x6b0ade4deee1a4b4L,0x6e7df2d40eeb90a7L,
47045         0xe2f46e20be4de684L,0xcd28feba3fdd06bcL,0x8e4205aee6d6d9f6L } },
47046     /* 2 << 42 */
47047     { { 0x35d47426f78d33efL,0x4af25db28440c42cL,0xbd6a15e22e91bf5eL,
47048         0xe366a84cc08b6b1aL,0x759c122f55b97de8L,0xecec558f08a03f29L },
47049       { 0xdcc9fca2ea9d2060L,0xb3e49b8e9f361fe1L,0xdeae39029b59cd04L,
47050         0xf532ede06f5e5bd4L,0x84fbeeb936099f4dL,0x73576b1f088d2052L } },
47051     /* 3 << 42 */
47052     { { 0xee43828c6b512bc6L,0xf73dc9f550b91e60L,0x68f23f30f5dbde6bL,
47053         0xaf2fe9e3ddd15e00L,0xfbf34dae86578d49L,0x689796556c130010L },
47054       { 0x137a5fc309942897L,0xff1f0bfe9959f06dL,0x2dd0a04abd7ee14bL,
47055         0x59c46072e54e2161L,0xf470bdaeea7518adL,0xce556e4340c471cdL } },
47056     /* 4 << 42 */
47057     { { 0x2ba8c79022b25f2eL,0xf4670a511af0f4a8L,0x6842f36a2fc2451eL,
47058         0xfc5c9558bb91e1e3L,0x035d1dfcc3ead762L,0x3d0721cb031e5556L },
47059       { 0x3af0cc813af18a2eL,0x7888cee2bd11a363L,0x80c3de0a6ade1d12L,
47060         0xe8c3a5bd93b2dcb5L,0xe3adbd7c90a2214dL,0xfe8646d51192948dL } },
47061     /* 5 << 42 */
47062     { { 0x9214cd4bf1c7ed94L,0x4887c7c63738f386L,0xa72ba72bf623e542L,
47063         0x3c52a464f67d6004L,0xcdb6171d09b9a4ffL,0xe5eb77d160aba627L },
47064       { 0x7aa9836f39d6afdcL,0xa3fa3a520e0a1e18L,0xe90bd925dee3a4c4L,
47065         0x47e8eeafd9a94dcfL,0x34302a4921e16feaL,0xe32a62eb8ae23949L } },
47066     /* 6 << 42 */
47067     { { 0xd1d70db31df1d1f2L,0x22ebc9bd9fec1f42L,0xde5ac585d11d3205L,
47068         0x0e4584ab282d4d6eL,0xc87607928f78b85bL,0x48a85682af1fbb6dL },
47069       { 0x64d012ceae0947bfL,0xab792bbf25e22366L,0x250d40d4a3a030deL,
47070         0xe9b49f0877e26b9cL,0xe7d30c828c0f2249L,0x2b77b40b97c676a2L } },
47071     /* 7 << 42 */
47072     { { 0xa89144b89efc8fe2L,0x23625c36e13b79c9L,0x4fdea1d3a047ad35L,
47073         0xd0b0ee0d4ae78e01L,0xc224b3f3eac4e606L,0x4360e8acfa41bd81L },
47074       { 0xb2c69238062437e7L,0x86ce8de0decd1245L,0x2ce4be3dfa9d07bdL,
47075         0xfd09aa853d268d06L,0x4cd874264a162aafL,0x1b28f72e9d45e849L } },
47076     /* 8 << 42 */
47077     { { 0x65026297ba958101L,0xbeb4adf98eef151dL,0x623763a460c8bbf7L,
47078         0xfa8f5ad78b2a7120L,0xfd744bdf085497e7L,0xf9b6f97e2ba35618L },
47079       { 0x0cebfe9df8a15e86L,0x47a6d01329576088L,0x655817a3fcf19627L,
47080         0x30ab44f7c2f11261L,0xbb001c9dddf2c850L,0xb45c7eff073260c3L } },
47081     /* 9 << 42 */
47082     { { 0x609a02d031716f88L,0xdff6246c45421ce4L,0x544f3162142838d9L,
47083         0x8842dcbe36b57d38L,0x2818919c57f561e2L,0x87f5acca318373aeL },
47084       { 0x42773fb72edf1501L,0xff92c38648e9d8a3L,0x21a81668ccd5a860L,
47085         0xbac5cf837328cee1L,0x7441f749ddc53a05L,0x987d3a1cb5abe243L } },
47086     /* 10 << 42 */
47087     { { 0x3b7c44f8fb90e50fL,0xeafeda047cc384fbL,0x9a33e377de65e34eL,
47088         0x303f568095094a58L,0x4c0f2e932292809cL,0x920c9c12160b30f2L },
47089       { 0x31d14e1414b268d4L,0x9964173f1eadb1dcL,0x8e22b362eccb0f39L,
47090         0x81dccdf83bf9ece1L,0x8e2fda43a40503b1L,0xdb647ac13e112199L } },
47091     /* 11 << 42 */
47092     { { 0x9c23216f096c21adL,0xae259a6d41fa37f2L,0xefe0a8c9efe96f6aL,
47093         0x5631701dd6a27744L,0xed8d0219b3017563L,0xbe2723bca0867a0cL },
47094       { 0xe02bcb56687b62cfL,0xf26c0f77b96f66a9L,0x43e46251fd16fa3bL,
47095         0x206a180a44033302L,0xcfa96b556121888eL,0x50567a7789dabe7fL } },
47096     /* 12 << 42 */
47097     { { 0xb08fb1175cf3e702L,0x7379b1978023df0aL,0x73aefc7b6f954966L,
47098         0xc0fb886f76bd243cL,0x871eacc5ce09d5a8L,0x9f55b0a4e773f049L },
47099       { 0x92945c84415d725dL,0xcd57391f0112ad84L,0x4762bc1d0509d73fL,
47100         0x15cf97f10f1af175L,0x1f855695328c160fL,0x32cb87263b439f0cL } },
47101     /* 13 << 42 */
47102     { { 0xb27e344ae6361abdL,0xa53690eb474027a8L,0x500db02d683a8ef4L,
47103         0x547ecd17819df66cL,0xc35cd4cc91360e21L,0x6ea003a16026dfedL },
47104       { 0x45e77cda22395207L,0x1e8e103f91264683L,0x130f2d2b3bd6328eL,
47105         0x6ae25c819af8973dL,0x6b0f90a0d32d7134L,0x0280a95755c62195L } },
47106     /* 14 << 42 */
47107     { { 0x23781958cd8bb5aeL,0xe3d30c5417dd827aL,0xf974e0076bedf762L,
47108         0xd8154b6273264accL,0xf10fd9bb167b9396L,0x967c5acbe9652a0cL },
47109       { 0x46775025a28fa76cL,0x17ac7cb32ece9d3cL,0x5fd8968ce04a833eL,
47110         0x96ed5b49fcd20a43L,0x1d209e85289f9c68L,0x4d7473518ce51950L } },
47111     /* 15 << 42 */
47112     { { 0x6f5c8f3475214c1eL,0x3d5560bae192d11eL,0xd8a63ff0d7af2e6fL,
47113         0x5fb858be9069fe09L,0x83956dcd8cc663f9L,0x52d30c3b838bce30L },
47114       { 0xf354f6d75569122aL,0xfcef54d1fa68f566L,0xc75b01e79020dfe9L,
47115         0xaac66895774b952bL,0xb2a58a299468cebeL,0xa994a3b487c81a42L } },
47116     /* 16 << 42 */
47117     { { 0xfa7d1236e2319f38L,0x9ba1a1c0a551d3feL,0x9ea27288beb1282bL,
47118         0x1c069efa07fee8a9L,0x5749c7b55870fee9L,0xbedca76fafcec6faL },
47119       { 0xa3f8f1b14c63c5e2L,0xaa1bb15694758ac3L,0x753329a9b59dc06eL,
47120         0xfa8e5f5b98a92c38L,0x6b6f46fd3c2b4662L,0x716f41a1ec04c6c6L } },
47121     /* 17 << 42 */
47122     { { 0xa882aa6389201dffL,0x3441fde55bfcde3fL,0x220cca60cb543f54L,
47123         0x2af1cb29d764d74bL,0x47ae56d0517617c6L,0x05b98dee0342bf55L },
47124       { 0x214f4b11b4e28cfaL,0xa6ebcdf5093691ffL,0xe49ca185f61d29acL,
47125         0xd304ac40fd8c9018L,0x196161a0f889b7c7L,0x3b704d52dcfc6c91L } },
47126     /* 18 << 42 */
47127     { { 0xb405aff88886500aL,0xd88008bebeeabe24L,0x9457cdf30bc931b2L,
47128         0x8e5fd378f4c5aac1L,0xdec408107bc2bb98L,0xf86424c598b16f6eL },
47129       { 0xb6af27b634df75d8L,0x1bd3082125943a31L,0x51176cfcec993c24L,
47130         0xcfc1433accbd192dL,0x324a5e1e2993be83L,0x34169fc1d06215adL } },
47131     /* 19 << 42 */
47132     { { 0x41aa181ad260133aL,0x627dbe0346e236d2L,0x717fba9cfb8cc72bL,
47133         0x6e21d03d69bbc9e7L,0xd903e845241abdecL,0xd17879fa3c20cb6eL },
47134       { 0xe6141bd463a360b8L,0xa784a651e86cdcb9L,0x80fe8dd11f9147fdL,
47135         0x641241c6de155420L,0x1caef32ba71f3546L,0x28c3a51a79fdf82aL } },
47136     /* 20 << 42 */
47137     { { 0xaa16c27a84a3d033L,0xc207a4990c11c9caL,0x7ae2d193aae87c9cL,
47138         0x125ab459916d634eL,0x02ded714cfa65b4bL,0x6efe84944e212e22L },
47139       { 0x97c48a1888766168L,0x663ccc9dd9c85b9aL,0x6fe8b77b2652f501L,
47140         0x1daa602d078efd38L,0x35885364dbcb8299L,0x25bd1826b8240626L } },
47141     /* 21 << 42 */
47142     { { 0x6621d504af748cb6L,0x3940e5e08dacbf89L,0x9fdd8eeaf546daffL,
47143         0x18fc70d4b42f9507L,0x09bc4af9a3fcc42cL,0x9199b08f4165304cL },
47144       { 0x039d45bed3d0e9eaL,0x0963ede2a6464c2bL,0x77f47a62b5215830L,
47145         0x3a0ce54c3e540cdeL,0x34cf6031b2be8f77L,0xeb143e60201083efL } },
47146     /* 22 << 42 */
47147     { { 0x21404da5442467a1L,0xe73047597f7023e0L,0x836439a8213ff492L,
47148         0x105fe0e37ca0fc37L,0x73835ac85b303c34L,0xe29d830e0057ac8cL },
47149       { 0x457d083e3b5f41bdL,0x228b26c357341890L,0x8e8f194c4109bf9dL,
47150         0xd032cf2b6e4a39e3L,0x012e9515d88f9292L,0xd1a4cd32e957e163L } },
47151     /* 23 << 42 */
47152     { { 0xec56b72f4ab23680L,0x7cb58e727f22217eL,0x6e98647bd045d18dL,
47153         0x2b7c9caa9a73b956L,0xc414eabef120122aL,0x45d9036bb6e1b134L },
47154       { 0xe963c88388abd93fL,0x257f3b619180cb9aL,0x915fee5cb6ca7abdL,
47155         0x2166402cdb7b1bb1L,0x636f85f6541614e4L,0x81f91a1849d9e527L } },
47156     /* 24 << 42 */
47157     { { 0x0430af7759b11c7aL,0xf71cc5b1d4f47acaL,0xe1a7905f12e9190fL,
47158         0x1c689b7012db9e14L,0x6bdd3dc90abaeeacL,0x97f1c244504f0319L },
47159       { 0x874afd61a7a54b51L,0xd4604ecbe3d979b8L,0x0d33eee1ebf4aab1L,
47160         0xa3631cac1aa49fe6L,0x0d8340fbf2217cfdL,0xf6373284423b7e77L } },
47161     /* 25 << 42 */
47162     { { 0xc6cdb5ba6f7972d7L,0x7ac7d438907d281eL,0x9160a8f5c01044ddL,
47163         0x3d74d7eac19ba8f9L,0xf7c7f93f112433e5L,0x2ab355a2012236d3L },
47164       { 0x1168ce913009447eL,0xbefde8dba26e3458L,0x6f9837db49ec8169L,
47165         0xb4d1e35c86782931L,0x41440a76d711e5f4L,0x8fc7a5aeacb5cd89L } },
47166     /* 26 << 42 */
47167     { { 0x73719fe8286e8aa5L,0xff8663419982a4a4L,0x684511702fb2db95L,
47168         0x4f1c0eab01d80ea1L,0x2bc50da5530af14eL,0x00d1d5b506071a95L },
47169       { 0xdb618990a6b374b1L,0x06ad90084e79ebe5L,0x281d01a424a63b70L,
47170         0x87dbd6d5348625fbL,0xdc90f0bef576b1a9L,0x1a9ef270987747a3L } },
47171     /* 27 << 42 */
47172     { { 0x135e416ed651b9b0L,0xe55f7f104a5e7979L,0xe55df2550f0729d2L,
47173         0x666f2744e33ada22L,0x4968bb982cbcb4a8L,0x7ad4e7811028dd81L },
47174       { 0x0e59f0dcd7ca8b60L,0xd71628cdd2a600b2L,0x7eaf6d308b0af99cL,
47175         0x6224b6452900105cL,0xe0513f4388650f12L,0x2a63822a6f6c5234L } },
47176     /* 28 << 42 */
47177     { { 0xf8c07373078a045eL,0x998b2d52a81724d2L,0x2b97faf1a6305a28L,
47178         0x5bc61f67f3e0f93dL,0x7238583cd7aeb8c1L,0x851ecc4b39f5f24bL },
47179       { 0x1cc8b4689992c20cL,0x73168a863c8553dbL,0x1b9a5f95ba2641adL,
47180         0x87a0c362ce9d565bL,0x07fb51b2e1eedc62L,0xdb300ac6a973903dL } },
47181     /* 29 << 42 */
47182     { { 0x789ca390f33e8516L,0x6a7f594cdee7f1caL,0xb4b6b9ca988005a6L,
47183         0x14f7b4806cad024bL,0x682a86285a576b68L,0xf188c74e40e1984dL },
47184       { 0x3584b5e6bf6f19c6L,0xa350b1d2b7467bf3L,0x3b3bb966aa3d1266L,
47185         0xebbd2c782804d8a3L,0x91a272d36a9caf4eL,0x553ada4158fa7041L } },
47186     /* 30 << 42 */
47187     { { 0xb564a0d9807e30a8L,0xaba07b1534a637ccL,0x010e76c5840d8e37L,
47188         0xb6dcb9ac95f6765eL,0x2f5f8fe103b3ec08L,0x10c5a24fb48363efL },
47189       { 0x5ddacb2709c4dc1eL,0x8e2884b1e03bafc5L,0x84d56df3cfc2d599L,
47190         0xc8e2da84ab78ec0dL,0xace4663f900084c6L,0x98d9a1df5d49f42eL } },
47191     /* 31 << 42 */
47192     { { 0xb10ca6eea690d9c8L,0x0b8b39efd5e0d490L,0x2685d320e63807d4L,
47193         0xca40d0ee83116ce2L,0xe1e1434fca51b48dL,0x178a91afeddde4a9L },
47194       { 0x64f59e3fd0dace59L,0x57b33c26278b1820L,0x2ca13b041550875aL,
47195         0xb21f675a4e0db4aaL,0x2bbb3edb0216d3c8L,0x7f39955b96ec8017L } },
47196     /* 32 << 42 */
47197     { { 0x78a53b5a9563e3bbL,0x19c75eb286af355cL,0x3520f427019a6f8eL,
47198         0xde6fcad6dc3ad0baL,0xfec96e4f79745b7cL,0x5e566bbdb133f2dcL },
47199       { 0x50088a2b26561be7L,0x16275b4cc5fddfc7L,0xf21332ff23ae4b9dL,
47200         0x8cbc659e85246712L,0x27fa9c8df50b515eL,0x25ecf745494ac8b7L } },
47201     /* 33 << 42 */
47202     { { 0x7cb130e0837ab43fL,0x8a1f00127b9f6c17L,0xbf827f6d17fa5e12L,
47203         0xc181b1264914a231L,0x8ce70fb6986288a8L,0x9832863fcd1c276eL },
47204       { 0x738e99819622ecd1L,0xdfc1b43cb73807abL,0x7254b4cf1b673290L,
47205         0x2d689f38fb20f902L,0x86460de83c34960eL,0x8453896aed8f62e0L } },
47206     /* 34 << 42 */
47207     { { 0x9f74efc606f4904cL,0xa280e4c26d3bc556L,0x974f9bdb75975ee2L,
47208         0x1bc0e7fb6dacde9fL,0x2a110d4c49649375L,0x045432c09090d834L },
47209       { 0x84295a20195083cbL,0x92ea17cac7dcf71bL,0x3acced0be70be8c7L,
47210         0x3703dfc007e28816L,0x37fbf2d1e869fb8eL,0x8c6b0bbef9c35ff8L } },
47211     /* 35 << 42 */
47212     { { 0x04a991812f1d2778L,0x0d78573685b91ae0L,0x8c32d6046a5252a0L,
47213         0x12b043131a0df85eL,0x40c4db631ee669b6L,0x0f499408f18f5f9cL },
47214       { 0x0dcdefabbfe9a187L,0xbd371c45ca650d7dL,0x33819eb00a36748bL,
47215         0x82d1af1f29034844L,0x301f906d96257b2fL,0x862728ea9395c666L } },
47216     /* 36 << 42 */
47217     { { 0x33a2194f40175152L,0x0f7ddc1dbb13f08bL,0x7c08860850b54274L,
47218         0x7ebb2c11e41f0795L,0xf915683fbe20d37fL,0xcbcc14889daacec5L },
47219       { 0xfb02c20fea459050L,0xe964d76ad5815aa3L,0x0e009be9496bbf2dL,
47220         0x8233690eb42d0f7fL,0x98ee83d49168eb0eL,0x34c3b6f3621fa292L } },
47221     /* 37 << 42 */
47222     { { 0x29555d79b0221994L,0x1dd689dd4c9e8f29L,0xcb83ed2c853f5261L,
47223         0x04b1475e0d9b0670L,0xa28b15e7df2ec34eL,0x094409b5e60a168eL },
47224       { 0xe4b9fd0e16ed42fdL,0x02f97e84a138f2f6L,0x91dc216ce13520dfL,
47225         0x59564eda7a245e5dL,0x825278be8478befaL,0x69daadd20328c4d1L } },
47226     /* 38 << 42 */
47227     { { 0x6ffade389995db43L,0x88974055790f4b92L,0x082e5add525d19e1L,
47228         0x002c414897bd9931L,0x3f093b3b5461cff7L,0xafc95b0042b8d3f2L },
47229       { 0x0a8f7687a993155dL,0x1edfdf616c2bb58aL,0xb5be2d4fc44049e4L,
47230         0x6fd505bb8dfdf4e7L,0x5386f02a41af5871L,0x8178817569121027L } },
47231     /* 39 << 42 */
47232     { { 0x1deada722706171eL,0x1baf4c9aee773c6cL,0x458efac06977d673L,
47233         0x1f2c2f38646e29b5L,0x36ece91a53323300L,0xab51a49bc4d598e8L },
47234       { 0x7802760ed8e41d8aL,0x2996f790587425a5L,0x227165b73ca21bedL,
47235         0x0d9e5c5283536ec3L,0x6232f2e089701806L,0xc55e80a2894e2577L } },
47236     /* 40 << 42 */
47237     { { 0x437b7224641e3bd1L,0x84e39f7980a58460L,0x68e5292709759523L,
47238         0x0176a3ace77f5904L,0xde92fb15e151e242L,0x79965c9aeb1438d4L },
47239       { 0x318a810a596700b9L,0xa8a6ec57c2198cbeL,0xd7709aaabf030fd2L,
47240         0xb432023472f5d326L,0xc9945214b03bce50L,0x0bc06d9bd4ecba09L } },
47241     /* 41 << 42 */
47242     { { 0x30630eefaadf21b4L,0x94896f68042fb57aL,0xe678fc3eb312e7daL,
47243         0x325cd2bc5c94c991L,0xd4eece20bea4e518L,0x9d9d65e925eab2abL },
47244       { 0x5439c348676454e8L,0x9eb68953be1e48ccL,0xbeea9da27b625a31L,
47245         0xbd82c6ee48cc200eL,0xba9fc94444b9dc77L,0xb31bdebe1eb9283aL } },
47246     /* 42 << 42 */
47247     { { 0x1ac1a09d07abf58bL,0x7372e532b5770f9dL,0xe1716687c12fe180L,
47248         0xd91f4d36c715009eL,0x5d8885cfd6fe1cd3L,0xc0ab5a13aea65e52L },
47249       { 0xa5fe05a0838e5e05L,0x590cc325971fb33fL,0x3bd8234a4653bf57L,
47250         0xb83300373708c1aaL,0x27453d3b0e84e8fdL,0x9dd3f05399cf918fL } },
47251     /* 43 << 42 */
47252     { { 0xaf6f26c3a36468a3L,0xcab875f28d9fc8deL,0x0209b1ad52f4479dL,
47253         0xc9941cb5459542cdL,0x91603260a0212b68L,0x98018317345673edL },
47254       { 0x2b02a35ef98b810fL,0x15953f78b714fb32L,0xf9f9c61eb71a4b4aL,
47255         0x959b1473a8505b7aL,0x331d32cb4c6ec97cL,0xb1d2dd44e49f189aL } },
47256     /* 44 << 42 */
47257     { { 0xdfb0508345c0a2acL,0xd13790035eacfb2fL,0xe9872d766a2e126cL,
47258         0xd2a89cbd39a02d27L,0xf45baf72d754b7c2L,0x37985ef8c6c61bafL },
47259       { 0xbbcd3ef2da1c46b1L,0x5af5dda43a355d83L,0x9f7ce4281d67a984L,
47260         0xf19526926fa33654L,0x2abccb55567b3b71L,0x1b3704f3300cf29fL } },
47261     /* 45 << 42 */
47262     { { 0x9dcfaf21712af69cL,0x26de8fb05291cd70L,0xc778294742072171L,
47263         0x889b9fbc8c617e24L,0x5971e60cc2926862L,0xdd8e70bddc022533L },
47264       { 0xc783e1e30a369db0L,0x37f562ab07b2bb92L,0x5043f3d40c060f44L,
47265         0xa9650f47a3e17ac4L,0x3b8cd7ad18010ceaL,0xeed5de39969849e7L } },
47266     /* 46 << 42 */
47267     { { 0xf93c3ccb6044ade6L,0xd14a13f8fd376746L,0x1fc20e6fd718a98eL,
47268         0x9f63c6673e31573eL,0xe99b7693a8e0c66cL,0xdad4615c1e5b5f5dL },
47269       { 0xcbdb7200ac98f5a3L,0x31414469668ab045L,0x82e92df9bacf0ac7L,
47270         0xa61f4e8371bfdf94L,0xce8cb699d1bc5deeL,0x42da8ac72f2f837cL } },
47271     /* 47 << 42 */
47272     { { 0x0b6252fc32a4e8a0L,0xac1e457dd7170402L,0x76faaffeb121e40fL,
47273         0xd2dc3cb84ddebd9aL,0x303e47cf362348a1L,0xe37e824a829d9806L },
47274       { 0x419cc2cc7c2ec135L,0x3eab37024cecfdceL,0xf0c9f19088403d18L,
47275         0x73c8984daf61b6a3L,0xa2d44d9e00c232a1L,0x61fdf4883cf1cecdL } },
47276     /* 48 << 42 */
47277     { { 0xa1972c2196fffb94L,0xbe04093099d7633bL,0xb116ff407e23d66eL,
47278         0xcb12b2bb949a19f1L,0x75df10ee79e49e91L,0xa3bf90764890bcf4L },
47279       { 0xcbaa76a609a30252L,0x17c224a90ee5728eL,0xcbc56e5cf4f3f4cbL,
47280         0x8a07110f4fe868a5L,0x23289f2125e110a2L,0x0289c12bd7693c45L } },
47281     /* 49 << 42 */
47282     { { 0x4a9c6f8bea96a0f4L,0x78262a3499e3aaa3L,0x513a8e2028b2634bL,
47283         0x5ba40287d85d74b0L,0x5702d11d440fcbbfL,0x1933c88a0df91fbdL },
47284       { 0x642247909a0aff2aL,0x85dc2ca13734398cL,0x1009884fd7aa787aL,
47285         0xc666a62a0e73f4f5L,0x491bb941cce66210L,0xda8e896bcd173443L } },
47286     /* 50 << 42 */
47287     { { 0xdc9b37a7c6e32022L,0x158cd4bb342a148aL,0xd62d371cf06287a0L,
47288         0xba027eb6e9fe0a01L,0x8e7c6f5372017d09L,0x13c5d6ce9381d9c7L },
47289       { 0xbd0bc2d46e32f045L,0x52cf0f2554ab7f2aL,0x2e674e50085643f2L,
47290         0x77bc15aef1662819L,0x57f9e3c4f2ebe66eL,0x839aaebadd284956L } },
47291     /* 51 << 42 */
47292     { { 0x752bc171ed9d735cL,0x76d96d3419ad5c26L,0x9549ad3e25c1d83aL,
47293         0x8f6fed53cd460d20L,0x04504f7c7b619b69L,0x68265559c566f393L },
47294       { 0x5e39e108804598edL,0xace859b01f4538edL,0x4b8503070c85e5daL,
47295         0x9f087821abcd4ecaL,0x126d3850c8d0def4L,0x66971fe5263457b2L } },
47296     /* 52 << 42 */
47297     { { 0xa82ac9983a4bc15bL,0x28697435c930e4f1L,0x191ebdb6b0c9cef3L,
47298         0xff05f8e875748872L,0x5b86940237343b20L,0xa7bce94beedfe44fL },
47299       { 0xfc271e2778f4e1fdL,0x652c5a187734db66L,0x108f61c87efc9a9cL,
47300         0x01db328970ed1dc1L,0x2bc509afd249f61cL,0x0d2e6b4cfeed393dL } },
47301     /* 53 << 42 */
47302     { { 0x691199d77a477295L,0x1f0679a661746b75L,0xf3a51493c9f936d7L,
47303         0x1fcb336a445af5f6L,0x9880cdebb94ce08fL,0x784fa04a22a6b57aL },
47304       { 0xc85fe18caa97c3bbL,0x27294a3baabe9b50L,0x9418a5b7b673c915L,
47305         0x686cd97a15dceed5L,0x6d1c9dc70f22ae6aL,0xed88e02dc02212d3L } },
47306     /* 54 << 42 */
47307     { { 0xa62c358dcf616234L,0x85402ffad40aae7cL,0x315ce9f151a7614aL,
47308         0x6f7e796f5d0c7d7dL,0x73bf57faf3444d22L,0xb5e71e7a224b77c0L },
47309       { 0x94c40681541ee741L,0x40c97253d6837e1bL,0x1058fe7bb1f1c742L,
47310         0x3206256f9b24d65cL,0x0abb12a78169ba8dL,0x01fcdb7beae85db9L } },
47311     /* 55 << 42 */
47312     { { 0x868f294309fdbd8aL,0xd9c11e7ebdd6c274L,0x3be4d8e7fdcb4fb7L,
47313         0xcd8c40ad17305d10L,0xf12c97642abde5eaL,0xc9e16d8256776e80L },
47314       { 0x279c0248df05235cL,0x4bdd8b136d8e4b89L,0xab8bbe8d7c47d2c5L,
47315         0x12ba8b9e255c665cL,0xd585ce64d140a518L,0x55947e69eb4d353dL } },
47316     /* 56 << 42 */
47317     { { 0x06ba6db1f184c91fL,0x3c0a348a45fd0382L,0x0d535b6e4434b527L,
47318         0x7bbfa2c8692bae0bL,0x5c59a08ebe7fe51cL,0xbaa7d2be36e80cb8L },
47319       { 0x8a42d8d1bed3cae8L,0xd9e0bc0d15ff4962L,0xe51fce93644c75ffL,
47320         0x40222561b9392d63L,0x8ab1d286023b4787L,0xfa85c220a1b3190dL } },
47321     /* 57 << 42 */
47322     { { 0x294845c28ed1d81eL,0xc0402af2dbe7fdbaL,0xbb56d86d67abe6a1L,
47323         0x2e61f65b2ed330e4L,0x2893eaebffdf0fd1L,0x06cff97a75fb77dcL },
47324       { 0x2911ebac1c90fe64L,0xd9c40d77e5ee3458L,0xf5b8b1d4b355f191L,
47325         0x5be71a4ef365bc6bL,0xe2db432f5277b244L,0x3272a28327235b87L } },
47326     /* 58 << 42 */
47327     { { 0xe5105755e6b16cbfL,0xba9fb47b536a49f0L,0x03ac0c10c75ad751L,
47328         0x9090bc328a2d65a0L,0xcecc7202852b3d23L,0xd214f70128f67958L },
47329       { 0x379899b1f3695cabL,0x8f3d02e9bd3342c2L,0x9870a7f9e24e7bc1L,
47330         0x7277e115f723893eL,0x6932ceef0f6f1936L,0xd0bf06dde171306dL } },
47331     /* 59 << 42 */
47332     { { 0x815cabeb17832ce7L,0x65afc856a2a4864cL,0x9fe4ae1aa4939a4dL,
47333         0x7005cbd90729a3c0L,0x887f0cca791e8ad6L,0x55cad97a85aca45aL },
47334       { 0x3e89d294493c7dcfL,0xf4ae5277ae8ed154L,0x507a3fd0a08fbcdbL,
47335         0x4df3c552f86677fdL,0x6529f9ace3a82131L,0x09efe1fba53a7c67L } },
47336     /* 60 << 42 */
47337     { { 0xbbcfa42d21fe8f67L,0x82983012de2be980L,0x88bb9704aa8e17a0L,
47338         0x100ad5e784772203L,0x2867168965479d29L,0x0334f9c5c2d9d5d3L },
47339       { 0x49032c1a83a6cf83L,0xc257b0901dad479aL,0xf64177dea7e3636cL,
47340         0xb2b5747874a315abL,0x210b11cda170ccbcL,0x80509b7480d80177L } },
47341     /* 61 << 42 */
47342     { { 0xe98ad30696993a74L,0xa7dc8330f0484940L,0xc30319fdd61b83d0L,
47343         0x76e2755809873771L,0x33f4f43ecaedda98L,0x68d5ffe3639c8d3eL },
47344       { 0xe3cf3b850059b2d9L,0x7f3ecb2f6a3d057eL,0xb569c24b9b8b7466L,
47345         0xeed92f2ac38ccd58L,0xc16a4e8ce765a2f7L,0xa3a7b6552de9cb38L } },
47346     /* 62 << 42 */
47347     { { 0x496de6fa0640df83L,0xa4e500a36c77c97dL,0x45609036947aed3cL,
47348         0x0edb9422423fc5d8L,0xd0c01b2e68f70746L,0xae44ae0e6d77f3a3L },
47349       { 0x7cc7e90635adba9cL,0x107a3b46a8413303L,0x9e3eeab98916817eL,
47350         0x1a99dab86fb74601L,0xb4e8466c1064b039L,0x249149146fcbadeeL } },
47351     /* 63 << 42 */
47352     { { 0x89643fa624798452L,0x179b3bd76ee52833L,0x343096e54430c6b3L,
47353         0x589dba3323461536L,0x59073225c3433575L,0x540f9ce317d80d42L },
47354       { 0xcd04b14d3aea6c82L,0x9be179b0efc9f455L,0x0ad6fb0791e57cbaL,
47355         0x33894fa262706b10L,0x2cbc270886bf6926L,0x2cf067e64ea48c6bL } },
47356     /* 64 << 42 */
47357     { { 0x298647532b0c535bL,0x90dd695370506296L,0x038cd6b4216ab9acL,
47358         0x3df9b7b7be12d76aL,0x13f4d9785f347bdbL,0x222c5c9c13e94489L },
47359       { 0x5f8e796f2680dc64L,0x120e7cb758352417L,0x254b5d8ad10740b8L,
47360         0xc38b8efb5337dee6L,0xf688c2e194f02247L,0x7b5c75f36c25bc4cL } },
47361     /* 0 << 49 */
47362     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
47363       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
47364     /* 1 << 49 */
47365     { { 0x36c9dbbefda8520eL,0x573507ce6ae3ea98L,0x1ab38db696a8f9f1L,
47366         0xe031d2356b01e6bcL,0x10466ae68afc4adaL,0x3b35df41ed9c44e4L },
47367       { 0x61272c12c7bd99e8L,0x6a4ae7b4805afd79L,0xf4c47a910ecc49ebL,
47368         0xeb95dfeccbe84d5cL,0x43f3b71c8ee497d7L,0x2547af524c6fece4L } },
47369     /* 2 << 49 */
47370     { { 0xe323ed0cced45039L,0x04ce0b67a90aa713L,0x9c092f06e8d68e4eL,
47371         0xd8f5555ad0742e5dL,0xe2d175bf00d3df92L,0x8ca55f154f71aeabL },
47372       { 0xd1762d72642d391dL,0x0dfdd3c2aec466bdL,0x2caacb4c6281f2a7L,
47373         0x635ba4703603e53aL,0x94a9811d49fecf29L,0x3a42cf09466bf361L } },
47374     /* 3 << 49 */
47375     { { 0xe63fbb10b5356889L,0x5995a0a92e73aba2L,0x5cea30677afd4bf7L,
47376         0x4494e39dfd37120dL,0x8c572c7249d718a7L,0xfe159c275fa305fbL },
47377       { 0x751c217fc276c40fL,0x44d0643c45e40857L,0x9a996e6efe7a6486L,
47378         0x1a4f6d10f53b0e47L,0x651390ecd15fd593L,0xe0c1181d739ee9eeL } },
47379     /* 4 << 49 */
47380     { { 0x0f05710b11bccf2fL,0x7113085a7aec1bc6L,0x137da67a46b8d0e2L,
47381         0x454b89fc698b78ccL,0xf2a6e1de258a9393L,0x5f1804e716488e69L },
47382       { 0x7c6c550215b3bf35L,0x3b0e09a5b05c2ec1L,0x4b9de30e92f15247L,
47383         0x09d4ca9327e70a0aL,0x9c8b16340d149363L,0x54a8287cce642137L } },
47384     /* 5 << 49 */
47385     { { 0x3a05e7d5ca2af43fL,0x068953f975009801L,0xd6c8a76c06740141L,
47386         0x7e1df1038a831fa9L,0xfe06e2bae39046f3L,0xda5264a0e1807c29L },
47387       { 0x1be4ffedff5d4808L,0x299d6537c52be83cL,0x1b38adba11834a9cL,
47388         0x6074a60b1248fd42L,0xd9a0bd2e041b5430L,0xf222ba84a7b76b03L } },
47389     /* 6 << 49 */
47390     { { 0x49ecd6f3346a764eL,0xe46847f14105e657L,0xce9cb2b57550f608L,
47391         0x45f1a1f7f4cf062eL,0xcdb19a112c27d38aL,0x36d375b284e50b19L },
47392       { 0xf43691540dba6405L,0x4c9dc863040354dcL,0x7229e70ea24d09cfL,
47393         0xe72aa86c7cf6831bL,0x487fb68425392838L,0xe88bed04430b9b47L } },
47394     /* 7 << 49 */
47395     { { 0x9f77b8c5d1164788L,0x45bcd4c1d7b5c5dcL,0xed22ecf3d88c2357L,
47396         0x330272ad07de1cf8L,0xd9749f7f4ca13a48L,0x4964ce5d1383ce08L },
47397       { 0xc033d516b0d0dbb3L,0x056ae73bf51943c3L,0x495cf7e057105e88L,
47398         0x08ced52e56462560L,0xe9578aa713ca1a7dL,0xe9b045c5a9717f7eL } },
47399     /* 8 << 49 */
47400     { { 0xf8a8499b666fa8a8L,0xd0f9401571bba84aL,0xb85e1b1d515e1328L,
47401         0x88a2636ba941e788L,0xa045241d2b5dd8d8L,0x161be476332f0350L },
47402       { 0x96c4b205a18fac6bL,0x5cbe8d5e73fc5337L,0x6fc33fc6d00b6029L,
47403         0x07a914ee89aa3b79L,0x35353eb7a4d4dd00L,0xc026bdc0673e8956L } },
47404     /* 9 << 49 */
47405     { { 0x1e551f9bce0b6f8cL,0x1fe7ea4618495e1dL,0x3f6f28742dc0e878L,
47406         0xb778c12844c43f20L,0xbddc28eb8a250230L,0xd8571a4aac6c3d17L },
47407       { 0xb9dcaec9730c8a1eL,0x512cee9993fbcf87L,0x0df3a1379bafe001L,
47408         0x8530e501e2a2b9bbL,0x6d38ba8995ebf91fL,0x704b81a7792cef7aL } },
47409     /* 10 << 49 */
47410     { { 0xccda372167103852L,0xf78d22470c54de53L,0xebd16036afa44aa5L,
47411         0x7b88024864a24ab9L,0x86b38e961c2bc78eL,0xd0aa0d058d63b295L },
47412       { 0x24912955c62fcbf1L,0x77a68156b9ac435cL,0x432401c71b360b26L,
47413         0x091f19f34c58ef8cL,0x3a4a61f483d46c9dL,0xad0e5c72e8d616cdL } },
47414     /* 11 << 49 */
47415     { { 0x668d598ad1666826L,0x6ffed334fba0ba63L,0xe71e3359d7cddc30L,
47416         0xa9c15c2d9fb9998eL,0x6966d350612230b9L,0xbca3ed23ae4fe0edL },
47417       { 0x537cac1b3caa3edfL,0x4f4a737ef33c180cL,0xf8d8f796f8807a7bL,
47418         0x5c7cf072d1aab3e2L,0x7f0ccb9dfff736e4L,0x71bf0732ef11266aL } },
47419     /* 12 << 49 */
47420     { { 0x33b029bccdaa6831L,0x2548552d4c1f9cedL,0x35f1a002dece1c8cL,
47421         0xc6b87fd7acc23aa5L,0x0b8bb275bab029a4L,0xf07bc06730bfb42dL },
47422       { 0x1688ff5d1f69ce9dL,0xeedb7b5edb10585eL,0xb7a88cf0d432c197L,
47423         0x20731bdd015a350aL,0x5fa1835463223f5cL,0xe392e1318024693fL } },
47424     /* 13 << 49 */
47425     { { 0x61ada737c3449cb3L,0x071062504ca876ffL,0xcd98a39001d1403eL,
47426         0x197c845096ded881L,0xd060160568cacebbL,0x7e1b37d1dc3ddff4L },
47427       { 0xfdc1bcb5d1725e92L,0x11cbe941bf0856d2L,0x63fd35d050199657L,
47428         0x208a1047b9790d10L,0x52790ce61af4301dL,0x75e6d83beff28b69L } },
47429     /* 14 << 49 */
47430     { { 0xdfaeea0a0154731eL,0x9e53419de15a0388L,0x2ad6a83c25a992c8L,
47431         0xa2ba020fe125501aL,0x894ebaf8d4dd04dcL,0xd48cb95850765559L },
47432       { 0xf9b58d0980dec92bL,0x2a0e11659da299d7L,0x3c081853efe9cb11L,
47433         0xb9f3b702a511c5e0L,0xa8f7a25f70486180L,0xc0358b25591b3e2fL } },
47434     /* 15 << 49 */
47435     { { 0x00333fa6fa806947L,0x7e4dcfb3504b3e19L,0x8326b0acad4a5dfdL,
47436         0x9ffc65eac7b12e49L,0xed3b7c0258d16eeeL,0x79fccfb434a4222eL },
47437       { 0x4a8070a0e556357fL,0x554fe2c9ec97769eL,0xcc405a57da691714L,
47438         0x12927897856f590eL,0xd4805b93ba198dcbL,0x2649be2e4b18444bL } },
47439     /* 16 << 49 */
47440     { { 0xf36e8398eaddf274L,0xe41553a16a5e4ddbL,0x36ab07464efc5b0cL,
47441         0xb211e59ad316c434L,0x2515ec9f16ccf839L,0x6ecb746503dc6a07L },
47442       { 0x842b7275c65c1b07L,0xf7ceeec535750ab6L,0x967d711ccef5255dL,
47443         0xcd3bfb075108cb92L,0xe50c0d8aec1b9740L,0x9e8d56611a9e6308L } },
47444     /* 17 << 49 */
47445     { { 0xfcb12ba3aae18c46L,0xb55e959c6e21d463L,0xf720d19f4a4f6f21L,
47446         0x1c2ff60ed4320c5fL,0x4ce5e1ac1a1b40b8L,0xfdebfb81ff6fb9a0L },
47447       { 0xd6c37d8a9c67c07eL,0x55167952012fc09fL,0x5dc722b52c306c4dL,
47448         0x1efad8d2bc1f65e1L,0xa1478f3da52556ecL,0x54cbfb884a795dd5L } },
47449     /* 18 << 49 */
47450     { { 0x84f8ea13ccb8a36aL,0x5f7aeeffa05709a2L,0x4942d04e60574f37L,
47451         0x855b13e9e048b400L,0x747e4067a6b59c09L,0xc349fb05074d3990L },
47452       { 0x398e6afaec2c7e03L,0xce361865ec2d5a4cL,0xfc04bf8eb6f57d22L,
47453         0xf0e0b84c759ce6c6L,0xb65141235ee7e528L,0x8ca144bdf5c0f9b9L } },
47454     /* 19 << 49 */
47455     { { 0x5868449bc6e0124eL,0xdd65ffc1e68ad5eaL,0xe126665f4f577466L,
47456         0x8ade5cee2defe8deL,0x7c1cf7f07beddf87L,0x0e0e066a362c5956L },
47457       { 0xac2aff4e15563b47L,0xa28ab875620d1299L,0x91f67b3fd8caa497L,
47458         0x91bef53394fc08a3L,0x0fa27d9cd99918f5L,0x205b6c1f60b67bd9L } },
47459     /* 20 << 49 */
47460     { { 0xc1370daef6a58536L,0x6f2e5b37c56b0ae9L,0x5511d68292f6b6a3L,
47461         0x2e9e5034ae575249L,0x3e5a32f81d14bed7L,0xa346a86f75efd17aL },
47462       { 0x4f2510a60309fd7aL,0x689ecd74d0b1425eL,0x9e9bebe19f771e24L,
47463         0x20188045adc5b48cL,0xe49811b6b845230bL,0x420855ec5a8687f8L } },
47464     /* 21 << 49 */
47465     { { 0x705a9ab30aa1a423L,0xcb01466fb49830c4L,0x1db1768581a75897L,
47466         0xcaacb855e341f157L,0x9b13cd497a0d3c38L,0x119b4d47e177fcb3L },
47467       { 0x0d8f7c2639788712L,0xbda0f3180642bd4aL,0xdd4bd88bd4616239L,
47468         0x9a3ecf978df1b895L,0xd0d54caf4a6dc07fL,0xa7ed6bfb31810203L } },
47469     /* 22 << 49 */
47470     { { 0xe650e49abae1b94dL,0xb6b162e6e3199794L,0xdc706859b4ec0480L,
47471         0x28b618c24b1a06caL,0x0929a001403acdc2L,0x796dfd972da3aefdL },
47472       { 0x16389072ef4c1673L,0x600d8bd7fc94a4f5L,0xf003214de5f386a9L,
47473         0xa7af0499e62cbb48L,0x750a3b00de82bad5L,0x6c615b838e7dc8eeL } },
47474     /* 23 << 49 */
47475     { { 0xe1916cb4eae432e5L,0x81f3e48acc193889L,0x54d58685ba922a4fL,
47476         0xeffcc528bf11b76bL,0x2f70d38f8171c971L,0x547ce8ccb3a5669aL },
47477       { 0x3acd91b878e6d0beL,0x372dbf2c689c2913L,0x9fceb5bbd0aae543L,
47478         0xc601f9622830a977L,0xd55e74509f874dffL,0x77ff8ab4822878caL } },
47479     /* 24 << 49 */
47480     { { 0x283eec26d71543a6L,0x98fa08bea7627841L,0x269a83b827ad302dL,
47481         0x225f2f12bde3fdd0L,0x046fcf380130b3a6L,0xea733c1ac3ed9043L },
47482       { 0xf870f14d70aa08d1L,0x643d18b834391e0bL,0xf3e1d5f4847be772L,
47483         0xa9498223d0ed73a0L,0x6933ccf014b3babbL,0xc2439ae437f08f70L } },
47484     /* 25 << 49 */
47485     { { 0x503414d0f2cb5475L,0x51b9497cb24cbf9eL,0x57359dee2f4c7746L,
47486         0xee7125c3f3118a94L,0x2f0db706e4ea33d6L,0x885e8c3eddff7f63L },
47487       { 0x752f594b628432f0L,0xcfadea7779852e2bL,0x4f733b8ba2ba4b7fL,
47488         0x163c8c2e530f763eL,0xf95a7b57ff05a7e9L,0xd4768d242d7be01fL } },
47489     /* 26 << 49 */
47490     { { 0xb643f4e0f88d049bL,0x5e0ac1fb12682fcfL,0xeaf7874d9f981c8fL,
47491         0x9c2adfd2b1af779dL,0x9a7abeaddaa8c275L,0x09ad552124cacec4L },
47492       { 0x069cd5c40ead1646L,0x5186bf190a6157d1L,0xcc222a9396503506L,
47493         0xfeaa7bdebd29686eL,0xb0d65b0da7257c8dL,0xc31c0a8898aa227fL } },
47494     /* 27 << 49 */
47495     { { 0x5495f21c9fe88a48L,0x01f580ac590c1966L,0x1ad433ba39810166L,
47496         0xecbc67003a5187f6L,0x38d36c3bd4216887L,0x49653585e27b615cL },
47497       { 0x2a70a1d9e773db7eL,0xe36d967a63c1c048L,0x51cba60d26d15862L,
47498         0xb633839fd5a6b746L,0xa6a756a2ec1fc364L,0x37fef8d24cfccb6fL } },
47499     /* 28 << 49 */
47500     { { 0xb4b7651f5be1d45bL,0x0425200a7f0cf680L,0x200d12b48960be95L,
47501         0x02fdd1a14945b193L,0xedd70e3e27d046d8L,0xc1cc086a83f14e12L },
47502       { 0x1580e72b2629396eL,0xc87439dbf9ed73c1L,0x5debdf30a90c5128L,
47503         0x0b6c020e9fbe14efL,0x168da56a0149a0b0L,0xc66a4dbd79c58ac6L } },
47504     /* 29 << 49 */
47505     { { 0x6ecd9c41596b8890L,0xd25172fe210d9613L,0x1ce8abf872b97aa5L,
47506         0x355899d610faa675L,0x003b69adf4ddf011L,0x6736cd40ec2d1af9L },
47507       { 0x8069a0ad4f85ac72L,0x5c31d68b5836cfd3L,0x8e9486eaa5ec1473L,
47508         0x8e175c4a1468cebdL,0x58b3d2b1ffaf2f77L,0x4fd21681a17a3e00L } },
47509     /* 30 << 49 */
47510     { { 0x800aec84330b8e2eL,0x1a2c033e335837bfL,0xf1a91551fe6f6dd9L,
47511         0x326c42b21de7360aL,0x300e740b7b66f9d5L,0x53bcc70068ce95d4L },
47512       { 0xc9e225ac3d80f228L,0x64b2ad4e6977dfdbL,0xac863b0801f23221L,
47513         0x0517a648df11e5f7L,0xbf7aedcb68d11050L,0x2607e33777b3029cL } },
47514     /* 31 << 49 */
47515     { { 0xcb1955e44f4706b2L,0x0821d4663acaed1fL,0xbe822db07f8b43deL,
47516         0x3d11573f9b1c83a1L,0x6c052118201eab83L,0x294c5060dfe340d7L },
47517       { 0x994a4bde0644005bL,0xf1519f3258fa0552L,0x9077bf5bd4d0d39bL,
47518         0xebde1ff0e6204ea0L,0x58a68e09829130a7L,0xda64eb8596961bb6L } },
47519     /* 32 << 49 */
47520     { { 0x1afa6aa6206add5dL,0x66cfbbae150ea4c9L,0x07fb920b5d36da4fL,
47521         0x144d51f9291e774fL,0x26c2c134f40d87a8L,0xc8cf3524a932f1a0L },
47522       { 0x35bb2a425aeb0bdeL,0x5cfcc1dac4be960aL,0x5c40cabfaa1838edL,
47523         0xea0c05ffe2855f1fL,0x931ebb02fd525934L,0x31a7b78f16246fd4L } },
47524     /* 33 << 49 */
47525     { { 0xbe055fead42b36aeL,0x733a05ed819ddf8eL,0xa00fa0a15c9a6102L,
47526         0x0ed363273c0af634L,0x5b5a62b4d5970a32L,0x9d7557dfca954cd8L },
47527       { 0x30314f0c6daf871bL,0xaa7c42a96267b2abL,0xc5d1f0d6132bc62dL,
47528         0x77ac94df7ed26084L,0x0d256fdada34e1f6L,0xf0259d1caa4b4dd6L } },
47529     /* 34 << 49 */
47530     { { 0xf576c69e86ccb00bL,0xc870c07f5781803eL,0x91d4c0c6b1869e56L,
47531         0x9c2729397d940416L,0xdad33f73c4d0269bL,0xe2baf5b8838c9198L },
47532       { 0xd8bb9613218414e4L,0x5e9f7b67c980ca07L,0x1e2d4e63165079fbL,
47533         0x6ae5b17f983b3fadL,0x1e66b8380c24e22dL,0x80cdaec2136e0be8L } },
47534     /* 35 << 49 */
47535     { { 0x98cb12d93fc277f4L,0x81def3ee160b8743L,0xa1f07ebb11711fb6L,
47536         0xba17dd15a95b3ba0L,0xb25f1c78bc158f33L,0x1bb83cf27841e8bcL },
47537       { 0x57ad928abf49233cL,0xc94fd746bdad3f2aL,0xf7c716ae4a4c6600L,
47538         0xdd0e3117060a78b4L,0x85e8851a860764b0L,0x3342d974bce0d787L } },
47539     /* 36 << 49 */
47540     { { 0x2bc4e37a719793feL,0x1543af2aa68ceea3L,0xc99cb391aabdea45L,
47541         0xc890e546f0b8eea7L,0x8b75b91feb4173d7L,0x9d52d04bef46f637L },
47542       { 0x0929f25d878ff734L,0x7377235fb6c43342L,0x657835cf6eca900cL,
47543         0x7b752665098bb5e2L,0x320d09b6b8a61442L,0xec4f8182cf5b8023L } },
47544     /* 37 << 49 */
47545     { { 0xfc5f8feffc788160L,0x7d552625f73f48a3L,0x4eea435145c02498L,
47546         0xb5f5de5bf8f8af26L,0x78f1c499067b1610L,0x6e0d1b14eac18a29L },
47547       { 0xf8be2f6c052af916L,0xd8cee5668876af81L,0x99a27ec31577bd90L,
47548         0x3ac529d242919f4fL,0x1215428c7fc05dd4L,0x99ef01e450f67e87L } },
47549     /* 38 << 49 */
47550     { { 0x145902629d671094L,0x7fef49c166ce858bL,0x2a7ea540c2f21eadL,
47551         0x1226b04fc1d5a636L,0x4fb54e4e535efb9bL,0x6c51cdb91d72bed3L },
47552       { 0x94162e44938efaf6L,0x166013cfaf6f5697L,0xfa9495bddf95f9c6L,
47553         0xc05441cb0d7f8406L,0x7e5c89763a233ca6L,0xbc75dc6493fe8e42L } },
47554     /* 39 << 49 */
47555     { { 0xe1885cf128ed669eL,0x6e9f40dfb428b3cdL,0x412388a61626f8d0L,
47556         0xb8201f047cbcd192L,0x642ecfad70ba644bL,0xd43be1cb43c76bb7L },
47557       { 0xafafffc388f4bd51L,0x8c40e2787052eea6L,0xc1a84e866a4c8776L,
47558         0xf0201f292fe7075dL,0x132f80e4576af421L,0xe0831b7f4731dddbL } },
47559     /* 40 << 49 */
47560     { { 0xecfabd2742dbb68aL,0xad43a2c43eb546d1L,0xcf4e64ccfe2691c9L,
47561         0xe3889e258347566aL,0x48da354885b8c733L,0xcb7fe0679d9c9f57L },
47562       { 0x8c26a8d668223280L,0xc1e8ff623065705aL,0x181ca70a3f8db9f8L,
47563         0x25aa6450e758213eL,0xa4898f9169b2653eL,0x5e5c9fb4ccd8303aL } },
47564     /* 41 << 49 */
47565     { { 0x640b6946b03aa213L,0x6b99e84d00c068f7L,0xed4f1d2d99c5c461L,
47566         0xcec88724b20eaffaL,0xdf2b79a95dbbc32cL,0x2f7397054f3a1c5bL },
47567       { 0x1594a54946eb52edL,0x55f11aad39c4c43eL,0x0fcdb331f46500f2L,
47568         0x0d66be885ceb8dbfL,0x4d977349886dbbf1L,0x238f4617797d1b41L } },
47569     /* 42 << 49 */
47570     { { 0xfc8c7320721034d4L,0x48b389db60264280L,0xac246988649cbd88L,
47571         0xb7f52891a50bb658L,0xc0a812e50a7f279dL,0x6593175967fb2cffL },
47572       { 0xd31a77c6661ab439L,0xabadcea00ceb4aceL,0x201d98f6a3702dddL,
47573         0xcec1e83e7c9463aeL,0xc64e44fbc55e6856L,0x421f3e3148aa0d81L } },
47574     /* 43 << 49 */
47575     { { 0x4f0b251871a07c6dL,0xbfe652edaf3a2fbdL,0x5f68dc667bc2053fL,
47576         0x445df84f6040a7cdL,0xbdda2132180dc0a9L,0xd8627401d6c7a92fL },
47577       { 0xba350cb190cd2c73L,0xaf4c1e5929886ab4L,0xee8fdff2d677399cL,
47578         0x3ce35c6edaecf83fL,0x44df0a300f114062L,0x1b633b4647f29868L } },
47579     /* 44 << 49 */
47580     { { 0x48483f6af58ae2c1L,0x70ba34635e1cce49L,0x5f7a1c6d33907532L,
47581         0xa0fab701875a5f3fL,0xf2e8b0ff85d387e1L,0x0076aa68ff349689L },
47582       { 0x6e392b02747e2fffL,0x5e1ea320e788d577L,0xba705bd7713a0b03L,
47583         0x04ef192f2dc2cbc5L,0xa5a14eed38aef8a2L,0xf9682bbe30a268faL } },
47584     /* 45 << 49 */
47585     { { 0xc04f2cf540244a00L,0x00c90c3bb8dc0ad2L,0xac5b1060601d76f6L,
47586         0xad97c5c1a7ff84ecL,0x7919a06dd2328101L,0x62d5b7a4ca8a69c5L },
47587       { 0x75607148de5a2cc9L,0x1afff7f79a75fd24L,0xe62efc8083a22367L,
47588         0xad08258a10e05e36L,0x22666e06c0e4b549L,0x15f62c613f4c48c2L } },
47589     /* 46 << 49 */
47590     { { 0x751affadc7b8da09L,0xc052109dbd8e45d5L,0x7d11aaad87c14560L,
47591         0xa0410b2a6b690121L,0xcabad9853e10a103L,0x4d19bd3e785f1bfeL },
47592       { 0x8f32c6b84b6167a4L,0xb21d4ec297b4f546L,0x2e26df99c008f7c7L,
47593         0x63825597eb347720L,0x6a05b375afe39fc8L,0x19790b92131201a3L } },
47594     /* 47 << 49 */
47595     { { 0x149347ff7780729eL,0x076b4edc62e2dd48L,0xbf0de9d7cdcec866L,
47596         0x9d75deab8fa1e18cL,0x10931716eecb1f4fL,0xa8765dd3a385eb7fL },
47597       { 0xfd26f39c4d70651cL,0xc501caf48834c723L,0x1d263a83a65e5093L,
47598         0x57ee2fb96f709deaL,0xdae3dcc645091321L,0xba0665a906a60a48L } },
47599     /* 48 << 49 */
47600     { { 0x517d13b1784d0621L,0x2db4ef27d77b84beL,0x6e2e26866d752aaaL,
47601         0x95da9fa1cab02667L,0xbe8d91ad423163c3L,0x8f3d59dba69953c9L },
47602       { 0xf728b1d2d6e635aeL,0x5c4c177deeea663eL,0x97a900a82e75d9c2L,
47603         0x136c6b1e3ad09defL,0x4bab14a6dd8a2be8L,0xa4ee903025cf1447L } },
47604     /* 49 << 49 */
47605     { { 0x05f93697a5235c12L,0x434f91026943a0d0L,0x92696b701a4d3169L,
47606         0x0a9da44b8c3b1ee5L,0x327f9f79d295521bL,0xf605cb83afd8aa40L },
47607       { 0xe3bd4ab5d365fb37L,0x6c6a470ce984ea2dL,0x7ad01e6b392af60dL,
47608         0xbef2dffd5ff8ee6bL,0x4e56deb722efc2ebL,0x1b90570ae14ff270L } },
47609     /* 50 << 49 */
47610     { { 0x70718d8e333cd9e2L,0x858c880c6b03a371L,0x5b7f69a5926a3dd4L,
47611         0xedbed135572f420fL,0x740a21e6332aaa09L,0x665aff63fecf1e3dL },
47612       { 0xd884a3c1214490e9L,0xed70c29a63cdab1fL,0xc92dfa58786e274bL,
47613         0xa5395591d7fd529dL,0xacdf81ac3b95b61fL,0x07f801df40cb45a0L } },
47614     /* 51 << 49 */
47615     { { 0x4f863ad59230d44fL,0xd176d2764a099825L,0x4a6868745a43a7d8L,
47616         0xbcab3548fff3e8dfL,0x15028cfccab2c7e6L,0xad077a8874a91fb2L },
47617       { 0x015700d39eee3e32L,0x524ef9c7386e489aL,0x3be1771b60285f8bL,
47618         0xe4a5353cf9c33beeL,0x0aa0f2ab244ad683L,0x04e846f98a4c0ed6L } },
47619     /* 52 << 49 */
47620     { { 0x326a204790f55f13L,0x194d24db53017b29L,0xa26db785cd4368c3L,
47621         0xd58943e8238d7518L,0x8e06f8cc3527387eL,0xebc6dc9e071846d4L },
47622       { 0xbfc08dccc541e098L,0x3dcf0713e4fbc9a4L,0x44e9ba7869fedb43L,
47623         0xd867cf784fa012a0L,0xc618b2b88733ddf2L,0x4149fd48a737fd5cL } },
47624     /* 53 << 49 */
47625     { { 0x5c4c2183179b1928L,0xc54d315d0439876cL,0x07d22792f7495bceL,
47626         0xd378185e3bc32c4aL,0x8539aab65b31c5c9L,0xc72b1ac640dffb35L },
47627       { 0x46bb918a2e8d6ae2L,0x102c49f9e8a1d7a1L,0x7c622793cd2764d3L,
47628         0x5bbc6f023c7aafcaL,0xa41f383bcff71b4dL,0xc8a0e1a9aa99bf83L } },
47629     /* 54 << 49 */
47630     { { 0x323aad4991d6b8f3L,0x91b678c0f3d9154eL,0xc141e2424ce74f67L,
47631         0xb7c38aef65659ca0L,0x5b5f89b174a937e1L,0x739fad71abc55012L },
47632       { 0x315ed44ccee5f4fbL,0xb0731455360a61eaL,0x39235ff0ee93ce5aL,
47633         0x6352556fd203baf9L,0x3c22dc6a0ea06b93L,0x195638cb591bbfa0L } },
47634     /* 55 << 49 */
47635     { { 0x8bd5a15359ad0688L,0x827e82d8a7323070L,0x9ea55b3af70686e5L,
47636         0x511c8c3f34c2d054L,0x9364d28aa14a3c61L,0xc4dff9c461374139L },
47637       { 0x947c3ec9a39c01c0L,0xead11d42108440bbL,0xcc6d893569677f79L,
47638         0xb1d632710b9b4823L,0x2cec325e63b154e0L,0x45e97c3814a85b9cL } },
47639     /* 56 << 49 */
47640     { { 0x11b59f3e92acd14cL,0x188c1bb1d7aea098L,0x5cadf0a19365958fL,
47641         0x8fef04fcca0b1b0eL,0xbcb4d9fb0c274a5eL,0xe97eb41cba78427eL },
47642       { 0xc49f0bc55cf06378L,0x2681f12a281b669dL,0x200e9e583f796b81L,
47643         0x5bbea92b17964262L,0x86b3c15756db0039L,0xe4477c5eead482baL } },
47644     /* 57 << 49 */
47645     { { 0x1340e22c050fc1faL,0xd5cc5445bd062615L,0x03ad31601f494b03L,
47646         0x612919142af1b95eL,0xdb31a06d53705ac5L,0xf590433ad07ae464L },
47647       { 0xed52363421bbbd72L,0x1f032ad2f1cc7842L,0x212b1d5536a7164aL,
47648         0xc2cedab7dd973183L,0x29aeeee05e74ada3L,0x579984d8bb666836L } },
47649     /* 58 << 49 */
47650     { { 0xbbe5db83e13d34d3L,0xbae5ae959a8a3344L,0x55d2f0ac797d6e35L,
47651         0x75e78c017cd0abb0L,0xb757f72cbad96294L,0xe52493895d556f25L },
47652       { 0xc02293538e7675dbL,0xc363c5255c8beec5L,0x7ac23c0b7c87ee00L,
47653         0x9c5f22b4a7de93f8L,0xc6f0ea64d9644b5fL,0x3fa718d4d161f87eL } },
47654     /* 59 << 49 */
47655     { { 0xe8496c463f356cf8L,0x25b5b8742da1b81cL,0xa35ec06330efa9c9L,
47656         0x7497d85ffdaeb348L,0x312ad677e83f49d7L,0xcb5c346cfe8aece3L },
47657       { 0x19d7332d61cd4ebcL,0xb03dece0d0967141L,0x47dcb81af5455addL,
47658         0xbef0e70389ca68d4L,0xf7abbeb9c987400fL,0xbda81c65a1521da1L } },
47659     /* 60 << 49 */
47660     { { 0x535f3e4b86882341L,0x5af1c6322e22600fL,0x0403b6e0584a13abL,
47661         0xa64de86661f59ce9L,0xd22106f738501b92L,0x2932f808ab6ffd04L },
47662       { 0x8da4cc6e232967f2L,0x4b8fdd9ef3644670L,0xe8cb6ef31e0c51bcL,
47663         0x20b7b734230c6897L,0x5009176453d9339aL,0x5f5c8c67ca637277L } },
47664     /* 61 << 49 */
47665     { { 0x23e333d467232358L,0x3c2807bdea037380L,0x9439cc4626f1dc2fL,
47666         0x8c87dde53ac29173L,0x601b7245766897a1L,0x9e0b1a4559350e3cL },
47667       { 0x0818b6cb301db407L,0xbdc4584676b6fbf3L,0xeeca553431bdd954L,
47668         0x1dfabc033f9be3bfL,0xdf0415dc68851bd8L,0x33be32a67aa9dfa8L } },
47669     /* 62 << 49 */
47670     { { 0x8c9017dd4b4e4b5eL,0x02f435dd7b892b2eL,0xe9af9efd292e0f2dL,
47671         0xa32124c75c4d315dL,0x5c6fde76b31a390dL,0xf1fdcefaa6e46d3eL },
47672       { 0x5f39dbfe9e9e84b6L,0x574d647d19aab6b7L,0xd5a234cdad1a2987L,
47673         0xeab841c7dab59c81L,0x5155898db3137b90L,0xc52e9ddd06db2fd0L } },
47674     /* 63 << 49 */
47675     { { 0x8617f0d490660ff7L,0x00d73d108b35743eL,0x433e42d68a6ca67eL,
47676         0x575ecb9beab5cff6L,0x4c64bcddf258960aL,0xb8ffb7f32c23405dL },
47677       { 0xa98c06691261b0c7L,0xf2701f4a6b9bf7c6L,0x3abe44c41c68efc3L,
47678         0xdb5ac9cbf12c7a25L,0xf5b4616651120981L,0xf8058f7074d518f3L } },
47679     /* 64 << 49 */
47680     { { 0xcd92906c6d6ae962L,0x628356159807d881L,0x0d6929781fdc1915L,
47681         0x45d01a8c269d611eL,0xe7bd1e709665b00aL,0x086385349bcaa388L },
47682       { 0x8f189e882dd24299L,0x5f643392b82fb270L,0xca65bf16c633b111L,
47683         0xc6adc9c9d6f1dac8L,0x0df2c293a3c3381dL,0xdd6ae97d8388cd12L } },
47684     /* 0 << 56 */
47685     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
47686       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
47687     /* 1 << 56 */
47688     { { 0xffdbd0eb3863db02L,0x8b8256832f57e10fL,0xc11acead35e7a3a2L,
47689         0x4998cf8c67833028L,0x8f3a346b844c7976L,0x0a9d872cdb9b1a1cL },
47690       { 0x8735dabcb98d445dL,0x93790d80305fa0a9L,0x7c0add49d267a01aL,
47691         0x2b46c913ffa20d11L,0xf2acef26d8ab2d4aL,0x71b701b93d926080L } },
47692     /* 2 << 56 */
47693     { { 0xe9d2a98a5133de8eL,0x37083b60b81b8b00L,0xf399325dceaf86aeL,
47694         0x03b17c888f161525L,0xd8ac35c984211b9dL,0x220837849050ca48L },
47695       { 0xa818c44bc9fab832L,0x8882bccee5aea7daL,0x633aaf35f8715b04L,
47696         0x5463e1b99d8829a9L,0xb18df52d84a820f1L,0x9d5ef891d096675dL } },
47697     /* 3 << 56 */
47698     { { 0xd54e2c7cac60496dL,0xc06d5e5d04cd50a4L,0xcb4105e8e60f7f59L,
47699         0x705db308427483adL,0xf73ba98bf2bff383L,0xa945611a0220e6e9L },
47700       { 0xc01c46b8d957e12bL,0x458897b7acb1f371L,0xf738dc0bfa3403e6L,
47701         0x098bc687d2202896L,0xec0c217a5f882e5eL,0x8f25af77a1f4eb13L } },
47702     /* 4 << 56 */
47703     { { 0x2615c78259ee4124L,0x4dc2824c76532b4bL,0x9c3b1d771c84a04bL,
47704         0xb6fc203fcb9f9e34L,0xbed65464c64f7846L,0x04f520a2eb004248L },
47705       { 0x5c0177274a58fd22L,0x25958482c10d9472L,0xb78c6666aceb0e3aL,
47706         0x18d3c188fc046f0aL,0x7f3e2f301baa9595L,0xa574f8cd8a2844e8L } },
47707     /* 5 << 56 */
47708     { { 0xc899eba381c2d81fL,0xb27267d6f3f0a431L,0x607c8629da55568eL,
47709         0x6b5472282b1dc1d9L,0x23232311c9c001ffL,0x207a2eb2488f8b85L },
47710       { 0x3867ac9adac37a28L,0xa36d14d32584a5f0L,0x7398c647a74488ffL,
47711         0xf6ed920fbe087640L,0x72beddc76319a571L,0x55c2cd826a244aebL } },
47712     /* 6 << 56 */
47713     { { 0xb7da79c625f8a53bL,0x6b950bdfd331ad8eL,0x3481b7b54aa36d18L,
47714         0x6efeaf88ed0e3091L,0xeb017bddc993074cL,0x8431a6d6529dd654L },
47715       { 0xf5177231bd069585L,0x6d753b103ce85096L,0x194d82d34ca26741L,
47716         0xeaeffe15adcd1650L,0x4dcec3d9af7758b7L,0xf5fdf6664cc2c819L } },
47717     /* 7 << 56 */
47718     { { 0x94bdc7f4a9810744L,0x464195daf045d859L,0x27e2dab0d654cb57L,
47719         0x1d4e1e537a491956L,0xa1ef570c31d5d099L,0x01cd21ee295f3de7L },
47720       { 0x8681b00db8249038L,0x17c31bce93781b71L,0x4324e90c6a1b5748L,
47721         0x44f9324c1222e554L,0xe30ba10fffd53dd0L,0x2e5817a8b48eeef0L } },
47722     /* 8 << 56 */
47723     { { 0xa349bb66c8fccaa9L,0x7888755f31a53ee7L,0xa6e1d891c18d3750L,
47724         0x9985aa4dae8d2bfbL,0x8baec9ae31b33078L,0xee68295a98750e94L },
47725       { 0x0d834bf8d6ddf305L,0xab33dff39762126cL,0x0c22faaa0c51d098L,
47726         0x32404042b887a10fL,0x31f6a614248bed32L,0x311f86301ce0d662L } },
47727     /* 9 << 56 */
47728     { { 0x5c95cf080d844b0dL,0xe09a8352c98650c9L,0xc1b106c5d089058eL,
47729         0x2b3cf101eb0c6107L,0x1993fdba3ce6ee18L,0x7234eb6425fc4d24L },
47730       { 0x8345acfe05f46dfeL,0x07fccf68a2d87d38L,0x14494cea85da7852L,
47731         0x8737500acecdd9f1L,0x72b1490ca39068ffL,0xce28271acfa4469aL } },
47732     /* 10 << 56 */
47733     { { 0xc872326f55c6c00aL,0x6a5f0fa3f912decaL,0xf4ef0ca5a7d1bdb1L,
47734         0x1dee685b37dc6bebL,0xdad4cf52f1b09b88L,0xc7199f0277f1db84L },
47735       { 0x7099ef00a3f00491L,0xd8fbbbfa6d8804e3L,0x2a00b8e50ae1e360L,
47736         0x8a8c9d03fe9be5dfL,0x06e0585b8b1faf6fL,0x19542ee7ae29c502L } },
47737     /* 11 << 56 */
47738     { { 0x36cad867e2aa1c5eL,0x7ef21e51317f9078L,0x68efbb84c82e925fL,
47739         0x973b36769fe751e0L,0x09c4e0c1177d36a7L,0x9c0b7e048a753c5eL },
47740       { 0x8414cdab15ccad5cL,0xeea2134ed50c1678L,0xd9c1dae8f6585d5fL,
47741         0x82fd04ab4e5c3d96L,0x868cddf7da3812d3L,0x32a65aeafda07e68L } },
47742     /* 12 << 56 */
47743     { { 0x73292e6a60720858L,0xe046a79953160855L,0xf74d56c9ed3b94c1L,
47744         0x0e371167c67863e1L,0x19b3a9f43f6636cfL,0xe624798d898a25b0L },
47745       { 0x2ed1fc4dfde2cd6eL,0xd9a7ab519fd15ee5L,0xb6b8d551c487b1cdL,
47746         0x9fec705ae8936c54L,0x4b779dde1a50e094L,0xfb5100c2c3a4ef5bL } },
47747     /* 13 << 56 */
47748     { { 0xb35a7b102704c525L,0x8a77fa5b44276cbcL,0xb4a9cd235ff1a12cL,
47749         0xc74a017c88a37997L,0x84e26eea9af37476L,0x8a6b8c0e7bbf737bL },
47750       { 0x90ab7c948f05bd3eL,0x31749075464f3a2cL,0x32f7873c1dcfbd25L,
47751         0xc0af73d343bc2054L,0x556c4798171d825eL,0x2c84b5b6081542f8L } },
47752     /* 14 << 56 */
47753     { { 0xa5907e5c59ab2507L,0x12b86e04cf7df60eL,0x0a14bed18af4bc50L,
47754         0x462863b20c11bac5L,0x98dde284126958dcL,0x8877e7695625eb29L },
47755       { 0x869f7214f4fe19e5L,0x29867e51ec0f8c1aL,0xbf498bc078b85f03L,
47756         0x9dda400e8973a94eL,0x8d8b998ae6e51b1aL,0xedb0957c557ac00eL } },
47757     /* 15 << 56 */
47758     { { 0x84b6d5143b7d43f2L,0xcb84c823afb7a2b9L,0x892e8c4c56d2b161L,
47759         0x52ea7426214fdc0aL,0x07f3d57679763557L,0x9f95fd585a828bb3L },
47760       { 0x2c7f03d550e14019L,0xab723de7d7eae7b3L,0x4c08189317f4ea6eL,
47761         0x64cc5bc0ec367246L,0x73077b5ddf11c3b7L,0xfa34b540e08eb4bbL } },
47762     /* 16 << 56 */
47763     { { 0xac6dbdf6edc9ce62L,0xa58f5b440f9c006eL,0x16694de3dc28e1b0L,
47764         0x2d039cf2a6647711L,0xa13bbe6fc5b08b4bL,0xe44da93010ebd8ceL },
47765       { 0xcd47208719649a16L,0xe18f4e44683e5df1L,0xb3f66303929bfa28L,
47766         0x7c378e43818249bfL,0x76068c80847f7cd9L,0xee3db6d1987eba16L } },
47767     /* 17 << 56 */
47768     { { 0x254ed267050f46f1L,0x36786ff864daa83cL,0xb4a89efc802a3ae6L,
47769         0xe0027b3486b77d59L,0xb7147905f48d0de6L,0x00733ca710cf7c60L },
47770       { 0x87efbe387b3ab776L,0x3db10898de9730f4L,0x61f21e1386b7a40dL,
47771         0x5541873648455b6aL,0x0de378f9a88587deL,0x42dead7a766d18f1L } },
47772     /* 18 << 56 */
47773     { { 0x42b8ef51e15ad876L,0x498886e5082e110aL,0x3144e8c964edbd73L,
47774         0x4b08cf86f79e6724L,0x42d06d53ddfdb6a5L,0x4c9dce336d8b1f33L },
47775       { 0xbb8913ae4be29e97L,0xe944c922166fdcc4L,0x83913b963c494e9bL,
47776         0x529d57ac633a0018L,0x632a7cfd242e7d9cL,0xf0e2434dd9b51d08L } },
47777     /* 19 << 56 */
47778     { { 0x74768ab044ff52cdL,0xa590ac7eead09902L,0xdc408c53f52c0f5fL,
47779         0x614a22d6f853efbfL,0x61f391c425126427L,0xb61adcfcbf462fbbL },
47780       { 0x7b753aaaaffdbe78L,0xce12b2247bea939dL,0xca21f73e95baf09bL,
47781         0x2a82915e43ca9ebeL,0x67ba04f57936a38cL,0x1c1964f1616b0b87L } },
47782     /* 20 << 56 */
47783     { { 0x4dc628c67cb2ec48L,0xc896f99c0cb1e9d2L,0x399ac2e85cc6134bL,
47784         0x5ac36de184ba73d0L,0x66a334a3e1803832L,0x394af7ea59b770c1L },
47785       { 0x3df19e55b46f793eL,0x97aaec84bf770a95L,0xf52068b8f8c54408L,
47786         0xb6f7649f49e05f0fL,0x54d8db0583360826L,0x24748fdf71af722fL } },
47787     /* 21 << 56 */
47788     { { 0x68f4dd4956c29111L,0x391ac9910dac9352L,0xb0a8a54206dc9d58L,
47789         0xb5058ed8fbe70330L,0x8b5e9d4076b593bfL,0x769fb99cd7f2b261L },
47790       { 0xcdcbb60ec67cce8aL,0xe01a5d5d75da36dfL,0x7e831d0ef7c6e5cbL,
47791         0x0f6bf54bccdeef00L,0xed49ad3998ba4d8dL,0x8d512c83614d70c2L } },
47792     /* 22 << 56 */
47793     { { 0xc1910b2545b4f6e5L,0x54c6ee8489fb712dL,0x80b6fd47f5747ba2L,
47794         0x3d81e7efd6d4f856L,0x8b9e87418031f1bdL,0xc591d451f2327316L },
47795       { 0x4830d9971e0f1c1fL,0xeabe29bd86e92024L,0x2f2053a1b8c68d7eL,
47796         0xff4eb9e879d00ad6L,0xa0c93249f4b4cd89L,0xe127d9d3cb9e0761L } },
47797     /* 23 << 56 */
47798     { { 0xeb947df3492d73ebL,0x5474817b0d32c2ddL,0xeb01bef7a9440e93L,
47799         0xf604581d8085d1f8L,0xf69daa189f69ec8aL,0xc79ac48e71748716L },
47800       { 0x5141c75ad4beef28L,0xf7dfaf89901c44a6L,0x7bcbe4812e81ed85L,
47801         0x57ed0e6f0c5a4423L,0x7cf189651cec85a5L,0x8ddfe8a5beef12b0L } },
47802     /* 24 << 56 */
47803     { { 0x60ee08b46bc0b979L,0xa31cfd961aba7f4eL,0x66c05a6358bedf51L,
47804         0x2ae6ec3854df9266L,0xe7dbda332771b08aL,0x44455d312a09fb28L },
47805       { 0xaaba39171cec98a5L,0x9b2b12258cb543d0L,0xf47a9cd16af6495aL,
47806         0xe207f3aac6cd8a16L,0xf98952878ae828b6L,0x37e2475725844053L } },
47807     /* 25 << 56 */
47808     { { 0x7c8137d8f93723a2L,0x78fa2e03cf552846L,0x3becd2627d11977eL,
47809         0xdbc8e9b34e9a700eL,0xb2c7798d20decdccL,0xecae57179523bb6dL },
47810       { 0xc0fec0677fa2f633L,0xe270b10702aab6a8L,0xda280b374dcc797bL,
47811         0x50a163b86c42945dL,0x4a3fd6bd363e44ceL,0x0aa7e33d38bca4e6L } },
47812     /* 26 << 56 */
47813     { { 0x19c7f098a693d0aaL,0xb79d84244bd22a29L,0x19d91d12a9b3c2ebL,
47814         0x2ae96bfdde735665L,0x2f9c9a773d8a85bcL,0xa74bdd46cbab80f5L },
47815       { 0x25a2486cdd9f70f0L,0xada155c9754513d5L,0x8aecd7db4c3e9494L,
47816         0x9c3951ad2cf6665eL,0xd35780d44a9ec29eL,0x064983964cfd7821L } },
47817     /* 27 << 56 */
47818     { { 0x23407aac0834f890L,0xad7b7b5599bb065fL,0x3254aa7e4ba2b4ccL,
47819         0x37f37fd1663f9213L,0x0c72c3111c5a51d4L,0x6e6df84b9989820bL },
47820       { 0x576a320e1ae2f321L,0xa5fc617c3c62888eL,0xc4f1be4df6c40362L,
47821         0x01b21892dbfaa5b3L,0x6fc0442390b9a5e3L,0x22a70c8791495c30L } },
47822     /* 28 << 56 */
47823     { { 0x365e1382183aee81L,0xe9f2245275d289c8L,0x543cb5c7b70962e2L,
47824         0x853971711cea2e37L,0x8b31cf530adfc82cL,0xf9a458bf3b67c705L },
47825       { 0x13b1cb3334a9b3a8L,0xa4325b403732f6b5L,0x39e997ba04e9df8eL,
47826         0x24c0d6ebf1d542f8L,0x9cb3f1abd82901bbL,0xbbaef37a4cb34763L } },
47827     /* 29 << 56 */
47828     { { 0xc4881080b08dd648L,0x21869be8f1fe4e15L,0x63e158b112501ea3L,
47829         0x48a909ce32408693L,0x77fd2cf062b24495L,0xf7d1e134db9322a5L },
47830       { 0x4c02c8bcbdb19eedL,0xe03cd00e8a20b335L,0xe04271c530632562L,
47831         0x549e5dba603e1681L,0xf01b38f95503b61fL,0x244c81920b3fb785L } },
47832     /* 30 << 56 */
47833     { { 0xb423030c4b0c7247L,0x242d409f149f8cbcL,0x6094885e9c1f518eL,
47834         0x6d299dffe04d97ebL,0x152d05bb09903069L,0xf5656895fe235dddL },
47835       { 0x801e7f736b22ac0eL,0x73aa6df46ba6dc97L,0xba498bc0d66e5d8cL,
47836         0x8054e17d36b8c78eL,0x241bd2e21137fdf1L,0x8e79a943b97dec15L } },
47837     /* 31 << 56 */
47838     { { 0x94e617abeb64269eL,0x39aef936b410ae02L,0xdbb744c325fcc976L,
47839         0x5072bfab38a5b366L,0x3998aefea3f5d715L,0x0bdbf555a74e281dL },
47840       { 0x50d2feece24dd239L,0x835925ef46324c5cL,0x53c4eece7a4dad08L,
47841         0x340fef207c358d83L,0x9e2189da30f04396L,0x2bc748d727e322cfL } },
47842     /* 32 << 56 */
47843     { { 0x1238e097ae658422L,0xb4631ddb568df55fL,0x451254e7f74c5c50L,
47844         0x238b16d28805813bL,0x23987b28925e7a6eL,0x93b72e2d2a1a10bcL },
47845       { 0x944c784d05e44b7fL,0x7d70fd098c8e3120L,0x6bf1ab2aead45716L,
47846         0xd5f8f0e631c04205L,0xac062526a10b8881L,0xa1a83cf0fe5505a8L } },
47847     /* 33 << 56 */
47848     { { 0xe1e05ff89ea47326L,0x88219a1ffbfc7f61L,0x9cbd0b387dcd3008L,
47849         0x751d03847671a68eL,0xd73ed70d28e0387fL,0xf66f9cfea9485256L },
47850       { 0xac68aae1ae153e0cL,0x92eb6542e81b1282L,0x9617d45464541adfL,
47851         0x81b4d94a9d489e95L,0xafd5cd4620f31ba0L,0x35700392e5a38941L } },
47852     /* 34 << 56 */
47853     { { 0x52296be3b71ea9c4L,0x82b05a43424cadf9L,0xb6d329e8842699e3L,
47854         0x9dfb91bf9370f2c1L,0x0188b738994ecc71L,0xa9a7b03b5ce8b100L },
47855       { 0x99198b2a25c33035L,0x772795a7e21895d5L,0x37dafa4c42173e01L,
47856         0xd37f03933ab27d91L,0xf3500a7d2afad1f3L,0xa433b5fd87eac06eL } },
47857     /* 35 << 56 */
47858     { { 0xdc193cb5243a97bfL,0xe367f27ff5715184L,0xc4bb95c6fd9120c6L,
47859         0xd2bd176bbc5f7ba2L,0xf2c0f86de966c1deL,0xc69ab26e811e70cfL },
47860       { 0x95756460e87c55f0L,0x6b62ab136a59c832L,0x6e971c6c128448a0L,
47861         0xca72482e91ea44a3L,0x2602d4795dca0f8bL,0x8dadd3e25519433bL } },
47862     /* 36 << 56 */
47863     { { 0xfe0553be23246f68L,0xccc1d774d8ad4128L,0xbec668d8cc155edaL,
47864         0x7a80e9b44231506cL,0x579cb5f42aa1740aL,0x3a61b84fd8b35a2bL },
47865       { 0x0478c05ba3b519f8L,0xf518ac09acfe39aeL,0xabc15e9076c956e6L,
47866         0xff35db67dd55d268L,0xbe066679bdbba89fL,0xf7385df12062b845L } },
47867     /* 37 << 56 */
47868     { { 0x279d7ffdfc12078dL,0xeb14155eb8f302e9L,0x5f1b11e165b3c14dL,
47869         0x08510b461bd36b3fL,0xa7f5b2ffc9d73b4fL,0xe5e831557aa09e40L },
47870       { 0xbed67135cc3d88d8L,0x7b2775f7017a43d2L,0x9ce22ff24c58cb64L,
47871         0xab88d04849ede1eeL,0xcac13762da63daa8L,0x70662331b1dbfc4eL } },
47872     /* 38 << 56 */
47873     { { 0xe4f7022200a8a9adL,0x8d1bbab7d42fffcbL,0xe024970e368ad5edL,
47874         0x231ef631b4c0c9f8L,0xb47ca0386760b411L,0xe1f297ff179e6d44L },
47875       { 0x2e5ec77d3e071736L,0x90e20be915b29c93L,0x33961b6dbb7e7237L,
47876         0xa854df5b42176851L,0x67d223e4a8f4bac8L,0x5464a46f0dee39fcL } },
47877     /* 39 << 56 */
47878     { { 0x525a553b32230b65L,0x7bbde6b816bb6a4eL,0x2f5bc6d229f12292L,
47879         0x5d86858045fbcff9L,0x6ce4fb249f932964L,0xd7cd175098e05ef6L },
47880       { 0x794b0248e1366d8eL,0xa37afa66332098a0L,0x2dcc1888d9aac70cL,
47881         0xa01ba83ec15b9fb8L,0xd34ddf851df4b59cL,0x92289e954f829510L } },
47882     /* 40 << 56 */
47883     { { 0xdec879d51c9d09f1L,0xdfa9e7d61b371576L,0x8c705c7937fb3410L,
47884         0xd770153e1f2a02bfL,0x208fc8f18043ba69L,0x58aebe6e25aa3453L },
47885       { 0x191b69e512941f03L,0x27dbb050d7966e0eL,0xa5196bb7d16bc20bL,
47886         0x5b6bae47f22b30b2L,0xbddcabda8ce7b419L,0x6e3cfd373b9f5a39L } },
47887     /* 41 << 56 */
47888     { { 0x605d4b83330c07f8L,0x4dbe47646a0ed45fL,0x1e715823d7e4163dL,
47889         0xe337a67dcea3306dL,0x55abf0684f18a604L,0xaaf69d5ea9f57370L },
47890       { 0xddd09e8129784840L,0x17fd42b9a4fff5e9L,0xe99859e55acee616L,
47891         0x41d691203b927ed5L,0x35cc99675168f505L,0xfc311c24431d7d60L } },
47892     /* 42 << 56 */
47893     { { 0x415f7f0da581c54dL,0x67c678244509f31fL,0x36fb92eb988f449dL,
47894         0x22d41b1a94181fe4L,0xacc68410df896026L,0x4a10e46f9ccc4df6L },
47895       { 0xf805a1191969cf2dL,0x7230a26b32ad355cL,0x9d200562e9abd845L,
47896         0x2db90c3b5cb55349L,0x80b59daa29bcc42cL,0x81272ebc53d32149L } },
47897     /* 43 << 56 */
47898     { { 0x6aaf15f27756bcffL,0x5391bc009b645589L,0x46cc4480a6fc61a0L,
47899         0x6fde9d53293d676dL,0xd6c35628d7618399L,0xdda13a0853daac23L },
47900       { 0xb6e6c20c0fe7995dL,0x32eb3468d8d41d55L,0x8927d508c19c5995L,
47901         0x3907eeed3c229e66L,0x509af79f27972057L,0x8a7f44f750e2f170L } },
47902     /* 44 << 56 */
47903     { { 0xb91ffd21c87b3fe1L,0x0fe8389b34fe2825L,0xe22d45d74bf4c8cdL,
47904         0xb575ae4cd6d8308aL,0xa7fa552e82994ba8L,0xfb67a86fecb08870L },
47905       { 0xc3bebdf8e6dabcb1L,0xef18b357b5bcf114L,0xed518499a4b8eca5L,
47906         0x0fec83c5df16ed99L,0x5d353a5856b5649eL,0xc858c1d1cec900e0L } },
47907     /* 45 << 56 */
47908     { { 0x7a65d2660d85e627L,0x96170bb90bc010a3L,0xaa6e0055da030ad9L,
47909         0xa75ab280ff4e4a8fL,0xec14e68c0be864a3L,0x05424b9cc17723b6L },
47910       { 0x9ed54bb218ca85d6L,0x035edc14b78b34bbL,0xc116914929617416L,
47911         0x0a00e0086cb0d801L,0xba40f1207d4a638fL,0x54b1e8cc9d8bd0e9L } },
47912     /* 46 << 56 */
47913     { { 0xbbab4ab54c88db57L,0x68dbee6f9ee9558aL,0x31b988e140da802fL,
47914         0x9d117c37e90b2221L,0x443ae099025b66c7L,0x8568bd6f2538a654L },
47915       { 0xf806d8636720df01L,0xe390adf2b649ad8fL,0x7851f8e039d1c315L,
47916         0x8185ae1a5e650f1bL,0x3dccfc4c9b562532L,0xae99ae835f427c40L } },
47917     /* 47 << 56 */
47918     { { 0x99542ca7564c7ad5L,0x682eace49a96f25dL,0x2d01b2488d933a6cL,
47919         0xf96916ddb8604277L,0xad3259d12e4d7419L,0x9085251fc26981e5L },
47920       { 0x848219363d2ec970L,0x723ea6a5392351c7L,0x3fae69a55e5448c8L,
47921         0xf6eee650dfb03d49L,0xe2e1df1ef8c58715L,0xc603b61f1a369206L } },
47922     /* 48 << 56 */
47923     { { 0xcbbd8576c42a2f52L,0x9acc6f709d2b06bbL,0xe5cb56202e6b72a4L,
47924         0x5738ea0e7c024443L,0x8ed06170b55368f3L,0xe54c99bb1aeed44fL },
47925       { 0x3d90a6b2e2e0d8b2L,0x21718977cf7b2856L,0x089093dcc5612aecL,
47926         0xc272ef6f99c1baccL,0x47db3b43dc43eaadL,0x730f30e40832d891L } },
47927     /* 49 << 56 */
47928     { { 0x7f3a3e5f4447ed08L,0xa6302f7bf94d49d0L,0x94fd2ad33b2abc46L,
47929         0x98ffc01fe4249c1dL,0x6f3a53bf8db4549fL,0xfbae12df25566cceL },
47930       { 0x63fc92d3c2e84d15L,0xc355b46c4f5abdebL,0xb50b43a05678d0cfL,
47931         0xf4d4b0b15681d628L,0xc9f11d63fb3bac7dL,0x444b748cda461eb1L } },
47932     /* 50 << 56 */
47933     { { 0xafe9adafc9845a07L,0x484a9eb9df6a1305L,0xec32f0bdb0f111dbL,
47934         0x742b41cddc7b100cL,0x5a7ea89d23c5f849L,0x1ea8801fa298aa82L },
47935       { 0x183e1750cb001f26L,0x66ec5daa49da5bbbL,0x8071ff322d05ab57L,
47936         0xaea9e694e1944e0eL,0xc993754437b85438L,0x2c2467b4faaf4f22L } },
47937     /* 51 << 56 */
47938     { { 0x38f87acce602c278L,0x72c79590515854dfL,0x9d466a765e7e2f6dL,
47939         0xe5f6704772081935L,0xb4b56288ad958812L,0x7f4d9e1395b08242L },
47940       { 0xb38d0ddb962f0f6bL,0x969d4327e5f76463L,0xf7c7c799f6ac01f8L,
47941         0x494066673e6ff230L,0xa81fa10dc7e9c1b6L,0x2fcf26bf8093c2d3L } },
47942     /* 52 << 56 */
47943     { { 0xcca6e9cfa754256bL,0xfdd79280347723f7L,0x8179d6f52d69c6bdL,
47944         0x156a53fa94cc8567L,0xb819d70324655f28L,0xf86872e2ebfb198bL },
47945       { 0xb158e73939ccd668L,0x655db8248de67826L,0x54399a79c621cf3aL,
47946         0xc55900d498a09c9dL,0x5423edbf20278b3aL,0x06a625b280ba89cbL } },
47947     /* 53 << 56 */
47948     { { 0x0f152d69869c4f68L,0x0ed4205a9f0068fcL,0xda68af4f25d4490eL,
47949         0x715fcc60745c00afL,0x70ab559aad63dff1L,0x7d0a7b6a9b8a37ebL },
47950       { 0x82ab7a068bca8498L,0x4f012fb4297d954aL,0x8b139e6ed5f6a4b7L,
47951         0x597316e4b856ac26L,0xeb64b5894387367aL,0xcc92eeabbacb7e74L } },
47952     /* 54 << 56 */
47953     { { 0xb53560e968fdcf87L,0x4ed638bd3cbd0887L,0x57f3f38f6080d1cdL,
47954         0x50370e0c1e4e3ae8L,0x14c87fad184a1ecfL,0x3d06f78d0af7b2ceL },
47955       { 0xd9370e24fd595621L,0x1e462483c9fbb559L,0x1ee5d81ca0aa5c0aL,
47956         0xdb2524557419564dL,0x782ba91b57585be7L,0xb2d14bcc5c431c72L } },
47957     /* 55 << 56 */
47958     { { 0x9cb9de6fd62ebed6L,0xb7f23b1916c6d571L,0x69b4a8dfa8b307b5L,
47959         0x78a7f74e19dc7e39L,0x423405152f47c94bL,0xf1c2a5bc31ff2d82L },
47960       { 0x98c1c3f7b145387eL,0xdd9d24d885e635ccL,0xeaaececa07397bc4L,
47961         0x6bf6a8469b0cd4c6L,0x68052950680dbd05L,0x81a071b60ce07df9L } },
47962     /* 56 << 56 */
47963     { { 0xf3fa8bec0c61d5a5L,0x98f772fc0dedaa77L,0x45a382161146d42bL,
47964         0xebef5d4a58821ebdL,0x21498af30c1f0e6aL,0x3d8699144758014aL },
47965       { 0x6f2276ecb625c7e0L,0x68d6a144fb55d708L,0x0bc836e0ad56b494L,
47966         0x72b6d8850f58ef70L,0x0e0be2887bd7c1d1L,0x70549a879c277d39L } },
47967     /* 57 << 56 */
47968     { { 0x39a445d2dbb2bb75L,0xda2a211b1ac42cd1L,0x934bee9a8e4cf8f9L,
47969         0x5d0dde6a24801bc1L,0xb2d4261d23da4ea7L,0x5fa9059a7187cde8L },
47970       { 0x49298bb651f05f9aL,0xff0c4a0422a7bee4L,0xf466232da6a29be3L,
47971         0xff2e157a995c1904L,0x3a4ee4537b31bdffL,0xb4a736d7e41f6eeaL } },
47972     /* 58 << 56 */
47973     { { 0xaed55c123fa96c0eL,0x8f90803f6e08adf2L,0x349e5807015b7cb4L,
47974         0xdb3f05e314656b3cL,0x9289bbecde8b2d9aL,0x3cad12e0c7f28356L },
47975       { 0x7a68fa54959fe89aL,0x2e7135d0a77f956fL,0xa0285cbabbe35884L,
47976         0xc547ffe7131ab269L,0x82a902bebe33b425L,0x5a793a790c71b02aL } },
47977     /* 59 << 56 */
47978     { { 0x2bb2a929c645c6eeL,0xfc6cbd471e651728L,0x4ec3f630c07af98fL,
47979         0x118231588e4a8ad5L,0x99a2b5de1303f68aL,0xcc280b182ec9b8f7L },
47980       { 0x3d7b406ad7298d55L,0x63941bceb9f83957L,0xfeeb132c463a64c6L,
47981         0x243a2e2bf76a6c8bL,0xae72bf2fdad18d64L,0x774423431987a4caL } },
47982     /* 60 << 56 */
47983     { { 0x06de549d78dc1526L,0xa27fc0c1f52c5766L,0xee5ff3d8e9485b1eL,
47984         0x7af2fbc64bc530dbL,0xa266d6c810f9dc58L,0x866abeed8bfa4d74L },
47985       { 0x50356d7fcb7c7018L,0x4ae502e07c962af2L,0xb98b449cf011990cL,
47986         0xfcc8446b59e8535fL,0x25964ab0088776ebL,0x3848aba2ab6cfe8eL } },
47987     /* 61 << 56 */
47988     { { 0x9f2c62cbe14a2c5dL,0xcd182e386b113f03L,0x2275ad4f525a15aaL,
47989         0xd5b7d1d9eb373133L,0xd3c47b9b07929822L,0x60b043cd8fa8e8e0L },
47990       { 0x603a3403d3958f57L,0xefa36ad67b79c263L,0xfe33dd9f3742ac39L,
47991         0x30f40b3bb249f9bbL,0x9d2902d20a3b2e7fL,0x173f7d1a899684f0L } },
47992     /* 62 << 56 */
47993     { { 0xdcbeff5bf33bdff0L,0x963ae65ee9684a3bL,0xe03586882bcd272bL,
47994         0x756695068942f107L,0x14319d19262e422fL,0x5c0ef45a2265b294L },
47995       { 0xeb897bd8a9f64203L,0xa3b259d742b1640bL,0xdc34ee2dce66355cL,
47996         0x2fab125eb4e13438L,0x1b93a820443420b7L,0x79c46f97b4ba8382L } },
47997     /* 63 << 56 */
47998     { { 0xafd8cb2006e55b9cL,0xc88f38ea2530a11aL,0x628d10bfe4efe221L,
47999         0x00df0da42a8d983fL,0xed45860508a2fce0L,0xcd7882b86a01efecL },
48000       { 0x93ebd86c7efcbf7bL,0x578f9fe7e3db504aL,0x3c584008aa5e83e8L,
48001         0x5bf38b4ca8368754L,0xcb4a9cf905c05ca7L,0xf77ab684c634f28fL } },
48002     /* 64 << 56 */
48003     { { 0xac92ee1537d83369L,0xc968c187fecec65cL,0x29a7ca876e7a3265L,
48004         0x0f2b7e7a8456c9afL,0x7471824e9754326fL,0x498687bf364d2ec8L },
48005       { 0x86d8aacd3c6ee351L,0x01ee6823f6f41e85L,0x9805fc881d79f7ebL,
48006         0x377ac3a40040547dL,0xd39215d461b4e90bL,0x2547416e4c5fd81bL } },
48007     /* 0 << 63 */
48008     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
48009       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
48010     /* 1 << 63 */
48011     { { 0xa10292b907a6fbf8L,0x292c1a203fa6235bL,0x7a36f18f73ad7a1fL,
48012         0x8b2c7b0c5897b11fL,0xf7b9a272cb664c61L,0xb6d366af8f81e22cL },
48013       { 0x3b99b2118e342bbaL,0x03ce158bb06ced2bL,0x3af1175d001db74bL,
48014         0x526f08467159cb8aL,0x6a3c6e1febde4601L,0xfad5963b8c232eacL } },
48015     /* 2 << 63 */
48016     { { 0xa54768dab1b43eefL,0x13e41f47e14fda22L,0x774df203faef6863L,
48017         0xf795a034bd7471b3L,0xf0958718b47de2e9L,0xc92f7888e1160cffL },
48018       { 0x86ded97b0146c790L,0x015918f5480a4b7bL,0x05588920424e8459L,
48019         0x37455914eecf8b2bL,0xe7d3df1fb968a6faL,0x07a0ffd6bad0719fL } },
48020     /* 3 << 63 */
48021     { { 0xf13f55e619f6ebccL,0x63720df2a266b368L,0xdbcc937f3bf1a890L,
48022         0xd3faff625f326fa4L,0x8b33bae9019730d0L,0x7879782af9961795L },
48023       { 0xec7e75bc93735e44L,0xfbbf6d225d5702d0L,0x26b6e1d53bc2ddc5L,
48024         0x00345bf714941d10L,0xdd719676a745c77cL,0x2869b11881c523dbL } },
48025     /* 4 << 63 */
48026     { { 0x2566021f98d23f6fL,0xfb883e1234ca97caL,0x34e047a5d9f51b69L,
48027         0x0b50d91df8efa646L,0xc2bbcbb2971f584fL,0x4136f0e40907c91cL },
48028       { 0xa7ebeb0de735cc48L,0xa7d1bedce113c8faL,0xc04d9a073f5c962aL,
48029         0x95c155e53ff74a2fL,0x923c65a53df0749dL,0x10d5f81227ae35d0L } },
48030     /* 5 << 63 */
48031     { { 0xc08cf7a1a128747dL,0xeb34a1c02eca6776L,0xff6e7cdfb596491aL,
48032         0x17024305eddd8bbcL,0xab92b54cf3c46414L,0x2a995b7759134eb8L },
48033       { 0x97525904e48cb259L,0xeac065ed1e1da01aL,0x16cab74a14c5bf38L,
48034         0xcd3e2516c14eda8fL,0x3ff38094a8de7a9eL,0xb7340214359d653eL } },
48035     /* 6 << 63 */
48036     { { 0x4d37c2663e7a369aL,0x092dc32c3ae62c55L,0x566da2e928ca9d67L,
48037         0xa9771c1a79beb236L,0xaf6b97a976f801e7L,0x3afd62e771259358L },
48038       { 0xc23a5e32cd541e77L,0xae4c90a301660ff9L,0x3f3a233b1911ccf2L,
48039         0x93e4664cfa3b3aceL,0x4bdc14832d4c5f5cL,0xfe03d3c36abf13c0L } },
48040     /* 7 << 63 */
48041     { { 0x9649468631b26990L,0x55222e9fe3fd62f4L,0xc8eaba742ee74b8eL,
48042         0xfa43617834d198efL,0x475b688e892748f5L,0xc6eb426541b9822dL },
48043       { 0x535695bebdae951fL,0x45e69033e909cce4L,0x40354e72b1829154L,
48044         0x1005ee6d5c56c3cfL,0x61b36a754a3fec51L,0xae644f3872f2f56eL } },
48045     /* 8 << 63 */
48046     { { 0xd5469c7becee6e87L,0x056180bc33a4c917L,0xf881ca21a16caa7aL,
48047         0x221de182e6cc7f39L,0x10d61ab531378723L,0xfb763bd9520c9660L },
48048       { 0x145214cd0d6b1541L,0xd9f7ff2dd70223e7L,0x9fce59e30cb1fe69L,
48049         0x2e6e77fa3e299fe7L,0x3a0cf652d5af78cfL,0x50cc42c53e852159L } },
48050     /* 9 << 63 */
48051     { { 0xd2536452b8da85a2L,0x5c15dabe331197daL,0xf5a89366aecccec9L,
48052         0x8f998baf2d8352fdL,0xb10e6c80f56159d2L,0xf61ceff379eb9affL },
48053       { 0x05bcb93d1c4283a2L,0x4e1abc521d8cd941L,0x898c9a49b46b343dL,
48054         0xcf352f3c6e423ae6L,0xb1db207f6fd42c89L,0x08f36a1edab295b4L } },
48055     /* 10 << 63 */
48056     { { 0xebbe18b7ed31fabaL,0x046e248dd74971d3L,0x3ddf5a2a0b24f97bL,
48057         0xf9a400c262fc6124L,0x9ad9b0bc6b03b73aL,0x9fa97c56153c8fdeL },
48058       { 0x1b6477da00b73ea7L,0xec59f64a21b2f3f3L,0x4428712895306955L,
48059         0x4b5db01db9e77579L,0x237edf0bde05e0d1L,0xac904b01855332f5L } },
48060     /* 11 << 63 */
48061     { { 0x6a37fc505cf708c5L,0x8de4dd7c30497ceaL,0x6978648161b8bf39L,
48062         0x3cb303375d7362eeL,0x0e24d09237ed25e6L,0xd474f3dc2f69ce20L },
48063       { 0xe15d98a0edb40541L,0x5e4a87c91466f464L,0xc3cefc9eb68923cbL,
48064         0x66f10920f22c9de2L,0x3c18f9ea9a51b3f2L,0x706237bef40e6204L } },
48065     /* 12 << 63 */
48066     { { 0x0791dfa1df764716L,0x31bf68768c66da07L,0x49f25b77ccedf4f3L,
48067         0x05170ccd5d965c05L,0x37d9521bd49e6727L,0x1548251286a00176L },
48068       { 0xdab444936c00eb48L,0x102c6b95e00c5c5dL,0x43660c3e4c2506baL,
48069         0xb2fb26165ec6f132L,0xccc4221a99ac7691L,0x05b29758a576deb5L } },
48070     /* 13 << 63 */
48071     { { 0xee84fe05a5731e27L,0x3251ded005713149L,0xbfeeaf3c7c5e7260L,
48072         0x3db0b6b2f048907aL,0x38728debb4a6b923L,0x853997d9d1142e10L },
48073       { 0xc636e3874b641cd1L,0x69b10f43c629f4f7L,0x6f10a95c7deddd0fL,
48074         0x85b5a7a317f56374L,0x28cd59435c329333L,0xb37621f7d1e476a1L } },
48075     /* 14 << 63 */
48076     { { 0x3a17f86d48341ba2L,0x558ef6e8ba6375bcL,0xa86ea3f0927935e2L,
48077         0x2f43742ac04d4fb0L,0x32a30bce38769421L,0x5a6d6a62d8d3912fL },
48078       { 0x34154b19c20e3fd9L,0xe95d3843fc85f907L,0x26cfbe0f9f7a13c0L,
48079         0x50d50b3a531736e5L,0x81849773b2cfa2c2L,0xc81523e63ba8ae5fL } },
48080     /* 15 << 63 */
48081     { { 0xac9b0573c2f899caL,0xd9c4fc1ff747ef78L,0xbc205571c7714e62L,
48082         0x726bbf311919f8c8L,0xfff68adaaedc0450L,0x9f4bc0b9f4001089L },
48083       { 0x5d10a660fc5dcfeeL,0x1ea644fbaa9f25adL,0x4f5cf102e5a144d4L,
48084         0x4275b6021521f249L,0x9c62750522d8bcdeL,0x3ebbfc5bb7df57afL } },
48085     /* 16 << 63 */
48086     { { 0x4a873076ad8c49b7L,0x891598ce7146575fL,0xc1d3042f427ea198L,
48087         0xdc592111ed259219L,0x0abdbd16234850caL,0x26b9412643b6fe8dL },
48088       { 0xd3c79d1736a1cfe9L,0x576386219a2b3bafL,0xa736535d5a98bf65L,
48089         0xacb3b7ddab2cdb2bL,0x37d3743adaaf89eeL,0xf19d9aba0b348532L } },
48090     /* 17 << 63 */
48091     { { 0x013b49753e09dc4bL,0xe548f7bc2d034deaL,0x65ffcd710b861c72L,
48092         0x80f4d7a2e07dac01L,0xd1889dcf56c1a8b1L,0x14ad62d4789b133bL },
48093       { 0x082e3c082e80532bL,0x0562a7d80b9d17e2L,0x4f8613095d57e2a7L,
48094         0x79f21d7255f93514L,0x22c4f68c595c0f33L,0x91d9bd5ba22c0c33L } },
48095     /* 18 << 63 */
48096     { { 0x30539655b29eff74L,0x7ba206ebe723167cL,0xe20c3ce488110a02L,
48097         0x52b406b97c124481L,0x050111c68c74a728L,0x3d594a6bc57cd9feL },
48098       { 0xd4b2a271e5f952d9L,0x7e52d63b080da0c9L,0xa6463d65f53a6cffL,
48099         0x9ebcffcfcc678e26L,0xa657f27b2f2b9424L,0x850bd2b871da5c9aL } },
48100     /* 19 << 63 */
48101     { { 0x9f3c395b7d4e1a14L,0x2f99aa23bd7301efL,0x50eee34e3017f166L,
48102         0x88c951ff4c9cbb4dL,0x90c0422ad8dda2f4L,0xe8361775d49cae19L },
48103       { 0x654db0d250da6138L,0xe4ada30ee03c34a3L,0xde0d3787832ccf4bL,
48104         0xd1bf435641b94c86L,0x347531c37db87eb5L,0x6942e7e30fb51863L } },
48105     /* 20 << 63 */
48106     { { 0xafad01a0d93c54b2L,0x659bff9695536c49L,0x7b91aac2b9734c15L,
48107         0x55c7f08224e02f59L,0xebcb71e73a26e551L,0x5b7225f76c6343ebL },
48108       { 0x021c48fb17d5e775L,0x57536a42bd859c87L,0x24852cc0ae2b63e9L,
48109         0x21515020c0ce0ef1L,0x2ac7336c8fed825eL,0x4bc87feea0152819L } },
48110     /* 21 << 63 */
48111     { { 0x7f9813e94b82bbd5L,0xc01f14624e697d08L,0xf02d9eb293de010eL,
48112         0x290c503c50db5ea8L,0x339341f033edb639L,0x962abf5f7cd7f6c1L },
48113       { 0xbb1041ae95fb9e8cL,0xb8c9f9d6dbd8525fL,0x8658a54f0f5244b2L,
48114         0xe9326e455b84eea8L,0x9ebdfe4f54f11de8L,0x3c90b0cedc740440L } },
48115     /* 22 << 63 */
48116     { { 0xde6973e22683ad60L,0x35fe4650eebceb58L,0xbcdbbabf7c719a33L,
48117         0x8bce8111c076ca95L,0x8f7176deeb6bd711L,0xd04e9769d240a56fL },
48118       { 0xdef7d8fac8e218daL,0x04cff5976df28152L,0x2a1af6e24bd1cca2L,
48119         0x9397014edcb911e2L,0xa251339038677b96L,0x0dc48a8fb61b462dL } },
48120     /* 23 << 63 */
48121     { { 0x42eab6610197a8d2L,0xdc4a557ade082468L,0x4cf68d6090495f66L,
48122         0x6dba8de79032929eL,0x304b38cc827b5d7bL,0x8e57275cf32f5063L },
48123       { 0x4b555a0337280c95L,0x49c1e532ef8ddd18L,0xa2d8eed45459adc1L,
48124         0x2b353217bba3cf41L,0x11f3c90cefe8f005L,0xb3367fa0d55916c4L } },
48125     /* 24 << 63 */
48126     { { 0xe7c396d64654712cL,0x1fa5ea507a26e994L,0xaa98768709012b83L,
48127         0xf1ef9792e9b17e98L,0x2c22bcb06dc2db10L,0xae42ddf6ed4be80eL },
48128       { 0x672080f62e743405L,0xa15a7f975b7821d1L,0x0cd912f247adbf07L,
48129         0x6919c0dcb6c4ae8fL,0x62b13edd14c6253cL,0x66f35919f8032287L } },
48130     /* 25 << 63 */
48131     { { 0xc992f6fe05f3b31fL,0xcdcf59b56a3d4522L,0x69901b3815df24b8L,
48132         0x4b9874029f6153b3L,0xeb09cbc1bca86176L,0xbe78cd7d446289c4L },
48133       { 0xd4aced42b933fd58L,0xe0dc6f306a326de3L,0x4bef32960542a5f8L,
48134         0x3eb8d14106f537c3L,0xbb45a994b6f0d0a9L,0x340c025d3f4a01b8L } },
48135     /* 26 << 63 */
48136     { { 0xdfcb3255fa371ffbL,0x3fb4a22c92bb6b01L,0xd96efc1605396353L,
48137         0x2ce2228ce5d2bc25L,0x59483843212c7eecL,0xdca7173882996047L },
48138       { 0x44dad56d8de87b1dL,0x622f88910b6222d5L,0x1abbc501d5d3a9ccL,
48139         0xdbed73a5ebe52e80L,0xa7f785b1c98c56efL,0xa32471d3d343aeacL } },
48140     /* 27 << 63 */
48141     { { 0x65d39f8ae510cee9L,0xcc60cd118dc5e825L,0x3b6ac6627ed7198aL,
48142         0x5d7fc001f33edc87L,0x0218ffc453e978eaL,0xecb762e57bdfcf16L },
48143       { 0x8e7122047966b202L,0x1c502404e6b99602L,0x0acb73f1131cc36dL,
48144         0x81d1132ed4369a1eL,0xbca89fe8377271a4L,0x1353a883262a2e18L } },
48145     /* 28 << 63 */
48146     { { 0x2713b58c9d628e1dL,0x3729960afaa8ba1eL,0xc3438130ab53bc93L,
48147         0xcef9eda5e9c165e7L,0x9bacd1c3fd02650bL,0xbb300334540ece72L },
48148       { 0x21f5a5d3d9c4f0edL,0x1ba32e4ff7c19269L,0x8f073beb2cf320fbL,
48149         0xb49766c45599646fL,0x68180d6649e4f200L,0x8203d8aeeaeddb36L } },
48150     /* 29 << 63 */
48151     { { 0x7b19780fdbbbf57eL,0xc094d6d9c2207635L,0x241898ac6bb652d6L,
48152         0xb61b25724923ce29L,0x26ecd97508000048L,0xd08c54e5f5f96b8fL },
48153       { 0x19019968c1604cc5L,0xa9940e9edc3f31b9L,0xbad2d245c3614a9aL,
48154         0x7d3cdb2d411e63b3L,0x88d842c3223638ffL,0xbc5427d0cfba2b48L } },
48155     /* 30 << 63 */
48156     { { 0xe6d78b7f60085b20L,0x0aa1d62bf318d226L,0xaaa4391df6461e64L,
48157         0xb15ee4a7213c949bL,0x183f043be4bd3dbbL,0xa1a87996ca49f456L },
48158       { 0x6030ed2ef6ed22bbL,0xa2002784fab7f7a2L,0xfc40914dd850cdbaL,
48159         0xe63edc4c7df80ba3L,0x8fa35ab57b27ddfbL,0x3bdaec795096ea04L } },
48160     /* 31 << 63 */
48161     { { 0xf33cc5ee452881ddL,0x89c144a38966d47fL,0xbfa8395149156a93L,
48162         0x0069bff358707b05L,0x2caf814cca12a0b5L,0x1ea71ce71794450aL },
48163       { 0x08fd2b1c63d22a26L,0xdb08594eb3876737L,0xf459049a57b3669bL,
48164         0xf64ecaeefee0d4ccL,0x9da2177c63f233a4L,0x042fcca84e54f053L } },
48165     /* 32 << 63 */
48166     { { 0xa68295da2caf088bL,0x23d6439a5c8709feL,0x8deba0cffe0c3df0L,
48167         0x5b4d037b3cd00a1aL,0xe9edc429aa0f9088L,0x6f5827e35847def7L },
48168       { 0x9739d03d306ad966L,0x7c6b18afaed51d04L,0xdc3d34ff1759060aL,
48169         0x029e9aa9a7e94dbbL,0x2a3cdfa0f7e8b7f3L,0x42f87bf0bbd8f6f4L } },
48170     /* 33 << 63 */
48171     { { 0xe36941004ef8cf5dL,0xcb4dbddf4d8bb768L,0x0610858e828c717eL,
48172         0xb4cf22cb2bf53239L,0x938e49f16a3e7a71L,0x1dbbb837e73c7a10L },
48173       { 0x26ea3108db1b58d0L,0x1ca340abad2929faL,0x1d4601938ecb1f6aL,
48174         0x060543510424fd93L,0xdbfc403f0303dc50L,0x142ad48dfc0f4007L } },
48175     /* 34 << 63 */
48176     { { 0x8a8258eee6a52970L,0xf2d13a33a3882954L,0xd312768c38d48e32L,
48177         0x78a70e03e9369eb8L,0x02ba8d2b69228d48L,0x7f957a33b3bfeb28L },
48178       { 0xafb22cd20ab2d0bfL,0x335304ccf8cd44d9L,0x0587a6f256009a3dL,
48179         0xc0bc7278023b2530L,0xe85f2ec5f37c6727L,0x045f156003f5a081L } },
48180     /* 35 << 63 */
48181     { { 0x6d71a45274ec55c2L,0x0d064bdfed33da75L,0x1aa4d77ab503afc6L,
48182         0xec08340c5cb136e7L,0xf096fed6ed11d9faL,0xf232d1b82f81e148L },
48183       { 0x71cc9b78ae9b3374L,0xd80ce28668bcc1baL,0xe8f4bd170274926cL,
48184         0xa7ac120f100da329L,0x9f071c6352a482f2L,0x76d85a8e842d6ef1L } },
48185     /* 36 << 63 */
48186     { { 0x516f138bed210253L,0x5ec2fa324433461aL,0x0dbe2c66cdaf1280L,
48187         0x086b91e59fbf3318L,0xfb0223ee399a1ca6L,0xd6f86d9b0db5b20fL },
48188       { 0xec02bca25752d618L,0x952fafcaaf69f3f1L,0xf304cb7533c4d294L,
48189         0x78085727dac65608L,0x22f302ef840a4466L,0x33fb889dc371c31fL } },
48190     /* 37 << 63 */
48191     { { 0x4aa2f1c36abdcdf4L,0x80963f8251da8d8cL,0x5647a356ac008cf0L,
48192         0x40a78c45fc10452fL,0x2a3b9da1ca2d6a31L,0xa4d177760f0db94fL },
48193       { 0xcfd600d9939941acL,0x256e44c142c3fd25L,0x85bccd42ab3f9d41L,
48194         0x83e93e44d018298cL,0x569f54d474a5fb37L,0xad2c613af2ffcf8dL } },
48195     /* 38 << 63 */
48196     { { 0xc63e6f7c22d515abL,0x3fabfef42ad30174L,0xf13a0126b1c65411L,
48197         0xe269e956dce87183L,0x44136834a83e0249L,0x554e731831958850L },
48198       { 0xd287755696569aeeL,0x5af275e9274bf4dfL,0x7056f958197dbfdfL,
48199         0x699f5a672169811cL,0xd9a857d92c1c7c3aL,0x62cf7431843bdac1L } },
48200     /* 39 << 63 */
48201     { { 0x974fcf5529d0c948L,0x104d7df0693c5379L,0x4f851c397dadfb28L,
48202         0xcd5bc87c233c02c8L,0xf7fa16e82c8c1c04L,0xed42de484dc18a19L },
48203       { 0x213db3a5b4366736L,0xf6eb5c9517da3d1dL,0x4d04ef1213b304ecL,
48204         0xba7bd9afaf74e164L,0x956a5f7bab319f50L,0xe733891ce2a4932dL } },
48205     /* 40 << 63 */
48206     { { 0xaa4711f54f890542L,0x862421d9eba822c4L,0x2f667179848280fcL,
48207         0x4de16d87c201ed75L,0xd20e1399c5e61b5dL,0x3f7114b49ed67ec7L },
48208       { 0x561fd4979b5a88f9L,0xb202eb86d84db2c1L,0x67d8fb90c8637d3dL,
48209         0x3d1d78a1032b1853L,0xe07bf775ef1af9acL,0x691e1deea57d6adaL } },
48210     /* 41 << 63 */
48211     { { 0xe236e42b2a6045fcL,0x4a6b7be7613f1c5eL,0x14136ccbf57b1aefL,
48212         0xc3a8a6b9c7b34813L,0x63b0998c5f5cee69L,0x311bfe2c3481a229L },
48213       { 0x4dd2325ff0aba408L,0x1b8a3f739a2fdff6L,0x4845cde0dbafe0d2L,
48214         0xd092bb22cd37b02dL,0x35436f9d600fe0efL,0x63c580cb065f379eL } },
48215     /* 42 << 63 */
48216     { { 0x38f98360f48948b5L,0x1a1d67a97ae3ad67L,0x79966318ab91b44aL,
48217         0xb69a75b8dfea0b1eL,0xbb18e5fa05d4d71dL,0x80a14dfe03b1280aL },
48218       { 0xe549c8f14c17cf7fL,0x91da31098969b5c4L,0x1e3e8f08ccfc1732L,
48219         0xf1cfb3ad0c85444eL,0x6854b52a628bebbeL,0x8a5e2d85075f04d3L } },
48220     /* 43 << 63 */
48221     { { 0xd428f75c5aaa1da4L,0xf192162dd224691bL,0xc30f5ccfd3a50718L,
48222         0x82e2b585e9e0f738L,0xc7fb4dc15cf3fd23L,0x8a52eb37e4e2b37dL },
48223       { 0xd5bb892bf1702cd4L,0x64b8ccd056b92a51L,0x98ab053f8988e2e6L,
48224         0xd56b34022f104643L,0xf09017be073886d7L,0x0283e9eebf6eaea0L } },
48225     /* 44 << 63 */
48226     { { 0x834701da3801c65dL,0x5bb35c48955aa27dL,0x0ef0f375db7ad387L,
48227         0xd25e337f06cd1d53L,0x757a1f9d90cd91deL,0x1604f153d61bbd60L },
48228       { 0x6a01e8cf8bb95dc4L,0x34b7be6275bbdb13L,0x0a96b3a121e9b029L,
48229         0x25615c3b2946df44L,0x5eda7d1919d04842L,0x08317975fba84668L } },
48230     /* 45 << 63 */
48231     { { 0x4a4dd7bf2bb5fba0L,0x0ebc07f3c84c2304L,0x054f2e448daa5099L,
48232         0xbf8949da3ec362f1L,0x2e4a677c1d7d73f5L,0x405e3ad24dc70fbeL },
48233       { 0x2958e956c7e46fb3L,0x34e0d7f1b2522e5dL,0xc44b95e25e371e3dL,
48234         0x62e348a4d91baea4L,0x8d9e89e24c09e110L,0x8cb886f6b1c1e356L } },
48235     /* 46 << 63 */
48236     { { 0x66b16f6033e8683dL,0x3435ab2560b41c5eL,0xd5b89f51d452e049L,
48237         0x4b5253a73aac0092L,0x01cae436f9d2e2c2L,0x789de14637e8ce97L },
48238       { 0x8f50541701a1c2e8L,0x8c77dbdd798a8404L,0x5a264906b6e91e68L,
48239         0x36761ccc3c6aafe2L,0x5809baa37e50f9e7L,0x0b50904e28fac969L } },
48240     /* 47 << 63 */
48241     { { 0xb6360372308785eeL,0x0c9913a68cf10e55L,0xe82b0f470e67c99aL,
48242         0x0bf2d24825399082L,0x7aa3edfca86fe16eL,0xf534ec4e731a4956L },
48243       { 0xb71d5d4eff26e993L,0x320eb7ac7bd58ef3L,0xe5e4c5f30cafd658L,
48244         0xeb6b8e0a21a06cedL,0x037d0faf6f76acb1L,0x39c76a6ed6f13f81L } },
48245     /* 48 << 63 */
48246     { { 0x12474bd8a55a3a4dL,0xe326aaf19e471af4L,0xf201a9308caadaa6L,
48247         0x546821f835304341L,0x7fe452c3088353e1L,0x8f1ff628fc82566aL },
48248       { 0x49526f46d99f8967L,0xb19c80c0a4009690L,0xeccf97591cbc0716L,
48249         0x2e13ae2caf4cbc8bL,0x12b0df13f32e29adL,0xa2005d6e0b1565f0L } },
48250     /* 49 << 63 */
48251     { { 0x9260321bde788968L,0x4aaf1752886ccc74L,0xf94ae636c06b1d9bL,
48252         0xf0c858854954ae43L,0xaaa735866c42a104L,0xcab59d914e782db7L },
48253       { 0xfd12f9ee01ff3a1fL,0x35eb6104b546d3c5L,0x97d839e075ca1425L,
48254         0xa77712f452428003L,0xf5dda4e8bd9f30e2L,0x0c3ab97091d6f540L } },
48255     /* 50 << 63 */
48256     { { 0x58734b3ca68716ccL,0xacdcfdd2acfb5719L,0x97074bac7084cf23L,
48257         0xf8d4f285d0c81b66L,0x5ea926e2ef541e44L,0x65a8e25da2c04e0fL },
48258       { 0x67e2380f06258485L,0xdc00f2ed9691a57dL,0xd37b23fd6b80274eL,
48259         0x57f1604f2fe10aecL,0xcc21a4aeffb33ceaL,0xf33a344bf75eaa02L } },
48260     /* 51 << 63 */
48261     { { 0x24ca6fc56969f55cL,0x6fe18be29a7a9753L,0x5e9a7ed36af8da90L,
48262         0xf6c261b7ed493388L,0xbe9ac24beef2b77fL,0x0357ab559f244e49L },
48263       { 0x5f7953375f1b5b9bL,0x27dfdecaa9bc503dL,0x0b2091b55c0e3ee9L,
48264         0x1f4f7866d68cb87fL,0x336c2c127a442a9cL,0x88267fd1d3f2ab78L } },
48265     /* 52 << 63 */
48266     { { 0xdb891eedd06014e0L,0x69685d6103e9970aL,0x3a612db402838113L,
48267         0xc1cd7b3adcdef0b0L,0x612b299da41d6c1eL,0x982161ed0ed386a0L },
48268       { 0xb36bbe2f3ea1bf1eL,0x0d8c3752ceb2a5ecL,0xc02cd7f6ec03bdddL,
48269         0xa87977c152631d9eL,0x7b546cc37e398d7eL,0x5b1218a804845671L } },
48270     /* 53 << 63 */
48271     { { 0x52cd86c68a62f0a0L,0xc437c2af4d29c896L,0x722a337a45aebfe3L,
48272         0x03b13844d8a9de8bL,0x41a005bb8510aae9L,0xf42399ffc63af92cL },
48273       { 0x004d29cfcd93390eL,0x472de98741dcfa34L,0x2c71ae744e7cdcc4L,
48274         0x11a5c2f8409816ccL,0x320ca246a96cef60L,0x72de4287f3d57621L } },
48275     /* 54 << 63 */
48276     { { 0xe3e7a3eb3771a0aeL,0x781156e9b6dd5304L,0xbaee3a8323e31e6aL,
48277         0x66d1569a08985bf0L,0x56161e202d75cba3L,0xf9c23c102a944de4L },
48278       { 0x27ac8f454e129ea5L,0x8b991ba788050aaaL,0x600c96ffa5d052f6L,
48279         0x0fbe944df244984bL,0x3801026fa204c36aL,0xc4bfa1994d55a584L } },
48280     /* 55 << 63 */
48281     { { 0x11b200c6a32f5c81L,0xc4ab4cf43eabe341L,0xa21468f06f339f5aL,
48282         0xf20c2c5a729438aeL,0x3e68031e3a067c3dL,0x3962a92f062c8371L },
48283       { 0x389b22835b000f3dL,0x98f3b679250b8666L,0xe283c2b4eea91464L,
48284         0xd35b14de1e1f4c08L,0x9ae72567d79d8683L,0x2c37b162a3b2a840L } },
48285     /* 56 << 63 */
48286     { { 0xfa3e43e56cb173d1L,0x2502258d4591b5a5L,0xae8c4b558ca9682aL,
48287         0x8cb1ffb4ec81a288L,0xd11ae888bfc84fd1L,0xa3b083a0d774577cL },
48288       { 0x119b41c11da9afc5L,0x44bc77622934e22bL,0xa04694f37c639d6cL,
48289         0xd5e1ce5732c5b8eaL,0xd507c39b9749e8b6L,0x16cc0b5755255b63L } },
48290     /* 57 << 63 */
48291     { { 0x66fe7a39c4955e7aL,0x25b0b3e5bb11a1baL,0xb82c2cdefc573bf3L,
48292         0xed33c0e8281a3927L,0xd068c8901ad799d4L,0x052801ec9cbc73edL },
48293       { 0x614e4aba0faf5c5dL,0x50d7b0a89f66d391L,0x7bdfbf5fc18e88a8L,
48294         0x1fc93e1f4380d2a2L,0x8241dd5f27d952d0L,0x44944d9c3a3f79d5L } },
48295     /* 58 << 63 */
48296     { { 0x808e2693c0edcf36L,0x4725b5aa87c254c0L,0xd1e464644d317973L,
48297         0x3e59efc2393049d2L,0xa4c9f340d3e0d17dL,0x69b40727abdf3022L },
48298       { 0xa1d85395317058c8L,0x2cec2a040cfa7c13L,0xe3c16f7634236cd1L,
48299         0x566b403a3e52fe3eL,0xfd6065bdd6923cb6L,0xe769a89a5019f94eL } },
48300     /* 59 << 63 */
48301     { { 0x9b1f6e9042a1cce9L,0xc6c870270511f865L,0xc924caa72a3c29f6L,
48302         0xcb674fb068e604f8L,0xe997b0b8330c2dedL,0xf5b315a04ddab219L },
48303       { 0x6fa1dde6575d3ac3L,0x32ad27f735e65e56L,0xfe723ec2e81b1ce4L,
48304         0x149983f8985d7286L,0xa1d350a0492ecc9aL,0x12a51f8c36a0707aL } },
48305     /* 60 << 63 */
48306     { { 0x71e5df78614f6f37L,0x5cf0e08da0b80beeL,0x1f8dae171e32051fL,
48307         0x54ae365d83bc233bL,0x97ea005b1b84aaa6L,0xf4766d9264c75139L },
48308       { 0x9b93bbf241215701L,0xb18f042d8cf8a865L,0x5dfb96dd0867556fL,
48309         0xe9fafbb8597fd6a1L,0x729b2f50fe48bbc6L,0x2cf85f6b7f37ff9bL } },
48310     /* 61 << 63 */
48311     { { 0x3e7c871024d197f2L,0xb635595bafe9c29cL,0x302f4fff194e084cL,
48312         0xd497ce7c18edf332L,0x4081c7aa062672a4L,0xe886a5b28afa97daL },
48313       { 0xa7e922b5786e1bfeL,0xabd9a18bbd7ffb7aL,0x1f4f5b9356341b58L,
48314         0x1726484344969ab1L,0xc4a0b557e668a479L,0x5ad1c062bf4f3343L } },
48315     /* 62 << 63 */
48316     { { 0x4ff86eb693d2b958L,0x4513fe1b784f628bL,0x45f4712573b5bb80L,
48317         0x25aa3d36c987bb15L,0x12b1e65bb48163f0L,0x9d0cb4aa9801592bL },
48318       { 0x02c0c2aa3718bc98L,0x79b03df99c306353L,0x097d8d8daee5144cL,
48319         0xebed60774621d7abL,0xa8edf06e4b52e72cL,0x40c86f181dbca7d2L } },
48320     /* 63 << 63 */
48321     { { 0x65c7144a5e84482aL,0xba6f92644d4f7553L,0xf4dfe807d9c2524eL,
48322         0x1333dd7c054403b1L,0x44557e880156451fL,0x5dbda4d80824c813L },
48323       { 0x59e204959857fec6L,0x42f4068f1b1eeb99L,0x067c3aa21d59bde9L,
48324         0xa9c4c3eeef27419aL,0x99fc994b2ec87652L,0x4f1607581578a996L } },
48325     /* 64 << 63 */
48326     { { 0xcd8c2ec9378ef62bL,0x7f4a3c5491a7c4b9L,0xe12386d4db83e1abL,
48327         0x9a792032bb549bb5L,0xaf81cba62807c0f1L,0xd4ad7d87abf2008eL },
48328       { 0x9d7a72307e9ad6cdL,0xb30636b08b517b2aL,0x47c324daec900516L,
48329         0x408cd0d37193eb30L,0x8f0bcce2d315c655L,0x540ad4e0869d6c22L } },
48330     /* 0 << 70 */
48331     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
48332       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
48333     /* 1 << 70 */
48334     { { 0x4b5e753ddae0ff8bL,0xe55c83e4da3d97b5L,0x4034d75f42fa905bL,
48335         0x89b85edac33e462bL,0x31f413c3058de3bbL,0x66c01c806ba75391L },
48336       { 0x3f500202373e28deL,0x5090b33b4b9be739L,0x7297aa10efa2adddL,
48337         0x3e8ccdbe1a6566aaL,0x4dfda07fd7b4f214L,0xa659bd1e7cb1cae7L } },
48338     /* 2 << 70 */
48339     { { 0x31796c2387d11691L,0x02991ea2a9de506cL,0x4ff0cb716cb0c301L,
48340         0xdd0cdbd7d1702ca9L,0x470a26c8e1a02a90L,0xb705b7bad7054625L },
48341       { 0xfadc2e86d4a1a268L,0x0fd9764668e9f923L,0x042b5ebb2951a8feL,
48342         0xe4af9d0364197a76L,0xdd2c6bb3249c1b5dL,0x60af89bdf01932b1L } },
48343     /* 3 << 70 */
48344     { { 0x4374145d41afcd64L,0x98b72d6049d21198L,0xc0ff394bdfde8a41L,
48345         0xed1112e5ee1ff7a5L,0x87a920e8cb5036fcL,0x437123f62deb225eL },
48346       { 0x37e527afb9ad8c58L,0x3e3c9998abfaef38L,0xb656bcc550b2b4e2L,
48347         0xfacc8a193bf5699dL,0x98cec74fe616307aL,0x34af333dd3ef8babL } },
48348     /* 4 << 70 */
48349     { { 0x9ded9b0d744ec273L,0x5bdfe5472e79e4d5L,0x94f3aaf539393728L,
48350         0x22136862a438413eL,0x449286da373c7de3L,0xa709d85d29aa1540L },
48351       { 0x1bd13e410284a4f6L,0x37b54d69f0799c8bL,0xd43b558f6bcd0cb2L,
48352         0xf5757c0e9e610369L,0x15c80b23c16e0651L,0xacb2cf64001820aaL } },
48353     /* 5 << 70 */
48354     { { 0x0629e4ddeec37f48L,0x3f7556a2da7de716L,0xcacd8f27661662bcL,
48355         0x65d8bc2ceaf01690L,0x83ac66477c39c893L,0x353f60dbf59440e1L },
48356       { 0x2597b0d6852c575aL,0x410885f73a40c2b3L,0x953ab3472fcc2488L,
48357         0x9f753e5eef4cc6d8L,0xfc32bb4d97f69e63L,0x461c1b0c87e8c264L } },
48358     /* 6 << 70 */
48359     { { 0x2bea7e75ac4b62f5L,0xcf255dcdc6297871L,0xdd88db8781b25c72L,
48360         0x77ad90b3b617dc04L,0x65ee13820ed4a7d6L,0x4c08df9cd9644c8fL },
48361       { 0x072d3784525a023fL,0x1aef69cefce399fbL,0xb07fd78ed7f29044L,
48362         0xa3754e1443043fa7L,0x97bdae92ff9fe4d9L,0xad63ba6a700fe6b8L } },
48363     /* 7 << 70 */
48364     { { 0xa571929ba1ca17dbL,0xce7a12f545e146b8L,0x39df1446d9eb426dL,
48365         0x1e48b3f8dc27f268L,0xa2d7dfa1ff548455L,0x750068b86ef1cc82L },
48366       { 0x4d699306667fce62L,0x98540b9d131c5412L,0xf8a62cd347c580b0L,
48367         0x2b55460f73795005L,0x3206c0257b8db337L,0x2280934bd0dda5a2L } },
48368     /* 8 << 70 */
48369     { { 0x10a8aabd2352478cL,0x599d9dfa1364c40fL,0xa009df1a076945a2L,
48370         0xf869152c03861f02L,0xc405226e9f866a3cL,0x93bd737d8b41ecbbL },
48371       { 0xb5c9ed1033901eedL,0x90e4ce8f99312b80L,0x1a9ef22e57589279L,
48372         0x83ef607d7fe2d6aaL,0xf2da84543473dbfaL,0x14f36d3a57879066L } },
48373     /* 9 << 70 */
48374     { { 0x2c780f220ea3ce34L,0x240a211e4b8aac72L,0x7a266e5dc2625a99L,
48375         0x1cb15d3e3b30c878L,0x8cd8ccab0e1b21d3L,0x53c64279adc1a6b3L },
48376       { 0xe60d15b960bf708dL,0x6e431c1b0cb5ad4bL,0xec874c3e82033111L,
48377         0x88054a1d9141eae5L,0x98438a5addf53a28L,0x168f0b0ffa12c657L } },
48378     /* 10 << 70 */
48379     { { 0xd621ce26629d7a57L,0xbf571de7cc1f8af1L,0x2c5cfaf9304adaa3L,
48380         0x950addbd3f283b49L,0x622dc27cee6d1cd1L,0x26d920041f0863fbL },
48381       { 0xe243b2a2a41ec585L,0x0dbd9adf2bea6235L,0xcb083c4d6f0820f5L,
48382         0x809ecbafd5493931L,0x9647067414b7ffa8L,0x2cdfe22e53fc2224L } },
48383     /* 11 << 70 */
48384     { { 0xc8b1333c7cd74a06L,0x7d5ac4dc271006bfL,0xe9377d9fc14e0e56L,
48385         0xaa8651db7a92ab1fL,0x77cee8145fc11fb5L,0x1e7c5ca027870b14L },
48386       { 0xdeef4b3f6f959698L,0x7c59f26e5daa9bdaL,0x4d0d5aecfd312368L,
48387         0x5247a6f3b738de68L,0x1c4e8ba990c04807L,0x0554b41bcce126caL } },
48388     /* 12 << 70 */
48389     { { 0x3df98ea9a81cc26aL,0x982ed56883b2c6f3L,0xc9cbd1b5ea6d6976L,
48390         0x3f9f23197e25ffbcL,0xbca8e0567da6280eL,0x7abd316635cda713L },
48391       { 0x46ef321d740ae011L,0xb17f6c75db214a33L,0x37b73b4b51de4044L,
48392         0x5bccf3ccccd9ba8dL,0xa2ca080dd0f7045bL,0x79caf90668cf4dccL } },
48393     /* 13 << 70 */
48394     { { 0xcc3605a9a7b07d22L,0x4370eb18b4ebe4e7L,0xbe393039248867c1L,
48395         0xc8e4851ecb1a75ffL,0x215f3fbe39cb6da4L,0x6f2102eee41f9a34L },
48396       { 0x61d484abdfae7c27L,0xf5143bd26f1260fcL,0xa70b6c067514bcccL,
48397         0xe71ca833d23506f5L,0xe2f50ba8eae03a8eL,0x2ac3b50883c33359L } },
48398     /* 14 << 70 */
48399     { { 0xe94b930f3655cabdL,0x6ef6aac4a342443cL,0x2feb8005bae255daL,
48400         0x4625a15cac6e2095L,0x75c6311d0ec76c1eL,0x896a07409b81c6f2L },
48401       { 0xbad3e2f9073378bbL,0x2984a10629266ec0L,0xa68a5351a788010aL,
48402         0x321aa113017cd052L,0xecfb61752f34db5cL,0xfe080cedca2b51dfL } },
48403     /* 15 << 70 */
48404     { { 0xba29690803360c88L,0x3fb087c036311812L,0xec5fb10ad9ff6a48L,
48405         0x52f7077f207dd8e1L,0x8e65cfb844c02fbcL,0x4f4fcde2fbf4bfd5L },
48406       { 0xd1ff54156cc74320L,0xf989d544f68b036aL,0xafedc2db973bd9beL,
48407         0x7bdc35694785e26aL,0x0df36796751ae9baL,0xfebde691ccdabd95L } },
48408     /* 16 << 70 */
48409     { { 0x3499b44bc77488ccL,0xde000e01aa8f3c10L,0x30140406c1f517d7L,
48410         0xd4b3c8eb82a174e8L,0xc8835b13af2c9b3aL,0x2cd7626e443716f4L },
48411       { 0x336c4f4b9c22de71L,0x9dd2b277f2529f60L,0x6ffba2dc828c34d3L,
48412         0x257a345c34d0d1f7L,0xbc1eff056ca4fbceL,0x05b335620768349fL } },
48413     /* 17 << 70 */
48414     { { 0xb142febb692e076aL,0x10cfaa6b9a654721L,0x5b7ba30c8d4917c1L,
48415         0x44be3089dfe4056bL,0xb7530ae6ae6307f4L,0x47c519c45b5f381fL },
48416       { 0xa80648d8c3078009L,0xfde72e30dcb021b4L,0x8a89a51bdc2659e8L,
48417         0xb9e0efa6306adefcL,0xc671c060c754a7bfL,0x703c698e18f14248L } },
48418     /* 18 << 70 */
48419     { { 0x25c86ad43c47783aL,0xb1f94a9650f85a4dL,0xb9472e3ac023a02fL,
48420         0x91033d1b26f0fcdfL,0x95d775c1ab7b4ee3L,0xbe17daffdf3a5cb7L },
48421       { 0xaeaecd2ce78395f6L,0x0e3abb0953b5da8cL,0x5f729f858ee774afL,
48422         0x1acccfb3aeca7a6eL,0xd066fccb37e4af11L,0x24c832ab84fc3259L } },
48423     /* 19 << 70 */
48424     { { 0xca547b680ca4864eL,0xea40fe17c7d49f27L,0xb5e68bab87227475L,
48425         0x6ba2bfaf8ce485f7L,0x4d2747acb72684f4L,0x5fabffc670aa6087L },
48426       { 0x2d4ded5679c67c9dL,0xaf3b4eedc8a4f22fL,0xbef6128ebfa6ca86L,
48427         0x7ce412bbd4381632L,0x518e6ecfe670d99fL,0xaba6518dfa5f426bL } },
48428     /* 20 << 70 */
48429     { { 0x5ebdc79cd41b2401L,0xf0cd8598c498e0f1L,0x93f6efe79c8b7f7dL,
48430         0xb2f1e40ac469aa57L,0x882f0e943433c455L,0x0add72adaea0712aL },
48431       { 0xb13578c399af96d0L,0x43c28dc621177663L,0x83aca2d854e09133L,
48432         0xae03943cc6ad8532L,0xce0a61917104f75cL,0x7dec8786f9838c37L } },
48433     /* 21 << 70 */
48434     { { 0xb0b41b8ec5abaef9L,0x43f59aee8ff5d1f2L,0xe58f78c9234d3d34L,
48435         0x0e1948d029a7f49eL,0x722f8e54c6cd8941L,0x75a4ebcfbaf24424L },
48436       { 0xec8954982d7dc6d9L,0x8df2feee5261e4e2L,0xdf2820b825dfb96eL,
48437         0x4b89c4dcff651949L,0x27c871a527bacbe1L,0xfdc70cf7329a52bcL } },
48438     /* 22 << 70 */
48439     { { 0x37d58766fdb3f3fbL,0x49d9a762ad64fa66L,0xf80423918cfdbbc2L,
48440         0x22e60ca36400f7eeL,0xfab8ea7568210629L,0x91267753963e5b6fL },
48441       { 0x5988d7f56b8e7ec9L,0xe43e762a5899e718L,0x842dbdcc40ae8b99L,
48442         0xa7ced3f19869739fL,0x1ccc1e8a6d54b9f5L,0xaa3a91adbd32e710L } },
48443     /* 23 << 70 */
48444     { { 0x306d662c6d4c255fL,0xf32aa48101fa367cL,0x29a71e02f16b3197L,
48445         0x653f7d88513a6079L,0xde93d6e74541b4adL,0x4d284acd8c54d3b1L },
48446       { 0xfc9d462be106ed07L,0x6e3818d07e355468L,0x2ad523859400c515L,
48447         0x287af41d5ecd3b52L,0x1162162351e1fb02L,0xd696d01f17bd4584L } },
48448     /* 24 << 70 */
48449     { { 0x9db114e3715aa8daL,0x596c2dc25c2fee22L,0x04df016bd2f3080eL,
48450         0x0cb3f7cfb9b72037L,0xadb877c7814fe2abL,0xb2d5ec5c37761ec1L },
48451       { 0xb5d6068e55d45831L,0x5fab1dffb7c52c04L,0x39b4aa5457d36d41L,
48452         0xec1de467423cc8cbL,0x280e02dafda6566dL,0xc70c3c383ca55f55L } },
48453     /* 25 << 70 */
48454     { { 0x27a866e7c6b03391L,0x980b0a42bfa32fc0L,0xd27856910c105df7L,
48455         0xf3def8c77103a2b3L,0x6c4ff04bdffea913L,0x57b1003e121140ddL },
48456       { 0xf47bb2826d0e3170L,0xa44d6ab1e6abdfedL,0x67114b8a2a4b69d1L,
48457         0x7605714d52d7c65cL,0x3734795ef60b81deL,0x277f9816ebf91959L } },
48458     /* 26 << 70 */
48459     { { 0xe57c2ed902b3b70bL,0xcec67da99dbc076aL,0xcaf66725b0644881L,
48460         0xdea4f6608a3a3f96L,0x5215f097609df5ceL,0x6d828267010193e3L },
48461       { 0x5971ff31a156565bL,0x44f7e4037b64e465L,0x2145ea9ab5486d75L,
48462         0x47b04066758e7ec5L,0xc181833a9c93cbe9L,0xcac07a9fe8443292L } },
48463     /* 27 << 70 */
48464     { { 0xead7cd3d041326e8L,0x721785f26092e605L,0x760864024ba91a6fL,
48465         0xb7b9b9fa335e8522L,0x6ba9c85387bb3ea9L,0x9c9f1f6f89b2ae0fL },
48466       { 0x952bb995aae2014dL,0xf8e74d80c538cfa1L,0xb21ca840b55b7e72L,
48467         0x22565ec4ad982191L,0xf9547aa1f569c537L,0x8d3cb14648596bcaL } },
48468     /* 28 << 70 */
48469     { { 0x340d77c2f3b6cbc6L,0xe09ae22c80f4f690L,0x3e915b028b74d32cL,
48470         0xae7101ca3cc1117eL,0x3c36152b526c5939L,0xdad8aedbd3ec0caaL },
48471       { 0x34de058e351bde13L,0x2fa75fd4582726d1L,0x27c030efc214ac0eL,
48472         0x2a216d1cc7100acbL,0x3b730043309097b7L,0x162ada747afd8aafL } },
48473     /* 29 << 70 */
48474     { { 0x43893d328c216eacL,0x475a3466349d7334L,0xf9f259866114fbc4L,
48475         0x96a22d2f0410b54eL,0xc60b69a53f3d951aL,0x152416e7fb400ddeL },
48476       { 0x3904dd2e8f682dbfL,0x5459272368383eeaL,0x0092554ee8c998faL,
48477         0xc80f28512c602ce9L,0xab2f8533b197386fL,0x8c302dbc91094b32L } },
48478     /* 30 << 70 */
48479     { { 0x853d994eea2026d9L,0x18734b04a1b927d7L,0xd4815747ce88d009L,
48480         0x0265742f01b856bfL,0x05fd8b1e205d4e15L,0x0f4c8be0f1da4808L },
48481       { 0x2652b76c456d62abL,0x0d3d1a29cbb8d818L,0xf350487453048509L,
48482         0xe393ef54e89ae4a5L,0x19ed8f0cc4b1306cL,0xfd72388da1aabd6dL } },
48483     /* 31 << 70 */
48484     { { 0x8a7e1494289e6aa7L,0xc69223e65c955385L,0x2bcbad5c087b8c7aL,
48485         0xc08008a531fed020L,0x9d38f5b2dc117c3bL,0xd84158bee4ad6b36L },
48486       { 0x2c2583eb92fe5b21L,0xebc847bf557ce949L,0x4c1b54ff4fc0fd57L,
48487         0xe437eba325ff2f8cL,0x79a4c3cb383caa3dL,0x38a34856e08356edL } },
48488     /* 32 << 70 */
48489     { { 0x5d7afe9a10fa53ceL,0xe2415b501ff49021L,0xe39a067dc6523492L,
48490         0x3458527527557f5dL,0x756b8d86930e9f9dL,0x88df6219040d52d8L },
48491       { 0x606eb60b5362b045L,0xd179818c9e383cbeL,0xa6215748e068d293L,
48492         0x73fbdca22fce158dL,0x9cfee07dcb183c8fL,0xc0bf2beba5e03c98L } },
48493     /* 33 << 70 */
48494     { { 0x36702d091bf9acc2L,0x1efceaebc9c9dddfL,0x31f9f5599b9afc1aL,
48495         0x359d4ff33e61a0e4L,0x33b3a707f3772327L,0xd990af318ac1c7ceL },
48496       { 0x5ee060b7e736ad45L,0x83dbe8b2f653ac2aL,0x30a1e38b407f054bL,
48497         0x0ec6c70bd9326ac9L,0xeb37ad09d7358ab4L,0xaf36143030551ef3L } },
48498     /* 34 << 70 */
48499     { { 0x7b05d8e56edd5c74L,0x268edfac5443acbdL,0x73e0d693ce1ee52cL,
48500         0x67c67914120a1270L,0x54a897cb6f1c5007L,0xe817914a8d540dbaL },
48501       { 0x85c1fa1958fc091bL,0x4f4989f4cf2698feL,0xbb2d5091168c08b4L,
48502         0xa6143388768cdd46L,0x69ec7a265e62ddc5L,0xc08749ae2654f4b2L } },
48503     /* 35 << 70 */
48504     { { 0x0a9882b37409bdbeL,0xfad3899cf8b6543eL,0x01c183f9f7e9893fL,
48505         0xe6438cf708ac9a25L,0xec22dc81aa0f2794L,0x3b641c02aa277a09L },
48506       { 0x686b1fbd0975c891L,0x4f7e1b680070ce2bL,0xdc343dd7487e3f1dL,
48507         0x8825d9c230f35abaL,0xda5a77a413b91384L,0xf09d958459e405faL } },
48508     /* 36 << 70 */
48509     { { 0x76b242b31cf2ab8eL,0xceb190e697edb12bL,0xd39b41b7089fc439L,
48510         0x6ee54e750892be51L,0x128fbcfcde414849L,0x4462539007fce5faL },
48511       { 0x9d12e04513709b9bL,0xc2c49737d95b22a3L,0x0bcd670be4b34d6cL,
48512         0x78d7b8cd768d7c8aL,0x7cf9382e16a0f402L,0x9b84311d17238fa2L } },
48513     /* 37 << 70 */
48514     { { 0x6b7faaf8c19b849bL,0x24aa5d54a5bec317L,0x991aeb14e7c06172L,
48515         0x52dc7da883e65aebL,0xda8998497696dd56L,0x3844a54e94cea131L },
48516       { 0xc9fb72ac55f69169L,0xe2f7bfc821893ab6L,0x44220c2edc4057f9L,
48517         0x9f4f0c3812d5fedeL,0x5725b2b05c913be6L,0xfa08c56c02d8668fL } },
48518     /* 38 << 70 */
48519     { { 0x9aff9f0c009b3e1dL,0xed7936d97a3c8c8fL,0x0bc8e46fdefbd340L,
48520         0x7b508ef231540ba4L,0x9bcd9108005388f2L,0xa25cfa07c089f35dL },
48521       { 0x9ec7cf81733bccfcL,0xf8a1993a249006d6L,0x1e68981a96d81923L,
48522         0x27b6199adce834d6L,0x2ddccfcfacffb035L,0xf62d7a534fe0126cL } },
48523     /* 39 << 70 */
48524     { { 0xc800c1d5af76895bL,0xc86db45c43f2a94eL,0xf77322fbdbb144cbL,
48525         0xb2607dc8f7da8df6L,0xaf666055b6cc1047L,0xf1db6416375619d4L },
48526       { 0xf6103c8c4b0fbd9eL,0xea8e979fb4f5b85aL,0xb0307d41fd16f61eL,
48527         0x26bf96c58cadf61eL,0xb56c53a3bd348a61L,0xd1a5aa4f8a01388dL } },
48528     /* 40 << 70 */
48529     { { 0xa29d231edda802baL,0xde8d0d510ec3c1e2L,0x0ee56eae117033bdL,
48530         0x4dc9491998bf860cL,0xa08919cd775cd56fL,0x609a30dc1332bfc2L },
48531       { 0x2c337f181a41db0dL,0x27fb0072c974824bL,0x34292c1bfaf28976L,
48532         0x242fcd73ef8c4fccL,0x553723b27473c603L,0xb2191ee9a06a0bc1L } },
48533     /* 41 << 70 */
48534     { { 0xd10b7b7c10bf3427L,0x16f9ebc505321572L,0x057692f6db5fde44L,
48535         0xf45d4d268f047704L,0xe3f8784e25584db0L,0x753764cb9f548980L },
48536       { 0x4239bd4858f5360dL,0x9dc993da98296063L,0x0fbb0c419ffd05b9L,
48537         0xa6a87d50610c3493L,0x99f5669df10f18abL,0x5a03f02ba4224a18L } },
48538     /* 42 << 70 */
48539     { { 0x3c6839e5bf733207L,0xc2f380899c6d106bL,0x43155630e39a7559L,
48540         0x28d6cb546f2b8d34L,0x19738cdf09183c75L,0xa71ec595dcee5a08L },
48541       { 0x8e9c1cc3c70db659L,0x1333d7b38beff6a6L,0xb263d91e036a5aa8L,
48542         0x72728714ee4f858bL,0xd65fcffbb885ceecL,0x08193f585aaaac96L } },
48543     /* 43 << 70 */
48544     { { 0x264006e1b53b4c8dL,0xd3748c0bdea2f9ceL,0x019408d34e580011L,
48545         0x381bcc70b1342807L,0xb904a17191eb1a0aL,0x13ddf3af6151a1cdL },
48546       { 0x13827129bc228909L,0x3378b4834cdbebd9L,0x25806f7ed56635c1L,
48547         0xd1a3fb1c54327e55L,0xb2b8895c69d94817L,0x0779752d7150c16cL } },
48548     /* 44 << 70 */
48549     { { 0x228437506ce71a1fL,0x39c6fd9abf0956a5L,0xd34a4be8c8d29ce5L,
48550         0x41dc15356fbf8fb0L,0xdce277034c950de0L,0x1ad7192f90c75c28L },
48551       { 0x5b3df71e27766767L,0xba85ec629ca80b5fL,0xfadae6e5095938d8L,
48552         0x5ce3ffc24d286159L,0x60f771fdc7b977e5L,0x7a764991b38c0c70L } },
48553     /* 45 << 70 */
48554     { { 0x3e4440b7469f6406L,0xdba02dea247657bcL,0xa551a570a46227e5L,
48555         0x278bd5a06e58b15cL,0xbbc5f8edc53eb694L,0x50e6bf5b855a2c7cL },
48556       { 0xa80af271d231f3b9L,0x6c22008bc139b010L,0x04e9a337ba1e27e1L,
48557         0xcfb75909677a28ccL,0x95c59b55f967af35L,0x70d24fe88d3c6ddbL } },
48558     /* 46 << 70 */
48559     { { 0x0117cabbaedcb5a3L,0xb70a95d52e7bc67aL,0xdc2e07d1ad7e7cffL,
48560         0xf507941825b9a6b4L,0xf953a962bc8b2f61L,0x390a630d181fda94L },
48561       { 0xc833598d1fbdd233L,0x0213e633ac4763dfL,0xe822febbcabd2713L,
48562         0x522864e71d2a409eL,0x49d778a81f904f3aL,0x0dd980e15912be0aL } },
48563     /* 47 << 70 */
48564     { { 0x97f993f46621ff1cL,0x3bdcc1ea7d30ef87L,0x931c624585386384L,
48565         0xd17a7b6a8cb593e3L,0x1b25176da0912f55L,0x323cf7ac2faa4d72L },
48566       { 0xababa6c58683a7f8L,0xa99ebbda4a71606cL,0xb5375f6b0cd8fd0cL,
48567         0xce43e2e08ae372b7L,0x957af3cb9e69c105L,0x167c4fca772d0c74L } },
48568     /* 48 << 70 */
48569     { { 0x0934812574503f05L,0xcd6a64b217bf8ab4L,0x791e72fa1fd4057dL,
48570         0x033abed8f0697964L,0x1085ac930d58690cL,0x8acd49d69c8874cfL },
48571       { 0x929e4c39ff1a5286L,0x9704e80ff28395abL,0xfa69fce54c3d9f8dL,
48572         0xdeb56555fc83a6c4L,0xd375fa037dc04c5eL,0xab2f12f156a58cdcL } },
48573     /* 49 << 70 */
48574     { { 0x381d144f8119fa7dL,0xda3aa4a73c6cf64eL,0x3db4cf0a74cc1520L,
48575         0xe8148941c1cf3514L,0xbc6c7398a22977daL,0x75e26d4982bbdc63L },
48576       { 0x17a626a4c9594c3cL,0x766fc21a60d71273L,0x547331241c7653a3L,
48577         0xdbe3a9f1502617a8L,0xe41acd19a33d622dL,0x4d24cbd5e15d69d6L } },
48578     /* 50 << 70 */
48579     { { 0xdde0a062dbbb9d08L,0xb5676d14153211e7L,0x747247f6f97b1468L,
48580         0x93a6de79b2ada501L,0xf9d4e652518ce913L,0xefb0de76702b82fcL },
48581       { 0x2c54ffd9d68961fbL,0xa6a2d1a384f04f81L,0x88167488d74b91adL,
48582         0xf20bba56a7d73a78L,0x9af1df5ae1afc672L,0xd79ded4543c26afeL } },
48583     /* 51 << 70 */
48584     { { 0x24011535a223c19bL,0x38b55f0a19c719f3L,0x369f86b4d343ce98L,
48585         0x6516fca318288db7L,0xad32d4699e4aa0a4L,0xb6c80dd50480429cL },
48586       { 0x890d73f3b659b787L,0x2d1f888be15362aeL,0xd26a84bf7a9d8c3bL,
48587         0xd79b764460bc6435L,0xecd0272f07b0abadL,0x3ab2390382d7c63cL } },
48588     /* 52 << 70 */
48589     { { 0x3ec1874496d87afbL,0xb02425b5aeea74b1L,0x47cfacea954bb89eL,
48590         0xd8d6ff40cd26918aL,0xf2dbcbb19fd4dea6L,0xc481a4fe370fea30L },
48591       { 0x60df9f99a334a5a1L,0xeacebd61e6fbc823L,0x21932e6ba0140a5cL,
48592         0x6504deb051206cceL,0xaa4b43a350560eecL,0xaf965e7b6535123bL } },
48593     /* 53 << 70 */
48594     { { 0x25ce17e7be01690fL,0x82bd07fc216f7549L,0x26f98cddac6e021cL,
48595         0x815367ff3403972eL,0x01b1cf87cd89d71dL,0xe777db14ae24f544L },
48596       { 0x8081a692f628a076L,0x663adf4498b98423L,0x4a31e0bfbfb25b73L,
48597         0x5b42f193427be5b2L,0x24b1369118ae7408L,0xf13654a6e9998e84L } },
48598     /* 54 << 70 */
48599     { { 0xf8ec0a9e1b64a70aL,0xa1042bbb45fc54dcL,0x3ac4a936b7cbec0bL,
48600         0x0c2db54708eb7d93L,0x3f16e7c961ae36d2L,0xde25381b4611083aL },
48601       { 0xc1680ae3cf5edeb7L,0x7c86d74ce2b3398eL,0xa3ec4cde9945710dL,
48602         0x303d28ce864e3b4fL,0xd5b9730012956ac7L,0x9ad973be3c0763b2L } },
48603     /* 55 << 70 */
48604     { { 0x526c03ba1979515aL,0xe6492299cde06e58L,0x2215e3fb93ec91d0L,
48605         0xa086161bf783b7caL,0x89e39ff44ef0015eL,0x42c6ccc595e90587L },
48606       { 0x7577d689a81ec775L,0x272e4578daf4d896L,0x6d43c717cf01d7aaL,
48607         0x583814cffd5253d6L,0xee692f0666f7a3b9L,0x54048fe4e99bc633L } },
48608     /* 56 << 70 */
48609     { { 0x2afba531c0b9171aL,0x687dbe4cf2d75c55L,0x7c1c73f7fa17ba3dL,
48610         0x7886dd45063787eaL,0x14f59a18abd0a109L,0x1819df3c873bb66cL },
48611       { 0x76c969dfe01183f5L,0x486a120b1a78b6bcL,0xdfd702fac5686aa4L,
48612         0x2f74157bf3457569L,0x66c8c73e01964800L,0x0a2f6114def25ca0L } },
48613     /* 57 << 70 */
48614     { { 0x841838a8227220dfL,0x39eb77e2cd45ff3bL,0x7140aa47f5a060cdL,
48615         0x9fae5937b55bc3a6L,0x243390ea09b711c4L,0x69db2ace867a3eedL },
48616       { 0x14ee853a152860b0L,0xe3389c4edae0dae9L,0x4fa55ed1248a496aL,
48617         0xda6803e00ef304bbL,0xd19f48bcd04c2823L,0xe76b8d82a61773d1L } },
48618     /* 58 << 70 */
48619     { { 0x2e3a6332f7ae9a8aL,0x89f1576f78a12a00L,0x9597b2b245ab254dL,
48620         0x2017d6306309a625L,0x0385c02719adbe9fL,0x26c84f2014606336L },
48621       { 0x3808a31a3584dd47L,0x0fd2bd1b4e1da791L,0x70c2827fb894be27L,
48622         0xac97e84547d1faecL,0xa63c56fe9b01c835L,0x19c3b18067ca7507L } },
48623     /* 59 << 70 */
48624     { { 0x975dbe423a07930bL,0xf03fc9da8f7975f3L,0x94209a2522662e65L,
48625         0xf5b20e6b9619dcdbL,0xa95e2188ed5ee020L,0x2301e35abe7fb828L },
48626       { 0x4216b05b9caa0bceL,0x0534eef625cdec7bL,0x81f5c5f8613aa24bL,
48627         0x8705662951451a5fL,0xffafb623df15645dL,0xe19276fe79c497c5L } },
48628     /* 60 << 70 */
48629     { { 0x461bb6e1d118ef5cL,0x277e378d1f4bf653L,0x3b4138849ccaab1cL,
48630         0xa5979a3ecea9c61fL,0xdc2a23c09dbfe67dL,0x5f7e32f5335cb2d7L },
48631       { 0xeefe71a87accbd69L,0x65d961341df58e12L,0x17bafa56538145d8L,
48632         0x2a723472695df807L,0x132b5320394ec082L,0x96219e617d0ed426L } },
48633     /* 61 << 70 */
48634     { { 0xf08ee7071ec12e08L,0xb9a51fc40c4917aaL,0x1aa9b778aa085b77L,
48635         0x3b3e40d72e62193aL,0x3700217fdc211bb4L,0xed03eaf4fbea2fdcL },
48636       { 0x82e00364c55111e0L,0x3be15019e3cbc07cL,0xf142d230055b597bL,
48637         0xf68837b1a063deb9L,0xf1368df622e72e40L,0xfc712c67ab522f37L } },
48638     /* 62 << 70 */
48639     { { 0x02ca4c0dc3c8ee2fL,0x1962366a0d75f552L,0x6354ab90a43c43e7L,
48640         0x9f46429f7668d14eL,0x70ffaa6d0ca59472L,0x231fdb485a95ad7eL },
48641       { 0x82ae5f0acb2ebd5dL,0x2dc8417ce51b1d3bL,0x5052133a2fb456dfL,
48642         0xad3b4cf2bad61a16L,0x59f283a48d76344dL,0x5f15465772b18fdcL } },
48643     /* 63 << 70 */
48644     { { 0xe0ef0c3cc73a7131L,0x8a4e0cdd43ea81fdL,0xceb5fcb8d6d6ce6eL,
48645         0x941179893535781dL,0x20f5e952b37d4531L,0x5e77f33364c25699L },
48646       { 0xb6645e8fa6d3ff57L,0x6dac30cb5b9bfdc0L,0xb29648e73ebb655aL,
48647         0xe1bf3f4005ebc1d1L,0x1b12288514025fdcL,0xe15fab026c5adaabL } },
48648     /* 64 << 70 */
48649     { { 0x86230934f14a99d9L,0x1cf9c66e97c1c092L,0x01e186ba6f595ed3L,
48650         0xd3291c3de2284a58L,0x03dee2311b9e5e25L,0xf2e9b4ad15cc9f53L },
48651       { 0x4fba15679770c29dL,0xbf7d673650c4ae2fL,0x86901eb92532d015L,
48652         0x4396fd784e7455deL,0x2fbcea8fbcf811c9L,0x3981ad15ae952b37L } },
48653     /* 0 << 77 */
48654     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
48655       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
48656     /* 1 << 77 */
48657     { { 0x6bd2c54d4cb89afaL,0xe78c8bfa36527751L,0x27f52654e3eee747L,
48658         0x56f205839598d907L,0x5f91c2d027cb3712L,0xc501819fa3e33c5bL },
48659       { 0x248490aa4eded738L,0xde7ac94427789065L,0x20138b3d74f7d38bL,
48660         0xae791f602fb60214L,0x6b4fb300bd033d4eL,0xc69c25d9bdfd1f17L } },
48661     /* 2 << 77 */
48662     { { 0x0c3d2056be21a890L,0x1c1ffbfb8fcfba99L,0x1b68a98b1fbf56caL,
48663         0x56fd85ff396e31cdL,0xd2ca58444382c03bL,0xc442030a7d3ef917L },
48664       { 0x4129a731426afafaL,0xacff17ff5eaae9c6L,0x9e854180653f3b23L,
48665         0xe65a1a149ee066bdL,0x3420084e362ea5feL,0x6fe58801c7911e2eL } },
48666     /* 3 << 77 */
48667     { { 0x43f0ae676c4be6a0L,0xabc6a17a504bffebL,0xd5be6c25dbb4492eL,
48668         0x7efc9ee884bff97fL,0x54fbd9d7062da2e2L,0x1befeb61c6d2ac32L },
48669       { 0x14cf6dc0cbafef5bL,0x8e640e4771d12192L,0xd0566543d9a16800L,
48670         0x9cc2ade9beb1e28dL,0xcbfeb45038e65833L,0x3852eaacd0f5acb2L } },
48671     /* 4 << 77 */
48672     { { 0x5e930d65c4650b85L,0xbe96b2ae6350da54L,0xcfac4f7efa08bd49L,
48673         0x277e8456a6e10f64L,0x41be3067407ac162L,0xcfd1d03252a9b68bL },
48674       { 0x8d8d216a9c337e0bL,0xace044dc4e1b9cf5L,0xad9a4102c60d54c3L,
48675         0xb09420f028815187L,0x881179c60b3b8e59L,0x872685ed5b09aba1L } },
48676     /* 5 << 77 */
48677     { { 0x26d43085ee64924eL,0x5eb54d1c4bd6a77fL,0x69a69ccfd1ca022fL,
48678         0xaad92723a3342720L,0x51e27b54421d836cL,0x15e83917fc72a1adL },
48679       { 0x183e75d14ddea73eL,0x73fe3b9fbafcecfeL,0x0197e0925daefd64L,
48680         0x2fa89f60f85b8249L,0x95411aafd23cd465L,0xb7dbe7485d9a459eL } },
48681     /* 6 << 77 */
48682     { { 0xab146c207dfc66eeL,0xa7250dcebb6869efL,0xaeba44439d7ad5f8L,
48683         0x919f877ec48059f0L,0x780ecd232c6b5c11L,0x586daa8e38625f8dL },
48684       { 0x46a46c789911c031L,0xf56f74fc65303d34L,0x825bb06d4f384eabL,
48685         0xd147719ad6aa2bc2L,0x745fd7460750e1acL,0x2ef411494b3ec757L } },
48686     /* 7 << 77 */
48687     { { 0xdb24cd1af10ea702L,0xf393de57461f8ebdL,0xf56f414e5cfaefecL,
48688         0x758c8d854690230cL,0x6740c974433d2594L,0x69d92a620aa6bb20L },
48689       { 0x17be342e9b0bb191L,0xc1cd309fdbf5c97bL,0x089134df8998140aL,
48690         0x33809a7e82afcb85L,0x409d2a481db47b21L,0x1d54e86ccdb1bccfL } },
48691     /* 8 << 77 */
48692     { { 0x22313dee5852b59bL,0x6f56c8e8b6a0b37fL,0x43d6eeaea76ec380L,
48693         0xa16551360275ad36L,0xe5c1b65adf095bdaL,0xbd1ffa8d367c44b0L },
48694       { 0xe2b419c26b48af2bL,0x57bbbd973da194c8L,0xb5fbe51fa2baff05L,
48695         0xa0594d706269b5d0L,0x0b07b70523e8d667L,0xae1976b563e016e7L } },
48696     /* 9 << 77 */
48697     { { 0x47de66da62a200a6L,0x67b0ce0d65186fb7L,0x8e8f0248238d23a2L,
48698         0x5a44a886c1114a6eL,0x36383e5be8ec166bL,0xd36077d8ca7d2e43L },
48699       { 0x332f98267c45e8c6L,0xcec2ba1355d968faL,0xdca664a84a56f7abL,
48700         0x954652467b03621aL,0x471f66259b6e55d4L,0x401a6a5efb0714e4L } },
48701     /* 10 << 77 */
48702     { { 0x2fee0c6d6046896eL,0xde64c4e0466a90efL,0xb0c9755a55395f3aL,
48703         0xdfe2dfd6ae3879d6L,0x979853c2d656c53dL,0x58bb6121757f381fL },
48704       { 0xdfae5707980db8b8L,0x6d4c7cd7d7752f7fL,0xdfb77382c5dacfccL,
48705         0xd0fca93104177fbbL,0x9ef6d3e4b67891ffL,0xb599dfcb26024609L } },
48706     /* 11 << 77 */
48707     { { 0x79bf86761cc06935L,0x6bbc2d3fd44fe6bdL,0x092678c486f9f728L,
48708         0x05631aaf54c3fe18L,0x217adbbe95eec92fL,0xdcdbfdfb955bcba3L },
48709       { 0xf938779c01bafb04L,0x67f599e73ab755e0L,0x793b591fb00c1315L,
48710         0x7ea2dbae3f2d0909L,0x05436dce46614955L,0x02b988888060d145L } },
48711     /* 12 << 77 */
48712     { { 0x795df21ba1ebf7c0L,0xa98f2466681b5da4L,0xea18a2ab413b507dL,
48713         0x9243326688324aa8L,0x2b91dcc2f74d83edL,0x95054b471f411a13L },
48714       { 0x50869778e3c621f2L,0xb950f3a9427faf54L,0x8949bf7dae29f080L,
48715         0x7c16cd020ef3a3c8L,0x7883c719b122cd0aL,0xa2cad71fc03bd749L } },
48716     /* 13 << 77 */
48717     { { 0x60c794125b3ad53bL,0x91c62ac783981a98L,0xa6f30f473dcd7196L,
48718         0x55417e7598b4c589L,0x2ce067cb345b89bbL,0x4787f0db71936e38L },
48719       { 0x208cb360331d7de3L,0x4b0347aa15022254L,0xc66e58865e8af235L,
48720         0xdefed4c591a68080L,0x0b8dbd336eeb47a1L,0xb6d44d36f732c8d2L } },
48721     /* 14 << 77 */
48722     { { 0xce0b1700d3aa7741L,0x13cc58a90df0cefcL,0xa96149c7da3a1816L,
48723         0xd387d361561277fbL,0x2294f77cf2c363c6L,0xc8d19d51355a8a93L },
48724       { 0x926dd80092affccbL,0x70c59253686afd1eL,0xe4826f2370c4d8b5L,
48725         0x948d43dba2226c34L,0x6ffed99e2a097aaeL,0x80e7a99a2ce18037L } },
48726     /* 15 << 77 */
48727     { { 0x070c3f39b7f01551L,0x21b249434512844eL,0x46e33e16e2e2a68cL,
48728         0xd79daf0ca549dcb0L,0x634fa53966a7b9bfL,0xe856d0a8702990f4L },
48729       { 0x246e5858e466abdbL,0x3f3ad441edfc851eL,0x9ab3db2c2e397554L,
48730         0x6c5b1a39b5cabd32L,0x695649b2427c5cefL,0x6179fa0f82ab4f68L } },
48731     /* 16 << 77 */
48732     { { 0x022aa09d236b71dcL,0xb1ce6a0ea65a7640L,0x317344c5b38b417aL,
48733         0x29a74cdb436451ecL,0xd898eb6ca8b1c876L,0xf0134f99b74eeffdL },
48734       { 0x0d9eab64225d71f7L,0x9679b453ceb3cc2dL,0x37c894ce14dbff2fL,
48735         0x3704d34927065280L,0x9ee435d8ba29a0cdL,0x675bea1409c11c4fL } },
48736     /* 17 << 77 */
48737     { { 0xa8454e2b63263ee1L,0xf4c8a384cc42ffc3L,0xb260754916bf086cL,
48738         0x610d299cfa46a481L,0x21777897ce41a4d1L,0xdfc04bb321573cdeL },
48739       { 0xac7d9433ced06177L,0xfdce0356a281b9ceL,0x22abd67970d48fc7L,
48740         0x1e4ebf7750514178L,0x7f0869ef21a255c8L,0x80ae565c29bf477cL } },
48741     /* 18 << 77 */
48742     { { 0x607cfaa1a38a18a2L,0xb29ae9c760bd3f91L,0x4991432d76a4c22dL,
48743         0x4fe8dcd380e75452L,0x7aeea8150925ed79L,0xa0cc6823b7abca08L },
48744       { 0x647b164fb0a555dbL,0x60545cd3d6076f3bL,0x7e801133807a2045L,
48745         0x74b2200743ac7e22L,0xdfb58fd1716d3e5dL,0x369ad09947772c45L } },
48746     /* 19 << 77 */
48747     { { 0xb6c5dc0635ba2007L,0x6543c6307921115fL,0xa7e5a662eb6c493cL,
48748         0x728159f54a0b8d6dL,0x8cb07ef1b943fa72L,0x4a2c5cc923c46a98L },
48749       { 0xea078b478c26221eL,0x68ef5015ce2be601L,0x3048b5de5239f8d2L,
48750         0x00a98cd419bbe0e5L,0x0a34161caa94a375L,0x879a9a7aac8a411aL } },
48751     /* 20 << 77 */
48752     { { 0x2d968968e3f6217fL,0x60b781ad1fb91fc9L,0x44ce23514a84e6ecL,
48753         0xe8f5627d00a3d089L,0x45211a094a980480L,0x11029b7263274860L },
48754       { 0x44601cfcae0477aaL,0xa05a67df269ca043L,0x9dc3938fb758fbd0L,
48755         0x43d5d89abaa35f8cL,0xa38dfa1f2ab3436aL,0xa29653bc529b7061L } },
48756     /* 21 << 77 */
48757     { { 0x6ab2e32b982cd162L,0xdd690ed7794d6da0L,0x8fee0b461862f33eL,
48758         0xbf9aeee210d244fdL,0xe485aac27dbb57d7L,0x7f7ee4bc0ff23849L },
48759       { 0xfb3c6255171ba49eL,0x089b9986133e45deL,0xb6c033106d04b924L,
48760         0x216af9223ea88efcL,0xe646a49b5fd52347L,0xbb495d2ee404b86bL } },
48761     /* 22 << 77 */
48762     { { 0xe24934ba07fd5fcfL,0x4840e1a6a1027598L,0x4c2294d245eead89L,
48763         0x7717bb604fda652dL,0xe809c21878370655L,0x417853499151e578L },
48764       { 0x8bfe121cede554c7L,0x96037a33952c153cL,0x80458ed86a5b30f0L,
48765         0xba331cf9ca28472aL,0x31b5f463e6c177aaL,0x68c5dc9183ec14fcL } },
48766     /* 23 << 77 */
48767     { { 0x8b78d2bff13dc6a5L,0xacd7e0902285c2a2L,0x6aa7866cb47e9427L,
48768         0x7c2483474d9fa3f2L,0x2e668396f0661aafL,0xf491cd6d08cacae4L },
48769       { 0x772a131158f9a617L,0xf372dcd6b2011823L,0x790a5ae54e6bd2a9L,
48770         0x035ff238fee0c8c9L,0xcbbe828cb0b8c53dL,0x9edba1a40af83ca1L } },
48771     /* 24 << 77 */
48772     { { 0x2fde4893fbecaaaeL,0x444346de30332229L,0x157b8a5b09456ed5L,
48773         0x73606a7925797c6cL,0xa9d0f47c33c14c06L,0x7bc8962cfaf971caL },
48774       { 0x6e763c5165909dfdL,0x1bbbe41b14a9bf42L,0xd95b7ecbc49e9efcL,
48775         0x0c317927b38f2b59L,0x97912b53b3c397dbL,0xcb3879aa45c7abc7L } },
48776     /* 25 << 77 */
48777     { { 0x62ecc0cc429bdc1fL,0x6a8000add447c01bL,0xc2dd42354f23e5d2L,
48778         0xe6c1790a01b4a0dcL,0x2497e53c24393079L,0x0a113afeb2a00faaL },
48779       { 0x96c1bd5011151480L,0xded805425aad86dbL,0x639f24cb76720e92L,
48780         0xf17703b7d825eb92L,0x10f8924e82d2657eL,0x6edc843c627c5236L } },
48781     /* 26 << 77 */
48782     { { 0x472226adf80911c2L,0xfb50c3a5e087a3d8L,0xb194551441848a6fL,
48783         0x61f4fbba9f17504bL,0x8c59b2c48e33924bL,0xa7641127ac7a8608L },
48784       { 0x79feb7fc164a2330L,0x9e0fd67253a44e7aL,0x9c5c973081953c30L,
48785         0x25d6932c3f6342f8L,0x29e8b7664b574a69L,0x02f90a46a5de3639L } },
48786     /* 27 << 77 */
48787     { { 0xe2d1e2a3465ab77bL,0x2ca0f6a3cf45823cL,0xa1b12306dbdce9d8L,
48788         0x820470e7b4b39ca0L,0xe48956c76e847681L,0xc8ed8fc8fbf6970dL },
48789       { 0x52cb109419ba40aaL,0x08136d091efbaaa2L,0x99dd1ad27d71e1c4L,
48790         0x10001f97a3a59a3bL,0x79d229e460e4cad9L,0x6d443d8756732312L } },
48791     /* 28 << 77 */
48792     { { 0x8d6b28b4d7cfe9f0L,0x6ee5407a4dce4904L,0x7acee5e7ba0b67f6L,
48793         0xd4cf6bd2abf447aeL,0xc085e8e2e7330268L,0x23edbd5a145689d8L },
48794       { 0xd2ae9bd21d7b0e7bL,0x3196410ec4fe6ecbL,0x964bef26ec2cd59dL,
48795         0x09c6d07dd5e0bf03L,0x379f131ea65b646bL,0x0439c37964849830L } },
48796     /* 29 << 77 */
48797     { { 0x8afc9a5eae562537L,0xde81bbaab2d4172aL,0xa272c6d53db07247L,
48798         0x08b903ffd86ec6f8L,0x3373041f835aa84aL,0x02e8ecfdc8f18f48L },
48799       { 0xed6b2784ccc11e64L,0x03e45e15842a8292L,0xfcfcc54b653b86efL,
48800         0x9678fe7ed9ea2f91L,0xee5bf4584efceafdL,0x188e49d59fcc4be9L } },
48801     /* 30 << 77 */
48802     { { 0xeb0098cf67a224f8L,0x14e486c90991108dL,0x0dad68314b397687L,
48803         0xf2a4f6cb9d089000L,0x3fcc8803509f7376L,0xdbdf06dddb5d6f8fL },
48804       { 0x2cbf342806ef3e46L,0x4a4bd5eee432ca41L,0xdcb8bdb70e2d391dL,
48805         0x941b9a4ec1710ac3L,0x25cea4333d62c34aL,0x9136e5cd881a70b7L } },
48806     /* 31 << 77 */
48807     { { 0x9bfdb9b310c3ed1eL,0xc9a225ec0cd146c3L,0x1fec4316573c4414L,
48808         0xe11a408f2fa8323cL,0x198c760ac3e988bcL,0x3f8a5a1caf0fda3cL },
48809       { 0x91e89f11f6e78264L,0x3cee0165264eebfdL,0xf9412b049898eaa0L,
48810         0x3c67991a382e46e3L,0x8d833d7a80acd219L,0x746a696c9d233f20L } },
48811     /* 32 << 77 */
48812     { { 0x8b3269a2714a10e8L,0x64cef040a4a2727eL,0xbc5ac714e428865cL,
48813         0x531dd17ffdaba094L,0x86d2405718d657f2L,0xe807b0d92f99dbbfL },
48814       { 0xc428a80f6848ef88L,0xb3ef0709d0b73ce5L,0xa752691922a5d255L,
48815         0xbfe6392318a18586L,0x28a0c772fcf633b3L,0xad22b4ec3f3c5298L } },
48816     /* 33 << 77 */
48817     { { 0x8b6a2f1ae6c40f85L,0xf0f44c54f44cf3f0L,0xda635b687b25d4b6L,
48818         0xee59c00f8cdc9d5dL,0x36509f58cc4876afL,0xe37564484e2c550cL },
48819       { 0x20f965b565974809L,0x26481694e3fe3a63L,0x6778b20becd272eeL,
48820         0x9b6bbf39c9072853L,0x4f61f192b0436bdeL,0x98bf7dafd0221263L } },
48821     /* 34 << 77 */
48822     { { 0xa06a4b56e0442513L,0x6537e117dd513547L,0x89e38ccd2a654224L,
48823         0x2fe734bd005ee292L,0x54d6933498cfece0L,0x85de5c9d85a79bf2L },
48824       { 0x21e072bdcd3da6a9L,0x7a5d707b8c16b8a1L,0x43654d0142d04cd4L,
48825         0x07d589b94a88c151L,0x5bfe9ea2df726b52L,0x877c46ffcf728e4eL } },
48826     /* 35 << 77 */
48827     { { 0xe338f606fa009c33L,0xce596aafa351fe32L,0x8ae0e06123968387L,
48828         0xcdaaaa9465c98e2dL,0xec6b8a818acb9355L,0xc2c67e7facbee162L },
48829       { 0x7068df85517df4beL,0xc34a6ecb7c5c076aL,0xf4193aab6250f0baL,
48830         0xe0cd2f3fa6c9ea47L,0x23a57ccc6488135aL,0x044d73e6c12b842eL } },
48831     /* 36 << 77 */
48832     { { 0x9d8a78808078c8bdL,0x6ea07982076d44f1L,0xc58fc94eeb3bfda0L,
48833         0x0b9e72200dd11b13L,0x8bd58e3aa74a005dL,0x7a30aeda115b7d33L },
48834       { 0xeb0037e6ef2491ffL,0x0fa2d1a7fb39ecbcL,0xb75aac645ac598f7L,
48835         0x2c3c103341f61b42L,0x5a330bf01f7eb885L,0x1c96124d33d5e27bL } },
48836     /* 37 << 77 */
48837     { { 0x3f157ea1b28d1640L,0xa41c98f2c96806ecL,0xef261c3bb099566bL,
48838         0x11d88be30aa23f1eL,0x9a721a2c47ed1540L,0x214cb5b0e4431563L },
48839       { 0x36a95c20250f6b19L,0x6b44f01d30eb0249L,0x141777dc5c67e2beL,
48840         0x6926b32ebbe7bb63L,0xb72fd3bf756cbae7L,0x226661a279dfb835L } },
48841     /* 38 << 77 */
48842     { { 0xc25a44e3300b8f91L,0x08aa9d5691ad1a78L,0x130c561ffdd2a064L,
48843         0x36f0b4608c05f94eL,0x748166e158a351b3L,0xe408976147d40ed6L },
48844       { 0xa0ba5e5d1b2e3400L,0x94aea3b6687f6492L,0xf4975167ea262235L,
48845         0x8014e81143e800d6L,0x635a3c516e5df6dcL,0x71207caf2eb20366L } },
48846     /* 39 << 77 */
48847     { { 0xc00364013638e940L,0x24baf83bbb70e3cfL,0xc08a99b865dca079L,
48848         0xc070152e0d40622bL,0x44880b191697468aL,0xcf95519bfebc1644L },
48849       { 0x7bdc41d7911a74efL,0xb88180314ad83219L,0x53c523185ad49f95L,
48850         0x4e59a29f6d112b66L,0xb2707b9c7515de9eL,0x8322492c150c9bdbL } },
48851     /* 40 << 77 */
48852     { { 0xcd81bdcf24359b81L,0x6fd326e2db4c321cL,0x4cb0228bf8ebe39cL,
48853         0x496a9dceb2cdd852L,0x0f115a1ad0e9b3afL,0xaa08bf36d8eeef8aL },
48854       { 0x5232a51506e5e739L,0x21fae9d58407a551L,0x289d18b08994b4e8L,
48855         0xb4e346a809097a52L,0xc641510f324621d0L,0xc567fd4a95a41ab8L } },
48856     /* 41 << 77 */
48857     { { 0x966f961d46ff607bL,0x7e52ad9bb29278c3L,0x5b9b84b9bc6835b8L,
48858         0x00e4a35ad834701fL,0x53aa139866b8f484L,0xc397f087de063112L },
48859       { 0xb811a9a24e81b980L,0x8d9c38ef8d680c4eL,0x0a7e66ef1c8db33aL,
48860         0x1c7e636bf4e17483L,0x25c0a690ae9acf11L,0x5b0a435985966d63L } },
48861     /* 42 << 77 */
48862     { { 0x3d4a4ee0a3bb186fL,0x84de7765082c283bL,0x499bf10a8fc8baddL,
48863         0x85191faa2db59e7bL,0xc5964c20ccc587a2L,0xfa59313b9cf52cfeL },
48864       { 0xe614ce878da8cf4eL,0x7d8aa381d60e91b6L,0x054dfc4a0d5c0a8dL,
48865         0xbcd89aef28a15c79L,0x2af1121efecbc916L,0x6aa49bcb44f30755L } },
48866     /* 43 << 77 */
48867     { { 0x7953c7ec7b7dc4cdL,0xb709542edbdd99baL,0x7a2afc3eb30b5c70L,
48868         0x7669020fcd0cc804L,0xb57c1d949fade8f7L,0x5ae7d78cb2eef81bL },
48869       { 0xdd5457edca354c1bL,0xa531d85c8f5ac058L,0x5fdca829009e0aabL,
48870         0x8df732f6f2bced0fL,0x3ee658627faf57d5L,0xf7a265735c2f3bc2L } },
48871     /* 44 << 77 */
48872     { { 0xe1ce7f3725a64849L,0x760847744da790f0L,0x4638f287cf5f319fL,
48873         0xe36f3c5308c3786fL,0x07042ce1985513cbL,0xfb955cbf73d9cf3aL },
48874       { 0x3e68a2cacde0774bL,0x321f49b76dc2c816L,0x9bfed81fd76c4d3bL,
48875         0x985b34fefd49fa62L,0x2a3de945ebb8fa9fL,0xcaa616f0405da5afL } },
48876     /* 45 << 77 */
48877     { { 0xf3fa1924bc6d86f1L,0xbcf9d3cbb41dde67L,0xf96431168057ef19L,
48878         0x09315fc52177ef64L,0x1ae99958fcf594a7L,0x7c4baeefaa4dd788L },
48879       { 0xff1ed168a2bb1bf3L,0x9c697d19b4a651c5L,0x5fe29bcc0df8c999L,
48880         0x16446aa446c45428L,0x3a51398061700e83L,0xf34133593f034bc9L } },
48881     /* 46 << 77 */
48882     { { 0x9cc126b8cbf28cbfL,0xf3f8aa7c1e6d63ffL,0x533e48d2b7f80225L,
48883         0x8fea0d204749d781L,0xd8ea614b326f8185L,0x9cf3e07753c541abL },
48884       { 0x09040b60d95c9367L,0xc1b19940f5eabd9dL,0x80b0793cd8f8bd1eL,
48885         0x95fafd6fadff120cL,0x071b1841ce155f8bL,0xa85dfc8cd29d9d9aL } },
48886     /* 47 << 77 */
48887     { { 0xf38e0fdea761048aL,0xd9d5a22c88a93773L,0xbd58470841a99bddL,
48888         0xa31ef1edebb412e0L,0xd5c4fd5a0274ea16L,0xaaf215f380c1f0f8L },
48889       { 0xe842a4537d3dfd08L,0xb5c877ae5a904548L,0x3dadd2eb9c6ddbebL,
48890         0x7f97c541e84e54d9L,0x6183b6ce1b8d8829L,0x2a20c212f50534a5L } },
48891     /* 48 << 77 */
48892     { { 0xc8c9b0ae7176dd90L,0xa95604542917d487L,0xb03b7946e62c508eL,
48893         0x60425926e9fe2321L,0x73b10bba80c1d136L,0xc30a847d9d218c9cL },
48894       { 0x6ed0c8ef2073859fL,0xa176eabf432dd97fL,0x3078096ab9e96167L,
48895         0xb28f0e6cc473e377L,0xb44e4995683a3bc8L,0x483512eed3523796L } },
48896     /* 49 << 77 */
48897     { { 0x7ff5827f22adab31L,0xa7e859ad43ee005aL,0xfc2387f402c9629eL,
48898         0x6f39e84add12b107L,0xd1378037c097d3daL,0xc677b554d70d107fL },
48899       { 0xec15469fe4943084L,0x1f0b13b19d412b76L,0x3b3b49b48a265a31L,
48900         0x45f28cc7dbe97ff2L,0x33f0e31f4efa0f0aL,0x6b22b99e37a5591bL } },
48901     /* 50 << 77 */
48902     { { 0x0a751d3eae0538e1L,0xd51b039af14135e9L,0x92eae0f6e8bdf562L,
48903         0xf253bd5c66557b17L,0xc1ff9054ef26b81bL,0x9d586d39eafd711eL },
48904       { 0xd2b05d3d4f431502L,0x847d727f5823cfe5L,0x2c4e236a8e99840dL,
48905         0xa407e2d87c5981c6L,0x989dd28c69ca34b5L,0x2e8ec6b09fe586e7L } },
48906     /* 51 << 77 */
48907     { { 0x43161b5c40bda312L,0x8fd476b8a10fbb2fL,0x84cbf7579e5d9a4bL,
48908         0x19bb5926a9a31956L,0x66ed993aea9db48aL,0xd7897780ffb0361eL },
48909       { 0xb031e035adfa3661L,0x1be83caf2296b4d8L,0x8802c98b0024cc48L,
48910         0x73adb0c0bac1aa5eL,0x17df92e1bef75b41L,0xd753e99903d800bbL } },
48911     /* 52 << 77 */
48912     { { 0x24940b868733c1c1L,0xf5dd77ce2ac072e1L,0xc248ad6bf7bdb8d2L,
48913         0x423e0cc9d9a8b926L,0x4318d600e6da05dcL,0x3e557e08ca27dfc9L },
48914       { 0x8dc551cdc5dc822bL,0x160da94cbc8fb392L,0x4ffebd2aa6d4d363L,
48915         0x8190c17db1ce15a6L,0x1abcd1361e9dc500L,0xae3a477c9ee52a47L } },
48916     /* 53 << 77 */
48917     { { 0x67ab01575ed80bdfL,0xc77067b69aeb4a86L,0xe6e26abdf7880a93L,
48918         0x782248db1e43049cL,0xa902c41016d78616L,0xc6fa899fbf309f15L },
48919       { 0x81e1532d672d951bL,0x84280ba386556a0dL,0x83190bfb55199078L,
48920         0xbc11e8c25a1c4691L,0x8ac60c7f21152509L,0x4211923ec775dcd0L } },
48921     /* 54 << 77 */
48922     { { 0xa63b33f6746418acL,0x62085e0eb7359443L,0x3b43ea7b5fb598dbL,
48923         0xf4a0f4442b365528L,0x7f4d2ff3eb55a5ddL,0x012cd591f189eadeL },
48924       { 0x3fbdad99f58c8f84L,0x71dc1b0093bf34dfL,0xfb63f09ce062a588L,
48925         0xd5f0f0ad6f24b66fL,0x940e23c91813cd9dL,0xeff8580b55f241dcL } },
48926     /* 55 << 77 */
48927     { { 0xb30719d8b7fb5f3aL,0x8f74305b43275030L,0x2fdb613bf23628bbL,
48928         0x75d9868ad945ccdcL,0xbfae46f4f0b73348L,0x48ad8bafe26679b3L },
48929       { 0x3aeb4743d0b389bdL,0xd2463ca37916297eL,0x3a6f37c820f52fd1L,
48930         0x7bfade4495ffa348L,0x1e3f6282a25cb79cL,0xac3320d5229bd2a3L } },
48931     /* 56 << 77 */
48932     { { 0x261578c7d57c8de9L,0xb9bc491f3836c5c8L,0x993266b414c8038fL,
48933         0xbacad755faa7cc39L,0x418c4defd69b7e27L,0x53fdc5cdae751533L },
48934       { 0x6f3bd329c3eea63aL,0xa7a22091e53dd29eL,0xb7164f73dc4c54ecL,
48935         0xca66290d44d3d74eL,0xf77c62424c9ea511L,0x34337f551f714c49L } },
48936     /* 57 << 77 */
48937     { { 0xd1f879197700d61cL,0x21728fe49a89dc22L,0xdd3a475be6d93642L,
48938         0x3f8554d6e095363fL,0x4b8b712463e1bb11L,0x75db57e6c6da541dL },
48939       { 0xfdeb9e46ac8342fdL,0x8ab4875114905993L,0x48150a06b2efd023L,
48940         0x9f5f513df415bff5L,0x39b1234eee9d7915L,0x735570a7dda66da5L } },
48941     /* 58 << 77 */
48942     { { 0x3a79a1756e3d4ec1L,0xde0ee6c79936b689L,0x37a7d9ec7fb84ee0L,
48943         0xe82810d38fe1f44fL,0xbe433c7253049e9eL,0xe72ef4f5fb49e274L },
48944       { 0x525b72094b4ad28dL,0x37bfb857164f5f0cL,0x60327e31ac68d566L,
48945         0xdb027619bb71f137L,0x8abc8026abb6e829L,0x99702ff15e838117L } },
48946     /* 59 << 77 */
48947     { { 0x974be1d30696f1a5L,0xf884616dd3832430L,0x6997c37ce9dce1acL,
48948         0xf4bad00e2e5cfbc4L,0x7727adf8e327a9a4L,0x15315bf16aeeb305L },
48949       { 0xe697c0af09fbffceL,0xe4291f7589f86a5fL,0x765f1904487b12f9L,
48950         0x752c58a5b7f8ca88L,0x9f9563d473716bf7L,0x48803cdbfd032783L } },
48951     /* 60 << 77 */
48952     { { 0xa0d935ce9050c5cdL,0xc1e062d03e9b902aL,0x212d0e5dc3054c00L,
48953         0xdc9c3f2de70ad96bL,0xa2182ffbc2742144L,0x4680d472a716993fL },
48954       { 0x9852bb00677f3756L,0x2bb3d78435e6213fL,0xadfdbfe07377fdc7L,
48955         0x41db795d708afddfL,0x6848cef57727ed86L,0xb24e416aa6c1dd1aL } },
48956     /* 61 << 77 */
48957     { { 0x36d76f2f2edc95c2L,0xbdf2a67810b0670fL,0x49fc8c43b63877a1L,
48958         0x23182ed3a87c8615L,0x94c21da96c011a44L,0x3bc0b86860d3c162L },
48959       { 0xca6a158244815192L,0x4bd1ce04fd97b78bL,0x1d0074cddc750023L,
48960         0x40cf8233cdfb0c7cL,0xe4e28aa8bbbfbf3dL,0x72656155b6eec7d2L } },
48961     /* 62 << 77 */
48962     { { 0x5b1be65b912b364dL,0xe6369ca1e0335426L,0x249740d58420e7daL,
48963         0xff13a26f1ac1acf4L,0x0ecee744b9634fb2L,0xbaa77d57d664ceb1L },
48964       { 0xadfa7625914f3f7eL,0x17c75e99bbcffe16L,0xcf557911d64aedb0L,
48965         0x8a4b7b49c3644ba0L,0x115240401eb7bb97L,0xb823c21a70fc7b5eL } },
48966     /* 63 << 77 */
48967     { { 0x45db2c038727c0fcL,0xf5aeeb7bbae2c896L,0xfad1cc32eed15b82L,
48968         0x65d4440a8609b00eL,0x35698d956b4dbd25L,0x861615bd0f6cda68L },
48969       { 0x578efdaa8aec1e99L,0x87ddae76fcf67480L,0x5ff5a1304669ccb0L,
48970         0x5fd2f31a0b98ee60L,0xccad491a3cc4c003L,0x6dcf25bbccbc46e0L } },
48971     /* 64 << 77 */
48972     { { 0x93a62e7cfa43699cL,0xdad738901bc422d9L,0x265e3cbb10cc9544L,
48973         0x28cceb062f37154cL,0x6b79b0713bf2e08bL,0x88e025df3ab39091L },
48974       { 0x50a8d04d126522bdL,0xeabbc1b7b779bacfL,0x3db4336ac21cc62eL,
48975         0x4747f0a36fc00450L,0x067cbf1c544b2d95L,0x2480b7d8fd2be7a7L } },
48976     /* 0 << 84 */
48977     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
48978       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
48979     /* 1 << 84 */
48980     { { 0x0233e423d52eb122L,0xc28483521154b0c9L,0x2ca09cef6349e35bL,
48981         0x3b70afc3ded2ec54L,0xc813474d52dded3dL,0x2d3f21bf12f00ee0L },
48982       { 0xa0908f7692f215c6L,0xb97d60e94e9c0440L,0x84ad10c134b6a8e0L,
48983         0x6f37fd956e7c163eL,0x7caae8c8d057e0c3L,0x534f52c2553721a2L } },
48984     /* 2 << 84 */
48985     { { 0xa354c1de72a041b2L,0xe83df25929d1330aL,0x676610999d532bbdL,
48986         0xb7c2f4cf52011751L,0x6945d34ff659e35eL,0x6217d20ba1303b7bL },
48987       { 0xa200ddba25751badL,0xa74a729001d3566dL,0x3018445faa82b46fL,
48988         0xc3e6a3acfccedc1bL,0xe86ae8703353e29fL,0x1c8085bbfd7e8547L } },
48989     /* 3 << 84 */
48990     { { 0x728c8e145d1a678fL,0xf944da572ac89a2dL,0x3016c2da4796df72L,
48991         0xf6d79e4e00a55efcL,0x4fced269526b1cb8L,0x4a93e47791f165a9L },
48992       { 0x528b8572f84f90d3L,0x3b30376e5e725561L,0x4f903520e07bb990L,
48993         0x07ddb97f4ea8ae6bL,0x29c01e70b3b735bbL,0x825c7f6e5000dd4aL } },
48994     /* 4 << 84 */
48995     { { 0x306b63e3b4dcea78L,0x4b10209213636935L,0x36bb68898bdeddeaL,
48996         0x9331655d67a329acL,0x14c7fe26ba92ccceL,0x4e7d6929be0519b4L },
48997       { 0x0dc39dbd164d50e2L,0xd4c430a0b1679cc5L,0xc7f78818fa8682baL,
48998         0x43396eadb60aad97L,0x751784d7ff2c64ccL,0xd37928be866af43eL } },
48999     /* 5 << 84 */
49000     { { 0x3742b61e0475f547L,0x48b2a2c2477722acL,0xf52c6787abce3401L,
49001         0x4749711ea4cb41b4L,0x7ce0dfb03fca817eL,0x1c1e3bf996e85048L },
49002       { 0xcd65250e40faa8e9L,0xa8edce7017d9b93aL,0x73523cb2b4dd5619L,
49003         0x15ba773abb5379f5L,0xcc5e62d6c0a847baL,0x7efe5c7c04d852deL } },
49004     /* 6 << 84 */
49005     { { 0xf0a69e685a91c9aaL,0x0304d20105c13197L,0x773a3ab7cd14af1dL,
49006         0xc0b88edd558d555dL,0xeb12d197d2e63dd6L,0x4a8e849fbcd9cdb3L },
49007       { 0x06432985965eaa14L,0x453d93861a5a6f43L,0xbd28f6164171b9bcL,
49008         0x37781639bbfcf90aL,0x1f93898f3a36084dL,0x1fefd8b7dd00ca75L } },
49009     /* 7 << 84 */
49010     { { 0x3b8d8e495e456124L,0x967ed511967c17b7L,0x1d72430c2aad8c67L,
49011         0xe8c5d506b82c1673L,0x989978868a0fb41dL,0xa9d478f70f81234fL },
49012       { 0xa0c941cf44cc0614L,0xc033c99024ad30f5L,0xaa7de296101f89aeL,
49013         0x4cadd8e3ca6a3227L,0x3b4db51f2764ec0cL,0xcbfe70fc09256db4L } },
49014     /* 8 << 84 */
49015     { { 0xb9207dbc2b2f1bccL,0x6afd6871a3e83ef7L,0x49924e5534ba150bL,
49016         0x2935ebf1dfec9972L,0x34bf5e94b76f870dL,0x22d0f32b4c20385cL },
49017       { 0xc78ac1728ccc8e72L,0x7b45b8220ccecb0aL,0x76c67ee4cfb4b8baL,
49018         0xecfaefb2cd8724b6L,0xe9bc3d67340bc1efL,0xed40b2b9ca5541b5L } },
49019     /* 9 << 84 */
49020     { { 0x5d1bd16518f8e17dL,0x754986b7405f822bL,0x420b1b24d8753fafL,
49021         0xab038e0608ff680cL,0x33621a0fa3649f49L,0xe24b84db78918eb6L },
49022       { 0x0e669672c8bf4168L,0xcb7fab33171eab20L,0xa097d2cc4808be42L,
49023         0x4f4e395f5842b80bL,0xddcb1e51a579145cL,0xa635d0cdf330ae0cL } },
49024     /* 10 << 84 */
49025     { { 0x9b8a3eb3069e6432L,0x43aaa7fc721397f7L,0x46e23c6ca7e83a71L,
49026         0x71b261d593fa3c25L,0x4a47a1050f523a72L,0x31919e898dcad752L },
49027       { 0x4c8b06e70c5dd2adL,0x677ec5f38bdc55e7L,0x4372d55dcb1b5828L,
49028         0x7bf054c1f04dd321L,0x4e8c1a992e44584eL,0x6807803751d35d78L } },
49029     /* 11 << 84 */
49030     { { 0xa6d78a3d754377feL,0xcc17c26ac72ae5e6L,0x2f0ab93b1c05fc24L,
49031         0x1645c369d64c9d40L,0x7c37b12c563e7e9bL,0xb70d292d58b477cbL },
49032       { 0xc283aca993a2d5a6L,0x759e9118354c183fL,0x8a031f6fdd8f4125L,
49033         0xfa8b17ad56edbe3aL,0x6e0f96eb63c651ffL,0x40361942b5085541L } },
49034     /* 12 << 84 */
49035     { { 0x25ae349981d311b3L,0x8640f52a3b16037bL,0xac0839941d947065L,
49036         0x3723c75ee2e693d2L,0x65040a51b66f429eL,0x7f582b0b035a3a53L },
49037       { 0x20eca9e10a166da6L,0x45b37e202c4cc565L,0xeab882957a8a96e3L,
49038         0x99e771dab60a1a1bL,0x2cdd778c23b03965L,0x8d4d7a7291052478L } },
49039     /* 13 << 84 */
49040     { { 0xb57b345e4ff33506L,0xc1a3092a31d23fc3L,0xc16b501e905e1f58L,
49041         0xa36a3b1f29067b85L,0x7cfabd23c214dd5aL,0xbd5f7ab726ad949eL },
49042       { 0x8f64595987363816L,0x49c1a3e679d12d59L,0xcc8f3e2c32d771abL,
49043         0x008d900e6bde16d1L,0x60428a0f60165966L,0xd4f8d9eda7383ab9L } },
49044     /* 14 << 84 */
49045     { { 0xa52d3c2d7e8f73b5L,0x86d8063351842657L,0x58f01253b3949ebaL,
49046         0x97689f15e79367d0L,0x918bf9a30d820328L,0x2d4bc99441c959dfL },
49047       { 0x37392f6e8c16ee54L,0x9f726d58e6f0849bL,0x497de1e4b8208f08L,
49048         0x60c51233d51a29b3L,0x0f61fb03c9e1d465L,0x09494bd0fbe2613cL } },
49049     /* 15 << 84 */
49050     { { 0x100ef5d0a2bd7bd4L,0x89efecf5f45e2a66L,0x63bc210b653786bbL,
49051         0xc7748dba0a0e47c4L,0xaf8122ae110d1ba0L,0x6695bfbf797c78bfL },
49052       { 0x9b0e6fb1d7dbff69L,0x106799703f53040eL,0x22d9ed52fcaf4ed1L,
49053         0x1e27bafdcc1b2d4cL,0x839f9c019f1c88e6L,0x1112fe541321ad66L } },
49054     /* 16 << 84 */
49055     { { 0x4f293478154d0f99L,0x1b82320dd07a24b3L,0x1bf7c94f64d55f6fL,
49056         0x4489b57d725c5125L,0x3aa4d43ab1b6a091L,0x054842bdcf7a60faL },
49057       { 0xaa918a4d2aeb4cb6L,0xcbdaff99ac7d317bL,0xed0e00a16812a03cL,
49058         0xb09acf270b0a1e4bL,0xc73a41f7ac28386bL,0x43134dbdf4cd1321L } },
49059     /* 17 << 84 */
49060     { { 0xe5f746af6e001a20L,0xdc975b02d6a9925fL,0x6d13e266e57f9100L,
49061         0xe013661396a9c4c9L,0xb483162850a66d45L,0xe3b0f96d4ee8439aL },
49062       { 0xf2a2c08d3e074501L,0x987b2b6b2be498e4L,0x605aad24a15b815aL,
49063         0x5bf2186f8529ad68L,0x1413b3d7885ad25dL,0x3de23959807efaabL } },
49064     /* 18 << 84 */
49065     { { 0x08336ffed8c33924L,0x15b56cbf5140b253L,0x38dcd310306caedbL,
49066         0x04ecd49647944afdL,0x1280d23f68a48f95L,0xf414220434363c6eL },
49067       { 0xd0a397eacaa8717fL,0xb51a1669c3994b80L,0xa02eed916c56808bL,
49068         0xc3ab55c583545c3cL,0x8b835820fd26114aL,0xe0cfa4a6ffff324cL } },
49069     /* 19 << 84 */
49070     { { 0x4db4bfb788b45f19L,0x130252bbe0d5fd16L,0xe44c97b22808bff6L,
49071         0x885e4555b03405caL,0x3b7ce036be9af81eL,0xebe17cf58c552276L },
49072       { 0x6eb946c977f4158fL,0x36c23a9c74a5e642L,0x466ff55f2e70a453L,
49073         0x327fd5fd28ea7af7L,0xc96bfbec6e658256L,0xaf194fe8c0a3b932L } },
49074     /* 20 << 84 */
49075     { { 0xcf63d27951c0d95eL,0x3b170a0bac86a014L,0xc21eaaa9881095e1L,
49076         0xed2fda116069a3ebL,0x536264b9bd2f1c5aL,0x819e1cffde312c2cL },
49077       { 0x6c30f983dfd6ce38L,0x2f32cc4c980b439eL,0x9fab10b63b9c03b2L,
49078         0xdfebe34e011ab74aL,0x587360e3b80963f6L,0x3db1f6108692e352L } },
49079     /* 21 << 84 */
49080     { { 0xf262f2379765908aL,0x76f8d0017d03cdcbL,0xdbcadfb22f35de21L,
49081         0x88d5bf592a73815aL,0xc4f4e3b02b1bab82L,0xf5cce885b9635dcbL },
49082       { 0x110a785875a416dbL,0xfe7e6c360adb01feL,0xa02642c01374d779L,
49083         0x9010758753bb5898L,0x0c764ed2a363fcf2L,0x24a2a5541700e551L } },
49084     /* 22 << 84 */
49085     { { 0x63a094c5fe3d070bL,0xf769b91988515eb1L,0xafe86e1450d1131dL,
49086         0x6bf277886774d3d4L,0x7231d699ffd805d0L,0x05132e5b6304116eL },
49087       { 0x3d5e255be34ce5bcL,0xfd9c3bd0c95e3089L,0x22a24023b83cbac9L,
49088         0xfb6d2b6fb0b3b98aL,0x74af1115f7e36fcdL,0xcfe15eaff9da3bf0L } },
49089     /* 23 << 84 */
49090     { { 0xb242ffd61da39f60L,0xd0ed946320cac1b3L,0x9ebd5e46e25f809fL,
49091         0xc7df7e5a07f5aa4eL,0x5eea38d791a5f85dL,0x6240f01d6080442fL },
49092       { 0x72ec0a5e251d866fL,0xd3e4acbebf2c0037L,0x0d4f47c90fd962d7L,
49093         0xece7c047b8de2dfbL,0x841050b96df17f0fL,0x567c3df7e933a4d5L } },
49094     /* 24 << 84 */
49095     { { 0x266d2c1cbb2fcdaeL,0xb538d4a252be93f2L,0x774c88ba73bd0094L,
49096         0x65283a9b81a7e042L,0xe1438bbfd0381625L,0x450e1f644d0db206L },
49097       { 0xb38ae9ef4e60fc4aL,0x14ce87e112719817L,0x831d41ec570303f0L,
49098         0x7172917028850444L,0x2077ea32ccd609f5L,0x091d1166cd273fdcL } },
49099     /* 25 << 84 */
49100     { { 0xaf5916f49412edcbL,0x9ccc0dc08f01b2d9L,0xbed1fdd42dd737c8L,
49101         0x29d26cab95a21501L,0xff38bf18c70f1364L,0x0bdb055876879b06L },
49102       { 0x706031e2a14164d8L,0xe229fce1fc39648bL,0x5ebc640878e97c8bL,
49103         0x26039bda822de18fL,0xab992da4b9f090d7L,0xf409432d53eb438eL } },
49104     /* 26 << 84 */
49105     { { 0xdf216dd84b2ca517L,0xb3eec4b9c6b74c4dL,0xf564e6c81c14e77bL,
49106         0xcde25f1c2c2c9395L,0x7e31f7a5049fcc83L,0x6913707b9284c753L },
49107       { 0xb92a6f2458e6eb5fL,0x85b0cab595148292L,0xeaad036d7449be92L,
49108         0x2f6a2888eb94a702L,0xd7d8773d47d59fb0L,0x612d257303c0bf25L } },
49109     /* 27 << 84 */
49110     { { 0x805ece910ea742f6L,0x54486a6ffb5dba94L,0xaceb0eebbae52f76L,
49111         0x2200fd85e98794f0L,0x44bd993ef305af19L,0x28f256738eb8baceL },
49112       { 0x5d3fabbadc5f9c18L,0x4338f79c1b003ed1L,0xaf4b0566bc20c65aL,
49113         0xded9407c3045d1bbL,0xe8713d7506391eb2L,0x557d62c971307365L } },
49114     /* 28 << 84 */
49115     { { 0xb872a10584d2c3bbL,0x44bca57139196026L,0x857327d84e352e5dL,
49116         0xa6c6004ad925f99fL,0x48aaf266bab79eadL,0x213ad923adab2a3fL },
49117       { 0x3be29b6df371cc48L,0xe732b9062385c9f4L,0x562e0be123f0a84eL,
49118         0xbb6b017228c4b0dbL,0x71a93ae5f4c6d8beL,0x76b8bb16551f1fe9L } },
49119     /* 29 << 84 */
49120     { { 0xd028d9b5242002c2L,0xea105054823783caL,0x01cf8a491d45c34fL,
49121         0x1035835e42457869L,0x0a95049661cc1e05L,0x9dce5bd3b439afc2L },
49122       { 0x8552f02003b18e4fL,0x4973e3bde6144805L,0x29fb98d8d8514c4eL,
49123         0x0ce0e8d83ca27b39L,0x7aaf3f5284bbc6caL,0x0572bf40d78c7c5bL } },
49124     /* 30 << 84 */
49125     { { 0xbbfaaa94c39926a8L,0xb9a59fdb60a138aaL,0x217a1aa2947e30e9L,
49126         0xcac988c9c52c9fffL,0x5676473a3bae3c39L,0x7d84b353857f04c9L },
49127       { 0xdeded30cdd324e24L,0xf07c678a9c242899L,0x956d05538cb64f3bL,
49128         0x9d34e2f5502cb2b0L,0x99e1054a51dd03b3L,0x86b8bfa54d60a593L } },
49129     /* 31 << 84 */
49130     { { 0x3dcd2df9c8870c4eL,0x7cfdd05f1699cd0fL,0x19e9ccf027e79e0fL,
49131         0x56e997027b85d75eL,0x407b5b74ccadcf9cL,0xc961a336297dda7aL },
49132       { 0x350c34d56d12d17bL,0xe37de9a93bc6afe9L,0xd2c7339e0d641d3fL,
49133         0x2700f39cf7dfa063L,0x2916f9ad8ddef077L,0xffec6230547cdbebL } },
49134     /* 32 << 84 */
49135     { { 0x10a53b90754d15e9L,0x6cde9a0c5f4c7218L,0x740d513fabef2b96L,
49136         0xff6cc47cd3f802fdL,0x1be6825beb0627afL,0xdb21ede55886c2dcL },
49137       { 0xb6cfb2c6f5daaed7L,0x68b61aa8fae29a9cL,0x7a1e16f53a5a485bL,
49138         0x16b60b92e7b2223eL,0x332f33d836a13a9bL,0x4567c313876cd1a2L } },
49139     /* 33 << 84 */
49140     { { 0x7663402de62014a2L,0xbffe1e7fc4efd224L,0x2080eb02c38f766dL,
49141         0x6c95529ba9641db9L,0x24dc13a5c68de8e5L,0xca219b3fbbc3016bL },
49142       { 0xb83450e310b634e0L,0x8cd26d775b097a34L,0xb912c34564c9884fL,
49143         0x3d1f28be5bd75f1eL,0xdcba2b479466ea59L,0x4077e017ca9948e3L } },
49144     /* 34 << 84 */
49145     { { 0xb4b2c65df91c7972L,0xabe915496b689013L,0x4eb7afa8d506333bL,
49146         0xc2f2ac1d648e7c0aL,0xc6bc96b1213cc243L,0x0b827c2189e44025L },
49147       { 0x2e866601cadee87dL,0x8ee85356b4719ce3L,0xefda7427b4fc0081L,
49148         0x0d5c33c4c802c92dL,0x4c8635ab58515f01L,0x9d7ed87edd0ab04fL } },
49149     /* 35 << 84 */
49150     { { 0x9a660794cda4cadfL,0x70784fff2484a3b3L,0x8ed664ad2de7de13L,
49151         0xbaff5937030d906eL,0x884407034ab43a4fL,0x86dfdd53ee09795bL },
49152       { 0xcffa6852fb0e889cL,0xd94373e1e8c9fb95L,0xecc0ea249b0e3ac1L,
49153         0xe88eda6eaa89e492L,0xbb049803da19207cL,0xfbb0c3874bbb5be6L } },
49154     /* 36 << 84 */
49155     { { 0x3e2bdd9b5a5f6b4dL,0x30cf4762ab005a55L,0x8736f5188bacd78cL,
49156         0x8a5a647b09dc21fdL,0xfba40c38ca06c1fcL,0x63d53fb64a4e1524L },
49157       { 0xe77d07a19a2bd706L,0x54144ea7bbe30e86L,0x8eb606220bd955a4L,
49158         0xf689cc80b3c26cafL,0xc70fe95c9fefcbbfL,0x67f9e8e2495b5bdeL } },
49159     /* 37 << 84 */
49160     { { 0x04361e6b2e4d2cf9L,0xdbd3cc13ade11ba7L,0x93dc1d1df47d8ae0L,
49161         0x7d46bba6fbb2d65dL,0x797ea0df92e97abdL,0x09eb3975a712e8cdL },
49162       { 0x9ab3a54e0380cf8fL,0xcd1a9574c96710b1L,0x6abcd1a1dc13dbfaL,
49163         0x1be0db71c2ee67f9L,0xee8ec8d0c2ac89a5L,0xbc363f407da201f5L } },
49164     /* 38 << 84 */
49165     { { 0xc86c049bbbef377cL,0x43df6f3703de56a7L,0x01eced2b558e516fL,
49166         0x18fca0bdb43c1cc0L,0xd8c6f7ff62121c68L,0xb2f1f1ac36f90713L },
49167       { 0x5f876328ea1bbd95L,0x9f22dd535ac4ce8cL,0x7e052acc7df88002L,
49168         0xedf21fb7068d46a4L,0x349130a21d7d0220L,0xcccc79beaaa68eebL } },
49169     /* 39 << 84 */
49170     { { 0x9c955b5eb4100632L,0x8d6dd2d3ccd99a0eL,0x700f827c265dd397L,
49171         0x5540bc0cfc85a2c1L,0x6d4b8e7adfb81661L,0xfbfe1ebe1d5c1485L },
49172       { 0x322c2883c9dc1b6cL,0xc7c897cdfd7e0f34L,0xe70b0586030e41aeL,
49173         0x4263e06e26a728b7L,0x0ee2b93392387542L,0xae708ccaf6220511L } },
49174     /* 40 << 84 */
49175     { { 0x05ff8b9cbc15ae37L,0x94dc2e85d06d62edL,0xea1d1c8b4b02607dL,
49176         0x1fc202a224da757cL,0xbd5180bb35440e69L,0x0263dd51698ee7a5L },
49177       { 0xbe93f27654013d74L,0xa7c041c464e81695L,0xbb170ac13ba5336fL,
49178         0x1aadf302af84dfa1L,0xeda58747c960788fL,0xb456070e5eefc35eL } },
49179     /* 41 << 84 */
49180     { { 0xa905d421800ed69aL,0xdb8a643813622898L,0xd003affbdaab0769L,
49181         0x467bc051f0aed9d3L,0xed1e6951b11085d3L,0x7a1d1152d3f54fc5L },
49182       { 0x8cb243b6dc8dd008L,0xf9c690d1f409210dL,0x9a3195399461aee0L,
49183         0xf580724dbc2e4de0L,0x52f648e4e759556fL,0x235a79f2697885d6L } },
49184     /* 42 << 84 */
49185     { { 0xb293d3fe8220ceb2L,0xace20e7e049a33a9L,0xa584ad52af4198d6L,
49186         0x49c5cde64aa0a5c6L,0xc4f7877ecee2e664L,0xe1557968bb98ed87L },
49187       { 0x69b0cd713066000dL,0x1af188cbc7399f29L,0x5b88b85c306188a3L,
49188         0xcffa28eb4097182dL,0xdb01149ec80d0aa9L,0x9f8e6d59402bc397L } },
49189     /* 43 << 84 */
49190     { { 0xa646077bd5b97d37L,0x618df84461cfbd95L,0x3a9fe2f447c62894L,
49191         0x7f2760eb4e0f1612L,0x50c08fdb36e5acf1L,0xac799584675d2aabL },
49192       { 0x3eba6f54917dd606L,0xf585fa5075119ed9L,0xb047abfca32016bcL,
49193         0x61c03e51aca118f0L,0xef9fcc526dc13766L,0xd849eca5e8a3fb72L } },
49194     /* 44 << 84 */
49195     { { 0x11ac1ff4147faf46L,0x5dd8913882b818f4L,0xe439f66fb15fe5a2L,
49196         0xadf913a5fe8fb45aL,0x3dc708404a6bbdb0L,0xe8e1204da4af4ac5L },
49197       { 0x4be549318ba70502L,0x945d9a765883b39bL,0x99cb1c721a76198bL,
49198         0x96fbed479a7949e2L,0x30ee96ebf0299bc4L,0xb7dc5e76d3dd160cL } },
49199     /* 45 << 84 */
49200     { { 0x85eca39b0c88d5feL,0x96000863af9e0158L,0xbb13f99c4509590eL,
49201         0x50033c18034e2499L,0x1e9346f87b86cb33L,0x917d88b4aca548e0L },
49202       { 0x0c422c2e9e2a7e15L,0x6751c95c5e37fb06L,0x631361b8c40d21b7L,
49203         0xe231858ec9958deeL,0xae86abc54d9936e3L,0x60c78d1137bf9213L } },
49204     /* 46 << 84 */
49205     { { 0xa0bcb7c6283190a9L,0x36c884ffc53fe76eL,0x071d4acab23f0865L,
49206         0xd44e3c20e14a82f5L,0x704dadd8968d28bbL,0xb40d2b948e88ad61L },
49207       { 0x4a29142ff3de62f8L,0xdd071910bd7292a8L,0x5b12c32d5b3571c9L,
49208         0xe9886262943c6aecL,0xc49b7506cb1e0a33L,0x87f6c2d3de95886cL } },
49209     /* 47 << 84 */
49210     { { 0x44ba232e010f465cL,0xb82486c69ac91d38L,0xcd1a6bf75de743f5L,
49211         0xe050232838acbc4bL,0x8de9c29631fb87b5L,0x9c8029250450c4efL },
49212       { 0x19ee1607635e64a6L,0xeff5478c69ed7f8eL,0x311201a027001c21L,
49213         0xfc0382a78beb55ecL,0x494b623ce9dea7f8L,0x926a3f756767f769L } },
49214     /* 48 << 84 */
49215     { { 0x802f495cee46f99bL,0x0f3ad0ee43b91cbbL,0xeaf3b294e9b3f0f6L,
49216         0x82cc760033cbdcd1L,0x1a5642278e83fce5L,0xcf1b2edaffa0e4ccL },
49217       { 0x7d93e9769b1f5706L,0xe4eb843cf873d68eL,0xcb53dd79eafe5f35L,
49218         0xcbbed8f0fcaafabbL,0x570472705f053efeL,0x2c71a95f1ebfeb7aL } },
49219     /* 49 << 84 */
49220     { { 0x02d4717ddd7a5499L,0x3bc8bdcb9966236bL,0x13f08015fd27be15L,
49221         0xe05236f6baaff392L,0xf73bab3f7b4cc522L,0x8ad26d4552ccc027L },
49222       { 0x79f8e79e9e9ccd7fL,0x8011b92aab2f22d9L,0x6aef576e729662e5L,
49223         0x7d5194d05e568f55L,0x2947d63a1a40860bL,0xe9890f1440305b54L } },
49224     /* 50 << 84 */
49225     { { 0x8085614c0fa9602eL,0x9ee1b9b26651c4ffL,0x65dd9c94ec048f1bL,
49226         0x10b4a62f6d6c0fd7L,0x61469fb7d391dcd2L,0xdf751399edc3d431L },
49227       { 0xe3901315c913acbbL,0x31581d7a90976644L,0xf20809634aee5cecL,
49228         0xaa716eafe5408c5dL,0x9e356989b9a60ad7L,0x2d6e7733a6a3c977L } },
49229     /* 51 << 84 */
49230     { { 0xd6d99f54f19b8464L,0x3322a0b8a0be5c3bL,0x6cff730557e98725L,
49231         0x786709c7953a357dL,0x3864d278a1013652L,0xf7471f111738f6e6L },
49232       { 0x0377a923984c465aL,0x4a24b9e14ba970e2L,0xe53dd9f21c01d248L,
49233         0xf422b754fbffc0d5L,0xae25dc0ec6a956b0L,0x3c3fef96ce806445L } },
49234     /* 52 << 84 */
49235     { { 0x6a69d207b5906d71L,0xf3c757ed8964e1b1L,0xdae255af5f98821fL,
49236         0x6c801ed4db1af96aL,0xd12430343d109b86L,0x4b2aa65fa091f98dL },
49237       { 0xd9bb4c2132dcb5f9L,0xe5a5979bf190a1e0L,0x0861e5de40117a91L,
49238         0x8753c9adc39120e4L,0xfdcb09f4aeb4a18fL,0xdbda38746bd1fd08L } },
49239     /* 53 << 84 */
49240     { { 0x1bd8e8c0304f7045L,0x8ffcf24eedbd2dd0L,0x13c9441de6ae4dadL,
49241         0x5efb70aab418c02dL,0x9d0fede1b8cf6949L,0x613545cf41f5aec0L },
49242       { 0x4e3342244b98bddeL,0x7d0c11110fd8aaf9L,0x30c2bedcdfb8643cL,
49243         0x875d386aa83e493fL,0x85b32632d6cd0825L,0x9f1ef3a01445507dL } },
49244     /* 54 << 84 */
49245     { { 0x2b70440e54f6b8d9L,0x355e692430eddda5L,0x354e7cfbc9199910L,
49246         0x7e8933bfdc7de946L,0xc5692fa981b9eaabL,0x2eb58fff98cf5f21L },
49247       { 0xd0d8f9bb96b19d59L,0x779aad414d1a6285L,0x0cee1a9b5eb87c49L,
49248         0x676e36ff786c4c81L,0x6618c8f112d34964L,0x2061186dd03e9562L } },
49249     /* 55 << 84 */
49250     { { 0xa5ae40977da39b54L,0x98e4d1d9f1d40635L,0x40d97af126154fc6L,
49251         0xf18041d4e9ae28c3L,0xdca9487555978c61L,0x4aaddec43638b9b6L },
49252       { 0x1e615a2eab925f91L,0x5cfbbe9ded8a50faL,0x0f26d3ffb2034aa1L,
49253         0xb2f9cee2c4813646L,0x2195af47957b6709L,0xa55dac537e7fc45fL } },
49254     /* 56 << 84 */
49255     { { 0xe44a8ed7630816b2L,0x5fb9b643cca34310L,0x07826148a3b5d2e2L,
49256         0x0f890db16e65c2efL,0xe9feebe288283844L,0x8e56c6760368a9f4L },
49257       { 0x8f0cc9c93e4ce874L,0x646ede9b09f1beffL,0xe92d6bda014e3d19L,
49258         0x27e620c5520c921fL,0xfd9b2ae1eed78555L,0x68684615816a603eL } },
49259     /* 57 << 84 */
49260     { { 0xcf54e9e89ded00c7L,0x8dff0130abbf7765L,0xf12773fb10c5f8d0L,
49261         0x7435ac767382e4eaL,0x93092b16f61d443fL,0xc1554fa846eb45cdL },
49262       { 0x0896852c30957ca5L,0xc0d91e3effe60944L,0xce8aee57a1b7c75eL,
49263         0x4d24f07007cd1a9eL,0x3d8e381094456b11L,0xed6fba6b9dbc9d0dL } },
49264     /* 58 << 84 */
49265     { { 0x1b1de3ed8b5b8f82L,0xf542399d64252363L,0x23f34cccd206f26fL,
49266         0x54c48d9fbd941d6fL,0x3859eb56202e757bL,0xedcb4729ae0eaf7aL },
49267       { 0xf08753c512360fceL,0xf37ece765f697cd4L,0x073cae01c98a7c8bL,
49268         0x6e298559df664bdaL,0xe8cefd27194b103cL,0x56301e2a811f6a71L } },
49269     /* 59 << 84 */
49270     { { 0x8103c6053d3fe586L,0x472885b3999bb4caL,0x3759d2d492a2834aL,
49271         0xaa4eb3acd46cca1bL,0xcb99aaba633e579dL,0xf9369b033d6dc569L },
49272       { 0x55fdb1fe8398c067L,0xd7aab8b47e6826ceL,0x7f5497bd8b525561L,
49273         0x2e0e1e9c2cd0e3beL,0x3142a6e2c47caf5aL,0xe78cb1840f4b802fL } },
49274     /* 60 << 84 */
49275     { { 0x0a1577baf455f6bcL,0xaeeea79094df32b3L,0x1af3ba0f6bbb15ceL,
49276         0xaab92a74e8522659L,0x84087a8f7efa0a4fL,0x83c6991b84596065L },
49277       { 0x11f7829d29fbb626L,0x32b04b2f86031974L,0xf3a5b8722c1291deL,
49278         0x2ffcc97e8bd2be43L,0x575400d10a206f7cL,0xbb4583de0befbce6L } },
49279     /* 61 << 84 */
49280     { { 0xd448eafaab983fd7L,0x2622336c7a18a7e0L,0x36632e221c274b3cL,
49281         0xe64e8f89bf086fcfL,0x1dced08fef72ebd9L,0x61249c25ea295d31L },
49282       { 0x7433743d3755632aL,0x9d766243ff32ed08L,0xc36e816a977b1d9aL,
49283         0x1069fc0820ccec81L,0xbd4af7bef65a0cd8L,0xd04127fc92e31836L } },
49284     /* 62 << 84 */
49285     { { 0x39560937ea57ca46L,0xe1f2b7198229d346L,0x462b28d4dd02dcbfL,
49286         0x510fce98a333d609L,0x795fbd38fefa05beL,0xd6e34c231bcb029dL },
49287       { 0xf33291fc838f7ec3L,0x2a01a1f5f16e7247L,0xf9737722c0bcb3cdL,
49288         0xc53ef57ecc8a6c77L,0x219372afc750f1a7L,0x3e6a97c3d14e60bcL } },
49289     /* 63 << 84 */
49290     { { 0x87278f062db3d752L,0x64c65f5cd106b7a8L,0x04ccc14d41ee7aebL,
49291         0x72d1189e71952b60L,0x2e88f851080e9ea8L,0x625a6d32913e8df4L },
49292       { 0xd943de73900ee95dL,0x6c12b3b3ecb8b3a0L,0x6209daf2c9b141e8L,
49293         0x81c02f71412da959L,0x222d17b747278f65L,0xaa338805789138e1L } },
49294     /* 64 << 84 */
49295     { { 0xa896d28e4aea3fa2L,0xc6137a456db06ee9L,0x1bbafe8c06fb15ccL,
49296         0x2daab2961cdffdadL,0x984defc8e1119b3aL,0x9cd44c3cde2a25a3L },
49297       { 0xa7f54ece54ed6d73L,0xd283017f50907054L,0x69130efc6a3b9442L,
49298         0x5d17f1276785163bL,0xc019911b172b1d0aL,0xa19c745f7e3e093cL } },
49299     /* 0 << 91 */
49300     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
49301       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
49302     /* 1 << 91 */
49303     { { 0xe185bdc2ab83d932L,0x0a75845dd7c4e754L,0x1f6f3397c3fe5695L,
49304         0x6c9f3a5f61f6a04fL,0x3c0f9d4bb390a92bL,0x9e3336b74793b454L },
49305       { 0x91ad0c341472f06bL,0x4110047a892cbdd7L,0xfa24d90565d53c83L,
49306         0xd63e58334176007dL,0x741089fd2cd1623cL,0x6b3d92022685d345L } },
49307     /* 2 << 91 */
49308     { { 0x1d510157c9cb7f6dL,0x532a077346ab7372L,0x2ea07e2fc6dde9e2L,
49309         0xceed9ad937d5bb1fL,0x3121994b98cc6e28L,0x67d2fbb567ad8fc4L },
49310       { 0x34707fb3dc9f195dL,0x6a601f481fd5a013L,0xfe939b8d81ef6cb5L,
49311         0x5c51e8ab1223a9a1L,0x8f6d7993db74cf37L,0x0b81c5b7972808e1L } },
49312     /* 3 << 91 */
49313     { { 0xcb4e85123bf921afL,0x28fc6332532e81d3L,0x682d8637f69f907dL,
49314         0xbd9fa8f45f759a16L,0x091ea9fa51f03716L,0xd685a14132c630e9L },
49315       { 0x7600c9ac3d249cf4L,0x687e2022002cd2b5L,0x7ec205ab55334058L,
49316         0x9d0d86b13ecf1368L,0xb3fc17a7fc7baf6dL,0x57939961361c91cdL } },
49317     /* 4 << 91 */
49318     { { 0x0db33228010c0754L,0x10635ffa8eca7c59L,0x6efd85380e8a38faL,
49319         0xc1812ea5769360d8L,0x505723dc76f27ef5L,0xd0358e02f35af2e8L },
49320       { 0x9f7bb7fed99419eeL,0x87c66e83430a0e2dL,0x01187549773eaf7fL,
49321         0x05bbbba489d51bdaL,0x52cabb06640ccde6L,0x0d5cb557e7ff387dL } },
49322     /* 5 << 91 */
49323     { { 0x709d61ca10e06f1aL,0xaa1e9fc578eba75cL,0xf85d062f914b2cfcL,
49324         0xe73b3baf9089d85cL,0x4ac05feac4a284b9L,0x92c78a433acb7268L },
49325       { 0x7b5586f8ee45bb4dL,0xc39a0d0e6ac0a9e7L,0xe4bbe3d54d6f9ab8L,
49326         0x1489463f1fd46a08L,0x3ba3182529dba364L,0x94f000d68138511bL } },
49327     /* 6 << 91 */
49328     { { 0x70187dfbc39c1cefL,0xa785216e0c50c71eL,0x30188b816a6c0d60L,
49329         0xeaeda67d6a27e97bL,0x4a5192826ba389aaL,0xb96c7c7ea2bf1273L },
49330       { 0x8ff10657267fe714L,0xdff4a271996d91b7L,0xe34ba3e11dc7aed4L,
49331         0xc457048b38853d61L,0xe89825db1ccbf658L,0x68c7b4556b255eddL } },
49332     /* 7 << 91 */
49333     { { 0xdc14cb2a74871e18L,0x017b1340fcb8974aL,0xea5cb0546e93c20fL,
49334         0xa7c078ada9e2ad1fL,0xa37207d4beb26838L,0xcd8b3b25de7ee8eeL },
49335       { 0xdca6606a2801a7ffL,0xad2fedcf0f8af3faL,0xf27d30b49b530c05L,
49336         0x071fc1c36b2a4613L,0x363aaa99b72cea9fL,0x7a33ed8f3d350374L } },
49337     /* 8 << 91 */
49338     { { 0xc377b373bb20fabfL,0x68d3aa52f986b847L,0xd9c2f2adf39b6894L,
49339         0x1bbff106bd6da22eL,0x3f7e5b8e7e09678eL,0xad6a87897ed3ee78L },
49340       { 0x689e6b31af9807b9L,0xeca87778bd1f6ef2L,0x17d3277edda78c54L,
49341         0xe686caccefb65cb7L,0x758aa1ab19a30f0cL,0xb40df97fb11f071eL } },
49342     /* 9 << 91 */
49343     { { 0x43b379f71a54cd32L,0xd61fe6c948817fa8L,0x6d7b0acc49ab7a6cL,
49344         0xee23b4a0eb6bb45fL,0x340da1f1a2bda931L,0xfdff68411750ea8dL },
49345       { 0x890346b8a96c7df8L,0x551993aed4fafc31L,0x2830b98890de711fL,
49346         0x4d23863cfb5b5286L,0x327161a0d636d67cL,0xf99dded9733e1725L } },
49347     /* 10 << 91 */
49348     { { 0x0bef2d2517da64c9L,0xb94dfc85470bbc15L,0x2c2417cedd4af7aeL,
49349         0x52b5b3bbc8e88ca4L,0xc00328c44f20d154L,0x024290f730af5d4bL },
49350       { 0xe8bacbebeefc7350L,0x89eed6ebb72abd15L,0xb67d1da61d9e7030L,
49351         0x2ddefcbc0e70a331L,0x7d09bc6d61e32577L,0xc2073cc95b52e979L } },
49352     /* 11 << 91 */
49353     { { 0x585939298b806bfaL,0x608ddfbfbce6a08aL,0x674545a08eb27b54L,
49354         0x4b57a947c8fba762L,0xcf960113cbd8c683L,0x7b5a479a4fef1937L },
49355       { 0xe26eb960450e97f1L,0xf04b36b9d8605a37L,0xb208c832ee5af2b3L,
49356         0x3578d3a71fa337e3L,0x22547fca93509939L,0xd93dcb50e848508aL } },
49357     /* 12 << 91 */
49358     { { 0xd40f36e6276f2576L,0xd37455c46405cfe4L,0xe34094d7cc51dbaeL,
49359         0x20f93f0f0edf8bf9L,0x534b75aa23b5e165L,0x438e4dd1dc1b73a8L },
49360       { 0x9dd48c413bddb435L,0xc49867a0996b4932L,0x4212f8a2a9ffa0daL,
49361         0x8d5236c4d94ed9bdL,0x81bec489f169cb19L,0x71cc1d7e6104edfcL } },
49362     /* 13 << 91 */
49363     { { 0x31a94a7f22771941L,0xa277284b39867dc3L,0xc66bd88b1a52f0f1L,
49364         0xd2e2707b1aa21ee8L,0x78e4f280248d61e2L,0x33df48c7596a31f9L },
49365       { 0xb9bf2baab1bb1e89L,0xe1bbcdb4038f10e2L,0x81f674a877b89305L,
49366         0x8b2ec6ee16f08a86L,0xa07239c29db97ceaL,0x9f4ae6647ef8ecbcL } },
49367     /* 14 << 91 */
49368     { { 0x9cb21b57012eaba3L,0xcfce54821347a83aL,0xe3f3a67100d7b34bL,
49369         0xd4bcb3d1a6c1b0c3L,0x6ebd26fb9f3c3e31L,0xd01746532dc79be8L },
49370       { 0xe7cf9a0ad4156cfdL,0x2757cb0416face21L,0x8b0e320e69e1f08bL,
49371         0x2a8caf9b946f83d7L,0x6daff0ba98a399adL,0xb4dfea0938ed6086L } },
49372     /* 15 << 91 */
49373     { { 0x90ed8b41e2bcf8ceL,0xa464972be8dcc1a6L,0x5a3d0b80ba496081L,
49374         0xb636435569f85ac8L,0x0a2765b1a25bdd8aL,0x87a6c18f0d1516bcL },
49375       { 0x9344081ae3b01522L,0xcef8e12e608f0145L,0x6f3566a52155e7deL,
49376         0xcfc1be9c4d033a3eL,0xfc836eeaab97bf98L,0xbdf53718ba7dd059L } },
49377     /* 16 << 91 */
49378     { { 0x16f3708b953b9223L,0x0d3780f8770e7cf3L,0x97a615b227bb71a8L,
49379         0xa8b9a864162f8b55L,0x80ee8362d91e3fb9L,0xb2009a09f83a4ff6L },
49380       { 0x07a7873ac1696281L,0x17ff00c223095ddcL,0x427f683d860d60baL,
49381         0xea9959271f87d32aL,0xb2ac69faa050319dL,0x30c362b9d2d0b9ceL } },
49382     /* 17 << 91 */
49383     { { 0xe05c6a88783508b6L,0xa5569c8ee1779a78L,0xa1e0ca30cc1e84ceL,
49384         0x12ecb540337cca76L,0xafb5e2fb344d729fL,0x558db4e132c8f80bL },
49385       { 0x5aa3c39523128383L,0x9f04757cee1ee2fbL,0x41132bd215356deaL,
49386         0x4e9af313ae07ca78L,0xdfc14c0100c6b589L,0x54fdb4f3dc16a1f1L } },
49387     /* 18 << 91 */
49388     { { 0x71e663c234938279L,0x9a8f5ccdb05630f4L,0xd91ead12aad70096L,
49389         0x2b19b27e9e46cf72L,0x93348c7038e3932dL,0xeab6c03a5c7617b4L },
49390       { 0x57c13a97538eab27L,0x2624d17b2f5872f7L,0x77b63d9104b00f8eL,
49391         0x2e0582473c89db0fL,0x5d367277937d0d8aL,0x28c19068df60c252L } },
49392     /* 19 << 91 */
49393     { { 0x9867bc3d38cd6020L,0x5f341d8c5986f76cL,0x108a3c0d0dab2e32L,
49394         0xd127a7f989ab3654L,0x9d5018f468505cecL,0x51204da0a8fc94a4L },
49395       { 0x1751f30cf6da9840L,0xafe6a8d955ed1f74L,0x270a5d1180165ac5L,
49396         0x739f63e05de1e17bL,0xaa95f30735d2b566L,0xf20dd093650236a9L } },
49397     /* 20 << 91 */
49398     { { 0xd648dd79ee45d4b1L,0x0ceeaa64c2bc2f0aL,0x695f3a3f491a2862L,
49399         0x4c07e2e0ce497e3dL,0x5c53879969c766c2L,0x3f856a2e4c4a7c14L },
49400       { 0xbf8a6d81038032a9L,0xbeaadd7f45b7c960L,0x78b22e85d50b9d26L,
49401         0xac1c56fa7eaefe26L,0x21fbce54fc69f13dL,0x37be1b47512a3708L } },
49402     /* 21 << 91 */
49403     { { 0x12845d55689429afL,0x7e20f0f9082c8ac8L,0xe1615340249773b6L,
49404         0xf66c39638d0f35afL,0x4a20ce6d67d27093L,0x1d462f08e55802caL },
49405       { 0x66f209849ff4dd67L,0x6b86f8d8271c57b3L,0x8701a5cde766b85bL,
49406         0x50737ac2eea5fbfaL,0xb46ebb42a702f3d6L,0xf853091d999258bcL } },
49407     /* 22 << 91 */
49408     { { 0x0ce992198c9e7869L,0x653006be525c4adaL,0x783620e4330c402dL,
49409         0x185a6ac833b728b5L,0xa297c4a99d390886L,0x547d1db5db4b8123L },
49410       { 0xccf12f071acdb039L,0xe89c5866078ddc28L,0x3460cbb1e52c383fL,
49411         0x7a4d1beaad25b82cL,0x21e243fdb429be1bL,0x5aa85c25bdc0d798L } },
49412     /* 23 << 91 */
49413     { { 0x76cf73b9c0db9d16L,0x45e57cdc1970ace6L,0x3c6f5314c54a109aL,
49414         0xe32306f7da47cbfbL,0xb3787bdf93e76516L,0x68aa80084c6d4e22L },
49415       { 0xd9246ddcb3d37be7L,0x6de2bb4d7000f1abL,0xda02568b67e4751dL,
49416         0x3ed7a5615c7f88f4L,0x5f05c828ca5116caL,0x139cc5772a2ebb9aL } },
49417     /* 24 << 91 */
49418     { { 0xc983afb64cb8d897L,0x7f05e954b14cc152L,0x587fe71e0f4d02f5L,
49419         0xaaa43167531b0cd8L,0xf69452727a26def9L,0x7ecf1e563bab50e2L },
49420       { 0x04b6f5c94c6f20abL,0xbc6cec2b893b497bL,0x79e89567c9dc548aL,
49421         0xa39a0a567a40b749L,0xf1531e2644bd4efaL,0x14cdd759057c7c70L } },
49422     /* 25 << 91 */
49423     { { 0x30c49847d6d51bbbL,0x70b744feecdc6aeaL,0x38cdf36fe8671744L,
49424         0x5834286b8cf6461fL,0xf3414f7b2c09d632L,0x58425e4d5debb923L },
49425       { 0x8bd79117a6b96c6bL,0xecf9802680f56fa8L,0x5ae917d7e6dcbbf8L,
49426         0xf2d80fb169240a4bL,0x005ac47596e3aa3aL,0xe5196a3463536aa9L } },
49427     /* 26 << 91 */
49428     { { 0x5fb02929811d42bdL,0xd7d1b956289929b4L,0xfd3546947e531627L,
49429         0xa37c9b1e58c2b2e2L,0xf30ed0f902bf499bL,0x3fe80d240eb6df36L },
49430       { 0xf96270e57b148672L,0x47362483647f48d8L,0xc279ece6c29bc59cL,
49431         0xc05c1d9ffdd7e628L,0xef8fc92e17568a7eL,0xd65fe5a9ec0e7f00L } },
49432     /* 27 << 91 */
49433     { { 0x0ad31de68c93f010L,0x151b1405945ec54cL,0x325d132c3db6997cL,
49434         0xbed9cb3a335531e7L,0xa83932c34a578610L,0xd905abbf6f721147L },
49435       { 0x6dd45af086d1d919L,0x2b2ee3090195e91bL,0x3dc30d5edb70d257L,
49436         0xfb04b014481bde1aL,0xc2ac3ec82de2debeL,0xc9f161e090db691eL } },
49437     /* 28 << 91 */
49438     { { 0x8041f112afefdee1L,0x8cab3c86b891f668L,0x1f18774e2b61e754L,
49439         0xf0d81b2459df567cL,0x2cc25da41c95e1ecL,0x315b1b1ac735d39eL },
49440       { 0xd0a9b9fb010734cfL,0xeefc0398c79386daL,0x49ce859b11fb1917L,
49441         0x3d66fd6baf167239L,0x2522b0ef1fea6175L,0x1a27657d3ec4a52dL } },
49442     /* 29 << 91 */
49443     { { 0x89ec003abb2ca05dL,0x2290b5f403195ec6L,0x9989bd925f6b95b5L,
49444         0x1d6e6b2fad409cd9L,0x41f9b9ce3bfe7364L,0xb240f89570ec096cL },
49445       { 0xf8725a58b8d5a5d6L,0x3bfec6f1c581930dL,0xc93e290356235c98L,
49446         0x82af4269c7cdcb5cL,0xeb13fa40eea6fe91L,0x9247050097c80acdL } },
49447     /* 30 << 91 */
49448     { { 0x48dc23534ded5b58L,0x1b69590756e707caL,0xbbcb73927ec7794fL,
49449         0x3714dfa6e50dbcc8L,0x4f8083c8f27ec5d7L,0x6358d2273bc8c3e4L },
49450       { 0xe0c2a0e7656cf184L,0x3996e0a24244d801L,0xa46767b54e543c01L,
49451         0xbf55776d965f1e2fL,0xeb66845e6bc872eeL,0x6a73fef1b441895cL } },
49452     /* 31 << 91 */
49453     { { 0x21602e432b26bbf2L,0x6092d570d1bfd7e2L,0x2b48d74a30b38d1fL,
49454         0x4aab113c67c53791L,0xa6acbd3df57be611L,0x53b6509ebd3aae7eL },
49455       { 0x047e5ab4d8751f49L,0x978ed11b0cf25652L,0x763553d2153619c7L,
49456         0xc7e85e93d824d943L,0xb82cc9781048a7ebL,0x7beb9166e39cc777L } },
49457     /* 32 << 91 */
49458     { { 0x24480c57f26feef9L,0xc31a26943a0e1240L,0x735002c3273e2bc7L,
49459         0x8c42e9c53ef1ed4cL,0x028babf67f4948e8L,0x6a502f438a978632L },
49460       { 0xf5f13a46b74536feL,0x1d218babd8a9f0ebL,0x30f36bcc37232768L,
49461         0xc5317b31576e8c18L,0xef1d57a69bbcb766L,0x917c4930b3e3d4dcL } },
49462     /* 33 << 91 */
49463     { { 0xf6625ac0b9a038e8L,0x954056eb2a921e56L,0x7135295aeac07bc6L,
49464         0xedde9c39f1ba0ea8L,0x628324026b592655L,0x4603177aefb8aa66L },
49465       { 0x63e5ea16406a6c28L,0x5897fdee1c758382L,0x515e49fd415533c9L,
49466         0x0a0dd627d6701b21L,0xd7c06db1c93a312eL,0x4fe95e3da33d8df7L } },
49467     /* 34 << 91 */
49468     { { 0xf113d92c3336edc5L,0x0a201f3e8ce47278L,0x57492feb5c52562fL,
49469         0x18b73800f29da837L,0x2262089f649a1ee8L,0x076b07657c99bf48L },
49470       { 0xa95050bc09bfad20L,0x5aeaa9088c7e713cL,0x264283ed3cda06ccL,
49471         0x5d574b116079b43dL,0x0071495cced10a84L,0x97441fb0570d3063L } },
49472     /* 35 << 91 */
49473     { { 0x340831072b228335L,0x84ea0aba50fbd43dL,0xafde6098b3ec91e4L,
49474         0x4fd293ca1091ad93L,0xee085e23552a785bL,0x437d799ed7057200L },
49475       { 0x41f735628a611ff4L,0x707a7cb5d2ef6254L,0xa9a8f00092a30686L,
49476         0x901cc8e60cea8d1dL,0x1fbc9ca6d6da2ddcL,0x61bcee2176489604L } },
49477     /* 36 << 91 */
49478     { { 0x5f6ef134781a7f53L,0xbac4cf47b10a9d16L,0x48148ba110e69f4eL,
49479         0x40594360a9c615f0L,0x3141817ddfb3fc58L,0xb9579a9263c38d83L },
49480       { 0x0544b1bb6373b9aeL,0x718a5fb7007c8185L,0x48d4a4f77cfa392aL,
49481         0x9c16cb825d44ba38L,0xc83d2df42a8fa83fL,0x835aacccc08fef0cL } },
49482     /* 37 << 91 */
49483     { { 0x09ce1818af09fefdL,0xd1d2f95f5dd9d687L,0x94ed08b5495c4eaaL,
49484         0xd1afff464a0b95d2L,0xd51ba2b455347a75L,0x413126295e3866edL },
49485       { 0xeef2d7e3cdd37660L,0x50e6fbdfec2fe50dL,0x9d071e18a664e2eeL,
49486         0xe70e1d9ed6a8f467L,0x576d0cc4e13afc19L,0x67ced86da0efc220L } },
49487     /* 38 << 91 */
49488     { { 0xa26968cb26a963daL,0x461d1ab5cecbd96bL,0x8eaa1834b3e38516L,
49489         0x1e92730f05d2cd2bL,0x91112026b07cbf92L,0x26eb815062374314L },
49490       { 0xa904f1d08ab1b9d1L,0x52006594692b1905L,0xc9cc90ca6ba4717dL,
49491         0x4bd7300aaad1c74fL,0x67ba07a4c21c5832L,0xdebfd810fa56a1a8L } },
49492     /* 39 << 91 */
49493     { { 0x3bc5aaf484539b6bL,0x6ca9ac0c0d1249aeL,0xb59da22db4ee30c8L,
49494         0x6e62553e57149c9cL,0x46db0089786333cdL,0xe1e2ae523e4c12ceL },
49495       { 0xf828d2b537b3fd82L,0x31844a9d03af654cL,0x85dd8daaea5a4677L,
49496         0x0db99b8f3432e82fL,0x99383b874866e1b6L,0x52310054e325b0c2L } },
49497     /* 40 << 91 */
49498     { { 0x737cd387044854f9L,0x488b2fd667eb29c2L,0xe71d9bb7258c5a80L,
49499         0x21afb486ac71048eL,0x0252b540d4d39296L,0xe3e52cb87839d8fdL },
49500       { 0x5cb1100667ea0afbL,0x207637d1de82b12bL,0x77920933e93bcfcdL,
49501         0x65197f5df32f636dL,0x82179527b6c41411L,0x7696a479f410c989L } },
49502     /* 41 << 91 */
49503     { { 0x78307cd80e8d576cL,0x10d3b950fd9d6044L,0x2c2f9e2bf4b20445L,
49504         0x961343c72c5c7ea7L,0x931c52a0af640e61L,0x45557391470d420bL },
49505       { 0x4096a997317f4d26L,0x15210801cceb9be5L,0x228102195ff0759dL,
49506         0xc388a2d21d265932L,0xceb79d01e86dd99bL,0x23e8fc7b3311dcb3L } },
49507     /* 42 << 91 */
49508     { { 0x1a7d0e091d7743eeL,0x18720797d53e4a8dL,0x78465f1ea04dbaa1L,
49509         0xd4f064da9ce65723L,0xc0e7c035b496e8d4L,0x25657d2e6bb2f9ebL },
49510       { 0x45576ab49f4b6cb5L,0x83983c70ba33d6dfL,0xf699e84d1eca62a4L,
49511         0x35528636a13f5c31L,0x6a1b56b01f6b1739L,0x7906eccc6ea87942L } },
49512     /* 43 << 91 */
49513     { { 0x4e584a4fec1204a5L,0xd96b00e845a5b311L,0xea11fb03030badccL,
49514         0x9b2141b2a825a89aL,0x18bbc30bf8b2450dL,0x87bd93916513b2cdL },
49515       { 0xb3dbde552f0b304dL,0x762f3dd7c3c4817bL,0xe51e1733edd3fdd8L,
49516         0xddad4c515d8219a2L,0xf5a8c0b8796b6877L,0x34563a8989bf65c8L } },
49517     /* 44 << 91 */
49518     { { 0x93e2e3a2881c106eL,0xa227cc49fe82afd8L,0x6fee74a4748e81f3L,
49519         0xb212e8eaa5dd966cL,0x68d270efdc7d8883L,0xef2f3966fe757e9eL },
49520       { 0x0340098b7466881eL,0x7ab98a0575884bbfL,0x24783467a472f62fL,
49521         0xc73cb49f988637d9L,0x2b5e9d27dfb710c9L,0x503f9a2f788fcb18L } },
49522     /* 45 << 91 */
49523     { { 0xcba6f4631a52b729L,0x8874582cc8be34cfL,0x98a08e246a9a1eaaL,
49524         0x77094319d5693f71L,0x575a0938a8504e5cL,0x3f59910c226f888eL },
49525       { 0x5c3587990aeeb1f1L,0x7c32821d3613bbc5L,0x66f288e7cc17db95L,
49526         0x6f3221998724ac94L,0x4e3fa38981db3751L,0xa6e798c8420403baL } },
49527     /* 46 << 91 */
49528     { { 0x56672f2e2cbea2e8L,0xd1a02df9128bd636L,0xff6a3bc6d47a0025L,
49529         0x24124f30d38d0b42L,0x89ac3b8dda63df29L,0xf26d72994d0b6458L },
49530       { 0xfff0445f7d6880bcL,0xface90f52be76351L,0xbf10c6b8ebffb74fL,
49531         0x0e53c533a1fba003L,0x037baf09112f4980L,0xb8ae6312be960954L } },
49532     /* 47 << 91 */
49533     { { 0x8397b60917270d4aL,0xb4d0c38700e4caeaL,0x69c52bb3f4c58f86L,
49534         0x06e0e01157b1fd41L,0xc5dc2f25627873a2L,0x9af848ca0ae53974L },
49535       { 0xb5c957c06ad18335L,0x93b564154ef09e7bL,0xb5ba282450e2c5ccL,
49536         0x63f003a567d7b68bL,0x0bcb0dc820bcbca3L,0x8803b1ffe3d4296aL } },
49537     /* 48 << 91 */
49538     { { 0xff41d51faae4bfd4L,0xcf50b14117c44facL,0x078b808e657a1ea4L,
49539         0xc5aac1a893c00c55L,0xcb99cfd0cc4d1c0fL,0x1d1048933fa123a6L },
49540       { 0x49646059023ca92fL,0x5833e326f3982134L,0x2e0d4bc9c5781cddL,
49541         0x5f7f84ed8d5e75f5L,0xb6655f1fe1e8a383L,0xcc18514c296e4943L } },
49542     /* 49 << 91 */
49543     { { 0x5d3e5f8d8a407ff0L,0x9c713c8c7b42b11cL,0x7433a9921e387806L,
49544         0x5272b92a98cb43acL,0x6261dfc1b1018149L,0x229d2ba5d3b4adf4L },
49545       { 0x1f52e72989f0905fL,0x965e062925d4c79cL,0x42edaeeb33e6c016L,
49546         0x5ec492e8af1709adL,0xaad39616c5763619L,0x85a659098c666860L } },
49547     /* 50 << 91 */
49548     { { 0xec8fe7dc86009df6L,0x42dd3c37871b20a6L,0xe4388c920db643e4L,
49549         0xcc5dfdd481e06dbdL,0x3f1a3c6458ca7500L,0x987d7caa22c04e9dL },
49550       { 0xd0c91072bc5717e2L,0x3f605fd2e77e5509L,0xa1cc1404c0c3e95eL,
49551         0x4afaa9fdc6d0edd0L,0x2f3aba4e0d7d882dL,0x3f1f0349796c5ac0L } },
49552     /* 51 << 91 */
49553     { { 0x5dac93982eeb82e8L,0x2fe5ffb57536ce1eL,0x2bb120ac6926cfceL,
49554         0xe54ff20f2236dbf0L,0xaaf0d31edf8c5a87L,0x5262fb9fc8f5df7aL },
49555       { 0x0f833760467092bcL,0x50fa223d0a8dc0afL,0xd6a4847d35406966L,
49556         0xd17d6ce003b7f56bL,0x8067d8e2ee2d64bdL,0xe33e51bb9fa4fe9bL } },
49557     /* 52 << 91 */
49558     { { 0x52aa210770248e4eL,0x30cf7e773b6bf709L,0x36961c7b788e1836L,
49559         0xbe49de5f7595af2bL,0x86b49b619cbcba78L,0x1947db3790cf1117L },
49560       { 0x7d3f599de14b4287L,0x14546993f0ca62ebL,0x0f6c8872d0abde7aL,
49561         0x1531ceeaafe2260fL,0x36449624ae5ecf96L,0x6cfa12a5840bdc19L } },
49562     /* 53 << 91 */
49563     { { 0xb092ad68c1d612b5L,0x9f6052507af5c37dL,0xf48aa7c6c702b673L,
49564         0x380144215cd29c3bL,0x7b09e407121867ecL,0xf71443d391e59047L },
49565       { 0xea51e1a6b6d16a51L,0x041fa7650f33e2ccL,0x3a6d50c73750dce3L,
49566         0xeebf5c2e97cb7a7dL,0x2530de228f39e771L,0x9af217c18f37f863L } },
49567     /* 54 << 91 */
49568     { { 0x38793fd0c683085cL,0x49cc5934dc436d16L,0x94c708e4175e770eL,
49569         0x41bfb65d059c2682L,0xf6b83eb75f004ddeL,0xe1881929f6864410L },
49570       { 0xfaa77fe0b438f937L,0x97a856069997e90dL,0x78366a9108de889aL,
49571         0x6c28ef64553229cdL,0xfce82c2fe9381854L,0xae98117146f70bb1L } },
49572     /* 55 << 91 */
49573     { { 0x3f77410e9aacedd8L,0x0e34bd7d453813e4L,0xc5818436825d6b0dL,
49574         0x0e30f037b4d0ac73L,0x70f6bc9b69b559c5L,0x68d3d71eaed15484L },
49575       { 0xd0254e5414fbae1eL,0x6ddaad42ae0d3df6L,0xefb91a545a6e98d0L,
49576         0xde3fcefc854ee5fdL,0xb2f0f3a1dfa2a8a0L,0xb656f97ad00ded3aL } },
49577     /* 56 << 91 */
49578     { { 0x01acfa7e0a90e37fL,0xf47e5946366d0ba0L,0x8e37db7b54c11845L,
49579         0x5742d8bd50a62064L,0x27dc9a33ed6d096cL,0x2246d73016deb724L },
49580       { 0x203c08da2c8f1a85L,0x210cda3a56fea379L,0xea6b1bbf2bf9ed67L,
49581         0xe5a1e5552395cc4bL,0x458a7e19de2d6b2fL,0xa7199a86734942a3L } },
49582     /* 57 << 91 */
49583     { { 0x53684c23d44cad85L,0xd23613f8940779a5L,0xf485c7a3940bd34cL,
49584         0x64c66a1f3f673b5eL,0xec29c76f1d6dd63cL,0xe10f56272f191435L },
49585       { 0xc054f9a7325d5759L,0xe6740d3f974edaf5L,0x2723ac6103f3b640L,
49586         0x0a2315a4576e0bbeL,0xf8156e1e4a3ec903L,0xa307bc249bbc8c52L } },
49587     /* 58 << 91 */
49588     { { 0x78579ca212a1687aL,0x208b7494268a02a2L,0x61708a002c1c5243L,
49589         0xca366915a760461eL,0x0e9038fe3ca1e167L,0x2cfd6fe3a58e2c57L },
49590       { 0x97c16e34fe79a49cL,0x1575244ef08e4037L,0xc1407fa08e2283edL,
49591         0x38ae77621b057919L,0xcec574a5e68a366dL,0xafdfdce03eff00d4L } },
49592     /* 59 << 91 */
49593     { { 0xdad0dca9162d80c6L,0x554141f8b888ea0fL,0x1e471b24d4036218L,
49594         0xafca22cfb36102d0L,0x437c51bff280dfa8L,0xc2c8bc8b50c9c30cL },
49595       { 0xe7bacc372a9fdf6dL,0xd01dc65cf0472f2dL,0xaca59cf983d7be3eL,
49596         0xf7c935425d9ec484L,0xc22046c6015a08a1L,0xa71b3c64cecdf816L } },
49597     /* 60 << 91 */
49598     { { 0x4b7d0b277abe7856L,0xe566f4567acdb39cL,0x70c6cdf20047ae7dL,
49599         0xd27f831233ed0392L,0x498f0ad0358a429dL,0xed97c4668e6ee95dL },
49600       { 0x3d11cd69f3018515L,0xedd460344c1b367bL,0xd75660e3b3ac8ec6L,
49601         0xc80dfc0fa541e6e1L,0x80026f005c091a6eL,0x62b86784c426f2bbL } },
49602     /* 61 << 91 */
49603     { { 0x417408e529ee8eb4L,0xe92f18c2917f9951L,0x1f471f0eb38b6210L,
49604         0x53cb14264df240f3L,0xeaf7fc0067c29b25L,0xbbf46fd3d99cb613L },
49605       { 0x05cd552eb465b50dL,0x136b8e675e136733L,0xd7d50f61ccf61776L,
49606         0x90187ec5a32b01f4L,0x21548ec523ba232aL,0x6c8266c0748e558aL } },
49607     /* 62 << 91 */
49608     { { 0x762f413d7650470dL,0x9b4af5d018c9ad5dL,0x85fe90460ea625a0L,
49609         0x4af4511b2200cadbL,0x4c16980defec2921L,0x42ae5d5d60dbe1a0L },
49610       { 0x0785260bbb2ceb1bL,0xd181ea3242f1fb7bL,0xc34f02b13a47672bL,
49611         0xb0bc79f770e58634L,0x6e7967098a8509aaL,0x05870e6f3c3e6d44L } },
49612     /* 63 << 91 */
49613     { { 0x46d4fef752f7c595L,0x5f35083a8a07819cL,0xbba477ca591233ddL,
49614         0x4e66309358e307deL,0x65c3e2b9ef827537L,0xcf7b7adb09ee9adaL },
49615       { 0x00a82d4b5f5e1434L,0xd6aecb8032e50afcL,0xffdce7ce6b034271L,
49616         0xa95d96ae036d5058L,0x61582ae24cb7d60bL,0x6a10577474139c1bL } },
49617     /* 64 << 91 */
49618     { { 0x53ebbaaeb475d8f3L,0x3d6ea31cff76bedaL,0x3c15f25d340986b4L,
49619         0xc5925d2e3365312aL,0xc35d3ee251641f96L,0x11eb2f75984128e4L },
49620       { 0xb41a21a83d04bc99L,0xf2d286006436c3d0L,0x4ffcf4c0faf5663cL,
49621         0x889d285a0a62c9dcL,0x0908665acb2d60c5L,0xe2f19c590a131be5L } },
49622     /* 0 << 98 */
49623     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
49624       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
49625     /* 1 << 98 */
49626     { { 0xc0de60f5091354ffL,0xd7cc38bba1bd1975L,0xf4122aa8e734e2dfL,
49627         0x08f40f63ef773db6L,0x0a7e9484ce2d71c5L,0xcc79173378a3f825L },
49628       { 0x0cac7a5bb47beec9L,0x1cbea0e4a3f7b5b6L,0xecf19a90d3e18145L,
49629         0x0d1b062a0aadf689L,0x42299f1ff3f0acf7L,0x63a645395ac252b9L } },
49630     /* 2 << 98 */
49631     { { 0x44bfd1665c1d4586L,0x46434e198d1d86d6L,0xe50fcf81c3936683L,
49632         0xc9b4eb068b08680fL,0xf90882c52832aab0L,0x42823cefecbf5ddaL },
49633       { 0xfd4d51c744ae08f0L,0xb54a08f1bbd21c1cL,0xb72953dbfb187c34L,
49634         0x166f7f26f8ed037fL,0xd2b1077a097bad45L,0x47794cdc790dd808L } },
49635     /* 3 << 98 */
49636     { { 0xfadb2ac4bac8b691L,0xf0c5a0361579c4d1L,0xa192474f79019224L,
49637         0x8c7a64574117a323L,0xe58122dd84d970a9L,0xc475893c0bf77208L },
49638       { 0x9518412f1bd45c95L,0x75bd0a72283f7a3bL,0xa9e871605fb7e6f1L,
49639         0x14d3c944df67acedL,0xbceea947d0348c22L,0x5331c192d021aba4L } },
49640     /* 4 << 98 */
49641     { { 0xa05c751cd1d1b007L,0x016c213b0213e478L,0x9c56e26cf4c98feeL,
49642         0x6084f8b9e7b3a7c7L,0xa0b042f6decc1646L,0x4a6f3c1afbf3a0bcL },
49643       { 0x94524c2c51c9f909L,0xf3b3ad403a6d3748L,0x18792d6e7ce1f9f5L,
49644         0x8ebc2fd7fc0c34faL,0x032a9f41780a1693L,0x34f9801e56a60019L } },
49645     /* 5 << 98 */
49646     { { 0x35df68ae1a504405L,0xe41d69508fc755b9L,0x420dc1cda6297243L,
49647         0x3011646b913fb68fL,0xc4b630465e141a27L,0x943b3b3bbd91fe5fL },
49648       { 0x3ca17d6b50c31708L,0xce88b5e74ffa8c71L,0x8b60038f4dacd2bcL,
49649         0xdf654d723c13cf9bL,0xb5353e281d871b40L,0xc2d27919226663d3L } },
49650     /* 6 << 98 */
49651     { { 0xa028d2fa9b87715fL,0x7cdd9b4a453625bdL,0xc8afb1890be3dacfL,
49652         0x40289a3a274c4e2eL,0x7f5f9f7677c6bbadL,0x577c0935bdfeaccaL },
49653       { 0x5f838f0404281989L,0x8650a974ebfa410dL,0x414fab6dcd56dea6L,
49654         0x6995cae292eed440L,0x3b474d27ab146e15L,0xe24262b2e9938f84L } },
49655     /* 7 << 98 */
49656     { { 0x649e18fba34fb18bL,0xa4883af898cc69d3L,0xff46285f3fd56e37L,
49657         0x2e28ccc4557c0c04L,0x8388dee821a9b46bL,0x0fd4fb807ba3a6deL },
49658       { 0x1d8e9da7c62bb315L,0xfa7bd70d06e44230L,0x2840122063320438L,
49659         0xeefabd47d06c0654L,0xf4387b08d4c8c10fL,0x8f2694624ff2142cL } },
49660     /* 8 << 98 */
49661     { { 0xa4b957d262c36887L,0xaf15a485fc24cff8L,0x11575e80a271d9e0L,
49662         0x0fff68d44b9367e5L,0xf55ba6732279779fL,0x9d72cca6d4d68f68L },
49663       { 0x01474ab1590ffe4cL,0xd20f44e1074d634bL,0x63903a8336111d25L,
49664         0x37342a5fab531cefL,0xd3c93fe7702ed867L,0x05d143696279f7e1L } },
49665     /* 9 << 98 */
49666     { { 0xcddf64873e942b27L,0x9e29835a2bc21472L,0x924c2bfb2d2195e3L,
49667         0xdf4a3cd38eca6d9bL,0x7fe6acd1c5be60c3L,0xa3abee9cfc38025fL },
49668       { 0x014f0d992f449934L,0x8d72657a78860127L,0x92514cb948d84cfcL,
49669         0x8bd4ac503aadd70cL,0x3c96ee00136620d7L,0xa0caeeb54efc5e57L } },
49670     /* 10 << 98 */
49671     { { 0x7a65cdf5bd200ed6L,0x72dc1b5f0e4b1c68L,0x9c09576a6ddf540bL,
49672         0x358dcd122b169da2L,0x6466f0e81639b734L,0xa1429a6ef14c6eb6L },
49673       { 0x4b3d781943221168L,0xfe3d2fdaf3b74fceL,0xb22bcec2ae26014bL,
49674         0xa8900e7ace7e789cL,0x9db9af67220bce88L,0x1f86d2e4fb8ee34dL } },
49675     /* 11 << 98 */
49676     { { 0x6f8e1c0bf8c65293L,0x66f44ea04d7a5dfbL,0x2c3cacac741fdc1fL,
49677         0x72e58aae239f5f16L,0x50dbaf192f72d8c8L,0x24ee526628c97b95L },
49678       { 0xdb5f7827ab3ecb17L,0x2c567337669b05c5L,0x78c97eb8ff76ccdcL,
49679         0x1de1b4a3f8d2c990L,0x5b183974e6138df5L,0x61b74177aa1a1019L } },
49680     /* 12 << 98 */
49681     { { 0xb398290cf0db3751L,0x01170580ba42c976L,0x3e71aa2956560b89L,
49682         0x80817aac50e6647bL,0x35c833ada0be42daL,0xfa3c6148f1baba4eL },
49683       { 0xc57be645cd8f6253L,0x77cee46bc657ad0dL,0x830077310defd908L,
49684         0x92fe9bce899cba56L,0x48450ec4bceffb5aL,0xe615148df2f5f4bfL } },
49685     /* 13 << 98 */
49686     { { 0xcc14267f6be1860dL,0x3de7f48b4ffedea1L,0x8252694e5b776b87L,
49687         0x478c877890dd427fL,0x913e19a675a21357L,0x882f2d5ac078bd79L },
49688       { 0xf442752184c565dcL,0xd772147e3ac3ed26L,0xf21abc752fa216b6L,
49689         0xab1804ad305ff0dfL,0x10d89a07920c977bL,0x0a2240dc4fda6075L } },
49690     /* 14 << 98 */
49691     { { 0x7068e6b98653bfadL,0x16b0da9b8f4397e8L,0x77b953b4946bb9c6L,
49692         0x08366ad749b036f5L,0xd219117b26a3913dL,0xbe3607949a5460d2L },
49693       { 0x1a4acf6dfadd462eL,0x1f7de879c32f3550L,0x11117132669c9b2eL,
49694         0x1deea7d1c87ca216L,0xa88c90c748a058d2L,0x0d8e6afff403ef36L } },
49695     /* 15 << 98 */
49696     { { 0x21f6c96c1ad77f33L,0xb5da9d34992e7807L,0x17fc994ba7192adfL,
49697         0x59f204fcbcc3f8b2L,0x3f4a970f10bd22f5L,0x42936bfcbaa1188dL },
49698       { 0x6239fea5eb985837L,0x5fde15e0b33d1158L,0xe0bbe9b800cf90b2L,
49699         0xf2c6d8b16b2b68a8L,0x58c331cd0f3a2341L,0xe951c48910dab1a4L } },
49700     /* 16 << 98 */
49701     { { 0xdccf68bccbaf4685L,0xb333e464270a2bccL,0xe43ae199254dd3e3L,
49702         0xe8526e26ddce5c84L,0x52bad815ea0b4258L,0x67c12c1b094574c4L },
49703       { 0xa5362fcb861545b7L,0x3e904c35c2b2eb62L,0x0f9312b5eeffc2cdL,
49704         0x5475657b14de4e5bL,0x746e67d4f0233fa5L,0xb5157d7f35471ec2L } },
49705     /* 17 << 98 */
49706     { { 0xcbaf92265315e83aL,0xcc6e9a972f15ff37L,0xcac446dde8c87fb1L,
49707         0x5fa37a5c672d7f92L,0xe66efc07b1380425L,0x2d8ed2e32c8e59ebL },
49708       { 0x8e3ab80461743725L,0xe59a87f825493349L,0xf6995fe16062fe7eL,
49709         0x5d7f8a646e8de27cL,0x4a5ecbbbebe084f2L,0x99fc5ea93f863156L } },
49710     /* 18 << 98 */
49711     { { 0x1ddede1b495fdc2eL,0x3dfcf56b039d6339L,0x54c423806a56c492L,
49712         0xe6bfd184def6446fL,0xfaa2fa123ac841beL,0x503e319a4f9330a4L },
49713       { 0xd9305d4654ad427eL,0x68d23497d95dfcc8L,0x2d935aad1e9602f5L,
49714         0xd7e74bf2e33174a9L,0xc8e4a0b17225e2b5L,0x5db7187cbcda5221L } },
49715     /* 19 << 98 */
49716     { { 0x9a0e0908b0ec0b27L,0x28894b2edd759131L,0x0107bb592b9d6f02L,
49717         0x318921deeea022f7L,0xa1a00f5882c73390L,0x877833129551b381L },
49718       { 0xff866039a3a9dd22L,0xa59235ffdf0fc09eL,0x530c2fe61ca647f4L,
49719         0x77b1ea2860f9428bL,0xeef2a9e6bba4bbabL,0xdbdbe037204f5ea3L } },
49720     /* 20 << 98 */
49721     { { 0xf55edabb90b86166L,0x27f7d784075430a2L,0xf53e822b9bf17161L,
49722         0x4a5b3b93afe808dcL,0x590bbbded7272f55L,0x233d63faeaea79a1L },
49723       { 0xd7042beafe1eba07L,0xd2b9aea010750d7eL,0xd8d1e69031078aa5L,
49724         0x9e837f187e37bc8bL,0x9558ff4f85008975L,0x93edb837421fe867L } },
49725     /* 21 << 98 */
49726     { { 0xf87a92375b2e5fa6L,0x88571e4452a3a605L,0xf85e9a330c8f5f55L,
49727         0xf99886c599dc2c97L,0x5866329d065261daL,0x9011f13912dd434cL },
49728       { 0x0cc67d535284c555L,0xf8f715274a4032caL,0x4b002683a9524bcaL,
49729         0x3c3c12910f63a7baL,0xd19e173e9124eb8cL,0x3431c51c54b7d85aL } },
49730     /* 22 << 98 */
49731     { { 0x7103ab4ae11cc85bL,0x2064ca41789cf87eL,0x592850ead5f13a08L,
49732         0x56b9ff066212e096L,0xa106455d6efa7445L,0x3e62aac92343c5efL },
49733       { 0x7edbf70dcb8ddf7dL,0x27f00a4a5f2687e4L,0x7d4ce32e44a08d11L,
49734         0xe97f0910890a57f1L,0x792597fb912cb027L,0x1fa7a1d2ad3492dfL } },
49735     /* 23 << 98 */
49736     { { 0xbf4e161c3cfad317L,0xda4e6bffa1998bc8L,0x6534ef622e890b99L,
49737         0xd10a3b24d272cc42L,0x3f81b0e5f1194dabL,0x8919caefec549c5cL },
49738       { 0x847ef47f68f5633dL,0x01cd59975468f4afL,0xc38bce29b6727408L,
49739         0x56a1cd1ea4c84268L,0x31a493f406b81088L,0x4461ce8531b37e73L } },
49740     /* 24 << 98 */
49741     { { 0x3503d9371f23a0d8L,0x64c598a8c321dde0L,0x67f101ef5b52e0f0L,
49742         0xb6b5b4c2f955b5faL,0xb5f03d53880e0569L,0x121c3ac1c99393efL },
49743       { 0x90755bd657330666L,0x70ae5793d4d71d3dL,0x326ffd519e9ce792L,
49744         0x1b772d7396ccfa14L,0x652710f4874a22deL,0x72768469db210342L } },
49745     /* 25 << 98 */
49746     { { 0xb2d85722b3413d7fL,0x4e41362092e55ea5L,0xad1a20c7ff7b3409L,
49747         0x743b31c0c6f98cbeL,0x1b5b0b5adab3810aL,0x628d9b212cea0428L },
49748       { 0xa3e24294b0335ba0L,0xa9c0e139487530a7L,0x54199640072e70eeL,
49749         0x0977586e64c0d563L,0x393878451c5cce35L,0x57acd85631ce1eeeL } },
49750     /* 26 << 98 */
49751     { { 0x63081bcf9b8d9f3aL,0xb09fe52b6f94e3e9L,0xc232e5d1e39c092bL,
49752         0xd61ddcccf5f072e4L,0xcdb3b4189a26a93cL,0x0c010c048de6f5c9L },
49753       { 0xad2473a5d238e823L,0x4120ab3632029ca0L,0xd6632edb639bb8ddL,
49754         0x3383f077a8b32fe4L,0x8afcbce5eacfbe80L,0xe28236212d2fff74L } },
49755     /* 27 << 98 */
49756     { { 0xccf2a24a0eb3829bL,0xdd8fe4421eae0751L,0xb685b073c9598d91L,
49757         0x025214ce8b308785L,0x11c3fb11d6433acdL,0xe40cf39c81794024L },
49758       { 0xa167651b1c0b1f54L,0x350cf3eb0bbde983L,0x69c93dd0b2a88c48L,
49759         0xf13afc37bee80b26L,0x0be7d05d776345e2L,0x1ccbc8ba7645b02bL } },
49760     /* 28 << 98 */
49761     { { 0xaa6489df83d55b5aL,0xea092e4986bf27f7L,0x4d8943a95fa2efecL,
49762         0xc9baae53720e1a8cL,0xc055444b95a4f8a3L,0x93bd01e8a7c1206bL },
49763       { 0xd97765b6714a27dfL,0xd622d954193f1b16L,0x115cc35af1503b15L,
49764         0x1dd5359fa9fa21f8L,0x197c32996dfed1f1L,0xdee8b7c9f77f2679L } },
49765     /* 29 << 98 */
49766     { { 0x2aa349975442c668L,0x4c5137130cd74444L,0x4f87be0f449300ecL,
49767         0x13e07b552bae04fdL,0x6aa575d11f75acf6L,0x4502e9e9852848a9L },
49768       { 0x3c246d38889666fcL,0xb6c0292b7c100867L,0x618f234aa2a280e0L,
49769         0xf983c834669afe62L,0xc51a15105d900a1fL,0x7d7ce31bc952f419L } },
49770     /* 30 << 98 */
49771     { { 0xe3dbb7483c3388dfL,0xc26a7d042c32f139L,0xc1b48180ed938dcdL,
49772         0x785b964d42e4c01cL,0x507cd16aa1f75e28L,0xfaabff8d1f323caaL },
49773       { 0xc6bc47ceadd5b649L,0x997dc0ee3c0aed28L,0xcef0c89bf3666cfeL,
49774         0xd8d7dfb426482ea7L,0x5f00e432d2348484L,0x09549b5a1dc66aa6L } },
49775     /* 31 << 98 */
49776     { { 0x702e450ef8464b1eL,0x52d20765a061c4c6L,0xe1c930b26519bfc6L,
49777         0xa9c0c8c6d17ea02dL,0x52bfc60ddac62461L,0xc325568f7c5f9a55L },
49778       { 0xe7413df9eb44b9d7L,0x461682265837e0d1L,0xfcb9628c15aa0c89L,
49779         0x83d6d0eebb57c6a3L,0x17bb82a56829c9fbL,0x342fe91c496861e0L } },
49780     /* 32 << 98 */
49781     { { 0x58d6998e171c1439L,0xfd4a98f401feedecL,0x420b2a0165739fceL,
49782         0x5c5db30822f7a073L,0x016c547805042f00L,0x5fc73ce2a12413d9L },
49783       { 0x8ceb2d70e932aa17L,0xb4d66b670537afafL,0x2638d012339c146bL,
49784         0x02fbb7b628ac0555L,0x7fcb0c8162d46e63L,0xeaa9ff4f066d088eL } },
49785     /* 33 << 98 */
49786     { { 0x45f53090b8b22c29L,0x155b8f8111e70d5aL,0x5ec118b25d3a7d83L,
49787         0xfe4c7eb39c4ddd1aL,0x8cdfb753f226d869L,0x20bb870779fc646bL },
49788       { 0x3c8c1d7a25d1308cL,0x5a976ae47116f347L,0x6af949a60faf9690L,
49789         0x7e6718fc07f3472fL,0x16ec7b45267b17cbL,0x80744641cebe1bd7L } },
49790     /* 34 << 98 */
49791     { { 0x45eded7ab2a5c8e3L,0x4308485969a0681bL,0x89b7510d90910e8bL,
49792         0x1c622d04d2066d92L,0xdc3b434bcd2f0d7cL,0x98bcb83b476ea5a3L },
49793       { 0x9195431d3dbf2be5L,0xfec7efd969275ac5L,0x6a4364f556a7da4dL,
49794         0xaf701bc579c177ccL,0xb77ef33e9ffc2a47L,0x2bc59331cc23c4e4L } },
49795     /* 35 << 98 */
49796     { { 0xedf4a85b9d43c51fL,0xc0afbcb6b59a7244L,0x3ede2f25626e0ca8L,
49797         0x45836582270f674dL,0x83c47048bf06d267L,0xbb1e994f3c68314eL },
49798       { 0x50d79cb4f2fe6c8fL,0x1a1d8aecdf7600f5L,0x216f5d2bef4e4857L,
49799         0x41361a90bdffb9e9L,0x8040f5c173d2f9caL,0xe6665f0dd1e9be4dL } },
49800     /* 36 << 98 */
49801     { { 0x5405179f394fd855L,0xc9d6e24449fdfb33L,0x70ebcab4bd903393L,
49802         0x0d3a3899a2c56780L,0x012c7256683d1a0aL,0xc688fc8880a48f3bL },
49803       { 0x180957546f7df527L,0x9e339b4b71315d16L,0x90560c28a956bb12L,
49804         0x2becea60d42eee8dL,0x82aeb9a750632653L,0xed34353edfa5cd6aL } },
49805     /* 37 << 98 */
49806     { { 0xb112fd7b36386e2dL,0x358e974a6a634bd7L,0x509814737faf640aL,
49807         0x1036bdacef39b3aeL,0x410c6448db5aceb0L,0x914671305bbebe92L },
49808       { 0x83fabd54e9e009e4L,0xb2da8eea9994d16cL,0x9d73da6356997acdL,
49809         0xea9158b97ec1b844L,0x8e6a6e3129714795L,0x23e98f57131243f9L } },
49810     /* 38 << 98 */
49811     { { 0x7105f727552664dcL,0x97cbfb6c5c589c8cL,0x1a7b110a70fc59b3L,
49812         0x46c39f2cc754c69dL,0xcda0e2c067b1f17cL,0x35fe45fab7ede210L },
49813       { 0x6b3ecb7d82e78b40L,0xa90eed4fdbc07241L,0xa73797895aacd533L,
49814         0x28120ba5f4fa89a2L,0x9c1fc09ee3055006L,0x71e665efc51653a4L } },
49815     /* 39 << 98 */
49816     { { 0xcf782247d28b5059L,0x15bef4cb1b89eb06L,0xbc182ed6bcb4afeaL,
49817         0xcf5b6dfde0e32b77L,0xeb61aff9d9446052L,0x5846f171c4bfc0abL },
49818       { 0x61d5ae1c6fc68422L,0xa282c56846e870afL,0xdb4859d16bca8fbdL,
49819         0xd4cd416e97caf135L,0x11217fa9c3debd59L,0x27702da6370758ddL } },
49820     /* 40 << 98 */
49821     { { 0x8273db992d189057L,0x4d1b05fce1b5f8ccL,0x5fec7c830a7c32d1L,
49822         0x28ddaf28ea9b4d45L,0xb6bb62aca2fc58beL,0xfc65b7aa4a41852dL },
49823       { 0x6e7651941c9e6045L,0x3acabf28fc116257L,0xc9d5e8054b5a4ba8L,
49824         0x9a072259cbdcf1ebL,0xc67cf643439fc8fcL,0x917ef6f8b4333aa8L } },
49825     /* 41 << 98 */
49826     { { 0xee6123cca6411227L,0x91372d080ee882bcL,0x2c30a840a638a4faL,
49827         0x1867421321e83d4fL,0xc6afa4cfc3fb9925L,0x19aec276e4fdc73fL },
49828       { 0x1ffec4510cf4e610L,0xac57292ede22d429L,0x62844d78e6cacbc1L,
49829         0x0eafcc554d2e497cL,0x39f1acc8e780f600L,0xfcf8d914fcff8c6aL } },
49830     /* 42 << 98 */
49831     { { 0x0734ab43ff2152d0L,0xe52c5dee930fea54L,0x9cac7efe940bddbfL,
49832         0x30d2610ddbd43391L,0x4beeb865921c124dL,0xa19fe6a4fca219fcL },
49833       { 0x588395628755cc47L,0xa7f301241324f2d1L,0x4fe38ee3b1ec5aacL,
49834         0x3583542eb16413ceL,0xfa92e2191733b7eeL,0xc0f30ba32b2001a4L } },
49835     /* 43 << 98 */
49836     { { 0x706b02c3febc7968L,0x6e45dc90c96a6b64L,0x34e5f890f95aa4c7L,
49837         0x8ae64d487683b855L,0x0fbb9c4a62e03ebaL,0xb32a965ce2cab115L },
49838       { 0x4a7084a8b33102b4L,0xe7fd9db3ebd1bd6aL,0x2fcb233cc7f32b61L,
49839         0x365896d5f2549734L,0xa3f18bfd25c7a1c4L,0x382950ef212b8daeL } },
49840     /* 44 << 98 */
49841     { { 0x82154d2c91aecce4L,0x312c60705041887fL,0xecf589f3fb9fbd71L,
49842         0x67660a7db524bde4L,0xe99b029d724acf23L,0xdf06e4af6d1cd891L },
49843       { 0x07806cb580ee304dL,0x0c70bb9f7443a8f8L,0x01ec341408b0830aL,
49844         0xfd7b63c35a81510bL,0xe90a0a39453b5f93L,0xab700f8f9bc71725L } },
49845     /* 45 << 98 */
49846     { { 0xee2b773e4ed17990L,0x499e83623faab7feL,0xa3925e2f71abb9efL,
49847         0xfee50406ce3b4a69L,0x71a15070bc10f803L,0x5b01e4a2c7bab10aL },
49848       { 0x806c590d99e51e36L,0x34adbaf6a7f88d5aL,0xd4a93ce9f6b30ac3L,
49849         0x39d2cf40dc33fdfbL,0x13e676f1d5e4e7ddL,0xbaa72ab9199690fbL } },
49850     /* 46 << 98 */
49851     { { 0x85017690e51b47daL,0x25919b58a2b476ceL,0x6f692de103ec5d55L,
49852         0xd6cf8ee5d022dcebL,0xaf3225238ba7076eL,0x917b373728c902d5L },
49853       { 0xac75fddc3fdf8590L,0xe83d9bbb64fc304cL,0x13550de2971f659aL,
49854         0x70bee07ee12b7bebL,0x9989d2fa0a855646L,0x8b6043aca576b3a1L } },
49855     /* 47 << 98 */
49856     { { 0x1bfd4f92fadf9017L,0x1e4509aa737bc67cL,0x88278c3699af1ffaL,
49857         0xbc47536f4678e22bL,0x69914cdb1b07c823L,0x56fc28ab97277358L },
49858       { 0x092d28efe752d2f7L,0x6a8286a691da62c5L,0x86b702778033c632L,
49859         0x57ef284e7672f41fL,0x9101ed302e54007bL,0x53e94cfed25d8d19L } },
49860     /* 48 << 98 */
49861     { { 0x311ebba2fc37efedL,0x8a6a42d660cfd6bcL,0xb4051b3af2a4871eL,
49862         0x66ce77b8c2f0ebf0L,0x84abc9480ad28477L,0xc82e5c6263d9d11aL },
49863       { 0x99ffc70c007dcf93L,0x5e974edfd964c822L,0x0fee3572513085e3L,
49864         0xbe67a88046ce8444L,0x136ceeb806d17129L,0x0da512ae662d86fdL } },
49865     /* 49 << 98 */
49866     { { 0xeae827d989e687ddL,0xb025f0723bdbdd9dL,0xfbddcecec3a575aaL,
49867         0x3fab33c1f80d12cbL,0xd0232142b32f0381L,0xf00e74bd3b6c3132L },
49868       { 0xb7c1311e0e44deffL,0xf3d790ae29b04d6bL,0x3d3744b846f72957L,
49869         0xc0890fb6ab2f13e6L,0xa669a34324461f0cL,0x35c9677ddd72fcb7L } },
49870     /* 50 << 98 */
49871     { { 0xc257ed518060a28fL,0x3a9d7e1cc72fafebL,0xa304a5e8332f435aL,
49872         0x96969bc234ccf343L,0x2aae4d8e7702ba84L,0x37f15631f203a7eaL },
49873       { 0xc0000f24c9666405L,0xa98eb834a537fb89L,0x8c0564cf7e36dd1aL,
49874         0xb5ca507b4e89615cL,0x9bfa209a9d80ef92L,0xe2ec1879a83f02e8L } },
49875     /* 51 << 98 */
49876     { { 0x73b4573c11dfdea9L,0xe5f208ee5c8cc81fL,0x5c240d3c769adf12L,
49877         0xbd3f8f33550c53acL,0x98171d16bb4f43acL,0xaf19d5fe84db9e13L },
49878       { 0xc589be0d2e53345eL,0x3184b540f114f6f3L,0xa35ed77e4946090fL,
49879         0x427b860afd3108fcL,0x7d0848c3867df76bL,0x353539e2a32ec485L } },
49880     /* 52 << 98 */
49881     { { 0x9401aec2b9f00793L,0x064ec4f4b997f0bfL,0xdc0cc1fd849240c8L,
49882         0x39a75f37b6e92d72L,0xaa43ca5d0224a4abL,0x9c4d632554614c47L },
49883       { 0x1767366fc6709da3L,0xa6b482d123479232L,0x54dc6ddc84d63e85L,
49884         0x0accb5adc99d3b9eL,0x211716bbe8aa3abfL,0xd0fe25ad69ec6406L } },
49885     /* 53 << 98 */
49886     { { 0xee174af2df740edcL,0x1bd8382c09233f0aL,0x34a7450e7d343006L,
49887         0x92259ddd3d463e61L,0xcd0bfe6fedbc3af2L,0x39627c4cfc8770f4L },
49888       { 0x7b7c688ddbabdf2bL,0xf459f0e64bef3558L,0xfa0e87becc88f7c8L,
49889         0x67beabac5fcc80feL,0xbdae52bfadeba16fL,0x4751724c5af5c9bbL } },
49890     /* 54 << 98 */
49891     { { 0x5627e0d016332364L,0x33839376fc57f01bL,0xe7fc2c489528e434L,
49892         0xa0ee39acb52b3757L,0xe49e383ee42e4832L,0xabfefdbb31359afbL },
49893       { 0x5dedb6f3b99ee196L,0x38abe58bc16aac17L,0xa300a1333ec06a07L,
49894         0x00e68eadc90d4659L,0x60412e8a8000a773L,0x6099b6a6a5830c94L } },
49895     /* 55 << 98 */
49896     { { 0x85364bd10d340c80L,0x14b89462be64bc9fL,0x16429134b542faa0L,
49897         0x0d4cf3ce73683e2bL,0xf9a3e443cb73ab7bL,0xa4c2d0afbb156b0dL },
49898       { 0x826123921bc77675L,0xaf2aad4a5f26c238L,0x6f6f5d9aef4656bdL,
49899         0x0e20425f90901f3eL,0x0e30bfef9943a673L,0x6cefc62847415a28L } },
49900     /* 56 << 98 */
49901     { { 0xe7acaa8457e0105dL,0x3c06d3bd3851fd57L,0x23cf3c612a9c631bL,
49902         0x13888aaa33863bf8L,0xf2396355717783eeL,0xf21e1a4836b300e1L },
49903       { 0xa734cb3b9d27b4cbL,0x0a7effed796e34b6L,0xfc5864773615cc7aL,
49904         0x1f98ed7788844a21L,0xd6e289407ad4c7bdL,0xa00d64ebe9331c7eL } },
49905     /* 57 << 98 */
49906     { { 0xcc6ce7dee1c1e159L,0x77982e4f03df6b56L,0xbd8307d1b82b5ebfL,
49907         0x43e25358ed881b82L,0xddba4f418e0eb034L,0xbe326c36f919800cL },
49908       { 0x97d03da7af52dfaeL,0x153bb17af4bf81c5L,0x29bbb9bed7ff322cL,
49909         0x7a7bd8c7232cca47L,0x7474c199c2830f03L,0x9f464a06f0065fc4L } },
49910     /* 58 << 98 */
49911     { { 0xca505cb553b876bfL,0x6fc27f553662cb5fL,0x891cbef432cb1636L,
49912         0x339743f16e27e2d9L,0xde76538f21dc4837L,0x9cea05020efe241cL },
49913       { 0x97b8deb65888d9acL,0x4d3c28cba4b6cc56L,0x88ca828f840910b3L,
49914         0x2e5727cfbfde6793L,0x05a4138302bbae6cL,0x2e72fd653fa8e23bL } },
49915     /* 59 << 98 */
49916     { { 0x5b88c5ae6d17fe02L,0xc9b14810d6dbe104L,0x170b8659873be863L,
49917         0xdc5946a6ae9111b4L,0x4cfa5f022819a4cdL,0x7653d06ae213bb7dL },
49918       { 0x324c41baabd7ee74L,0x4219968cdd1608f1L,0xa5e104704adc1561L,
49919         0x964a53ea5e16d818L,0x00ebd1d4980f4bd2L,0x23cbb80d3518144dL } },
49920     /* 60 << 98 */
49921     { { 0x0d5c1769df85c705L,0x7086c93da409dcd1L,0x9710839d0e8d75d8L,
49922         0x17b7db75ebdd4177L,0xaf69eb58f649a809L,0x6ef19ea28a84e220L },
49923       { 0x36eb5c6665c278b2L,0xd2a1512881ea9d65L,0x4fcba840769300adL,
49924         0xc2052ccdc8e536e5L,0x9caee014ac263b8fL,0x56f7ed7af9239663L } },
49925     /* 61 << 98 */
49926     { { 0xe6ece4b5dae76820L,0xd428354e95feec03L,0x43517722f8871f7bL,
49927         0x313fde11e84d0b7cL,0x7f02824b1cae0a45L,0xf9f560c1d6646bc4L },
49928       { 0x124d88bc903a0608L,0x950e8320370c7ff2L,0x29e6da714090a72dL,
49929         0xbc5a108c54547d89L,0x809330cd3e484deaL,0x1b04a8088bb00f0cL } },
49930     /* 62 << 98 */
49931     { { 0x2425c59c03e0a528L,0x49de96f425c2be3aL,0x30b52686fff4b610L,
49932         0x2ce573b0f2e5f7b1L,0x4ec05f07b606f0e6L,0xf2040886366ecbf4L },
49933       { 0xc7fd993460d404d3L,0x8a064992fc12227dL,0x9c6d64ec215492b1L,
49934         0x2793bd0903463ec1L,0x49523ebab7376e80L,0xb138dfbd35b14fd6L } },
49935     /* 63 << 98 */
49936     { { 0x5ed097b0df7363adL,0x21319edba5696d91L,0x17c46519c5d5313dL,
49937         0x341d46576c6cccedL,0x60d80713692bc704L,0x9477b6e907fb8e13L },
49938       { 0x2965720b532e0c6dL,0x2767b4ee87831d79L,0x3e2e67abd4b5ef14L,
49939         0x45ee89b5d2598521L,0xfc8f1e3ee6441648L,0x75c4db57567ed090L } },
49940     /* 64 << 98 */
49941     { { 0x17e3d0b8713b8541L,0xf372b048c6b5e839L,0xf8ef0261d0bb1848L,
49942         0x9b804ceec71a3bbeL,0x00b7d171542a88aeL,0xf2b8ed10e9097b9eL },
49943       { 0xdbad9f122c0a009aL,0x245fc1e9205fb1bfL,0xa8a4834fb83debf5L,
49944         0xc3ee226d637e449bL,0xe3070d93cab82664L,0x24b8094db37320e8L } },
49945     /* 0 << 105 */
49946     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
49947       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
49948     /* 1 << 105 */
49949     { { 0xb506b7b925059699L,0x349fd83f01ab02e5L,0x64b729ad3789281eL,
49950         0x69ae8f81f9af4561L,0x007befe156f91860L,0xb578c566edc250fbL },
49951       { 0x1c16d75a67ae4801L,0x04c35a7ea1d3f592L,0x5dc97da936881f89L,
49952         0xaddb603103a5b1eaL,0x7eb515b13e153a0fL,0xdc3a92192b4a1ee2L } },
49953     /* 2 << 105 */
49954     { { 0xe7365f9e512cc92aL,0x9efdcf8b5172a654L,0xbfb389ac8e611fc3L,
49955         0xce778fd5699c227dL,0xdc1f47b63ff2ef17L,0x2ae0f68302672ed4L },
49956       { 0x51c63806a8e879cbL,0xd3dfecf03909f526L,0x375b3d13e00e12a2L,
49957         0x91f9f750bf8df325L,0xf1ea0e421df5f21aL,0xaed73e7f32c60584L } },
49958     /* 3 << 105 */
49959     { { 0x03b07fb5e0728e6dL,0x9e0469201012234eL,0x272e644935637644L,
49960         0x2b6ad1c2a55bcadfL,0x86c527765c71c6afL,0xa25bd60bc1678806L },
49961       { 0x0cae829476bb32f8L,0x389ce4e633e03cb2L,0x504df8337513dfb6L,
49962         0x4260ee8e1b351ddaL,0xa473c5d9dbaf7cd0L,0x22cb7cb471e390fdL } },
49963     /* 4 << 105 */
49964     { { 0x1d9aa9fa26caebd8L,0x6b64686926b7a673L,0x7ebed6a17f167b47L,
49965         0x324c13f85bd9153dL,0xe9ea5b734c682ba6L,0x2961da7d7e3ff6e2L },
49966       { 0x1ed2b05001a83dadL,0xb232951dc4a2f60aL,0xafcea5d3d68b8ec6L,
49967         0x21dc058d1c6ce0d2L,0x0043de75e719410cL,0x4edd792ce15cf534L } },
49968     /* 5 << 105 */
49969     { { 0x0f45245f3babe09eL,0x0959326fa9f2fac5L,0x7629e7fb5cc136e5L,
49970         0x208bd5a6e48b7eb0L,0x637891d6b75a85cbL,0xf0ad9d8d9f27b57eL },
49971       { 0x437b6944e0454b05L,0x022c51d702ed3592L,0x0f79e2bd0dc0a769L,
49972         0x54ace1fdd9b81f9bL,0x38611d66f95ea8dcL,0x52443ca8f0e6147bL } },
49973     /* 6 << 105 */
49974     { { 0x857d68558bc272d0L,0x4583eeeeb5be2485L,0xb83586dafe0152ecL,
49975         0x8b0eb223e830294aL,0x757582b6a5b0e880L,0x5140c0169cca7fffL },
49976       { 0x07a00782e9228f12L,0xb96e2b5dd4973080L,0x3cceb9a6e88efbe6L,
49977         0x9955b63073fcdd25L,0x04f26ab02805d470L,0x90b38299424da086L } },
49978     /* 7 << 105 */
49979     { { 0x73f1ae48f4f6c5b4L,0xee5af13d4a477f01L,0x274614a2ddb93d52L,
49980         0x90b0c563c320aaf5L,0xee2303c8ef990b0bL,0x00d028e73061f140L },
49981       { 0xff705011cb3d8eafL,0xae1d990862594f4cL,0x22a27cecdafea438L,
49982         0xa78e12d5c5962ea9L,0x5bbe9d878e65f9cfL,0xa222580cf47cefa6L } },
49983     /* 8 << 105 */
49984     { { 0xf7aaa732959abb9eL,0x1222ad0a2ebf80b9L,0xa1a417372e0c286eL,
49985         0x3b6685025da3472dL,0xbc0d116b7576f2a2L,0xfdbcad95a36a27d4L },
49986       { 0xcdb3f4749d54f7eeL,0xe2e0f5f98a5643a3L,0xc70d11b969d4f171L,
49987         0xdf96d1366cca4ef7L,0x570693db2fc6afdfL,0x5059e67b567504daL } },
49988     /* 9 << 105 */
49989     { { 0x2c8107d47fe632a2L,0xfc46c745ede7bff8L,0x2d3b12864650025bL,
49990         0x815ef3cbe74cd65fL,0x5431b01ba256f01cL,0xe832ff1139915cfaL },
49991       { 0x2c106de607d7af84L,0x67303b786d4753e7L,0x5f886ffa6d75c8deL,
49992         0x932a6c20967131cfL,0x5bc94a9170aebbb0L,0xa85b3044fd56e06dL } },
49993     /* 10 << 105 */
49994     { { 0xc904558ae7eba799L,0x46b6031bb2fa7331L,0x6620e2b50653675cL,
49995         0xd1373a357d2218f7L,0x0f4b3ca3af55a5e7L,0x50774160714e70c2L },
49996       { 0xacc63d1469188455L,0x89a795fe043b8b30L,0xac2fd66ce1e4b9cfL,
49997         0xac7927021bf67f26L,0xb9513f0d1143d437L,0x02198050811f2931L } },
49998     /* 11 << 105 */
49999     { { 0x6d4acdba7b480776L,0x8b518cd466dffeb5L,0x8826c99451918859L,
50000         0xd2b6a7a038fad835L,0xd315417a6929a870L,0x05d85252c5a769e1L },
50001       { 0x2fa06335ec0d091eL,0xb0cc337287768c88L,0xacbda5ba58a2eb9dL,
50002         0x2a404fc976b7b057L,0x073abb71838c6135L,0xbdf89b135cfc4f3cL } },
50003     /* 12 << 105 */
50004     { { 0xd00eb9c53508675fL,0x92ec76a4a117dc95L,0xf58d6f85334ca15cL,
50005         0xeeb522169cee0544L,0x3eb9847ff21457c2L,0x547908bc5524c60dL },
50006       { 0xb5b49d225198709bL,0x718abce6324abc67L,0xdab8ff2f4abd54baL,
50007         0x98be59e67184d444L,0x45b74b54babeb4b0L,0xd8d8bb30ff71a5acL } },
50008     /* 13 << 105 */
50009     { { 0x8aedf7e28ec13e6fL,0x8b952620d950792dL,0x36e9dac204918f59L,
50010         0x5e49a5a2d3dd47edL,0xb17455bee863c2bdL,0x8caac6a9326a0d66L },
50011       { 0xb6c3f5e427bb72e1L,0x17566c9dee5fe09bL,0xfd6bbcc25e3db64dL,
50012         0xd437d07a3189319cL,0xad00dfc4cd3166a5L,0xab75927b0bd63003L } },
50013     /* 14 << 105 */
50014     { { 0xa7672a39afc43be8L,0xefc49015c72f97aaL,0x81c63c050e48f2edL,
50015         0x62f39f32833a22ccL,0xf7a3480172c0c0c4L,0x4711cd41a4158538L },
50016       { 0xa3c99a4d1d15f2f3L,0x4b82c1c17bee1b47L,0xc7d60b489d199f10L,
50017         0xd1d1f03d5f16fa95L,0x96c780c932fbeaf2L,0x0662e250376ff106L } },
50018     /* 15 << 105 */
50019     { { 0x728e334678571c8fL,0xd0a886b56cb339d3L,0xf4ea33380a5671baL,
50020         0x43823401a64850a4L,0xa7729cd533117b9dL,0x4dd457602b78cffbL },
50021       { 0xbe0571115a67d812L,0x7ec6cf925105a3fcL,0x5dbcb4bc0ccafeecL,
50022         0xa7587f15803092f8L,0x67ee61d5a884efadL,0xd4ced554ca47d9caL } },
50023     /* 16 << 105 */
50024     { { 0x02c6b6083b03dcbcL,0x2b20149e3b9d868aL,0xaf5ab01d4f57eb0cL,
50025         0x59935b94d750e515L,0x32721b408f89ad68L,0x673bd755a7e3ceffL },
50026       { 0xbd462fd8ef3b3393L,0x991422640e59a120L,0x4162da619263fa61L,
50027         0x2ed1f2deb6488eb3L,0xb0bd37a8725680c4L,0x17218bf029ec27b0L } },
50028     /* 17 << 105 */
50029     { { 0x444071ff84ff1ebcL,0x4b4171e87f789cbdL,0x4a832cca2db4e8daL,
50030         0xe229ffb6dc209c05L,0x9efbfd7eb5f0b3f4L,0x65e07fe774fbbe6bL },
50031       { 0x2892c8ac627b9d41L,0x01a20eb94297e7a9L,0x2f54e88646f29860L,
50032         0xc425accc188798ecL,0x6137251c85c80580L,0x6cc0f9c4f386581eL } },
50033     /* 18 << 105 */
50034     { { 0xf677bdd11cb61a7bL,0xfca1faf8932d6113L,0x1d5bbf97a531bbe2L,
50035         0x3d5e4860c849fc47L,0x388943cd95fe4da2L,0xffb7d5e073add43fL },
50036       { 0xc3166ae828fcc058L,0x89dc7faae0d6f6e4L,0xe6daf1a6f527ca01L,
50037         0x500a703a56ef1d8dL,0x3573d0a3fc914df4L,0xd780e745ef8dc2a4L } },
50038     /* 19 << 105 */
50039     { { 0x90a8f3380500afbcL,0x8c303270838ccf6fL,0x82cbdc98458254c6L,
50040         0xc2f24d03b367ddbcL,0x5d3daa0d6c882354L,0x824d313d376599d0L },
50041       { 0x6e5075df7b9dd1b6L,0x6871a3d4d69c9828L,0x8b3762f59cffa148L,
50042         0xf2184f67eef8c656L,0x437630c296a1537eL,0x92a0667c4cbf8249L } },
50043     /* 20 << 105 */
50044     { { 0x6e929912ef619478L,0xe7ddaf255ffc5939L,0xb71133cf96dbbca5L,
50045         0xee8bd53f17da5104L,0x7601ce6adc49be68L,0xa1ca3b3cc63f2a87L },
50046       { 0xebf388c2a0de1668L,0xa0f6c38dd0ec6bd7L,0xc8e0875ddac451ddL,
50047         0x179fbbe5a5afce85L,0x0727095673bfb06bL,0x992afcd047622925L } },
50048     /* 21 << 105 */
50049     { { 0xe3b0122624f262c3L,0xaa7a0925dae30b22L,0x36104c95a96a18f9L,
50050         0xdc6090f5539b6740L,0xd70270ba11040a88L,0x53997b57ea3342feL },
50051       { 0xaaf1d47d63393e4fL,0x9db8aa3fe8a99625L,0xed571a32c3926e1cL,
50052         0xd6e898526e565346L,0xb3984bbd873b2589L,0xaeb7bf3f3f5f68e1L } },
50053     /* 22 << 105 */
50054     { { 0x75a4a19a79ded4a8L,0x1368e269f688177dL,0xa24d67118581e23aL,
50055         0xae63d5a6746b3830L,0x0c68d3e314017304L,0x521a5e7de4d45dc9L },
50056       { 0x69d9adfaf77ca616L,0x1f8d37f4bfda67f3L,0xa2833ba1027e771dL,
50057         0xae49b00367141a63L,0x04e6f282ed6f1968L,0x65d7d88f060f9157L } },
50058     /* 23 << 105 */
50059     { { 0x5dc3137b512e4026L,0x43e189595d6ac980L,0xdb7dfef39eac06a4L,
50060         0xa8f3e2aea09b0650L,0x80a8594c575e047aL,0x9eba41bcf0c58bf3L },
50061       { 0xdc04cc7679812341L,0x716050eaeed1be66L,0xe559782099b77be8L,
50062         0xe543aef055183ad5L,0xbbddfb814c08a959L,0x6e54d86eb5368e8bL } },
50063     /* 24 << 105 */
50064     { { 0x170f8a74e7aba263L,0x6b4e1d7b986b151aL,0x5f65bd224b08921aL,
50065         0x1017ae3de6caca3aL,0x613f36b626cb9d5bL,0x8a1e2f2ded19d99bL },
50066       { 0x52c915a5c3c519c2L,0x3c9a33305902fa08L,0x2cd7f7c206a51a12L,
50067         0xfed60db66e0197ceL,0x4e5b2bb7d971b04cL,0xebebeebf2f45ab13L } },
50068     /* 25 << 105 */
50069     { { 0x43b10a0673220e06L,0xdf93af67777cf022L,0x830195efbeea9ed4L,
50070         0x0a36b71812353c9bL,0x520e2e8d1ec8c488L,0xdc985ffaadac5e16L },
50071       { 0x0ebac566f3f58ed7L,0xc7747562a2cd13a2L,0x6a5b4cbce3901864L,
50072         0x66634acaa374b634L,0x45e000877f4680dcL,0xb783d01f9fdbe92aL } },
50073     /* 26 << 105 */
50074     { { 0xcf6d51be36e1c05bL,0xf59b6665e1da0ad8L,0xaa8bfb9d727a701bL,
50075         0xb1680942e26e268bL,0x09d41407e518661bL,0x8b0dfbfb3757a993L },
50076       { 0x34ecb09f6cb33380L,0xfcd77efede342bf6L,0x9f8fa6c6e476c5eaL,
50077         0xde30410fb6257416L,0x416ea101bbd47b91L,0x86ebd19e4aeede80L } },
50078     /* 27 << 105 */
50079     { { 0xfe7562e00818226bL,0x922d8fe662b46275L,0x6216698b491adc2eL,
50080         0x5bdf7a59f6a38f2eL,0xc0640bf937710dfcL,0x06ad30a9df687f48L },
50081       { 0xc561dc7d3eb66e6dL,0x7444ac83d08616c3L,0xebfcccee84984618L,
50082         0x35a03bafbb15eb51L,0x7c907f9fc17a5de2L,0x2e48ddb5814634dfL } },
50083     /* 28 << 105 */
50084     { { 0xe466d7a7ea51a37aL,0x5203e990cdf97186L,0xf700953096c84ba0L,
50085         0x4e32fbe65f89d1adL,0xe530349aa9be221eL,0x0f7f9c2e50b31508L },
50086       { 0xa6796f5c3af5a574L,0xe220f6daa2a2df89L,0x99ec4811d8b65510L,
50087         0x4dfdac69ed373b27L,0x663f46b1bb55114cL,0x44236350d167e032L } },
50088     /* 29 << 105 */
50089     { { 0x1382e90ba65f6a57L,0x3557ab88e5c903e1L,0xcc0cc77f032067beL,
50090         0xdd8da09f67797328L,0xeb2979d45114c09bL,0xaaca95bcc4eb598eL },
50091       { 0x651a7ce5a2b776fbL,0xc20fe9315312ffc1L,0x842957357dcf479fL,
50092         0x022ba6e2ee5cc0a7L,0x6d27e37185b0ba5cL,0xe6f212bdbcd5f2c1L } },
50093     /* 30 << 105 */
50094     { { 0xb0c2ce87a9088f95L,0x47ec07e0acb11d2fL,0xfe84fba0d30ad231L,
50095         0xaa98e35f18a08eb1L,0x36adc3f2f6a27510L,0x622d202751fac4fcL },
50096       { 0x4be765cabb9b6ffcL,0x934193571cbfcbeaL,0x83542d9cbef14402L,
50097         0xf27504954612b4b4L,0x91aff597bb988ba6L,0x229031e51d61f6f9L } },
50098     /* 31 << 105 */
50099     { { 0x6b04a446ea29e65cL,0x9b6247a696c48a99L,0x95aa162f60c83930L,
50100         0xe387f544e30821eaL,0xbe1cdab306c51b7eL,0x40175d151fc7b8f8L },
50101       { 0x89df5ff36384d331L,0x02eb9aa4fe1aaf5eL,0xf24155f789675704L,
50102         0xbd2e8cdd87f72f4cL,0x2856b3c46de30f01L,0x2356f0a3ecf8af25L } },
50103     /* 32 << 105 */
50104     { { 0xfb09e7564bd044efL,0xdbc9fcdfbb964fb3L,0x451c5b01cdb1f4f5L,
50105         0xb02f9068f1dd1cf0L,0xd4765e7c0c687e41L,0x89b64981d1967bd3L },
50106       { 0x06a0e4ecf0439d65L,0x564c387da5abbcecL,0xc1e9d01ac651d806L,
50107         0x5e6ebd830618a96cL,0x9ce1aacec54ad8ceL,0xe5248a089953f90fL } },
50108     /* 33 << 105 */
50109     { { 0xd65f3b909b6ab239L,0xbc259a6d9ea8bf80L,0xc10d5c235944f964L,
50110         0xbd6b3f6f61eeac6fL,0xc4ef2d8383e92858L,0xb80d5ab0a3736bfeL },
50111       { 0x27bebd1176695c40L,0x4de92348ea4f5720L,0xd70d93e6070b892aL,
50112         0xfce03d0be626d5abL,0x2525e8ea81014bedL,0x6fa3df16a70e2799L } },
50113     /* 34 << 105 */
50114     { { 0x42b8350a7bbc41caL,0xd7861ad49af59bc9L,0x2453d07c5644d328L,
50115         0x2b92643ad7c8ec43L,0x7c14d3c7cd5f1fd2L,0xcee050463d373c7fL },
50116       { 0x17ff60bd0ab2b35bL,0x473925e0dbb7f655L,0xdbaa015aff3ee023L,
50117         0xbc1ff6d6087ecfbfL,0xc44e1c8c5fc66ca2L,0xc60a193850d6b257L } },
50118     /* 35 << 105 */
50119     { { 0x5ff44f3ed8f0983cL,0x9de50da0bb82cc15L,0x504f82ec94757c44L,
50120         0x72a4fc9dc8a07028L,0xd4d6e4cec3d5e64cL,0xc6148fe780008568L },
50121       { 0x71ba3fc525ef66d6L,0x969cc8694f6589f6L,0x5016c8c2d934ab25L,
50122         0xa78382f6959e8881L,0x28bcb8bea20eee18L,0x055ba80b37edd7c8L } },
50123     /* 36 << 105 */
50124     { { 0xbe389fef9c98ca3cL,0xdc3ab23b910370e5L,0x866cb37d5e8eb20dL,
50125         0x2f951ca9c1e32fc8L,0x54ef6ab15fe24e6cL,0x6038b5efcfcb8cfbL },
50126       { 0x362e076b6eec196dL,0x47bb3aefd398b505L,0x9f3128eb343711ccL,
50127         0x8dda2fa8d28e3269L,0x908c52c7eda48846L,0x65fb3a05d53b0917L } },
50128     /* 37 << 105 */
50129     { { 0xeae35c02ed711239L,0x16ab943fa97db2d7L,0x9770bb578f3b0599L,
50130         0xa88ffb95956d04f3L,0x3b937af5f4dcf6ffL,0x311ef2cc0bc41f56L },
50131       { 0x00e9214a2860ea2aL,0x2a64b18a7bd12d8fL,0x20a5b9da6a2b9dbcL,
50132         0x5c16a412fe1b8edaL,0x6fc306af7b9db98bL,0x964c35de25dc9363L } },
50133     /* 38 << 105 */
50134     { { 0x81f4739e6df16589L,0x2ea2fff11f8b8ac4L,0x3baff03d33e02c36L,
50135         0x7f07526874d77660L,0xa442d7fa758eed7dL,0x584cbe9866625864L },
50136       { 0xeed35d579d167ff6L,0x56627c2e3c7bf84fL,0x908df5aedd011153L,
50137         0x2694e54d242fc055L,0x25beed9a2f2d60c3L,0x29d3f22fe2ee5293L } },
50138     /* 39 << 105 */
50139     { { 0x14940dbc178f9859L,0x6e6e35b7329ec4a2L,0xd1f198096707db4aL,
50140         0x6eb310b79fe4233aL,0x8f92556eb41e1d8cL,0x2ab28e231d7ce522L },
50141       { 0xc5d0f5dfdd5c4d68L,0x3f5146d825101083L,0x3a04aa53de9ee4cfL,
50142         0xcf36f1e3d9357f64L,0x05a1896444889f68L,0x1096c87aa96a4137L } },
50143     /* 40 << 105 */
50144     { { 0xfa4b6697a8352657L,0xf5696452cad6ec30L,0x10aaba60986c84ffL,
50145         0x49bdfff4dae014e1L,0xe2a810bd0abc0e46L,0x1dc5b81462d1dd5fL },
50146       { 0x15d2f2c723bb4561L,0x5ac7b6421818e30cL,0x40c6b6f94c545f5bL,
50147         0x5875b6b2f99241e8L,0xfa3e88a9d6708293L,0x1c936920ad6d9344L } },
50148     /* 41 << 105 */
50149     { { 0x6516f6210e18ec42L,0xb967eb43df8c26bdL,0x624ee27e69addc2aL,
50150         0x34019d6339063252L,0xb317fdd3dcd99d7aL,0xc3d566825d314caaL },
50151       { 0x04992df3367506b8L,0x13e4ab2e547262b7L,0x35f130352e287d3eL,
50152         0x92e0a276211304d9L,0x94e7129417133d22L,0xb35302275fd71a28L } },
50153     /* 42 << 105 */
50154     { { 0xe1d9273c9ae60111L,0xe86aeac3d01243ecL,0xc7257b27fa5989f5L,
50155         0x57737dc89807d3ccL,0xe1ef78526937551aL,0x74ab9edb15dd2d58L },
50156       { 0xbc47b23cc59962fbL,0x376ff30fd3bba76dL,0xaf0035872788ab98L,
50157         0x1e475c68619b472cL,0xd79984c89c6a9835L,0x5ceafba510219a94L } },
50158     /* 43 << 105 */
50159     { { 0xc25ae81155d238d9L,0xf2a21fce4ba4456fL,0x4ebe44d0bd1a440cL,
50160         0xe821687f83d958beL,0xb4ce63423ba09f9dL,0xf271435d139048bcL },
50161       { 0x2a3db37c99c6412eL,0x50cba09ccb36dbd0L,0x9e5231aef6e65cf8L,
50162         0x48e9105d90118a6bL,0x2d58d372368144cbL,0x48702d59928575baL } },
50163     /* 44 << 105 */
50164     { { 0xc71ce040d1c9204cL,0x8ad09d7373f7686eL,0xbcc6d88dc6fcf31dL,
50165         0x22a0b71aaf428ad3L,0x7767944847721255L,0x2b720c7e316b808fL },
50166       { 0x3128a7cc5ed45b8bL,0x9744c6c0f79fa1c7L,0x738e94efd22728d7L,
50167         0x8a652496fff8f874L,0x0e4a5ade566c9751L,0xfcde62db64e3199bL } },
50168     /* 45 << 105 */
50169     { { 0xb068ec91aa63f5fcL,0x547e7e471a29ddfbL,0xe3e5de42b17b8e5dL,
50170         0xb5c84f27264d1361L,0xa68d10a426432715L,0x4f31e81c23e48e1dL },
50171       { 0xe32bea6116dbe185L,0xfaeab7256d1d34feL,0x0ee437cef3a8ca7bL,
50172         0x2b8657a2f458446bL,0x8779a3d4c52e3dcaL,0x243d7d0e71654165L } },
50173     /* 46 << 105 */
50174     { { 0xc4a346b2de23afe2L,0xf8e00f790fac7ba4L,0x22393604ab76b7d8L,
50175         0x109233d7a06efba8L,0x5bf89334c7bf56a4L,0x27ed4a28135d4cabL },
50176       { 0x07851ad2e32ca02fL,0x41b7ffa630c97f29L,0x383b3716e4457ccdL,
50177         0x6ce8645b0b43a50fL,0x73c82018fc5b907bL,0x79a1467381bbcf0dL } },
50178     /* 47 << 105 */
50179     { { 0xcf5331d35e092e41L,0x7e0b9fdeb43e3c15L,0x842a971182841f82L,
50180         0x2d837c810cb9d1ecL,0x6aff6d6873095ddeL,0x2a7f6f40c9478ef3L },
50181       { 0xb6e8ac80a9976e39L,0x3853fa5474e40024L,0x664b159a6d87c1d9L,
50182         0xaaedf4b4b20b5d11L,0x8a1ac277c5819de1L,0xf10276dc6450b97eL } },
50183     /* 48 << 105 */
50184     { { 0xa8d7901c7c16c09bL,0x628ff3be42e1948bL,0xb905d7c504e4bce1L,
50185         0xdfbf9c4e5ab0696fL,0x0f4e6e2ab6db9cd5L,0x4857e570482e40feL },
50186       { 0x5ccd9b421c3beed4L,0x171b085fae51a947L,0xcebe0dbe59065754L,
50187         0x4d052d3a461c1620L,0x396bac422fe541a7L,0x8e714cdb70bf32d8L } },
50188     /* 49 << 105 */
50189     { { 0xed82f15e6ca1cdcbL,0xc5ae5cde51b9a9cbL,0x3b2f78cec70c475eL,
50190         0x0f22d10b4243c675L,0x1db96885facac4c6L,0x2fb7884817df2f2cL },
50191       { 0x25fb9f4e990f3104L,0x1416733ecefa14f7L,0x3a33828384a5dc24L,
50192         0x6d75d3d02564288cL,0xf7bea8b69b93e62aL,0xa5ea8695349f1740L } },
50193     /* 50 << 105 */
50194     { { 0x38feea7115e711b8L,0x129aea564accd3eaL,0xc53e54c412b23539L,
50195         0xb15bf11a2b280c59L,0x5ea76f5782d44df5L,0xea79f833d4ac1af8L },
50196       { 0xe547deba08330c6dL,0xbaa89422663ef402L,0x17263762d215a5f5L,
50197         0xb9509a19c02b5f9eL,0x9bb99fcb025caaccL,0x43f4494b25f24089L } },
50198     /* 51 << 105 */
50199     { { 0xe55e592c98563c70L,0x4e62ace5d013c82aL,0xb6025ac16fcf7380L,
50200         0xac4a8157cfdff8b9L,0x1fa181344497acf6L,0xdcdf05c0ef09d3e9L },
50201       { 0x7a65490d83d8e716L,0x2aee0b35e98c46feL,0xe62381dc7d6d4035L,
50202         0xc7162b78203975c0L,0x1079d8b6aad2c021L,0xe3e1cb4370c98838L } },
50203     /* 52 << 105 */
50204     { { 0x3ca01799f04dd97aL,0xd6d1d41d3f9e03f3L,0xac2713eda55fa375L,
50205         0x2bd440556a89a5e5L,0x8582d98458f5c269L,0x7f9b3527fb31fc27L },
50206       { 0x23f91951d810580dL,0x99303919360a3debL,0xfaf10326b5e1eea8L,
50207         0xf96feb4838ba5ac8L,0x1508b1002a639622L,0x0766a1019dc93c78L } },
50208     /* 53 << 105 */
50209     { { 0x0c79d40679a0290cL,0xc09bca0c57eb7a00L,0xf7274ffc163c1dcdL,
50210         0xd64ec461bb2c83c4L,0xff3b83efe9ee350bL,0xa490157d01882c72L },
50211       { 0x626e1f3d3312310bL,0xd2097e03cdd5d62cL,0x705c3fcadbf659c5L,
50212         0x2dc1d7cc810fa413L,0x6313192ad67d58a8L,0x6e1e5bc3597f63a6L } },
50213     /* 54 << 105 */
50214     { { 0x6100535ea0d42639L,0xb126e939d921369dL,0x2d4c826e4999e42cL,
50215         0x159063c6f62f77e7L,0x063c42914e632555L,0x8d3ee387b35d8220L },
50216       { 0xbd951cff9b2bac3eL,0xd9b943f1bc248755L,0xeee7017ad3a6074cL,
50217         0xbcb9e0e6b0872a21L,0x26d80e0949dff656L,0x2ad7d4e335fbf620L } },
50218     /* 55 << 105 */
50219     { { 0x6ce5840df7f9503fL,0xb96f82996abf4f6bL,0xf71f33853ab55fcdL,
50220         0xe347e891e83a8109L,0x12c5dcdeeb48f0faL,0xb0f02553cd7183a9L },
50221       { 0xa7d74862c414f01fL,0xbea40c5cae369360L,0xbe9785e5022d5192L,
50222         0x1a3224a50d318251L,0x4d7200093fcbceebL,0x1fd71167c2976f6dL } },
50223     /* 56 << 105 */
50224     { { 0x03c88a8566d2ee47L,0xee8e5c34455ee428L,0xd90a3d393870d90eL,
50225         0x2fd78d14f2fdb976L,0x9472a6066a312a30L,0xea68e2283484af2fL },
50226       { 0x7cf25951ac9e5cf2L,0x024f07ee37a28e95L,0x5d479379e563a2bdL,
50227         0xe87b50a4b46e93d8L,0x9128fc11f137285cL,0xe46efdf77c67d7e6L } },
50228     /* 57 << 105 */
50229     { { 0x4050036c7cb0b9a1L,0x8560750c1161d7fdL,0x4d293a521b247ba9L,
50230         0x4b25e54c8f1b9d31L,0x91c89139c5baa0aaL,0xa2f75f9f2202b7e2L },
50231       { 0x6c0915dd4d2d1388L,0x575d90f703717fd7L,0xd90c059b03e0626dL,
50232         0x7004305ba4239e8cL,0x39fb4e2e989775e6L,0x20c31fc8d8a239c6L } },
50233     /* 58 << 105 */
50234     { { 0x4de318054ab51b84L,0x4a68443c6aa00707L,0x2c3637f05b317f3bL,
50235         0xb8ea6f87c0fc14a7L,0xcd0cb4fca2cc6af8L,0x6b5fc899317083fbL },
50236       { 0x1b8f160956e6dfa1L,0x698299ed92b77d20L,0xdb84ab7f14fc3fc1L,
50237         0x944666a35d5fe625L,0xe9a3448d7e064ab0L,0x53f62fa01abe1440L } },
50238     /* 59 << 105 */
50239     { { 0x04bc8a2bc8c676b8L,0x502a73144a577562L,0x494d01f11ff01f9dL,
50240         0xfe648df164d98f70L,0x80bed0d849719dd3L,0xb77a8f09c231e190L },
50241       { 0xc8aa8daecc011818L,0xf313be4f5918814eL,0xf28fcb74488b5bfeL,
50242         0x71e23b19b3345c98L,0x1cfb7c0596eba9beL,0xa88e73b941c61971L } },
50243     /* 60 << 105 */
50244     { { 0xdc7050459cfd4295L,0x1cc9648eedeea59eL,0x88f4af1c0e9ca92dL,
50245         0x45d0b53f69689317L,0xa122a6dd41c04186L,0x9df54c3a277fba1aL },
50246       { 0x1efc55a5017eb9ccL,0xb253f7b661d1ecd4L,0xd03f8ec6acfb7854L,
50247         0xf641e5f49f338dbaL,0x6b6a680a3a3addbcL,0xe80babb5b5cd058eL } },
50248     /* 61 << 105 */
50249     { { 0xb48da67307873319L,0x53309cdf3bf5db9bL,0x1bc510e64ee9dd11L,
50250         0xbb8e529a7388950aL,0xc9c0ce3c7f6e6175L,0xd75753f88a290784L },
50251       { 0xfebdd94ba80acc08L,0x942cdfebdc846b30L,0xbb64799f6ca7099fL,
50252         0x40f03362d1326fa8L,0x95b2d9db97b62e9eL,0x5ad9ce165301d9aaL } },
50253     /* 62 << 105 */
50254     { { 0xaa5fead9dfc59ef1L,0xc1348e98b2cc1e9aL,0x83dd617e77bda968L,
50255         0x0fdcc0837c8997dfL,0x9206ae234cc62b01L,0x88aec92f417678dfL },
50256       { 0x9d399af791fb8920L,0x399eebd13e8a22a0L,0x32f3bba735bebdf3L,
50257         0x354c1c5004c2f32aL,0xc2d6b5514052c926L,0x16a1f71f656a7eebL } },
50258     /* 63 << 105 */
50259     { { 0xd7a755bc14a8c57bL,0xa97b901341ebec55L,0x88b88459143a1a9bL,
50260         0x7aa178cc7e19e3e0L,0xb8359634635dfb65L,0x63fd26c7c169e28aL },
50261       { 0x89d9090d953272f5L,0x63e571196383845aL,0x0e26c0cf886a1f1fL,
50262         0xda56332db7057a29L,0x6b5d303f7a459c6fL,0x3c351b771bb704c3L } },
50263     /* 64 << 105 */
50264     { { 0xda2b0725bb296c27L,0x1f22ffa4d341171bL,0xc721e35a5b132756L,
50265         0xe5695e84fadb6907L,0xbc5a3bf4c283f546L,0x9182cb3edde128aeL },
50266       { 0x179c7fa66592e05eL,0x1e604790f38e8586L,0xaf7e83bea16bad55L,
50267         0x6f41231e9137ecd8L,0xac87543d8f30d1abL,0x630a9d87b1ee0ee8L } },
50268     /* 0 << 112 */
50269     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
50270       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
50271     /* 1 << 112 */
50272     { { 0x359cbfa05e4f1914L,0x6992cd48d922176aL,0x2fd5e90f630cbcb5L,
50273         0x2b0f61306ddbf238L,0x5070970a3af753e6L,0x433d009441727016L },
50274       { 0x2eb15b3b9dca97e2L,0x3a7379cd00d96875L,0x0d4374aee930a75cL,
50275         0x3cd36046849e7727L,0x9ac3117e336a19ffL,0x2d1373c9433ddc04L } },
50276     /* 2 << 112 */
50277     { { 0x985dcb43e4362d67L,0xecb860c2a939bea4L,0x40597f3055fbf1d5L,
50278         0xb6d166bf43fcd98aL,0x5932570915ec99caL,0xe05ae3b9c5bdd370L },
50279       { 0xc18f78270c7b943bL,0x84bde9c64dd572ccL,0x5d50a89df478e56bL,
50280         0x242c2f4864d29053L,0xcda12c6161cf7e0eL,0xf8b6890eac8d1d40L } },
50281     /* 3 << 112 */
50282     { { 0x7a9a9dd7b6b11af8L,0xac4c50dd16a42f8fL,0x1550267b6726c324L,
50283         0x12cfb2fd7f841afbL,0xa41b19052f046430L,0x8f5f5373b7d786cbL },
50284       { 0x7b61b39c729e09fbL,0x07a5415f2626da4cL,0x65d6efb84a348905L,
50285         0xf377862cf2e864b9L,0x3c94000dab96cdb2L,0x2176321a8efef0f6L } },
50286     /* 4 << 112 */
50287     { { 0x8c558000c1c1bc68L,0x9e48a67a83fd6ca6L,0xacf0d75ceb7a35cbL,
50288         0x0fbdce4cf0a93110L,0x82b2d13a9cc50c85L,0x696fd259cef70d6fL },
50289       { 0x1cc9be2e457b88c2L,0x0d58b34b1f04c0bcL,0x52bd479f195a532bL,
50290         0x769fe6ca1ab3605cL,0xba6a63e48a24c1e0L,0x86dea46299da5d7aL } },
50291     /* 5 << 112 */
50292     { { 0xdf2a6cecd24790f3L,0x37bfbba7b87ca06dL,0x7c8a7e4c0de8a6aaL,
50293         0x5c806b94be7b8f5dL,0xccca1c714fda3e7eL,0x3c1cbaf9cff788e5L },
50294       { 0x17a081a9565d0464L,0xc4eb995713ed1b82L,0x0d7c90549e4cfac7L,
50295         0x6fb74c629d53a200L,0x65b9ed6d5f977a8bL,0xe2279cec0ba2e7c4L } },
50296     /* 6 << 112 */
50297     { { 0x8435e2962d4412dcL,0xa36cbfef972350d8L,0xe2fe6e6fece5cb15L,
50298         0x6f249b095336f7ffL,0x5801feb9908ee267L,0x7649a837fc8f217bL },
50299       { 0xfc1adc3ea0ebc808L,0x1ef06bec94f08075L,0x4afb5404cc1d9b72L,
50300         0x75cabd61a1f2c5a4L,0x2bd797e1cd08f195L,0x4f1b5cdecbea0f49L } },
50301     /* 7 << 112 */
50302     { { 0xe9759aa9e7aa87e2L,0x2d54a5fbe5909f55L,0xe49a59aa2c80bb61L,
50303         0xdb89e21230c9b328L,0xf42b9adb004ebffcL,0x4471b983479678e4L },
50304       { 0x0dde5b0e97709e2dL,0x2f35c653a12bdb85L,0x9f8d7a5cd8c8285cL,
50305         0xd7cde5971d156206L,0xdbe765d7a8e126bcL,0x2e645b6de3f4e60bL } },
50306     /* 8 << 112 */
50307     { { 0x509abccb65682820L,0xfbfa1d094ff86137L,0x1ae371bd640bc2f6L,
50308         0xa155c2978f546c68L,0x8858cadcc08b8cbfL,0xafac5b0a1d96948bL },
50309       { 0x919cb22682e25016L,0xd147df4ab064ffc3L,0x25dd0f1ab4abe560L,
50310         0xc6bbe6369cb75bd1L,0xbb367cf947a778e4L,0x5714aa4dbde524b3L } },
50311     /* 9 << 112 */
50312     { { 0xce3c8218e61b1439L,0x8be5a9cb67f79d28L,0xb1bd1386d5164b35L,
50313         0x0bc24d96b9adbac7L,0xbcee4f0ec7482414L,0xac15b5b66ca5d49dL },
50314       { 0x79caa999f20f9a50L,0x89bfd652a911308cL,0x972fe26d15245a7dL,
50315         0xd44d0f6e1d0d2939L,0x6749beaedd439057L,0x02627a6ad4b6f416L } },
50316     /* 10 << 112 */
50317     { { 0x7e882e8cb437b791L,0x9afde25afbe334cfL,0x60184381da52f9fbL,
50318         0x935d33a1001df73cL,0x38f303df080682e5L,0xd9cf2c1f4e9a29b2L },
50319       { 0x889d265e00d9208eL,0xfc1cc2221fd8e817L,0xdd14f1a2ec71428aL,
50320         0xe81cc4f9d9e973aaL,0x26a154963696468cL,0x0620fe6409d546acL } },
50321     /* 11 << 112 */
50322     { { 0x06ed3e64166be92fL,0xe1da6e27c51ea53eL,0x784f2514acb2b245L,
50323         0xc544e50f8e24077fL,0xad449938c5c01787L,0x5d9ef8d527d41dd7L },
50324       { 0x37114064e15d4a96L,0x7f0c92aa1dd45321L,0xc1f11d56b9c72ee5L,
50325         0x91f3b3f7a78e6d3aL,0x0cf440b0c9488cf7L,0x14d3defd93df403aL } },
50326     /* 12 << 112 */
50327     { { 0x3fa4ea0225aa1d44L,0x22c68e17f74a6a3aL,0x351bcb80f489e72dL,
50328         0xdabdf118be0268edL,0xa3bf9e1984d2cd16L,0x318506a2d67393a4L },
50329       { 0xb0c6b2d8615ed517L,0x42ac507c3dcba0f9L,0x60570dfb51235e30L,
50330         0xc677628dedb033e4L,0x0290c22766e61f76L,0x1d8450d09888943fL } },
50331     /* 13 << 112 */
50332     { { 0x1b8f5ed7155a3daeL,0xc9d2433aa46ed72bL,0xe99c7fe38ca361fbL,
50333         0x606b08c19626fe7bL,0xe6447257c0ea792aL,0x5839e2c62e1156f3L },
50334       { 0xb73135dd5eab6d41L,0x200f2e488ef63584L,0x4c73885ddda1c49eL,
50335         0x8d606a75b5428ee9L,0x2a73cc7aa62699dcL,0x484a58941c6c8de5L } },
50336     /* 14 << 112 */
50337     { { 0x2365b4150decae0cL,0x9c8567ece8583741L,0x35d6cfae6d8842a7L,
50338         0x4e6c98e6dd0db8e4L,0x584524e767b34d02L,0x786ea52f554c6117L },
50339       { 0x8952ce169320725fL,0x8eb7f91854c4c8f2L,0xdd34f77afc799251L,
50340         0x76b8c3173e05d37fL,0x664cbddcebb4d365L,0x31ba98b90dfa1a98L } },
50341     /* 15 << 112 */
50342     { { 0xf113a7bd651c186fL,0x417bd7373737a50aL,0xddb40d201b858249L,
50343         0x62a60745345f5b45L,0xf0a03f5c2d4e221eL,0xcafde67cc64621a2L },
50344       { 0xbbbfaebcbc3c06c3L,0xadaf9a16b8383dc0L,0xcd21aa308f343ea2L,
50345         0x64cefec0d890128dL,0x2ed9b8f763b44054L,0xc0a49e2917c0ffcfL } },
50346     /* 16 << 112 */
50347     { { 0xc6307399166915dfL,0xb35545bc5da8a26eL,0x8e0126aae3a99321L,
50348         0x0fbfdf76da9308d1L,0x2163ed6b6168e505L,0x71f3d0087500d8bdL },
50349       { 0xf57159605ac13f65L,0xc1cd9a6755172d5bL,0x6b225f7e53d84c65L,
50350         0x9c031269025029daL,0x54c1edfa17d89aedL,0x5b0238786b435150L } },
50351     /* 17 << 112 */
50352     { { 0x96d69db1146abf28L,0xc924454924d221dbL,0x7881951c137bdfe1L,
50353         0xde2d490dda51f789L,0x6033c2c34b0a1e0aL,0xbe214d8c08dac13eL },
50354       { 0x3d5abfa9a5a1d055L,0x3433060f6fe02a62L,0x88608c7ba37f2833L,
50355         0xfd2da6f0e74dd6c1L,0x27c22c17fe000000L,0x04a1f15bcfbde005L } },
50356     /* 18 << 112 */
50357     { { 0x01204485f340b522L,0x588a9e1c9367a099L,0xb3d1a4b466005913L,
50358         0x522ac504d55cc36fL,0xa6c80e511b72eabaL,0x15025a7acaaa89b5L },
50359       { 0xc9166912bec1a986L,0xe78e9642f19044cfL,0x230d51ab4756908aL,
50360         0x6795942aac04cb90L,0xcd2cc9eca2a92818L,0xfccead967cf52961L } },
50361     /* 19 << 112 */
50362     { { 0x32fa291d52ccf481L,0xbb137ef901ac0eafL,0x13ce2183011746abL,
50363         0x7e64248677bfea0aL,0x67cbba0e5e7e5032L,0xc900998a1f2b69fbL },
50364       { 0x62ddd91aab3256afL,0x1f0f216911d7996fL,0xab2f2d540e4dd4feL,
50365         0x05b577a92ec64ec3L,0x8071e88708ef233aL,0x9be1f8d60e649a5cL } },
50366     /* 20 << 112 */
50367     { { 0x5f78334137732664L,0x625b85dc840b6f8eL,0x7dcb3d256cdf0959L,
50368         0x87a5ae19d4ce1845L,0x43bf0721b0dc016aL,0x6569ad52f6a5f6f3L },
50369       { 0xa2697f15560ab87aL,0x4c6fd1a0060dcd57L,0x652a7732c3167f56L,
50370         0xe355fef05294a5e0L,0xf7b3177dcc59c562L,0x511c96dddccf4b1fL } },
50371     /* 21 << 112 */
50372     { { 0xec768f587622c0b9L,0x7c9eb5490416afe7L,0x3c3d87f55795433eL,
50373         0x74eff3cba4611446L,0xb2c79249dc7037d3L,0x70062ebd8bb1fc42L },
50374       { 0xbd0d3532a4ad91c8L,0x42411c139f5ee0c3L,0x11c4ee91132470cbL,
50375         0x496438979fb2a135L,0x4c1df7e0ce2ec891L,0x689cda57e16f7413L } },
50376     /* 22 << 112 */
50377     { { 0x3b42838a2a0030a1L,0x3f37587ae05ba56eL,0x6382a86f44c16650L,
50378         0x6c1bc67da6f9f136L,0x7d152d907ada0f41L,0x9115319d5c40c0f5L },
50379       { 0x1143028632f58e3aL,0x5dcf7ec7eda5c5a2L,0xf04404a9f334a0b2L,
50380         0x75e0b4a84ec2cbd5L,0x86e89728d079dbf0L,0x796700799a99c605L } },
50381     /* 23 << 112 */
50382     { { 0x98456a79b1d2a3fdL,0x4e8ba91e6dd789e9L,0x8e0bfa33a435226eL,
50383         0x42bea2f48cfea5ccL,0x5ca5fb0321b14602L,0x73faac5826877b13L },
50384       { 0x0ddb6ea203905ebbL,0x67bc35f1698cd7abL,0x24da47d85d9af735L,
50385         0x1a2a7c1dd786000eL,0xb35fb29e23ccaceaL,0x1c063466bf1f51a7L } },
50386     /* 24 << 112 */
50387     { { 0x1e7ae1601e94d949L,0x177dc53ee78e6221L,0x8af29d8f7aeb9882L,
50388         0x2d9a60fd9e3f3906L,0x6979fcd6df962156L,0xdd2fe5887e1e54b8L },
50389       { 0x9cccf31076643453L,0x94ece1a84e0643d0L,0x745449cbc111d8cfL,
50390         0x872afa4ae6cfbd97L,0x5c27b7ca10dfb34eL,0x505e62bc533480feL } },
50391     /* 25 << 112 */
50392     { { 0x6dd2007363141676L,0xdb099810c5c4c657L,0x2bbbcbaf8c369f32L,
50393         0x339e3ded08794178L,0xcc362a32315c4cd7L,0x5d288ff37dbce794L },
50394       { 0xafd05d104d0cb6c6L,0x3a6dcee9d386c7dfL,0xa207dc17e311ee74L,
50395         0xc5794286abdc751cL,0xf45136e5d889b985L,0xb25e84638d8f32a3L } },
50396     /* 26 << 112 */
50397     { { 0x8711ebfd1dc32f77L,0xfc0e851f3933d758L,0x90b679fd64a859f3L,
50398         0x0914a975ef37a81eL,0xcef80495d675c502L,0x862d3b65be18c403L },
50399       { 0x0d53f957305b4aa2L,0xe404f2570e5bcb47L,0x833a8644854b6b63L,
50400         0x5709f53b99f8d3d9L,0xc400dc1f13893effL,0x75ca01714c65086eL } },
50401     /* 27 << 112 */
50402     { { 0xdaaf8e76eeceb904L,0xbce9ca54b9e31f92L,0x4442d0c88d06a58fL,
50403         0x5966e1e5eda0ee34L,0x043125f058edc555L,0x44d0311749cf0931L },
50404       { 0x292aea12a99ae5c2L,0x1e9be1702a2bade4L,0x003ec2826b21b444L,
50405         0xc158f3cffc41d601L,0x25a839f4c4b3f4c7L,0x4a36bec399e64264L } },
50406     /* 28 << 112 */
50407     { { 0x829bbe7e04e6bda7L,0xc52b64ded3e667dbL,0x98aa40ecaa2fc128L,
50408         0x2c6997d011fbef94L,0x70ca76aa97c8167eL,0x558f8ce7b1083886L },
50409       { 0x5c621e35d250f064L,0x757710f8f535b2c7L,0x5d118d8faa69ee95L,
50410         0x02ffe667b27cd9deL,0x65711ac7d13e51fcL,0xdbbf16278cb1a1c7L } },
50411     /* 29 << 112 */
50412     { { 0x3c2fcbceeab0bb77L,0x569d6c7e4e1b17adL,0x22e06899b0518730L,
50413         0xf8466d9d19f809e9L,0x372e254288359d10L,0x8074483532d5bb82L },
50414       { 0xc88727d566060945L,0x08e9246572a0d38fL,0x84ca145c9f84a861L,
50415         0x8363463c1c004212L,0x9debab72bd3ad87eL,0xce68c150a988e65dL } },
50416     /* 30 << 112 */
50417     { { 0x1c172e5ea71dbae0L,0xf7794eb19b80bf40L,0x3007c5705d7d2829L,
50418         0xa8d44d6fcc97cf00L,0x093a9784f6abea6bL,0x2ac4a67564cca46fL },
50419       { 0x14fcc56350d8fc8bL,0x53133983a11ccd07L,0x7cf09bf68e6b8f26L,
50420         0x49f864d57b06e3adL,0xd526a765c373fc6dL,0x7af297c6151305d5L } },
50421     /* 31 << 112 */
50422     { { 0x18f941bfcf7c1eb5L,0xda10720a130163b7L,0x3c4894f46bd9bb34L,
50423         0x7575087bc8ca64f1L,0x68c424852c8f3798L,0x986214eecf0e5839L },
50424       { 0x3723b713df2b0b90L,0xd81560d5d229bf8aL,0x0204ae5ff993078eL,
50425         0x55206d9186a14833L,0x8c7d09181557fc96L,0xe2cd5dcdddba9705L } },
50426     /* 32 << 112 */
50427     { { 0x009ef80aae238fa1L,0xb41d9b24486af6b5L,0xab4455ed685add95L,
50428         0x18f323f672c7dac8L,0xe7009790e372f168L,0x4d5bcba6067bea99L },
50429       { 0xf15bdbcc51a2a9a9L,0xde7e4f742fac9169L,0x2fd62c304bdbec36L,
50430         0x8b3ea93d1b3ac6c7L,0xce1c8e5c9c293889L,0x19664dda11564f8bL } },
50431     /* 33 << 112 */
50432     { { 0x207a738245406afaL,0x7c1c398d1675bc91L,0x2ae99d8ba1bb7a43L,
50433         0x63f134e8c5e176e5L,0x4a624a1c48364268L,0x471974f1de65c5deL },
50434       { 0x44932063ea90b0cfL,0x13ba5019d8fd7e30L,0x6281f71348510422L,
50435         0xdaba3f14bc1a523aL,0x333e5eff924cc5cdL,0x861ab150e9113d1dL } },
50436     /* 34 << 112 */
50437     { { 0x332d308dd9b9461cL,0x3e9b4a95b7014261L,0xc557f608c2beeb5cL,
50438         0x9ee927187c8531d6L,0x55ff3dfcc0002ff0L,0xed96119eccd9b325L },
50439       { 0xd779ba03fb92416bL,0x63b75d351416be79L,0x793cb1fbfc9ad27fL,
50440         0xcc762a5b87f1bc59L,0x6e7a23389bbb07d8L,0x99b6e278aa7bfa44L } },
50441     /* 35 << 112 */
50442     { { 0xeb142de02bcce03eL,0xcac04711577565e2L,0xa949c7350ab07328L,
50443         0x8f15874cd7d347ebL,0xade8c67a696dc9f3L,0x039e6b7c66a7bcadL },
50444       { 0x1260bd4acb8cb9d2L,0xdbf05496d4801bcfL,0x6b37a4d30ffb845eL,
50445         0xc3968fe150b50889L,0x261e82f4525c6a7dL,0x539f634912aad50bL } },
50446     /* 36 << 112 */
50447     { { 0xcb1a9d2ceae4d774L,0xfdec2ca998a0775cL,0xa538acbd0eab9e25L,
50448         0x6901ebfd04dd34b0L,0x998ab679ed4c6409L,0x69b1d7ee0235b865L },
50449       { 0x4f2e6e5723ac3be6L,0x2b2072aed4a00479L,0x5c12fcdc2ce2f059L,
50450         0xfc688c45ac329db8L,0x16d377a51f539427L,0xebe4e2cfa08ed9aeL } },
50451     /* 37 << 112 */
50452     { { 0xb394214715d60238L,0x60d8909bbe9d4febL,0x013827b78654e16cL,
50453         0x465b3078824fc55aL,0x361e6523e3fcd6c0L,0x2ef44d80ef88b307L },
50454       { 0xdca7809fbeb2db77L,0xe649d591da97468aL,0xad6079b77c28ff0aL,
50455         0x6a21ce1ac4897775L,0xde876f7b5a592fd5L,0xced421a585a1dd36L } },
50456     /* 38 << 112 */
50457     { { 0x9793bdf6a045a442L,0xdb3c60472713ed37L,0x9929d32261344a0bL,
50458         0xfb48c2dc831af45cL,0x730226df53a8a077L,0x3a5baf8a18876559L },
50459       { 0x99736e7d8e11f9edL,0x3e7663dd0c09dddfL,0x368a29ed89b8a23dL,
50460         0x5443d7f5d3a68663L,0x0b84b464c6302455L,0x235c6eb5cf088847L } },
50461     /* 39 << 112 */
50462     { { 0x13307013b8de0a3aL,0xfb10e919f592fd9eL,0xd09e5b2571401ec7L,
50463         0x6e8091c11d94cf0aL,0xb7d79fc74193b129L,0xb842a3695f2c05e5L },
50464       { 0xcf6fc6cbccdc7614L,0x77d6408180102a3aL,0xde4b9304f30c3488L,
50465         0x4fd9f8d89bd08e48L,0x58ac01245963b063L,0x1f11335c747fac66L } },
50466     /* 40 << 112 */
50467     { { 0x5f266f13175418b2L,0x6bd7a86903a626f9L,0xc7b532304a6f11caL,
50468         0xa216b056bfc8ccedL,0xa274d5d8b288cb7cL,0x6fc4a35d924897adL },
50469       { 0x1ea532eb81fc6940L,0x2fcd817e2acbbc45L,0x45eee93f67814fa3L,
50470         0x3b3da48c1229e035L,0xd049a976efd8e3d7L,0x8087dff7bf81f314L } },
50471     /* 41 << 112 */
50472     { { 0x9ccd802fbddea807L,0x08a64e86d93b97f6L,0x422c0f5602f04e3cL,
50473         0x25aecab133900990L,0xcdb2c5c15d4b4d2fL,0x849a6b1f5f43e42eL },
50474       { 0x4689b815446e7361L,0x49abaf6ca681fba0L,0x304d84b18289a564L,
50475         0xa6529d430b779df3L,0xca926da67b51b195L,0x3640dde5c829ae84L } },
50476     /* 42 << 112 */
50477     { { 0x747235495424e1d0L,0x3861ae65c85af64fL,0xc56ff12baab902c2L,
50478         0x9aeb9e154fbf264eL,0x14e3c13942ca40d2L,0x6c26da41c1ba0250L },
50479       { 0x97a6031df51a0967L,0x88fea7710e623393L,0xcafae4c778574eefL,
50480         0x2c4c281198119f28L,0xd190fc749276d971L,0x843f4baf9273f01cL } },
50481     /* 43 << 112 */
50482     { { 0x1b2d643de50ad79dL,0x1ceaee7ed3075486L,0x13a003f3ec287aabL,
50483         0x09a4a825e8c7aeddL,0x93babe5ad1d4c05cL,0x8115bfec95ab084cL },
50484       { 0x629e8e0a289ebb8aL,0x923167a9bd992f77L,0x440edf75ae16ce72L,
50485         0xa67dd37b0a0019d4L,0x174b341978b0df8dL,0x010746a5ad6e4c60L } },
50486     /* 44 << 112 */
50487     { { 0xed05e4bf8342da4aL,0x36d881f3b565f0f2L,0x3fbd04e1411e627fL,
50488         0x40ac13cb0411889aL,0x9f6006cab5b25fd6L,0x0e79d377e31404ccL },
50489       { 0x9fd6474a5af3ea01L,0x89d7ddcb2a27d905L,0x2c1beebada12e71dL,
50490         0x3ecb11e1833eb7deL,0xa348b2f6600eb1faL,0xc227192183f2657fL } },
50491     /* 45 << 112 */
50492     { { 0x2cfaf519e32ba792L,0xa99113d7f929b512L,0xd347f7d18f554e19L,
50493         0x18f0374f098a2ad8L,0x073855acc174e0b9L,0xf155c6c009324c23L },
50494       { 0x3388c39605d1e427L,0x144356a9d39221d1L,0xe3d4ffed492a84adL,
50495         0x519c65e6d1e53c29L,0x334f470a2813c717L,0x69aa0a1de0a400e7L } },
50496     /* 46 << 112 */
50497     { { 0xd8689c9c39e70b62L,0x2b87157e6cd86fe6L,0x53d55de887c0f35dL,
50498         0xb2d7141de09aa44bL,0x3499553084fe7c21L,0x4550096c16b19be0L },
50499       { 0xb0a8ce05b856dac0L,0x570223450e211887L,0x8d4a7431aca17401L,
50500         0x96bf439857400a0eL,0x1e849d365ffd5f34L,0x7e70f6253a6d23acL } },
50501     /* 47 << 112 */
50502     { { 0x511ad0024b4ecd64L,0xd2287a28f37bf796L,0x801d2c2dcbc1f22dL,
50503         0xf0d3a6944df568c8L,0xa7fec550af6836b0L,0xa27dd6e887a426c7L },
50504       { 0x2f730e5b59c6b695L,0x9df438ee93ee2b36L,0xc4def9eaf2cfc4c6L,
50505         0x82ddcca0a209814bL,0xb2e1de4f6dc916d3L,0xc6798e7453f81a55L } },
50506     /* 48 << 112 */
50507     { { 0x77faac22bd366155L,0x13cc4038282f11b5L,0x31ad1dd45fbd35abL,
50508         0x7e0de9da45d6d40eL,0xa16c5f1939749ef6L,0x761cd6cf85691cf2L },
50509       { 0x156536ad4d59b802L,0xee98dc4187c4b11dL,0x165a1eacd35088fcL,
50510         0xce8a733538fb995cL,0x34d0d3313293b3a5L,0xfcf548ca8b570e79L } },
50511     /* 49 << 112 */
50512     { { 0x4c4bddca99e8cb05L,0x2b900ed017c5be91L,0x0ba0201b40adbfc1L,
50513         0xb5098cf8534595ecL,0x356e23ff80f56f69L,0x8b3fa12e748555a0L },
50514       { 0x9063437677b8ebdbL,0xe3eb33fdf040b6a8L,0xcc5b699539b611ceL,
50515         0x20171523c693be7eL,0x5c4364d760849cf0L,0x30f3376372c4d303L } },
50516     /* 50 << 112 */
50517     { { 0x0757295022a8c8e0L,0x6e05715866ca81ecL,0x7e8e36890f804bc9L,
50518         0xcba813a191b99207L,0x3f11f7abe50ab65fL,0xaefe5479b6d05954L },
50519       { 0x48dd59a1eff5cf18L,0xa623b738bda11ecdL,0x586e755818870f08L,
50520         0xb2c471a50e38ba1aL,0x5b21c42c69ce8032L,0xaf040e6c7943d78eL } },
50521     /* 51 << 112 */
50522     { { 0x6364714c4852f979L,0x7ed7aa310700cd35L,0x9021e46d9376733cL,
50523         0xf2b65ed3b6de8d03L,0x0e3d00c16652346cL,0x6630fcb75d27e2d0L },
50524       { 0x69cc20ded79a1c20L,0xa6d77163be3745e6L,0xab36946379aacf14L,
50525         0x8bdffbf1b935a1daL,0xda8eb343b63096f6L,0xf61988f13c966345L } },
50526     /* 52 << 112 */
50527     { { 0x06f684ffd31f390eL,0xa1467be560ec98a8L,0x7cbdd03eaa80fddeL,
50528         0x0ae4d114e204ded1L,0xb8ebeb29a004c3e2L,0xd93cd70726009581L },
50529       { 0x3ff2ee49f1b9d3ccL,0x0e69e5ac753526ccL,0x8cb2243e8b13f47bL,
50530         0xe2c5ae8d7fbfc5aeL,0x8e9af723394a45d8L,0x0b1114dbd92ab8d0L } },
50531     /* 53 << 112 */
50532     { { 0x937d9d2a73f9ff5bL,0x07c8c147de0fd740L,0x3880ead73639b680L,
50533         0x879d6f836558cc89L,0xf32e14b975bc8c84L,0x278ea5e4bcf6f8cdL },
50534       { 0xd9f25ea94baca6cbL,0x676e4bdd44d0ceb2L,0x98042ac190868974L,
50535         0xdf227f370711b658L,0xcd6d29b46ef0e4f8L,0xd04f5bf88f817e92L } },
50536     /* 54 << 112 */
50537     { { 0xc7d62be78354f4ffL,0xd6fd9d590ac4d9b6L,0x13fbed772b50ab82L,
50538         0xc4c5be374362b766L,0x5d67bfdd6c59d059L,0x10c93cceac02f34cL },
50539       { 0x3bec1f3b72e35ca4L,0xb1cfade159f4820bL,0x679edbcf80fae051L,
50540         0x6762f5ba6671737cL,0x28b425db3fe77970L,0x4bd6d2ebe778aaaeL } },
50541     /* 55 << 112 */
50542     { { 0xdcbe0018aecd5ae8L,0x7f178b7aedb2a7b0L,0xedb5c805b427179cL,
50543         0x25fb6a084ba080fbL,0xeb6365165f1b263dL,0x814c520092acb04aL },
50544       { 0x936f97a988d94b88L,0x6d54f1768b45e4b7L,0x6321e3bdb0cc515cL,
50545         0x9118d0318eb5be13L,0x5be9188a8c574e96L,0xcdad43f3f281f19dL } },
50546     /* 56 << 112 */
50547     { { 0x7be5946ea85af34aL,0x420593c9da6fb0e0L,0x40b83c00987f9246L,
50548         0xac35f4e9a15d192bL,0x1979bd33776a678cL,0x0a7d973e8f6068d3L },
50549       { 0x71d322e87e6298feL,0xbb23a29936af9b65L,0x14e2b9706644c50cL,
50550         0x5f7f207373570bd3L,0x40215c569055538bL,0x91372e64365500c9L } },
50551     /* 57 << 112 */
50552     { { 0x2763961a303ef488L,0xc357c32fbf865ec3L,0x32ca1a943663e409L,
50553         0x9d9040217de506a9L,0x1f56e144249028bcL,0xd76402e61c5c7cecL },
50554       { 0x98dcac65b0dd9d4fL,0x887f6e97532facf6L,0xc0d5d2a123c2cfbeL,
50555         0x0566bd59d18d8b1aL,0x67404eb1297a071eL,0x10f24d9b26529285L } },
50556     /* 58 << 112 */
50557     { { 0x34808f5ca479ef4eL,0x60effdea9ff10abfL,0x471a077cdae34e0eL,
50558         0xf34df9562f9d1408L,0x4f8bbffbe46961b7L,0x6a80b0276336a6f4L },
50559       { 0x28e57309ca92e5dbL,0x27fbb139ce31cb10L,0xcea87ae28d24334bL,
50560         0x3781f438de6db765L,0x3328fc09edaf054bL,0xa8acdbcfa94396f8L } },
50561     /* 59 << 112 */
50562     { { 0xa05b72aa83a79820L,0x3210863ccdeeaedcL,0x192d5fdcb76fdabbL,
50563         0x25ec4568f10c17a7L,0xbd51e31fca556920L,0x8ab534f26a7e40f7L },
50564       { 0x2ecb28c041145d5bL,0x4e95843df9038557L,0x65605d17d783699cL,
50565         0xf728cb1178bddf7aL,0x2d823ae8bee2a60cL,0x02030edb8eb48325L } },
50566     /* 60 << 112 */
50567     { { 0xfe517758aa04facfL,0xa5216df44c421615L,0x4d87767d4f133b52L,
50568         0xdae81b7699757264L,0x53c1a0e3e3ad4323L,0x2c565bbd53b401bcL },
50569       { 0x94d2354fcd54a0e1L,0xf43d0f053f1a02a7L,0x52e7ee4af660b949L,
50570         0x563ec009bc208df4L,0x58c0b975bf21c4b1L,0x29a8e5adeb029e52L } },
50571     /* 61 << 112 */
50572     { { 0x4c07b3e4283bdd75L,0xcd94d2a385dd6177L,0xc1ab8a5cab097530L,
50573         0x90301468a5fd9ff7L,0x2a3e5b4064d0932dL,0x77e3b67e435e1c0fL },
50574       { 0x3b5d261c14f7bb4dL,0x1d67a760bab7bfc9L,0x507aad46d799621bL,
50575         0xf44567b5f4f3c3b9L,0xfaa97a3eae2bb6b2L,0x7d373b163594e2c9L } },
50576     /* 62 << 112 */
50577     { { 0x29ef2da9a15e6ea0L,0xf411e20dcd168689L,0x34944975049a4b24L,
50578         0x0effc2dfe035cd24L,0x5d77178b0a954cf7L,0x3504bc357ab2d8c0L },
50579       { 0xc3405000ec32219cL,0x00442630421a5a3cL,0x0548505c7f49819aL,
50580         0x6bdb281fc805d0e8L,0x03cb57ac97484e09L,0xcf0926da58a14cc1L } },
50581     /* 63 << 112 */
50582     { { 0x0715055cc85610a7L,0xd2642935fa6ca505L,0x87ef95128c361749L,
50583         0x89cd669a8c8156d2L,0x5cdcd266ed60d7ceL,0x99ccc96df59fb53fL },
50584       { 0x82400f4655df7f73L,0x2b6aa1d9af34f742L,0xa6cbca79c398aa8eL,
50585         0x7697bdea02b7325eL,0x1cb036b94fde4a79L,0xfe11ff96307fb964L } },
50586     /* 64 << 112 */
50587     { { 0x6a3a23279af0a75cL,0xf832a8159f1f250dL,0x17030c3322a82d3fL,
50588         0x24bf18ea14cbc835L,0x319dc4cab2da2727L,0x481df3606d020d4aL },
50589       { 0xaeebdd8a7fc22ba5L,0xbd0515c6a91e28abL,0xfc8a2978595f361dL,
50590         0xe60dd96c1ae8fa3cL,0x19c2109aa5341575L,0xfd6e92bb06a0ee48L } },
50591     /* 0 << 119 */
50592     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
50593       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
50594     /* 1 << 119 */
50595     { { 0x2e32f896cde5e785L,0xcd55ae7ab9db8f31L,0x278db1ad8f832885L,
50596         0x271d9078adcbd933L,0x2208fae34a64f863L,0x974046e039c89365L },
50597       { 0xcb46f272b3cd0cd3L,0x31f34e1a74e59edcL,0x3421d316edd50418L,
50598         0xb1d8a064cabe36edL,0xdb13e560362efcdaL,0x567c2b6cc71eb3eeL } },
50599     /* 2 << 119 */
50600     { { 0x2af8ed8170d4d7bcL,0xabc3e15fb632435cL,0x4c0e726f78219356L,
50601         0x8c1962a1b87254c4L,0x30796a71c9e7691aL,0xd453ef19a75a12eeL },
50602       { 0x535f42c213ae4964L,0x86831c3c0da9586aL,0xb7f1ef35e39a7a58L,
50603         0xa2789ae2d459b91aL,0xeadbca7f02fd429dL,0x94f215d465290f57L } },
50604     /* 3 << 119 */
50605     { { 0x94c3938b4c9324feL,0x0dea07003fe78a0eL,0x57ab9daa019e7dc6L,
50606         0xb0d7b14a9925b79fL,0x3c9a638b937a5daaL,0x3b14fd0de62943adL },
50607       { 0xbaafb635ed3ae4b5L,0x3060a090b2bcfaa2L,0x389d9e7f7aa8f217L,
50608         0xd7f987c6e9310a65L,0xec0927f993b69c0aL,0x9335e9102381a247L } },
50609     /* 4 << 119 */
50610     { { 0xc08550024b950889L,0xee99dbfe8ce24da0L,0xdda71d964318e860L,
50611         0x01d3d39604fe9b85L,0xda4bc065e25e7e20L,0xd3a50b87e076c81cL },
50612       { 0x5b9f821931e5f494L,0x6a140527a6a1b821L,0xf52683e4d8dd159bL,
50613         0xca9c888720b18043L,0x73c040fa08a0d8f5L,0x92e482e8179525c4L } },
50614     /* 5 << 119 */
50615     { { 0x8b9f650f3e776590L,0x41ba807f47703a5dL,0x8cc1a550fe907078L,
50616         0xd70cb76c8f00b84bL,0xcaee21566f3e6780L,0xfd6a51f595c2d03eL },
50617       { 0x2c897c5556ffa08fL,0x08589a6563d13d54L,0x6a1eed4287bbacf7L,
50618         0x66aed4f5ee709d78L,0x67c925bf1178ecabL,0x6870f4c8a29cf747L } },
50619     /* 6 << 119 */
50620     { { 0x37ed2be51cfb79acL,0x801946f3e7af84c3L,0xb061ad8ae77c2f00L,
50621         0xe87e1a9a44de16a8L,0xdf4f57c87ee490ffL,0x4e793b49005993edL },
50622       { 0xe1036387bccb593fL,0xf174941195e09b80L,0x59cb20d15ab42f91L,
50623         0xa738a18dac0ff033L,0xda501a2e2ac1e7f4L,0x1b67eda084d8a6e0L } },
50624     /* 7 << 119 */
50625     { { 0xe3a67b2d5e12e708L,0x3a4772e2ce48f234L,0x78f9dbc334794271L,
50626         0x9880053a3e6a61e7L,0x031c30b87c0f6e59L,0x8113df6cf7b972f8L },
50627       { 0x3625bdce18ee148cL,0x72c2b8efdb885158L,0x4c73c80c9a7f0df3L,
50628         0xbc2dd8a507b92470L,0x5a33e4dfdb005677L,0xc699cf5ea5ca9dd3L } },
50629     /* 8 << 119 */
50630     { { 0x3a828904a4d2313eL,0xbf4946b192e66888L,0xc574898ae5fa19d2L,
50631         0x0b13dbb65e1c5fa4L,0xf11343ba7c390fc2L,0x35b1418fd7d32187L },
50632       { 0xc92cb1bb83e7fe7bL,0x0b969455d78365c4L,0xda69dfe5672f2af7L,
50633         0x9c62d7b430932441L,0x165672ad94af02d6L,0xd2cc734dcde81c22L } },
50634     /* 9 << 119 */
50635     { { 0x6353420218d07dd6L,0xc7c0c8f128a3cb4eL,0xa41d4c55d7929131L,
50636         0xf1aaab3445d21f63L,0xd69a59545ec3e9feL,0x209732c1b8ddea2fL },
50637       { 0x368b9c59e1936916L,0xb011c662ab1f8585L,0xcce30a25474e57b4L,
50638         0xb79c76df7049c61dL,0x984739950ccf165bL,0x7c6f4ab40ce897baL } },
50639     /* 10 << 119 */
50640     { { 0x1d27efce1080e90bL,0xa28152463fd01dc6L,0x99a3fb83caa26d18L,
50641         0xd27e6133b82babbeL,0x61030dfdd783dd60L,0x295a291373c78cb8L },
50642       { 0x8707a2cf68be6a92L,0xc9c2fb98eeb3474aL,0x7c3fd412a2b176b8L,
50643         0xd5b52e2fc7202101L,0x24a63030f0a6d536L,0x05842de304648ec0L } },
50644     /* 11 << 119 */
50645     { { 0x907d88035a8432bdL,0x89232a5a2638fe30L,0xa120eecbe2089014L,
50646         0x3a5208cb5a2c9e97L,0xe163d29a3449eb4eL,0x3df984530eaba88fL },
50647       { 0x55d3b9afa1547443L,0x316aae18f2a60ceeL,0x64d0fd30d6e11a5aL,
50648         0x65de345808ef6002L,0xcede56fab4a3d1deL,0xa5bfa8d9a4bc1588L } },
50649     /* 12 << 119 */
50650     { { 0xd45e350133f4d416L,0xbb40233a4bf9131eL,0x1532a088e302483aL,
50651         0x3475e8b82c2485c0L,0x08f9ea56969cdbe6L,0x31928645253cd738L },
50652       { 0x1cf323a4ac9836beL,0xdf647ccf02b6e4deL,0x9a31e84fc06f3d09L,
50653         0xd326b86e39efe6d9L,0x77e3e1df14ac4decL,0xf2d5917af3e0c582L } },
50654     /* 13 << 119 */
50655     { { 0xf88238f1376216b2L,0x8c7522db7d15f653L,0x50aa7a74a21f74d8L,
50656         0xf7a964c8bc9e1a0cL,0x33ea64251387ca6bL,0xda84fe74e7be16a6L },
50657       { 0xdf0462d727867aaaL,0xeb7f0ab8ae6be1b3L,0x21abe5a5d9bdec8bL,
50658         0xdbb99199ac4bed1bL,0xf65c19d935d13c0dL,0xf966e22e4df74056L } },
50659     /* 14 << 119 */
50660     { { 0x67477cdc30577ac9L,0x51dd9775244f92a8L,0x31fd60b9917eec66L,
50661         0xacd95bd4d66c5c1dL,0x2e0551f3bf9508baL,0x121168e1688cb243L },
50662       { 0x8c0397404540d230L,0xc4ed3cf6009ecdf9L,0x191825e144db62afL,
50663         0x3ee8acabc4a030daL,0x8ab154a894081504L,0x1fe09e4b486c9cd0L } },
50664     /* 15 << 119 */
50665     { { 0x7b4e65ebae4219adL,0x2e424c441184a0d3L,0x10eeb898d32e179bL,
50666         0xadf05e2d8afa9a6dL,0xecd6c18bbeccd5f1L,0xe592115c39ac53e8L },
50667       { 0x9ccf231ac8c7b9b6L,0x1848b4fe678774bcL,0x2050856386782b91L,
50668         0xb7caf7cc74dc6018L,0xe80805485cf9273aL,0x9609897b246b4851L } },
50669     /* 16 << 119 */
50670     { { 0xe92b56c002cf37fdL,0xa75bbcb0f71b34deL,0x7754d0ef50f5c482L,
50671         0x850a9ef611fa89feL,0x97d74b1bba4ea7d8L,0xfc757c25aab7ba2eL },
50672       { 0x06f30ab0f2a67fddL,0xb10aba1412e72af8L,0x47580bca7a2e053dL,
50673         0x85795598dcf0e14cL,0xc3596781d6f55310L,0x8ab251b74c9b7e18L } },
50674     /* 17 << 119 */
50675     { { 0xdc56cff85279e5cfL,0xa33a6765fdbdf1adL,0xc122c0eee5077a4bL,
50676         0x44c3b190a98ab643L,0x334a6868b991d197L,0x598bbf185d6a0488L },
50677       { 0xd028bfdc5a0e6f96L,0xfd1a37f5e11c57b6L,0xe1240a3003f82183L,
50678         0x6afae98c390d8536L,0x554a42dcc244b181L,0xa3d422d75f4cb4b6L } },
50679     /* 18 << 119 */
50680     { { 0x512f82f9d113450bL,0x5878c9012dbc9197L,0xdb87412be13f355bL,
50681         0x0a0a4a9b935b8a5eL,0x818587bdf25a5351L,0xe807931031e3d9c7L },
50682       { 0x8b1d47c7611bc1b1L,0x51722b5872a823f2L,0x6f97ee8a53b36b3eL,
50683         0x6e085aac946dd453L,0x2ec5057de65e6533L,0xf82d9d714bb18801L } },
50684     /* 19 << 119 */
50685     { { 0xf113abe17d48bfe7L,0x51d77fa5213facecL,0x27bb373f21269089L,
50686         0x31e9850e7b188989L,0xd20a15f41d50a1c6L,0xb4887ed9d9746367L },
50687       { 0x8920a7e2325f19c5L,0x691352358ad74492L,0x713d1471d19a76a2L,
50688         0x952cb9e5873ab310L,0x5b359d1ffa8eb8cfL,0x55aab5ad8b9c9e7cL } },
50689     /* 20 << 119 */
50690     { { 0x4ab138504dbb8798L,0x0e7980d772d04cd2L,0x1755c5660b3271c6L,
50691         0x8414efb09d9d1468L,0x61a586301795ce66L,0xb6a8b393232924a1L },
50692       { 0xa992f0ceae031bd6L,0x6747fb5f2915acc1L,0x03daa26693e9c0d2L,
50693         0xc18fa3645400d554L,0xaf04ff8d9497e895L,0x86c3cfc250b6b339L } },
50694     /* 21 << 119 */
50695     { { 0xdf26f6605b26122cL,0xeb6c188c4d6b80ccL,0xae2efe59ccec172bL,
50696         0x5cdcd958f3f7d693L,0xa2ac2594c5f993f0L,0xb96ad8cf3f7cb591L },
50697       { 0x7e2f88f8446abbabL,0x3d1a5eb6f6051f2bL,0x7d882e82ad6f49daL,
50698         0xe32918e3c4e7bbffL,0x442a32789be81150L,0xa1d34da1bd14557eL } },
50699     /* 22 << 119 */
50700     { { 0xad81fa938ba5aa8eL,0x723e628e8f7aa69eL,0x0ba7c2deef35937cL,
50701         0x83a43ec56decfb40L,0xf520f849e60c4f2dL,0x8260e8ae457e3b5eL },
50702       { 0x7ce874f0bf1d9ed7L,0x5fde35537f1a5466L,0x5a63777c0c162dbbL,
50703         0x0fd04f8cdad87289L,0xca2d9e0e640761d5L,0x4615cff838501adbL } },
50704     /* 23 << 119 */
50705     { { 0x60c7e16cdf66a95cL,0x25b1078d5d0bd644L,0x77f8d872bd933e31L,
50706         0x5c4c382de2e1536cL,0x5b3b37c09295ee0dL,0xf94698d4ecce42b6L },
50707       { 0x947ef80c4db8f2c7L,0x34661f7dc70dd82fL,0x17b288a7f2311006L,
50708         0x1f1171a66815e1caL,0x0f71f66ce80d6235L,0x858c665a87fa5a59L } },
50709     /* 24 << 119 */
50710     { { 0x376b2a7f04e1e6e3L,0xea0dcb70a31774b4L,0xfc7fe4cc5cbdec2eL,
50711         0x8568499df03f459eL,0xe9fd8fb28b78900eL,0xd33c6e30e431bf97L },
50712       { 0xd904b8f5c896e766L,0xa8f577cf82748cefL,0x93dd921b87e044b3L,
50713         0x23d79837f76eebe9L,0x5e0a7493e569feebL,0xd0797549414dddb6L } },
50714     /* 25 << 119 */
50715     { { 0x9bf04f567781556aL,0x30be1e8953ebf7c6L,0x6f4899cf713fe432L,
50716         0x4f641fb7c9ef741fL,0x03560819002cc010L,0xfa51f8f7b4bbd339L },
50717       { 0xe09c5ef77f1dea5cL,0x39cb20d97255fec5L,0x407746862ea38859L,
50718         0x68ca598ecd7a29f3L,0xb8025dd67a9db4d9L,0x4feaeeaed9dfe491L } },
50719     /* 26 << 119 */
50720     { { 0x9422789b110b4a25L,0x5c26779f70ad8cc1L,0x4ee6a748ec4f1e14L,
50721         0xfb584a0d5c7ab5e0L,0xed1dcb0bfb21ee66L,0xdbed1f0011c6863cL },
50722       { 0xd2969269b1b1d187L,0xf7d0c3f2afe964e6L,0xe05ee93f12bb865eL,
50723         0x1afb7beeed79118eL,0x220af1380f0fe453L,0x1463aa1a52782ab9L } },
50724     /* 27 << 119 */
50725     { { 0x8cf42aa26b99ca6aL,0x696850242f091dbaL,0x9d887e6ad7d3270aL,
50726         0x627754fd5c9b735eL,0x3b8735a811d95df6L,0x74debd8b52443251L },
50727       { 0x1f8dd5b66181583eL,0xbd0ca92c8b570a9cL,0xc373a61a71ae3274L,
50728         0xf4b2c88d1c4c16cdL,0xd3e6ec3baf33efabL,0x8c54d2721bf6f0d0L } },
50729     /* 28 << 119 */
50730     { { 0xfd9e3542bfe5b1a7L,0xb42d2a4175938ceaL,0x74688a153befb760L,
50731         0x8daeeaa22e33dbe7L,0xc9c1ea083e677801L,0x68ecf4e434effe1eL },
50732       { 0x927700ccd294c321L,0x9e2e723de940afc5L,0xbcfac07a7cf6cd43L,
50733         0xa009ef94d1006bc3L,0xa02016b0373d13e3L,0x4e097adbabae5822L } },
50734     /* 29 << 119 */
50735     { { 0x7535175d48752720L,0xf51086ee850bdf07L,0xce322c33cb4c3f4dL,
50736         0xd863f7edb28965fbL,0xfe46a4e9885e4afaL,0x58b5c871136d7ddaL },
50737       { 0x126eddaf6ed07824L,0x084ce962844fcbb8L,0x9ac0787157dfb4c5L,
50738         0x97451fcc4d6b5910L,0x9f14b1ce0843c9c6L,0xf737f6c0a0e18596L } },
50739     /* 30 << 119 */
50740     { { 0x7c139d56d7dbe5f9L,0xfc16e6110b83685bL,0xfa723c029018463cL,
50741         0xc472458c840bf5d7L,0x4d8093590af07591L,0x418d88303308dfd9L },
50742       { 0x9b381e040c365ae3L,0x3780bf33f8190fd1L,0x45397418dd03e854L,
50743         0xa95d030f4e51e491L,0x87c8c686e3286ceaL,0x01c773bf900b5f83L } },
50744     /* 31 << 119 */
50745     { { 0x0028dcae855a0b90L,0x74c1e36026f0d718L,0x34f80e3ca059f144L,
50746         0x85b5d8e3f2bfe1b4L,0xe124601f453de099L,0x8b164ad6221b3efdL },
50747       { 0x636f45ebbe004ab0L,0xa23093e99f231a8aL,0x48e05e8e2287b992L,
50748         0xefec5e5b4477cb8bL,0x45a65afa8ba0231bL,0x92d38bd88b1af6baL } },
50749     /* 32 << 119 */
50750     { { 0x8db8b78cc898b8bcL,0x686896da502940cdL,0x67e50f022dde2e3cL,
50751         0x2e2461f38cbf406cL,0x32182781e1f7ff60L,0x26934b05e30e2688L },
50752       { 0x95adc204fc4494f6L,0x4c7f30c5161b7499L,0xd5caf060b7341737L,
50753         0xed93187fd128d46cL,0x3f2819cb20fc1e04L,0x48c4086f2b7f70a1L } },
50754     /* 33 << 119 */
50755     { { 0x45693c00a92ca9faL,0x046b218d63bd525dL,0x40f1d6cc6b1d6a68L,
50756         0xfc5807c5c54dc1f0L,0x2875d4d98b5690f6L,0x7a753543d0f72a83L },
50757       { 0x01f2c35ae28b5309L,0x38fb5f121bcef323L,0xd6ea6896256a9bffL,
50758         0x4380fb2c44d65badL,0xb587d641c3556fb6L,0x74c5ec1905167f32L } },
50759     /* 34 << 119 */
50760     { { 0xdabe347578673b02L,0x4f0f25cef6e7395eL,0x3117abb9d181ad45L,
50761         0x4b559f88aa13de0bL,0xfd8efe78ea7c9745L,0x080600475dd21682L },
50762       { 0xc0f5de4bd4c86ffcL,0x4bb14b1ef21ab6a2L,0xacb53a6cf50c1d12L,
50763         0x46aac4505cc9162eL,0x049c51e02de240b6L,0xbb2dc016e383c3b0L } },
50764     /* 35 << 119 */
50765     { { 0xa1e3cb2255b7f121L,0xc9183b13dd01db7dL,0xfe26aa801469dae6L,
50766         0x7318df7fd9ecfe2bL,0xade0a24d56dd4acfL,0x6e521c2222d1ba14L },
50767       { 0xa039800a40afa1deL,0x9c7da49d5c6af72aL,0xf7ae921cd3fcc7c6L,
50768         0x76af2407dcab63e2L,0xdc1618dbb6dd49ceL,0xebc65c4d362cc88bL } },
50769     /* 36 << 119 */
50770     { { 0xd847939132202bd3L,0x1dacde87d6631ac1L,0x99d2e71f905a94f4L,
50771         0xd3c21f5a7e67dd7fL,0x3605c28e3c43cf23L,0xb6cd5ac74d3b3070L },
50772       { 0x8bf748ba246298d7L,0x9e939fbd0f053664L,0x3bb3e7b8cc303783L,
50773         0x359bd3e56189c417L,0x299d0ce1f609ae34L,0xd7221cc7b9ca801dL } },
50774     /* 37 << 119 */
50775     { { 0xb7c823506b73c5a6L,0x7fea0d95fefee640L,0x6d5dd775f68b6be6L,
50776         0x4a5576147cbfa333L,0x6cad79c2fcd9b17dL,0x49aec3d405c4dd35L },
50777       { 0x3b1f3754c3792470L,0x351ef2ccbe00cffcL,0x44a248916a71f45eL,
50778         0x1e7a6013b8640d08L,0xf0f476154efcd556L,0xc82171444fe15dd3L } },
50779     /* 38 << 119 */
50780     { { 0xa3c56ad28e438c92L,0x7c43f98fb2ceaf1aL,0x397c44f7e2150778L,
50781         0x48d17ab771a24131L,0xcc5138631e2acda9L,0x2c76a55ef0c9bac9L },
50782       { 0x4d74cdce7ea4bb7bL,0x834bd5bfb1b3c2baL,0x46e2911eccc310a4L,
50783         0xd3de84aa0fc1bf13L,0x27f2892f80a03ad3L,0x85b476203bd2f08bL } },
50784     /* 39 << 119 */
50785     { { 0x85f9b301218642acL,0xb3f3b36f8728ef66L,0x4a833bea2ebb8181L,
50786         0x7d3bca9d8541a662L,0xd3be6d0ac5a0ecffL,0xaf52a2a9528da950L },
50787       { 0x4b431910131f72caL,0xe2708d36933d5550L,0x195340a469abf146L,
50788         0x84ca66e4e4e2e131L,0xd9402ca7e16c39bfL,0x5beedce343ca6041L } },
50789     /* 40 << 119 */
50790     { { 0x87c5915395523a22L,0x56686f525ac5146eL,0x9ec69ec718ccf766L,
50791         0x13f36d4ff6e21a4aL,0xa0841e94098691f4L,0xbd9d52d2bd91dd2eL },
50792       { 0xa8765981b3fa43eaL,0xb0cd17cd600b9761L,0x02dd9d71b5abe842L,
50793         0x63df33a63689a53bL,0xab4b85bb9d9baad7L,0xce2d31c1eb74e549L } },
50794     /* 41 << 119 */
50795     { { 0x8d69a654f2472426L,0x91a4b6a3ff7aeff0L,0x51dd8e76fdcc7cb4L,
50796         0x5f7d42a273731cd7L,0xc127401aa99c9d9aL,0x8ede9330c92561d7L },
50797       { 0x86057a56784c3cf2L,0x8afcf32cb5a7755eL,0xa0a5b561c71cd3d9L,
50798         0x0a5d805e36d3f5a4L,0x25a39acd7432a384L,0xd574a6b7b226e9ecL } },
50799     /* 42 << 119 */
50800     { { 0xab1cb818567af533L,0x273b4537bac2705aL,0x133066c422c84ab6L,
50801         0xc3590de64830bfc1L,0xea2978695e4742d0L,0xf6d8c6944f3164c0L },
50802       { 0x09e85f3dc1249588L,0x6c2bb05d4ec64df7L,0xd267115e8b78000fL,
50803         0x07c5d7aec7e4a316L,0xcb1187ba4619e5bdL,0x57b1d4efa43f7eeeL } },
50804     /* 43 << 119 */
50805     { { 0x886e3f30b29f5916L,0xa419d2c6625f29a0L,0xb4f89fc49bf07dc4L,
50806         0x86c137a1a165ed88L,0x6fa241a9e5d6280dL,0x08be9b0cd11576f2L },
50807       { 0x5735aeb7e376b03dL,0xf4639e6d182ce9b9L,0xb6948499cc688f57L,
50808         0xfde146636552009eL,0x3eeeae350a2e8553L,0x50447f1b659dfe2eL } },
50809     /* 44 << 119 */
50810     { { 0xefccd67ed15c33c0L,0x33393846146d5e96L,0x015e97da9ca7354eL,
50811         0x729b69bac143e795L,0xd4440ecfd4c5d0e2L,0x78c042bb697a80e7L },
50812       { 0x9361ad1d08602f75L,0xaa354166af489794L,0xe60e5a274966d3cdL,
50813         0x8346995e2394f9f3L,0x2de33256590f6a15L,0xb14427bb43298ac1L } },
50814     /* 45 << 119 */
50815     { { 0x38fee83a74680d2cL,0xd8019e5c0e700c8dL,0xcfaf5614475da1b8L,
50816         0x11893fc58f0159e3L,0x4c101127553813c2L,0xd273055208f82a6aL },
50817       { 0x8728834c74a3ce9aL,0x66b939a891906488L,0x42ac7c07b88d36bcL,
50818         0x663d7411d989bb72L,0x650e5d6eb284c066L,0x052b7f6710d8f124L } },
50819     /* 46 << 119 */
50820     { { 0x3618891fc8176a96L,0x62c4b084e5808b97L,0xde5585464dd95d6eL,
50821         0x27a8133e730b2ea4L,0xe07ceec36af318a0L,0x0acc1286ce24fd2cL },
50822       { 0x8a48fe4add4d307cL,0x71a9ba9c18cde0daL,0x655e2b66d5d79747L,
50823         0x409fe856a79aedc7L,0xc5a9f244d287e5cfL,0xcce103844e82ec39L } },
50824     /* 47 << 119 */
50825     { { 0x2a8cb0a56ad833c5L,0xe8fab8b844962dd6L,0x31166fd63ee1dfefL,
50826         0x3aba85a1e1230449L,0xf9f8da66bd1f502eL,0xe4a72d82e3c17ccaL },
50827       { 0xfa3d661d6070d587L,0x51d10b73c33ed08aL,0x3b0f515cb29f2d0bL,
50828         0xd82a11d7e1986e91L,0xcf24f81a2201f05bL,0xa94ec1e0d25f8417L } },
50829     /* 48 << 119 */
50830     { { 0xc7807daa081ed51dL,0xb7dfabf0e5d2d963L,0x3f78ae2e80d386d0L,
50831         0xd66275254bbfd04bL,0x238c8eb76d074f92L,0xfe51ec8a5bc5f9b5L },
50832       { 0x6ba47430cc03177bL,0xe72efda6400b29e0L,0xb905701becbffe88L,
50833         0x5c61bdb47cf89933L,0xf1eb3084c914aa6aL,0xa3ead71e8245998bL } },
50834     /* 49 << 119 */
50835     { { 0xc58ee3013c7eb5a9L,0x02c177220a1172baL,0x8620118394c7c5b3L,
50836         0x66292bc4e1668debL,0xf51b48f4caf39937L,0x9cca60f43eaea578L },
50837       { 0xf8e8004a5c2adccaL,0xce7ceeb1ebf49ac7L,0x36346357371d1c54L,
50838         0x8799e408d99ff07dL,0x3226181d8c3b2cbfL,0x3b4ff42ba437c2c6L } },
50839     /* 50 << 119 */
50840     { { 0x00675ba7f25d364cL,0x7a7f162968d36bdfL,0x35ec468aa9e23f29L,
50841         0xf797ac502d926e6cL,0x639ba4534b4f4376L,0xd71b430f51ff9519L },
50842       { 0xb8c439ec2cf5635cL,0x0ce4c8d181980393L,0x4c5362a964123b15L,
50843         0x6e0421e0ffdcf096L,0x624a855f10d1f914L,0x7d8f3ab7614dcd29L } },
50844     /* 51 << 119 */
50845     { { 0x235ba8b565868390L,0x853c9346ea936e81L,0x967ff132700bb25aL,
50846         0xb26d9778561a136cL,0x8b775c4fe3f7e41dL,0xae8f6b2ebd390b2cL },
50847       { 0x80959adc4fc7224dL,0xd9c913c12eaccf8cL,0xa9a278c79e96f769L,
50848         0xbc6be3038f26856dL,0xb039caf295d04cdeL,0x42ba0510a91bf5dcL } },
50849     /* 52 << 119 */
50850     { { 0x77870665cfbe0653L,0xab84c4b3523d814dL,0x72839d8897cd2bc0L,
50851         0xb966e521d25b1476L,0x4255d18451fd86a0L,0xadaf9b76dd54be7aL },
50852       { 0xada6ff627f285e0bL,0xb76e26f46d42400bL,0x1d9fe676958bee25L,
50853         0xfcd7be9edb59965cL,0x897a90834bcf6e75L,0x64b26f02aabd21e8L } },
50854     /* 53 << 119 */
50855     { { 0xee46626beb1a8ce6L,0x2de20371b672fc49L,0xa0fb11b8bd2d9256L,
50856         0x5b49f70ac2a8dcd4L,0x98935fc9e5dc0ee3L,0xaddbae423bc00993L },
50857       { 0xbd0bd9e19207f0e9L,0xe86c5365b393bcdcL,0x32184c832d0a9282L,
50858         0x8fe996d1df34532eL,0x3b33f151c6f45172L,0xd9def9a7b84545e4L } },
50859     /* 54 << 119 */
50860     { { 0xd9219adab3493ce0L,0x971b243a52f09ae5L,0xc16c9bf8e24e3674L,
50861         0x026d408dce68c7cdL,0xf9b33dd9358209e3L,0x02d0595df3b2a206L },
50862       { 0xbf99427160d15640L,0x6da7a04e15b5466aL,0x03aa4ed81cadb50dL,
50863         0x1548f029129a4253L,0x41741f7eb842865aL,0x859fe0a4a3f88c98L } },
50864     /* 55 << 119 */
50865     { { 0x66bb66f5f56b17ccL,0xdce0bf2cba8958f8L,0xd814318f9ff85781L,
50866         0x41dce823edd1ad96L,0x71bb754bb59c6580L,0x9c5efb70de594c3bL },
50867       { 0xf7b4ce5eb0053788L,0x9c26b0342770b6deL,0xe6967b1c8d131e8fL,
50868         0xfda0efdccf21bf28L,0x2366d47e09cbeeacL,0x62e9ee556629680eL } },
50869     /* 56 << 119 */
50870     { { 0xdaff980ff8e06359L,0xb4e0c9e2ead8a883L,0xe3e262023da6e94fL,
50871         0x37410ed03303c9d6L,0xc044d77b91fb5d82L,0x3559d9ac9ea34d26L },
50872       { 0xf51a120be21beda5L,0xdd2eef8a3f7befa4L,0x46a26ccd8c79fca1L,
50873         0x3fb21a682a046572L,0x3624a47adad7c7c9L,0xb9b77ffd4b4174f5L } },
50874     /* 57 << 119 */
50875     { { 0xae19a097c9f8c462L,0x477be49917a9d8a9L,0x4a0c41c9d2154c45L,
50876         0x39313aba1b0d985bL,0x3a70f65cc051b643L,0x0725dabf2d0be160L },
50877       { 0x29eefc94a69867d4L,0x6acc4cd49d02bce2L,0x0606ab725d4dca50L,
50878         0xcce81133bfecdcbaL,0x604df3def23b2239L,0xa644b430d20a7529L } },
50879     /* 58 << 119 */
50880     { { 0x80de085a05fd7553L,0x4a4ab91eb897566bL,0x33bcd4752f1c173fL,
50881         0x4e238896c100c013L,0x1c88500dd614b34bL,0x0401c5f6c3ba9e23L },
50882       { 0x8e8003c4d0af0de5L,0x19b1dfb59d0dcbb9L,0x4a3640a9ebef7ab6L,
50883         0xedafd65b959b15f6L,0x8092ef7f7fb95821L,0xab8dd52ece2e45d1L } },
50884     /* 59 << 119 */
50885     { { 0x43f9a415259ac609L,0xcd6c7aaa0ff5722cL,0xb4689e75b29973caL,
50886         0x78a43571b690c0acL,0x90dc4ac0a6d3ba1fL,0x38af00a2b773932aL },
50887       { 0xc13aebdda5e2c9edL,0xfab3a128cf3fed2dL,0xb3b7d29d32eb8ccfL,
50888         0x9ae1430b6986db5cL,0x35d18edf5365c21eL,0x88f8356e038471ccL } },
50889     /* 60 << 119 */
50890     { { 0x45587a7c0794dad2L,0x660833899e9c1cdcL,0x60e7ae4ad242a6b9L,
50891         0xb5f96b521009df3cL,0xc2d405092e30445aL,0xfa53ba4ec250a29eL },
50892       { 0xf6a247855d98c6ceL,0xf873653c207dd110L,0x2aebc3c6c634cbd0L,
50893         0x84b8016ce5cdbafeL,0xbda81fcace00b206L,0x837dc69484b55f2cL } },
50894     /* 61 << 119 */
50895     { { 0x61bdc5cab308f1f0L,0x7763c97d8898d3c2L,0xc02324e60434de23L,
50896         0x7f5c565e4ba696e9L,0x06f27a3e66914b66L,0x64a975ee05052cf5L },
50897       { 0x98b2f703bb38b14eL,0xbacbd113371e495cL,0xe54451acdd14cc9dL,
50898         0x8575cfdf87d141b3L,0xbd183a03d0996091L,0x947555579360264cL } },
50899     /* 62 << 119 */
50900     { { 0xd1f2d6b8b9cfe6bfL,0x6358810b00073f6fL,0x5fce5993d712106eL,
50901         0x5ee6b2711c024c91L,0xd0248ff5453db663L,0xd6d81cb2adb835e8L },
50902       { 0x8696cfecfdfcb4c7L,0x696b7fcb53bc9045L,0xab4d3807dda56981L,
50903         0x2f9980521e4b943bL,0x8aa76adb166b7f18L,0x6393430152a2d7edL } },
50904     /* 63 << 119 */
50905     { { 0xc89db4eb4595ca55L,0x48921c735f1a73a2L,0xfc513c904afe7cbaL,
50906         0x6d3f988bff8322eeL,0x17d0d4f0e59b7cdcL,0x292f4757f4bb5588L },
50907       { 0x3037e11151c14623L,0x3e113343dce98277L,0x0be229341e20dc8fL,
50908         0x0ebd1fbfcd6ff82aL,0x304bd69ed01fa90fL,0x402a457577f1862fL } },
50909     /* 64 << 119 */
50910     { { 0xd74d09c10ece13aeL,0x5e59d9e057a6bd95L,0xdb1ccfdce132b940L,
50911         0xa0e5309c843d3c66L,0x1fbd03a5f9cb3ef4L,0xcdc9ef0a00ea5177L },
50912       { 0x1ebf5a15cb784a6bL,0xa67382af8a0d109aL,0x3256c37aa0d34d15L,
50913         0xee40efa50fca43afL,0xc299bbd4b9841bdeL,0x6df68f603bef4a0bL } },
50914     /* 0 << 126 */
50915     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
50916       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
50917     /* 1 << 126 */
50918     { { 0xe01295fdd9d7c50aL,0xaf31b4ea67f8ef0dL,0x2ec9689f9eaf8eb7L,
50919         0x327b96c5c622acc5L,0xae918f81b2757f2aL,0x74927d684fd6606eL },
50920       { 0x09bb7fce18574215L,0xfea383bce8e68b72L,0xdf2a6f125fb47511L,
50921         0xbe88faa18e399520L,0x0166d57e3fb1c3a2L,0x5907ef2fe525f81fL } },
50922     /* 2 << 126 */
50923     { { 0xdefe3a7b8a37f660L,0x7898db8c858f5765L,0x7366c26a73d1f9b4L,
50924         0x35d5d718237ae8b7L,0x3efb20feb4478259L,0xccd0fed7aa545ee3L },
50925       { 0x750edd05ed22d152L,0x4f8020f9ee20d4c6L,0x16e60f370a9e29dcL,
50926         0x9cf0a136bfbec7f6L,0xb430a34b2e47e143L,0x2e2560bbc6cdd1a9L } },
50927     /* 3 << 126 */
50928     { { 0x799352dae4161a65L,0xe5cf7ad856253ce6L,0xf606bf796de32775L,
50929         0xddc0f3a357fce8dbL,0x1075fc2316cf4a47L,0x078f0e04b27c5ad8L },
50930       { 0x9fc477953f7100aaL,0x3ac489254673ffa2L,0xb8263f42f9cd8348L,
50931         0x5bdfde3068cc92d5L,0x2250927b1ac37f9cL,0x26ec8328b33da359L } },
50932     /* 4 << 126 */
50933     { { 0xf186d6bcc88d568aL,0x872bc4c7528535ddL,0xc9e7432edfe64dc3L,
50934         0xd9fc4832d795ea57L,0xf4ffdb81c845af2bL,0x66d7e7882b670517L },
50935       { 0xa7c1be04d7b7a1c6L,0xbed88479d5b2a249L,0x62ff8aba03f2ef6dL,
50936         0x60ecaac420dc701dL,0x9f4b559f4ff10119L,0x0582c9313cd54fd0L } },
50937     /* 5 << 126 */
50938     { { 0xea9da8f012bbaeb6L,0x3fba06b18c9f8360L,0xc11bd7abb28c0ac3L,
50939         0x1e05af2faa8a01bdL,0xae1e99c5f000b1c3L,0x93ee806453d79930L },
50940       { 0x5728089e4c4f5513L,0x755351f3b1f70b76L,0x187ac651675f77efL,
50941         0x5cf7bfb553067d84L,0x629290838174b5c0L,0x720e20798d5be74dL } },
50942     /* 6 << 126 */
50943     { { 0xab8cc09ff5eb9ad1L,0x97a4de76132edbfeL,0xa2e11c548baf6347L,
50944         0xcee54229683cfcf6L,0xe1e993b8dcfc6555L,0x333bf16abe9df066L },
50945       { 0x5207e093060d62dfL,0xfa32324d69b0f5faL,0xef16fbcfd3243d2dL,
50946         0x540a2e59f04f8e45L,0xb5e70f9c48317bbaL,0x00dbe9b25b35baa1L } },
50947     /* 7 << 126 */
50948     { { 0x0eaed675ebb512eeL,0x347e0756058efbd5L,0xadf792ca296d3d47L,
50949         0x57f00c0a4654d012L,0xa1e08a04bccc5803L,0x610677f05b2f11d1L },
50950       { 0x0d9393d7b81acfd2L,0xb258e1570587c219L,0x372a1857b4ceba47L,
50951         0xe1ce8bb53ecc1c5dL,0x7efdf301922cecd0L,0xcab8cb170d8aa653L } },
50952     /* 8 << 126 */
50953     { { 0x31954a5679d05497L,0xc12520b6fe76d4d8L,0x8c433ec5e37ef1d2L,
50954         0xcd0f203575bc3b66L,0x3723f145249cd98bL,0x1356e0d2ea3b42a3L },
50955       { 0xf607fee0f174c7b5L,0x318afc5e0127be39L,0xd47b5d74cea5417fL,
50956         0x6891940a10fca22bL,0x5cea41332b635e8bL,0x93db2ed6b5934fefL } },
50957     /* 9 << 126 */
50958     { { 0xf87cfaaac8972b7dL,0x2b8f9874e090800fL,0xdb88cd4f52efde36L,
50959         0x7b977f6e80776de8L,0xd047fc8ffb4b19c4L,0x33f3e43578b8135fL },
50960       { 0xb4cdb352da33eff8L,0x217f9e2deb89d325L,0x1bb5a004c99feec5L,
50961         0x98ce5a7fdb45c845L,0x458904681d87e964L,0xb9253873d151ad80L } },
50962     /* 10 << 126 */
50963     { { 0x5d7c767de39edca9L,0xe4a700e7a7f8de0cL,0x5816e1f93c9eec33L,
50964         0xa975c933d32fe465L,0x979beff968466a5eL,0xe308c135cc067721L },
50965       { 0xe0e733b41839b88dL,0xda3e3e6c298dc2ebL,0x414c3f0e8fb70e3eL,
50966         0x5ebaefa7ed7ca91cL,0x5c283310ae3b0f3eL,0x20353d5df3b1d44eL } },
50967     /* 11 << 126 */
50968     { { 0xd50767a9790325feL,0xe2ceddb9358c50eeL,0x60be64bdbbf03ae5L,
50969         0xe70c7e90f053328fL,0x6ba6af9e51543f0aL,0x470941f3b413e069L },
50970       { 0x0b569fd4ddf63d13L,0xf94b22634a2125d6L,0xaa45ab62a5c1acedL,
50971         0x2b797175defa5a30L,0x3eb30067ead1d440L,0xcadb54e90b691af2L } },
50972     /* 12 << 126 */
50973     { { 0x365a4a431630b133L,0x9ecef631068d7863L,0xa330c8b4b7205a6fL,
50974         0x4858eab357df815cL,0x6e522afaf1a92674L,0xa7cff3d9f41365d7L },
50975       { 0x00dd34615a0e4626L,0xa695feff48f9d094L,0xf427103f7c082301L,
50976         0x14a2a1876b092b71L,0x210f632130037a33L,0x21cca09639340e14L } },
50977     /* 13 << 126 */
50978     { { 0x58355ba0f60ad6c1L,0xc63fbcff56022afaL,0xa6a770d54e7ef19fL,
50979         0xf42b2024a09e9378L,0x153aa3200330f774L,0x268aaee55dc02c97L },
50980       { 0xa7e13b42828f7ab7L,0xc0ccce09c303bfcaL,0x23169daae3ccb6ddL,
50981         0xf7f763fd786774e9L,0xb15a5ef150021488L,0x52f408fd5f3ea885L } },
50982     /* 14 << 126 */
50983     { { 0x53e84021177346c2L,0x4ee451dde20af475L,0xd7642453c14f393eL,
50984         0x7eaa215331662516L,0x1217a1b4c1d486c9L,0x7d32427569860f20L },
50985       { 0x3813c95f14c2837eL,0xb8f0713d4e0c056aL,0x398c218cf6dec37bL,
50986         0x5bfa2eefa4ad1eedL,0x53cb0fd29f97a05dL,0x59fa132f6a9f492bL } },
50987     /* 15 << 126 */
50988     { { 0x6d5dff381fc2c16aL,0x5dec7ae2b1fe149eL,0xa9eed62c85088ceaL,
50989         0x5878fdf7996174baL,0x2cf65bb935517a73L,0x80844bcacff96d13L },
50990       { 0x0f55c8bfed53f49dL,0x35815fb0fbd8cec6L,0x23e7d5c53b6fa7d9L,
50991         0x3ee04c0146ce1733L,0x180e25553f5c4a27L,0x61263ea7280e6363L } },
50992     /* 16 << 126 */
50993     { { 0xb1f4fead41b959b5L,0x6edb53a9e71890c0L,0x48b47efe2e28aa2aL,
50994         0x70dad2e9b3151d67L,0x87a8178b436a3460L,0x0f86f9f5801f7af7L },
50995       { 0xfab462e3a982fc14L,0xe29126bacb03e978L,0xb4696b3fe6681282L,
50996         0x3bd9910a6a3fdc1dL,0x4409128449e37dacL,0x3b4bfabccf605fb3L } },
50997     /* 17 << 126 */
50998     { { 0x605fae7ece9d1372L,0xb2623a79f9b7e06eL,0xfab9b2742d37357eL,
50999         0xffdf9246461417f3L,0xc04b15d7bdd0e922L,0x767bcee54b2dbc0eL },
51000       { 0x74c4ea4ed45efc88L,0x32d3d85491a534a8L,0x88967078554b2691L,
51001         0xe8256015e336a410L,0x166469624b9f978bL,0xb433f06ca104f01fL } },
51002     /* 18 << 126 */
51003     { { 0x8906d815457e1e82L,0x96abb1aa4c8a2c68L,0x2e63f37927ab2fb1L,
51004         0xe092e15f5446dfaaL,0xa3a3f0926615c65cL,0x8b31116747c3f259L },
51005       { 0xfe2038782e5c658cL,0x38903cf526215773L,0x0039fca7237f1bd4L,
51006         0x75dbcc016058ff17L,0x67ee6226a65aeb9eL,0x96999fa75cedcba5L } },
51007     /* 19 << 126 */
51008     { { 0x04c6fd475ac4d191L,0x0067e474c825a897L,0x4a37c931404810c5L,
51009         0x072d30e5c4a56380L,0xbaf3428dc897ba23L,0x9899935b53724382L },
51010       { 0xda5cc13ff4d41a62L,0x063047a0c6271baaL,0x49790bdc5cf48302L,
51011         0xd8c34e5384c5a9abL,0x6cf28e83db5bc36aL,0x430dbb1497da9d42L } },
51012     /* 20 << 126 */
51013     { { 0x59470e49c37acc2eL,0xc9e0f73611b85596L,0x47613c1e0fb30eccL,
51014         0x1fbeffa3b62892f1L,0xddfeef49f8eefa16L,0x6f82acd9daeff719L },
51015       { 0xff1872cdacb41007L,0x06fe556c82d64c6dL,0x52a63a387695218aL,
51016         0xa0d413a720802b88L,0x233f1f3118f4a473L,0x22ef7d6fc9d7da4aL } },
51017     /* 21 << 126 */
51018     { { 0xeba1db6910dad9abL,0xddb62dacde3a5a42L,0x209c472cfdf5ad86L,
51019         0x14a7ee4b37214540L,0xcaf70ce08339c9dfL,0xa95744554eb9189bL },
51020       { 0x90d7f241e9b39189L,0xf5edfd09af7f3eddL,0xc9a3444deb7ed52aL,
51021         0x30d9e2f80085d9d1L,0xeb412daa4dc24fefL,0x55c0000b27786649L } },
51022     /* 22 << 126 */
51023     { { 0xa9f34fa9518118e5L,0x430db0a51a22e790L,0x64b443a5d5a16ca1L,
51024         0xaa3b64f4d8adbe45L,0xb49435fae0f0873aL,0xb8d67ce4a635d1e3L },
51025       { 0xad843f8a8a612b29L,0xa416ec7fd84a210aL,0x8b4dc6930984b23fL,
51026         0x29a1b71b24640dcfL,0x8f2d7507911892adL,0x0ce384105bd4d518L } },
51027     /* 23 << 126 */
51028     { { 0x1e1bef926c42e1bcL,0x91259dd60e04d449L,0xc029961e8875d346L,
51029         0xfde51012a9e38f43L,0xdeaa1dc18892643aL,0x67e3b913217e08d8L },
51030       { 0x889a28c269b92b7eL,0x004c0f87b7446c21L,0xea812f67a2f98e77L,
51031         0x42fc7bbe22c40b8cL,0x5e7f5f5a8722e381L,0xf8f209d932099e41L } },
51032     /* 24 << 126 */
51033     { { 0x867379134a2965f5L,0x34724dcde67b3546L,0x2efe185ee92c712dL,
51034         0x8b908f86c201e327L,0x3ab5528894f6b078L,0xb9b2b784ce0a5bf3L },
51035       { 0x5eab37ac879f6a41L,0x74271f672f2360f3L,0xf3a3edff304f1cf9L,
51036         0x8992ecd8f6fd3e90L,0xff24d7c69f16e5edL,0x0844ab25def9a5c4L } },
51037     /* 25 << 126 */
51038     { { 0x35cbf2191e14f235L,0x9ef33f3c4cdc1b46L,0xfd5cedd0299f7f13L,
51039         0xf57b9bbf99379e17L,0xae25d3e3cd3d59a8L,0x72f9fc84f58cb31eL },
51040       { 0x87950fd84c94b63bL,0x15b52b4f7a4560a8L,0x382d36ec943e44baL,
51041         0x567ce2e9337b0f11L,0x8136e9ce2fa44901L,0x7e43a7289b15eeaeL } },
51042     /* 26 << 126 */
51043     { { 0xd1c8ed8814fb95f4L,0xc302e0aa29602659L,0x67abcce005cd67baL,
51044         0x7a234cc022f8ae25L,0x7074face39f44e4fL,0x84a08afc7a9d3fb2L },
51045       { 0xfd149c88f56c1f32L,0x5b12cc15219e494aL,0x242fc50c9ea3c0e3L,
51046         0x196cdba555b23034L,0xfd8cfa5e87b75206L,0x915e706488d55f47L } },
51047     /* 27 << 126 */
51048     { { 0xb59480ba876145beL,0xd8f8fbbe8e1075ddL,0x0ba10292b5d9baf0L,
51049         0x3a4b7f65e39a8754L,0x1b3a044c0f3c6520L,0x6b8b3397b1dff4f8L },
51050       { 0x40cef2285c182eb3L,0xbef82aec1b1cb92fL,0x5c4d2bfc2a97c5dfL,
51051         0x41d2a046536ad077L,0x94ef34a8c497505dL,0x14e9aef48e0b35ffL } },
51052     /* 28 << 126 */
51053     { { 0x2edaaaaaacaf1f3fL,0x9e3af72c80ebcc10L,0x3542fc42bcb1618fL,
51054         0x6c04ec246709d851L,0x5fe9768ea9af4ce0L,0xe739d50eeb6ebe2eL },
51055       { 0x7b7da4ac876586e0L,0xb0869f1d64f5f956L,0x7f691c51fd563c80L,
51056         0xea990d6926c775e1L,0x2cd96f1321b58889L,0xbc8074720f1aac2cL } },
51057     /* 29 << 126 */
51058     { { 0x8e1fa5f8eb3283cdL,0x0107a3ba20e69342L,0xf99a511cb045b8dfL,
51059         0x172d0c8933b51876L,0xb11efc2b9636d0f9L,0x16b2197c41570483L },
51060       { 0x49df27edacfdfd1aL,0xd9d2cedc366b9b28L,0x0289a75cab028c0fL,
51061         0x522f567a4879464fL,0x3313728225f64030L,0xfa28cb1558d6753fL } },
51062     /* 30 << 126 */
51063     { { 0xe5252210c6cd33f0L,0x6ba7f51f3f085202L,0xd2a87fb38f52e312L,
51064         0xa5e082cff25f35efL,0x786a93c2b9df2f20L,0x68c7e1299a19bf27L },
51065       { 0x13a971ab8d710915L,0x3ca4f8c6939443c6L,0x8554699c70522446L,
51066         0xdf42b7768e14e6bcL,0xc7969fa5f7f3dadeL,0x135b6b77350ded88L } },
51067     /* 31 << 126 */
51068     { { 0x39e54aa472546076L,0xc0003f7f13e312beL,0x71106a4ffea91274L,
51069         0x3868f957819851cfL,0x713b96e75c85bbc6L,0xfda8c2df610403a8L },
51070       { 0x0ea806c3a008cf78L,0x0ef9708353c0d1bdL,0x536950211e592838L,
51071         0xea3773d5e9023982L,0x6eee3c0d4195754cL,0x95df7b568c4bead3L } },
51072     /* 32 << 126 */
51073     { { 0x57edf71edf9a9f18L,0xbf834240627a0b79L,0xb37aba1aa6934160L,
51074         0xd45b3d2c5e639a54L,0x62c6b9ad70bce957L,0x16bc35a75d7e87f3L },
51075       { 0xb021698266b4a982L,0xb56050dd0e51c9bcL,0x15aa692b478e4b91L,
51076         0xdd67cf29be3fe25aL,0xf1ef75b006bdd4a8L,0xf71a285b41df627aL } },
51077     /* 33 << 126 */
51078     { { 0xba6be58993032120L,0xea6dd691db99740eL,0xad8679463154648dL,
51079         0xd1a36f4c28c0668cL,0x09a28c234dd76e88L,0x93fef0c7dc665bb7L },
51080       { 0xa78dfeb4860a0016L,0x06d2f868e21a9e02L,0x333a25a38486ade7L,
51081         0x12aa13130e398a80L,0x04a44a5848d5b3e3L,0xe59293d47a7ec12eL } },
51082     /* 34 << 126 */
51083     { { 0x6cdfb5faea2c1632L,0x6799cfcd7865f931L,0x4e1e5d25bf420a7cL,
51084         0x7d4597db05d22ddaL,0x7548db12fceda1e1L,0xb4523ccdcb473578L },
51085       { 0x3d8dbad0ff889f03L,0xc591bb1118a9a222L,0xfac2b914a2cfcc57L,
51086         0xbb67601abec9d9bfL,0x18dff42ceb55218dL,0xb36ef9ba7d2b6320L } },
51087     /* 35 << 126 */
51088     { { 0x5b007ad1f3edf67dL,0xfaee9cada25fcfafL,0x18fc784a4d62e5c2L,
51089         0x98deda878acb5f8eL,0xe9cfd10a6f888d8fL,0xbb0d729b053db2efL },
51090       { 0x7b09fa4f2aecece4L,0x3f72187cd4c44cc3L,0xf646aba05b8175a5L,
51091         0xf213caeba5686ca7L,0xf5ce777badc5d40dL,0x15ff85d660eb9357L } },
51092     /* 36 << 126 */
51093     { { 0xcdd18aee24e6df19L,0xa08ab968bbb3303eL,0xd5eb039cbab4f1a3L,
51094         0x040d03a8fa7a48d1L,0x767c0ed23d66628bL,0x0c6bd388b1a6809aL },
51095       { 0x793aff3f029eeb91L,0x6db32d13bca798a8L,0x6aef5c1cc3816cf7L,
51096         0xcfb25ea45fd2cd2aL,0x0715a7899f8e3312L,0x4a9ad4782a6b1a6bL } },
51097     /* 37 << 126 */
51098     { { 0xa9f360a5d134c919L,0x10dba223dcfd0715L,0x7444b191dc9b4394L,
51099         0x9a16a971e2f288e0L,0x0d05c511f6a49999L,0xca34eae26b65e956L },
51100       { 0x692febc418a83b76L,0xf3468c7b0b5f3511L,0xd8d3ce48b8e1ed80L,
51101         0xbe8c5c302a6de231L,0x9c0468b74e680d8bL,0x773ebb63f57b88d3L } },
51102     /* 38 << 126 */
51103     { { 0x9c2c33a5b726729dL,0xa86ab4ea5db2af56L,0xe987c5e3b0a36ffeL,
51104         0xa6dba84da5fe8bdaL,0xe1fefa4b8ff617a5L,0x561cdb88a91ad714L },
51105       { 0xeb58f7fce145ddc0L,0x7b0e560a29c5ad50L,0xf8d6626593da0e76L,
51106         0x7769b479db39fb92L,0x9149f1e3a3c49033L,0xb706057f3ac49c35L } },
51107     /* 39 << 126 */
51108     { { 0xa678ba3fa527d157L,0x922aab268856a8b2L,0x936d3e85690b4771L,
51109         0xed78dccee114e472L,0x9694ccb1d315fbc1L,0x8b1cf4482822d968L },
51110       { 0x336e670c4aca5441L,0xece24fb58f0e2824L,0x28d1578d05b758adL,
51111         0x0a1be96a40c3f019L,0xed1586e30b659cd6L,0xdef180009f860dd6L } },
51112     /* 40 << 126 */
51113     { { 0xc2885af90fe0f372L,0x2c756bef5fa6b808L,0x52b7f7b6068926bfL,
51114         0xc9399c1ddb143b68L,0x0e77c689e4c61211L,0x7d01e37f15ad7fa0L },
51115       { 0x712fc61f188b2a01L,0x103685ec55a4100eL,0x721f9c02e5fdce96L,
51116         0x61c8a0c5e784397bL,0x34d478351c686ed2L,0xc697c89cd155bbe9L } },
51117     /* 41 << 126 */
51118     { { 0xc26dbc34f06a2cffL,0x4f10297631a80712L,0x758e33eda7c54effL,
51119         0x44b5e4ff3682d103L,0xef05034722a05e6cL,0x9170365c48ff372fL },
51120       { 0xee49b61d66a15a71L,0xb5fd487995c2045dL,0x5940487160ad67caL,
51121         0xdcd2d5f586388c40L,0x0b41a8e54cbd1f71L,0x8152c17040236ae0L } },
51122     /* 42 << 126 */
51123     { { 0xf05b99d0995e9809L,0x036248a70295fceaL,0x7b70cf8f558e6ec4L,
51124         0xe882639c7c48ce34L,0x4cc86feaf4f47d38L,0x976799cf6d81aef1L },
51125       { 0xdb202bfe8043cb43L,0x4c761cc5cef4f017L,0xe124bbc161f0c89eL,
51126         0x77d1cbf55b5a3d20L,0x26e549fcff346940L,0xc6040a4c2325466bL } },
51127     /* 43 << 126 */
51128     { { 0x1ed4d238e940e32aL,0x29d99c20139efcd6L,0x4cb7ef50c172b412L,
51129         0x8a9c438931957225L,0x5d8872af60be4612L,0x7bffbb1be7e79e0eL },
51130       { 0x75bd89c1fc7d4e66L,0x723f9ae86bcc0379L,0x88f673b599c1b827L,
51131         0x8d45d139ecf5148fL,0xf12e605ff97ad1e0L,0x567dec052f09c370L } },
51132     /* 44 << 126 */
51133     { { 0xfb33b987b0be5055L,0x9864f903bcce94dbL,0x99b8da36aea9d09bL,
51134         0x19e326113b622d3dL,0x6abde501dc38f903L,0xb1fe3f1867cb2161L },
51135       { 0xb053ec831e08cd7cL,0xba503b563298d32fL,0x220e98c8c2a79e86L,
51136         0x66ac99511e1cba68L,0xf9520e1e644ab527L,0x3f222b9b4eb8abf3L } },
51137     /* 45 << 126 */
51138     { { 0xae0cf2ff705cfc45L,0xf9d5dfb65a0449b1L,0xd0300b2cd4697fe0L,
51139         0x4ac80d7e4dc665b0L,0x84fbd38d72c1677cL,0xea8306f08e683a0cL },
51140       { 0xe2381e65a469e337L,0x36b565d0b3ec173fL,0xc67689c700f3007aL,
51141         0x9f0108992abcc81fL,0x867a5f8dbb9bf584L,0xef789cdd5a436b38L } },
51142     /* 46 << 126 */
51143     { { 0xf8cdc9ecee11fa1bL,0xa78c73ed4c90edb9L,0xf6703453bbbddb82L,
51144         0xd268b4e23020e294L,0x214cdd54958eb8cdL,0x2acbd31d4d7214e5L },
51145       { 0xf7c60c89cc733351L,0xb8c5cc642fa201fdL,0xaae1ca7f4c2acb10L,
51146         0xf7e33be56d7f598fL,0x982c012fd920c3c8L,0xaa98a69b86751ef1L } },
51147     /* 47 << 126 */
51148     { { 0xf5f548eb915ed5cdL,0x657ca09ce30f448bL,0x8750c4a44a30850dL,
51149         0x1b329c4108edb075L,0x8c261df8ccbcdaeeL,0xa81720bbedd44638L },
51150       { 0x602fc21f0b91ee05L,0x6241265db7e8bc28L,0x1daefe5b106ac444L,
51151         0x93fe5bd42c9deae2L,0xedc229e17f1ba35cL,0xd99244977e0da1f9L } },
51152     /* 48 << 126 */
51153     { { 0x3176a43ab7a3ce87L,0x9fa09e975f130e73L,0x971cc37b9368e156L,
51154         0x2cabf535b8981792L,0xaec2862e4d0f0bc0L,0xa1a48c183ce8c100L },
51155       { 0x288f4e694af2eae9L,0x778845f21f9339bdL,0x1ef5fdfd17dfaa6aL,
51156         0xc784117e3483a6fcL,0xe8c82f05f3c5c19eL,0xf39b3c1d1da87ab6L } },
51157     /* 49 << 126 */
51158     { { 0xa2539d4cc4ac73e9L,0x0308f91891488ba1L,0xa3e72f4459fae934L,
51159         0xb6bbcc37f8c9c402L,0x345a2debc6edee3eL,0x0352f023b0df87b5L },
51160       { 0x67c9e7b8818c4f8dL,0x3a8714cc70f44977L,0x37b96e1295066bfaL,
51161         0x617d9737c95d7f70L,0x60bb06ef759a360aL,0x97689b3f34f59fe1L } },
51162     /* 50 << 126 */
51163     { { 0x17d0667fb2dd1febL,0xbfb92fe48862b2ccL,0xcfa0c8e9d5438a69L,
51164         0x7bdbd4b1d9cf9ef5L,0x7616acddf373c87eL,0x0603d2b0cf8fd5b6L },
51165       { 0x6a80f25d46e31aacL,0xea8c0ad0fd424755L,0x9e2e5a5b3ffd5a2fL,
51166         0x8882d271f3b143caL,0xe6fc9ad7904e1740L,0x98d1620af428ad20L } },
51167     /* 51 << 126 */
51168     { { 0xc8c991a63292054aL,0xc90b11618ce93455L,0xdfa32238e200d1c6L,
51169         0xa9c578d5303004b3L,0x9dd2c3881609e5f8L,0x068ec35d24b69108L },
51170       { 0x47e8183b2d1a3b7fL,0x6200d70efe3db580L,0x76012f3fafc089b0L,
51171         0xba06dbf4bddea8a2L,0xd83b4af5da01a49bL,0xa3d4334ce16e87e6L } },
51172     /* 52 << 126 */
51173     { { 0xb2fff4035b43e58fL,0xe80bd5740727be41L,0x048a59cbf9b52541L,
51174         0xb79084e7f38d0b47L,0x763b0c95938935d7L,0x7cfc6180336b8735L },
51175       { 0x118d2a6f929b0200L,0x7e5789775a31948cL,0x9085999326009509L,
51176         0x330533a33ad633c6L,0x28bdb910733f4c3eL,0x82c88f148fdca27cL } },
51177     /* 53 << 126 */
51178     { { 0x1c346bb04ef444e7L,0x40a50060e6c22e57L,0x5eb02aa6c7a773b4L,
51179         0xd748a0a0d23b190eL,0xb6ff7f02cfedb7dfL,0x3f8fb35b30f8bb4aL },
51180       { 0x245b1c232dc31174L,0xa1e156579af25f59L,0x1ad1a2315e2393daL,
51181         0x9430ed2dfd7c7073L,0xc4161d4f580fbc0fL,0xa2bebd3fa0f1dadcL } },
51182     /* 54 << 126 */
51183     { { 0xace743b6baff35ebL,0x84ac3ce8ac6f38f8L,0x81d41297106b44f5L,
51184         0x33f6bbbbaed20aa3L,0xae4dd66ceb420ee5L,0x87553aac994f0777L },
51185       { 0x26275ebff1e3647dL,0x3b574c4fd9eeb474L,0x58fe2a16929721c5L,
51186         0x748480df932030d0L,0x3a30032641bb5f68L,0x0797fad92c06d1adL } },
51187     /* 55 << 126 */
51188     { { 0x65356242c7caa811L,0x780fe23f4506bbd7L,0xa741a51042407c02L,
51189         0xb8ccd27f5ef9eac3L,0x137f4a573ecf5766L,0xd495be0d15936fdbL },
51190       { 0x5a419656109c93f3L,0xd2f7b65dcb12affdL,0x2305a070ff830421L,
51191         0x6d00f1e9684d5a6fL,0x3de9d1de91aa391fL,0x0b5148c10acb6de9L } },
51192     /* 56 << 126 */
51193     { { 0x209fa6e68ca7ec95L,0x17808b0c107a1047L,0x99bbeb5edfd270cbL,
51194         0xe3d57c1dc25e2d6eL,0xb90b0c107ba1237aL,0xa7e1b8dc4a0d6856L },
51195       { 0x97d5b46136a9a07eL,0x931251e9125ea29cL,0x4177fd10fc8868a8L,
51196         0x1d3538b7b7cdcdf4L,0x889008c8ed3ff9dfL,0x30573ad2229b9413L } },
51197     /* 57 << 126 */
51198     { { 0x11596662924d413fL,0xe797d0a70e5d7bf1L,0xaa05dcd28452ee62L,
51199         0x6e10e77f5d5ddf1cL,0x46b72cda5fbd184aL,0x3adc1edb5b25c0c6L },
51200       { 0x640de5b05c732e3aL,0xa7d4f0f5c6739747L,0xbc11978d1426527cL,
51201         0x979276eccbee0053L,0xc44347a7304e8811L,0x016c01e11f5ececdL } },
51202     /* 58 << 126 */
51203     { { 0x78b2f1a15ee57666L,0x28060d1576a2c09eL,0xaf0cb38df632a5deL,
51204         0x93ce93eea284cd43L,0xe3670d0af35dc1f5L,0x3b8deea527971072L },
51205       { 0x3b88b1158eea4303L,0x43ff3b22aabde038L,0x8d69e180c813d623L,
51206         0x218f5b853aa7a08eL,0x6ee1544adf74f239L,0x0d7abf20fb8772f7L } },
51207     /* 59 << 126 */
51208     { { 0x1d881d4eb7716840L,0xdf83a03b86bdef07L,0xd534c4e4dc7ee69bL,
51209         0x1169f1cc6e264c79L,0x85c812d1b7690d17L,0xcc3164adec5f2ed1L },
51210       { 0xb91a14180674e87eL,0x5dfaa279969188fbL,0x434acad5e242b969L,
51211         0xa51b5c63751c4e51L,0xaa9089b7874f9aa2L,0x8758f9e51b8397e5L } },
51212     /* 60 << 126 */
51213     { { 0x422ad88e57fd35feL,0xd4564b96b99a11cbL,0x78939992238baebbL,
51214         0xe66ddcaf4b30a709L,0x00873d5f7812ea50L,0x7317f9dc6784aabcL },
51215       { 0xf94afbdbe0608ba4L,0xfff893618896d745L,0xa3348af5cad62808L,
51216         0x13ed4507f349f51bL,0xa73d4bec1186324eL,0xf0b48189a20022d2L } },
51217     /* 61 << 126 */
51218     { { 0x87d117858b8efa4cL,0x724439d6e9c2ee6aL,0x33ab2a03606fa0c8L,
51219         0x6ede5b55f9779d87L,0x858b7dd0759445cdL,0x33683c817a5ef23aL },
51220       { 0x0f093175221c3443L,0xedcf2aaf889195a5L,0x9f189ebc814abec7L,
51221         0x6a64999c40235b9eL,0xf98dc212984438ebL,0x97e2d102ba86e7caL } },
51222     /* 62 << 126 */
51223     { { 0x337b9cbce3db0718L,0x1f2f55833d1796feL,0xa522b76f68c2a69dL,
51224         0x4c1da7cf5375cb22L,0x690a2e7f50bb0d7fL,0xa734d4756689b6eaL },
51225       { 0x918592d5867ca0a3L,0x64d1c147c4d15e28L,0x4d8c3e22656f8219L,
51226         0x5e028bb2170f59c3L,0x41e8b84449875858L,0x1d928cc90c599178L } },
51227     /* 63 << 126 */
51228     { { 0x736dee2cf44db09cL,0xfb5035c07257b4e5L,0x3e3a7bf6bf0b702aL,
51229         0x4910a0165f257c0fL,0xd80b891d98437b4eL,0xf9e55d55076d8587L },
51230       { 0x4e4ed7a79b4fcf4cL,0xaaf417f5581acfe3L,0xb1ae2a7ca3b3f920L,
51231         0xa666bb6263ee4781L,0x2fba297e63684f04L,0xd6e662658d83bd6bL } },
51232     /* 64 << 126 */
51233     { { 0xa58a27c58a541be6L,0xaf66949954fd7683L,0x2431826600079a25L,
51234         0x113f6fcf2606caf5L,0xf6ff2be316cb28c8L,0x8f7fc60e3c17caa6L },
51235       { 0x8ea577e07d35e26cL,0xc3e744c0f0628903L,0x4b28eff4592a57eeL,
51236         0x76e1f87c5e3f67b2L,0x40d7a676fb008902L,0x68a9dc764b6e6b7eL } },
51237     /* 0 << 133 */
51238     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
51239       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
51240     /* 1 << 133 */
51241     { { 0x76e2751a12575913L,0x2c6059914a5f8c4aL,0x58322dfb71fba662L,
51242         0x228aec085e0886afL,0x8d83b6276aee544cL,0x338f5fb6e29f9639L },
51243       { 0x1ba4cfe0bf5e19faL,0x2eea84c5b9e4f8f6L,0x7e0eed58cee95d92L,
51244         0x2d29282abe535540L,0x866638b607a9a1f4L,0x915999776ab8dc82L } },
51245     /* 2 << 133 */
51246     { { 0xa16c79cfaf4d260bL,0xfe853f6cfab3c3c8L,0xb8bd6aa0c2f47e68L,
51247         0x277d590f2c9b4914L,0xb6d1c810097242a8L,0xcf2f3d8e45f75512L },
51248       { 0x2176162b74a20c3bL,0xeee8bcb82b2bcddaL,0xfcf8c0d1a503aee7L,
51249         0x5d1f94a57af4dd78L,0x8f0bc1a62ab43be4L,0xd22dbf16ba9e071bL } },
51250     /* 3 << 133 */
51251     { { 0xbf87f30e3790b47cL,0xd3d3f1e25ab52ae8L,0xd5fd32bd50ec0ba3L,
51252         0x7de8fe0ae60d1e72L,0x52d77fe0e14ff2d3L,0x9b6937db55ca47e4L },
51253       { 0x39e3d19f53e94fa3L,0x8d962a4fbd7827e4L,0x3bd70c7afe92c6cfL,
51254         0xa3fbc06869a82904L,0xe263f00ed96d1d9eL,0xe6c9781f75c0c24bL } },
51255     /* 4 << 133 */
51256     { { 0x705bfe37b4e814b3L,0x22f0de61702013c6L,0x811e77a9bc456797L,
51257         0x4f52c4e617081a2fL,0x87405d819fe1640eL,0x53fa82b7707711d7L },
51258       { 0xdc6fff830ee4aea6L,0x8413e22ffd60373dL,0x0ecb66bea9cf3eadL,
51259         0x7418372e87139b8bL,0x6aaccf295e42b4d7L,0xb6dc592531fc932eL } },
51260     /* 5 << 133 */
51261     { { 0xf1c8d00de460fe00L,0x5692bfee528da7c6L,0x9e4dd700ac8620dfL,
51262         0xcc43e73d9d6fe740L,0xc94060d3e76dcba2L,0xfcdf8ba6d398914fL },
51263       { 0x540942e7502f8587L,0x5def85040de058fbL,0x63e0c7855292b0c8L,
51264         0xe90405282e558983L,0xe25727a16baf4a31L,0xb9bf28f0acf64d7cL } },
51265     /* 6 << 133 */
51266     { { 0xc7c8364f09d26382L,0xe16988737bf32d9fL,0x97bac2feb726391cL,
51267         0x521426364a7c0b57L,0xe3e596482cdec222L,0x4ee7238cf44e0a98L },
51268       { 0xa6d05a21f61cfea8L,0xa1059fb7efe6a26fL,0x482a65b342416fa4L,
51269         0xdc5727e1c71e7a94L,0xe6b0fb6ec4767f1eL,0x3d0d626d6510599eL } },
51270     /* 7 << 133 */
51271     { { 0x59f5df1b2a8f9f78L,0x6bb161d992257e60L,0x2cf060beb7b2eb14L,
51272         0x98e72799aec169b0L,0xdde683927045fdb9L,0xee5e0aaf461b27e8L },
51273       { 0x80250c744c0ee047L,0xdd3881f597f0677bL,0x0ea56921a4459b6cL,
51274         0xf7793cee26df8d7dL,0x33bfa09be42d1913L,0x9f0636f74ccf5139L } },
51275     /* 8 << 133 */
51276     { { 0xfa3b4c8eb88ee8f9L,0x1f288e60b521ab57L,0x06aa39562e8c4d8cL,
51277         0x4981c3e5cf89935bL,0xbdbd0c4745fa071eL,0xa78f831c496073beL },
51278       { 0x09a72986a4e5c001L,0xac527731709cb728L,0x9a64b5b3988f2781L,
51279         0x6ac9440d73b1719dL,0x58ad54c7e3d2e807L,0x1c1574488f06742bL } },
51280     /* 9 << 133 */
51281     { { 0x3220a099a5e437e6L,0x11a1b1734dc5bdaeL,0x1ad9e736b64c9b8bL,
51282         0x82b6a3d4ce40acadL,0x54e1eef8915aaa8aL,0xff19be481f3a1f54L },
51283       { 0xadc4c5250b64a2b6L,0x6637bc8e12caf63dL,0x970d08b01206a661L,
51284         0x97c9b9bde57cf6c2L,0x228ee4712b89b7b7L,0xfeed19ca837cb79fL } },
51285     /* 10 << 133 */
51286     { { 0xcd36c981a816f4d4L,0xc99316c27712a72bL,0xd32cb20339e671aeL,
51287         0x79ff1889f67f6215L,0xf9fe7448cd08e91eL,0xdc9b277776f3e605L },
51288       { 0x8af30c2e7c1609a6L,0xed3224a3e54cdd0bL,0xe73f56ded1dea6acL,
51289         0xb836eb783e37a390L,0x9f0dcdb2c78a0510L,0xc37e67a39e6109f0L } },
51290     /* 11 << 133 */
51291     { { 0xab419eb852e0d552L,0x86c76ef8ae3d06ebL,0x219662b4f7c6342fL,
51292         0x2820299e548f6717L,0xc4d0d47a8a2aeebaL,0x4c98069895536593L },
51293       { 0x3644e55ff42cd505L,0xe109b64ae47e0b0bL,0x91f520a6c89788aeL,
51294         0x35f6dc577699087aL,0x3484f5b6b77deb8dL,0xc22a63a47f3c09e6L } },
51295     /* 12 << 133 */
51296     { { 0x6b5b7b2a75c953b2L,0x927ed77ca7f1cd5bL,0x2e8c53994cba0e5eL,
51297         0x03aeb14a3f4a941bL,0xedbad9a0a1385c8aL,0x925a49c167fd2258L },
51298       { 0xe7e368ee3365ffedL,0xcc4aad2dd106eb87L,0x4ce908daa980b53bL,
51299         0xd3f4954016929ac8L,0x613c804dd5c05c32L,0xa42290ccd7973344L } },
51300     /* 13 << 133 */
51301     { { 0xe7437974c464c24fL,0x70c04156d36bdfecL,0xd94c80fcb2d5d96fL,
51302         0x4a1fcf19d2cfea9cL,0x443478592f6df796L,0x0c908d0159743bd2L },
51303       { 0x78949087d165a62bL,0x6c3f9021632f4e1cL,0x3917b925a94bb004L,
51304         0xe153ef092b3f87e3L,0x6aee1027ea706338L,0x953ab2959733bd02L } },
51305     /* 14 << 133 */
51306     { { 0xad49cad49855d008L,0x23442cf94b273d85L,0x3a3c8752e3dd8f65L,
51307         0x0ca5d24bedf84ed0L,0x3d0580938b4f8f96L,0x1cea59acf9b9ae03L },
51308       { 0xf17cbbe23a06567eL,0x49cf5294f090338fL,0xcf8cbe0da93562c1L,
51309         0x66683f21b986b71cL,0x3c96750cc87c9e10L,0x38e62db63dcf2f32L } },
51310     /* 15 << 133 */
51311     { { 0x807a519047f99946L,0x49e03dcf01615a37L,0xe813287c99590bf6L,
51312         0xc9caf30ddb62835cL,0x0733c49d4df78781L,0x4fde30fd4815d3adL },
51313       { 0x2809b853f9a2610dL,0xf2b139b9dc050142L,0x52a40a413c23a4edL,
51314         0x9333086b0a104df2L,0x04a90c11e2a65950L,0x4c6a15c4dc24341aL } },
51315     /* 16 << 133 */
51316     { { 0x33952177a98cf218L,0x841d9e1f579ee53aL,0x1084d61e0a285bd5L,
51317         0x3935a84e71171b1cL,0x8ac2433cf29b29f9L,0x5dd868b56dd1e9bdL },
51318       { 0x88da04788d102390L,0x1140735a657400d1L,0xa792a25f9d5b19e1L,
51319         0x9ee015cb6a27fa79L,0xea3bf8b57ba16a8eL,0xc5f0cc26c15fde67L } },
51320     /* 17 << 133 */
51321     { { 0x033708d2e02e9feaL,0x2b588d1e222f437dL,0x998442d6c6b47013L,
51322         0x4033d62fb8ac1fc6L,0x9b8fd348877c726cL,0x1a2125fa5bea5a49L },
51323       { 0x04a2c1d680b8afd9L,0x3d52c9d2a40195c1L,0x56b204e6655c0b30L,
51324         0x55ee14ef520b3464L,0x23fc52e6b5bdd96bL,0x445cfd7a56f4b269L } },
51325     /* 18 << 133 */
51326     { { 0xc8985c2c5fee6426L,0x8be749496bb7bb8dL,0x12967576659363b4L,
51327         0xd1b6ded9b969b221L,0x586f28929819fc04L,0xec6b03e5addd6307L },
51328       { 0x3f0e96cad4da6627L,0xc866c95c14860d00L,0xb038867c9725f9a8L,
51329         0x60cd3afa1caf2547L,0x6f2cc04411dddfafL,0x49551f249d0af0faL } },
51330     /* 19 << 133 */
51331     { { 0x04a68337177e2e7cL,0xe20b21c0adb79464L,0x9b30d3437e42ae4dL,
51332         0xac7a01d7f86c5767L,0x3ea34e385381db5cL,0x3005a0c39235f5bcL },
51333       { 0x853eb43167b4a5c5L,0x92f26a35584e4b8aL,0xa3d25e5879bb470fL,
51334         0x7963d90a5eacbb13L,0x08ca7969212e3aefL,0xb5ec6582df92bfffL } },
51335     /* 20 << 133 */
51336     { { 0x2e152d95ee2c3290L,0x8437df2e4a9ceda4L,0x4151754e3c7ebfd1L,
51337         0x556c59a888f80aeaL,0x8d099c5d8de44dbcL,0x9ecce7fc77abeeccL },
51338       { 0x5e0a0f383aa311cfL,0x99ff1eecb8f2bff5L,0x5ae0b483b5dcf488L,
51339         0x11212c4591483a02L,0x99fe0738312134a1L,0x3b855db0a72745efL } },
51340     /* 21 << 133 */
51341     { { 0xb70bf73230261470L,0x8c9b7c4bc74a180fL,0x4c648aef88a9d9acL,
51342         0x3d9f7540a10f98bfL,0x8ec2a3a3120d55f5L,0x1707c1b0baa5a600L },
51343       { 0xacba8da9103f2f0bL,0x96926dc0c7194236L,0x00358df7584499dcL,
51344         0x74c27d0e538c0a15L,0xc675d079de960a77L,0x575b042e89f41f6bL } },
51345     /* 22 << 133 */
51346     { { 0xd17d99529703d919L,0xb25ecc411477faebL,0xa5c66a58a9aea2fcL,
51347         0x83754d683accb00cL,0x6a9ae76a25901044L,0xe437981b2565e035L },
51348       { 0x441ec0d96f45fa01L,0x35e40d126a697636L,0xba2fbab59bb3c2fcL,
51349         0xc038be03e94b245fL,0x366b4bcc0c1672eeL,0xa14a2c10f1ce6d55L } },
51350     /* 23 << 133 */
51351     { { 0xef32d94febe1dfe2L,0xdbf53d4271494ea6L,0x72dc5fad24cf0c2dL,
51352         0xa9247adc66dbc21bL,0xe31ff66ab130da59L,0x8cb97c09e86ab63aL },
51353       { 0x204020e2f59ebb80L,0x56f6d8b7cfd0f965L,0x7522a692b1518dadL,
51354         0x8e7c999f5f231e2eL,0x2eff5904b4406177L,0x8440cee87bfe2363L } },
51355     /* 24 << 133 */
51356     { { 0x37f50e43892c8eecL,0xf06a2f047d85a7e2L,0x3916af85e1d11150L,
51357         0xf56e852f6785ae1cL,0xbf8c72adae6ada8cL,0x1fcd53e3e13285b2L },
51358       { 0x5327920cbd56d348L,0x82a394fb445658a8L,0xa71328573caf3792L,
51359         0xb15ab34b550ffe1cL,0x818980666a5d4e4fL,0x0bda153b2f854f9dL } },
51360     /* 25 << 133 */
51361     { { 0xf664f44407aa3d00L,0xcf8901664704e2d6L,0x1802f662f8c2fc8dL,
51362         0xd52496b8a47f0da6L,0x37f71d8c75001c8eL,0x7ad8e8c29cad3ba7L },
51363       { 0x666afc25825515f7L,0x3a871c76a729e498L,0x5dc21f1108479e3eL,
51364         0x78ff145966c4331eL,0x8d01e2352dd3deb2L,0xc68445e9dbc91fc3L } },
51365     /* 26 << 133 */
51366     { { 0x8f2d9aae98ea13f6L,0x3e75ba40ab97bfb0L,0x14dd24e635e1fe35L,
51367         0x14abb0735f88d9b9L,0x74b2c6a801d4fcd6L,0x4905dfe7744a09bbL },
51368       { 0x349348c077cd538aL,0xdec247f5f7b6d035L,0x737e248dc455d417L,
51369         0x608a5529b6fe5d92L,0xce0ba0bccd7dca64L,0x022bcb18c21175c6L } },
51370     /* 27 << 133 */
51371     { { 0x79fe5372881b120aL,0x4878428aae98aeeaL,0x5c6a7f7d09511acbL,
51372         0xb7be08de3b046481L,0xfb91990b8b35f13bL,0xab734f604ebdd374L },
51373       { 0x3d4955f1197690e1L,0xfc82767c7b376dc4L,0x7cf3db85b8c659c7L,
51374         0x4cfb6f4b03202723L,0x8b79311746141d27L,0x94c6ee67867292c4L } },
51375     /* 28 << 133 */
51376     { { 0x77a31009722730feL,0x93707ac4d5cdd297L,0xa290be39d3811e8cL,
51377         0x831a9b9592a5cdb7L,0xc74cda84e7342270L,0x964661903f48affcL },
51378       { 0xb0496cca5520b0f0L,0xc8742cd9bae930ffL,0x3a30737aeaea703aL,
51379         0x0a8e6fb7fb758854L,0x9ab9523e6796f4d1L,0x36e6c05dfdf7140fL } },
51380     /* 29 << 133 */
51381     { { 0x4c8ec1a3ccedff1fL,0x8fc58987ca74bd5fL,0x70a6b71cf768abcdL,
51382         0xb9971cf5ed60a02dL,0xbb2aedc8af2f9a41L,0x4ebf90c76032c98aL },
51383       { 0x8e69b4c4d3752262L,0x350f201474ba8e8aL,0x7a164f6724d0052dL,
51384         0x5aeb80db61d7eee0L,0x626a6c9da63583bdL,0x6246637fc3f2196dL } },
51385     /* 30 << 133 */
51386     { { 0x2077dfa1817d444bL,0xdda9c7fcdf855b15L,0x577603be04b31d38L,
51387         0xc6beacae7a140cabL,0x8cd9dc019ecbed91L,0x6ea8591295ae114eL },
51388       { 0x6fb29a33fd47f1b5L,0x6203bca6223cb96aL,0x2459d85a7c1a3580L,
51389         0xbab5922d6410a3c0L,0x543be274cc7750f8L,0x1a653e1c42baea3aL } },
51390     /* 31 << 133 */
51391     { { 0x616abd271dbeeea7L,0x0684c14fe2189d8aL,0x0d2bf3687354d862L,
51392         0x8b0cfc06a8bdcb0bL,0x187147b49661e548L,0x07509bc358edde6dL },
51393       { 0x7b2a33bca78c2782L,0x5f41b8379ec5fa24L,0xa6df5de574539201L,
51394         0x3510f650093f8f7eL,0xe4d1c06ed14aaa71L,0x4d1b1ca2b0470581L } },
51395     /* 32 << 133 */
51396     { { 0x3b62315064ef6a95L,0x97645381aaa5b792L,0x4bc2c31c56471100L,
51397         0x4a0e73bb1bae8d2aL,0xbfc0770a8df1f76aL,0x5089916fa7bb16caL },
51398       { 0x2afe5b1cf31fe82eL,0x0b06831df0119977L,0x97caa333a1af2a82L,
51399         0x93cb92c5dafed6cdL,0x09553e7e92c3b2e3L,0x3d9c4b7d61af2956L } },
51400     /* 33 << 133 */
51401     { { 0xe56c89b06910185fL,0x1cd06d19ac47667cL,0xb35e6ae5fe41a4ffL,
51402         0xdc2fbaf959e8be08L,0xa9e6df08f8cec40bL,0xcab91f8ffe63ad2cL },
51403       { 0x1e3bd193ca2cc678L,0xe1830cae06bb40f2L,0x3b8b33d6d69985abL,
51404         0xb6b7e8433895d8a8L,0xec3882909fbf6b31L,0x012bec2ac37d64cfL } },
51405     /* 34 << 133 */
51406     { { 0xff2e88fd33941b4bL,0xa2d9730a8d85cccaL,0xa23f8cfa16f7d7a1L,
51407         0x82013193d39a250eL,0x3b119882ca0fd8a8L,0xcff642ac1a438706L },
51408       { 0xe4a3a95f65e5688cL,0xb2a6c836c31243d2L,0x1b7ec5d2194d1f42L,
51409         0x51ab34f814e4f7a2L,0xa3e3f135d3583ca0L,0xbca6ecbade9b91f2L } },
51410     /* 35 << 133 */
51411     { { 0xc85820c3002f07caL,0x090365320e00dca7L,0x0f3b3166f4e4d8c2L,
51412         0xe694eb4479460f00L,0x50d0ed14c15e04ecL,0x8c9998abcc86e3bcL },
51413       { 0xb82581624aefa561L,0x6351aca610050c0eL,0x4e60399acc8d2342L,
51414         0x96da3af7f633dc88L,0x1af763ec09202348L,0x76b0e49d3f0d5f76L } },
51415     /* 36 << 133 */
51416     { { 0xd83f574a08f84746L,0x48fc9715ca07f5f8L,0xb3d5d0d2dcc51638L,
51417         0xc2a5e3356153bdcdL,0x8242cd9a8aa4ef74L,0xe71ba25b0bdaa0d0L },
51418       { 0x4342d4bba4ff172dL,0x81db10dffc1341a2L,0xdd93dd877dacb140L,
51419         0x6f8a4e81d12d347fL,0x0d4e7e461bc369beL,0x3ce10a771fafd0c5L } },
51420     /* 37 << 133 */
51421     { { 0x2fdaa3bb8cb896a3L,0x2fb82dfd913bb303L,0x5d814a50ba9ca09aL,
51422         0xc3de6aa426112215L,0xd0d5c98b25a0c9fdL,0x54004b3e0eaae4a8L },
51423       { 0x410e2cc209358663L,0xf7e3d08a501c4ef5L,0x3d86434dd334aa19L,
51424         0xf70ea577772fc0cdL,0xa0eded5aa607c4f2L,0xba0bf1bc36222b2dL } },
51425     /* 38 << 133 */
51426     { { 0x8d901e759632c4d6L,0x0ed9a7ebbbd94698L,0xfd2169dbbf7bcbc1L,
51427         0x2b4d168d5b302c66L,0xd42f9dd73e65f24dL,0x73e0c22c0eed0022L },
51428       { 0xf9091588f5d2dcfbL,0x81c7c01eb8715b78L,0x2be06165dde6a9d6L,
51429         0x64b5902dcacd6ca2L,0xdcd510d70159d3bcL,0x5b71995b42b5e30aL } },
51430     /* 39 << 133 */
51431     { { 0xa9c474eae7a211edL,0xc7bcdd20d8170f76L,0xd9aa8d9734a15487L,
51432         0x26235292933c16b6L,0x289d47d5d8238fc0L,0x39f10fb3ae27ca16L },
51433       { 0x822e187f1c016ae1L,0x8e93b15f2be46859L,0xe2ba61a60b0a055bL,
51434         0xd8f33ddecb8de893L,0x016652d6379657efL,0xf4eb08f9e7d9eab8L } },
51435     /* 40 << 133 */
51436     { { 0x5559dd31e67145b6L,0xf2d905b45b2427e7L,0x0d840fabcaf57d0cL,
51437         0x9625866578742ab6L,0xc85482ad409c1c8eL,0xdca2a058adaa6167L },
51438       { 0xec26ad9a0c8885fdL,0x1b93b8a22a600cb2L,0x340aa7fc2539986bL,
51439         0xd7674876a23dee41L,0xa948a9292e1a9837L,0x9ae67d2a71438da9L } },
51440     /* 41 << 133 */
51441     { { 0xe753114a8d6a98f5L,0xb2d7d1e1f6ad93e4L,0xfbcfe0cf1935714dL,
51442         0x9dc2d293e859e729L,0x674c170889a703f2L,0x87744b0252063099L },
51443       { 0xa1721de04b25966bL,0x059292573a285fcaL,0x5b02ca39e8ce75e0L,
51444         0xbfdf0fb939e57da4L,0x554378cd6388a964L,0xc53fc5c8f853d7faL } },
51445     /* 42 << 133 */
51446     { { 0xcd3b60e352f51554L,0x6292fafab44ad7eeL,0x670561c79513741fL,
51447         0x95defdf3b9ba16a7L,0x6c0beac1adae36cdL,0xef05c24a3e8aabd6L },
51448       { 0x74208a02b23efc25L,0x71930e02c22172d1L,0xbdb1f1c6f5ccbffbL,
51449         0x358b483c504d9cb3L,0x48b5887a9a48a4baL,0x289256b4e48f09e7L } },
51450     /* 43 << 133 */
51451     { { 0x671bf1eebc2f256aL,0x530faa653984ca7eL,0x0a6d18955c05da6eL,
51452         0x219de918118fe96cL,0x289b9645bb7eded4L,0xe905c4729588f006L },
51453       { 0x56d0cd9ac9d61133L,0x8879550079a4f743L,0xd05e910199c2aff3L,
51454         0x7e91f7c985e52c8bL,0x7fd02f83b5c5d473L,0x4b43b6453c59330aL } },
51455     /* 44 << 133 */
51456     { { 0xeac6f447d56bdf1fL,0xb22e8425c2b502ffL,0xe1cc9d3dfca5a501L,
51457         0x8192bc29b64baf39L,0xeb2c901a52ce849eL,0x7f5f38b11dd506f1L },
51458       { 0xfb3684b10f0a1d68L,0x16c4aacde9240ff8L,0xffa682435a4d8995L,
51459         0x27264ab554e4c95dL,0x9aa40cdc4f34ffaaL,0xcb8a30a35fd818eeL } },
51460     /* 45 << 133 */
51461     { { 0x912f0a7dfa88792fL,0x2ad9249f5090716eL,0x4b828a6fb96e6e31L,
51462         0xe805f0588d7f2095L,0x72e95cb956e00978L,0xc95354667651815fL },
51463       { 0xc877181a08df5b53L,0xae055dd8779c3302L,0x3f9e6dd90b4e68d2L,
51464         0xdeb15f1308fbb2f8L,0x5f129c1cc5802a96L,0x7482e4af3cc51022L } },
51465     /* 46 << 133 */
51466     { { 0x98904777ab695f56L,0x6dc472c18989e518L,0x6749d25c82031d40L,
51467         0x5c465922c36202f1L,0xb3b5b9aff31fe542L,0x855263bdf98bc09dL },
51468       { 0x40ee01747eb4789fL,0xd64ae0d4de4e92bcL,0xbaea76a38995e69fL,
51469         0x3f22b2e3d972751eL,0x5a197daa2461f1b4L,0xbd15682a5097b93eL } },
51470     /* 47 << 133 */
51471     { { 0x7f251143534f8547L,0x213baf14222a161aL,0xae993737ad1e6005L,
51472         0xdc70867ff8b1cc7eL,0x41e880f3bb22e11bL,0xe36f54cbd2d6bc45L },
51473       { 0xa42e819d4d65ae97L,0xdc57be4de8592604L,0x8a89777fabe73b50L,
51474         0x435fedec72e26f5bL,0xe8d3cd8251ec79f0L,0x9574d6ea67f407b0L } },
51475     /* 48 << 133 */
51476     { { 0x39038863f7f35053L,0x421a17f3328787d2L,0x38aa682ef3d8310fL,
51477         0xb52d41e8f4123153L,0x4fbef3dd7026310bL,0x0c6bd7adf6ff5692L },
51478       { 0x3831c6b2a9be5d0cL,0xb5c9ae85e8d328b8L,0x76d26abc6516bba4L,
51479         0xc237f9a5446d35a8L,0xb2b16c0ff012a8d0L,0xddf2b7fe0ee0315bL } },
51480     /* 49 << 133 */
51481     { { 0xf401366a7dd4243fL,0x7db92881f434ba76L,0x5b5bacd737ffc502L,
51482         0xa53fe0e802cb994eL,0xf6db539ffb00cb96L,0x0bb288b379878966L },
51483       { 0x275c108c0c3d4b7fL,0xe57222d267236ba2L,0xc754d31890683aa1L,
51484         0x883a41ef2345460fL,0x8e6b7ce8b572fd14L,0x7649c29237d21925L } },
51485     /* 50 << 133 */
51486     { { 0x46302515c4af281fL,0xe2a9633c3513ea87L,0x1175276fb3e96864L,
51487         0xda377e32f4ed1228L,0xacf223a1fa6be904L,0xf442c41abc01057bL },
51488       { 0x83d766c38a69db33L,0x933dd0974cef397cL,0x094b21b575fe43cdL,
51489         0xf16ee57ab3141dd5L,0x4a8d0d6cb981d196L,0x6bd246c3730075deL } },
51490     /* 51 << 133 */
51491     { { 0xd9ae9faa91eab3f7L,0x8520bebba2bcdfc1L,0xc681d5a0ee94353aL,
51492         0x980871dd316ee7acL,0x7d70b82bcb401c4eL,0x150706c1bc6885efL },
51493       { 0x11709bbed3d8663aL,0xad69df943ace1806L,0xf889daef1a36f12cL,
51494         0x6ba376b2560bb749L,0x5342cd7a0d95f8b9L,0x5d14201273b4554aL } },
51495     /* 52 << 133 */
51496     { { 0xbb85b640056ad6c2L,0x7c51ef96ac074372L,0x1c7ce31cf10b43fcL,
51497         0x08e4101b26f4d3a4L,0xd18511c43968459fL,0x00e20c3fd6d07839L },
51498       { 0xd5bcd598e4fcdc11L,0x99e9a4d0c877f6a2L,0x9c5dd9d0bd491646L,
51499         0x83918f609bfd7a1aL,0x4bc130cd7e2b95a3L,0x668825fbfbc31c83L } },
51500     /* 53 << 133 */
51501     { { 0x7e8947bd5568b75cL,0x43419ecbdab8f822L,0xeb52a83a7b8fa996L,
51502         0xbc674ff32d1a32c6L,0xdc086f84ce405eeaL,0xebe3e087f8918ddfL },
51503       { 0x476099ecdb152bc4L,0x0cb491c52d3718c3L,0xa7c49cd69da8517fL,
51504         0xc736fcf51ab8fbadL,0xa00b403ba24fe115L,0x01f6e5bfd976f549L } },
51505     /* 54 << 133 */
51506     { { 0xef8e12edf15ad86eL,0x216be9828c20441dL,0x10ccd4f85c45e821L,
51507         0x8a12f6037c9745e9L,0x56212b09da6f1b2fL,0x5a81d69338115f05L },
51508       { 0x5aead3330a4405a8L,0x7024a76c03221eddL,0x9c101d0250e6a610L,
51509         0x6bcb22ffc1b6d54aL,0xf96cef62cf787e89L,0x9c9bde7b79341d83L } },
51510     /* 55 << 133 */
51511     { { 0xe9c61fa744058dc9L,0x59efcc8f1581d690L,0x1ea73467513aba4bL,
51512         0xf0fda8a69d03d72aL,0xcc1f3f22c6f30a01L,0xb632daa3ddf8dea8L },
51513       { 0x58563188fe8e2f89L,0xf053b9f67b45cf5eL,0x1ab51b07f9bda4b1L,
51514         0x37850e9789dc0050L,0x1bf5e41e8f6a1daaL,0x4abb4f82d94c0fd8L } },
51515     /* 56 << 133 */
51516     { { 0x817d77b106a9ad54L,0x3a999d7d89a25ecaL,0xd3ac4107da68b768L,
51517         0x6904bcddbebc4c4dL,0xb0d2103ca53d39e9L,0xdba86bd230a5e950L },
51518       { 0xb09256804f52208eL,0x37c3156a28495b2cL,0x2389ab34c15855aeL,
51519         0xc14dfd963017194fL,0x420e07191146b838L,0x1a9f909b8fb4b6fcL } },
51520     /* 57 << 133 */
51521     { { 0x73af3d1fa24985f4L,0x4fa27db444a1f9a8L,0x6deb02455cfbfa45L,
51522         0x4803e0342813c996L,0x24715fe80e4116ddL,0xa2e8258d38d8e902L },
51523       { 0x3321e112dd7d8ebfL,0xab8d5b2b272ee6a4L,0x2994fac34eb10fd9L,
51524         0xe007d0a4a9c611ccL,0x29db5aa974d194e3L,0x9e76e3ddcf7409b9L } },
51525     /* 58 << 133 */
51526     { { 0xf12a3eeab577f6b9L,0xe666e002b6db2206L,0x95aa0d03375229b4L,
51527         0xebd05140ef0772beL,0x9d5b5e9e48580b17L,0x960906b3a77ceceeL },
51528       { 0xca869663e50422f8L,0x150e844199d481b2L,0xadd97d7c3418b00dL,
51529         0x9908a23e68244f02L,0x5357ea61d3eac131L,0x0af5423d9778902dL } },
51530     /* 59 << 133 */
51531     { { 0x11aa3582d8e62251L,0x108ec170aa1560a5L,0x8423663e2b5b6ea9L,
51532         0x3f4ad292d8718329L,0xf8e3e7bd04f8daadL,0xed310c3a11b81211L },
51533       { 0x718db302edac9282L,0x7866f1c1e434544bL,0x1052133c568b195aL,
51534         0x8ca61965c0e37cbbL,0xdd28fbd32cfac1c2L,0xf4062b33dce29660L } },
51535     /* 60 << 133 */
51536     { { 0x2926ef17dd63404dL,0x0e89c4d41399cc68L,0x6507fedef7ec20b8L,
51537         0x1ac084ff88c751d6L,0x31bc08bedefe29e6L,0xd42199714f0692c5L },
51538       { 0x4d6ee74236069bc0L,0x3868ef6aff80f3d7L,0x6df02d7c5a9c6f4bL,
51539         0x2c3096bb101abf69L,0x0c2b01ec8eaacaebL,0x65914c20eb2e687aL } },
51540     /* 61 << 133 */
51541     { { 0x78d5ab7b34a8173eL,0xa34b72ac9230c3b2L,0x379453e13538b39dL,
51542         0x1764c4420f3789b0L,0x5b4bbe77a3f2ba4eL,0x3bd35b796f86338dL },
51543       { 0xf2fcdf04f02fa7e3L,0x6b4522f420d23feaL,0x966fb8fa01be16a5L,
51544         0xf2a56e96e0d705feL,0x494aa4553872e429L,0x68432d9181921587L } },
51545     /* 62 << 133 */
51546     { { 0x0ae47d1e3dba277aL,0x54607ac99832d90cL,0xd4cec32eecbcdeacL,
51547         0xe54b3033b9ccdfa9L,0x5b3a8a56fb920449L,0x831ec8f955eefd3aL },
51548       { 0x59ba32a3a02dca96L,0xb421e4b01decf837L,0x52e70a88a88636d2L,
51549         0x3b75ed073086667eL,0x7a4a46b3b877cd6bL,0x3825c80b59c99207L } },
51550     /* 63 << 133 */
51551     { { 0x3bc3f0e069bdc53fL,0x7e0bd730d9d7def4L,0x71a577e6844ede6bL,
51552         0x06d47f4981705712L,0x83bdb1a6ef108ea6L,0x853a3ce0c8a8ff41L },
51553       { 0xa6f114b8f408ec44L,0xe0ce4267e2d72d33L,0x405f6ddda2a0b613L,
51554         0x22ce3daa8d253ad3L,0x2fd738094aa1de25L,0x28a2001b27363597L } },
51555     /* 64 << 133 */
51556     { { 0x13722ab079ed523aL,0x33b29bec249d5624L,0xd3d0f467f76fdaf7L,
51557         0x7ce072f912ddfd9aL,0xce918a5747bdefd3L,0x14d38ab4750e5315L },
51558       { 0x08bbb20e3346f647L,0x428b917f05b26894L,0xc8fb5c21ca865ba6L,
51559         0xee6e41e02e6e8e6fL,0xd00ae6214c608b60L,0x659756396ff685cdL } },
51560     /* 0 << 140 */
51561     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
51562       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
51563     /* 1 << 140 */
51564     { { 0xbbccce39a368eff6L,0xd8caabdf8ceb5c43L,0x9eae35a5d2252fdaL,
51565         0xa8f4f20954e7dd49L,0xa56d72a6295100fdL,0x20fc1fe856767727L },
51566       { 0xbf60b2480bbaa5abL,0xa4f3ce5a313911f2L,0xc2a67ad4b93dab9cL,
51567         0x18cd0ed022d71f39L,0x04380c425f304db2L,0x26420cbb6729c821L } },
51568     /* 2 << 140 */
51569     { { 0xca07923c0eb008c8L,0xab79402d9985912eL,0x41e379e83cb02510L,
51570         0xfabac005beb383efL,0x24d12d9a1076dd0dL,0x95afd46fb208f127L },
51571       { 0x9cc38a60b1031e46L,0x93e21e977009f6bcL,0x6f6360d98ac219efL,
51572         0x1edaab3faf284c80L,0x9c3b5281019e366aL,0x6475c579bc9e9726L } },
51573     /* 3 << 140 */
51574     { { 0x26bd07d6bdfbcae8L,0x10b5173fdf01a80aL,0xd831c5466798b96cL,
51575         0x1d6b41081d3f3859L,0x501d38ec991b9ec7L,0x26319283d78431a9L },
51576       { 0x8b85baf7118b343cL,0x4696cddd58def7d0L,0xefc7c1107acdcf58L,
51577         0xd9af415c848d5842L,0x6b5a06bc0ac7fdacL,0x7d623e0da344319bL } },
51578     /* 4 << 140 */
51579     { { 0x8410d8298d85a25aL,0x48ee01354af81a14L,0xae460d0d18c25348L,
51580         0x5d0279a07eb035a3L,0x87e7c1289a114414L,0x17c08a8ec0744f79L },
51581       { 0xb7b2b4f1025cdbe3L,0x9a74f15d82d1af60L,0x124a7395b51ee685L,
51582         0xf2937c4bf6122422L,0xb4ec133207f1a7ffL,0xad801112f886032eL } },
51583     /* 5 << 140 */
51584     { { 0x4c0d78060c9d3547L,0x993f048dcf2aed47L,0x5217c453e4b57e22L,
51585         0xb4669e35f4172b28L,0x509a3cd049f999f8L,0xd19f863287c69d41L },
51586       { 0xe14d01e84c8fded0L,0x342880fdeafd9e1cL,0x0e17bff270dc2bf0L,
51587         0x46560b7bc0186400L,0xe28c7b9c49a4dd34L,0x182119160f325d06L } },
51588     /* 6 << 140 */
51589     { { 0xdd4eb3d07bb5346eL,0x9a46ad01382e7db7L,0x1200285ddc1973c7L,
51590         0xfd342beaa0046b98L,0xd19173491219a7fcL,0x5383d319b7caffe5L },
51591       { 0xea5a0c4e2e0fa118L,0x1cc2de3ca5457b28L,0x5b2a16dc6046eeeaL,
51592         0x1755e1fecc8e64b1L,0x51e4946e9e7faddaL,0xf805422ffcbf4ec2L } },
51593     /* 7 << 140 */
51594     { { 0x46d70888d7e02e18L,0x7c806954d9f11fd9L,0xe4948fca4fbea271L,
51595         0x7d6c7765bd80a9dfL,0x1b470ea6f3871c71L,0xd62de2448330a570L },
51596       { 0xdaecddc1c659c3a7L,0x8621e513077f7afcL,0x56c7cd84caeeef13L,
51597         0xc60c910fc685a356L,0xe68bc5c59dd93ddcL,0xd904e89ffeb64895L } },
51598     /* 8 << 140 */
51599     { { 0xf877e8c6bd08ffafL,0x24718fefaf23012fL,0x19ff269f2b004cfeL,
51600         0x8adc5d7795450f8bL,0x688ce8bce2a7d458L,0x74d7445b97bd7fdcL },
51601       { 0x1b9f4ad641e6abadL,0x6652ed05f00e4bf5L,0xabee1f7e71d83d86L,
51602         0xe693c76d25ffc219L,0x1c9a84afc873f553L,0x84d2718766d77a55L } },
51603     /* 9 << 140 */
51604     { { 0x75d874fb8ba7917aL,0x18fa7f53fd043bd4L,0x212a0ad71fc3979eL,
51605         0x5703a7d95d6eac0eL,0x222f7188017dead5L,0x1ec687b70f6c1817L },
51606       { 0x23412fc3238bacb6L,0xb85d70e954ced154L,0xd4e06722bda674d0L,
51607         0x3ea5f17836f5a0c2L,0x7e7d79cff5c6d2caL,0x1fff94643dbb3c73L } },
51608     /* 10 << 140 */
51609     { { 0xe566dc057e5f7121L,0xccac74e22ed07bc3L,0xaabfdfcdc70401b4L,
51610         0xac9fc4496254e0dbL,0x358d885f11c7de05L,0xb8e6a4a9d60772b4L },
51611       { 0x884272a5cfe917ceL,0xdfbe98689a3d347aL,0x06b90848c9d1baccL,
51612         0xc4ccedb6db8c6288L,0x892878b979e5683eL,0x1b521829243273e3L } },
51613     /* 11 << 140 */
51614     { { 0x916e19d0f163e4a8L,0x1e6740e71489df17L,0x1eaf9723339f3a47L,
51615         0x22f0ed1a124b8dadL,0x39c9166c49c3dd04L,0x628e7fd4ce1e9accL },
51616       { 0x124ddf2740031676L,0x002569391eddb9beL,0xd39e25e7d360b0daL,
51617         0x6e3015a84aa6c4c9L,0xc6a2f643623eda09L,0xbeff2d1250aa99fbL } },
51618     /* 12 << 140 */
51619     { { 0x099369c4bf0c6fbeL,0x976f78b2fe7d5727L,0x32feb503d18267a9L,
51620         0x162c41501a7dd0feL,0x3141e37726b8e969L,0x50497a643b53a94aL },
51621       { 0x96159f41607b4cfcL,0x1999b7042f111babL,0x3254987c760f2eaeL,
51622         0x5308075b841014faL,0xc634127e4e7adad8L,0x32a70a6059ffbfe6L } },
51623     /* 13 << 140 */
51624     { { 0x1feef7ce93ee8089L,0xc6b180bc252dd7bdL,0xa16fb20b1788f051L,
51625         0xd86fd392e046ed39L,0xda0a36119378ce1dL,0x121ef3e7a5f7a61dL },
51626       { 0x94d2206192d13caeL,0x5076046a77c72e08L,0xf18bc2337d2308b9L,
51627         0x004db3c517f977b1L,0xd05ae3990471c11dL,0x86a2a55785cd1726L } },
51628     /* 14 << 140 */
51629     { { 0x7279c369a1f857e6L,0x029d30ef27fb373aL,0xe82cbc806827358bL,
51630         0x2bfe09aaa18f57abL,0x63bf3145e5503492L,0x7ea15beafb28ee43L },
51631       { 0x8e6d428f5eec91b8L,0x215e03e9611b1799L,0xb995737161d476deL,
51632         0x2320c764e76726a5L,0xc5de88178e5e26f5L,0x24aae0699161e0b7L } },
51633     /* 15 << 140 */
51634     { { 0xb8d9b28672107804L,0xb5a7c4133303b79bL,0x927eef785fa37dedL,
51635         0xa1c5cf1ead67dabaL,0xaa5e3fb27360e7c7L,0x8354e61a0a0c0993L },
51636       { 0x2ec73af97f5458ccL,0xde4cb48848474325L,0x2dd134c77209bc69L,
51637         0xb70c5567451a2abeL,0x2cd1b2008e293018L,0x15f8da7ad33c0d72L } },
51638     /* 16 << 140 */
51639     { { 0x5584cbb3893b9a2dL,0x820c660b00850c5dL,0x4126d8267df2d43dL,
51640         0xdd5bbbf00109e801L,0x85b92ee338172f1cL,0x609d4f93f31430d9L },
51641       { 0x1e059a07eadaf9d6L,0x70e6536c0f125fb0L,0xd6220751560f20e7L,
51642         0xa59489ae7aaf3a9aL,0x7b70e2f664bae14eL,0x0dd0370176d08249L } },
51643     /* 17 << 140 */
51644     { { 0x5dc386d0a8790657L,0xa4fdf676bc4d88bbL,0x1b21f38f48bc6c49L,
51645         0xcdcc7faa543a7003L,0xea97e7aa8c9cf72cL,0xa6b883f450d938a8L },
51646       { 0x51936f3aa3a10f27L,0x0170785fdecc76bfL,0x7539ece1908c578aL,
51647         0x5d9c8a8e0f3e8c25L,0x8681b43b9e4717a7L,0x94f42507a9d83e39L } },
51648     /* 18 << 140 */
51649     { { 0xaeac64c96f089b59L,0xecfdc92b65f9d762L,0xddde5024f750daffL,
51650         0x82c01c1c0f707e73L,0xc70aa9d4ee20adb5L,0x27f6799dbeb0e60fL },
51651       { 0x918ad262520aa514L,0x2bb1362f8d13eae0L,0x21b60b46a9d1d43bL,
51652         0xf449e2d4767ab86eL,0xf42b09948a5a496eL,0x3b26006b853f2a3bL } },
51653     /* 19 << 140 */
51654     { { 0xbbe11ca8a55adde7L,0x39e6f5cf3bc0896bL,0x1447314e1d2d8d94L,
51655         0x45b481255b012f8aL,0x41ad23fa08ad5283L,0x837243e241d13774L },
51656       { 0x1fc0bd9dbadcaa46L,0x8df164ed26e84caeL,0x8ff70ec041017176L,
51657         0x23ad4bce5c848ba7L,0x89246fde97a19cbbL,0xa5ef987b78397991L } },
51658     /* 20 << 140 */
51659     { { 0x364d5dfda6140b89L,0x30e4a48efdc9105dL,0x13f6276018a47151L,
51660         0x18ad84cfa17a2853L,0x5f315c93988cb37bL,0x90f9cb701af64ce3L },
51661       { 0x020c67db029b6ffdL,0x8989ccc62ce3528dL,0x9bb4f9844d00ee63L,
51662         0x0b052413a70b4ca9L,0x7dee36dcc96b4a07L,0x226db70ea7888508L } },
51663     /* 21 << 140 */
51664     { { 0x111af1b74757964dL,0x1d25d351ddbbf258L,0x4161e7767d2b06d6L,
51665         0x6efd26911cac0c5bL,0x633b95db211bfaebL,0x9bedfa5ae2bdf701L },
51666       { 0xadac2b0b73e099c8L,0x436f0023bfb16bffL,0xb91b100230f55854L,
51667         0xaf6a2097f4c6c8b7L,0x3ff65ced3ad7b3d9L,0x6fa2626f330e56dfL } },
51668     /* 22 << 140 */
51669     { { 0xcd9b76b6a92f4e61L,0xa464f5225a00d902L,0xb64774e68a583f92L,
51670         0xc7dc2030bee842a8L,0x594743ea5d2f27ddL,0x4c0ed28ef3c54609L },
51671       { 0xd763346d4b1dfb93L,0x8ea291dde1bed2eeL,0xf26d4adbd6d34ae1L,
51672         0x74b8d24e54ea3529L,0xe20490e150062077L,0xf67b7a9092d6c19cL } },
51673     /* 23 << 140 */
51674     { { 0x3d28bf2dffccfd07L,0x0514f6ffd989603bL,0xb95196295514787aL,
51675         0xa1848121c3db4e9cL,0x47fe2e392a3d4595L,0x506f5d8211b73ed4L },
51676       { 0xa2257ae7a600d8bbL,0xd659dbd10f9f122cL,0xdb0fdc6764df160fL,
51677         0xff3793397cb19690L,0xdf4366b898e72ec1L,0x97e72becdf437eb8L } },
51678     /* 24 << 140 */
51679     { { 0x67bf4c98e11df408L,0x8e105c66d299b156L,0xfde3922e901b63c7L,
51680         0x7fd57218c184ac91L,0x6dd2ea5cebcdc105L,0x1c4956c0aef7653fL },
51681       { 0xd6fac6429c1c11a1L,0xeda44f663d230d5dL,0xecca2241e6902ccbL,
51682         0x85962a1f2700870fL,0xc5ca32c97864a291L,0xe55e974af6c8d3d9L } },
51683     /* 25 << 140 */
51684     { { 0x81dcea271c81e5d9L,0x7e1b6cda6717fc49L,0xaa36b3b511eae80dL,
51685         0x1306687c3cd7cbb3L,0xed670235c4e89064L,0x9d3b000958a94760L },
51686       { 0x5a64e158e6a6333cL,0x1a8b4a3649453203L,0xf1cad7241f77cc21L,
51687         0x693ebb4b70518ef7L,0xfb47bd810f39c91aL,0xcfe63da2fa4bc64bL } },
51688     /* 26 << 140 */
51689     { { 0x0af51a2025f7b355L,0x35fc45d58d8081bfL,0x0cf3036d0ab30d16L,
51690         0x2bd47f919109cf76L,0x8be09360ec7f12beL,0x99fc291be8dcdca9L },
51691       { 0x385b89868135b12fL,0x272ac288f4ec52dcL,0xe7ca370cce09b043L,
51692         0x94655816251f4c4eL,0x5c1dea972d40a755L,0xe8977234a4b10406L } },
51693     /* 27 << 140 */
51694     { { 0x82c1c684eaa66108L,0xe32262184cfe79fcL,0x3f28b72b849c720eL,
51695         0x137fb3558fee1ca8L,0x4d18a9cde4f90c4eL,0xc0344227cc3e46faL },
51696       { 0x4fd5c08e79cda392L,0x65db20db8adc87b5L,0x86f95d5b916c1b84L,
51697         0x7eda387117bb2b7cL,0x18ccf7e7669a533bL,0x5e92421cecad0e06L } },
51698     /* 28 << 140 */
51699     { { 0x240fde37b21b2632L,0x6b878ae68ca0f16fL,0x072d9ded0bc32ebeL,
51700         0x8c2552bc29840743L,0xb58327b003b34f8aL,0xa51598ea71dabbfdL },
51701       { 0x337361f7d4f461c6L,0xae88972dda1de4b2L,0x9ec86d7ade7e8c2eL,
51702         0x607de383f23f19e0L,0x0cb144c27d234103L,0x00878a228f0c3411L } },
51703     /* 29 << 140 */
51704     { { 0x26063e124174b08bL,0xe621d9be70de8e4dL,0xaea0fd0f5ecdf350L,
51705         0x0d9f69e49c20e5c9L,0xd3dadeb90bbe2918L,0xd7b9b5db58aa2f71L },
51706       { 0x7a971dd73364caf8L,0x702616a3c25d4be4L,0xa30f0fa1a9e30071L,
51707         0x98ab24385573bc69L,0xcbc63cdf6fec2e22L,0x965f90edcc901b9bL } },
51708     /* 30 << 140 */
51709     { { 0x265f7236e22b29caL,0xe36c3c3daa62691aL,0x73410e6ed2e1bad1L,
51710         0xa182a579a5743cecL,0x2ca67274c22b0453L,0xc698fe35546e52e6L },
51711       { 0x60b3a519890e9155L,0x24312c3c2b91dbc3L,0xa6d45050282911d9L,
51712         0x3781933efd249e1eL,0x2e0cbb93e26d023aL,0xfb479267bf27687aL } },
51713     /* 31 << 140 */
51714     { { 0xd53b592d71e15bb3L,0x1f03c0e98820e0d0L,0xce93947d3cccb726L,
51715         0x2790fee01d547590L,0x4401d847c59cdd7aL,0x72d69120a926dd9dL },
51716       { 0x38b8f21d4229f289L,0x9f412e407fe978afL,0xae07901bcdb59af1L,
51717         0x1e6be5ebd1d4715eL,0x3715bd8b18c96befL,0x4b71f6e6e11b3798L } },
51718     /* 32 << 140 */
51719     { { 0xaff4782231cb94c9L,0xf1b5a0b7803c1af4L,0xbeb85f8d2ef696a9L,
51720         0x8ce5baab4fa94fcaL,0x0a32f96200d41a43L,0x0f69ad5774f6e772L },
51721       { 0xbe0221af6ccb5157L,0xcb83969a2a4f91ffL,0x78ff85d6a7e49f39L,
51722         0x63006589cb5d3c63L,0xe8e4383596eb65f5L,0x79f59da9ff8adbdfL } },
51723     /* 33 << 140 */
51724     { { 0x3cc0df125df9b6ecL,0x3c18f44e286d6ef1L,0x55a3939e517d0f7dL,
51725         0x42626a32607e97bbL,0x6168e7b2e26ad78aL,0xdcf8e74b9145583aL },
51726       { 0xa7c541a52db84a71L,0x680532c7119210a6L,0x3252035d0a3315e5L,
51727         0x06dc2d5befe7c8b6L,0x940175894e720570L,0xb16e635f2f6a3ec6L } },
51728     /* 34 << 140 */
51729     { { 0x0bd0ed3803e13ce1L,0x44a148bb5868069cL,0x2a79ab57aa5095e6L,
51730         0x943416faffffcf22L,0x98434e8756a1365cL,0x2493315d196dc354L },
51731       { 0x1f89d911b79a3a1eL,0x937140a841dfdd23L,0x05ad36e43b220b8bL,
51732         0xff5e810333594e3aL,0x3119775f893edb80L,0x1fad811627eee584L } },
51733     /* 35 << 140 */
51734     { { 0x55c4377e204f30b9L,0x63550549a1ebd2bdL,0xdd86ee0c5e44f5f1L,
51735         0x8b9d1d9b5d84d999L,0x9ea95a58dda7a075L,0xa465b4a50977e81fL },
51736       { 0xcb491e5558421fadL,0x4617f31c280709d6L,0x5e2751c382e0195dL,
51737         0x698155856f8eefd1L,0x6702166cd16dc160L,0xfc14545c84c85b2fL } },
51738     /* 36 << 140 */
51739     { { 0x27c961f6e8fc35abL,0x1e0c26923a596fe7L,0xc75c7cb804351be8L,
51740         0xfb92bfeb1c425d80L,0xb01d1c909f0bde61L,0x273d1f0c512f7817L },
51741       { 0x4375000df0d71796L,0xc1655874cf53d529L,0xe157b358abddc21cL,
51742         0xb0f91e3e40cedc30L,0x48e26c7272260452L,0x9794a6bf0713f667L } },
51743     /* 37 << 140 */
51744     { { 0x78befaede72c6f0dL,0xc80584210bb2a3ceL,0xcee67a5d52748e21L,
51745         0x08d4a9e8de8ed124L,0xc0393271b5fb9514L,0x39b1df6b20942000L },
51746       { 0x831fd8cfc3d961afL,0x1bb097e3e752daceL,0x279b3924cf2c8143L,
51747         0xa9f8a939b8f5cad9L,0x2b566813bfb8009cL,0xab37ee1df58f0927L } },
51748     /* 38 << 140 */
51749     { { 0xc17f21f5134d8bd8L,0xc75fc638a90a9a1aL,0x032a6f382a22527bL,
51750         0x3c77a72bd20fefb2L,0x559d8a52196e2921L,0x760a3a2c9afcb6caL },
51751       { 0xa3bf5802f162d871L,0xb6b367a5c594d2adL,0x4d440c523daa48dbL,
51752         0xb2a8acafd5b2c18aL,0x50d85d6adc349ddaL,0x3c2e67718a707475L } },
51753     /* 39 << 140 */
51754     { { 0x8254a39d5e1656cdL,0xff457dcaa595e153L,0xf0ddc1936bf62398L,
51755         0x45e1f91a558f9337L,0x8a424d9d91480b33L,0x019f0a412bf61189L },
51756       { 0x66badaa6d49e7b98L,0xb0674512dad636faL,0xc767eceff4c49695L,
51757         0xbe16e6b5ddc80ea0L,0x2bd0bb87febd1ba6L,0x69c9f485fe60eb32L } },
51758     /* 40 << 140 */
51759     { { 0x08cf7d82bff4b684L,0x6abbf429ac4a9329L,0x2454c15ab0c8e0ffL,
51760         0x4782035a70bdb03dL,0x89ff6a41448199cdL,0x07969c9ffd0bf1e5L },
51761       { 0x19d1cc6a83406dc9L,0x4054cab9b4980267L,0xf0f5594e1887d258L,
51762         0x039249e4e09dd987L,0x2b0cd4f9857ddb1eL,0x54ceb29fd8418075L } },
51763     /* 41 << 140 */
51764     { { 0x562693d30843729fL,0xd703202122648488L,0xd7c40e82ec6d0799L,
51765         0x8eacb2496eb6fb6bL,0xddf7074885a5ec47L,0xd70524bf891d5de5L },
51766       { 0x4d17c237c4d01055L,0x4793c6e4b4203cc0L,0xf247d0df1d1bf37aL,
51767         0x406994fa93b007feL,0x4062c29902940092L,0xedc0d949f558c1e8L } },
51768     /* 42 << 140 */
51769     { { 0x9fb3630606ab1fc5L,0x2726c1acc0de4e26L,0x8b2fb5130ec7b070L,
51770         0xf3581a6907bacd4aL,0x97db622c164bf5a5L,0x8103517962327e3eL },
51771       { 0xad3637b0b1d635c2L,0xb894adf949832ec3L,0x0ab5381725685b12L,
51772         0x73ceb46069720ce8L,0xdbd1b68ef5e445dfL,0x57659059c8961eb8L } },
51773     /* 43 << 140 */
51774     { { 0xbd1272a5f73a7cfcL,0x30d3c078de0828e1L,0x5dc0244e1a8f36a1L,
51775         0x87c80cdf585ec2acL,0x46c88d277944584cL,0x588d14d8b2dbe1a9L },
51776       { 0xb42327a7afe7d55aL,0x58add8f98775409eL,0xa45db2fd10590c68L,
51777         0xb98e10bca972b84dL,0xbf5c0ee0a737aeb6L,0x26424f3def199fa1L } },
51778     /* 44 << 140 */
51779     { { 0xb7bb774603c4cd27L,0x5bfe638ad9723678L,0x47d8b4c24a04d064L,
51780         0xdba309383faa45d7L,0xb0fb4308b39dd043L,0x5eeaa33f23ebfa1dL },
51781       { 0xaa5a0ce0ba100837L,0xae025cf6d7667d17L,0x610baf5df480cf99L,
51782         0x8ba0039ead025771L,0x0ff4f75174785f24L,0x910736ef8b7c30b7L } },
51783     /* 45 << 140 */
51784     { { 0x0496b77ac04b7e7fL,0x6f7ea5bbdf8163a1L,0x87a8e8f18f415876L,
51785         0x6e5b6f2e3ee22085L,0x5ae860ca6f529471L,0xc54c8667eb624447L },
51786       { 0xdd06be3de1c7766aL,0x8a8e48ecd2189d23L,0xa4076d3564245444L,
51787         0xc4973a5deb651a4bL,0x3b3e2fd52c4f2747L,0xe9a16a24abde2ecbL } },
51788     /* 46 << 140 */
51789     { { 0xb7f146b890973714L,0x2277873f288ed67fL,0xe6da9d9ee5182317L,
51790         0xa446f9d3562475b3L,0xc5291f9756755d91L,0xe762c5f3c104c2b6L },
51791       { 0x542f90b3dde83d53L,0x758aaddddace5f42L,0x1c8b9775e673f002L,
51792         0x8899c11f74ec42bdL,0xfd9e300a2dbc0dedL,0x6de1c8e4d281f6adL } },
51793     /* 47 << 140 */
51794     { { 0x5ddafb1b2a2f98cbL,0x8dc2bdc429ec504fL,0x27c51b3cc9f43826L,
51795         0xcfd609fccacf5becL,0x642ff85c30dd9f71L,0xcab498e5b6b00ffdL },
51796       { 0x9c7ef286652ca743L,0xda291ae0ab95d7aeL,0xe6f4d2badfbff466L,
51797         0x34afffef9835d482L,0x41a2cfc050db295cL,0x51a08859e6ee400eL } },
51798     /* 48 << 140 */
51799     { { 0xf6fd26cc487925bdL,0xd9b751eef5ef44e9L,0x694a788be372817eL,
51800         0x85f3dc1ae8c90c31L,0x8c90c6bf15aa0ce5L,0xb52a5d83f01bb223L },
51801       { 0xbdae01dddf9c3315L,0x941fa6b663ddfc56L,0x50ddff4ec2548f24L,
51802         0x54a49868d12802a7L,0xcd922fb6404d9240L,0x88d7f41f957f6d1aL } },
51803     /* 49 << 140 */
51804     { { 0xbfd0a17e4c4c87cdL,0xc6c76ebb10b614bfL,0x721d8b4fd1c594a9L,
51805         0x1ff70b2daff65d09L,0x2698f57ce50ad026L,0xf4ac3f5627a92e38L },
51806       { 0x1114d3392c143ba0L,0x7fafa6b97f8e9b0bL,0x506f11edd82a2500L,
51807         0x4df1087fe0ad9ca2L,0x85509ad9fdfecaa2L,0x733c4f8293bd022dL } },
51808     /* 50 << 140 */
51809     { { 0x3b9de3494233d6cdL,0x9a360917a8f55d63L,0xbe79cdfd90662136L,
51810         0xbb3d8fd7cbf3f02aL,0x5d0d4eb81d61e485L,0x85b485215484cd65L },
51811       { 0x77580c810fc5cbb1L,0x4b36441bd8e70ff2L,0x50ccdec1b2107a8bL,
51812         0x6b7f97c945a45893L,0xb818859b9572a173L,0x864dc632d94bd9beL } },
51813     /* 51 << 140 */
51814     { { 0x13bb6b113fee0074L,0x4c02520ed1059617L,0x5beb793ccf71f07aL,
51815         0x15a8d28d46d4c54bL,0x9889a8948b89fab6L,0xd00fdcb492623b75L },
51816       { 0x1c7963572939a84cL,0x4b85d94d6221a244L,0xcc66b5bad1fd506dL,
51817         0x866271042a06ca91L,0x4295fc6a49bb18c1L,0x05a81eea341d93e4L } },
51818     /* 52 << 140 */
51819     { { 0x895dbf20df8111ccL,0xec8297be2906fb2aL,0x4ddd6f22b94c3f53L,
51820         0xec55cc738ecbd552L,0x549d3145ef343a0bL,0x9b19220c3b4858d8L },
51821       { 0xd5bbf954bd0c2f11L,0x9cacae0cce8c221fL,0x87e6cbc1f6a3dbc5L,
51822         0x7ce5c9b6e37ebcb2L,0x654339ef50eb3c8fL,0xeac7f343f3674f55L } },
51823     /* 53 << 140 */
51824     { { 0x723969a3dd8d5580L,0x4f6dd5c4a30edd79L,0x5b29f3f5a4d7ed53L,
51825         0xe17a12bd11869af9L,0x63d01e02dc4c4c1cL,0xb43b904466a691e9L },
51826       { 0xab58d45ad1bbbcbeL,0x1e9b166322e8a57bL,0x88b6d3bb6684cdd9L,
51827         0xb944dee1ddaf3976L,0x70a4a121c347c41fL,0x7e93fa26fd1c217fL } },
51828     /* 54 << 140 */
51829     { { 0x5df68a1b584da350L,0xf378c367d72cd093L,0x5908ac0033dc31a6L,
51830         0x89bb976b7ca65b9cL,0xefdadfe237dcf670L,0xce22b5ba0011f3e7L },
51831       { 0x94d2c115b7d27bc7L,0x2e6763498761afbfL,0x3c0477829eb8185fL,
51832         0x634c8c5531f7635fL,0xf8fb5494d4d0fc53L,0x5a905615530ee2c3L } },
51833     /* 55 << 140 */
51834     { { 0xd28e59a0940c9809L,0xc208ae4f01b9f39fL,0xae1cb420b3630002L,
51835         0x739950501289d72bL,0xec24392805fcbd8eL,0x5b592df51f843891L },
51836       { 0x0d7602303f59f374L,0x32b6e643cae9f3ecL,0x94a25696e3dcc436L,
51837         0x657ae6aa8a059dadL,0x0df91017edd1505eL,0xfb1ae06f7b518d81L } },
51838     /* 56 << 140 */
51839     { { 0xf5bd119ad84c8a53L,0x36c5410f26928a6dL,0xf340f2bc0eb42b83L,
51840         0x8d93a66cffeffe84L,0xff59141d64310b9eL,0x2d509d7aaf69e00fL },
51841       { 0xf0f034ae1390628dL,0xf9089c720c38b563L,0x7462988e4e8df0daL,
51842         0xe6041dcaa7985905L,0x86295326d3b7274cL,0x5c8bf249075aa31aL } },
51843     /* 57 << 140 */
51844     { { 0xb08d098b9e423b93L,0x8ae94622029d192bL,0x05335f68fd67f1c4L,
51845         0xf3cb831f6e8c1e57L,0xf84a7a54a50a776bL,0x99930a48dc49c28bL },
51846       { 0xdac2ef8f1b833418L,0x87a4ca7829fda2f2L,0xf47f23079c0e9e7bL,
51847         0xebc1c2de46aeb3c7L,0x544f76836408bfc4L,0xa01b094b86c6cd44L } },
51848     /* 58 << 140 */
51849     { { 0x8e81bd1c06841f10L,0x3fc24a346c045063L,0xbb2be2dc85bc7ebfL,
51850         0x32523efbc341fe12L,0x1ac9f6b116508a41L,0xb6b7fa1df6ac4426L },
51851       { 0x2614c995fb685157L,0xe452b94dace46bbcL,0xccda1adabc453b4aL,
51852         0x32d32574fb4fac48L,0x7e43920c9d7d90fdL,0x9d6e959417a08456L } },
51853     /* 59 << 140 */
51854     { { 0x2c90f95bdb1f005dL,0x801089a2e16444a3L,0x2f2944ed7a724ad8L,
51855         0x0dfdd065de135e95L,0x510ab3eaafed3817L,0xdba075380855fbb5L },
51856       { 0x905f78bda10dde49L,0x63786348956a4057L,0x3d420ff0441530aeL,
51857         0x7a9968bfd1488ff0L,0x97479bfbca4dce2eL,0xf371985356f76255L } },
51858     /* 60 << 140 */
51859     { { 0x8102fa85bbda55a7L,0x6cbafe0de96c5eb3L,0x517720eb26aa52c7L,
51860         0x0ee110a98c030e47L,0x5a058569d4afe2c1L,0x29965b44262bbc0dL },
51861       { 0xda017ec04996daf5L,0x1781e7b84dfb810cL,0xdbe148350c8a5cf6L,
51862         0xd151055dd92ff62eL,0x5e4f48ba2932a708L,0x77e163d95f28bb43L } },
51863     /* 61 << 140 */
51864     { { 0xf6c5998c48bc9bc9L,0xb25ae99e2db132d7L,0x17f29131fb934e7dL,
51865         0x31b96a79d7fb5430L,0x3fad00391971cabaL,0x7f809e56cf3d5e33L },
51866       { 0x1a4f705a9ede6055L,0x3cab6c6149c2d054L,0xb616adc47945b589L,
51867         0x842b8652f342ee03L,0xa22fc6a67bc36a4eL,0xffdfee262c89a4fbL } },
51868     /* 62 << 140 */
51869     { { 0xac6b2727dab13b10L,0x8b4fa7807351ac35L,0x48243c245692808aL,
51870         0x724897f01fbc5d24L,0xb635fe5e2c69bd93L,0xab26453338d5d5b2L },
51871       { 0x368b2c07bc578c97L,0x94e02c9226fecf25L,0x768de4d41f473908L,
51872         0x58feaadee445d405L,0x1f1380d6e42a2218L,0x2904b4542154dd5eL } },
51873     /* 63 << 140 */
51874     { { 0x4e28b938ca2ec0f3L,0xd4af48d795b1c113L,0x33ffb9c222f2275aL,
51875         0x2a734af97b57b2e0L,0x1555ba38d08a45d3L,0xd0cae6c57a05837cL },
51876       { 0xed04c869c4e78884L,0xa7ba74726f3d56d3L,0xdb7b831ef6d68485L,
51877         0x225798677e7d0a4dL,0xd2d702a94c3eef8cL,0xdaba503869a83e29L } },
51878     /* 64 << 140 */
51879     { { 0x082ea61d10eeed24L,0x7c9d5ade143fd59dL,0x7d33df962e54f5cfL,
51880         0x340b0d36e39dc6abL,0xd97a8b848d179b13L,0x88184bb0288d388cL },
51881       { 0x2237e507e116ae6dL,0x3e97b063211b2cf0L,0x645f8bcb42be7459L,
51882         0xce2b0f54de2176b6L,0xaf570a09d1e2f09cL,0x110adf5657fdc001L } },
51883     /* 0 << 147 */
51884     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
51885       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
51886     /* 1 << 147 */
51887     { { 0x158bfe27bcb6db29L,0x967212410054d963L,0xf07b153b8e71aca1L,
51888         0x5e67698171b11643L,0x77b7dd7dd04e2f90L,0x07814aa6f0dcf109L },
51889       { 0xd3bab2a4fe1d0b1eL,0x50abba31be69e691L,0x54fe99afc6f53cd9L,
51890         0x071f2a4f628039e4L,0xf1f44181b183aa16L,0xdf0138e05010f6f9L } },
51891     /* 2 << 147 */
51892     { { 0xb1e365019c77ca60L,0xfe084a2301018e14L,0xbf451d2ca4bfdcecL,
51893         0xd210892fb29cdcfeL,0x5b12bcd894514871L,0xd03ca18c1809b1e3L },
51894       { 0x09b243115858e4eaL,0x37b30d50e57524b4L,0xcef0a16b5de334b5L,
51895         0xfe0bd1e20b116076L,0x54e4b48289ae2bf4L,0xfbcc5e1a68c8a937L } },
51896     /* 3 << 147 */
51897     { { 0xa5023e1364be0f56L,0x6a7310e00046f45cL,0xe0af09aeec8700d3L,
51898         0xdea5fb7ceb2d38f0L,0xc038eae6859852e6L,0xd515fb4c8c34f04cL },
51899       { 0x546b778e1488c207L,0x8cf4f1146258d8baL,0x474e60d85182c96cL,
51900         0xcd0387303dbde757L,0x387232f876ab01ffL,0x277614f628231392L } },
51901     /* 4 << 147 */
51902     { { 0x309b1eb33ef5a413L,0xa7607981a81f43fbL,0x87c2b81ebf8a894cL,
51903         0x27a40bce0d293293L,0x7f4c315be4bf3714L,0x03fdc14e01236895L },
51904       { 0x319c88f8dff053feL,0x146bb448ea3fa121L,0xfcc2a05df0dd1380L,
51905         0xc8d55b024acba9faL,0x871358de5927313eL,0xfd1d81d317ce294aL } },
51906     /* 5 << 147 */
51907     { { 0xa135970c7361138aL,0xd67eddb5b7d50260L,0x313c6e9bc4d5311bL,
51908         0x4f503bf28423e5b4L,0x17dc4b6f44f3fe83L,0x15b7bdb9ccf1bbcdL },
51909       { 0x0ce4d64ea11b9896L,0x050b0edebbb6b0eaL,0x85531293bf5db990L,
51910         0x9db3b964520d095eL,0xb45ec235bd2d4e88L,0xf88a9e6215ee5ba1L } },
51911     /* 6 << 147 */
51912     { { 0x10777189c1a21254L,0x7d8d3966ca593a6cL,0x261ab515120380e6L,
51913         0x453c858fe13577d1L,0xb1f6bb58f3862db1L,0xf8ff48b8b9529e1cL },
51914       { 0x03f63a417b60b400L,0xdc248d96bba66b3bL,0x8423048b756e5af2L,
51915         0x4d978ed31c984befL,0xa06242995ba00f3eL,0x0bed7b454f4d19e7L } },
51916     /* 7 << 147 */
51917     { { 0x9ef52e3d6524f389L,0xc5b157c5f6ac19eeL,0xdca7a72ab5d42f7aL,
51918         0x2d2e8d72fa0051dbL,0x3a6ff9243f4a4f60L,0x0ae997af340e7977L },
51919       { 0x33dd395e269db4e9L,0xf95c3683616b9dc3L,0xb86a066122d516a7L,
51920         0xd50c582cad913df8L,0xac8b8efef550afbfL,0xf34fcab01d88728cL } },
51921     /* 8 << 147 */
51922     { { 0xd3797831ff63ae69L,0xa753de02ce4c7eafL,0x2ff7a6a611a4e339L,
51923         0x904f86f05328043aL,0xe29d31c012e9f7ddL,0x8825a639c0a51904L },
51924       { 0x070c2696ebfc2cc7L,0xc03ce643c5f7a943L,0x5b970d0c12c8a1f5L,
51925         0x572aaaa1ab352a83L,0x63df45a90c5eb0c7L,0x95c951e1d4977599L } },
51926     /* 9 << 147 */
51927     { { 0xf5aefd5572ba3741L,0x7ab81965f5fe816dL,0x597d15d546752cefL,
51928         0xaa79a0822a3c142bL,0x038ddfdd3af5dfe9L,0x9f4dc166755c9e07L },
51929       { 0xf34224dfb9165297L,0x96e7ff6e4e3fd907L,0x5d7f3c821727beb6L,
51930         0x7098493dd6af73ceL,0x6b9358fbe00dfa4dL,0xefb2634a96e74870L } },
51931     /* 10 << 147 */
51932     { { 0xe35daffe2e4c6299L,0x1f9e33935915cd16L,0x93f05a40f009a48aL,
51933         0xa4a801fd308a81c6L,0x75e5dc467e885426L,0xf0bc7d5d4629ff05L },
51934       { 0x356b879bdbd812c2L,0xdb5eb60001629849L,0x11c9856eec2dd55aL,
51935         0x20f0443880f0c804L,0xc0b5e3e21801b217L,0x7ceba67d6ea097b8L } },
51936     /* 11 << 147 */
51937     { { 0x7a1bc5d85d08d3f0L,0x9ecce2a8385ef3a8L,0xae93d42b3c1b2927L,
51938         0x81a3a60719ce9447L,0x8d6b2d3d0eda597cL,0x5baabad60eea6dc5L },
51939       { 0x2cb372642741608aL,0x3b1148d6f0202a01L,0x6e85272f52931f5dL,
51940         0x49bf47596a2e601aL,0x5ec0418443279ddcL,0x7d052cac6ec080ddL } },
51941     /* 12 << 147 */
51942     { { 0x01c2df8d3bb02d0eL,0x874e43afe26f388dL,0xe198341c8360fa6aL,
51943         0xe67f8092c52bb2d6L,0xf944dc63a02efba5L,0x9a9c02d92c12332aL },
51944       { 0x39684f6ca8cb6bd5L,0xbcc1828e26bc9535L,0xb7fb8eb646594725L,
51945         0xbb4f5f05793c32ddL,0x3ef3c33845f94b55L,0x228e0e7d09eac277L } },
51946     /* 13 << 147 */
51947     { { 0x80d9bd388aeae732L,0x2be676dccbeb6443L,0xef4d056bded9ad31L,
51948         0xc4fea44f349e5d0eL,0xb66c35d28d95db86L,0x210c3d4aae9f5d3aL },
51949       { 0x5c0c5b9c1582982bL,0x50a529be93aed9a4L,0x88f769a384c77818L,
51950         0xc0970b4269776a3eL,0xbf3e5ee022a1cad4L,0x705c0b29b80187eeL } },
51951     /* 14 << 147 */
51952     { { 0xefd26dca727cacdeL,0x6290fedb5fcdb147L,0x9f108a89e1830a96L,
51953         0x7e8e36813e039a02L,0x1747b3e9256fbb3bL,0x5aa0ebffabb3b2f1L },
51954       { 0xcac5818c9fbb9b49L,0x037d66114a94b74eL,0x4081fd4d7a548536L,
51955         0xfe2d8e79aa364507L,0xe86ce00ea81a5f81L,0x77b95e9477a9bdb4L } },
51956     /* 15 << 147 */
51957     { { 0x3eadfde5bf06a49eL,0xca88828b33787c62L,0xde6f765022070f63L,
51958         0xcb4e54dc438f649aL,0x24957c77169727d0L,0xa2e7781cdd2a92a3L },
51959       { 0x17a1d7ddc38885f4L,0xb75716717605c408L,0xfdbbcffc8a2323f5L,
51960         0x11666bd2c955456cL,0xf8b94fa2517f27f5L,0xe101927fee002499L } },
51961     /* 16 << 147 */
51962     { { 0x2c5b0e42bca07a42L,0xbe57f3597a0dffa1L,0xace485959aa90727L,
51963         0x32be886af658699bL,0xce75d6c6da3b18e6L,0x9d563e4f69caf667L },
51964       { 0xc17c66cf065eb772L,0xfbe123814df9f6efL,0xceb80041623db4efL,
51965         0xe75615b2c74762e1L,0xade8a5438671c52fL,0xb713c401cacaf2ecL } },
51966     /* 17 << 147 */
51967     { { 0xc740669ab01b20dcL,0xd873f3f1abecc3f3L,0x0d8290402db73d1cL,
51968         0x147aaafb99198d33L,0xca66e755d4e7d7e4L,0x8747298cb2cb752bL },
51969       { 0xd9d58d29c43762aaL,0xa3801a4a15e45d57L,0xa747fa3f454eaf2aL,
51970         0x26c79cdd0c067c77L,0xf15404cea24fe6b4L,0xe2add5ec77fec1c9L } },
51971     /* 18 << 147 */
51972     { { 0xc45064dbd71a7744L,0x1900bb8f04a6f3cbL,0xd592585a76c2dd6cL,
51973         0xabbbd6d862b95d26L,0xb0db482b1d2e180aL,0xf459430184c9dea5L },
51974       { 0xd30b162a6e5ec460L,0x90838e57e4b35476L,0xab4b7c80f9356687L,
51975         0x72c2c009719f347aL,0xd5d01fcf920d187dL,0x47426f1e0afe06abL } },
51976     /* 19 << 147 */
51977     { { 0xe6473aeaafb2f584L,0xd5395475c44ab7a2L,0xcba2c240bc27e864L,
51978         0x201735cc742c1c9bL,0x8cb4886951263febL,0xb52706ba4fd2cd5bL },
51979       { 0x028445755a2dec94L,0x978e79d6a4be7b6dL,0x5a68d8103c4742f8L,
51980         0x9c917f48b301ad64L,0xa6a7d5bd684a6ea6L,0x251d61327c978749L } },
51981     /* 20 << 147 */
51982     { { 0xdc7e39ee0ae2a7caL,0xcdd3c235e6b7dee9L,0xf9624c299368c8a3L,
51983         0x2086bc904b21951fL,0xf7990a1f57e0e6a3L,0xf170dd75e686da8cL },
51984       { 0x4a82719a06da9714L,0x3a78e35e24274685L,0x1c3965e1c67712f8L,
51985         0xc6c26eb62f164e3aL,0x1129a467381fb91fL,0x896022108443ffddL } },
51986     /* 21 << 147 */
51987     { { 0x25e561bd808c4ff9L,0x08c9f2758c0cf1c7L,0x9af6165b59599115L,
51988         0x59f06a4bb4b415f7L,0x3a9d8ca5236e2650L,0xc8fa3bc61b48ebdfL },
51989       { 0x5e1896193404846eL,0x6d1d803b378a5a46L,0x672fe2bab812d5dfL,
51990         0x3ec27a7f04c6ddc1L,0x9c5ff08c0cee3357L,0x9f465babae8d37d3L } },
51991     /* 22 << 147 */
51992     { { 0x0057f60756a0b6bbL,0x46a6e9949c1e24daL,0x1c283f859baaf618L,
51993         0xd75e731be878a354L,0xf9db13388bf2ca71L,0x0f14adeea9022f59L },
51994       { 0x309f04aa6c14666fL,0xe6cec2aa552d2da7L,0x9f27eaba218d8659L,
51995         0x9b3165d3c268561eL,0xc7e3afcb90ae19efL,0xb840170bcb329e68L } },
51996     /* 23 << 147 */
51997     { { 0xf6b9a32fab95aa95L,0x1a1e06c387e1c3c5L,0xcfb7ecc5317f1c2bL,
51998         0x12953ce7999d2bcdL,0xcaf5f0229e3c5a01L,0x0c9db571305ac94cL },
51999       { 0xa423d26cafbc860aL,0x82fbbd3dfe98409dL,0x455aa9926652ac17L,
52000         0x6916e7d6f9428029L,0xdcfbd65099822714L,0x5de152a13f3c72d2L } },
52001     /* 24 << 147 */
52002     { { 0xe6d039ef467eb167L,0xa7e0959d74696cf9L,0xf3a19b9d7078d8a0L,
52003         0x5d4ec99c07cdc6f6L,0x4842d0f98386eed8L,0x48f5ab80545fc0d5L },
52004       { 0x8906fc626d39c2f7L,0x1c050d691bf5366aL,0xac506c579f54d0d6L,
52005         0x9a356a6ef9e4b94cL,0x62632c5108a75e61L,0xfc1b9fa5c6951dc2L } },
52006     /* 25 << 147 */
52007     { { 0x84ba4069d034ec62L,0xd55b42f6f169349eL,0x78dce88d17de2b22L,
52008         0xdadae679204ec730L,0xfad5ec6b5357f5e5L,0x330bba18ccc0d0afL },
52009       { 0x8419755c4a566c71L,0x29c56c5fbfe57083L,0xe42a7c52598cad77L,
52010         0x9d81623f5fcf1dc0L,0x978eb12864615869L,0xc837262a9c2a6f35L } },
52011     /* 26 << 147 */
52012     { { 0x917747f99ee0628bL,0x5d711303566cf048L,0x206d53f15b77f58dL,
52013         0xe104bc12667a86ddL,0x158f8d253505380fL,0xf5b32ad4616e821eL },
52014       { 0xdb67191a3cdfe797L,0x61b58589147e1756L,0xb7927e12625d0efcL,
52015         0x48d999d008bca937L,0x335c6f5b7b02689bL,0x4f0994a9d8149b7eL } },
52016     /* 27 << 147 */
52017     { { 0xe7ba0870df6ae3beL,0x661373f0166cd7d9L,0x369d361d8627f3fcL,
52018         0xca06d544cf6ceb36L,0xc819e0ea34b5d425L,0x80c1ab716ffd2827L },
52019       { 0x3fb8c0b520b4161cL,0x3647e67b3734b87eL,0x9c3a14b203e6c9cbL,
52020         0x320ed1c1c3620486L,0x6d77d46b5286a22fL,0xbd6036c1bc74a266L } },
52021     /* 28 << 147 */
52022     { { 0x125951a52e6d5433L,0x7d672aee6a6013d4L,0x6ed23f2560831997L,
52023         0xb0e219ae438c75c3L,0x6851dd4bace91d00L,0x84704f7d30f19991L },
52024       { 0xd744cb32d0107170L,0x15f51a63b0cb6796L,0xe14712cf5a5807d8L,
52025         0xff89f0c5dbfd612cL,0x0c314718bd021483L,0xf9ccd3b11b4b76d5L } },
52026     /* 29 << 147 */
52027     { { 0x36121d0909b6398fL,0xd9ad591369069016L,0xd3a08c8469cdcfebL,
52028         0xd92ae9b2b03e1e4cL,0x1620c549e9b6284bL,0x5860431227ab9432L },
52029       { 0x4e1d3134aa314da8L,0x89207aad70910cbcL,0xacee236badff9190L,
52030         0xe6390f7cf6eb6df2L,0x0dfc5a5cffa91d75L,0x3474104aa0e7f48dL } },
52031     /* 30 << 147 */
52032     { { 0x00b75b851871749cL,0x063b748ea00faa20L,0xa516e09f90257503L,
52033         0x9ffc43981c800098L,0x49f011f871b00fa1L,0x6fc80517443268bfL },
52034       { 0x2802e2bf24a24acaL,0x96fdc71edde88ab9L,0xe3eff1f997e661a4L,
52035         0xae5c34e13cb321f8L,0xf863263e301c8ba0L,0x3c3eeb7b093e186cL } },
52036     /* 31 << 147 */
52037     { { 0xc0f51229e7aa3325L,0x3abde561fa93ec80L,0xd7e5317f4e6df2b2L,
52038         0x4eefcc76bc832652L,0x9dce52905d054a1dL,0xee2939da2a6f52e2L },
52039       { 0x8faa1d3e092b5422L,0x77f55f7f9ca6338cL,0x6dadad8f6546d37aL,
52040         0x0ef4922ef3bf7cb1L,0xfcf41c23200ccc57L,0x591e208362aa0372L } },
52041     /* 32 << 147 */
52042     { { 0xa933aaf7a4886619L,0x9ec1915f4af13c7fL,0x25a9dff8854de496L,
52043         0xa8b31d9b247bec15L,0x468a25c84661e58dL,0x8989c046786a0707L },
52044       { 0x282db8cabb66922eL,0x73bf240d45ca29ffL,0xa2c40faaeaeda06eL,
52045         0x69632929add94b47L,0xc72354f6b0069076L,0x8d197fbf7878e92cL } },
52046     /* 33 << 147 */
52047     { { 0x7bd8195662267b63L,0x9352be73894a4ed8L,0x62568211d0bfdfdbL,
52048         0x7974999285698b05L,0x897ccd584412ea21L,0xe4cc4ddcb2f25225L },
52049       { 0x808539bdb4a1d924L,0x619fee34bdebf750L,0x47ed5b3473aea42aL,
52050         0x91e07a9b94ba376aL,0x218f6885edb27e08L,0x4feb09e6c4214344L } },
52051     /* 34 << 147 */
52052     { { 0x24bf9fbbf3e4bc93L,0x8973b72471151bfcL,0x8e33b753a85eb707L,
52053         0x13eba76e50adc461L,0xe445e8e144dd9d2fL,0x8729ec22b1592a0fL },
52054       { 0x9a13bf315ec24808L,0xe6ae840c2e95cabbL,0x634f3416e28cdf4aL,
52055         0x34d3349b9278cd7bL,0xd74990c542b912b5L,0xaf94b104b2430c71L } },
52056     /* 35 << 147 */
52057     { { 0x6d26cd01580b15a5L,0x5af25c06dcd849aaL,0x05b00800ffef39f8L,
52058         0x8cc59e06f9e0208bL,0x920f69540bc19bf9L,0xc06c4df97faa5ddeL },
52059       { 0x9a26a3f4770351d4L,0xda015bd3443f40d9L,0x1afd829c740f1942L,
52060         0xb108a8a6566e6158L,0x118e50a9a35e5d37L,0x94cac90eab72a3b3L } },
52061     /* 36 << 147 */
52062     { { 0x01f7968e60cb465cL,0x4efeffb796e0af3aL,0x6f9016e7066ad6aaL,
52063         0xa8ae30e88743aa97L,0x7b77d3e0b7d55766L,0xe1773661c6b3fadeL },
52064       { 0xa52fa7bc88f5270bL,0x4de08cb39f7f811cL,0x6021536f9bc34254L,
52065         0x47bd18cf4068e3d2L,0xc91bc312ce16889dL,0x468659ea929b71f5L } },
52066     /* 37 << 147 */
52067     { { 0xa5a2a3b3225b532aL,0x5ed77864167f7874L,0x2b5d475037ae42d7L,
52068         0x9bd62f14433b243fL,0xe8dca1b2eea90992L,0x1ce44e53ef5e0624L },
52069       { 0xd92c7bf61d3d7173L,0x83c1e65424c19a94L,0x59dce036eafe8941L,
52070         0x23478c50d81014b0L,0xb89214bbe65a18e9L,0xf9fd325ea05d9fb6L } },
52071     /* 38 << 147 */
52072     { { 0x2c4bbee73965ed81L,0x58b6a8766c1a47beL,0x7c8d94f71a67dfabL,
52073         0x865c9e42ac6ae9e4L,0xa63a0e42a3114c18L,0x7432c6c92bcf8169L },
52074       { 0x1927723c7532bd7aL,0x20b75c7201e5781eL,0x1963e16919d57f9cL,
52075         0x05427a3cb10e3798L,0x31bbc661cebc82a9L,0xdd88383ac3862997L } },
52076     /* 39 << 147 */
52077     { { 0xa0ef513d4adce457L,0x942aea7df9f906d8L,0xe52a2bb5fe22c5a3L,
52078         0xfd9fff1f8dec9ca1L,0x19b0e7a27913f99aL,0x58c45dd205660e97L },
52079       { 0x6722c47ff06d3c2dL,0xe4927a002a4d127fL,0xdc647c1ef40f46a1L,
52080         0x538c8cda7ab7a21bL,0x90227d6cc8015ae8L,0xe62f52dc2d4ec8a5L } },
52081     /* 40 << 147 */
52082     { { 0x69a9ebd8a83bbb88L,0xcbab0b5a29f98875L,0x325e487e4e7611f0L,
52083         0x90aa24b1d955cc3bL,0x840e70a13c264d53L,0x15bcf88bad7f4f81L },
52084       { 0xe47552cc2cf0df0aL,0xcb99973379205ea9L,0x25dc58bd10d5ca45L,
52085         0x0947d7151228b978L,0x9a0204da4f2c7c4aL,0x4377ea4a4690052cL } },
52086     /* 41 << 147 */
52087     { { 0x35da16d16bc7d7afL,0x098c4b0271de4ac2L,0xdaa2407c3655dd94L,
52088         0x5136884c90380d70L,0x3f47052e762f61abL,0xf715107a8dcd6ddfL },
52089       { 0x862a4a6e5d76615aL,0x2b546e1b2128a6f9L,0x5297a3cf40490672L,
52090         0xef2cbdf1b9c765a6L,0x52e71cb4426562baL,0x34d0e3237a84f9b1L } },
52091     /* 42 << 147 */
52092     { { 0x6cd4098d74e7c67bL,0x3bf4193123d2b418L,0x598710ad682135ccL,
52093         0x26ccbfe0172d648cL,0x0c4918c5d84dc9afL,0x346e8b6385065417L },
52094       { 0xcbc7f2efd353219fL,0x93637eea3c4e4863L,0xb18fc69c2dbbd39bL,
52095         0x20614dd45a4b5b0cL,0xcdac0383547adce3L,0xedcdd64842ac8be3L } },
52096     /* 43 << 147 */
52097     { { 0x76ac6c94b4559439L,0x09090af620319667L,0xef433d73a742e3beL,
52098         0xb7ec99eb7cbd7090L,0xcde2579dcb782be1L,0x2a2fb807e75552fcL },
52099       { 0x083f9e982f1eee15L,0xe20f65c167779c98L,0x73c044ff5f23e998L,
52100         0x5fce594269488208L,0x3e4ca86ccace7ba3L,0x5e3f43b8f32c1acaL } },
52101     /* 44 << 147 */
52102     { { 0x3ab171a237b42b60L,0x6501afcc4f20e50dL,0x4f9e22413e3a4298L,
52103         0x3c5834d9be3b3d3cL,0x9607b8cb9be25af0L,0xcc5f6b6f81c723a5L },
52104       { 0x11b9b5d199227bacL,0x2bc5dd9f322cc499L,0x0c3884a0cdbc3a55L,
52105         0x018a8ebefd4f004aL,0xa858ee7ce08741d9L,0xb5bbfa2b5d69b3ffL } },
52106     /* 45 << 147 */
52107     { { 0x57069b4a1b0611b3L,0x24b5421c89da55d7L,0x6433c29dcf9b2fb2L,
52108         0xda9382c67869a1cdL,0x67fbb7a343514903L,0xb3429e35e8b224f8L },
52109       { 0x4058ef1e7ac51191L,0x56283b0cfd4e6114L,0x4eff0caca16fadd1L,
52110         0xe6088db7b6ee634eL,0x94e68bd0ca7bd1b7L,0x0e98796b965ff86eL } },
52111     /* 46 << 147 */
52112     { { 0xf3176014bbd74a95L,0x5dfe36b51bc6c763L,0x4c463aa27d3d0366L,
52113         0xcbd7106cff3b113bL,0x2d660f5a0b6edee3L,0x92d79c864db04c30L },
52114       { 0xfd1067cfd2236e55L,0x1ae21f2d90925a83L,0x8419072ca952c451L,
52115         0x2f268b473d946980L,0x04831991b709ab5aL,0x0d622a70bf72efd6L } },
52116     /* 47 << 147 */
52117     { { 0xec468aecf0440b85L,0xaae6041369cea78eL,0x5a88145d12a30f40L,
52118         0x438c6e3f37a52bfcL,0x41bf603894749b6eL,0x3d38b86267edc2d1L },
52119       { 0xe379125a020a32abL,0x68a6b13a198c3944L,0xed1fb3258be252d2L,
52120         0x76dc8df6e15c37cfL,0x5a6592cb6453b542L,0x372b1998b3347c65L } },
52121     /* 48 << 147 */
52122     { { 0x015c325eb8e79179L,0xf4fc61335b57dce6L,0x27a51e5d78d6858fL,
52123         0x13babcab4dd5f180L,0xfaa19cb1847e499eL,0xe2688ae608aaea61L },
52124       { 0xe20d7edce86100d5L,0xa9b0d46bed2fedacL,0x5e99cc0c1d357dedL,
52125         0x4c1263ab723cac89L,0xad5f3e6ff15e22f4L,0xf25f3950d77dae65L } },
52126     /* 49 << 147 */
52127     { { 0xf3814fdba1c6fb06L,0xbfde395d8d71559aL,0x6e4b2b1c07e00f72L,
52128         0xac0d1aef1e12b111L,0xa4041ea0387dc52cL,0x8004ef4893c80d7dL },
52129       { 0xb311b5c29a770d6eL,0xd4a340bbaf41a540L,0xe96d1dbd9a5391ccL,
52130         0xcd4b19fb45ebf6ffL,0x142556a5dcb6dbe8L,0xf68968ff092f898aL } },
52131     /* 50 << 147 */
52132     { { 0x540a2e35c854356eL,0x6d0eab45f5002153L,0xb8f542bd9a6c488cL,
52133         0xd572d282c6201f12L,0x260bc62781a3eedaL,0x508621af06eaa5beL },
52134       { 0x754eeb205eadc8d5L,0xfe33248f42d4b0dbL,0xf44a1c7ac5529222L,
52135         0x9079ccb574396eeeL,0x6c4bc87db9cbdc41L,0x1ee8982431ee3f18L } },
52136     /* 51 << 147 */
52137     { { 0xb64fc90ed811f25aL,0x310214a2c82c8f68L,0xee559209b5052420L,
52138         0x6055c5b45c1bf95eL,0x414f7c8dedce3bc7L,0xd3438b8a66d3cfb4L },
52139       { 0x687b9f70d3935eeeL,0x553b15ddd3e179f1L,0xccc9961e21ff232bL,
52140         0x3729ac207d322041L,0xf1537630094907c9L,0x3e87f4f903153dccL } },
52141     /* 52 << 147 */
52142     { { 0x2c21e48c7dae4b17L,0xe842930a07ca1575L,0x3a3d6d361cc47ab4L,
52143         0x749dba405fcd07bcL,0x55a538a6f306a498L,0xe85c60be633d42bcL },
52144       { 0x777595f2dafa94a7L,0x1c690529a0400ef6L,0x41485f886bfa23bbL,
52145         0xdead14a1256d9204L,0x74f1a820bbda2f9fL,0xc86554f65fe54284L } },
52146     /* 53 << 147 */
52147     { { 0x03ee764b978ad2dbL,0xec253b0f01c9282dL,0x028e7873fb26c425L,
52148         0x3e1da0436504ba10L,0x68369881531961f1L,0x0365ea56ee435146L },
52149       { 0xf5505ae80c00a6b4L,0xc1ac097403f34fe3L,0x7327b391b5922f68L,
52150         0xe561cedd1845ef9bL,0xaa82258c6a44b29dL,0x23e39cedc4d56159L } },
52151     /* 54 << 147 */
52152     { { 0xf5a07dedd14a3ce3L,0xeda454ec9c47615fL,0x01d6b1562775730fL,
52153         0x3ec02f95fe4d93f4L,0x335806e4dcbd0ceaL,0x3f498d1b51a19d96L },
52154       { 0x9949c853374b7210L,0xb255d34b25980320L,0x3b681db4307b513eL,
52155         0x4137053add10a78aL,0xd9c0f2728dcaae0cL,0xcbeb6b7216031955L } },
52156     /* 55 << 147 */
52157     { { 0xd1b13e72c709af4cL,0xb4b99796c12f27fcL,0x9e56569a05e2c06eL,
52158         0xd8c880631212ba12L,0x8da1a6704e7f8fe4L,0x3bbb314f875bb39eL },
52159       { 0xc56ef7088fbc8a3fL,0x39b3cef2300d21bbL,0x5e755398458e347eL,
52160         0x9f7b84b16c1b2162L,0x278ffd26b08d0c52L,0x7c8a442a9ec7febfL } },
52161     /* 56 << 147 */
52162     { { 0x3c0e2b9737e8e6b2L,0xa2037913575da8b7L,0xeedf0a75b925cbb2L,
52163         0x4f28ec1bc561b405L,0x368fb2742901931cL,0x52b54eee2f26221fL },
52164       { 0x381845b6247812a9L,0xf9bcc9619115a0dfL,0xef127dfecb84d25bL,
52165         0x4256afe5fa10e0a7L,0x0c08a532353a15ebL,0xbbd15b176a91e61eL } },
52166     /* 57 << 147 */
52167     { { 0x3c573b2655574ae4L,0xd3f12e8f2c0be823L,0x5954b69fde9ce60eL,
52168         0xc433991bcedfd1eaL,0x35696716718e950bL,0xce4318664e9cc107L },
52169       { 0xee16b6347359991cL,0x8f05851b1818a113L,0x257a228c3b494b59L,
52170         0x4239f98e156f91f6L,0x2382157c72efdcc4L,0xc82b652cff7b7ac1L } },
52171     /* 58 << 147 */
52172     { { 0x072eee036b7a9a38L,0x42a680cbaef9b327L,0x67311eb8b56fb35eL,
52173         0xf320acf3c7de3776L,0x09c89cc3ed15e895L,0x368501713232345cL },
52174       { 0x5a5fe1104822f90eL,0x64f7ef18c6077b89L,0xbbc5748c8bdfb971L,
52175         0xdf5488334b6209deL,0x02268bf676e7f595L,0x1c7971b447779e75L } },
52176     /* 59 << 147 */
52177     { { 0x90d308b495c9497fL,0x277535b782c903f6L,0x443cd37fc5d7b4c3L,
52178         0x48ebf0acfcaff8a7L,0x8ee8c79e579f25f6L,0xb825ccd8360ffd90L },
52179       { 0x6327be1599fe4be2L,0xc94c68cf59ec2909L,0x0dbf8d4456660ce7L,
52180         0xbb31989b5d510edaL,0x43c8c365c4a2e601L,0x100de78314dcf793L } },
52181     /* 60 << 147 */
52182     { { 0x635ee0f3d33ac52aL,0x609c328dd1970e1aL,0xf28ddf0a09426902L,
52183         0x2a94d4decbbcbbe8L,0x15890cf4ab7ecf5cL,0xb14a405df2dd4135L },
52184       { 0x64659a4fa6d01554L,0x1d1b2c43cc966f9bL,0xb02ee871df0e48b3L,
52185         0x0bd13e47f4dc3ebaL,0xb4763547bb4fc529L,0x868650044068ab72L } },
52186     /* 61 << 147 */
52187     { { 0xe3d60dfac22bda56L,0x021411ba6be2f502L,0xc1dd4d55b35e750fL,
52188         0x708b62cd4d5e1648L,0x234a80c6347b8b8dL,0x53b6fa80f3ba912dL },
52189       { 0x4041b8007b92c92bL,0x636c12524b6dbceaL,0x4ea250d08a1aa141L,
52190         0x9ffa7e35a2ae7be0L,0x765c809cd2844e61L,0x5bcabd922d56de12L } },
52191     /* 62 << 147 */
52192     { { 0x48d594e522205fbdL,0x79c78f1c0862eb11L,0x02a3becdf7798099L,
52193         0xbfe574a8b1ef2ae5L,0x1bfb7779c4781f34L,0x7211dfcf044da23cL },
52194       { 0xe4c3fd7dc3686ef9L,0x14c6e5b5e74210f7L,0xc40a0a0275ab746fL,
52195         0xd2033594621f6369L,0x6bdbbe3d66241d44L,0x014b089ee47f00e9L } },
52196     /* 63 << 147 */
52197     { { 0x93e3a89108e65849L,0xf90a376ba1a712fcL,0x6555d6dff1a48fcdL,
52198         0x984ec5c86a763e90L,0x7a7fe565e55d6b14L,0x12550fe809b2e8b7L },
52199       { 0x21736c048e41210eL,0x72ae44d448ce08f6L,0x02755a2871fecc50L,
52200         0x379da24beb485ee5L,0x394cb7ba66d7b659L,0x49fc9d60ab638c33L } },
52201     /* 64 << 147 */
52202     { { 0x854b05846150771aL,0x35fdd9b4d9ca9868L,0xec8293894c32fc71L,
52203         0x882fad4c9ec8f90dL,0x2d39990dc6c7b9c0L,0x7fbc201bd71a25e5L },
52204       { 0x6b852e655166da7dL,0xc6bde23a3d8c6e36L,0x370011545857f048L,
52205         0x746621fc1ccb9bc8L,0x97e44e63612bb853L,0xabc3b450758da4edL } },
52206     /* 0 << 154 */
52207     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
52208       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
52209     /* 1 << 154 */
52210     { { 0xd25f650804926a41L,0x7236b475514045daL,0x0b36031108b9b08bL,
52211         0x16477aff3fe92e91L,0x6e5f6cb103189ddcL,0x81ff008ec698a38fL },
52212       { 0x02a09218c93adb23L,0x71fcecd3445d8faeL,0x55a15eac8fd6b76cL,
52213         0x1e37ec3611ef96b4L,0xd1b3b3fc30e433b5L,0x4951873351d174c3L } },
52214     /* 2 << 154 */
52215     { { 0x7914213db8c9f82eL,0x7a3e4e38fc038e90L,0x6edae5a126a34238L,
52216         0xe566bf50701ce8c7L,0x3562e87555656e02L,0x48325ebfb4e8efbfL },
52217       { 0x5f10a50466505ec3L,0xd8b9834b8da78aecL,0x49d1fc25cc2f2e40L,
52218         0xe973bb1caf5718c1L,0x9b8825dad2d6b890L,0x7de7885ee2f00f12L } },
52219     /* 3 << 154 */
52220     { { 0xfb0fa0e6494fe64fL,0x4ea468b59a907f37L,0x9bb6d672cbabb7ccL,
52221         0x523c7c6ea5be2b38L,0x4065adbb361c2e41L,0xffa1299925c13172L },
52222       { 0x0eb29793f80d5e2dL,0x862fe1ae8e4efeffL,0xd485483e948895c4L,
52223         0x513977300d80d5bfL,0xb4731ffc348782f2L,0x42543c76e1a7f6aaL } },
52224     /* 4 << 154 */
52225     { { 0xe37211be7ef79898L,0xa810387721344d16L,0xfdcd7e26a1b9f8b4L,
52226         0x5641e45d7d7f72d5L,0x5377c1bec449c920L,0xd3edcb0cefc7b2a1L },
52227       { 0xc657a9ffe14b42fcL,0xc8f858c800831b07L,0x6bfcd1bcd020eaa8L,
52228         0x17534b0a3f6860c7L,0x8ce5722284c7c806L,0xa1d40eaf2bd7456bL } },
52229     /* 5 << 154 */
52230     { { 0x28b88cbb1a7093caL,0x09275152080a85ebL,0x0bee7d979c1dcc32L,
52231         0x43698f5f5ed033a5L,0x4f142867b0f0acc1L,0x6e6202ecf62960deL },
52232       { 0xe95a607ff005b671L,0xfeee8ea060cae478L,0x456bb6e90e8ec6e5L,
52233         0xc1c0319a9d088a59L,0x29c6898bbe3d2379L,0xd7049b2af8a8628fL } },
52234     /* 6 << 154 */
52235     { { 0xe0c93007c9aa57eeL,0xebb2d47b8895a604L,0xb8aebc49c4fd6ffeL,
52236         0x2c06e1e573f300b6L,0xa019070d81628b8bL,0x2db1690bbaf8c1eaL },
52237       { 0xb3fce6c8cc94ccd2L,0xf301463885bcdf4fL,0xb1e62616e2f82c32L,
52238         0x85581e2468295a54L,0x0f2e2ff5bf51f8faL,0x940716f1155c1f6fL } },
52239     /* 7 << 154 */
52240     { { 0x15b2dd270c6bd5f1L,0x07b5bd91eb086d0eL,0xe701742e97c5f5caL,
52241         0x3ce5f3f6eea06ea6L,0x51a81a6aa9cee784L,0x2bd404c1c7182fa7L },
52242       { 0x27deca74d5b8bde4L,0x2c1931c595385e4aL,0x04fcb34e3a79d65fL,
52243         0xdf3357edad1babceL,0x8bc628ffa31af476L,0x42ce1d91e5cc9e78L } },
52244     /* 8 << 154 */
52245     { { 0xaed02b6b4e623856L,0x7a6d2bef3e1d74cbL,0x82226ec4654e7c30L,
52246         0x008ac003e7034bfdL,0xe343c5407fd6b555L,0xca1b29071b429d44L },
52247       { 0xe0702a339c3ceea2L,0x48079aa9732694c3L,0x7e6d72f6d4652401L,
52248         0xd92655ed35f60043L,0xa0dbaac6273e8cc4L,0x0bb8f0f93c3ffb40L } },
52249     /* 9 << 154 */
52250     { { 0xc3134781a91940b2L,0x37579fc9e9b90620L,0xa506227a08acd6f1L,
52251         0x603ecce0270da73cL,0x8a53b67d7fdd70cfL,0xe29b7df299640bd6L },
52252       { 0x7bb4fa877569105dL,0x6ee80ae8567bb5e9L,0xf394bd02baccabefL,
52253         0xe854b3a6309c944fL,0x1271a131f06246e9L,0xbc1c205531580147L } },
52254     /* 10 << 154 */
52255     { { 0xb41b87b6c95cd23bL,0xb99714ba55e371a4L,0xb138ee8f6f571cebL,
52256         0x09c42be480146ec7L,0x275ee21eee9aa125L,0x0cef4d6f3a878b59L },
52257       { 0xd436eb1ca801068dL,0xe2c5448c762b8a80L,0x243beee1f3640ecaL,
52258         0xf979458b32bbba7aL,0x6bc26cfea63407d3L,0xd3b6e132392dd1d3L } },
52259     /* 11 << 154 */
52260     { { 0x123ae65005d0072fL,0x9f101624f0656bbeL,0x762bd4f4344e283fL,
52261         0xd1f70d5161b6863bL,0xcd99382592ef9a38L,0x53aaa0c3ac2bf9bbL },
52262       { 0x13904fb521ef9a43L,0x0470a8ba2beb8f44L,0xf3733943fcfe9ecdL,
52263         0x10b8881a79d776dcL,0x89b94c67b82b7139L,0x7af5147aeb962922L } },
52264     /* 12 << 154 */
52265     { { 0xbc06ecab3de4ba2eL,0xf51ca0639e491bcdL,0xa6fc6fa0453c94beL,
52266         0x5460f943ed1a6731L,0xeb11656a4ec3f1fbL,0x2fcb2cabff1e7d4eL },
52267       { 0x595264678fea2286L,0x838117a34e0bee38L,0x7bdf588824fd2ce5L,
52268         0x13df0c839f2c2925L,0x1bf621e6dee97f30L,0xb43b2558ebea6641L } },
52269     /* 13 << 154 */
52270     { { 0xf49a97d80a33b97cL,0x4e68d71512ab9bcaL,0xc0d361c04bdb65a3L,
52271         0x5fba9fb86cfb0cafL,0x222e12ca2a716589L,0xaea01502731f5099L },
52272       { 0xf322ddf7e97b37f1L,0x050e82a5e55c844dL,0x01ef972ba11d664bL,
52273         0xab30502882c737b6L,0x43aa811185e39769L,0x766a9350937c1456L } },
52274     /* 14 << 154 */
52275     { { 0x246c86608e729329L,0x39fcc41dd693dac8L,0x48a65b54c062a6c0L,
52276         0x368a57706a5a3101L,0xd143600f47ed1988L,0x48466d92a764ce3dL },
52277       { 0xb05006135a22cb6bL,0xf1d77247edea070cL,0xb1ddd151617f2464L,
52278         0x7905069828b83fd9L,0x021abb26d70bf93eL,0x590b3c42ab5a5e1eL } },
52279     /* 15 << 154 */
52280     { { 0xe86c737b728b8438L,0x21f45a22acf1dd66L,0x6f29f2d7abd4de3cL,
52281         0xa223154576d4435eL,0xad902927f5fcafadL,0x272cceeb04f30557L },
52282       { 0xc2e4e0017ebbb2d6L,0x73954580bb873ec3L,0xadf5ec7ac7fa9088L,
52283         0xc036da0464006dd7L,0x9c3545b5e8274f69L,0x6e153c2552325f50L } },
52284     /* 16 << 154 */
52285     { { 0x5906a35c1cfb991fL,0xb62a4f80740a7744L,0x65c8ac9136f84763L,
52286         0xf73b3debbe0f1dd3L,0x40358868a2d26c21L,0xd907e90a76792ae7L },
52287       { 0x3ecea167668c3d5fL,0x731068f26754b49cL,0x6db891090e006243L,
52288         0xd29106e6dd94681bL,0xb40b8694a85a3de2L,0xc80c7bf1936b86ccL } },
52289     /* 17 << 154 */
52290     { { 0xd735de6b91f7c76aL,0xd89aa1d4b054837aL,0x47c1a397271e94c4L,
52291         0x8d91f3f9dcb7c071L,0x4cf9be2db4cc209dL,0x4fb6842ec08190d4L },
52292       { 0x926423a1d7b2aaedL,0x5bbfc08957a1cb44L,0x44438c56021defb3L,
52293         0x8b9a2b1ba09863cfL,0xc9d5c170e37e339fL,0xa8994d5dabb18c7aL } },
52294     /* 18 << 154 */
52295     { { 0x003d45d011913575L,0x866cb2dd87e1186bL,0x692f630146b69a22L,
52296         0xd296a55c8174c1d1L,0x77ef6fbe9f17af00L,0x6b588be93aa922e1L },
52297       { 0x99ecb44f033e6dd7L,0x32edea2c1d22b7cdL,0x3122b027ba7006f3L,
52298         0x8950054bbb6ebc5cL,0x4f6d606182dab805L,0xc12055181bae5f1bL } },
52299     /* 19 << 154 */
52300     { { 0xeca71515ad7edd2dL,0x3f9c330e9bf56567L,0xd0b62d6749104bb1L,
52301         0xde92596410cc8d89L,0xc7a083f4287fc898L,0x8ba176e712d15d2bL },
52302       { 0x2cee62f7b4c8c4c1L,0xc15966c2ef79aeb2L,0x9b449522427c11a6L,
52303         0xcc850028eb49b2fcL,0x0966a06d3a22720dL,0xfd511944a1e78c8dL } },
52304     /* 20 << 154 */
52305     { { 0x28d33e79e08c180fL,0x768c7794f6aec9ceL,0x5a749f3bce683c5bL,
52306         0x717629d98371fe75L,0x5e828fc057712c1dL,0xb46c6ed17e4c61aaL },
52307       { 0x5d927bad5bccf95cL,0x55d6fc80d72f68ecL,0x560a99a398591dc2L,
52308         0xc885fe8a4836664cL,0xd18acd4226d79298L,0x05e4cd17185df1d7L } },
52309     /* 21 << 154 */
52310     { { 0x9c1e5db3ab34fbbeL,0x0d4b1e742f7eaa94L,0x106b0b5c86de1289L,
52311         0xd2c6c1aab691a830L,0x2e55cff9b9717593L,0x4522b37d075e5e95L },
52312       { 0xc6ee67ea3abfeb96L,0x35844bbd890b04eaL,0x0246545a55d6f65bL,
52313         0xc66bad2b13594e25L,0xaff4c6b35d6aa7d1L,0xebb7d2b5a3f42a84L } },
52314     /* 22 << 154 */
52315     { { 0xebc60e21fcc83355L,0xc94dbc02d9119b77L,0xceb05a312f18ae9aL,
52316         0xa8462962b8f69016L,0x58dde5a48f67b5f4L,0xb8bdf9c9af3c234dL },
52317       { 0xe95c069f80e85df8L,0x9d525e1bab3aa0e5L,0x73c8a92f76276d8bL,
52318         0x7feb4abd163530efL,0x8ca949b35ef5ad73L,0xe129431e2e3d057bL } },
52319     /* 23 << 154 */
52320     { { 0xa263d726c129d188L,0x89da948e9d526adbL,0xc7319a5a6b8a9149L,
52321         0xd85d382d8816f421L,0xfad69eb1844032eaL,0xf668901a4233122fL },
52322       { 0x246cc0de210ddea0L,0x26d8ccb70bc07dbaL,0xfc1b558470e6708cL,
52323         0x853802b775fa0b44L,0x215ccb88bb75a5b2L,0xff50f0cf24e60054L } },
52324     /* 24 << 154 */
52325     { { 0x9d8a925b60dec308L,0xb72e3efa6b3ea363L,0x4f53ca6ddfb534b8L,
52326         0x4e64874c6dd78a32L,0x336e5b46c2a146d5L,0x07c76d6398395201L },
52327       { 0xa4c095228fe3e815L,0x887e659d3221cc26L,0x0ff92f64c36286ecL,
52328         0x57b1b903c3ebb08cL,0xc6bdc9b665f00c30L,0x826242269a46d36eL } },
52329     /* 25 << 154 */
52330     { { 0xe054597768bbf4f6L,0x17bb77edb6e2cc19L,0x0cc551d89ae950f7L,
52331         0x3490778d761763a4L,0x1c36044a32647ceeL,0xa6e083223f9d2938L },
52332       { 0xea392a153a656a51L,0x4d51161ba083cb54L,0x15c01e792c690757L,
52333         0xc7bf5d7c5cc62636L,0x1b00cddab2ccd76aL,0x68f49fa995313f8cL } },
52334     /* 26 << 154 */
52335     { { 0xc782c16c1a0b619aL,0x8643d42bbe316086L,0x49d2966bc0daa421L,
52336         0x080b1cafb7b487e0L,0x1d33bb53144de273L,0x8bafce2d6faf7ed9L },
52337       { 0xdafbe3cf408d4636L,0xf10527df7ee8835bL,0xe1123f3ee2e75522L,
52338         0xb388c64bebe27d60L,0x2cb38dc1e3f1f55eL,0x57ff8e43e34524d8L } },
52339     /* 27 << 154 */
52340     { { 0x557dc1cbea28398bL,0x34d5709a208996b9L,0x94470993e97a3306L,
52341         0x0343320772b117f3L,0x66c4e442f056525fL,0x27753c526d11dd35L },
52342       { 0xf0aa7658b26a70d7L,0x95608b19543cd7ebL,0x618b2e17bac19156L,
52343         0xe7e42948cae64ba1L,0x2016a9d59657ec93L,0xa38f67e03d7ea46cL } },
52344     /* 28 << 154 */
52345     { { 0xd67dc92b85653dc8L,0x8e0970af0bc93ab9L,0xb6f09baa8b87c0afL,
52346         0x5a8a903052760ef4L,0x2e2ae7561047bf85L,0xd049078f85bd4e74L },
52347       { 0xced11ff83729f708L,0xdd21cbebd91068a6L,0x83d488ff24b3e911L,
52348         0x6e166fda1afd2196L,0x66a912114f0d2128L,0xd11078ed05c9f39cL } },
52349     /* 29 << 154 */
52350     { { 0x69aef6f919c64bddL,0xe7d4f909598ab592L,0x48952e280e55124fL,
52351         0x637693f6290b558bL,0x3afb2e7b421e60e9L,0x00d1dbac79aac8a9L },
52352       { 0x45156c5cc08563d5L,0x8cc201be4519c881L,0x2e36c0d7bd616581L,
52353         0x595fe0164ee16dffL,0xeebec40ae4889c65L,0x23b6dfd7d35b94e7L } },
52354     /* 30 << 154 */
52355     { { 0xd87003d3bdbdf0cfL,0xe9750b5b56c298f1L,0xc256c3a2b73ad05dL,
52356         0xe0779a192ee94279L,0x31d8b3c6279626a3L,0x469056bb90163bc8L },
52357       { 0xe6aeabc623755853L,0x9fffdfe2896a6f4cL,0x15c1ce78a36cf41bL,
52358         0xd4c8c025eee41941L,0xf7a917ee7653be9dL,0xfa3cba9659d52222L } },
52359     /* 31 << 154 */
52360     { { 0xa02f08586d8c610fL,0x9819c563ad4af3cfL,0x085d4439b95d17eaL,
52361         0x9df256ea616f532aL,0x5e9c5419cebd249cL,0xdd5ffbf451062a22L },
52362       { 0xb8910ea5c8b33577L,0x5e8b7ff7ff8e63d7L,0x5e4f3926b24e230dL,
52363         0x163eb51eacd851d7L,0x9bda95f2ea2aef8eL,0x3d6887755aefa290L } },
52364     /* 32 << 154 */
52365     { { 0x913f92075f8ab132L,0xd5b6792c5c14080fL,0xefab4e2c787c3594L,
52366         0xa55d465fe7b7b7ddL,0x921aaad834e28e6aL,0xc4f3a35e12d6a7bcL },
52367       { 0x109803c46115a5aeL,0xc023098ce709f9a1L,0x1a8c8bdb99c5bb66L,
52368         0x1cd1c2b6bc7c2da7L,0x50189c975f927eefL,0x493823d1229f9410L } },
52369     /* 33 << 154 */
52370     { { 0x34ec4dc840dedfb0L,0x1109ddb93aa89063L,0x93d9db278c218bb9L,
52371         0x07131b6e0b6007ddL,0xf90570ddcc4690f0L,0xa6a9a634afa26a59L },
52372       { 0xbd0c25194292e2b7L,0x92b99706a6d44b7eL,0x89481adf4942c03bL,
52373         0xff5e56b98a0c30d5L,0xdfd8939591c80fafL,0xed9d140840663594L } },
52374     /* 34 << 154 */
52375     { { 0xcc22db55c41e42fcL,0xc90ec77e4c9f2411L,0x419b9f46e4c02557L,
52376         0x156ed30ccee45c60L,0xf2c1340a72e4a938L,0x4a9cda8a204775a8L },
52377       { 0x900fd58713952b75L,0xa82ec2b812461145L,0x9f1875d41db68028L,
52378         0xaaa6af31308475acL,0xa11f379442d4b884L,0x1f1fcbe3d087882aL } },
52379     /* 35 << 154 */
52380     { { 0xa32d5a80a292fbecL,0xe0b10099d7091eabL,0xcb99bf7b4bfe6956L,
52381         0xfd806d4c61955461L,0x7124b1bf931066fdL,0x29fad019649ccbf7L },
52382       { 0xd1fe7911049609e7L,0xb568e167592f93c1L,0xabe7d10398ba066cL,
52383         0x0cd22c9668d7ac2cL,0x0ccd0c21427522d3L,0x97ba199ba503b4a4L } },
52384     /* 36 << 154 */
52385     { { 0xa0f2da0c78a2cbf7L,0xd1611acbd163d80dL,0x1af6ee1bf2cd3795L,
52386         0xc4993e08307d6105L,0x84c3b8f8560b5f12L,0x4f52c56347869733L },
52387       { 0x8fd9e3f728d28bc6L,0xdbf34576e5d44bd9L,0xf7e3a6da10d14cb5L,
52388         0xb93870990fe051ffL,0xf6363a48f15d43d5L,0x4bc358fcf434d1acL } },
52389     /* 37 << 154 */
52390     { { 0x35bac9471eae6dacL,0x4244697e39d6fe97L,0x16ec7f64fe017230L,
52391         0x393856d10493823cL,0x0782fbb55b7cbbfeL,0x4c399e3f5820f9f9L },
52392       { 0x86311cd9c08fe816L,0x057d4cbbc3ac958bL,0x63f09d484bdb0531L,
52393         0xab0b582b0b89ea02L,0x19c52243beb30331L,0xafa64f25ca87ff6dL } },
52394     /* 38 << 154 */
52395     { { 0x0d28a67859b1f4aaL,0x79b04589c52d40f4L,0x443b7fa5219303d9L,
52396         0x5be78d9663972eceL,0x0ccb969e7d984869L,0x7d8738077f81916fL },
52397       { 0x3502b3e426d9f292L,0xda1de7a82c90b612L,0x5605f5dc434f27c0L,
52398         0xa50d3328df89c616L,0x5a80cf84e7082731L,0x2c89e4b6f7ce953aL } },
52399     /* 39 << 154 */
52400     { { 0x7a46cd0d01fdf1e6L,0x86868e74e8690fbeL,0xf038771d8a8fc3b2L,
52401         0x30135b3084303d90L,0xa7ecb9ded562d20bL,0x7a6d1f37884cd233L },
52402       { 0xa30ca0bb07dfad3bL,0x1690d6018e09fa7fL,0xe582449f6c744551L,
52403         0x0b0030a21b935d17L,0x6b46681272bdb78cL,0xe40d4e5f56d4f328L } },
52404     /* 40 << 154 */
52405     { { 0xa29978fc62a8b8b4L,0x4cc216310fa130a9L,0xe4b51c6bf15e04c8L,
52406         0x453cf4d23f815420L,0x1257c751c6282b9dL,0xcd15b03c8af1af36L },
52407       { 0xe3596240514ef6e8L,0x72a6691708ab83d9L,0xca0a62d710e44b2dL,
52408         0xcde068128a9b8a8dL,0xd492b261ba470875L,0x5c7ea67cc6d7aeb8L } },
52409     /* 41 << 154 */
52410     { { 0x6acd945fc0995487L,0x06d5b2e47abac4fbL,0x42cddd75aaf3d12bL,
52411         0xca7d2363de1b9632L,0xbb1a1990dfbbb30fL,0xb0beb43139fd7bd4L },
52412       { 0x9ceb36884fa796e7L,0xb4d2bc4ba3266ab8L,0x79bda9d6e02df012L,
52413         0x414636bbf6faf7c4L,0x0a6603b9d1ab23f9L,0x2bc60c848db14f7bL } },
52414     /* 42 << 154 */
52415     { { 0x1b36ef27007ff90fL,0x394fe8095111399dL,0xaf4f246cb758e748L,
52416         0x794e4b151a7139a2L,0x40869a49eb527db3L,0xf2e15106f46d1b34L },
52417       { 0x46619f0352ac96e6L,0x40f556de49caf0c4L,0xa36b11d693072befL,
52418         0x871919b4ab2dad50L,0xf44b8084792dcefdL,0xe051823dbc31b021L } },
52419     /* 43 << 154 */
52420     { { 0x56293d8dcfd7432bL,0xdedf8dfd1d5f72c4L,0x743f4a71ae604fb4L,
52421         0xfb35ab43730caf7fL,0xcaacce6b20fc2167L,0x21ec3a0daa8ac71aL },
52422       { 0x4fdf5890c21ac9baL,0xbdc41ecfd6149328L,0xb1ac4d519b381c55L,
52423         0xc4cc08fd63f10a98L,0x2b9f0d3a4913a671L,0x9ce9949cbc36a952L } },
52424     /* 44 << 154 */
52425     { { 0x5049a7d3f758b1b2L,0x60beb74f14ab97b8L,0xdfc47828a9ff8ad3L,
52426         0x303a0cde8bb99766L,0x53f4b45a43b9a7a6L,0xe467aec8ca6e8c43L },
52427       { 0xb8e7db7b3f573855L,0x5fee5a5481e760f1L,0xe928b23385b0fed4L,
52428         0x72f02728ebae0b7cL,0xe32abf70bb5897d3L,0x103e8b859c572995L } },
52429     /* 45 << 154 */
52430     { { 0xf321278c2dc1a02cL,0x06ca03865dd09f91L,0x3c28640b7bac9e7aL,
52431         0xe3a7f9b527b1a011L,0x9137ad0407ccedd3L,0x3a2976a8cb6b447aL },
52432       { 0xab1c39248225c1ecL,0x30703f108f9022a8L,0x212f0f1bb0b2a64bL,
52433         0x76ad924b3e73862fL,0x47253a5c84842ac8L,0x33a03a17755af95eL } },
52434     /* 46 << 154 */
52435     { { 0x97c371fc5a274b61L,0xc7362cdbb14c680bL,0xa8cdd929efbd49afL,
52436         0xdfb2d5f075325f06L,0xf62d10e2b905531bL,0xbdfbfd8462ed0c3aL },
52437       { 0x252061599d07d2daL,0x1376775152491224L,0x165637057413313cL,
52438         0x642a7911a2b88eb1L,0x42d9dc6806ffe363L,0xe81d3403017bcc9fL } },
52439     /* 47 << 154 */
52440     { { 0xa68ce9db93d57f06L,0x4d1fa86a31dba07dL,0xf11603178c4822abL,
52441         0xc2243680633c26f5L,0x6b4e91cd10f1da80L,0x4358155734827d78L },
52442       { 0xbf54e87400c19817L,0xf52b94c4f2bad957L,0xcc85de8144e71756L,
52443         0x4f7d8ca365b7a8c2L,0xff76efa579d7c36eL,0x50a444025952932aL } },
52444     /* 48 << 154 */
52445     { { 0x87c0ef84172784bdL,0x023128267a5f2d07L,0xeae5c0cec9901fa3L,
52446         0x6ea74133a11144e5L,0x740c3d2ed8e89beeL,0x88e06131f9bb1801L },
52447       { 0x47f253754356fd51L,0x8e2ca6ce38e45ea1L,0xf0afe990c2ef8066L,
52448         0x91b7263d8ea03d0fL,0x37b01664880ca591L,0x61306f09790c8ed7L } },
52449     /* 49 << 154 */
52450     { { 0x084c4f92b24a5736L,0xf3d01da90a3c3859L,0xd37c47ed7468b812L,
52451         0xeb539a939567c798L,0xd852f502acfdc072L,0xd8e5454996245975L },
52452       { 0x42ec3948db5e323dL,0xdbebd1c7002d3fadL,0x9cc5db55d7c62d0aL,
52453         0x22af02388afa4c07L,0xbdcb68fc6979eb74L,0x33763dd544dc11baL } },
52454     /* 50 << 154 */
52455     { { 0x4734465f87c2e496L,0xbafe4fb4eb7d82c4L,0x940b168521837f17L,
52456         0x790d7041345a66c3L,0xe9973cfd65ea596cL,0x45fc95df058b3350L },
52457       { 0xc63bf91405d08638L,0x36e6af6476465a92L,0x7fe09193f1eb3701L,
52458         0x364f64f06468e2aaL,0x83108431f7129cc9L,0x3ac117205606bf94L } },
52459     /* 51 << 154 */
52460     { { 0xe6a85c7d34dcecd9L,0xc14437fe338cdc1aL,0xa5eeb471b3a9233eL,
52461         0xf230947c71349a62L,0xe704a95686308ebbL,0x0ef4d4da4a362a8dL },
52462       { 0xae9be4394b634c67L,0xf736c07c569f0039L,0x7356f3010f5f07d9L,
52463         0xc86c4000823c9cecL,0xc43b3489951ab5faL,0xa7a3b3a6b46bb659L } },
52464     /* 52 << 154 */
52465     { { 0xb1d6cb737337af87L,0x09a59a6908638c3cL,0x4ecc3fd25d94c727L,
52466         0xa7b57269e274ba87L,0x909cd824a61a0590L,0xcbe63cfe3c11751dL },
52467       { 0x9574de8347c46efaL,0xee334cda539b7e03L,0x245bc6a2e3ef3599L,
52468         0x13a570fee88d0da7L,0x88ede26d90ef4a21L,0xa0c5953b01fccebcL } },
52469     /* 53 << 154 */
52470     { { 0x855ff0f7657121c2L,0x18754814f94c7402L,0x720f1e3c32ce8340L,
52471         0x7ecd080ee8e49d3dL,0x2838e642f0bee412L,0x69cad618209f8e60L },
52472       { 0x5730f2dba983a4cbL,0x74957697f43896a1L,0x68de04373dc55d4aL,
52473         0xa2fbb915628698bbL,0xc8279c975cace19dL,0x7df557465fd52bc0L } },
52474     /* 54 << 154 */
52475     { { 0x1cb1c2f378c3f521L,0xa425f99b63116c7dL,0xc86b48c36f7c0e71L,
52476         0x9e92e82dc76a73ddL,0x8c0414657e7d6df8L,0x99e7884d38c02d8eL },
52477       { 0x6c53c0cfb78a7e50L,0xcbcb5114481d60ebL,0x1eed68ed035b4441L,
52478         0xdc95269f755f18efL,0x3ad7f32a3fe51f12L,0x981782d017296245L } },
52479     /* 55 << 154 */
52480     { { 0x7743ef2655fcd15eL,0xa73944a4d07f3cc0L,0x3161d6a32438cf14L,
52481         0xad193a9b14e8938aL,0xe1de190e872dac01L,0xb165da2fc4795b10L },
52482       { 0x1eb89d519e155bfeL,0xc8b97d94c9c552d5L,0xea7d3edb108c4c82L,
52483         0xafb60b29c10acbb5L,0x331b316b82c7b642L,0xa53c4b3d719fa342L } },
52484     /* 56 << 154 */
52485     { { 0xc8dc34f36b3bcbdfL,0x952d337b24d72806L,0x28b8ec817e56e8c8L,
52486         0x98e78abdbe861aebL,0x521773ddcf3bd040L,0x582ffcb2b7ca45d2L },
52487       { 0x70962c0a04202ac8L,0x31b6ac909f29381fL,0x3b4cd403355715a7L,
52488         0xffbbd1a7399a071cL,0xac669b08e50f02d7L,0x0f568c89b2cf0565L } },
52489     /* 57 << 154 */
52490     { { 0x2d2afc2daae7e637L,0x840e47c782a818efL,0xfe26a67c879f2451L,
52491         0xd41d289810f54247L,0x36040f4877119f14L,0x741859a983f240ccL },
52492       { 0x15f9607a8fa720c8L,0x8eb70f6df7b8e32dL,0x755394229b98d670L,
52493         0x80a4a127750c4e62L,0xbe88d03195ca3a50L,0xfadeb53dc6411eb6L } },
52494     /* 58 << 154 */
52495     { { 0x19f29da06b824028L,0xa5cfd12b7bd354a7L,0x1cb5d74caeb59b3aL,
52496         0xec9a8ccc47211999L,0xd7f2a1c17852f167L,0x134629209a1859cdL },
52497       { 0xdd65f7ac9e3a339fL,0xccaa968075437831L,0x25772f9b7f502bb0L,
52498         0xa64cd12f6fa0aa66L,0xd2f46ac62af2c3d4L,0x58433d963f262a2fL } },
52499     /* 59 << 154 */
52500     { { 0x747757c6715ba7e6L,0xc01b73c1f9cbefd2L,0xf1d96de501bbc017L,
52501         0xad554e91a1087f55L,0xd9b74be65a6cc716L,0xad2f2c0320317019L },
52502       { 0x42ef19c207893532L,0x7f3624c40858fdc1L,0xc104bde7078936c6L,
52503         0x99af706682b5f95eL,0xa40e02625a13a9a0L,0x6c0251c40a318574L } },
52504     /* 60 << 154 */
52505     { { 0xedb3abb1fe36eed2L,0xbb2cc1e6a038298aL,0xfa0ac06fe5adc3beL,
52506         0x7cbcef3eae73ebe1L,0x41596590cd676b87L,0x6cc8c0ae214391d7L },
52507       { 0x826e2e16fcb3f244L,0x1ed7837e1be22058L,0x83052d0d1a9912b3L,
52508         0xa2cb410c8ac3dbf5L,0x279d555a7faa6bc7L,0x870e7132f52b439cL } },
52509     /* 61 << 154 */
52510     { { 0x5957428e385308d3L,0x49ba20b3bfdae187L,0x4e1281c3adb44defL,
52511         0xebe93dc4e75c6cf9L,0x81d1d1cff675fc6eL,0xbe01bcecfe0e371cL },
52512       { 0x713f294d336bc7caL,0x1beb1508e26a1903L,0xbb5feab4b6819961L,
52513         0x28bede2741bfc7efL,0xb0a5108bb3365719L,0x81a8c9255ccd21a3L } },
52514     /* 62 << 154 */
52515     { { 0x4f3d90af2bea6870L,0xfebb0de2ca26ca46L,0x109d96e5d58bd9d2L,
52516         0x4b42928cd9882c8aL,0x5238cb7a8c73adcaL,0x9d79d72a4adfc913L },
52517       { 0xba58929d1f0bf201L,0x0b7790a505f52baeL,0x361949aae45fda0bL,
52518         0x21b2d006af3f732cL,0x1ed05dc33aa84bf8L,0x2322b7f72405980cL } },
52519     /* 63 << 154 */
52520     { { 0x4a38b5b2c7151e42L,0x1d5dd94894550168L,0xf2adeb5b7b3d1d93L,
52521         0xe15c42fa36661a89L,0x7d55a3f27a3aee90L,0xbe1b5c39d9d350a4L },
52522       { 0x9c4d6fa2610f16b8L,0x7b96051da60fb18eL,0x539762fa496c018bL,
52523         0x048ffa39168a8f22L,0x33486ccada1c0a58L,0xe216d6be9fd687a1L } },
52524     /* 64 << 154 */
52525     { { 0x11a8fde5f0ce2df4L,0xbc70ca3efa8d26dfL,0x6818c275c74dfe82L,
52526         0x2b0294ac38373a50L,0x584c4061e8e5f88fL,0x1c05c1ca7342383aL },
52527       { 0x263895b3911430ecL,0xef9b0032a5171453L,0x144359da84da7f0cL,
52528         0x76e3095a924a09f2L,0x612986e3d69ad835L,0x70e03ada392122afL } },
52529     /* 0 << 161 */
52530     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
52531       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
52532     /* 1 << 161 */
52533     { { 0x3ee0a31c6754f492L,0x02636c6b96769ff5L,0x90a64f4ff0fbfa96L,
52534         0x513f054efafea65aL,0x796ba7479cf4b9f9L,0x3198c068932a9590L },
52535       { 0x93af8a65549ee095L,0xb8b6f72ca212760fL,0x23bc71e9c1a46c8fL,
52536         0x000643af4c9bca72L,0xb6d967c7848cea30L,0xe06b6b4e73312ec2L } },
52537     /* 2 << 161 */
52538     { { 0x52ec99561d85a725L,0x0f9be000f3208012L,0xe881337c6dcc7816L,
52539         0xe4e7b6d9791f7cf1L,0xfaa717aa59885a42L,0xb1bbb5c7f9c01e41L },
52540       { 0xcf208d58a0361880L,0x24426e4020afa350L,0x7261871b264ce04aL,
52541         0x66be4a86cd42026aL,0xc5397b77829f99feL,0xffe4a6bc24578e2bL } },
52542     /* 3 << 161 */
52543     { { 0x0733667af822d5f9L,0xd7f81b9e18339700L,0x7ca29b27a7bc265fL,
52544         0x9fefa698eb4f0c7aL,0x7b6f351301f27630L,0x72f0f152fcfb1133L },
52545       { 0x9928d9d05c81eb14L,0xa16ac36bed8ff6cbL,0x7fbd1acbe041bef3L,
52546         0x7d25159af8d99854L,0x2ec3a7d8db5a0dc5L,0xd86fc4cc87e3e933L } },
52547     /* 4 << 161 */
52548     { { 0xba8418f34c20e15fL,0x7eed2494fb54404eL,0x4e6438d7bce1e82dL,
52549         0x9e489b3eb397915bL,0xa9baea9ffb4cf659L,0x8bc5b2ba42ef4affL },
52550       { 0xae3fb5337e62a188L,0xcd648493496e8e35L,0x89728e28defe047bL,
52551         0x63a8c679d24e60feL,0xadacbf92470f710cL,0xd470aeb95e198d3cL } },
52552     /* 5 << 161 */
52553     { { 0x8e3807dd7a3e874aL,0xc4edb45b89ac3a99L,0x9ba9cdaf4bfd77d2L,
52554         0x31d33f59b540fffcL,0x404c87790c60028bL,0x7f89da7189688c81L },
52555       { 0xdd3390e5504b862bL,0xdf1e721be937efe3L,0x5833d0df63e6036fL,
52556         0x7712527a385fbab4L,0x6347236bd210c0d4L,0x12d7733c8d238e2dL } },
52557     /* 6 << 161 */
52558     { { 0x0ecb0723302e943fL,0xd180ca1e4a443e78L,0x39e7891123dd2c9eL,
52559         0xfa2a440401fe50bbL,0x4678e7ed154d39d1L,0x64ddaee1af513e01L },
52560       { 0x6d4c615a634904daL,0x937c6326ba5c900cL,0x70658f5feb6c8582L,
52561         0x2a04fd51f3d65166L,0xcefe7472b676eb47L,0xd3565a71f597d887L } },
52562     /* 7 << 161 */
52563     { { 0x299520f4e5dcba80L,0x522ad4b52b758045L,0x54eabe27193b36d4L,
52564         0xda4d3bff45e9e442L,0x44cb9252637311f3L,0x4cd620a971338ebfL },
52565       { 0xec908157cc9524fbL,0x2731a11ba8c955d7L,0x72a5e0545cb94009L,
52566         0x7eee8f3b9126cfe8L,0xc71e29203dd5d5ceL,0xe886f91a22069494L } },
52567     /* 8 << 161 */
52568     { { 0x294d29550db962c0L,0xd6994ef46d523ab0L,0xfa1a7f9158f95037L,
52569         0xb137981164420c94L,0x2b686e1e093caea8L,0xdef10944f9e1c340L },
52570       { 0xcd1beecf611d9bf5L,0x34696c50a1b5267bL,0xcecbc7192dfc2b16L,
52571         0x2cdb955dcee7e854L,0x9fefc321f2635cc8L,0x276d2e4f2936f7d3L } },
52572     /* 9 << 161 */
52573     { { 0xa9de8b87d38e86b2L,0xe0c2f232780d2fb9L,0x742d7fe9449e78b1L,
52574         0xc6946b7ef29efe3bL,0xbd59bcf985de7456L,0xb070ebfadb492e64L },
52575       { 0x5cda7ac8a0ff7c15L,0x6e0c0062c4f435c9L,0x4d8e5395974d4be8L,
52576         0xa0a0c5984e6d1681L,0x5debadbea14cbda0L,0xe176a772ae30b167L } },
52577     /* 10 << 161 */
52578     { { 0x25df81bce7b19019L,0x3058081aa6f45519L,0xccafbccabb3de1d7L,
52579         0x2b794710c515b1b0L,0x74b81bf87168d9ddL,0x92d5e462ec00571eL },
52580       { 0x865e29efdc670943L,0x2350537c7f6299c0L,0x9fdf787ea947c6f8L,
52581         0x9601cb21cabe0f8bL,0x2899d5f49313b000L,0x4873bc9f66a9e8e2L } },
52582     /* 11 << 161 */
52583     { { 0x2829add72f163a26L,0xf96dd91156909488L,0xc16d185f769ccb59L,
52584         0x13c4b566e9c6da4fL,0xfd68110bc423ac34L,0x64911819cfaa9fb6L },
52585       { 0xad7c7d2b12dd07e5L,0xbf7eea90abc19a50L,0x1db70ed108d6c57aL,
52586         0x01da2b41446deeabL,0x163a5a5fa4f6a367L,0xca9f4bcca10c8a53L } },
52587     /* 12 << 161 */
52588     { { 0x2132c32e68206a00L,0x20bc1bb483bab6d9L,0x99fa3be2bc4ef156L,
52589         0xe515cd05ebbd6c33L,0x9c06d7670d2c8ebcL,0x2fa7f3b68a79c884L },
52590       { 0xa4dad16a9137df25L,0xc4da20f833598c21L,0x32f5d9e3867cb117L,
52591         0x8f00fb54da7cf533L,0x428cf9e3870ef3b4L,0xa8b6c754521b8428L } },
52592     /* 13 << 161 */
52593     { { 0xe9b297be7be5e610L,0xd09f63c304b49303L,0x9110a9b381ebb814L,
52594         0xc32af8986bf19586L,0x5c4939571da2280fL,0x89e85cb41becc5f5L },
52595       { 0x1068cb528f1a396eL,0x49dde483440a6144L,0x51280400b5d6aaf0L,
52596         0x0e8ac4a53e8ea21aL,0x32f4a91d92582420L,0x5eb09649bc35e408L } },
52597     /* 14 << 161 */
52598     { { 0xea3a2f0c32f235f8L,0x8281bfe5bf4a8256L,0xf44e1319577b9e1fL,
52599         0x31732d1bab2d9ac7L,0x6e7682eff375c5cdL,0x7069fbaf0913ed09L },
52600       { 0x693257dcf690cb94L,0x576a85b2dfa6e07bL,0x72e00515447fe4e4L,
52601         0x00af617509a2cd8bL,0x05a61365902ae75fL,0x8310b16db5ecb690L } },
52602     /* 15 << 161 */
52603     { { 0x4d22c79cb00fd8f5L,0x432b09844c9ed8b2L,0x43da93b2a85b3f0aL,
52604         0x0522df2ac4163655L,0x2ea7210b77214019L,0x8280099b7051a9a3L },
52605       { 0xcd0a829bb11b9e80L,0x9bda76c7246ee656L,0x1ece801bad70a0faL,
52606         0x4f8162f096721d79L,0x341faae58e7c3b0aL,0x6914420b12e57cf4L } },
52607     /* 16 << 161 */
52608     { { 0x4962c02167141724L,0x5f81eabeabe7762fL,0x78549a79dd189c3fL,
52609         0x47675cdd6ce517a7L,0x5102294e32d6bb97L,0xb19500c66ed1a029L },
52610       { 0x3efb54e8b16a206cL,0x7dbdcc250dc135b8L,0x955bc2948967fb04L,
52611         0x373615c9be04e909L,0xf1fcf820111efad6L,0x8530f97d6fd2e97aL } },
52612     /* 17 << 161 */
52613     { { 0xdfff3aceb3b513d3L,0x569f9d42fdaed4c5L,0x8615a9cf71cdec34L,
52614         0x2e700c34ceeedc56L,0x9047d770a48d0682L,0x3fc845780ee5893fL },
52615       { 0xaaaf3d90ab5b432bL,0xc846365184cb412cL,0xd215030d928ec9bdL,
52616         0x237a710045b97accL,0x0f533045ff791353L,0x093a0d21a1899bf6L } },
52617     /* 18 << 161 */
52618     { { 0x5da20568b4bcee44L,0x878025840f5bd27dL,0xc76b965c1c06dbccL,
52619         0x89ea2cceb1492616L,0xaefc8746b460c4bdL,0x679e6edb994d1756L },
52620       { 0x4ff93a4a271f3218L,0xae496faf3b970a74L,0x062df3a7ba6c44f2L,
52621         0x1ede93021990ede1L,0xa797899af9a1e2adL,0x9b1bcf6d82599120L } },
52622     /* 19 << 161 */
52623     { { 0x63a38a51bd04f6ffL,0x2ddc958bffafb91aL,0x198895cdb19b2b08L,
52624         0x1bb494246f65b797L,0xf75df140f157b79eL,0xa188dc873d599990L },
52625       { 0x8b926eecaeac83c2L,0x55fe56f03b82900fL,0x10eb6dd33b11d061L,
52626         0x8b44c14c3aec5877L,0x294b83e8b486e651L,0x469e552f79524b3fL } },
52627     /* 20 << 161 */
52628     { { 0x69386f451a746ed1L,0x4319649bcc14bac3L,0x006292b3b647cefcL,
52629         0xc771b7cda20e2a37L,0x838714d2396bf329L,0xf263e66759c0823dL },
52630       { 0x7ee258f0725e3ecbL,0x37638f9934218254L,0x4d57db246fc6d0f6L,
52631         0x8c85ad7322c2dd47L,0x2300a9129c59cf13L,0x63971b0bee08c1bcL } },
52632     /* 21 << 161 */
52633     { { 0x180032d98c2e7698L,0x07d4d364a851f2faL,0x0070bbdeb50b5986L,
52634         0xba05ee28274eee7dL,0x28843675b0f482e5L,0xdcc9c09ff82b2229L },
52635       { 0xae0273e7f061df73L,0xa3856b6644e3a740L,0x4b13b141527b80ceL,
52636         0xfd83b7f0e1b7dabdL,0xa3b5a2f1536c04c3L,0xfd09c77bb29e2bf3L } },
52637     /* 22 << 161 */
52638     { { 0x05fe64c5436e7c2dL,0x5b9f0b83ebb1ee26L,0x13dcbfed2977d6f5L,
52639         0xbd16c6b7db552375L,0xaaeacc2342da342dL,0xe427d2ee0cfec89dL },
52640       { 0x3097ac7b038b280cL,0xa2b79d623aab3c43L,0x9771fff4a40f585aL,
52641         0xf50974e0b15aa16cL,0x114e51137a847284L,0x574ba8efb4fbe083L } },
52642     /* 23 << 161 */
52643     { { 0x3c8dfa3b05e37e4aL,0xeaf691b47408352aL,0x2e1ce9863c9a8610L,
52644         0x8d024a814acfb35fL,0x3766aa2184ba6baaL,0xc336f82eb91f5a27L },
52645       { 0xe2d46985412ab7b4L,0x397f0411ded6de53L,0x067241c3544768fdL,
52646         0x9206d3839b71e023L,0x8571fe1e3f51c3c9L,0x0abdb52e3ba345abL } },
52647     /* 24 << 161 */
52648     { { 0x85e1e4abd5281f9bL,0xc7e517ddc653b0c8L,0xc0b84da1a717e034L,
52649         0xf1a63b280f1bf3dfL,0x47b74201aba6fd41L,0x9cf3da633518fcabL },
52650       { 0xe12511fb23bb6e77L,0x13b2cb4438679d79L,0x20e0fb10db5665c0L,
52651         0xb5448a33b99f4d5aL,0xcb1847ad46b7dbceL,0x41f156b8fdcadb87L } },
52652     /* 25 << 161 */
52653     { { 0xd09b746793c8b2a8L,0x36c760204357f251L,0xa965d1771ac04cf1L,
52654         0xca49d59427740f18L,0xbba973ed76c53b33L,0x7f8c2d264c17d867L },
52655       { 0x389afbbb00966b80L,0x92f2097a55988387L,0x316a85393a47c746L,
52656         0x259ae094ac3a3a30L,0x337f1d3f0d61ee3cL,0x02d5a60ca9d928ebL } },
52657     /* 26 << 161 */
52658     { { 0xd9f370e42af77d78L,0xf9cb8d588bfa692fL,0xdc8a4c24fc9203d5L,
52659         0x499b6fda3b8138f4L,0x051a61f19118d3b8L,0x89207fa2cb251fb6L },
52660       { 0x32247676bbb0e12dL,0xaa1c59822900bce2L,0xe7beff9c7df4f6c1L,
52661         0x595fd551757c1449L,0x2fe91299650e8961L,0x2db30033f480bf30L } },
52662     /* 27 << 161 */
52663     { { 0xe796c05d110c4d7fL,0x12f87395d4af6817L,0x849cd9e6b5512cb8L,
52664         0x23b8d0a4adb71290L,0x28cc808bee64339fL,0x3072d46fcc27fd1cL },
52665       { 0x8d9183af47f675d2L,0x9959aa9102c84561L,0xdff7591708216e03L,
52666         0x868c237abd01b2f0L,0x4c00c229a53e639fL,0x2c0667fb07d69862L } },
52667     /* 28 << 161 */
52668     { { 0xb4d2324f9470e571L,0x3af515979ca353e5L,0x479a3a796ae5778bL,
52669         0x387958a7fb1d9c91L,0x4e606558cf91edc6L,0x428384ca495a3b00L },
52670       { 0xa49f67da10f7146fL,0xbda553e08e25f80fL,0x21b034c4cb919bc6L,
52671         0x1fb454bfa7930462L,0x1fb2ac9b255d7fd8L,0x491cceff8b197e6aL } },
52672     /* 29 << 161 */
52673     { { 0x0a0e0cd91f5a179fL,0x699d872713841e78L,0xfa93f774fc47f9cfL,
52674         0x8fd0019c02933131L,0x128efed95aa46834L,0xe20226fdf080cb8dL },
52675       { 0xf7b05fc3000445dcL,0xcc818da1f52f5ddbL,0x0fa803d07299267aL,
52676         0x99cf0ab4f9f172a0L,0xb5dd3c36b08d03a3L,0xfafa550ea1c2f73dL } },
52677     /* 30 << 161 */
52678     { { 0xdda52c89d2da4e36L,0x0348948d5c333386L,0xe3a5be8b37917590L,
52679         0x42488ae238e4aaacL,0xa6ecb5be7a44eb6aL,0x3bfd640ea9b27b56L },
52680       { 0x23b8d107bd05946aL,0x01018c45bb8034bdL,0x1ffc958cd2e058fbL,
52681         0xeadc93953fd43516L,0x0659b83ea0491dbcL,0xc36115008cdee521L } },
52682     /* 31 << 161 */
52683     { { 0xc0f3761c034b0a6eL,0x2c4ce5481fb66b85L,0x7a5d3143410698abL,
52684         0x4bc07a795d59e8c5L,0x176a10eb4d19ba85L,0xa8a68c5526dae045L },
52685       { 0x7eed57fb21625985L,0x33ef04ae16c62e63L,0x78d0acd4562454bcL,
52686         0x5878d7f2a44a1608L,0xa51a423a0cf11971L,0x1934e3f2f21fd6ecL } },
52687     /* 32 << 161 */
52688     { { 0x3f2b5bd4b4805410L,0x201ca7a9f96c5ee7L,0x532ef2db94256fe1L,
52689         0xacbfc459318ddb03L,0x2375f9fd5f24c8e1L,0xd27c479b370783dbL },
52690       { 0x1bd461e856541ae6L,0x78f054a77f7ea49aL,0xc9f8777d8845f315L,
52691         0x81aed29697fc92c7L,0x9f2f8d7949929540L,0x7531e78bff5ebfe0L } },
52692     /* 33 << 161 */
52693     { { 0xd4710d5a16ba6a11L,0xb172d8a0e056d27aL,0x01879d2b8301e5c0L,
52694         0x100c3e706f6a3396L,0x4a33d4a4e4e1cab1L,0x48016f0f08017d74L },
52695       { 0xbde9e0f18cec4fb8L,0xd8604899eb15c26dL,0x17ac5d884a21f615L,
52696         0xb8f1e7060cb0cddfL,0x0ead85644a0d51c2L,0x7bff69bdfd6bafa5L } },
52697     /* 34 << 161 */
52698     { { 0x028acd1cb6b73820L,0xc931f4bc815047a8L,0x22c6159f1ede2c60L,
52699         0x571dd40c99a4820fL,0xbaf08be0b450f472L,0x6475536aeb5bb639L },
52700       { 0x033568e4d984d0c7L,0x2ab7dd4885e910d4L,0xb0d76698d0c632ebL,
52701         0x954d00f3e3c34a46L,0x53e8772de651bc5eL,0x4910b07b6e3564f6L } },
52702     /* 35 << 161 */
52703     { { 0xe1550b37e758fcf6L,0xfea2446f763120abL,0x5db50b38124f80e6L,
52704         0x5cc28a7830c3301aL,0xa935846fd950d5b9L,0xae3e87f2ce43ebe3L },
52705       { 0xf033b25b7d0776a5L,0x941d186e882c5916L,0x0430c4503d6d4f7dL,
52706         0x4e0641c0726f30ccL,0xdfcdbd1626c66c27L,0x43c4590ceb00e495L } },
52707     /* 36 << 161 */
52708     { { 0xd8cbdd8b70435ca2L,0xede7fb3675af3a63L,0x6c1fa971090b36bcL,
52709         0xdd2292eb85455ed2L,0xf9c3889c7fbe5041L,0x2ec87c15506d605fL },
52710       { 0x2691b0a28b099c25L,0x27961c8b89944e21L,0x8e9e18a5147f5304L,
52711         0x6a82e35baf7dce25L,0x6745339c32a4bbc4L,0xe0bf0e0ee026676aL } },
52712     /* 37 << 161 */
52713     { { 0x3c6fd1ab352a43fbL,0xe57e7f8cbd68dbffL,0xa4a5b74e9ea30f41L,
52714         0xacea695d2d5a3a34L,0x183be19adc8fe4d3L,0x22fce6281b9f9d1cL },
52715       { 0x8b1ae75da5d35bc9L,0x213face52c673f82L,0xa879851d6568d549L,
52716         0x327c59937f8d8112L,0x56b982e2a7869b71L,0xc77afa6110bb8086L } },
52717     /* 38 << 161 */
52718     { { 0x1dcd57541ccadbe8L,0xd2d8c36512b37773L,0xc1a7a5b7d50e8680L,
52719         0xab1a00b3e19d155eL,0x58f4bcce7a9776b8L,0x1c02df3320d9d7aaL },
52720       { 0x24f00d31db8cea6fL,0x2680b029d4aa0785L,0xf3db2889c48587f5L,
52721         0x1811dd2521a7fabaL,0x5836964bbf820746L,0x3b118bab97aca83eL } },
52722     /* 39 << 161 */
52723     { { 0x14babe6321d76845L,0xf7b4c662c60f5934L,0xbf212c4434de5b23L,
52724         0x57c478a35bdf0a35L,0xddecc21535dc8714L,0x1609b7401571e91aL },
52725       { 0x41998697ba45b40aL,0x6ef382d468cf383aL,0x77a24c1488c0ec9cL,
52726         0x0a5e245297b377a4L,0x2b9d72bf18f9804bL,0xa4c21326f51ddaacL } },
52727     /* 40 << 161 */
52728     { { 0x397049f4c785c7baL,0xa87db27da1decf9dL,0xce6d5ec1e7862c0cL,
52729         0x17a98db834350bf1L,0x6ceccd8030ec8d74L,0x4790cc07bcab4aa8L },
52730       { 0x4378b1feb4f771a8L,0x3c54588b404dfcbbL,0xbddf0faa8d60f86dL,
52731         0x987583da3573271aL,0xb0afe4ec4b8f8032L,0xb5c44605b69d03f6L } },
52732     /* 41 << 161 */
52733     { { 0x7f69e8bfed7d4230L,0xfe54dca7d8ee8cbeL,0x6ec2b75f71b72d99L,
52734         0x97e2b30f8dd8338fL,0x9916dcdbbc75bf05L,0x22f4291aad5c114cL },
52735       { 0xb6af2e86f9ba5c98L,0xdd7d738dfd6fc5d8L,0xce7af7d544649034L,
52736         0x2979be5cd163b098L,0x5acd51858db8d84cL,0x82b0e4a5ca64d1c0L } },
52737     /* 42 << 161 */
52738     { { 0xf27f5f4f480ef46dL,0x2f49f44fcba811f7L,0xef40508d43961b6cL,
52739         0x0f6778e8df9fb37fL,0x97aff7e8446864b5L,0x29aeb86d4d264e1eL },
52740       { 0x48baa1984901daacL,0x91ade9db02b483cdL,0x00952a61cdb6abc4L,
52741         0xa1a51250de7f22c9L,0xe6adfaacc19ec8d5L,0xa7d2f066fc39838dL } },
52742     /* 43 << 161 */
52743     { { 0xfbe20a8e270bcf2fL,0x9882e7a0c35c60f9L,0x74d8e63f560e716aL,
52744         0xdc689649bae281e2L,0xd454571036d9b680L,0x0a0f1c681740ca0bL },
52745       { 0x228dd692dadf3782L,0x6ab0bede632d6e56L,0xae2f5535e1b7add3L,
52746         0x2ce1c6fece308fa6L,0x7a11b255db881355L,0x903007107bee5bb7L } },
52747     /* 44 << 161 */
52748     { { 0xdd55c21a9f1a57d6L,0xc9e1dcf9f6043ee3L,0x0385e3f36747e2baL,
52749         0x6511555a932e55b5L,0x7f4053b3700e73f6L,0x23adf65d992916a2L },
52750       { 0x4664bf231bfc40a3L,0x8400e8f27974d63fL,0xb70f104dcff08198L,
52751         0x4c44382f4d1710afL,0x5593a751374ec807L,0x6af17e84462c6112L } },
52752     /* 45 << 161 */
52753     { { 0xc1ad3eb7b8f1f38dL,0x74bb37c88d462e67L,0xd127b6e6246b0388L,
52754         0x3054aaf0824defffL,0x4e981d2e487809aeL,0xba76b7b805ead528L },
52755       { 0x0a167834a7a32c6dL,0x3451ee930268c370L,0xab4da0971b625d09L,
52756         0xdb94f9aa304e60b4L,0xf3bea685ab50c663L,0x8d929a0142d4c11eL } },
52757     /* 46 << 161 */
52758     { { 0xfce03e6eaa911497L,0x32cba5cf546ab5ecL,0x631123d0b1a71e10L,
52759         0x49f3a80906bcdeafL,0x783373bcfc538ca5L,0x3590890ee4b47edaL },
52760       { 0xb5c84fff39ab2df0L,0xf681be9ac737b24fL,0xf37bbc68b2b0052cL,
52761         0xd9f03cf6fde04d93L,0x23171bc2e43803e3L,0xeda51460040de801L } },
52762     /* 47 << 161 */
52763     { { 0x0e09a74d0bccf0d7L,0xfb429a675b58037aL,0x1f2660d2200b89ccL,
52764         0x489b332e04efc617L,0xb53d4f65f38ceeb4L,0xeaaf759546c4aa4aL },
52765       { 0xc6cff1fa714b9f97L,0x6a647072ec0dd5b7L,0xcbf59eb1637384bcL,
52766         0x043003cd2240993cL,0x134cab640497f9afL,0xcdb44a4ca9fcc655L } },
52767     /* 48 << 161 */
52768     { { 0xbd9a66d6543b3e41L,0x2948c0a62ae73774L,0xa75151dfef38e9b3L,
52769         0xa3348ae5754fb3fbL,0x1218fa8f13069b72L,0x532bb0510835dfafL },
52770       { 0x2121a98edf2be3c6L,0x85980de69e5199bcL,0x1b23a4be1a1eb6eeL,
52771         0xb5c48b92adeb3ae5L,0xeebd305dedea2b45L,0x20543f04c37198eaL } },
52772     /* 49 << 161 */
52773     { { 0x9eb2d599fa727a5dL,0x27cce415105643ccL,0x2face9e8c06035deL,
52774         0x967f70e4c5d916cfL,0x477224ece7cdc451L,0x70a3de4ea9a34198L },
52775       { 0x84ebd23a62628f21L,0x517cbb6097f55e75L,0xa4dc8d8ccbfaa795L,
52776         0x821d53c1a9c17b12L,0x04e94aea5124d5a4L,0xc72432c083efbc58L } },
52777     /* 50 << 161 */
52778     { { 0xb7a2090999f73a42L,0x019bf3a630db0901L,0xcf0c2a7281cfde4fL,
52779         0xf656a2117b0b04f8L,0x88cedc1896043e90L,0x4482c3786ae4c551L },
52780       { 0x169f25d3dc70c774L,0x0f8cc86cb552fbe4L,0x17d0556b88d2f3eeL,
52781         0xf5af9d6ff864ba64L,0xcd509d82f93dbf7fL,0xf00c76f51b98df35L } },
52782     /* 51 << 161 */
52783     { { 0x19fbeb37856e35a3L,0x1788055c88f36390L,0x9da657f165361c9fL,
52784         0xc9f327b7e35a36b1L,0xdc388bcb04b9174fL,0xa79bf7d3349a87c8L },
52785       { 0x865958b202289b24L,0x4096845ecebc4686L,0x1127085b42ce096dL,
52786         0x56f31d12735241bfL,0xe2239ab543b89a15L,0x477cc5b3a6a1f0f2L } },
52787     /* 52 << 161 */
52788     { { 0xc44c81525d54607fL,0xe742a6f35c9ab491L,0x50df96d9be8c2ed5L,
52789         0x3aa8c9b4e7f5cc4fL,0x577d534c3f12e8b5L,0x03f9573da33a57b1L },
52790       { 0x9172e1aec5c0c895L,0x64fa9822a2e19442L,0x17db2388178a10d5L,
52791         0xe75a6bdc2755ed55L,0x6a6d9dc3f9188333L,0xdd93a3b83eda0c41L } },
52792     /* 53 << 161 */
52793     { { 0x353d1f4bad0d960fL,0x6fbf4355846e07dcL,0x2156ae3c3a1bb429L,
52794         0xfa95a260442e6e21L,0x659a856ac2b31d7dL,0x9b56cd6563ecb2d0L },
52795       { 0xac9ec96823a787b7L,0x4102d82e320742deL,0x470ee0ea50a422a2L,
52796         0xd3ca8414af386491L,0x28d8994b1a0d8192L,0xe601e4e2b3f117dfL } },
52797     /* 54 << 161 */
52798     { { 0x906c071c4e9ab844L,0xeb1a5806f085a058L,0x2f14c3ac176e2f59L,
52799         0xfc1a3020bd19f909L,0x5e67d789ac060e45L,0x75dd23a7b707084eL },
52800       { 0xb9dec51a07e89974L,0x50c9cd0b38f97f3dL,0x368b0f53e14cd6fcL,
52801         0xea4c7f8b81ab93b2L,0x774ca31d1b7aeb66L,0x94c14607288f51a9L } },
52802     /* 55 << 161 */
52803     { { 0x18c41b62fe32b90aL,0x2e11c7e6be96e1aaL,0x72832e8c428b9d81L,
52804         0x93f63cc0058ca451L,0x603f18af7cc827f1L,0x31c8b8fee038eb26L },
52805       { 0x21158b24411cb335L,0x48dbbed70d9e953dL,0x445e244e4d62615cL,
52806         0x2f5309ac28ef4922L,0x12ee44c60d4dc305L,0x7dc0363f56f7677aL } },
52807     /* 56 << 161 */
52808     { { 0xf73471b5ef349ec5L,0x014dae75565aa6c7L,0x57cb497dae082cefL,
52809         0xdfcbf2b5c3e563bcL,0x22149c0fd1125f95L,0x529f419b425bc019L },
52810       { 0x049476deaee2094cL,0x3490c0490cbbb583L,0x56c5c62d1256424fL,
52811         0x0a118ee541bc66faL,0x0d8e9ff8296ada14L,0x34356e8b0134f8c5L } },
52812     /* 57 << 161 */
52813     { { 0x5e41ebd6eb28f97cL,0xe054a055d6a393f8L,0xc0a19e38db6555e3L,
52814         0x1b40c80fbabf4f9bL,0xfca17ae2780d5107L,0x89ae096f379701feL },
52815       { 0xd79be295b53ebb0cL,0x3112d3a5942b2247L,0x6c1f44d30de10f30L,
52816         0x2a17fffb0041f800L,0x13082de044552d55L,0x319aa9c0cd11c85aL } },
52817     /* 58 << 161 */
52818     { { 0x63ea1a6ae760373bL,0x00f2addd11742d8cL,0x46b17c9cafdd38eaL,
52819         0xf4121c5a4c7e78d7L,0xbeb70ef90048e4f0L,0x0b60c2b6bf7f7348L },
52820       { 0x4bbadf7632969689L,0xcb6a8a20e12708e4L,0xc43ad55b5638eb7aL,
52821         0x4a72b02b3d27bf7aL,0xecc95d92e5a54c30L,0xae52514bacc45d53L } },
52822     /* 59 << 161 */
52823     { { 0xbf5a2b5132d1f651L,0x6a2a74116e438838L,0xfa6353dd6c067d61L,
52824         0xf6918622b96ba12fL,0xf0fa254d45f595f3L,0xa0f0cb4b92f680a0L },
52825       { 0xf13ba734463e3f27L,0x7e3d4eb1a32d7f9aL,0x348baaf26f6502dfL,
52826         0x8021a9977b830e5eL,0x503f38ca55caf601L,0x27dde9e8f4bb74b6L } },
52827     /* 60 << 161 */
52828     { { 0xfd5a49310eb63b3cL,0xdb9f1a1510175713L,0x044d42c23e11c321L,
52829         0x5561f2e9b7961e8fL,0x70b3f7557ec7c597L,0x5dd9671235aed561L },
52830       { 0xc6cdc78ee1bcc2b1L,0xebcf6f87f1117aa5L,0xef470e0ae3669f78L,
52831         0x87b13e0fd38e0fe8L,0x01bff01439c755c7L,0xa66f2521c37529f8L } },
52832     /* 61 << 161 */
52833     { { 0xac56a8b223f78e49L,0x908c4be58708f0b5L,0xa63aa4191536f6b0L,
52834         0x8c08578fe5a95771L,0x5d2d1d6b9c2ae8daL,0xf3e4ef12f1527cc4L },
52835       { 0x46c1ac13920a90bcL,0xc0bc661d28ba758fL,0x9114e016585ef450L,
52836         0x8ab6a1f6e899a032L,0x57d4089606b658baL,0x2ef87621eb83235fL } },
52837     /* 62 << 161 */
52838     { { 0x033a4d4c4ebdc925L,0xff239a3efe1b346cL,0xd7ab2fb388d03949L,
52839         0x56ce2e41bd6e8e4dL,0x3826aff0e55da68dL,0xc9c7ba7451267f98L },
52840       { 0x5264a48ae6710c7cL,0x3635f1d4e7605975L,0x53a1849a94be903cL,
52841         0xe4fc3617128d5859L,0x7686804d7e4dd785L,0x6f04942d2dbcfe4fL } },
52842     /* 63 << 161 */
52843     { { 0xe80b7f5562927d6eL,0x92b98c350c0cc89fL,0x9522896d15117facL,
52844         0x7a224db5fdd3ffcdL,0x9502ecd8fbfc8908L,0x4e1dc71ac593105eL },
52845       { 0x052aade62f0536dfL,0x0c7cc371f324268aL,0xe7c62f2ccd843bb4L,
52846         0x77d48fa36df2c231L,0xb2c29803cb8f68c4L,0xad7ccf519bb9fddeL } },
52847     /* 64 << 161 */
52848     { { 0xd0960bd80fab968cL,0x6899e4faae028db0L,0x975ccc77a9850916L,
52849         0xb41bd531e5f81554L,0xbdf8ab57c8cff2c8L,0xea306a01f5822be3L },
52850       { 0x1f0ac0e7befbdbbeL,0x72f4b0e960519f87L,0x22bd8b82e3cc86abL,
52851         0xc43bde8d2b2beaeeL,0x8168781e412617ffL,0xc5610627b7ee7096L } },
52852     /* 0 << 168 */
52853     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
52854       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
52855     /* 1 << 168 */
52856     { { 0x0869457a01a8eb44L,0x522239857a7bedd7L,0x2c04b0c600057505L,
52857         0x468be6e80b09adebL,0x2f3bf32b6f81474fL,0xf54f949da712ccceL },
52858       { 0x292cee424cdd8f2aL,0x3d9fdf6b9c221be1L,0xe54da66156f47b2aL,
52859         0x2ca76835840b5d1bL,0xb52adb6a8a6e8cf6L,0x8b416a6bdade153eL } },
52860     /* 2 << 168 */
52861     { { 0x65f7d2c18565afc9L,0x764c897170fa7b82L,0xe268634c986436f2L,
52862         0x6334d8d133356165L,0xf17164269ec7957dL,0xae834331b8093983L },
52863       { 0xedb1fe5cd2dfcce7L,0x6195b86368463e5cL,0x746e5f4da691b665L,
52864         0x61171291e1e2727eL,0xbb4aa8f16f27b029L,0x1037657d7f42c197L } },
52865     /* 3 << 168 */
52866     { { 0x2af8bdfa970f96adL,0x19d09a6dd0c86e6dL,0xd57fd5ced7046d2eL,
52867         0x5ea025f7d545fd33L,0xe2ccb6f43161ffd7L,0x3ca5286209406242L },
52868       { 0xf3536d60b5c90905L,0xd086e3b9d5b290f6L,0xfd15b06a5cc55444L,
52869         0x61b0febf9a9e2a66L,0xdc3c0576653dfd02L,0x357774230a8ab51fL } },
52870     /* 4 << 168 */
52871     { { 0xfe19901b0d5b855aL,0x5facb9552f745022L,0x92fd012556c4ce5cL,
52872         0x23172d65938c89abL,0xa71f8a33aaa587b1L,0x511a3745b55c9c50L },
52873       { 0xec005f6a7185086eL,0x6dfc2761f894c6abL,0x98a4d67f9e26361fL,
52874         0x7f0a2b2321389c25L,0xd158820795ffbceeL,0x4d6b29ab9f36a888L } },
52875     /* 5 << 168 */
52876     { { 0x5ffec1d78c04bc6eL,0x35f052d16ca0dde2L,0xfbe3844c649c850bL,
52877         0x450263e610fa337dL,0x44f7c8f40280773dL,0x27de5d3ce896966cL },
52878       { 0x2587f47598d0378dL,0xbd49c97f4e4f6e49L,0x9e902f667071543aL,
52879         0x03398aae06577b74L,0x030926d6910bee13L,0x5576575bffa92cecL } },
52880     /* 6 << 168 */
52881     { { 0xe4ee33460562cd7eL,0xd1d385a3f01ba45eL,0xd817ca667ce11848L,
52882         0xda222cddcb69c7eaL,0x74ac74709d680afeL,0x3770357cd9596ca8L },
52883       { 0xdff57da7f7759bd6L,0x090426be20d5c726L,0x71c0ba28b7fbc1b0L,
52884         0x60faab1c13d4ed0fL,0x6fbe3567ea3a2ef2L,0x0dd3835c4e577dffL } },
52885     /* 7 << 168 */
52886     { { 0x9b758b512ce27e38L,0xe4148475a39855e3L,0x4669b3c39ee88a77L,
52887         0x3f36a671105e1ec0L,0xd0f30e5d9e88ea13L,0x6346df15baecbaadL },
52888       { 0xec65be65cf4c6510L,0x843efca194e1989fL,0xf7195d29942ce52bL,
52889         0x12201877d3ce28d4L,0x9c962aa1a97fc904L,0xc4fedb3465c5a55eL } },
52890     /* 8 << 168 */
52891     { { 0xeccb421ed0a701a5L,0xad4cb9a5b60cd286L,0xd344da9e05a53972L,
52892         0x3a8035e07bc99feaL,0xe0214485c0f77bf5L,0x50ada30ee54df78aL },
52893       { 0xdef45af64ec2d576L,0xa05d61845f9a8678L,0xa9b17db1c337e017L,
52894         0x026a4f66b84671d5L,0x606142343b7d696dL,0x71ed9aaf81cfd22aL } },
52895     /* 9 << 168 */
52896     { { 0x62805305695a3f30L,0x6ce27626e28e8fe0L,0x507386af6a54f410L,
52897         0xf8c5f738cd5c7effL,0x3ab2db9e347e85d7L,0xf5b635b0b2161b68L },
52898       { 0x99009791be2e80caL,0x6dff3030c13910ddL,0x2beeca057ee8700aL,
52899         0x12616fb11ac7e09dL,0x38c9ef9f9037c2e4L,0x39181fbf9c140344L } },
52900     /* 10 << 168 */
52901     { { 0xcdd6aee47aa54433L,0xf5ecb432b80336f5L,0x690bb949a1380829L,
52902         0x219d659ca9c9d720L,0x74abf2dd7e5a3260L,0x405ee136025c55d1L },
52903       { 0xc5c592cb1cc878a8L,0x119a38be88b31ecfL,0x4fb00f82e94e39e7L,
52904         0x66bf72e59412c068L,0x9337c8f30821142aL,0x477216340c24ab67L } },
52905     /* 11 << 168 */
52906     { { 0xa6c7953457fe953eL,0xd70d3d2f3c76ae58L,0xe1e047b52c531c84L,
52907         0xc71f3a9973735602L,0xd70bdb0f7ba0628eL,0x280fdd4e0e3e3c0cL },
52908       { 0xb5a3f5823e414e26L,0x55b2eda8f44dee7eL,0x8e1d024b2f5dd828L,
52909         0x21f054eb3b1bfdf9L,0x3d3ae74cc554e1cfL,0xa0a5863ffc42ec16L } },
52910     /* 12 << 168 */
52911     { { 0x1b76a3c5439ada39L,0x818829cf89236ae5L,0x2277cb7a750f8129L,
52912         0x44aa462a4d46502bL,0x7a12e1e164f06dc8L,0xb9a3300dba5630cfL },
52913       { 0xd2cc8d9c55b05f4bL,0x6d0b0b88a700be7aL,0xa7be99699617500cL,
52914         0x2b5b8deac03f8a50L,0x712f703e785b3dfdL,0x96a5a60accf93950L } },
52915     /* 13 << 168 */
52916     { { 0x9838155fbf9f72c6L,0x3ab3cb602c10e57dL,0x7ac228ef14bcd75eL,
52917         0x2c167e15027923fcL,0x678869d1267471c7L,0xeba35e857ec3582cL },
52918       { 0x22d290a9a3478eb3L,0x542092ca1309aa14L,0x8bb5c69be2e5d3acL,
52919         0xf83c5a0a81652736L,0x9cc576227280cd6dL,0x6653436f3b0f49a1L } },
52920     /* 14 << 168 */
52921     { { 0x7ad1f1bab497d900L,0x9d0512236c9dd5d7L,0x0ed27e5bffed3df8L,
52922         0x659028a775d2fa72L,0x69bd68154581f377L,0x142c2088e2faf671L },
52923       { 0xf9c1b8a499b000ffL,0xf31d01b18f408d3aL,0xa7aa142f42b9d35bL,
52924         0xeb8aa74ba0495da2L,0x824cc32a59a1da45L,0x3f1fbe0ff5173374L } },
52925     /* 15 << 168 */
52926     { { 0xec9071a634238c30L,0x6dd6c38b88a0f423L,0x3adace72992e7977L,
52927         0xc90b941b1ae5166eL,0x052aa3e9e3e43a68L,0xe9b1976da733a950L },
52928       { 0x0e1ca28e5ff6c9dbL,0xd1bd4350387409a2L,0x5943cc7089155117L,
52929         0x8e85794f5feae20cL,0x0d118fd669768ccbL,0xc647179d53120895L } },
52930     /* 16 << 168 */
52931     { { 0xfeb984b3ee828fbaL,0x8273f830e2bd188cL,0x177ef97e3ca0a99fL,
52932         0x76d4796dacc000acL,0xbad0fa6eb140f51aL,0xb275656706ebc810L },
52933       { 0xf89eb78fa18cb32fL,0xcfc37eaea65285b0L,0xe2b29cfbb25e9d1bL,
52934         0x9388ea8fb4e7aef3L,0xee606c12e267e845L,0x6b103c549f5806d7L } },
52935     /* 17 << 168 */
52936     { { 0xb9a40e78e31fd643L,0x648cc34a97950a34L,0x85c5ca405900be55L,
52937         0x2e519cf12abb843bL,0x6f9d0a7f27436edcL,0x2f569c9d6694f363L },
52938       { 0xf6d1b325f6f1bd24L,0x01103c0d4044b353L,0x2d3ce56f3138b549L,
52939         0x5379bcf71c28bc5bL,0x6768220d08ac00d1L,0x973f92ff0152746cL } },
52940     /* 18 << 168 */
52941     { { 0x5e992944b37b0486L,0x0a334b92001fa124L,0x6653cded9c9ab466L,
52942         0xd512612fabac4da9L,0x636bf431c502b860L,0xfca1c0c2c3d20db2L },
52943       { 0x7073f293f85c40c3L,0xfaabc77acfba9eddL,0x58842eb97f9b570dL,
52944         0xe8cd4f53702aec24L,0x8975f4e6e08113a1L,0xcc0d7f17767bedd6L } },
52945     /* 19 << 168 */
52946     { { 0x5163bb51ae315a65L,0xf82ec4cdbe405348L,0xffd381a46b1801a4L,
52947         0x33f9b8ad2f6ba570L,0xd88c58a58ecc0000L,0xc0b9a639cfdad25eL },
52948       { 0xc78cb70fe3bd808aL,0xf54b86e573ce5eadL,0x111208ed5610a761L,
52949         0xba3579b0e3c8e27aL,0xbadd918c63b85bb7L,0x9e10da0b71bcd972L } },
52950     /* 20 << 168 */
52951     { { 0xf418e3f63766f2aeL,0x4a3ad3c8053ef1c1L,0xd01e5b5b560db262L,
52952         0xa583edc7c02bf4c3L,0x7c9f706052f318d3L,0x0852556f1f5e1ffeL },
52953       { 0xe1c70aa7feb0e63cL,0x59f0a3f989a8c058L,0x4aa4cf021ffc0adeL,
52954         0xbb880e4138a78632L,0x35b0f7596f28f096L,0xf9c4fe17d5757d7dL } },
52955     /* 21 << 168 */
52956     { { 0x160303ded896adf7L,0x19a46b6c6beb8930L,0x33dfd962f010f74bL,
52957         0x03b699cc00e5610fL,0x17487b7595078dfeL,0x63bc614253f3479cL },
52958       { 0x43f3d994858d5b8bL,0x383349349483c0ffL,0x47c917a67977142bL,
52959         0xdc50fb80df7eead4L,0x4e3a1d3fb5b82be1L,0x091af8796d7317b7L } },
52960     /* 22 << 168 */
52961     { { 0x783e5066af151a9aL,0xec0a9c175466df17L,0xdecd12310174b0adL,
52962         0x654af66a3b2aaa45L,0x849d64e5b1fcdd11L,0x7e8e2ae6d05af56cL },
52963       { 0x12e887b7318a6184L,0x42d1445554ed59d8L,0x2eafeb48ee54ddc5L,
52964         0xd1f9e6b980c94a8eL,0x5ea691e3263696c0L,0x7f42f3796e03eed3L } },
52965     /* 23 << 168 */
52966     { { 0xeeb8accfd69b82b9L,0xb4c4988ae0b61d73L,0xb78becf19df9b59eL,
52967         0x13274f6236440c93L,0x33d287f5697d5a77L,0x391fe6129af4053eL },
52968       { 0x986c42b21c16e858L,0x23f5d1dffe04125aL,0x2f57ccb3af9541ffL,
52969         0xe5b4eec70f1a8bafL,0xaad23ce7646c1b6fL,0x69495ee5a6ff96abL } },
52970     /* 24 << 168 */
52971     { { 0x78b8879cfd6376ebL,0x22a76461c01e1edbL,0x6a44be39369cf0c4L,
52972         0x6653670d5ae54539L,0x257bd7516fb43ad0L,0xb3ac371512baffddL },
52973       { 0x48659d617548eabbL,0xd8f931f80cd468cbL,0x98f0241549e3b531L,
52974         0x90b0d71670df011fL,0x26d73c54ab98f066L,0x06591ec988475d5eL } },
52975     /* 25 << 168 */
52976     { { 0x6fa72e3518f18e71L,0x6c04fe2d8123ff14L,0xc48cb53a197481a9L,
52977         0xf059db349860e48cL,0x35e8341ace46ca7dL,0x880f4ea4b0400f7dL },
52978       { 0xb4c5ea9acc9cc40aL,0x6522c768e2555fa3L,0x95207f39ea2c32e6L,
52979         0x7b6fc09fa8be60e1L,0x772b829f29902652L,0xb7936b90af6a48dcL } },
52980     /* 26 << 168 */
52981     { { 0x409e3b1109758457L,0x59dd0a8c1dea73d9L,0x528906a58fb18a01L,
52982         0x6fa55967a17ffb33L,0x9523cc3d50edbcb2L,0x35600b3e44d43541L },
52983       { 0xc3a7d22c8f87dbc0L,0x5514c967c1b225abL,0x78e5701988304a74L,
52984         0xe9b417ba35f3b54dL,0xb72a243c48eea230L,0x4e173eaf291ee52dL } },
52985     /* 27 << 168 */
52986     { { 0x79b854ca2127c795L,0xd9457d8f86657844L,0xf8c9e6ef186668e8L,
52987         0x84c8855df913c2f6L,0xf207d36ad641cc12L,0x7be9b5736105ce0aL },
52988       { 0xe72cce1974ec078dL,0xc4f47413d09950c3L,0x640bf6eb3974554eL,
52989         0xf880dcfb844497baL,0x3744626999bbcfacL,0xcf1712f4316f4d64L } },
52990     /* 28 << 168 */
52991     { { 0x627f6328412b84c3L,0xd427e977a04545d2L,0x5b0145bc104f25c2L,
52992         0xa6931c4f2ac7ad62L,0x407611431f8d42f5L,0xfda5a76be7f8a0b3L },
52993       { 0x4f1ca5cffe0946b9L,0x6def7b9fbeb2d427L,0x984bd4bbc9a0d136L,
52994         0xb9a778235b3af1c1L,0x04ee66ae38ac2087L,0x63374ed926d9dbb9L } },
52995     /* 29 << 168 */
52996     { { 0x68088e9c3983deb9L,0x2c95ecaa2ed99988L,0x371af002917f200dL,
52997         0xff33aa5dbb4ff0dcL,0x1dd5fcf2e47bbd6eL,0x1624b973e75f73ecL },
52998       { 0xf6ce0e9db9722af3L,0x8bde5b8818226fcbL,0x243753fc5b5da478L,
52999         0x3b53e0e3bdf88daeL,0x59f8c86f325cedb2L,0xabd4076d70fb9681L } },
53000     /* 30 << 168 */
53001     { { 0x1996761db8759af1L,0xfb85cdd8e4a705f5L,0x2ea7aa0b35111725L,
53002         0x23245d4157a17f4bL,0xcbdb650e0d00eb9dL,0xb40823d9e23a4a3cL },
53003       { 0x041bfb67229163f8L,0x020ad3c16d47b83dL,0x3bc8975d344c8ebfL,
53004         0x287efd06d91ff408L,0x1ca5d75a2059106bL,0x4ff27af3b90c5d66L } },
53005     /* 31 << 168 */
53006     { { 0x416b7c61ded914e8L,0x1aeee7d007ad4237L,0x59d5852476c2b7a4L,
53007         0x427a102c98665f29L,0x8504aa8d2a1aefe4L,0xef2dbeadc183a736L },
53008       { 0x5cb5f222f533358cL,0xf2ebb47d36b0d678L,0x1de4a0e7f2c2cf99L,
53009         0x62613994ea95a161L,0x68a86f4012d66ed4L,0xeb12fe75b2af52f3L } },
53010     /* 32 << 168 */
53011     { { 0xcf947c0644ba39e6L,0xf5d5216cedfe78d7L,0xd00115c05f1835c9L,
53012         0xdf084152d8c79d90L,0xc0c3a6846db5f791L,0x40514451749b18cdL },
53013       { 0xd314b7d5734df3f1L,0xbccdd3f07f541415L,0x97ed5af06855a942L,
53014         0xea84ae9ee9d02ab9L,0xb87e90343238a5d0L,0xd12d25c3650a0eabL } },
53015     /* 33 << 168 */
53016     { { 0xc3747c584f9d2c34L,0x493a0adc95429c92L,0xf9b5916238a679ebL,
53017         0x04d500a16bac07f7L,0x8938f4f96a809676L,0x44ecbbf0c5b25a4dL },
53018       { 0x3b68705504768400L,0x6a432e14b4db3907L,0xff82fb56ad375d2bL,
53019         0x87f59f97944210c2L,0x2b680b2051445242L,0x1e0986466cd75962L } },
53020     /* 34 << 168 */
53021     { { 0xdd2eea82672e5a4cL,0xb05ef9ebccc68d94L,0x626ce368a3fa4215L,
53022         0x6e376f67fe46bd46L,0xaed7a0bc33c4f169L,0x4a92c6093af5c4fdL },
53023       { 0x6615245fa690fb49L,0x571d2d870d64f04dL,0x6a45df34641ce79bL,
53024         0x045ddbd02655d316L,0x2b6c574db4fbc42aL,0x41545fbc5b2dbbb8L } },
53025     /* 35 << 168 */
53026     { { 0x484996b97d8f1eb7L,0xf72f3a8110bd1585L,0x418e00e7b67eb27fL,
53027         0x354e56c97877c18fL,0x7f11f5040a8b37f9L,0x66591146ff58764dL },
53028       { 0x816ac849ed0bfc38L,0x85eaa6350a50a99eL,0x7fa62d9c5bf4995aL,
53029         0x77840d5003413385L,0xe4f023bde83f9fa1L,0x2c5f8e1d9cfa7578L } },
53030     /* 36 << 168 */
53031     { { 0x1473b55b86a515a9L,0xa9e3230a3b337c64L,0x7e8bf9049db668f1L,
53032         0x1db2c25ef27f9fc9L,0x0c1086072d9e467eL,0x4505579aa3f00d52L },
53033       { 0xe2ad661b240400a7L,0x8022294c11af4874L,0x29e9037078bba8e8L,
53034         0xbf0fbf08f6baca04L,0x2e46d2b74101fab0L,0x66065490c61089e6L } },
53035     /* 37 << 168 */
53036     { { 0x18b01aa935dde51dL,0xa7496997a7d044b8L,0xcd9c467f44c23d2dL,
53037         0x96211b86659e4a5bL,0xa2a9000f3e17b717L,0x7af9c312dd90459aL },
53038       { 0xf0d6c24394547203L,0xa76a23dbd77cc691L,0xe1b7fce10ef364deL,
53039         0xe08c1d0bb689c810L,0xb75bfacb0a43ca02L,0x1b7afea5408ac99aL } },
53040     /* 38 << 168 */
53041     { { 0x3b1abdb85a4a8a23L,0x8f52060c4d68bcf2L,0x7408306a00ab3146L,
53042         0x652ae3064b86b775L,0x276a14a0b0695b00L,0xcf8af11f1b771254L },
53043       { 0x3fafcc63b91118b3L,0x6c49000a73bacebcL,0x53852d084e3f3d6eL,
53044         0x78977e91fdfccca1L,0xe843cbca6ae9ea5eL,0xa99831896bb8271bL } },
53045     /* 39 << 168 */
53046     { { 0xf77b0a7387534a6cL,0xfff419f2f5b0c6dfL,0xde3c3b33357205eeL,
53047         0x867eb3a23c8ec9d6L,0xd28bed3263a99b18L,0xf5fc17e4c1573146L },
53048       { 0x30cf41e5821641feL,0x84b1970e225ab57fL,0x6bf707325a1e8ba0L,
53049         0x7bfb3bbce3cf38d6L,0x9f362787a661e876L,0x6d9137c86c0a16fdL } },
53050     /* 40 << 168 */
53051     { { 0x2131ce5b09f8a1cbL,0x7b373ed28ab129e2L,0x463cc8d677c1292aL,
53052         0xa9b7cf6594ffe9c5L,0x129125ceb99bfc4fL,0x819b42849820d323L },
53053       { 0x3f70976376541a41L,0xfd679ae5e32c7a7bL,0xc39a208df65b6b3cL,
53054         0x1c22ebc050002745L,0x268f19dde2bcd202L,0xfeac809c9c3d4266L } },
53055     /* 41 << 168 */
53056     { { 0xc5ad8903af14f8a1L,0xdfcd207c3993c99cL,0xf65f8260c7c1fd57L,
53057         0xa1573b3d41be66fdL,0xeeeb9ea476690f79L,0x6a6338437129849dL },
53058       { 0x22eeb38623a7bfcfL,0x258fc0743393e894L,0x008efb477ce9602aL,
53059         0x4bf127b699c7b279L,0x150da482fa1bfd7fL,0x7b84744d293754dbL } },
53060     /* 42 << 168 */
53061     { { 0x3af9919db2183277L,0x7f5990fb4f6182ccL,0x17603db034f716d2L,
53062         0x6b79f6538f135ad5L,0xad9189e68092d128L,0xa5f3ab8efc6628c1L },
53063       { 0xa36b978e84b6d30fL,0xf2a7e1c64c001f26L,0x2acbdfd676e79beeL,
53064         0x71b5faec86f6d6c6L,0x23d9b7c849b0e5d7L,0x36ea518212fd4cccL } },
53065     /* 43 << 168 */
53066     { { 0x14a4af0f59df1cf9L,0x37f8641dfd7cd2b4L,0xfb6aa5d0244434b2L,
53067         0xb85f8c8b5d5bbd63L,0x833e76baedb92f97L,0xbcd9d7b50d7a2dc2L },
53068       { 0xb233f07ff0e0f06cL,0x453f10c4fcc06efcL,0xa4e8f306128a167dL,
53069         0xbd6df4690d0c09cbL,0x2b5db66b7168ecc6L,0x7ec02c77f29bcecfL } },
53070     /* 44 << 168 */
53071     { { 0x0746783787dcdbdbL,0x4cce33be320493d8L,0x9ab08cbe713c7746L,
53072         0xd6f0c1de9c6dc5cbL,0x194005382ac03761L,0x3fc11f38d0547be5L },
53073       { 0x66b378ce819fe3fdL,0x6a590acc3700fe7eL,0x4c976a728924b396L,
53074         0xa5006d8d70b9b250L,0x2fdce1b212b85f9cL,0x5858f7ce495f8f1cL } },
53075     /* 45 << 168 */
53076     { { 0x3f2b5e295de2948eL,0x84554eaae1a4a962L,0xb4e55f1293db9addL,
53077         0x9260e3eb61b22484L,0x22a898997b1a6d10L,0x571bcd3af58d1ce3L },
53078       { 0xd62db0edecc88a76L,0x88352f634af2cf53L,0x8d279316b61c73adL,
53079         0x7f898e09ec74d6abL,0x39b2b0c05412a81bL,0x623a5ea30644b6a4L } },
53080     /* 46 << 168 */
53081     { { 0xe876b53bdb0f6565L,0xd0dc323c4650204bL,0x0e4af31b0201643fL,
53082         0x486173207e8a0e6cL,0xe09183d457643a1cL,0x3c55bcb5ae8359b1L },
53083       { 0xa06078cb7b467835L,0x4d3a35d901b6bb3cL,0xd4f1d8233963fd31L,
53084         0x9c1b06093d4cce05L,0x55e368d5da550340L,0x50c3feee12c4b7b3L } },
53085     /* 47 << 168 */
53086     { { 0x6de0fcdaf0f97e84L,0x1f225d818dfbc0ebL,0xe27a42efcd2c51d9L,
53087         0xeff56879c0cb033cL,0xe700cb87c82e38d4L,0xc89a02d589d244caL },
53088       { 0x0b464846ad9c718bL,0xf8d5ee1f8de96d61L,0x2cc33c3dfbfd0960L,
53089         0x3ef549f0e199b6fbL,0x29f83f686c1597b3L,0x54ca37a3731712ffL } },
53090     /* 48 << 168 */
53091     { { 0x357540ab903ff177L,0x225280b8276af514L,0x33d273ac14d7fed3L,
53092         0xfef6b9ffd186ee3dL,0xa94c207101a7b1d9L,0x4ea3627450bc8bc2L },
53093       { 0xc68959c9fa98a918L,0x8f5ecceec7bdc262L,0x7a73a4fce6861310L,
53094         0x19bcac90c828330fL,0x73e3b66f7ef74fdbL,0x60f7698352d8f2f4L } },
53095     /* 49 << 168 */
53096     { { 0xda57f1a65645cb9bL,0x3d5d3190f0840240L,0x6a0c6ab101bce275L,
53097         0x38993676ad23128aL,0x54f7b5d7ea0da248L,0xfee930b38b04ccb8L },
53098       { 0xadb9034e2cf3bf1aL,0x0488b71ae9b608daL,0xa3e51e303bd1172cL,
53099         0x56dffa5844993c1bL,0x6b3211fa4cdcaf10L,0x223b2a43834d4e17L } },
53100     /* 50 << 168 */
53101     { { 0xb31f934134e43ed1L,0x895c99973c6b7f58L,0x360021084c465126L,
53102         0x7eb0bf6b095df89fL,0xde3b2fa3ac534af6L,0xd9dd9f55c22477caL },
53103       { 0xf52cfffc2092e355L,0x4ba071ac8d8bffc6L,0xafb61137abefe750L,
53104         0x2887d0e4cb62210bL,0x0eb2be515f4fc157L,0x8c993039438fa2f7L } },
53105     /* 51 << 168 */
53106     { { 0xfd2a61093efae008L,0x60fa269552f57cafL,0x3591e64f481c36c1L,
53107         0xdc2b9993c908a87aL,0x76bd4dea5bffb50dL,0x913a0458f70fb0f5L },
53108       { 0x45ea6c4c097bbfc3L,0x3ebe29d3fa9e90c1L,0xc69532426479c087L,
53109         0xdd1d24509abc7a4eL,0xa497b072d0fc7791L,0x477d71f9388ab90cL } },
53110     /* 52 << 168 */
53111     { { 0xab3578047e03a14eL,0x0f4f28688caf673fL,0x919e661e66530425L,
53112         0x28da445c91ba47c5L,0xd6d0537566c394feL,0xfe1864a302e8ae91L },
53113       { 0xd34baca2a753aec4L,0x43b7ffe7a2c8d292L,0x496659eb04efb8f1L,
53114         0x310ec2a9e0252dfdL,0x98173d2f9168a80eL,0xa3e018d631497255L } },
53115     /* 53 << 168 */
53116     { { 0x39ee6439ddfa0ffcL,0xaea6f882c1d1d54dL,0x688feff654a65059L,
53117         0x17ee5aaa37f25ebaL,0x6c9b4f2932b345f2L,0xb883c0c75b4d62ebL },
53118       { 0xaf33e4ae3135aa7eL,0x28a7572c924146a2L,0x67dc5dd37e77ae8bL,
53119         0xe11cd9c5ff39b601L,0xa86f090b5e6f364aL,0x76f7517500b84247L } },
53120     /* 54 << 168 */
53121     { { 0x26d3a3e3fbae20ddL,0x5e9b73cee1dd2b25L,0x7008aefb0235d5b0L,
53122         0xa92af4ed2aaf208dL,0xab786c9bb1132040L,0x43250e6c9a91269dL },
53123       { 0x00a15294c9be00ceL,0x2d5782df1698dd42L,0x3f980bbe76e3d6e3L,
53124         0x5b602647496650fbL,0x461edc3271aca61bL,0x2516ab6c9805a01bL } },
53125     /* 55 << 168 */
53126     { { 0xb468fcf2967e2216L,0x97b840679ae47d05L,0xfcafaebc5cc15209L,
53127         0xaf7f6c8ccc83c3d4L,0xa74d4cd5cfa47e0fL,0xd8a51615474cb8b1L },
53128       { 0x4815ef52591462a6L,0x9c5b2cf74deb41ddL,0x39cb450b7e99d620L,
53129         0xfe8cacbaa7772019L,0x98b98210577dc69dL,0x5e02b90072423a96L } },
53130     /* 56 << 168 */
53131     { { 0x3266c887d9d9284aL,0x690f818b73646ab7L,0x67315ec6af7fc33bL,
53132         0x181e61abc30b1ccbL,0x1b81e6cd105a9e1cL,0x62a15daf5078b9bbL },
53133       { 0x74f9840f6fa8cc65L,0x356b777443388573L,0xba0f7d0506b3fd46L,
53134         0xb0ac864c92b4fdadL,0xcdeac253ef192cdeL,0x0c24810bc313b4a7L } },
53135     /* 57 << 168 */
53136     { { 0xfbcd4f77e748de9bL,0xb7d28cdfc25dcc94L,0x32f937a92e033c43L,
53137         0xb6289636d9da1f7aL,0xd774e97dd287865fL,0x8d013739e6243bf8L },
53138       { 0xee7ec1f856b9601dL,0x429017666afc90caL,0xc42d960ad2bef9afL,
53139         0x654ece7f5b430bf6L,0x02878c7f221440f4L,0xe575aa6474a4e1a5L } },
53140     /* 58 << 168 */
53141     { { 0xc96e763e71a449f9L,0xdeda66311a349fb0L,0x6f896aef3c4e8f44L,
53142         0x71ffe2d2e9eb36a3L,0xcbee21ab8f908a29L,0xaeb695f85be98708L },
53143       { 0xb6023803de61e1a9L,0x59f1ec96065ecca3L,0x2a1229f3637d0741L,
53144         0x5a9bca2c69441afeL,0xfc6daedbbbeaeed6L,0x950034954e2e31e0L } },
53145     /* 59 << 168 */
53146     { { 0xe59a827339859da4L,0x8720429fa7431a84L,0xfcab26e17ee3457cL,
53147         0xc13c1125da3b7833L,0x0bb1043fbc0b0da1L,0xdc2726ea84b526e8L },
53148       { 0x34049278a213a188L,0x400bb4a00a1a2553L,0x00e3eb25c92df398L,
53149         0xc0b7113f9c36a6ddL,0x719d185001e274bdL,0x86f08f2dcde338aaL } },
53150     /* 60 << 168 */
53151     { { 0xef8c40bf1adb09b7L,0x2efeb49c0b74992aL,0x3f0f8a412b79957fL,
53152         0x08927bfe87a06873L,0x1f63a4109288cb9aL,0x8c66fb70df2b373aL },
53153       { 0x98da4712980facaeL,0x15ce5b17d819d026L,0x097571a5749a671aL,
53154         0x85a40804894dd269L,0x3e89c13c34cb6797L,0x2d19d5e4d07119a4L } },
53155     /* 61 << 168 */
53156     { { 0x903eee85d90da9a7L,0x67723582de5ddbf9L,0xacf6898ad394eeeeL,
53157         0xa700fb8fabdb94f3L,0x1bcc4f947ac5624fL,0xee5cccff7e3b8ec5L },
53158       { 0x87d64d4d98e5a1baL,0x78727fc1ad9c4409L,0x55b4159b82310db7L,
53159         0xaff4eecea58d10efL,0x6d2ec94c11c958afL,0xf129bd1043db33faL } },
53160     /* 62 << 168 */
53161     { { 0xe1f6d71ed42eebf8L,0x46f825b9541ac0b2L,0xb01031b693ae2ab1L,
53162         0xfa4e1c357c589556L,0x65fb2504d273d1bbL,0x589d735447642bddL },
53163       { 0x7a5776adcf5e2d53L,0xab5c3544e5feda7eL,0x48e8442d32dea96cL,
53164         0x5f3e9c9e64d293daL,0x3f2df6a16b972a00L,0xfba58f5fa273832fL } },
53165     /* 63 << 168 */
53166     { { 0x5c9fe89240e9ce34L,0xfd9fb296633495d7L,0x0ae3c18a8c76cd7aL,
53167         0xb5ede1e3a6b77012L,0x5ac7a9d5a285822dL,0xe41de7da71ffe07bL },
53168       { 0x585f7e101b1bb4c5L,0x482794be74153077L,0x66f1c9d5a3e2a34bL,
53169         0x491d48f7c749830fL,0x3c0f3bcd5416d2bdL,0xaa3baada90b04986L } },
53170     /* 64 << 168 */
53171     { { 0x58225208ecbafb80L,0x4f212035aa73d6deL,0x1224e45562fe86dbL,
53172         0xa8c8a4782dc5b2f1L,0x8a957b8dc3096555L,0x6a3248b0b1591452L },
53173       { 0x1e563c58cb604c18L,0x32808cb59bf1045eL,0xf8f62de99462e7a2L,
53174         0x6b3dfe91c2489214L,0x6c1d8fc42174639cL,0xdfca11b8ef88d4b5L } },
53175     /* 0 << 175 */
53176     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
53177       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
53178     /* 1 << 175 */
53179     { { 0x5a4a5ce418690ad0L,0xd0f788e0fe27f51aL,0xd459388e4efe9a30L,
53180         0x3a45c11aef9d074bL,0xf68ab50b93ab9cb0L,0x62fbc397ecd9a566L },
53181       { 0xbfb79b7fcc587a7eL,0xfcf4d66f92870baeL,0x4f31aa21877390f0L,
53182         0x2de0c645e314cfb5L,0x56d904f6238eab12L,0x4d104a42ccb4d4f6L } },
53183     /* 2 << 175 */
53184     { { 0x3eb83a8729358cd3L,0xad741295b9c6d430L,0x57b8c77a53abe4e9L,
53185         0x0a14673ebb9feb82L,0xc0a6cbf7f26f922eL,0x213de299a32e526cL },
53186       { 0xca417e677b6ca858L,0x8d6ae0f7fc2e0900L,0x2bae0e7a62e135ddL,
53187         0x962bdcaea7ee82c7L,0x573d7f6ae5776c74L,0x9c4de6496ffbefebL } },
53188     /* 3 << 175 */
53189     { { 0x8c962fc809335d38L,0x26d1bc81eb38d176L,0xe1aeb295c47711edL,
53190         0x0812b9926cbe3e4eL,0xeecacaf90ab9805dL,0x82fefbaa3521a0adL },
53191       { 0x3a6948c0e2c31b9dL,0xb7d3905be82daf2bL,0xbd3ac90e25a34c37L,
53192         0x55afd99b61453063L,0x56d87cd190b99303L,0xc9bf82dd97ddb0a3L } },
53193     /* 4 << 175 */
53194     { { 0xcbc0bb1968916917L,0x0bbb9f921094bf88L,0xf62cb350d3806442L,
53195         0xe4d2f1cc397a7602L,0xa54bd48e43987d82L,0x77b6f8314f0a19faL },
53196       { 0xfa0c9a456e766443L,0x995ae0fff51ba70bL,0x8e242c5b9cbd8d33L,
53197         0x1671eb0813d97956L,0xccae388f40da55faL,0x97cc48faf376dce5L } },
53198     /* 5 << 175 */
53199     { { 0x1c2919bbe8c91718L,0x9dbb727a5097bde3L,0x23f87ae7f8ea2fb2L,
53200         0xe1bfffdcba310121L,0x5938c50c75329669L,0x716c63e00549855cL },
53201       { 0xe091b0c9654814f0L,0xa20535d10e43daeeL,0x16ce68b2593ddd04L,
53202         0x7813a49af59900bdL,0xef0d3eecd3e5d232L,0xe7d12cc40ee3fd4dL } },
53203     /* 6 << 175 */
53204     { { 0xe54d92cdef01fc5fL,0xc46c2ab8dda2e25aL,0x7c907fd2849f6142L,
53205         0xbb11dd2dacd0202dL,0xa4913a701d92d19aL,0xe9a26ae0cf610677L },
53206       { 0xfff1e1d5538943c5L,0x5943dcc4a47b2204L,0xcafcf33a92cabf71L,
53207         0xd571e13ce329d1adL,0x7626ad237a9a0e4cL,0xf0aa0d9f130d7f86L } },
53208     /* 7 << 175 */
53209     { { 0x09df3a4419e6aa7eL,0xe27ad0475841b1cdL,0x02d2a69fbde75934L,
53210         0xb0e05e53fd9ba435L,0x4732d88ae008c16eL,0xdebc4777ea72110dL },
53211       { 0xccb7d9932e3143adL,0x674f3753ea8cd06aL,0x56012a7a051562cfL,
53212         0x961df68425f74cd6L,0x26630e71214d8a95L,0x584e8d6365d92f84L } },
53213     /* 8 << 175 */
53214     { { 0x8a89daefebc5557cL,0x7ca71403275e1649L,0x48d923775b80bb4aL,
53215         0x0a587c52a45b3626L,0xdaff503cc75bfe91L,0xd845d3e6116d07d7L },
53216       { 0x6b5a4715a51eeca2L,0x34ac02bd74481991L,0x8f076cfc595abf8dL,
53217         0xc9de4ce9ed0391ceL,0xaaaad03ae1fcabd3L,0x8d48ec0087b199edL } },
53218     /* 9 << 175 */
53219     { { 0xbd0f2653ae5dd482L,0x59f968dd060032dcL,0x6bea33e067283310L,
53220         0xccce88cc012aa50cL,0xbb6d7f2f66838f46L,0xb764c95f05ec9bcbL },
53221       { 0xd097b60451477ccaL,0xc2fbda7b82b20a85L,0x75fe07a424e9ca8dL,
53222         0xfc4fa8240cc40d01L,0x0b17d5f90c0e95f7L,0x285e6e8a6e1e46dcL } },
53223     /* 10 << 175 */
53224     { { 0xb0641d09bc9b2654L,0xf9fcc2e68aa8fa35L,0xd12a5b4b00d5ec6eL,
53225         0x9be1a1115569d89aL,0x9c0566deffac7208L,0x7a9fd4ff7034edf1L },
53226       { 0x636aeb6b9571c375L,0x60d05aec55cdf187L,0xf4e2f898734e9d2fL,
53227         0xdaf742195ccdc6bcL,0x9d39249f608a4f28L,0xb5f1bb5e8820e2c3L } },
53228     /* 11 << 175 */
53229     { { 0xd02e9936d9589548L,0x8f1bf5755341402fL,0x1535a443057300aaL,
53230         0x3062478e65d29324L,0x4203351fc656a3f3L,0xbeb21b516569c4ffL },
53231       { 0x8113ce70e1f0f263L,0x59d1293903f9320cL,0x95061255d08f8936L,
53232         0x8be3c0f997d4b705L,0x0259742e827837c2L,0xf55ea28d95c65cdaL } },
53233     /* 12 << 175 */
53234     { { 0x62024812603dc3dcL,0x25dc5337efd67b57L,0x86b3eb38d7f033fdL,
53235         0xee3226b232646d6fL,0x8c4825f6f1dae596L,0xd2303055a5bcb8e5L },
53236       { 0x904a53493c0baa76L,0xe60f6125e08646a7L,0xaf6a329f21d45f89L,
53237         0xf20ad88a06605546L,0xcf7a0e9619a93d14L,0xf1eabcc891c97174L } },
53238     /* 13 << 175 */
53239     { { 0x72b76e9e8f02af51L,0xac94cbf1d580f95aL,0x2e9cd74801d854a4L,
53240         0x4ed4e9061f08a1bcL,0x0a2b28419d2bd936L,0xbf86350051c89ddaL },
53241       { 0x9407b0e7e3f00bf5L,0x6b1f71ff28b57ac1L,0xc1dfe03fcd28801fL,
53242         0xf3d83d64afa55309L,0x47aafba28af8f76fL,0x54eed45f6604b2e9L } },
53243     /* 14 << 175 */
53244     { { 0x59edd2640f3e541fL,0x318674b582b76ba8L,0xbf4a0d304e7f0716L,
53245         0x36fc0e4119b88200L,0x91db560240da801eL,0x638371ad2c72c2c7L },
53246       { 0xfe960c25d5822da7L,0x7a7571d14a7415e1L,0x5a6480febccc1576L,
53247         0x72f4e5e5c3c88f47L,0x224e7e749a7bd8ecL,0x3ebbf52c7631455eL } },
53248     /* 15 << 175 */
53249     { { 0xae3c2bc08608ab37L,0x35e3da8c39f336b6L,0x7413664281f44511L,
53250         0x21ce7c511d8506e7L,0x9b6718b3846165f1L,0x9e455007f5cabf6aL },
53251       { 0xec582a0e02611073L,0x269aa18d83bf042eL,0x7c54fb7c86306757L,
53252         0x453336021b948fafL,0xd3a5c508b7025d73L,0xcd6e555b428471e4L } },
53253     /* 16 << 175 */
53254     { { 0x42c9fad511a224e6L,0x6b6aeb8b69b2ac26L,0x0cf4c7fdb149854bL,
53255         0x4a7d90002fc359ebL,0x9ff0c3ea29ec8603L,0x157ae7859b24ee14L },
53256       { 0x638c809a8979e9bbL,0x347dfb2e7869d8c5L,0x2fb1e0f8a07ea547L,
53257         0x1e580d32aecdec3fL,0xbbf895730f74025bL,0xeb94d71bdd529164L } },
53258     /* 17 << 175 */
53259     { { 0x8670812a35d03250L,0x2f68343f1984cd59L,0x5fe890caf1ff97ecL,
53260         0xd47fff536f764b2aL,0x70fa44a4f8f7077bL,0x7b287efcb2c7fe02L },
53261       { 0x0718e70806dedcdeL,0x37193c827172c0f6L,0x47ad55f67b7f28a5L,
53262         0xaf83c4fe9c71a96fL,0x2d6075587c490626L,0xe647de1b933e9033L } },
53263     /* 18 << 175 */
53264     { { 0xdc5909e3f1687d4cL,0x4fe3be46d431c5a7L,0x28c41a035f9807beL,
53265         0x2c4203fd12f1f8daL,0x13f12da450a19620L,0xc32f881eae2e9835L },
53266       { 0x56328ef7622587d0L,0xcf785f038f209f66L,0xb562ea70a2697748L,
53267         0xa762289055598769L,0x9842bfa8fbf41fd3L,0x304c3057fa401ba0L } },
53268     /* 19 << 175 */
53269     { { 0xb8d685d1c56bc716L,0x1eceb18f1fccc358L,0xf94bedc82034cabdL,
53270         0xa9acaf11ad003472L,0x6fea0a55ad0786c6L,0x60f7f9a9581f6f52L },
53271       { 0xc4736494400bcca5L,0x221d8f8a3606b047L,0x533756fb6339c7fdL,
53272         0x1e068e987510c1a4L,0x9bf9abb6ededfa09L,0x96895ce548d54775L } },
53273     /* 20 << 175 */
53274     { { 0xc995b0171552c477L,0x6f92a95252351781L,0xa9d4bb6c4da25dafL,
53275         0x2b02828e3cf6aab7L,0x5f4febed11fa4d0bL,0x42f0e61ea12d9d37L },
53276       { 0x1ceef875d24610d0L,0xa7c85c485d4eeceeL,0x33fcfa3b79340a49L,
53277         0x3671e563b00b3491L,0x871f74e493eade0fL,0x1ed095182c546f3eL } },
53278     /* 21 << 175 */
53279     { { 0xc003b709a9a5c68eL,0x9441e7b26c84310aL,0x7ec3b652dd90f7c5L,
53280         0x17e601685b526324L,0xc5f77fee479573aeL,0xe89beed18453fe7eL },
53281       { 0x259a2b0364540cadL,0x8c2f13322b9a8053L,0x1db53ab7304940edL,
53282         0xcf780c5d1612763dL,0x2edd7285e19b62f9L,0x20ddc9874abdd7a5L } },
53283     /* 22 << 175 */
53284     { { 0xa70aa6781250954bL,0xe4a2f7cf2930f3edL,0x3e3dd26666fd719aL,
53285         0x500166cf792ff463L,0xeccd32cd75cf00a6L,0xb65f46a5c4526e56L },
53286       { 0xfc3a99c360aa8cd7L,0xe04a18b31290b20fL,0x957139a218cb9326L,
53287         0xf6b352ce11fc04a5L,0x9314b80778534e64L,0xd4a265c52d8f5015L } },
53288     /* 23 << 175 */
53289     { { 0x7078b4820dca1fd5L,0xec3192daeed504baL,0x144183332d06a63eL,
53290         0xaff9f7bd69c01ac1L,0xc5fb50475b74308fL,0x37846eeaa67e7ef4L },
53291       { 0x0fcea663976b931bL,0xd3407d42bb345b71L,0x925afc36a2deb11bL,
53292         0x12c271092207db49L,0x237500002e1c8fbeL,0x41427e0763f771cfL } },
53293     /* 24 << 175 */
53294     { { 0x9dafbe96491ddae9L,0x92c60b897741da5fL,0x1185b001b866ab14L,
53295         0x7a43b9cfca7f2f81L,0xaaeb5efc6ee8fdfcL,0x1f7cc70022beba9dL },
53296       { 0xa212724722e3e7cfL,0xb98dde1e9e723477L,0x87832183ac89706bL,
53297         0xdfb92ac1ff72f1d5L,0x5877fe6daade3804L,0x7ddde4a79170b9acL } },
53298     /* 25 << 175 */
53299     { { 0xdb147da0b7df600fL,0xbef5374660a8b100L,0xb4c7e404a1330d14L,
53300         0x152c6ae754f96693L,0x08884fecb25fd94dL,0x8ec186048ba59001L },
53301       { 0xdc245c0c9f8e77fcL,0x2be5aaebc0f0a83dL,0xd15bdecd1fd13525L,
53302         0x46b603f0821c9224L,0x6b335a7daf6dc128L,0x4cead4f94dc6b5bbL } },
53303     /* 26 << 175 */
53304     { { 0x239cccd8179fac91L,0xffa076063829d42eL,0x75b8589cbd42a0ecL,
53305         0x012f5e80d7f2292cL,0xdcee7efd99c14665L,0x4925256d23650737L },
53306       { 0x847c86ecf3cc64afL,0xdd34a75feabc04fcL,0xc2f73b3ac6a1f710L,
53307         0xe16e317565cbf6fcL,0x9cccffee351461d9L,0xe3d635543b4fe4b9L } },
53308     /* 27 << 175 */
53309     { { 0x6e27de1176ece8f1L,0x3ca873a79d5a3cb7L,0x7d65cdff7e424482L,
53310         0x023e5bcf69372216L,0xae601c2f2ffeb5a6L,0x8c8888cbde130b33L },
53311       { 0xcb8309485700ecc4L,0x5a1902ef9dfe1891L,0xe01f5fc558198380L,
53312         0x9d5d1c476c59f973L,0xacc64c98e34cc41fL,0x057d81f03065d870L } },
53313     /* 28 << 175 */
53314     { { 0xf3a1a9797aeefd73L,0x3fb166a09537abf7L,0x39e8c469d4c37607L,
53315         0x3efc85650e3f034eL,0xc955c2dff9c25655L,0xd6ce96ec260fa449L },
53316       { 0x5383a8b831d8e6d4L,0x3aed2e761a3595dbL,0xbd269c39e22a0f45L,
53317         0x4c82238694a7a83cL,0x362f08055731bd0cL,0x7dc1e7ee0527be95L } },
53318     /* 29 << 175 */
53319     { { 0x606ffedfd41ce228L,0xb87608d0ceb21740L,0x6fa23c0794a4354aL,
53320         0x587a7c54d5061d84L,0x75678bdb16b823ccL,0x2d2163c94ec818afL },
53321       { 0xa80b1e4e22c6fcaeL,0xc07cebee4d2a4b65L,0x64f303c7a895e2c9L,
53322         0x750079f5a768a2e6L,0x0665502c2d423133L,0xaf33176715135cdcL } },
53323     /* 30 << 175 */
53324     { { 0xda8f7878c715abf4L,0xc62292a5a5830c4dL,0xfcd30f7e4b46acb9L,
53325         0xb931f1ee39a73db2L,0xf838a5c84ee1afb0L,0x15609b57c202a921L },
53326       { 0x2e21871620bbba58L,0xe1d2fa14ae2615cdL,0x0a4dcf3543946185L,
53327         0x2e80d804730d2490L,0x5e43dc17794246b6L,0x7b3588c8dcb3be9bL } },
53328     /* 31 << 175 */
53329     { { 0x3e74f09c1bb8e6e2L,0xac587847584dba0dL,0x926415593f843324L,
53330         0x0033257729f3ed18L,0x4b7164e5d0089537L,0xc50542793e54c9a0L },
53331       { 0xbae7ff9808e58162L,0xc0707d03c1aa2fd9L,0x43524f717714dca8L,
53332         0xa202a0707255b169L,0x0a7867ab4249b2e0L,0x03f748656d6ec5e9L } },
53333     /* 32 << 175 */
53334     { { 0xfa2db51a8d688e31L,0x225b696ca09c88d4L,0x9f88af1d6059171fL,
53335         0x1c5fea5e782a0993L,0xe0fb15884ec710d3L,0xfaf372e5d32ce365L },
53336       { 0xd9f896ab26506f45L,0x8d3503388373c724L,0x1b76992dca6e7342L,
53337         0x76338fca6fd0c08bL,0xc3ea4c65a00f5c23L,0xdfab29b3b316b35bL } },
53338     /* 33 << 175 */
53339     { { 0xd2437a52eddd4b72L,0xe2cec2abf051b831L,0x845af98e482a4ea4L,
53340         0x75758ccfa43cae82L,0xa76733429260ea35L,0x77845b02b1dd602aL },
53341       { 0xb78bc4c047d5c450L,0xcb1f444550ad371bL,0x6bc01293d71cc417L,
53342         0x8538f638c1fcb367L,0x5d01d35919b313f3L,0xcd6b55bfcf67f6acL } },
53343     /* 34 << 175 */
53344     { { 0xc28000d6e3b03290L,0x4dd5064a5f2ddbcdL,0x4916f830338a1414L,
53345         0x3ffb8381aca74c22L,0xec073ee8e680f548L,0xa34e0693a0430cc3L },
53346       { 0xc6baf20dca03e6e7L,0x2a30df6e835fb88dL,0xbf3c9e9cc2092d6bL,
53347         0x391cb25c17bc2433L,0x9b7de7126c205c0aL,0xf25e1494cd2a5e62L } },
53348     /* 35 << 175 */
53349     { { 0x05ae44e9d21fdc9aL,0xc520657fce40ebbaL,0x6b8e25431270cb59L,
53350         0x24e6f9bff7f096d0L,0xc6ded76a3ed81f52L,0x729d05e75f7df798L },
53351       { 0x99e2636fe5468eb1L,0x6f3abd4c00419facL,0xfc61117a9cc41e09L,
53352         0xb16f106baa399a51L,0x05603bc845e52713L,0x612658aca5c36107L } },
53353     /* 36 << 175 */
53354     { { 0x107573b96defe8f4L,0x9a9edf0570545313L,0x5df43df0e54e8272L,
53355         0xac91bae8eeb4ae90L,0x241d54bd26006ab1L,0x0ba118a6c031de7dL },
53356       { 0x376214671f500d4fL,0xbbd6b318bc3596e4L,0x4b5532c85992277aL,
53357         0xb15165da16a4728bL,0xbd7986d45140abdfL,0xf4fe16df7386f38aL } },
53358     /* 37 << 175 */
53359     { { 0x8c5d305696aeee65L,0xe52e500ea79991dcL,0x3af4a3ef343fdde9L,
53360         0xc6d0389b248ad10cL,0xc3dbdb3f5014de53L,0x606b1352310a0cd8L },
53361       { 0x65af3f8479bde08fL,0xa6c7d968d82ab682L,0x7262c07d202a6508L,
53362         0xd0231bb64cd75fe0L,0x58a34ca5dcb1f7fbL,0xcc8b21b21b8cf7a1L } },
53363     /* 38 << 175 */
53364     { { 0x4cd6e61be824653dL,0xfa02c0c9f253dd65L,0xab198e41b1e84cedL,
53365         0x89ce6aff1928be7cL,0xf2a83f4895afb956L,0x5b5f195ddc73f3a5L },
53366       { 0x44220ff79328317bL,0x03d62cb7f5239616L,0x0e908d34b5d49415L,
53367         0x050b7651c1f7e665L,0x3610167089e1a98bL,0x564abb3418eb7644L } },
53368     /* 39 << 175 */
53369     { { 0x400b363b2eecacf6L,0xe2ae5bee1ed9fb9aL,0x23374b11831e99c6L,
53370         0x0a8382d82cb9de95L,0xf95b8e052dc02291L,0x63b05a0d2f752257L },
53371       { 0x9ec16f84b60d9df4L,0x6ed683ac3bda5171L,0x7206450813acca39L,
53372         0x6024af3cf8871ba1L,0xbf88040e2f9a4d56L,0x001054149fb100e5L } },
53373     /* 40 << 175 */
53374     { { 0xd52c606375ccd2e3L,0x4fa8e4df56ce654aL,0xcd905c9bce581d23L,
53375         0x51ce0eab24ff75eaL,0x1c1c0831432c6e5fL,0xb83307aec02f0e86L },
53376       { 0x0b7a0274fe2ee821L,0xae7dd7729c3d69faL,0x54745da5931ed75fL,
53377         0xc276d96f18caba13L,0x142571dd26dd9792L,0xc522dac16c0e3167L } },
53378     /* 41 << 175 */
53379     { { 0xa86fa630197b5b97L,0x749ea479fa21c176L,0x520c0e4871ce7101L,
53380         0x5c53d9ebe30a0b0aL,0xdc71b629ceb570feL,0xa30fc3d11fa3699eL },
53381       { 0x741321b579cbbfa4L,0x205ea0aae8d18119L,0x94556e92fc62e0eeL,
53382         0x5ba78d4e042b9c3cL,0x14de84103fa24a56L,0x6e57a9fbd6557bceL } },
53383     /* 42 << 175 */
53384     { { 0x2a5e716ff103d9c9L,0xda2f7e5cb9cd27ecL,0x317f74b8e047e5cbL,
53385         0xf1f496d33a4413feL,0x1a480a9cb8cc9fdeL,0x502b52d7575208d4L },
53386       { 0xf14fe00cd19c49a3L,0xf5c2367b269be5a9L,0x966a524f12d42690L,
53387         0x2786ff714dd03b95L,0x6fa1f891d69bf68dL,0x0f3d77579f67b3bfL } },
53388     /* 43 << 175 */
53389     { { 0x230c8d00c966c638L,0xde5c9e8e54673305L,0x618b0dd561bc99faL,
53390         0x669618048f3cb5c0L,0x7c653ca507141ba5L,0x454d54ff32ba155aL },
53391       { 0x82665a307df3e39fL,0x15eb1a65ca19cbb7L,0x4e7632a617330ab3L,
53392         0xc69235295a3221b4L,0xe23ee9382eb58e9dL,0xb320aa8e23bcf88cL } },
53393     /* 44 << 175 */
53394     { { 0x6ba15fe607a7ecf8L,0x93127926f831cc91L,0xfde2dbf41ff6264fL,
53395         0xdf7f22018413fdb2L,0xdd81d11487f66260L,0x87907f0e4a87133dL },
53396       { 0xeac1032cb1d47e23L,0xe2603119125a0918L,0xba680392f2259208L,
53397         0xb7c7f8ebf9bf06b7L,0x875a380fa56ba57cL,0x05a88a97460c939cL } },
53398     /* 45 << 175 */
53399     { { 0xfb2871b7d0dc771eL,0xd12b21fcbaf358c9L,0x30dbd412df616c16L,
53400         0x291bd90f9345e16bL,0x92f7534b8ee6bb6dL,0x7ebc5b0eb1c901a0L },
53401       { 0xc9e9c76151e1881aL,0x5ca52152756bfecbL,0xb0a9f5cb6affd506L,
53402         0x4c12f965669feb3eL,0x01d84b9ea6f1c529L,0x3870fa27e8433c92L } },
53403     /* 46 << 175 */
53404     { { 0xe4e9e72495bb5db0L,0x86babe3ffd616958L,0xc1520c280f93c1cbL,
53405         0xe393ded539cab777L,0x031a2af3e86a6ca3L,0xb26a19101e8466eeL },
53406       { 0xb16b746dbb64fd81L,0x4e96f0b65a97d50eL,0x7a12a611a793fac2L,
53407         0x8d729847db6482aeL,0xdd050ce812e72ce5L,0x915041366c54299aL } },
53408     /* 47 << 175 */
53409     { { 0x9e8018c06b63c4beL,0x49dde0c8fce47904L,0x1668de9c9bae36cdL,
53410         0x8dfb0d5f80ed18aeL,0xfd6739a791e1949dL,0x80353c9f8053d7d6L },
53411       { 0xa611699bdea54710L,0x5eacf16e6c6c1f5bL,0x5212fbd3c920323eL,
53412         0xaf75db75848d085fL,0xb58564b1babb45b8L,0xefa1958938bc491dL } },
53413     /* 48 << 175 */
53414     { { 0x0a43a76c2f95a081L,0x27eaf2bc38b1c395L,0x6ba3222c63da1d80L,
53415         0xd95ae17e6a78ce09L,0xa72d9812508f03b3L,0x9f36d02efa8ed359L },
53416       { 0x1716d1dcd5118f96L,0xd116339f489bbc53L,0x272153ef6f7e1d3dL,
53417         0xcb4a9e739e308d22L,0xcfa9d88b615a3646L,0x8b69bd6cde454569L } },
53418     /* 49 << 175 */
53419     { { 0x33ae0fec2b8f41feL,0xc45aac500762c46bL,0xa03bc6ddf228ec44L,
53420         0x82cb78cfea3d48c2L,0xbe7a02ed27126795L,0x1a44d1f830b3e3ddL },
53421       { 0xb414edc73be7b58cL,0xb3e6c7ce331bcbc9L,0x9f6fd0f2903b3508L,
53422         0x260c8b5736cc2930L,0x8581a05d0d59278dL,0xfac1817b189b3005L } },
53423     /* 50 << 175 */
53424     { { 0xbf4d4640cc9a69c3L,0x07b39b5d67d262dfL,0xcd4a6a4579526d6cL,
53425         0x4a04c430538143caL,0x6c3341b86639e3b0L,0xd490cab5ab7216d4L },
53426       { 0xedda2b64a2a93161L,0x04e309de644a06f3L,0x7cad728a8c4495fbL,
53427         0xe1744f3871dd61f4L,0x39cbd782e3201618L,0xbd66e1850ca18ab4L } },
53428     /* 51 << 175 */
53429     { { 0x69d8237f87dcb8beL,0x3f9a485b090e0237L,0x535371e1f117a1c5L,
53430         0x0d5ef52675430c29L,0xcb9c150898fdd18dL,0xc7c1a7b4108d9383L },
53431       { 0x6ba9fb4d98064eedL,0x07d205a9a3df31c8L,0x7a0be62e9be5da37L,
53432         0x03b21b1255a9e2c2L,0x3f4792263de80449L,0xb0160ee1ae3bf31cL } },
53433     /* 52 << 175 */
53434     { { 0xa22c084a7a3f8c5eL,0xeb7fe23f3ef30511L,0x161ca862819fa38aL,
53435         0xe5f014156d45762aL,0x37da6bb95718b789L,0xfcb682bbd837f453L },
53436       { 0xc49c7397275e5974L,0xbe908df5a1ed0925L,0x3dcd694615a13ea0L,
53437         0xdbe652e32596fa76L,0x6a3bcc93c55d376cL,0xa2f7611933a0f02bL } },
53438     /* 53 << 175 */
53439     { { 0xdfff9b9c6ed061ffL,0xa36aef2dec32b16cL,0x9f3b7ab6da61572dL,
53440         0x96e72a027ac2dac9L,0xb0e36e023aaf4fcdL,0x5f32a620503004cfL },
53441       { 0x6c91dacbadcd649aL,0xb25deea21ac02a32L,0x211a421ffb914c2cL,
53442         0x1ddbd60e149fde1dL,0x91c4cc0d7ce86ad3L,0x8be6f031b9ed909cL } },
53443     /* 54 << 175 */
53444     { { 0x62e773c4a0cb50ffL,0xe54fdbdd2e903681L,0xed2bce9e21c12ca9L,
53445         0x13aa4748c072bae6L,0xb290c0ad475f290eL,0xcbbc3f9b56698a85L },
53446       { 0xfb37611b1b7fff76L,0xe62a842260bc2e36L,0xb6a36c783bb20fd4L,
53447         0xdec045418dd69509L,0x67648b7798a1ad2aL,0x4fa2005d078fdea3L } },
53448     /* 55 << 175 */
53449     { { 0x757f249416307553L,0x865af9d0de6bcb49L,0x3943031a07b0104cL,
53450         0xe5fdb46168da2d33L,0x4937d614b5432b48L,0xb3fbbf2c0a29a5e5L },
53451       { 0xe7d3b12b8de89887L,0xc1a43c24e41258c3L,0x91ac7eabf7d9efe4L,
53452         0xfd90de0088385cb3L,0xead102e37674c39fL,0x7b9a2cc4fff118c5L } },
53453     /* 56 << 175 */
53454     { { 0x11f92678a1e598f5L,0xde8052491fbb882aL,0x3730b3261154d0aaL,
53455         0x0e279827da521670L,0xa03c8c702336f8c0L,0xae50e64ff0bd66d6L },
53456       { 0xfbfd665f7af4f681L,0x237a4f4e5c8d5680L,0x6527611ba409064fL,
53457         0x1f4eff6a99db9a94L,0x4a55d96ae53ba177L,0xd9dec234f002368aL } },
53458     /* 57 << 175 */
53459     { { 0xbb837d0ad193ebc0L,0xab1e3eccd09b24caL,0x229f36d81d848777L,
53460         0xee895edf0ab68c98L,0x67fc65f4dce31b92L,0x777ebe585db96c26L },
53461       { 0xca0893ae6047d0d6L,0x71a2ca0b550d6905L,0x35426866eac4c2e3L,
53462         0xb4d7e78e0c1b8eb0L,0x03cb0a9a84b384e4L,0xd8a99a5c7f7115b6L } },
53463     /* 58 << 175 */
53464     { { 0x07db8bfa5f25a74eL,0x97dd568a3dd8e706L,0xcf4c02a32fb59efaL,
53465         0xe2ae502616b291e4L,0x5499f3b20f9c10cfL,0x59abdcf5a7297ec7L },
53466       { 0xcec282671f4a3646L,0xc10ae0971e065cb1L,0x172f886319dbbaebL,
53467         0xb0c27f7d73dd068aL,0x764d185495086ceaL,0xb89923c732de9a97L } },
53468     /* 59 << 175 */
53469     { { 0xacd499ca093345e2L,0xfbdb3895f3c23800L,0x2584f8ca02f0fadbL,
53470         0x9f5dc96ec2f35eddL,0x4dd102ca1ba0266dL,0x13ee9c8aa9f26fabL },
53471       { 0x9e7467fa2a1e61daL,0x999764b6850191c5L,0xd053a575b70dd8dcL,
53472         0x697b856fd7065eb7L,0x9d5bb6aa695b4914L,0xc5cdd170e65001f1L } },
53473     /* 60 << 175 */
53474     { { 0xe87cf622e93495f0L,0x347b09c6bb43a802L,0x2a38f3b7a4e3ac34L,
53475         0x13353b959751c1c4L,0x753ec3ecb3947985L,0x3bf856dc12d3fa90L },
53476       { 0xbf4f6fa5ec35dbe0L,0xd099a15bf3b4fcf2L,0xb348462fbfe7245bL,
53477         0x508324b352a2d4f4L,0xec4bae05feee1315L,0x468fa9e404496618L } },
53478     /* 61 << 175 */
53479     { { 0xc57673257d5e7a94L,0x40c05da604cefc01L,0xba1fd6c6b921c681L,
53480         0x0d3e09f9c104cedfL,0x4b7cd83cc6586416L,0xb747d7f9adfa7bfaL },
53481       { 0x833f8e24a42be782L,0xd5f0421d06b2471fL,0xac87b17c22e4b84eL,
53482         0x85af6b063a10c7bbL,0x4e557cbf66e88e2aL,0xaff21b66d3751e40L } },
53483     /* 62 << 175 */
53484     { { 0xdbab25f4c4464538L,0x3c36560ba93d7f74L,0x8b9b15d39f86f410L,
53485         0x1237e35b0a1db237L,0xc9dad97994f49677L,0x390a3d8f15dff99eL },
53486       { 0x0a74dfaef82c19edL,0x3f8e958589c2dc55L,0x763448ce94a8e729L,
53487         0xc6349398625f0517L,0x1ca5f9e7523dd700L,0x45aa25317fe638dbL } },
53488     /* 63 << 175 */
53489     { { 0xe91af601aad04ed7L,0x6f86f323e897df2eL,0xf8c259564c7a0ab8L,
53490         0x6e793f3633845d15L,0x08937ef5e583d043L,0x92dafa5824d1fd96L },
53491       { 0x6458ae2a86c9aedbL,0x271823a026a4252fL,0xb119fe4c5a57ef16L,
53492         0xf41e13943a507289L,0x0cbf1da6bd1aa499L,0xa177ac9dc2465a51L } },
53493     /* 64 << 175 */
53494     { { 0x14f962e404a8313dL,0xc6e3e7c45f1f5a26L,0x2c0e11c079e777beL,
53495         0xa1705efb4657c31bL,0x02688fd23c494de3L,0x75664a84412a8718L },
53496       { 0x878fc7ad7a422f8aL,0xe5d581df7419bd0aL,0x7c813c4c704b70c0L,
53497         0x98553da87323c008L,0x4f63cec663089f1aL,0x9626d6fa9655d291L } },
53498     /* 0 << 182 */
53499     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
53500       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
53501     /* 1 << 182 */
53502     { { 0x10586ea7507f8b27L,0x1510deb9a261f7d7L,0xa42fc4d7dfbfa352L,
53503         0xbf38c3821e1c2291L,0x46e40ef60e11760aL,0xc24f6061dcb974d7L },
53504       { 0x755b105ba7619027L,0x8004bf09b8ffa759L,0xa630d0b00945db60L,
53505         0xa160ac9cf2809e1cL,0x38fc1113dc6c95c5L,0x01f540985d52574fL } },
53506     /* 2 << 182 */
53507     { { 0xcda68a7e698ee21cL,0xc7414d196a5e725eL,0x483be2dadce20b91L,
53508         0x7de1601cfc69dca6L,0x4bec17aaac4f9891L,0xe8741dd18d479a56L },
53509       { 0xc623cb8dac23a286L,0xe20a96b5166133f0L,0xda9bb7c030dcde61L,
53510         0xf84ea3273a1733fdL,0xd7afb6c3e82fac31L,0x37ea7d35d3897449L } },
53511     /* 3 << 182 */
53512     { { 0x120649b20370327bL,0x0e76555acd48cdc6L,0x4ed54decca01db03L,
53513         0x7be21319ac601d22L,0xf711661901b6576eL,0x7839fa064e73537fL },
53514       { 0x169d43ace46e860aL,0xde6d658c3078eed9L,0x8df731395032142bL,
53515         0x6be199b09b3c76c7L,0xc2f385f6f8bbffe5L,0x848df7f3d5ffd28cL } },
53516     /* 4 << 182 */
53517     { { 0xa189f30fc6a6d6d1L,0xdd674d3669665ab8L,0x307c9ec37d8da76dL,
53518         0xb3e1d006c1ea7c10L,0xc15e20b3b88c62d4L,0xb0000ec50bff3b3aL },
53519       { 0x9e330eb19ff9aa5cL,0x8663f9fddf578877L,0x157d3cb002e1eb2aL,
53520         0x638f297bf525e4d4L,0xa20f833234a3dff1L,0x748ea86b45a9c051L } },
53521     /* 5 << 182 */
53522     { { 0x978ed3abe664c066L,0x3f4a8e0d668361eaL,0x0ba610c753a25231L,
53523         0xa8b5b864189143c6L,0x0d7ccefca2841fc2L,0xa80dd8f3f8fea1e1L },
53524       { 0x2c24af232e19028cL,0x0e332b77919decaeL,0x44eae977f6089c76L,
53525         0x25e04dae53722e9aL,0xdd6f8b1f71ac4db0L,0x7c5b6ffd075e7bc4L } },
53526     /* 6 << 182 */
53527     { { 0x4c6299a7a1de1cc7L,0x362d293c02d9445bL,0x08f24df0399a9494L,
53528         0x33307792e37a1851L,0x1cc5e448760f680dL,0x70a6a8164a2efbefL },
53529       { 0xee939681246fc671L,0xfa7a26d1f70a9c14L,0xfae5ca89b826aab5L,
53530         0x6b8932c7e48176f9L,0x379f89bd9841c8e1L,0x46141d2fdb674190L } },
53531     /* 7 << 182 */
53532     { { 0xf4408485b4619d3aL,0x34b4f18160b4f44eL,0x369edc1b3532caf0L,
53533         0x2d0471ec6771abc2L,0xca4129311013266dL,0x02e636af617e2024L },
53534       { 0x1f93d60d3c69696cL,0x6aba7f2a1b99a172L,0x896873e1bf435ce6L,
53535         0x9649f08215b71e40L,0x730bedcfa02b024fL,0xb17e9cbd8df60bfbL } },
53536     /* 8 << 182 */
53537     { { 0xfe9fdde8bc266ee3L,0x91668688ba18e6c7L,0xa65349acddde6f6eL,
53538         0xc53c29c97e54356cL,0xee15ad945709f73cL,0x033b3940e5429277L },
53539       { 0xf52035cdd0c3475aL,0x9c5bef4d93f1f1f0L,0x26e0b0ceca319bd4L,
53540         0x4e7eb67b6951fd8dL,0xac3a6f4395c34d6fL,0x1f2769e600f60b59L } },
53541     /* 9 << 182 */
53542     { { 0x95188c136c4d0bedL,0x377a04901b5271e7L,0x60db30226a540165L,
53543         0x4be61fda3310c5b9L,0xbbb4fbe93f8bbf16L,0x5232fb46ac12f77fL },
53544       { 0x8d6f75ab255b569cL,0x09cc854d3bd39650L,0xec17a6e74b557c3eL,
53545         0xd6949f9d5c3d149fL,0x9a17a440494b18b2L,0xc10cb9d5d4a024acL } },
53546     /* 10 << 182 */
53547     { { 0x4520be6b8eddc97bL,0xeb8f2c317391f948L,0x18fcbbd772369418L,
53548         0xb8950ee217246882L,0x6b1e4b7a382e82c2L,0x9e2bb1eb7ea4c447L },
53549       { 0x5202d913c3c5bc54L,0x53ea78cd21352716L,0x7bd53ffb36e6b4ecL,
53550         0x8325bdf817387196L,0x33b2cd8af94d6a73L,0x206bdec5e13db4bcL } },
53551     /* 11 << 182 */
53552     { { 0x6e27ce2609c98c86L,0x8f87ec4c958002c2L,0x00b6897064ab26edL,
53553         0xd2b4037282e5e129L,0xbeae654c78c48327L,0xc0632b4341a54107L },
53554       { 0x7b1fc7f001562313L,0x01cd1b5c1fd6a56cL,0xa199a69835e71626L,
53555         0xb02b2692635fbcffL,0x1c0c4200a0632386L,0x637164f8d6c670e7L } },
53556     /* 12 << 182 */
53557     { { 0x2c47010d18e30ee3L,0xb7d4b1dbfdd5f040L,0x5c8abe509d930f6dL,
53558         0x6bcf875d5f56cf04L,0x1f6456c0062f1fc1L,0xc79597805304d710L },
53559       { 0xd76452e4db85dcecL,0xd531f73fa0cbf90cL,0xb5ae9fc89021bde6L,
53560         0x505c6b9f4babfae0L,0x99d943c17ea61fd6L,0x6ef4766159bf125aL } },
53561     /* 13 << 182 */
53562     { { 0x3a48020daa0b0a5dL,0x4a32d4d658bad0dfL,0xe013dbde2e4340ecL,
53563         0x99efac69a5fc51f3L,0x26acf7a669ee64c6L,0x36672d6566fdc9f2L },
53564       { 0x77426caedcb879feL,0x0166194676e3be96L,0xb6fe4709b2dac331L,
53565         0x1f3d8a63678ff3ebL,0x711c0ea447bd5865L,0x5fbe38e87c080adeL } },
53566     /* 14 << 182 */
53567     { { 0xd0891b2df4e61379L,0xea2c7ceb9941c391L,0x1441a2d099677e8aL,
53568         0xc29d88c8abcb3669L,0xecb1a21a06ce9bd9L,0x0663fa7cf5b11fc6L },
53569       { 0x440a5a1c0c44c2c8L,0x08d71bc39fdded3cL,0x62b53ca512d33d2eL,
53570         0x3fb8640e005e8adfL,0x2a9acaefaa2673a5L,0x356ae6f6695f8448L } },
53571     /* 15 << 182 */
53572     { { 0xcf3c9b318496d935L,0x7e849aff8ceefc78L,0xfc06a46e7a5d692dL,
53573         0x87248699e89463afL,0x4dc55e5e8e17af3cL,0x3378832fe41ec54cL },
53574       { 0x7578d6192816f87dL,0x505845612806d3cdL,0x7354f1022754c3d7L,
53575         0x61ca6cac08d64863L,0xecde4969eb9954ecL,0xe0c211b4a1a5dae0L } },
53576     /* 16 << 182 */
53577     { { 0xbd10b8bffb787270L,0x4f0b1566e43aaab6L,0x9a18be5ec0c90781L,
53578         0x3677f4c71ad167ceL,0xccb254e2a68c1c56L,0x392493e6e2c4d275L },
53579       { 0x44958cb1d5b63617L,0x178f141a4caa4e7cL,0x7445a767a2ffdbd5L,
53580         0x0e789c99b0b6c22dL,0x3ff8b6565dc92b2eL,0x1623e5c3eca98782L } },
53581     /* 17 << 182 */
53582     { { 0xcb013ff62c5c50daL,0x5e5550b70b256dd6L,0x38249ee1bfd47036L,
53583         0x984daee275379fbfL,0xfb35304588c6bc7fL,0x32379c955f9683aeL },
53584       { 0xbcb4ac531b5a8626L,0x1057d2a3bbaa0deaL,0x114ef8a7ffa8efb7L,
53585         0x553a34566da90cbaL,0xa2ced0b21a365fe6L,0xcec4d64bb1ccdb57L } },
53586     /* 18 << 182 */
53587     { { 0xe0312b66b81fe0eeL,0x11e0493b892c7b21L,0xb6a1d76e624ce73bL,
53588         0x38768ec0cd75cb6aL,0x425b091f2032c271L,0xa88d39f55b5d8338L },
53589       { 0x1496b9ed1916be43L,0x14468e3054549f3cL,0xd429c2c47248e206L,
53590         0x21a1c212fc9e892aL,0x0feb5822640c984dL,0x0cabfb472b7c0c66L } },
53591     /* 19 << 182 */
53592     { { 0xcda1c4cd1cc5a20fL,0x33d66a893f67814bL,0xbba50d5360ce82edL,
53593         0x9d34dc4d70553a53L,0xc926f498a8a1442fL,0x9dfe3cbccbb43feaL },
53594       { 0xd25887434fd3e4efL,0x7443a9a9a371d894L,0xb53e6afaa22bb4f9L,
53595         0xcef3fa347dfc9da4L,0xd079ded047403836L,0xc6c97c36d39aa93bL } },
53596     /* 20 << 182 */
53597     { { 0x6618fcae534f6370L,0x1635580da1a864a2L,0x90ad39947d7ce552L,
53598         0xbf8c45895257f24bL,0x5a9499202098768cL,0xec1eb621bb6d8830L },
53599       { 0xfae8f161f1f9ac16L,0xfc9184ca35704c99L,0xa72b1ea9139ea04fL,
53600         0x82229a912e39e1d8L,0x4153bf3e479c7bc2L,0x83325be4c5541825L } },
53601     /* 21 << 182 */
53602     { { 0x358a91badbea81d1L,0x4d1947d7c669c7a9L,0x4ca6d8f18eedbfcaL,
53603         0xf9eda237069b3b93L,0x9e1217e5a35ea963L,0xb7e16f08ab960c77L },
53604       { 0xf440d825fb313db7L,0x804c5262101c5424L,0xd236a0edab3c4f7aL,
53605         0xf8bdb2b1c2682459L,0xfaa7aacaf46c4d70L,0xcf6ce4adae83dd7cL } },
53606     /* 22 << 182 */
53607     { { 0x2c7756bcbd452842L,0x2c47593cd1783fd8L,0xa4f41583a7527697L,
53608         0x2fddafbbd1049934L,0xc087f3db6c71063fL,0x8f5a85c4c9b3ef6cL },
53609       { 0xbe178bc966a975d0L,0x2e2d825b94066514L,0x061dd919e0d42ba4L,
53610         0x964fdcfb227ca011L,0xcb915b2973d7ba7aL,0xaa7f2fa72af8338aL } },
53611     /* 23 << 182 */
53612     { { 0xbdbb3440734e8984L,0x8b9b7acb3d6f547aL,0xfc4f48ea0e76a07cL,
53613         0x49758a9f97da0c23L,0x13f4254a26958261L,0xdf1fdca2adb3ef57L },
53614       { 0xfafba40d699460e6L,0x71b2de39cd5c94c4L,0x52d76b76c21cdf0eL,
53615         0xbe75960760f3dfa3L,0x519d4fcb7078f5e0L,0x4bd8ca7f5191e1b3L } },
53616     /* 24 << 182 */
53617     { { 0xfadf9be978207cefL,0x97d5ba569cb5718eL,0xcbad24ec2f995393L,
53618         0x6236a26861203303L,0xe4bafc336589a4beL,0x6cba77185e23fa82L },
53619       { 0x8ccbc5774583e65aL,0xe5d88bca4bc2f415L,0xe6bc2d5841df8dd1L,
53620         0xec24e1d914d31fcdL,0xacaaf13efc26010bL,0x7e1da447e01b92f3L } },
53621     /* 25 << 182 */
53622     { { 0x2b3477ec1a29de39L,0x30a5c2190a8720eaL,0xf593ec729775bad0L,
53623         0xaaf607792af7dbbeL,0xaace90d4c7cc7b59L,0x6eadf21d40509cf4L },
53624       { 0xb9a5f138096d00fcL,0x3896d42625b206a0L,0x0f28f0f09dcaa5dcL,
53625         0x2ef6f9f9a8186106L,0xd212710fe25b4d04L,0x0cc6d2878b9847b2L } },
53626     /* 26 << 182 */
53627     { { 0xe7407327cdfb2baeL,0x06745198510c3039L,0x8a913ba74da758e9L,
53628         0xc882e7bb1a4797abL,0x0f0d8eb5dd7b375dL,0x90ac5223dcff3f3fL },
53629       { 0x8443b7cabbe341a3L,0xa7cba7f22f173bbcL,0x04669ff830e5c327L,
53630         0x0edd0eac09b777fcL,0x2a70898bd71e0cb2L,0x881c48929bd983bfL } },
53631     /* 27 << 182 */
53632     { { 0xe4847c654e7603f4L,0x826cd33c0bbea366L,0x95727caf2c4ced28L,
53633         0x580313dedb8ac1e8L,0x6745673701363cb0L,0x540c35ec0ff13cc9L },
53634       { 0x878c86fe3c4fc263L,0x4d81f8aed14e7c78L,0x6f7cf97e8355ef22L,
53635         0xa2aadbc848a0aef8L,0xe0200ecf4fc3c61bL,0x7e58e6e0c8094ab1L } },
53636     /* 28 << 182 */
53637     { { 0xc52789bbf2d3bdc6L,0xd38673fc3b23d7a0L,0x8b6df95aacafbbfaL,
53638         0x37afdcbdc7f6eb6dL,0x57775bdd6cb4c9d7L,0xc34e5a2711007453L },
53639       { 0x903e5ba1b5faf98eL,0x811e142a9d4a8a45L,0x046d18932d7ac9e4L,
53640         0xe2fe9d1543ce66a8L,0x44b5beb4d4956410L,0x7c5f1b9ebb147f72L } },
53641     /* 29 << 182 */
53642     { { 0xd51033f48312b074L,0xc98fe29456f898d7L,0xa8d6433be8eeebbaL,
53643         0x50bf170976fdbb84L,0xdd95f89d43c14baeL,0x13f9c7366307bca5L },
53644       { 0x3cd12e2855e7bc8fL,0xe2d7482c3a52581cL,0x12a2c6c7b59eeb8cL,
53645         0xf98f79124ae87ffcL,0x41eb808e80d7bf65L,0x589970f2015e20adL } },
53646     /* 30 << 182 */
53647     { { 0x200a764a6333b070L,0xa0acd8ecdf0d20d7L,0xbc1c589953269941L,
53648         0xed7c9192b439eca8L,0x057c50eeb789f0cdL,0x31dc2d36a9c794a3L },
53649       { 0xe3f2d38dd58ef984L,0xdb250da69235b084L,0xc2ff1b49da05b500L,
53650         0xf2ea6cc50387c539L,0x8250353a3d1004cfL,0x69103201aed0bf97L } },
53651     /* 31 << 182 */
53652     { { 0x495cd7fc878e97f8L,0x6397fa8b61120b1dL,0x20b9afddc8708907L,
53653         0x84f55bb97be2ee80L,0x996fcb9d8d075b5dL,0x2e94d95ead858627L },
53654       { 0xf786143e77113ebaL,0x6fec684f7b3fdb28L,0x4be44fb211d10d07L,
53655         0x4b3478e2372f16b6L,0xec8d61614697ca58L,0x097d241c3a45f335L } },
53656     /* 32 << 182 */
53657     { { 0x6f6a6104899ef333L,0x95496f6d39067165L,0x42fd9a6ab51989e5L,
53658         0x1b60ce0f68f5b168L,0x97324d8756f7fe67L,0x443812f7676815a8L },
53659       { 0x265ee994685a7260L,0x342c7b2f6c6515f0L,0xe909232334b4adb0L,
53660         0xddcd233e1e5a8d18L,0x3dc5b27c5f4f6456L,0x9664533a7f421d9bL } },
53661     /* 33 << 182 */
53662     { { 0xa55e8ab09a35f4aeL,0xf908fb35ebbadf5dL,0xf885d61b35fee31aL,
53663         0xb8047f4f82728fdbL,0xa6fe454d33c5bc34L,0xdc5266332ef52e54L },
53664       { 0xb2f524a931581251L,0xb9eeec91aba760f4L,0xa95d396624a9b423L,
53665         0xfd52f4d29d3d75acL,0x82719e78834d4c33L,0xeeca71fb3840ca62L } },
53666     /* 34 << 182 */
53667     { { 0x984658940f4c60e0L,0x3929d4c645ce7c0cL,0x7846d6c19c4f9b89L,
53668         0x2c38a9b20fbc695bL,0xeeb4799ad73d4bb2L,0x7c16e5ba4e3b5520L },
53669       { 0x11ce92e51cf310d2L,0x0910dcc91e037725L,0x159fcef85fc5af9fL,
53670         0x4944f8ee1dcb3ca5L,0xf5d9f8c0b9a4516fL,0x452f0fa2f1cfa6e0L } },
53671     /* 35 << 182 */
53672     { { 0x59b15b61c634aab2L,0xcca0742a620df0b6L,0x791d95720d345276L,
53673         0xb775b790cd3854baL,0x944e591a256c26fbL,0xc5fda2d0b8fe17d9L },
53674       { 0x7dba5830c0aff69dL,0x46f7164b0f7c6d60L,0xd767cd58549eeb83L,
53675         0x4498b4f51ff2da7cL,0xeef2caf8fc594b0eL,0x88dc39ec5f0a95b1L } },
53676     /* 36 << 182 */
53677     { { 0x1a57d3e1b3fe597eL,0x1a3ad06d18d1b6f0L,0xf70f27b32e4a4617L,
53678         0x55e8a0479a75b4adL,0x0b24d5beede15d86L,0x2b3c41d0fb2f56b5L },
53679       { 0xf6cf36aab1d36456L,0x418a72fe1d8ff434L,0x64149a0d156746bbL,
53680         0xae65897c4e3a26d6L,0xb75e87d21e68eefdL,0x5b81e0b01cb27c91L } },
53681     /* 37 << 182 */
53682     { { 0x2c3fa19b34b90671L,0x369c9e9aa7c9aae3L,0xd89dc03f3d236ad0L,
53683         0x280c47b9588ace95L,0x0ad071be57f25a96L,0x36ce641d8296279cL },
53684       { 0x321778128595511dL,0x51878842b52cb227L,0x720df7ab4156b413L,
53685         0xccc71e10fed25819L,0xc878554e3fde679bL,0x9c50ecbe3b565d48L } },
53686     /* 38 << 182 */
53687     { { 0xb2d66f1ffe23ba35L,0x82339e2914b273a4L,0x454a5f0b58c2be97L,
53688         0x0ebadaa68488ac1fL,0x3c635442517e9af1L,0xa87044c3a5b9fe2bL },
53689       { 0xb8214dbdb505ae0bL,0x05a9bfad60bf4393L,0xb7b64b42428a49ceL,
53690         0xcad71866bd2283f1L,0x5bcfe7fce33a3a22L,0x018a2121fd6c73c3L } },
53691     /* 39 << 182 */
53692     { { 0xc4471fb02510a1c7L,0x542e73bd2c1c35c1L,0x0bc8bcc4f028a46aL,
53693         0xdf87cd2bb5610f25L,0x0845e4d1df42b41fL,0xc0523e3593aba84dL },
53694       { 0xc9161e8ed14887b0L,0xa96f9b3aa68c235dL,0xba1427a46f94d5b5L,
53695         0x6a5fdbbc858e00f3L,0x8170bad6abfaf661L,0xb4b9dc0ec9f4abedL } },
53696     /* 40 << 182 */
53697     { { 0xc48bc829ff7543c0L,0xc0bda14c4d72bfaaL,0x2f470ec703be0af1L,
53698         0xc70f1e8e92d37eb4L,0x08abdd98418f410fL,0xe38c74ab35386176L },
53699       { 0x9c07cfdd8c00426cL,0xba74c310a998f1adL,0x76b45140b7d2dda8L,
53700         0xa52b5e584948330eL,0x9b7332348d8efb26L,0x5d1763735d19a312L } },
53701     /* 41 << 182 */
53702     { { 0x46950a441d38ade1L,0x377fdf593058c7a2L,0x5e2fa1681aa129f6L,
53703         0x2eae63dbc5fe1745L,0x9616fee275545475L,0x4073a79c8627b2cbL },
53704       { 0xf1ec69ea9a5198e4L,0xe9a906aebd2821d5L,0x193a9387bc22625bL,
53705         0xca468d717b6c67ccL,0xb4d11cb360f17a73L,0xcd801a0e3df1cabbL } },
53706     /* 42 << 182 */
53707     { { 0x1b80b9c386cf5a12L,0xa5bcd3a016349cfdL,0xcee36e8f00d1edb5L,
53708         0x9566e10a5b7bf29bL,0xd0db98cfd4ff0a0cL,0xb516605e7fe427d0L },
53709       { 0x099066c18e614e25L,0x63537fbbabe78647L,0x5601a8b420117e1aL,
53710         0xfd125e2f06df05acL,0xa7fcbd420948daeaL,0x55ad4ee28ff03220L } },
53711     /* 43 << 182 */
53712     { { 0x18d71671da2c6332L,0xb38bf94f98ee4e23L,0x9b90bf72ecc579e8L,
53713         0x5af93aab1bf6b8c5L,0xdad6e7909342613eL,0x5a1d49dc710ad0ccL },
53714       { 0x2013ed8801468036L,0xb8bd31cf2f0f6f9fL,0xf025eb2aaac961a6L,
53715         0x1e201f659e1adb43L,0x2755f3aeac7e5132L,0x72d8e1d0f5205d31L } },
53716     /* 44 << 182 */
53717     { { 0x80bba9170319fec4L,0x4ba44600aaef6debL,0x83285b613594f325L,
53718         0x8879183753b5765aL,0x651b4c6adaf1b02dL,0xccc17578825f609aL },
53719       { 0x0b4076b39fddc6ffL,0x286e2daddf2fa874L,0x46c45233c413b648L,
53720         0x4fa46969b7cfe0abL,0x835786f3e04f5e5bL,0x526292a90ce3f707L } },
53721     /* 45 << 182 */
53722     { { 0x9928e9eb83f17723L,0xc38d5de26c2306aaL,0x3dd3f371558b3989L,
53723         0xfa4b194877154d39L,0x89f437e4b89f5448L,0xd5531444a6437c9bL },
53724       { 0x65a6874092537cd4L,0x5f6d72281246fb09L,0x0db0b3be58539e37L,
53725         0x1f0dd43df50f4143L,0x1aa12daec215aab3L,0xf82820fb7fe7b225L } },
53726     /* 46 << 182 */
53727     { { 0x32c6bf5e56cb520dL,0x74dc46c41569fa1aL,0xcbee46391ba52541L,
53728         0x5e2f511a50ec4575L,0x90165e35032b6f53L,0x2b8f1f8a5544c780L },
53729       { 0x95baef65c6b50147L,0x4e9db41946b7fde6L,0xe2463226f7afa6feL,
53730         0x4d70932235409eb4L,0x8faad8937c20aa0aL,0xc8c95a85abc1ab65L } },
53731     /* 47 << 182 */
53732     { { 0xd5f54ce676d1f996L,0x55957500e595a0eaL,0x9b62e1fd92c72af4L,
53733         0xb4803bc3069bf052L,0xb7cdf59c686ebd16L,0x2d1fa780655ac6d2L },
53734       { 0x6c306d3edca404f5L,0x24e9d7a9a7b5fa9aL,0xe4c080ddc533c701L,
53735         0x71d16b63425e29e3L,0x81c00db32d993e49L,0xb59f87f577902ecaL } },
53736     /* 48 << 182 */
53737     { { 0x43b58def987cf64aL,0xc95b16c63d4bcd4eL,0x5d1b1373bcd9b923L,
53738         0xaf560542522e052bL,0xc2ff8f7583800352L,0x11723aa17fe2a4eaL },
53739       { 0x28de7668e94bd9bdL,0x0ce80e0f874018a5L,0x0fe3755d8d43e726L,
53740         0xa78296acf9b075c5L,0x76d58d9882207423L,0x5c5bc6971db99205L } },
53741     /* 49 << 182 */
53742     { { 0x9cbecc969e2aea70L,0x1a3fd38d7e4f2a84L,0xdc35e3c84b95e560L,
53743         0xd5e912a5aa21d2e2L,0x037866628d8cd601L,0x4b726855f2bb35e6L },
53744       { 0xa45a827a0d763ea2L,0x17d6e5ea057bceecL,0xdab2381d09a2a2a0L,
53745         0xf1880617e9aa76dbL,0xb86444dbb184c5ecL,0x23a0e4b767da7c23L } },
53746     /* 50 << 182 */
53747     { { 0x2d94a6f030df736bL,0xd1ce20050b3be2bdL,0x201352b55e288cc1L,
53748         0xdbd3dc57779644a7L,0x9f258b16d191db2bL,0xd83c827fd1c123efL },
53749       { 0x74c5126e17f04f0aL,0x06008f14966e620fL,0xa4406ba80aaa9e37L,
53750         0x27323f797faf87eeL,0x43380a672b1206a1L,0xab1ed1cfaf15ebedL } },
53751     /* 51 << 182 */
53752     { { 0xa3d2bad9bb22cc74L,0xfe6591a80e2b9221L,0x8c94c974d3cb4eefL,
53753         0x772694266beb6451L,0x2942737a010986e4L,0x920c9dda59c1ace3L },
53754       { 0xd31af336da61e1d3L,0x973997a118021018L,0x50a6c8425710575dL,
53755         0xd61d47c9ade9d8a0L,0x90abe8f8a85f458fL,0x23cc28a3ac4d474bL } },
53756     /* 52 << 182 */
53757     { { 0x283d5bb63e052e69L,0x149ac3d01bd300e4L,0xb4c7b96ce0582ccaL,
53758         0x66102883428cb7d7L,0xd3eea16b500958dfL,0xe1b6a74f74674893L },
53759       { 0xe3b284be3fb0522bL,0x74b0fe2dea983a60L,0xd4328e5c81e465d8L,
53760         0xecb534c7403173b3L,0x1721e22774144d34L,0xb7273c6aa88a5141L } },
53761     /* 53 << 182 */
53762     { { 0x0ea24ac64018877dL,0x265cbfe42acf249aL,0x811c17e61837d63aL,
53763         0xff453f5d6b3adf1aL,0x7add0621a3031529L,0x62105dc838af1d27L },
53764       { 0x2cd31a899b56ec62L,0x5f524be5ede7bbceL,0xc485b2ff66a044f5L,
53765         0xae28f5dc87a7b274L,0xd41989a93415b6c5L,0x3051ca44c9c43ad1L } },
53766     /* 54 << 182 */
53767     { { 0xc22046bcfb50bf2eL,0xee22fb7b78f7c548L,0x5c41c6bc2b5b4563L,
53768         0x56da674a8bf9259cL,0x3732f77433d8d4c7L,0xa90bf0472741046aL },
53769       { 0x5ee7f4396288c2e0L,0xa7a1fec99ae621c6L,0x523c0569b76e955cL,
53770         0xda0c2b378d1e8601L,0x9010bc349559b56dL,0x8d2fab0917b8d9b8L } },
53771     /* 55 << 182 */
53772     { { 0xb2caf938281b021cL,0xc61f3abf1404b0abL,0x24203e1cea26d902L,
53773         0xc84f07e10d34906fL,0x8ba3d589f0cf7520L,0x86b54f6d9a2a90caL },
53774       { 0x9f87234f3d77a667L,0x328941966e3fa8d0L,0x0921b4a6e994d49aL,
53775         0xe77e9f8b8b3495cbL,0x9e5b74798da1fe56L,0xcbc09ce7b070591eL } },
53776     /* 56 << 182 */
53777     { { 0x583ee7dfe3b7e746L,0x0b6659e4a4fab3a8L,0x34ee02751946db5dL,
53778         0x5ae3c0ba1a12eecaL,0x36756ed44ccb83e7L,0x973b0861a80eaf3aL },
53779       { 0x969e38f46982ca90L,0x9a9bcd10018d01fcL,0xb540e9533272476aL,
53780         0xcf91dd0a75ab7002L,0x2c7d363f39ceb983L,0x4369c221974747c7L } },
53781     /* 57 << 182 */
53782     { { 0x32c5b289642be172L,0xe5cc452e697e6a30L,0x344935e10aa6841fL,
53783         0x9eb2dc4faad907a7L,0xaf77d029e121d0c0L,0x2bcddeb08bb073b8L },
53784       { 0x3584dee5e40653fdL,0xe853b6337605f214L,0x4723f0add4bab900L,
53785         0x16dddd27fbf91322L,0x1f96d7e610c525b2L,0xdfba535200c998abL } },
53786     /* 58 << 182 */
53787     { { 0x701e8ab819df9ed7L,0x1a6d74c13e2159d1L,0xe82127e0fc61a470L,
53788         0xaa2e5f33dd15316fL,0x92b6ea927c42c081L,0xfd470a298522aef4L },
53789       { 0x0c54a067e5ccf152L,0x60c113eda1a079b5L,0xdd501a8389d6e6b9L,
53790         0x3dbf20d219792456L,0x633cd2b710bf70edL,0xace5327a0aa8e5e8L } },
53791     /* 59 << 182 */
53792     { { 0xed79a2de3b2a8a4aL,0x02851125cbf095c4L,0x6817ecd1880fd3bbL,
53793         0x72acb6ff066adfe0L,0x04fd696d66ce8257L,0xb644f098dc81958fL },
53794       { 0xcab55d1525218005L,0x1184b0a64de70465L,0x6248e1157aa96b53L,
53795         0xe30958630516ac32L,0x19f80cc0d07084ceL,0xfdf7ca2efde86c28L } },
53796     /* 60 << 182 */
53797     { { 0x9a8857568bc1783eL,0xb373e5a0a7cf2ee3L,0xdeb162fde46cc503L,
53798         0xd5d334601074ef35L,0x0030f98eea159a90L,0xc5ffbdde64e50d98L },
53799       { 0x85a6486a48195b26L,0xdbf56597b1b9f2d6L,0x5df2352ab8613aebL,
53800         0xc425807ebd0189a9L,0xcf5a34d4fa1f4f7bL,0x233e26c7628fd2ceL } },
53801     /* 61 << 182 */
53802     { { 0x6c4dd28313a1e482L,0x24bfc23bf803f1ceL,0xb8e795b2f426832fL,
53803         0x636d2d63b13fcb5fL,0x2dbca0b214a508ecL,0x1948c957c1ff2b70L },
53804       { 0xc9d7cd4ae3135c7aL,0x1bf41de75d7cfe18L,0xfff9428f2f6cd5fbL,
53805         0xa25d3e8294d640edL,0xecdea1583e4fec66L,0xff3b2b1555530798L } },
53806     /* 62 << 182 */
53807     { { 0x483565313178cbc6L,0x085a31143f3a1ff0L,0xee2a58b11dc7054eL,
53808         0xa9ce7c113287d5e6L,0xd283d22c8fa263a1L,0x9160bb8be77ff147L },
53809       { 0x21dabddf918caf34L,0x6921e987ad1a9f13L,0x47e45c7d3ba0ad41L,
53810         0xeaac63192bd18585L,0xb88881060818034aL,0x2d8e9c1b60be0a45L } },
53811     /* 63 << 182 */
53812     { { 0xad3e46af32f4625aL,0x5c2f95dd88371d5fL,0xfc7a9adef2415ac6L,
53813         0x77a23c424ad85440L,0xce7c63712f4dd730L,0xd65bdc45a5c9f380L },
53814       { 0x763d3990cf11ee6eL,0x7b2a927a9ffc522aL,0x65ccf351deead5c5L,
53815         0xef1fa99cce4d076bL,0xdb6f5cca6708ba8fL,0x361525a0f3bac7ffL } },
53816     /* 64 << 182 */
53817     { { 0xbfc40c30f893a2caL,0xdf96980e0623bad1L,0x4fd7b54dc027511cL,
53818         0xf4799284cf3484ceL,0x655ab811069beea5L,0x52588bc87392e280L },
53819       { 0x522e7b404f0c17cbL,0xc0d88acac705e9b2L,0x9cf1b95877f3913fL,
53820         0x3e06b9267dd52514L,0x992e920e2908cbcaL,0x13baced26d6ed529L } },
53821     /* 0 << 189 */
53822     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
53823       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
53824     /* 1 << 189 */
53825     { { 0x8a46c911bfc6c637L,0x8dc3d699e4fa4fe6L,0xd4ba64f15cf8e4c9L,
53826         0x01b3908a01cb3488L,0x69b1fa5d38bd7dedL,0x92ad483818b2eae1L },
53827       { 0x619324beb33955b6L,0xc7f373355c8a6df7L,0xa397f42e925b3f69L,
53828         0x32169a495f7e4d11L,0xc0fa9a548d0d9f01L,0xf52a1f2289d8f2e5L } },
53829     /* 2 << 189 */
53830     { { 0x9c0d5231ba8e0a52L,0x94d0509e93e465d7L,0x67df90dd98515454L,
53831         0x223e8b9c8dbfb46aL,0xf39529a36d757ce3L,0xffec9175b4648296L },
53832       { 0x330749e8f78aae7bL,0x19e5549645f93cc3L,0x8c320b3494083aa8L,
53833         0x1161f5a321e321c6L,0x0980deedde3e7892L,0x605aa9196ad76cccL } },
53834     /* 3 << 189 */
53835     { { 0x71191262062312e3L,0x84c82a94691f46faL,0xad4b344bdda57f44L,
53836         0x674b758ac4f0cfd2L,0x3bc058a077543efdL,0x3d7c765756618d06L },
53837       { 0x95107c744dba9e44L,0xe59c3180cfdf1923L,0x5dbeaf35e3f1d63cL,
53838         0x012029c643ab8726L,0x4f588a4ea256c6fdL,0x14a01b7a3e5d2e30L } },
53839     /* 4 << 189 */
53840     { { 0x73fa3508180660f7L,0x4cae013e2d24936fL,0xf64a549f58493d98L,
53841         0xd9ceae0adc79f602L,0x6569e37bd1512b84L,0x11e4c022151c9151L },
53842       { 0x075678c2b55c5813L,0xb26cdb5809d3cb16L,0x6334dca3a57fb969L,
53843         0x0ed90820223dc3ceL,0x74f9c3aebd11e277L,0xaeefed3679c0b8e2L } },
53844     /* 5 << 189 */
53845     { { 0x22195e48e57ac6a0L,0xba77c58214bd1913L,0x265f96b4323349b5L,
53846         0xc183196ea124d497L,0x99f1f78d2466d82eL,0x185a18bfc6263afcL },
53847       { 0x29a3d5b686cf8908L,0x81f3bc00f680511dL,0x5f6ffc81661d015aL,
53848         0x31c2ff64cd5eb082L,0xc3c37ad672776042L,0x49438769d9c6ac75L } },
53849     /* 6 << 189 */
53850     { { 0x0e2fc74c2a24c385L,0x836a474034679278L,0x25518f16817e2c41L,
53851         0x8b573a8eb4b7d3c1L,0x012797f94ab56adfL,0x9e0e56d0fa2ab690L },
53852       { 0x009ba1ee1c9f6f08L,0x8ebf4aac2f412e9eL,0xb143122a1cfb4e02L,
53853         0x988cf0eccbf2b783L,0x44a7ed9657f5be97L,0xbdcad87251804147L } },
53854     /* 7 << 189 */
53855     { { 0x969fcd982f60d1a0L,0xf0f4c9b2ef06b3ebL,0x8c6438cb49ec8f92L,
53856         0x746107773f1653daL,0xf7cbc899b574576aL,0x758de9008494795cL },
53857       { 0x73045065ab22cf9fL,0x9893653c9ff13e98L,0x6e8860264a58d64dL,
53858         0x387d6cc34e3bf554L,0x82a49da4a42b0008L,0xb28bd9b71b0b1c47L } },
53859     /* 8 << 189 */
53860     { { 0x378205de2f9fbe67L,0xc4afcb837f728e44L,0xdbcec06c682e00f1L,
53861         0xf2a145c3114d5423L,0xa01d98747a52463eL,0xfc0935b17d717b0aL },
53862       { 0x9653bc4fd4d01f95L,0x9aa83ea89560ad34L,0xf77943dcaf8e3f3fL,
53863         0x70774a10e86fe16eL,0x6b62e6f1bf9ffdcfL,0x8a72f39e588745c9L } },
53864     /* 9 << 189 */
53865     { { 0x97e6400574103b65L,0xdad518d6db50ac66L,0xaf96065961077d1bL,
53866         0x1335de0a5baab1f5L,0xd404db749e444a1cL,0xd3124c5027d5fe2fL },
53867       { 0x1f20c68a0bd49e9dL,0x44405e6aad6a1654L,0x287d565193c362a9L,
53868         0x301ec6a2e76661bfL,0x4900f9b54c6f9927L,0xca3dbc3464bf3909L } },
53869     /* 10 << 189 */
53870     { { 0xa96955b9b1bafbc4L,0x8dcb55a7646ece39L,0x2b62784feb00e541L,
53871         0x462f9d7d2693249bL,0x8b264697794c189dL,0xded6ff5563354e69L },
53872       { 0x7c8ea441eed1089fL,0xe355f75c1462f461L,0x87b691f61210fd5bL,
53873         0x7291bffb6983cb27L,0x9ed83afc92800095L,0x307a3dc81f24d923L } },
53874     /* 11 << 189 */
53875     { { 0x9f79814a45faaa0cL,0xc64a7ac93bb1b07eL,0xaad6ff897f2ad506L,
53876         0x43da948300b83699L,0x6a702b8d6617956dL,0xfcb1035a7981052bL },
53877       { 0x094acd48cb230926L,0x3c3249d05da96800L,0x934088079d7208c8L,
53878         0xe4f04014d738a48dL,0x49bc5f0bf18b06c2L,0xf854285f596b9befL } },
53879     /* 12 << 189 */
53880     { { 0x7cec60ead7804b2fL,0x0064464345c11441L,0x3c6de88b769cd685L,
53881         0x34709186c7f01232L,0xd9eef41eedd2bd0dL,0x3bafcccde427faa9L },
53882       { 0x33e5350ec07e701aL,0x9cb2eb47a87c1fd1L,0x9fa9a7790d5f5b28L,
53883         0xa2e7076b07ea2e53L,0x72f4da325c169cf4L,0xb7f192947e751588L } },
53884     /* 13 << 189 */
53885     { { 0x1a3b217d2f6d700dL,0xcbbe9349ed335d55L,0x428adbfb53ff169aL,
53886         0xbd74385214793b47L,0x2224e2569d9460a2L,0x8408600809982ac0L },
53887       { 0xae6c6f9934447242L,0x63c78b2b9b51fb67L,0x381c948a389593d4L,
53888         0xf4cdd09f6e79ee72L,0xc658428ba185a0b6L,0xcd7562a786fe4c6fL } },
53889     /* 14 << 189 */
53890     { { 0x47eb133532dd7a30L,0x9d058169a9db654dL,0x375c59df6e7a2b1aL,
53891         0x55d37c677a35f29fL,0xc78a3678493c4cdeL,0xe5f0e2d68d83e31bL },
53892       { 0xf7927002e9777bf9L,0xdd559324a5afdfc7L,0x077c6c48b81c08ccL,
53893         0xba1c98ccaa2ef694L,0x06c6c9544c02dd46L,0x211e50f37dd3145eL } },
53894     /* 15 << 189 */
53895     { { 0x7f985fa8a96aea53L,0x811f94dc480b38d4L,0x91fdd510f3d40c68L,
53896         0xc156312ccd763693L,0x24b544c3640057dbL,0xd7d5d4f5ad3b5a1bL },
53897       { 0x5e235a1e26cda8a4L,0x0cf7b7cd1d2c6f17L,0x17b1ccf0908d3107L,
53898         0xf32f2a06f555eb5cL,0x274f7c2cb3c278c6L,0xcf1eaf296af1b44dL } },
53899     /* 16 << 189 */
53900     { { 0x2a5f8ecf06616d0dL,0xca9b1cb8c7deb373L,0x9de31cedc59c4301L,
53901         0x1e0f40b10111d998L,0xd29d229f960d5b95L,0x10563249d1dabab8L },
53902       { 0x7b225cc9a05ecac9L,0xb02e689678f3b8a0L,0x009b52a1f5fb06b2L,
53903         0x8a575d3f842b9081L,0xfddb48afe9272512L,0xd39b8f1d0b452cb7L } },
53904     /* 17 << 189 */
53905     { { 0xb6efc7e167ba9cd3L,0x5a642c288e4f62a6L,0x214a63da364378edL,
53906         0x582c59944121c53cL,0x840277facc9a728fL,0xc6db3529f8f72d39L },
53907       { 0x9c5cc2760aca9955L,0x8558a58db8b6dcd6L,0x709226acf0701f24L,
53908         0x6ce95b21ed248b40L,0x32ea565b5487934aL,0xa75a688496f9ddd1L } },
53909     /* 18 << 189 */
53910     { { 0x0d6b9c7c67e09987L,0x261a564d0761ad52L,0xec4621749f60925bL,
53911         0x83ee0c1218529b03L,0x72972467fbcfff74L,0x37fc074c6abc4bfbL },
53912       { 0x8b6015bd54e65e89L,0xde8583eb991583cbL,0x379548e1b4d2c62aL,
53913         0x88024a9a9b24a5e5L,0x633aa869fc03abfcL,0xa27657b98fa35283L } },
53914     /* 19 << 189 */
53915     { { 0xb340993c5727e344L,0x2379f51d4f3295d5L,0xa5de3efce2929734L,
53916         0x7d2e2c82d8717e3eL,0x8f24abb67180db1fL,0xa5060d648a4ed876L },
53917       { 0x8d39e3a2761110d6L,0x38d30c93a3bb5b66L,0x07774ac3c12fb741L,
53918         0x7d4ae5a55f4425beL,0xb9848a2afa704922L,0xed9ab68c4cd00812L } },
53919     /* 20 << 189 */
53920     { { 0xde9703b461d9e770L,0x02d4091def4653efL,0xefd229aa576eb5e1L,
53921         0xc0b0b243f77eb987L,0xb11309b2eefe8f71L,0xfeeacf2f68478044L },
53922       { 0x8dfd8e8643ac3dd7L,0xc0a24181b07f95c3L,0x551ca09624be161cL,
53923         0x6cb2c1d4b098cdc3L,0xbfc74e9be74f84f8L,0xe58e14d9067e3388L } },
53924     /* 21 << 189 */
53925     { { 0xda121aae0ef98506L,0x435f28c6328e636eL,0x64b2170a720d40a3L,
53926         0x3ddb0e61cd24a844L,0x111442478797c7adL,0x624e7f73d589dd37L },
53927       { 0x3e7e0ed0a8efdd25L,0x8de031f116509a5aL,0x1330cff5873488c2L,
53928         0xa80c60b3342ecf75L,0x9d3742c8e62550ceL,0x8ec9b229e46475f9L } },
53929     /* 22 << 189 */
53930     { { 0x9eca6f94f025baa6L,0xb2db0741bcf9c741L,0xf8e2aab590bb8f56L,
53931         0x4772903208762829L,0x067a0c5ae2a266c8L,0x22b104c771b7d7d0L },
53932       { 0x4a48cd6953e406dbL,0xb85e44d524f0070bL,0x6168262fe10133ffL,
53933         0xdfc02315e4874e8fL,0x20dba2d7ca317e3bL,0x441c56d2e1d2c0c3L } },
53934     /* 23 << 189 */
53935     { { 0x9ebd10d6c444a2fcL,0xda7683e3f18ac11aL,0xdd42ed990fe8e59fL,
53936         0x9c867debee068909L,0x32df043fccc77aa3L,0x377423ce4aaa45acL },
53937       { 0x960940524a90c535L,0x48bfe83347d1799cL,0xe8cd1a55ccabd174L,
53938         0x2ee0a276682145c3L,0x4249297e8d606c00L,0x22021ce2fd7af6d3L } },
53939     /* 24 << 189 */
53940     { { 0xae10069e808dc4b1L,0x64df30e18fb3ba73L,0xbbe4caf27ebaad0bL,
53941         0x5907bf373dd6119cL,0x0a723dff9dfceefeL,0x59bff4ddf7cffc7eL },
53942       { 0x7bc95fa26a6f43c2L,0x9001d1d53ca0e2b3L,0x316a7ecd27b3335bL,
53943         0xbf08e6727b8d7d49L,0x4b209f93c619058fL,0x4c0ca01e59d8f9eaL } },
53944     /* 25 << 189 */
53945     { { 0x3c1e7f45bad772b1L,0x20f6f1732544af67L,0x14f491f9a7d6544dL,
53946         0x1451cc8e6acea162L,0x20c8ffa5d234ab89L,0x4b59bce1f5cd1002L },
53947       { 0x99da4c0ee63027acL,0x6290cb963fc1f75eL,0x3a51774524c4d85cL,
53948         0x3bf9929c1fd144e7L,0x9bcb97467068294bL,0xcb0b3e5d2e61a022L } },
53949     /* 26 << 189 */
53950     { { 0x18c452c4cae69c3bL,0xf45690acef0f00faL,0x3b363aa04f66a5ccL,
53951         0x9dd41c0a47718c52L,0xfa219d7e7e5cd370L,0x5d384db7b2196dfbL },
53952       { 0x5e14749b90b4d46bL,0x55796656d9db9481L,0x3bf13d0ac8cf353eL,
53953         0xb89a28a6a95c485aL,0x568fa3d05da29783L,0x4aa008eed182b1a4L } },
53954     /* 27 << 189 */
53955     { { 0x4f38667a179639e1L,0xca492d50ba7c7a16L,0x191e4a3478fe9dcdL,
53956         0xa3cddb2f03fc70b8L,0x57d90a90a751ec9fL,0xcf88357457a50cd6L },
53957       { 0x69abd86d7cc58687L,0xc73a00408466bc6cL,0xfbb99c755c495208L,
53958         0xdd5f1ab9c13347b8L,0x9ae6fb92060b93efL,0xd6bb56a3588e5369L } },
53959     /* 28 << 189 */
53960     { { 0xf7e1ed3bb09fa8f3L,0xbb4fe6f71da5be9eL,0xcbab0e01f4d1ba21L,
53961         0xb732741076a5f326L,0xd94d2349206092afL,0x739f3cd0728e0e4dL },
53962       { 0x568644aaf81fd823L,0x510cff6b6110e2f6L,0xef4cf1ac566c3598L,
53963         0x2c26f17162aae69bL,0x1e4360468964a2a5L,0x83c0bbf63e472c50L } },
53964     /* 29 << 189 */
53965     { { 0xc198c07064b2955aL,0xc32d41e1d8d43284L,0xfb6f0e2c9f4fc13eL,
53966         0xf4d5b60b41c61889L,0x5c79f500beb36946L,0x328b22408ca4beabL },
53967       { 0x64058e916697617eL,0x6bdf7409f43f7390L,0xf2afd208f5bd8512L,
53968         0xc0000aa0bd1ad6d6L,0x38b8e03bd9f6c1c2L,0x0a34680d665a2d06L } },
53969     /* 30 << 189 */
53970     { { 0x79c04804aabd965aL,0x9581aab443d0b660L,0x59bff0035ba71d23L,
53971         0x212ecd58b6a0cd80L,0x29bdcd33bf1ea5d6L,0x59fd2ff477a002e1L },
53972       { 0x3c9d21308d9cd247L,0x790e9dbcb1786da3L,0x967ee5e714464d04L,
53973         0xd6f7ebbd2b5373afL,0x1c0b22d539768d40L,0xdfb54983913f6cc3L } },
53974     /* 31 << 189 */
53975     { { 0x5c9808b78a42e002L,0x5cdb2b070f732854L,0xdc92b1676d6d4579L,
53976         0x789dbb8ebcc22c54L,0xd76b2d40716eb28fL,0x5cbaadea004affd8L },
53977       { 0x5d4d84dd08fcfe12L,0xd0f1d7ee20d4b893L,0xc98d77dfbbb90db6L,
53978         0xbce9a5a2b1e29a22L,0x71a6835d0b54e100L,0x0199594a55b1ac68L } },
53979     /* 32 << 189 */
53980     { { 0x167ec88a51b3f1ceL,0x19756ee0420024c8L,0x10f2e2443877e634L,
53981         0x6321bf2603462cb3L,0x1dbd10ee9d3afceeL,0x0726f5f22ca17dcdL },
53982       { 0x094652660bacf018L,0xc92a9f2de1feb969L,0x0043b0f95e1c5912L,
53983         0xa09b94d1757d3a63L,0x533956529fdef1e0L,0x9826886cd4fedd41L } },
53984     /* 33 << 189 */
53985     { { 0xd22bcbee51964ceeL,0x3ed80af3b0eea46eL,0x263cfa026b854aafL,
53986         0xfa4ad481b9ca3b51L,0xf8c569a0b4451297L,0xeafb78f8f48059a3L },
53987       { 0x86a9e3c037093acbL,0xcfb3bb63275ef52eL,0xc4672d3c7c924f03L,
53988         0xa87350871691be3bL,0xf124f3a52be289b7L,0xf45052dc6b80b6c1L } },
53989     /* 34 << 189 */
53990     { { 0x79c99f99a010db6dL,0xe83088a74ee93fc2L,0x76e8376d836b1a7dL,
53991         0x8cab091c4e24e127L,0x5c98a00f7283cd21L,0x1beaf4a084997647L },
53992       { 0x2cfb55b8d934088dL,0xca24052cee724d5fL,0x5d6e9db5bba84289L,
53993         0x133414b26fb26d72L,0x3e844eb9cb12a503L,0x5eac12dab53d6496L } },
53994     /* 35 << 189 */
53995     { { 0x79a098812cc6698bL,0x6d44e7577f383e02L,0x1969f93785b5f732L,
53996         0x3061f62792acecccL,0xa9428d60cc2a4752L,0x69a472af2cf58626L },
53997       { 0x63fde53cabd347d7L,0x138b5b6a1aed4fd3L,0xd93fce1f2bd48519L,
53998         0x957fe302e49cc436L,0x9b51657a2e21ad5fL,0x3b5c4cb6acbd3af6L } },
53999     /* 36 << 189 */
54000     { { 0xdcfa78b096dda000L,0x5b60dfe5be2303bdL,0x7a6bbd34c7c6ad6fL,
54001         0xd45c9cb57012b97dL,0x9a049e36812e1662L,0x723bc0b66a5483aeL },
54002       { 0x7fc03b6ad1c82e81L,0x02ddd6d2b23f6818L,0xe8914b2d30dae39aL,
54003         0xf4f0ae392f692056L,0x198a31bd45f1390eL,0x917ce4f4f542565eL } },
54004     /* 37 << 189 */
54005     { { 0xde39a4e6ca447864L,0x95a028f9f0b131ccL,0xba77ac314a39c4f7L,
54006         0x0c24d09614857939L,0xdeea56edfbfaa0fbL,0x79aa342f4c920bf1L },
54007       { 0x50228f48c7e9dc62L,0x0fd9d1dee0f0fba3L,0x3fc03993cd703f6bL,
54008         0x229a3bf4c5ff39fcL,0xa7456aa484f9cb20L,0xb01bb5a7d12fd7d9L } },
54009     /* 38 << 189 */
54010     { { 0xfb390be4539519d7L,0xbaa98a2a6ad44d22L,0xafd19a75ef89de1fL,
54011         0x1afaef2971e27781L,0x18b297d79887739fL,0x8fcff6048e6da42eL },
54012       { 0x17bfc1717e861a36L,0x1467800537a8843bL,0x2bc47afdeb16065dL,
54013         0xcc038e2fbab7b4fdL,0x9d8fc42a3eb9be7cL,0xfc2f0b295928da63L } },
54014     /* 39 << 189 */
54015     { { 0xa4e33ca261c14fbdL,0xebafe73fc0a87f99L,0x22fdf1d1f5abf7f4L,
54016         0xfc1da26549a6b956L,0xfd8c48e5be25dd72L,0x9fd6520ad31a25aaL },
54017       { 0xe0167d4ffd14dbbaL,0x8838d2ba7370153cL,0xe5f7d69b133fdda1L,
54018         0x31acbf8de1749b60L,0xc14ec9e2107558dbL,0xb06d0252b99553acL } },
54019     /* 40 << 189 */
54020     { { 0x34590975ed424438L,0x7c03ce744d11a200L,0xcc939a286ec406eeL,
54021         0x8d214276fee5454dL,0x66a0e1a56b257f70L,0x93761a8a006fb85eL },
54022       { 0xc44f9df2aa70b65aL,0x1dac524f91d9e2e8L,0x5894a8224fca1a81L,
54023         0x8586e418f3ed85bfL,0xd494dfb202899b5bL,0x7ea9f222ecb8e371L } },
54024     /* 41 << 189 */
54025     { { 0xd93ee716b0958516L,0xa91f39db3eb86888L,0xb472c1e2ac92105eL,
54026         0x4d88a307429ca094L,0xd3fd88027a8e87e1L,0x40c4cd50126a2cf2L },
54027       { 0x046ce3bf11cf2046L,0x412678ee05691999L,0xea0c78168d3a2921L,
54028         0xd24ae89924f3c66eL,0x2c4457f00bd144e9L,0x82005b4fd7a52270L } },
54029     /* 42 << 189 */
54030     { { 0xf1b3ec32924340e0L,0xe5430ea3b33a05abL,0xbf43b031807629b7L,
54031         0x53c9407d57014039L,0x6e67b52f2f195ce2L,0xc8cc645f1e48d8c1L },
54032       { 0xf2234275c08f2122L,0x9cfe3c74c2f233e0L,0x235e6b349c4e0af9L,
54033         0xb4e8ef5770de39d8L,0xba573a727f73d0a9L,0xe12c506a18587ed2L } },
54034     /* 43 << 189 */
54035     { { 0x6b9669c59cf3e4f6L,0xa472d5dbff677559L,0xde845b0c877e5590L,
54036         0x9f7ef5802d0e2350L,0x87ea99d4e78c1096L,0x213243e9abb68028L },
54037       { 0x0172c81595e71abaL,0xc2592a762ca34c65L,0x50749aee9dc286dcL,
54038         0xe37d10884055de3eL,0x3e5a93bb90d652baL,0x0cbb7a08c32aa3e6L } },
54039     /* 44 << 189 */
54040     { { 0xe0bf3d8a026c43cfL,0x091956cfeb702508L,0xfcd486c9a6b3203aL,
54041         0x94a6d52f365460ceL,0xefeb5400563bec77L,0xbe6baa9619b2659cL },
54042       { 0x116f71c34bf21a00L,0x83d1c99a86d21871L,0xff1ba96aca0bd547L,
54043         0x5eb0acf741b94afbL,0x1be5d66fb1aaad14L,0xb8ececc5e6cd6d4fL } },
54044     /* 45 << 189 */
54045     { { 0x65f6e29dec7d4de8L,0x082fa0560e938c79L,0x4cda3fc925a02f04L,
54046         0x77dbcf0d3bac5cadL,0x625f9bd859145bdbL,0x98b7fd64553a11f3L },
54047       { 0x621bfbe387dd8a45L,0x6519421d1c35176bL,0x89eabac6d5ead4c7L,
54048         0x45c68bfe54acfbd5L,0x87cd244a84f30b68L,0x83b5f6b27b39275cL } },
54049     /* 46 << 189 */
54050     { { 0xd43b1d3c0ed0ade8L,0xd60b1ae7640e7d37L,0x965489e6f88e06e5L,
54051         0x35398ac89653417dL,0xed1e89ac02cfcfc5L,0xd127f68dbb6f2bfeL },
54052       { 0xa569c59fe22bb079L,0x7933f14e4ca8e9deL,0x68b4964a30033c3eL,
54053         0xab438cf88f069045L,0xa64f3a1516163059L,0xf40499c14576fe42L } },
54054     /* 47 << 189 */
54055     { { 0x361c28da052567f7L,0x8a2c6aafe0db84b6L,0xa79eb10cabbc87d3L,
54056         0xeaf7bfff4141b3acL,0x90bba4a953aacaf8L,0xda577661c35f9564L },
54057       { 0xb2550d0dd4487a5fL,0x69d43c5199638269L,0x6d16973f7a1f8ac6L,
54058         0x3dfb2253c71e4a4aL,0xafd836aefa36168cL,0xba72fd1faae6dacdL } },
54059     /* 48 << 189 */
54060     { { 0x690c0cfeb449d1e2L,0x4a5e150b1b8e1577L,0x22508042204d98a6L,
54061         0xc87a97f5bad2eb08L,0xd307c59ed25823eeL,0x6ed083580df8b3f6L },
54062       { 0x280ae344314e7016L,0x6a55be876ef4e889L,0xea930e5a24d04e38L,
54063         0x0269d9a7309830fcL,0x41dc8f0ae4afeebcL,0xfd1bc660f14ee02dL } },
54064     /* 49 << 189 */
54065     { { 0xf81cc943631da366L,0x2e821eb85ab1a2caL,0x339e9e4765433883L,
54066         0x3dc14370e1f60c71L,0xbd6c79bebc25b506L,0x2bd3ad51a8a639f0L },
54067       { 0x7c168f13c700a293L,0x64fef4fc28b4ce88L,0x3ccdc3080c329c6aL,
54068         0xbfd78932b76a9452L,0xf0c123fbc684f4b5L,0x8bfad06432305ed6L } },
54069     /* 50 << 189 */
54070     { { 0x208a668feea1a9ddL,0x8af75caeab903f09L,0x356208b449265292L,
54071         0x57b24ebe53faced4L,0x9c8aaa7303694920L,0x1c06ef5ad2f90179L },
54072       { 0x794ead99df92de87L,0xad900c4e7a73fe9aL,0xdb66b9ae715d9f66L,
54073         0xd19dc46db1bc2950L,0xb0a5af5c24c82c0aL,0x7d83f950371d0ec7L } },
54074     /* 51 << 189 */
54075     { { 0x716071e3abd37656L,0xaa22858be6cab564L,0x6793a66f5aec00ccL,
54076         0xe2ea5401e025da6dL,0x3998ea5d2eb0059cL,0x4ff6f442e39abb77L },
54077       { 0x703eabdabdb6e0f9L,0xa33e6deb38522433L,0xe23c13f6ca83c2acL,
54078         0xcfb8e57c0cac836fL,0xd0f84bde7692714cL,0xb4fc3b01f3f41d29L } },
54079     /* 52 << 189 */
54080     { { 0x67842ab4d8f358a5L,0x70cab57540e2fb69L,0xdebc3046e5c458e4L,
54081         0xc3574cf47eb004d5L,0xbac261a1c86f20f9L,0xc1bcb661deccf7fcL },
54082       { 0x5b3b96dec5574e9dL,0x07b878b3e151fb0fL,0x2f2d126cd38bd5f2L,
54083         0x06c951e8319597c9L,0x5529be4424ed0027L,0x82dcacc2ba8d7acbL } },
54084     /* 53 << 189 */
54085     { { 0xc37eef0149311e82L,0x3d07aaad401d010cL,0x934e039e53417831L,
54086         0x70775653da895ec3L,0x206b80af625cbe49L,0x9e2a4ee1e53ccb36L },
54087       { 0xebeace45c8ca6ff7L,0xadb19bd9925302deL,0x951bfcc497dee154L,
54088         0xd09882da79b60e1fL,0xb1e9cf0cda5f2516L,0xc2b697295e4def97L } },
54089     /* 54 << 189 */
54090     { { 0x74ce542d04f860e6L,0xdc8adf8fa3c48075L,0xe19852232063f76fL,
54091         0xf651c9fd5cd9ff61L,0xd4cbea69bab39ea0L,0xb6d4749b28fe3443L },
54092       { 0xaa7747ec65e960ebL,0x1a1b7b65e132a213L,0xfa52901f402a50d4L,
54093         0x3e4d2da68d43700fL,0xbfc7322937d45181L,0x68a812f9008bb845L } },
54094     /* 55 << 189 */
54095     { { 0x226d4d233e4cbf5dL,0x36359f52576243e8L,0x032af38a39a1999eL,
54096         0x9b59120a687eb228L,0x85c56b78e68e1498L,0xa7a14bd4849d03d1L },
54097       { 0x9e7177b345c4c3f1L,0xad7e4975183bd846L,0x42418d9a42f69dc2L,
54098         0x218e8f8e4f52cac6L,0xafafa7649f1f3214L,0x32f6f72b747f7592L } },
54099     /* 56 << 189 */
54100     { { 0xefca7f7ba6c53c1bL,0xcb4bb33c524457a0L,0xc9eab87fe57d08dfL,
54101         0x48c01c2a7d9a1967L,0x11c97ed97dc27492L,0xd8c644861cf1f639L },
54102       { 0x541f8c0d8156576cL,0xdf5c8dff2384e299L,0x9806935ba6be190dL,
54103         0xec6c5de764494b4eL,0xf04e2d4cb83c00b6L,0x379af438c0b84f15L } },
54104     /* 57 << 189 */
54105     { { 0x64e6289d92bbc1f8L,0xe88b78c5a0620121L,0xd01bac79a0fbc373L,
54106         0xa2e7986af098f07cL,0xfcac4dbcc5911218L,0x2e2bf56db337ed26L },
54107       { 0x878d9819e89a73c6L,0xa7df4f5768df46d2L,0x74bf7e2f4b3c9568L,
54108         0x2f2b187aebcce535L,0x544f18139a4c2be3L,0x3a5fe300a5938f0eL } },
54109     /* 58 << 189 */
54110     { { 0x901a14cd70aa91aaL,0xf0b6e1ec7f0b0a70L,0x6fd1ee0156a8bf9cL,
54111         0xe7e53c6693fbdadbL,0x18ebae68e17de706L,0xf4107457ebecf636L },
54112       { 0x77a85ea4a9f6c696L,0x3ea193e17dd9e3adL,0x9497e0a9f151c8abL,
54113         0xcc9237497a1dbf14L,0x2e36740e8f9be59fL,0x1b1c7d7c4a249e51L } },
54114     /* 59 << 189 */
54115     { { 0x7a45af2242cdcc53L,0x3061d91b8682832dL,0x85e080f6c375030fL,
54116         0x3ea6dcd1418440c7L,0xe0559870d14b6537L,0x36619215d178b45eL },
54117       { 0x48a4b452dcb85a34L,0x79cf4529bd5504bdL,0x506215e9e9c34c8eL,
54118         0x961f74b6dbd00e2fL,0x473d1397cbc84ddbL,0x6c64f870a8d67cb5L } },
54119     /* 60 << 189 */
54120     { { 0x519a6edb91a9b99eL,0xc0ea29e0f19221eeL,0xde83e0f77dc193b2L,
54121         0xa7b33b6044be16f6L,0x7edcb49406c8e8d7L,0x9f9dbb86392c0ef6L },
54122       { 0x09aefe035726bd5eL,0x782d8350c4e80b7cL,0x14e41a49186b80e9L,
54123         0x9af13703499ef97fL,0x5752877f2cbcc336L,0xdd0f8583d2df624dL } },
54124     /* 61 << 189 */
54125     { { 0x1cd2be3f32f6b0a4L,0xfd5da4a90114bca5L,0xc322a6a198a39a66L,
54126         0xca411eeb10d64384L,0x7c5d3ed0c72d8b6eL,0xf20c76697481309fL },
54127       { 0xaa4e45dca155872dL,0x66e41d54b87c1e51L,0xbe2fe5e6a6bfe6b6L,
54128         0xf60ca33a08a4d3e7L,0x45c1ec8c7211b48cL,0xdf44d3b573b78f7bL } },
54129     /* 62 << 189 */
54130     { { 0x21eda67429a1e6acL,0x33118990422ce5aaL,0x236aa9ec27326810L,
54131         0xc42dff9e3be7b318L,0xbe4601281690755fL,0xa395509d8c1c60c6L },
54132       { 0xa36de79d05b991d2L,0x55f516a3632882d4L,0x4c8c5a4296d1d493L,
54133         0x56199648533cda6dL,0xf9c6897a603bbfeeL,0xae835160f9857cc4L } },
54134     /* 63 << 189 */
54135     { { 0x700bad58d6aa9618L,0x2ad7069c05d54c73L,0x7f3ff5992f6a8495L,
54136         0x39de751ee26e6720L,0x39126d97d4cecf54L,0x353e00e21523aca4L },
54137       { 0xee905af017a33178L,0xa30173d31daf2642L,0x24cbbcc728f9169dL,
54138         0x4e65bb13a7039e69L,0x004a11859121e44eL,0xd4efa5b91c1e60beL } },
54139     /* 64 << 189 */
54140     { { 0x2e75a26eec65b53eL,0xfeb630b270552fb3L,0x53dfd057ee7d8e4aL,
54141         0xb959110d8994f449L,0xb4a16596bb538367L,0xa70917bdef82f29cL },
54142       { 0x5a76430043bba6aeL,0xee207476cfbc194aL,0xc7eab23803a4184bL,
54143         0x60c67ef20f7fcd62L,0x41e05799dfa8a0c6L,0x5d7d05e604d352b0L } },
54144     /* 0 << 196 */
54145     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
54146       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
54147     /* 1 << 196 */
54148     { { 0xc97c01eb436b59f5L,0x1d15aca7ef1848abL,0xdba1ce807fa7d3c2L,
54149         0x69e6f96e81060874L,0x6e3e0df74d7eeeadL,0x8a3b5e85b0c87f3dL },
54150       { 0xc55ae3dbc8a23914L,0x5cdc2a92bf6d27d9L,0xa6008c591de7860aL,
54151         0x8202f8b66e546731L,0x652f2d07aa1e45d4L,0x146f214f6df5415aL } },
54152     /* 2 << 196 */
54153     { { 0x041c706cce5fb4d9L,0xddc78cb3b22a79a7L,0x7dc4cd27839e9d5aL,
54154         0xdfc9db83bf3c4c06L,0x85b8094138b7bd22L,0x1007dea2d0f4c2daL },
54155       { 0xd7b34006c633fba0L,0xa8880acf4476e55fL,0xa340b2c275236685L,
54156         0x5ddd05510113a85fL,0x7dfc7ab29cb32704L,0x9a334a33dabf22ffL } },
54157     /* 3 << 196 */
54158     { { 0x2fbce9bed7d1146bL,0xcec9e5d8b3980bd2L,0x48ea45939f4cbaf0L,
54159         0x56c540092574a3bdL,0x84a39630e792c39aL,0xe5c690f8eef81343L },
54160       { 0xf996760f17655bc9L,0x6009c2156c0c191cL,0xa0ca12e6966d7027L,
54161         0x92a6d5d52e6f7c63L,0x46809d269bd13eadL,0x3c11fa7967aac681L } },
54162     /* 4 << 196 */
54163     { { 0x3fc9b3cfabe2cc87L,0xfd8d64e3514e77feL,0x2003a58afe1ad535L,
54164         0xcec4be38cb39149fL,0x4d578c99bdedf470L,0xcd35d7a33a356519L },
54165       { 0x7a762f278b078d6bL,0x3b6891ed31ae2701L,0xdc0e817f270c508eL,
54166         0x5a7be2049fdb29c8L,0xfa1a0be3cb2711d3L,0x5865f55f3786a0c2L } },
54167     /* 5 << 196 */
54168     { { 0x1d0af6b52f641cffL,0xa932adeb3648c4a0L,0x67641951b1ea8fc4L,
54169         0xc0b90064b1fae482L,0x7012642f6623477bL,0x1cddc0245bf019ceL },
54170       { 0xca1f4675c2c32737L,0x11525a5e97d6b18cL,0x9c034ef2d3868de9L,
54171         0x0533d921044e0c18L,0xba6cf14ecb5e38c3L,0x438309f3509d7053L } },
54172     /* 6 << 196 */
54173     { { 0xe164268ec4ff9f0bL,0x6c8e9349e6c36e63L,0x734f979478ab17f3L,
54174         0x46d468de0179ed0eL,0x7e68f006dfa26867L,0xe4d4a85de3d0485dL },
54175       { 0x0913a1d7f84c0f8fL,0x4095c8c025a9c9cdL,0xeeb1a79e49eadd08L,
54176         0x433f5e417dd8f954L,0x70a6281430bb26d0L,0xad94d8f6ff5e8e29L } },
54177     /* 7 << 196 */
54178     { { 0x6a352b579e32c0a4L,0x5274a08277ec7a40L,0xee1f7c7a240e6dc5L,
54179         0x85d5be62d313b4a9L,0x1522c5d25c01a405L,0xcfa08aab960afd5aL },
54180       { 0xa3cb77f38e8a93dcL,0xaacb16766d1c98c7L,0x84090c7d3b93fa9dL,
54181         0xc77f1ee13c0383adL,0x461c93b776f7a220L,0x66d63a1d04ac0bfcL } },
54182     /* 8 << 196 */
54183     { { 0x3c7d6b644751207fL,0x65e1f96ae440c1a2L,0x8ed15d20aa0eaa1eL,
54184         0xe944ad2fc0eab490L,0x71525aa1f6d9f260L,0x5cd14c8816146ba3L },
54185       { 0xf940190814a41275L,0x3bb7ea742288618dL,0x6a4e1c37cab1060aL,
54186         0x357fe4d0c8cac96fL,0x97a8b8ab6a2466ecL,0xb6e83fdb9c01be70L } },
54187     /* 9 << 196 */
54188     { { 0xa55a7142cb09a69cL,0x0a39fa12896a9c24L,0xa7131a001f6c9c82L,
54189         0xdacbfae97509c912L,0x3793d4ef4232eb57L,0xb63d9fc0da02ac15L },
54190       { 0xf1ce48a09ab37492L,0xa388dbb5cf9ddedbL,0x7224ef47fd7b2aa4L,
54191         0xdfe18be82fd35ae0L,0x2286ae7b90a2e98dL,0xd06cfd71e0d3c2daL } },
54192     /* 10 << 196 */
54193     { { 0x7825df5c948663a4L,0xc8c093adeb4ec9ddL,0x677c51ebc1505989L,
54194         0x8c28421524041f43L,0x0f63f15ac9ef610bL,0xcb98841d257678c5L },
54195       { 0xc0560066c52c64acL,0xaf7417db954180e4L,0x935c08876fe1f0e7L,
54196         0x8fe556ba46d03a88L,0xec44271484a0c4a7L,0x431f8e8395be9544L } },
54197     /* 11 << 196 */
54198     { { 0xc1fc18cb3101ce6cL,0xff753902048e52fcL,0x768299554e58e21eL,
54199         0xac990acc32856d44L,0xaac4d5dc9f8a9da8L,0xca1740fdd4be9e8aL },
54200       { 0x59250846892d8bdaL,0x45f45cad19c97c71L,0xf29e2724e6ba5c87L,
54201         0xe441134473f6a778L,0x9f4f9027a0f278faL,0x11bb7ce02bdcef71L } },
54202     /* 12 << 196 */
54203     { { 0x0cc553bb9b3fd7ceL,0x2e0ff43ce103b562L,0x96c01f0328222a3fL,
54204         0x7dcc5593c10171c0L,0xc677366a4b3e5858L,0x872d4396bde4eebdL },
54205       { 0x5d0c5f3a7f83c0b6L,0xbf4274dcf7ba33d9L,0x1df6e4811a635f83L,
54206         0x24e2e8347d807292L,0x792203a8eee1e676L,0x20475f907ef4e8a4L } },
54207     /* 13 << 196 */
54208     { { 0x1b4db0579e37cd0dL,0x61b95bc9ebccdf79L,0x7d98d8537a57d7adL,
54209         0x58a3d639709b0194L,0x45fbd4417ce5bc31L,0x7684b71b5b3c856aL },
54210       { 0xb311f8f85bb6bd1aL,0xaeb8e44711eda59bL,0x1ad5b35fbf269cffL,
54211         0xc69651b4a0e2a640L,0x3713803bd83ad8b2L,0x613ca3af0e4b353cL } },
54212     /* 14 << 196 */
54213     { { 0x3ac59b1fff8cf495L,0x3f3726866b04c4dcL,0x2cdddf90da325f0cL,
54214         0x3ae79666444cabe5L,0x8222f6d6c7484b1fL,0x61fb08929ae328b9L },
54215       { 0x279aae392c575c0eL,0xac694019948508bfL,0x4931cc55b84056f1L,
54216         0x75927a688b50ad1dL,0x47ba72e945584371L,0xbea7e62ea79fe5e5L } },
54217     /* 15 << 196 */
54218     { { 0x990a6767faddc25dL,0xcd7650eb114eaf17L,0xf9d1d6409a44cda3L,
54219         0x70996b6871fb091aL,0x630ae9754ff80816L,0x59a9dc2f987b20e7L },
54220       { 0x9a39588ef65fbbc7L,0x71f4c8e598e7c78cL,0xad2f5a0138cd40acL,
54221         0x3c68fe575a837332L,0x7af44087155e6b4aL,0xd66f4cf8e99e31f2L } },
54222     /* 16 << 196 */
54223     { { 0x5b0b5d692a7aecedL,0x4c03450c01dc545fL,0x72ad0a4a404a3458L,
54224         0x1de8e2559f467b60L,0xa4b3570590634809L,0x76f30205706f0178L },
54225       { 0x588d21ab4454f0e5L,0xd22df54964134928L,0xf4e7e73d241bcd90L,
54226         0xb8d8a1d22facc7ccL,0x483c35a71d25d2a0L,0x7f8d25451ef9f608L } },
54227     /* 17 << 196 */
54228     { { 0x81e304c903b37e31L,0x21781e57925a6491L,0x4ecbad144b9250d9L,
54229         0xb395914345cae8feL,0xb894a39dbf775d4fL,0x8a2c1090d307e272L },
54230       { 0x49dfcee9408bf3cdL,0x08f0f33195b573dfL,0x23eb8a0b214bcd3bL,
54231         0x425e1cde7ccc4d82L,0x53f64095ac113d2bL,0x377a6cb3d88e0761L } },
54232     /* 18 << 196 */
54233     { { 0x9cd08431d360ae16L,0xbf5a73d211281e82L,0xfe25aadfcc34ff33L,
54234         0x8874984b84e3af16L,0x8dd38b596a65a2a7L,0x6c91112c68a26926L },
54235       { 0xb765168637554f46L,0x79558f04c78bf29bL,0x8bb14b1f03012b9dL,
54236         0xed7d03f9a0886ba3L,0x9a436ec3c2a93baaL,0x601babb740db0c78L } },
54237     /* 19 << 196 */
54238     { { 0xa7395eef391821d0L,0xb299378fc8b7b1e2L,0x53a37e3b7f3a58d4L,
54239         0x7d06fa4e3188c5adL,0xe65a94c063dd7462L,0x4daf74f39cfde2b0L },
54240       { 0x98f986b4fbe7198dL,0x8e96b1ee88176bffL,0x5f309f64eb91641eL,
54241         0x46bfe3352ffdca19L,0x1ea1bbe7ac8fbc08L,0xde8ca618b00f88eeL } },
54242     /* 20 << 196 */
54243     { { 0x0757ee852005631fL,0x60f484ea9d70cc3bL,0xaf131d246b011041L,
54244         0xe40711a1062e2e17L,0x05ccf1b94c27e2c2L,0x29e9910e43d43758L },
54245       { 0x54daa550ed000e45L,0xf00a312295d3674cL,0xdb006fe743ec424eL,
54246         0xbddf5473536162d2L,0x7b8a24b579d433bdL,0x3127a46f282297d3L } },
54247     /* 21 << 196 */
54248     { { 0xcd964573cd0585a7L,0x9c2fd35605b684aeL,0x7f600f4de4a47ec5L,
54249         0xcb4bcdf085fdd4feL,0x5b292292b4dcf5d1L,0x923c4331df33a2b8L },
54250       { 0x0fe13edfd6c1e73aL,0x0b35adc6c370821bL,0xa70061b08d405282L,
54251         0x98efb3fc6457af81L,0x8806ee7136e1041dL,0x8b56657faaaf0731L } },
54252     /* 22 << 196 */
54253     { { 0xe68b669189cb38d1L,0x250f59233456ed5dL,0x8928f1fe16188290L,
54254         0x8b24b1f734a837d4L,0x268c8c57d945d0b1L,0xa4190ceae002b3abL },
54255       { 0x4596e76e56dd74b1L,0x647c17871c307789L,0x0b945c7243b13a6cL,
54256         0x4904669552a58ee2L,0x7547a6b46e25b7e4L,0x8bc26f49e2b1b140L } },
54257     /* 23 << 196 */
54258     { { 0x95b3f4e75196d614L,0xc075bcfd5ea18aadL,0x15dc9dd41ae71f42L,
54259         0x75a769f289543f86L,0x06032d9ec392b4c4L,0xd6cc5c717d4df83bL },
54260       { 0x111fc63427ad6680L,0x770dfe7f781bda48L,0xabacb082fc0afb5cL,
54261         0xe3a463e771dca197L,0x390f21a89635b275L,0x3d3474b24ae094a6L } },
54262     /* 24 << 196 */
54263     { { 0x48f5588853666241L,0xb9fee3d39e6a068dL,0x8c50e3af0275e82dL,
54264         0xd490cf2dcab34005L,0x20b11f86bf0584c8L,0xd49714c18179e559L },
54265       { 0x89647b178ded6686L,0x6c4bac8cf16c93d4L,0x5401e4f8076ff71bL,
54266         0x577e73acb1ef9b0cL,0xa1b87e0ea46e7880L,0xab8d8bbb54fd28a7L } },
54267     /* 25 << 196 */
54268     { { 0x220161f0741396fcL,0xae14ce5817da16ecL,0x766e415bb828b19aL,
54269         0x1b3b239e610c7aabL,0xf1c7df4992d53419L,0x57e4cee59442c6cbL },
54270       { 0x546f73b5f85d33d3L,0x195116c74e041703L,0x5a71a96a5d668df5L,
54271         0x0adb7b16fe56c658L,0xf6be923deb563532L,0xa65ed113f2d45f4dL } },
54272     /* 26 << 196 */
54273     { { 0x8c6742e5bccd3be6L,0x5f0f7fdd378de702L,0x41236fec334aabb8L,
54274         0x4b15815b7e9d8aa9L,0xbb816e46e1c235bbL,0x8591cc45176c2fe0L },
54275       { 0xef00e3981d7104b1L,0x761d2c244012398bL,0xe4984f4ae81af247L,
54276         0xf923bb80c144dc64L,0xd51f27dd83988de3L,0x0ad5438d995dbbddL } },
54277     /* 27 << 196 */
54278     { { 0x0532790bd148314dL,0xb4862d9d5b6b4ad1L,0xab65bfc45beb3ac6L,
54279         0x72eac92d99331822L,0x2e09a69a6127632cL,0xaa1eaf0791ef9141L },
54280       { 0x79b923fe754ff12aL,0x19395a97f9a467ffL,0x7dcc91d49ef5cc4eL,
54281         0xb9019ff198a84090L,0x62616ed6d5bfd083L,0x95cbf9442b328615L } },
54282     /* 28 << 196 */
54283     { { 0x22ef6f606374afbeL,0x70e19fad26348f5cL,0x8bcd51a845f98ac6L,
54284         0xeeef7f7026b7ba04L,0x33aa0644544edcb9L,0x22d89a1244974c71L },
54285       { 0xecd08f5d0f8d90a5L,0x495a0403cf03513bL,0xe924feea27953ba9L,
54286         0xdfbe1f93eb5e7975L,0xd3c105a1285865dfL,0x87b8b6360886fc87L } },
54287     /* 29 << 196 */
54288     { { 0xc2da6d7a219d44f8L,0xe66364c555a9d970L,0xfb0936258611738aL,
54289         0x916fbfa844f7f35dL,0x7a4e0451774b1e2bL,0x7adaab9e80375e65L },
54290       { 0x2272b95c8ffdfda9L,0x41644b619ad42b25L,0x157026817f0c98fdL,
54291         0x25d4a00fffba1d85L,0x52e684c6c6c5545aL,0xba85bf2adabb7df5L } },
54292     /* 30 << 196 */
54293     { { 0x89a5b69dd282b12fL,0x63864e7ba7d28277L,0x36ac74d08c21f920L,
54294         0x7cfd291713a2f8d3L,0x50b63122c2ef5022L,0x23d454328ed33339L },
54295       { 0xf8696b2dc4880048L,0xb9605bd5792dcb6cL,0x4cdb5fc26fdeeb9bL,
54296         0x58ee2837f1a7f35eL,0x8956359ae2985ccfL,0x0cc6c4ab2c94cb32L } },
54297     /* 31 << 196 */
54298     { { 0x2fcac7d161a8254aL,0xc396583a05389aceL,0xc6f069cc3872ee52L,
54299         0x76f0e5b407180f5fL,0xc8b23b7a2dee0d6fL,0xc77b242613bf8fb2L },
54300       { 0xa8c625e66d5ae411L,0xc0c40a75b0723adfL,0xdee0ba8f380d9c67L,
54301         0x38b86a3b19920f24L,0xff2191b7d910e9cdL,0x8d01786734181894L } },
54302     /* 32 << 196 */
54303     { { 0xa704016022ec7eddL,0x19124972cc9c8ee8L,0x697f301f2ccb9417L,
54304         0x3ee877646f00d8aaL,0x2b5afaf88138a017L,0xf152b14c832d7543L },
54305       { 0x27c27ce2383052f9L,0x4746c5b5e1dae11bL,0x92dc5ac75b752008L,
54306         0xcf382e01e84fe5f1L,0x90e034197d5929ceL,0xafee3abb15ca3ffaL } },
54307     /* 33 << 196 */
54308     { { 0x299e0c5507f0e3a7L,0x75dac5c46cdebb44L,0x340b5479183c7e42L,
54309         0xfb1b03dd702672d4L,0x68f7222ec07cf89dL,0x67a471e422e7a8a4L },
54310       { 0x79dd4627b9ada93aL,0x774c53771c8ecca5L,0x95191e1a59db2e65L,
54311         0x3f6947f270abeeceL,0xb4934fe0885e4e00L,0xd082e49901728c2aL } },
54312     /* 34 << 196 */
54313     { { 0x86cd8083aaa82329L,0x74f0c5786e579dfcL,0xc2b68c4e3b436545L,
54314         0x8e66c648469d4a81L,0x4c5b05c5bef62bb0L,0xe558ff020bb6f865L },
54315       { 0x9f8ccb16f356a124L,0x1bb28d7c1279f8f4L,0x9b885f0ca8fc4e08L,
54316         0x2ec4cf69859d90eeL,0x9bef3c4d86d3b9d1L,0x5a98ce73eaad8d53L } },
54317     /* 35 << 196 */
54318     { { 0x6c716b179711b5d2L,0x396a4a4cb386c1d0L,0x5845f6861c157c12L,
54319         0xdcad516262c15d4eL,0xb6e0a6a02dadb218L,0xe4f6d5e5a342e785L },
54320       { 0x1eeea548c78980e9L,0x363c31be00a32adaL,0x01481fb7e660b445L,
54321         0xcbb61552999c1f5cL,0x20a73942f361d12aL,0x67fb89a11b8b4b3eL } },
54322     /* 36 << 196 */
54323     { { 0x1d57d639eb00e26fL,0xbeb198906985c10bL,0x38cd95a337b9b76aL,
54324         0x3b1d12e30304c87dL,0xdf42dc6f4734e191L,0x1ed1d9e397841989L },
54325       { 0xfb60e333859b577bL,0xfb026d16ed3db987L,0xa216b0e46f7855c8L,
54326         0x9501bae3539ebdf6L,0xd95a4a32dc8a1f6fL,0x76cb0b6b45307deaL } },
54327     /* 37 << 196 */
54328     { { 0x5607ab62a844b579L,0x8d3ed3db94f67d9fL,0x95390de8a9929b04L,
54329         0x4a6f6f7cc85397f3L,0xec5b73eff26eab04L,0x2543190b045699f9L },
54330       { 0x9a4896138cdbb723L,0x0e081e5b7a1c638bL,0x20f292c6596a7b1dL,
54331         0xa14d849794477dd3L,0xeeeca98064b0de1dL,0x75fdbae92c5135dcL } },
54332     /* 38 << 196 */
54333     { { 0x1202b5752b076f5bL,0x5ca1247edbd6c420L,0xb45ff9bfd8ccc5c6L,
54334         0x680fcfb28e061baaL,0x5a6e6342122a4212L,0x0ad12abc312fea8aL },
54335       { 0xd1dd8ae5665dc7b1L,0x30494dfdd9a22454L,0xc8aa9bc9da55ed09L,
54336         0x6ec643031b74b119L,0xf54574716b604639L,0xe2a214e59f8d83ceL } },
54337     /* 39 << 196 */
54338     { { 0xca698de5f5c96e8aL,0x352c89a3fd941919L,0x0e3de0a909812f23L,
54339         0xa74ba91667702fefL,0x6acfaa5a3863d479L,0x28d8932bb6bb15cbL },
54340       { 0xc62155704ba9718dL,0xc67a3eafa1edd692L,0xc86eeedaab31aa74L,
54341         0x2064ea632deb79c3L,0x813b84f51ff01adbL,0x994b9437458a1835L } },
54342     /* 40 << 196 */
54343     { { 0x1013c4f4fde3f7ccL,0xbad5415a838699b6L,0x2a8b4eac64cacc78L,
54344         0x3d10f949bf75d233L,0x5a9f7782fc84e55eL,0x209a18345ea7b274L },
54345       { 0xa66cb6d4f9e8d374L,0xf898d9479a20080eL,0xe7e4b91b1272df4cL,
54346         0x5b8507cc5dd136bbL,0xbe4b5262372a8e05L,0xa0cb170c2aa4a47bL } },
54347     /* 41 << 196 */
54348     { { 0x469180a38378217fL,0xd960bdde85ef6d61L,0xcc4e737d6654aa84L,
54349         0x28d440016ae51d69L,0xf13a0d9ac6187196L,0xe60851b392160f65L },
54350       { 0x41d98cf61cac48d1L,0xf37f003d1b57f2cbL,0x4829c60bce272603L,
54351         0x45991d4adcbdddc1L,0x17e591fe74601bf3L,0xf8a36b4fb3fe856cL } },
54352     /* 42 << 196 */
54353     { { 0x4410b773fe480323L,0x42ae32e3ea2f8b57L,0x6578a64b2886b9d9L,
54354         0xafcfa5fe4241ec91L,0xa7fa5afc16b4ef24L,0x4a6594bbbc16b610L },
54355       { 0xcb5845515e264fb6L,0x4b89955e2b9c3c70L,0x530426be21e11c1eL,
54356         0xb707abe9c9dab34dL,0xb5aab0bf5931cd78L,0xab6a2585f0ccfcdaL } },
54357     /* 43 << 196 */
54358     { { 0xe75761f716afd216L,0x8ff1cea3b8a4f008L,0x04b8b65e69889d77L,
54359         0x679bf7a586ad9fb5L,0xbe49be0b4c22b86bL,0xcc8905a16c026c1dL },
54360       { 0x17464e7e59ec1983L,0x50cb62832a03afe0L,0x8dadaf456ce4df91L,
54361         0x26cf59d1e0df6fddL,0x6ecc66119adaec45L,0x1be42e744ef67dacL } },
54362     /* 44 << 196 */
54363     { { 0xa01cb3bacb1957b9L,0x053693ccf50694c9L,0xf8a887ad527f3aedL,
54364         0x2f1a80ece9bf06f0L,0x74baeaa57d0eec9fL,0xce8e8b9ab0641cabL },
54365       { 0x91d1e84d128a1804L,0xbdcfcaec2d5fa43cL,0xfc5cff124106fa6dL,
54366         0x2ae3ffab01588ac1L,0xe9dcc9b44c067052L,0xd8e3d74bafa7d4c3L } },
54367     /* 45 << 196 */
54368     { { 0x64a134296d7b277bL,0x487080d8e9a50637L,0x02e5fe901c6c061bL,
54369         0x8fdaafc8ecabeb11L,0xb1e3960110720b13L,0xe7304bf77081f41eL },
54370       { 0x78a10af8c26f5cf8L,0xf52cbc155c032c15L,0x95a3c4558c0c2091L,
54371         0x1797b407abba6f79L,0x87c0cd05a96a3062L,0xdf75e2805f04a7e2L } },
54372     /* 46 << 196 */
54373     { { 0x47161e1f82779cd6L,0xa95afa08c8158458L,0x2cbefdbc40a80742L,
54374         0xd86e0bfaca420c9fL,0x08f5f8c29c79427eL,0xe8f88361da4d0d9eL },
54375       { 0x2195174d3eb78d14L,0x889b32c9ed6caecfL,0x1e679749c3c83ed3L,
54376         0xc27a8c84eddf8a29L,0x4a21af3af8e09f40L,0xf4b9797f1eb3b9b3L } },
54377     /* 47 << 196 */
54378     { { 0x58c2405baa44f11dL,0x86ffaa37ac0f7257L,0x373623cc4070f6e3L,
54379         0x142e62f9a36c73b3L,0x43bab2dd36a143fbL,0x4fbeb0b7aa50375cL },
54380       { 0xf9cc2e7b1f862294L,0x95a9be3c0abdcaa8L,0x70f050225cda074eL,
54381         0x152659db43e6bc89L,0x1790148727c6e01aL,0x544069354e083c21L } },
54382     /* 48 << 196 */
54383     { { 0xcb51f03954ebc926L,0xe235d356b8d4a7bbL,0x93c8fafab41fe1a6L,
54384         0x6297701da719f254L,0x6e9165bc644f5cdeL,0x6506329d0c11c542L },
54385       { 0xa2564809a92b4250L,0x0e9ac173889c2e3eL,0x286a592622b1d1beL,
54386         0x86a3d7526ecdd041L,0x4b867e0a649f9524L,0x1fe7d95a0629cb0fL } },
54387     /* 49 << 196 */
54388     { { 0x028bc25096c54946L,0xace5e7ad0f5fb7eeL,0xc820d7513350ab02L,
54389         0x4ae1f6d99c8d7635L,0x03d1f83a98e1ed80L,0xf014d45d5ad14550L },
54390       { 0xeb8f2c328cd6d0b6L,0x090a8f71770f586fL,0x1a8219f93eb7d3b7L,
54391         0x0d610d9febfc26dcL,0xfdb49980aa330297L,0x6396f218d81b3fbbL } },
54392     /* 50 << 196 */
54393     { { 0xb4ea3102eacb7b9bL,0x4aefb43d72af1d6eL,0x9a1a912d249a51d6L,
54394         0xddd0a5744d5e3a1fL,0xe252114708aa1f69L,0x4b235efe9de89d5dL },
54395       { 0x6fae47420d7f1aa7L,0x0434ae2ff200e13aL,0x75143dc192508b57L,
54396         0xc441a768055e177aL,0x84cd7adf2f142b2dL,0x56484f4161d9ad5aL } },
54397     /* 51 << 196 */
54398     { { 0xe3e9d0881beecd14L,0x4bd12b179093ab18L,0xa6908ddbc925d5dbL,
54399         0xfdc5f740832d1474L,0x1a35623696f831afL,0x0e39086808cde8c9L },
54400       { 0xab1c7cbda2206b32L,0x84d299c8b93ccf1fL,0x380fa432dabb6542L,
54401         0x59f01b5177c2cb3dL,0x9785c47b6e56c4bbL,0x047acc813a3f2b1aL } },
54402     /* 52 << 196 */
54403     { { 0x724210e61e42b4a7L,0xa8d536afe2dd968cL,0xc69936e683582c60L,
54404         0xd031f1abdd5d7f68L,0x7d31dcae8c4180d4L,0x117985f622bca188L },
54405       { 0x3b0a982537e38dc2L,0x1663fdc5896fe4b4L,0x55d18cc7fd707372L,
54406         0xfac2d7a40d2d8470L,0x994763391b04b1f6L,0x87cfbb5ee0bd72e4L } },
54407     /* 53 << 196 */
54408     { { 0xeac6a72ad5dd2841L,0xf1aa32524277e152L,0xe6c44e9b6ef7e947L,
54409         0xd03309fc54095378L,0x6fc5fb9ccdd06947L,0x10ed0e76d1e9a968L },
54410       { 0x42d5ab02dfb77b17L,0x4c54c381a53de8ccL,0x5fb4c256f2b1b5d8L,
54411         0x17d5ab28e12ed054L,0xd7c96ce1139da42aL,0xb32f63859919f459L } },
54412     /* 54 << 196 */
54413     { { 0x4bf5788312f4b0b3L,0xcd69d82ef46735faL,0xc397c8f9a1baa0efL,
54414         0xfce184c0fd1be398L,0x15021775fa54580eL,0x10bc85468f54397cL },
54415       { 0x6009a691eaa9d711L,0xc9c6a42fb7846417L,0xe9c305685627817dL,
54416         0xa1be66ff92abd5daL,0x9317838fcdea11c0L,0xace94ddcc85e7aa5L } },
54417     /* 55 << 196 */
54418     { { 0x3ef37821d4079bf4L,0xff78abebfcbdc3d0L,0x117414bc4733ea34L,
54419         0x7f181a3b9f50d0feL,0x9ea5f94eda897ea7L,0x01a996ceee8314ceL },
54420       { 0x0cac3c8b420e988dL,0x7ad66ac4bed3294aL,0x6bbf6dd800b62445L,
54421         0x590a57017a2fb4fdL,0xbf3b4e529ac11d81L,0x1bd453020d60c710L } },
54422     /* 56 << 196 */
54423     { { 0x8a43bba0902c32d8L,0xd8c69b74a3955e42L,0x413bf25d79c64afbL,
54424         0x3c39837584ac94cdL,0xfbfa9c53a08ccf5aL,0x9d8ac945e9d791d4L },
54425       { 0xfb9bb89e5e7a2553L,0x1442612bb039dd24L,0x8250ffe0a2e2344aL,
54426         0x5eae8b396426b985L,0xa1657768484741deL,0x05e52d4ac73cdf8cL } },
54427     /* 57 << 196 */
54428     { { 0x61c2417995c5e767L,0x7456380c3bdfef62L,0x62763f43d206cbb1L,
54429         0x1996e2c657871e44L,0xd0dbd290f220c06dL,0x6778e1e5d87743eaL },
54430       { 0x40e54caf16b8f046L,0xe834a1cb6bed77daL,0x7240befa3e9457c4L,
54431         0xd1b638dbac96cedcL,0xd1d7e814c9c0cd8cL,0xc73beaf14d38258eL } },
54432     /* 58 << 196 */
54433     { { 0xf1a6d776c05f40feL,0xb98c19b1c21ce471L,0x700b0bab7f9689eaL,
54434         0x861513a56f1d2e6eL,0xb7558b2292fe4456L,0x2d8f860704c66a25L },
54435       { 0x10ba7d6a7998347dL,0x72bf56093983b98dL,0x8d873c4f89238292L,
54436         0x5db0dca9a5e3c944L,0xf81fe37e0925aef0L,0xed6a13a4e4daae25L } },
54437     /* 59 << 196 */
54438     { { 0x49e2372711c3a930L,0xbf2ede34f5293b8eL,0x0abeeb3ca8e1cc9aL,
54439         0xb1db299440205cbcL,0x3252d29e52fb01d4L,0xa0b080c57dc91095L },
54440       { 0xb56fdae622a9ceb9L,0x6c3c3463b31f6f27L,0xcb510ec2ae3bd22aL,
54441         0x1efcd77b0b3db475L,0x1094bcc5ca766f9cL,0x688e940dfea48297L } },
54442     /* 60 << 196 */
54443     { { 0x3d95d26a99cde27aL,0xed608a89b99344f4L,0x7a70a8f09c0ab25cL,
54444         0x7740953c496552d8L,0x4da4ca0f4a366adcL,0xbf475c1b33274d4fL },
54445       { 0x5ac1d8288811b869L,0xed62e7b4d23446d4L,0x67d78571a0eab287L,
54446         0xa74ae3e98b0acc4dL,0xa63f91d64077c236L,0xe2c3f82a818a6889L } },
54447     /* 61 << 196 */
54448     { { 0x2bde7037b1d5fbeeL,0x477a4b51a80b92f2L,0x195ae0e06606b504L,
54449         0x7aaf3de57497785aL,0xb5581ee9290c5ef9L,0xcb303c30360c8ec2L },
54450       { 0xfb056f901b1fb602L,0xa38bc9f59931b7ceL,0xb0b74aeab2f453a8L,
54451         0x9a0e2ebf668cd68aL,0x8b7e0d73d7db7842L,0x21f29b74d1fa5433L } },
54452     /* 62 << 196 */
54453     { { 0x38321d7c4e11f824L,0x04dcd3a3e4a816e9L,0x382968ed07e09612L,
54454         0x6f7b2dbfa370e1d1L,0x5a8472348675d730L,0x88d974b0e59e984fL },
54455       { 0x89f7e2bce3f9e429L,0xd478eacfe3aebac2L,0x8df9f281ebef3488L,
54456         0xcbcb9fbeab5543b3L,0x2c8d19b0203f59e2L,0xbb98e4495287b0fcL } },
54457     /* 63 << 196 */
54458     { { 0x16c45f709aab81d7L,0x0f1310851795a4b7L,0x3c63d43af0ecd732L,
54459         0x22e2d1988628b683L,0x7d7482bab641d6d4L,0x6baef4a2ab69891aL },
54460       { 0x10989097e63c00d2L,0xbfd42ab0d93794ccL,0x9a1935f3e4165a41L,
54461         0x359701b35b600ca7L,0xbe7d69f983d1b54bL,0x99b0f35e3729bd4aL } },
54462     /* 64 << 196 */
54463     { { 0x11dd860e1c6d03b0L,0x30c1700809eec660L,0xd4f8aff635c0192fL,
54464         0x96a727b1e3a4a900L,0x1426daffde78c8baL,0xfacaa9bd8d1527c4L },
54465       { 0x0c0d5234cd072989L,0x1936c20d918550b5L,0x4828bee43d914fb3L,
54466         0x8324ea38f3ba26a6L,0x027590f3a94eb26fL,0xfd354295acd957bfL } },
54467     /* 0 << 203 */
54468     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
54469       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
54470     /* 1 << 203 */
54471     { { 0x3ede2484da756624L,0xb22da2ab73b13062L,0x56069e93962a667bL,
54472         0xc931266b130f2ceaL,0x4bd6a6fca7366a66L,0x23f30563aa5ac3b1L },
54473       { 0xa025d0efd7c2b26fL,0x597ce7d862129bc7L,0x4809927f2b3057f2L,
54474         0xb001c10a1499f884L,0x309d141c30b9a653L,0xadddce7dbf659d05L } },
54475     /* 2 << 203 */
54476     { { 0xa6c32900af2825c1L,0xb37c46c1d223a04eL,0x691e7d39063de7eaL,
54477         0x998df4e710daf9bdL,0xc7085b9e718b5d7aL,0xd41abcc816b3d4b8L },
54478       { 0x4dfce693f9bc4041L,0x383677ed659ec7a8L,0x2c1904bf4491fb34L,
54479         0x7c1bf1114552451cL,0x6562cc2c3c5e5e40L,0x1ecaa2a1fe0e4372L } },
54480     /* 3 << 203 */
54481     { { 0x9657d08ca9cb9ecbL,0xf69662363b75be69L,0x396a9344a31c2b8cL,
54482         0x1c50b1269767bc1fL,0x597223d0d1417e03L,0xe165ed5a12137153L },
54483       { 0x8bce29f926a24098L,0xc428a1fbe99e7bf8L,0x6fd4c906eea7f1d9L,
54484         0x94275713fceb2e05L,0x3555448b741dbd94L,0xc50e85459faffd4dL } },
54485     /* 4 << 203 */
54486     { { 0x84c3630bf3087bc8L,0x152691e674be6e26L,0x5abd125ff61af001L,
54487         0x69bca56fbfea3525L,0x384af19900e0cb6eL,0xb0b13cfed00475a6L },
54488       { 0xedafde495e394049L,0xd988b558daf2add6L,0xf14cf97a6c8ffcc9L,
54489         0x4d6cec23e5a9cc5cL,0xb0d678f88a104e05L,0x80a7fcba9fb527c1L } },
54490     /* 5 << 203 */
54491     { { 0x9ae12b902af1ffceL,0x082f30b95a30521dL,0x974099bdc304014bL,
54492         0xab1e27e444ccb6e5L,0x72db8f42290387a1L,0x3d1a461040f3ce18L },
54493       { 0xe939a3f2634ba10fL,0xe70a9cf517254c56L,0xd0f8692fa08ec3c5L,
54494         0x77edefcc7a7cbdf8L,0x04c4b18ebdf90f0bL,0xa890436a8aa36a59L } },
54495     /* 6 << 203 */
54496     { { 0x8618ffa79e30f8a0L,0x9961390cd12699bbL,0x5b1b0d744f61edfeL,
54497         0x33df67d9eb7a476fL,0x7f1a767ea92ee99bL,0xfab400e32223a2ccL },
54498       { 0x16f376f2f534dc3dL,0x6f36eaefcec17905L,0x8dc1516ca58765deL,
54499         0x893408262260ed6bL,0x060eb0afcf4b29baL,0x9cd0a9f11d252bbaL } },
54500     /* 7 << 203 */
54501     { { 0xd3c2a6a8ca413693L,0xcc56a8e932d5714cL,0xc72b73683c0da165L,
54502         0x5d236660db44e616L,0xa83b2ecce5c73667L,0x9d292f298aea900cL },
54503       { 0x67121215aaa2a7eaL,0x57dae96abf889191L,0x63bf7a81d296ae68L,
54504         0x9bf518758fd496c4L,0x5b4382fbc2f7308cL,0xf1215dfc9632aad7L } },
54505     /* 8 << 203 */
54506     { { 0x0d6cadbfc22137d2L,0xb5db59d3628a3298L,0x3b433c734ab19507L,
54507         0x4fc53405660086b3L,0x770ae903a1eb0f43L,0x31b5857ef6b5b58dL },
54508       { 0xe206e141d392868eL,0x8be6956f4b31de04L,0xcfbfca2f47449e07L,
54509         0xebaef25639fef8e1L,0x959e37b8c16fc80cL,0x8bb4bdd2e911d61bL } },
54510     /* 9 << 203 */
54511     { { 0xecfb851380fc41f3L,0xb0dc8823931843c4L,0x59decd6c1b93df03L,
54512         0x954103b72511e252L,0xe372f86a0f759de1L,0x04f5afd38f6f9ef3L },
54513       { 0xbd8e60affcba2e7cL,0x9b1cb1ed092315b0L,0x5f9e20a03fd05e36L,
54514         0xfcdcc44ded95f25eL,0x6baf401b6ac79cb5L,0xfe1a5a856894f651L } },
54515     /* 10 << 203 */
54516     { { 0x014a0907e51c6673L,0x28118ccd3e6e6a91L,0xdbbb7c4dc999acc0L,
54517         0x01b771075e7ab1e3L,0xa33fefbfcd8fb11eL,0x1df5b61fc0b8a5c2L },
54518       { 0x774dc2674478c5c6L,0xbfe1add422fb91a1L,0x5ac4dc694d9c8461L,
54519         0xbf6e002a1e772c5fL,0x4922120e0b83fe91L,0xa7747f4b3efbadceL } },
54520     /* 11 << 203 */
54521     { { 0x4b955beaddaf2e82L,0x3775ecde90fdc68aL,0x579c34f91713e763L,
54522         0x6c27f504fa509d74L,0xef6df04a3f8dbf4bL,0xc39f2e28b3ad7104L },
54523       { 0xe54042b3a5973cffL,0x4e594427f111f3d9L,0x53c7a2ba155fce57L,
54524         0x7b3c1c60e6e1d21fL,0x5e12db8d308ddf4dL,0x2c3c5e77a00e8976L } },
54525     /* 12 << 203 */
54526     { { 0xc483d4b24343bbf8L,0x42aca2e18a0fc95eL,0x5165df6fcbab1fb0L,
54527         0xeb284370f6cdfc0cL,0xab565c00994320fcL,0xc0d157fd62133e80L },
54528       { 0x7850cda55b69644aL,0xe37ae76a806ec8b8L,0xd14b805cc2c82eddL,
54529         0xcb5468b6cf244539L,0x97d43ee825dbe92dL,0x1442243689fb8f1eL } },
54530     /* 13 << 203 */
54531     { { 0xcfc8a945f361dc08L,0x383a5336491dc3abL,0x77580587c35cd376L,
54532         0x6604248ae2426904L,0x47c56025ffeb9d26L,0xc301edd8bae5d983L },
54533       { 0x7c6511a9e2e5cf33L,0xdc52c1dd221d41acL,0xdbdc8acada47503bL,
54534         0x01b406864bcedbbaL,0xca9cb9fd2d5496d5L,0x5768e0edb17e8400L } },
54535     /* 14 << 203 */
54536     { { 0x421afbe0431cb760L,0x9ae9ff985203e69bL,0x56cacf4db1a2705aL,
54537         0x6a3a4136d128bcd5L,0x2411c4b866191ad8L,0x39f26e1a15b45d24L },
54538       { 0x4cc82459c64ed153L,0x5c7a0dd58195b452L,0x9c88bb1c69f6298dL,
54539         0xfe567b031933fdb5L,0x8a6aea71881308c3L,0xc1268b55a2f0adfaL } },
54540     /* 15 << 203 */
54541     { { 0x312b777c1231c557L,0x3984f71be9971115L,0x0266b58294cc2d4bL,
54542         0xc3058419cdf5e5c1L,0xab3a1ae477bbf0d8L,0x7c2173a6d21603daL },
54543       { 0x61cca8cc747b092bL,0x70f77a53e376506aL,0x742c20692f1ccc85L,
54544         0xb1f2ceca2dc8844bL,0x5a73cff83a096c10L,0x28acb67d5c19cd11L } },
54545     /* 16 << 203 */
54546     { { 0xd7bf2ac6a0a85236L,0x2921b55c7194c46dL,0x162fabaa9afa9762L,
54547         0x7b7f1664b62b36abL,0x77b9f797296a84e9L,0xfcc1ad657dbd843dL },
54548       { 0xc6e9c1e1cd77b7f6L,0x9cf0e272917067c9L,0xfa7fa93d3bfa90bfL,
54549         0x55846fe9d050e46aL,0x473b9a0d35c56256L,0xadd29e332b656a65L } },
54550     /* 17 << 203 */
54551     { { 0x4698137f46fb8ae3L,0xb11a595f7b1c062dL,0x4a043b99ff023ef7L,
54552         0x2836d64d8ef0fa4dL,0x4067dbee8ea44a98L,0x9d1739c9f00ff4e1L },
54553       { 0xcbcf12fe133d2703L,0xd2923424016037cfL,0xda7543d68be5f666L,
54554         0x587d1920ac5e1847L,0x14662476f79e3462L,0x0120a1d8c810a1f3L } },
54555     /* 18 << 203 */
54556     { { 0xa4fc828ab18f9bb1L,0x06de4c9da27a787aL,0xfbb7c7d7b1b3a12bL,
54557         0xa7052b94b8583128L,0x173ec2d2e7b02fd8L,0x4b724682c776c664L },
54558       { 0x46ed9be5673183e5L,0x312191e83bd17c60L,0xe3ed6326efd56a9eL,
54559         0xb3ebc44c943a2278L,0x7ef62ba9ec9cf589L,0x754be6d389832cd7L } },
54560     /* 19 << 203 */
54561     { { 0xccb4b369dc992b32L,0x0ef84cc0922cee22L,0xda0058f1fc56e9e1L,
54562         0x208c57943f23632bL,0x3589a7338f77a82bL,0xee6cfa2c76ee99bdL },
54563       { 0x88cffafc418f7993L,0x0dde3f05f4be56d6L,0x5d088382a0472bf5L,
54564         0x872ca5aabd58d05dL,0x9c467c62e8f91f17L,0x38ab1b348c6b91ffL } },
54565     /* 20 << 203 */
54566     { { 0x926c2552ebc69b0bL,0x953a850fd4c7432eL,0x0ee85e14b9359035L,
54567         0x8b10b01abde090a5L,0xb2878dcaec423943L,0x2571a178f70bde20L },
54568       { 0x24ed159af5ebeee5L,0x60c202af043f6539L,0xdaaa76f4c8d4ffc3L,
54569         0x2fc1f1ba06eda10fL,0xddf159ee88ded556L,0xcfa71782e67b1ec4L } },
54570     /* 21 << 203 */
54571     { { 0x2596ee7409d3ed60L,0xd42551f474a46e37L,0x2e46a92e21061c90L,
54572         0x236299fa73ad22eaL,0xacdccd5214393ac2L,0x9a572130b56b4d5bL },
54573       { 0xddfc31781835e70bL,0x5dac0671d542048dL,0x2b0768d7a6dce17cL,
54574         0x6d447d4206c55342L,0x6b55b21525548478L,0x24e6483518d5310dL } },
54575     /* 22 << 203 */
54576     { { 0x3c58c5ea9b037c66L,0x08d0648e0d5c6ec5L,0x1bf90c53a4fa3f5aL,
54577         0x660cf61740381205L,0x63fd03081d44af3fL,0xe22b9c1a77175de7L },
54578       { 0x0b6044fc3556fc9dL,0xaefb6804fb55318eL,0x77045bce5c46e1ebL,
54579         0x29c4a3bc76e8f93aL,0xdf8aec699d697f5dL,0x5bd9552845a89080L } },
54580     /* 23 << 203 */
54581     { { 0x1bd61fbdc5756910L,0xcfcc6d5adeaca40dL,0x292867885dd80ac1L,
54582         0x7effe328d621c0a6L,0xc64ebb91ab22a2b5L,0x8954ab330c44a456L },
54583       { 0x7552a0b460e26218L,0x2e81d3a94136adbaL,0x96dc2451610d665eL,
54584         0x30859c62ab04e03fL,0xdb3726fd4c31fa3fL,0xbf4954d1d962a7c4L } },
54585     /* 24 << 203 */
54586     { { 0x31521f66d5d826b0L,0x0a63695240787844L,0xc0a3bd059c8f934eL,
54587         0x12c57dd42f0ce835L,0x847f6a9967064213L,0x1c9e1a7aa88bd71aL },
54588       { 0xc4060eb2171e8407L,0xdf78d8dfed106780L,0xa3d28ceb0d704729L,
54589         0x4f8e523246ca3912L,0x09e9f852017791f4L,0x594006631e6ea97dL } },
54590     /* 25 << 203 */
54591     { { 0xdd26fb79444827feL,0xbf78e076d3f5fa6bL,0x46d486e81a5475b5L,
54592         0x43e325a5faabc3f8L,0x1fef6b6ba6795d0cL,0x40e040666644d631L },
54593       { 0x16207bb9676c3322L,0x677c1c235811706bL,0xb686252e994e2a95L,
54594         0xa359e2a51b6f6a3eL,0x6d8f06cfb124f019L,0x3bcf778246266c42L } },
54595     /* 26 << 203 */
54596     { { 0xeaa3426b8eb929aaL,0x090924f2327bb35dL,0x4d23ba1276da394fL,
54597         0x05d98e56adecd43fL,0x83c7169f6b4af795L,0xc22560a7c8f26ae8L },
54598       { 0xb43aecc2d01ab5d8L,0xe7bcdc1f7257d7d1L,0x6f32d77650de3318L,
54599         0x6d736b279bf02c0aL,0x9534fa5865319235L,0x5a6a38493cfbeb3cL } },
54600     /* 27 << 203 */
54601     { { 0x3ddcb65828c50956L,0xb335f336bf1bdb4cL,0x7c18d2d0ac3b6194L,
54602         0x8748654bca324d11L,0x7c9c58dac2e85f94L,0xf1930a56d4f4f957L },
54603       { 0x9cacbdbbe410fee8L,0x0e292c2178e1312aL,0x6845b293906a6270L,
54604         0x842ded0f00c5401eL,0x747cd08f35e3ff9bL,0x8405540af48227feL } },
54605     /* 28 << 203 */
54606     { { 0x547b0d9583939224L,0x3a0823ff1e026769L,0x6016671525bd43acL,
54607         0xb6cf475e18ba5f64L,0xa22f9c92c8b6d09dL,0x730553683ccf50abL },
54608       { 0xa6de248eee6deefeL,0x32aaf8b2acc3ca20L,0x0e254c5bad44e674L,
54609         0x8aa73e6535f95f98L,0xe622600160a2dc1eL,0xdf9482109109020aL } },
54610     /* 29 << 203 */
54611     { { 0x7b24d7b056190aafL,0x0115cbdd0563b377L,0x5688526ca7ba4975L,
54612         0xd2971e28aee3100dL,0x57a6ff8a6fa24f61L,0x9cb571c4d8603be7L },
54613       { 0x09c01564a2cce6d5L,0x14f0902b89884939L,0xd71a5ff8a072ffecL,
54614         0xee7848b8fefeab69L,0x7b52a9577e40895aL,0xd1576be7e8c61be2L } },
54615     /* 30 << 203 */
54616     { { 0x4c4d454849d77b8eL,0x431f942f6a4c982dL,0xc8633d051cb39ce8L,
54617         0x23421f8caf516f9bL,0xc9db25d2aac876fbL,0x9f2669c5d882760eL },
54618       { 0x59dc4bf4c47d4bfaL,0x99ed0024c475f93cL,0x269d1ca4ebe07d37L,
54619         0x49ce3bdbbf88b1faL,0x515044053361e4ccL,0x207f0048735b3c96L } },
54620     /* 31 << 203 */
54621     { { 0x835fe90b5a516e82L,0x26f1f2a7abfcb383L,0x3dae65a8609c4ac0L,
54622         0x70b01d6e91f4054eL,0x22da015b581e3159L,0x2ad34f99329d1ebfL },
54623       { 0x7385aad60d09b845L,0x4cbafb0b0adf42f7L,0xd8727d26c02398cdL,
54624         0x58c261f590549db5L,0xd49b12e48ea70310L,0xb31eea047ef89773L } },
54625     /* 32 << 203 */
54626     { { 0x372798f02893f2f7L,0x4f62bfac9e5030caL,0x5e64f9a98a1e2567L,
54627         0x5870254ce70391c8L,0x2def81a341f02458L,0x25d4e4dc1d087bedL },
54628       { 0x3557d07d4fe24a13L,0x6da49186dc3112bcL,0x08c8c5675f73ba50L,
54629         0x5309050b9c7c6706L,0x2ab67da3bd985072L,0x9bafa8b1e5df4e96L } },
54630     /* 33 << 203 */
54631     { { 0x5acdcd216f77738eL,0x340710746cb67a3eL,0xd68c55cf4bf76bf7L,
54632         0x64c159200b4deda8L,0x1021d38ae242b1e0L,0x615f1f033bd3d95bL },
54633       { 0x2ae0245cc300c9c5L,0x3549605ba88d63e2L,0xfe0dd65ad5038849L,
54634         0xe67abfec63c6e4aeL,0xccd08ba528153bdfL,0x9be9f5bced4d76bbL } },
54635     /* 34 << 203 */
54636     { { 0x30fe00bb6e8423deL,0xe16ce94784e4d005L,0xaf0f8c283fed764cL,
54637         0x05ef9bf67d92b1efL,0xbf6570d4eb481da7L,0x39349e30468494ebL },
54638       { 0xe32b99a63fb36907L,0xd92386da2d35e71bL,0x74af8b79166a973dL,
54639         0xa0a177f94f72de6bL,0xfff3e19d5dd6c660L,0x15310d4d4b0d54f0L } },
54640     /* 35 << 203 */
54641     { { 0x692a561f15c15a11L,0x25abe85f26ca3ddbL,0x50fef4444caffa5fL,
54642         0x58472cfbed3f4aadL,0x7e9178f0092d2b83L,0x3afd364ff8dfaaa7L },
54643       { 0x4686ee5cbbf813a8L,0x6a62687d937cbae4L,0x56f22558a9b7b6c9L,
54644         0x9af1beae9c189e25L,0xfac4ad9f4d41f79eL,0xdecb57431f9c7a40L } },
54645     /* 36 << 203 */
54646     { { 0x3ac662895c02f173L,0x6a110e3876d566e5L,0xd9cc14e2b9577e26L,
54647         0x6f3d5df9fdfe617eL,0x8fac740f352bb2caL,0x50bc8a0cc28e6310L },
54648       { 0x6e572fc477ac93f7L,0x56277377605bb8e9L,0xad6d0637402b8c55L,
54649         0xdab377914509eda7L,0xae770abc0854e91bL,0x523bd278742b3de8L } },
54650     /* 37 << 203 */
54651     { { 0x8ede0eea2aa0da2eL,0x7015ee6e90cfeb90L,0xef33f3efd6b3227aL,
54652         0x6e332f1712ef9f4bL,0xcaa089898e7f9fe9L,0x001482ef8fa71529L },
54653       { 0x2522637907a5019aL,0x807faf01bed40fc9L,0x426002ab56710e12L,
54654         0xcdfffbc18d3949e6L,0xcc03f27861284379L,0xcd7dc2026d5edc82L } },
54655     /* 38 << 203 */
54656     { { 0x94f84d57cff31148L,0x9c567c7f6bf2a313L,0xc82e62353149ad8fL,
54657         0x81f69703c2a5d513L,0xb54e6fc756eea9acL,0x6799c7957c3aae62L },
54658       { 0x78e89c1edb280515L,0x3c5693066ac42925L,0xd984c86dab063cc4L,
54659         0x61754b5151d44ae3L,0x23af8ec0cebeef0fL,0xff67170bc618fe8aL } },
54660     /* 39 << 203 */
54661     { { 0x123b567195b58447L,0x7397316ad43aabd2L,0xcb65d69d9ddc7979L,
54662         0xf98be7bd91150e08L,0xa5388c79fc0ae5c7L,0xb115690215ed9074L },
54663       { 0xc2d01b9227e9afdeL,0x80d705ec2095a6ebL,0xbea901c7fab23079L,
54664         0xced8b2772346d712L,0xad5c45a92542a0ffL,0x87b2e4ac0455e90fL } },
54665     /* 40 << 203 */
54666     { { 0xc2cbd64417fecb90L,0x61616eb3b32dffdbL,0xdc4485a29f5d2095L,
54667         0xf78911246553371bL,0x4f06ba18bf9b20afL,0x136d4f291a2c4df1L },
54668       { 0xc04aca34fb8b685fL,0xeec83c20f2b657bbL,0x4da5d70a5925a36aL,
54669         0x8060874172ff2965L,0x2e0dd9ff9f352620L,0x5f0afa6746d1a7a8L } },
54670     /* 41 << 203 */
54671     { { 0xb76c722762c1e582L,0xbce1eb164ffefd05L,0xa574a9fe169e53fbL,
54672         0x77bf92b0c001628eL,0xd998172c04d60440L,0x62f35199ceae6bf7L },
54673       { 0xd81a563e93f1ff84L,0x5a7a0b4211598ad0L,0x884f2ca5ff11f3f8L,
54674         0x99f5aac2f3ac66cbL,0x58497c01f489c5afL,0x11277bc39566521cL } },
54675     /* 42 << 203 */
54676     { { 0xfb9670c26a770385L,0x5da887e1e9682174L,0x31fa9d6bedf922f3L,
54677         0x8de8814cf7a98d1eL,0x3935b9b27a019f08L,0x1f59d6f3ea6173caL },
54678       { 0x8732f39d5c638a66L,0x981a1b7a3d48d3e5L,0xea451b381ee0ab37L,
54679         0x31a8e9abf2708356L,0xa491944ee86cbfc1L,0xd747a885a97ddfcaL } },
54680     /* 43 << 203 */
54681     { { 0xa3460236aefd304aL,0xaac80f43c58719a0L,0x7d635c17d3ca5b1aL,
54682         0x986ac0a62119976aL,0x0d8a6e39f2538d36L,0x6a02af2f31849d5dL },
54683       { 0xecb6ef8f6719d4deL,0x6dd71ab674ff8880L,0x0d40ec0e9d225d93L,
54684         0x304cd88adf381d24L,0x2d6787380c5571fbL,0x03c23f547c03af94L } },
54685     /* 44 << 203 */
54686     { { 0xa995a95bf46aace5L,0x44ede5379eaa630aL,0x421f3b3500336e3bL,
54687         0xbf897478cf47c9edL,0xf360ae32259e0827L,0x04e0e3e82e6a9f6bL },
54688       { 0xb26eae5fa9136702L,0xd6cb15a1853674b4L,0xf81276e2748bcbc9L,
54689         0x7fc02e220a4ca1d7L,0xf650f48ecd82f330L,0xf4ea7c1dabaa8859L } },
54690     /* 45 << 203 */
54691     { { 0xe9f090b935caae35L,0xe04dff188dcf1e6bL,0x81b7de5eb8032e04L,
54692         0xba0d0b4e4b1e8070L,0xaa82dc8ad1a2aeb3L,0x5855ed1ded26f229L },
54693       { 0x8bce967ed1955233L,0xe6ed07f356ac7532L,0x4227c7fdbf0eff2dL,
54694         0xb1f4785fa5e213e4L,0xeedad0733ac30f4bL,0x503619889cf1e686L } },
54695     /* 46 << 203 */
54696     { { 0xeb252116ba5da79eL,0x51cc937edb691345L,0x1d5fec14077458c1L,
54697         0xaa304f7ba0808e6fL,0x4bed89f5abec4c09L,0xc67293cbd1a3b798L },
54698       { 0x0905f7d342122672L,0x83675b2da0d3a277L,0x7f422b7024bf5bcaL,
54699         0xe2144c6910495acfL,0xdac1c357a6a6ab5eL,0xd1a3b951c8b1d472L } },
54700     /* 47 << 203 */
54701     { { 0x0821017d60c0c248L,0xa17ce97a8540bdc8L,0xe0576ea986e6f45eL,
54702         0x1453268bf152c6eeL,0x1ea1937138edbed5L,0x970ad9c002343c23L },
54703       { 0x3a08a859af8a97afL,0x20caf7cab570d738L,0x6d82d863e2a89455L,
54704         0x30eb8d0724c76844L,0xb31d58c8d32b79f1L,0xe5df7cb9fe63e93cL } },
54705     /* 48 << 203 */
54706     { { 0x1ccd44ff95c746ecL,0xe18914b510405763L,0x50ed644321a3a927L,
54707         0x4f96a1b143ef8e8fL,0x7f5645e577952bf8L,0x4bc5c7ab66dbdf15L },
54708       { 0xacc1612623930a08L,0xbf5ed482504cf9b6L,0xdeb7a798d71ecbd7L,
54709         0xf62e63b14a4dd859L,0x668809a7daf714d9L,0xdd836382f3a4329eL } },
54710     /* 49 << 203 */
54711     { { 0xac0ef2cf383e038bL,0x848e3c1f91135098L,0x19e5a3ee3f15b241L,
54712         0x2d01f1a2dbea2ad2L,0x44ec32a799cb0bdfL,0x3e66fed4eab4d856L },
54713       { 0x3162a75af45c8656L,0x53ab74245a37ca4fL,0x1b81f1dc360bb395L,
54714         0xa7eb222e2b8a5267L,0x163bb0c804b0bcaaL,0x1cac5bc0ef5c417dL } },
54715     /* 50 << 203 */
54716     { { 0xb95e2d85e81d9e43L,0x8a92acdd1418f6d8L,0x5429140110ee43d7L,
54717         0x32a2933c625838dfL,0x801d57dd3d485868L,0x33bba67258af765dL },
54718       { 0x545fe2583f520eecL,0x900ed51a32d71974L,0xf21fefe6df3ed77cL,
54719         0x2f0df28c9deb2d81L,0x90898dd780856fb7L,0xeba82159bbba4771L } },
54720     /* 51 << 203 */
54721     { { 0x83ecc8f374df3780L,0x432e9807d3a89728L,0x3461c5297b5cb6e0L,
54722         0xee307c19030c25cbL,0xd72b60c7391ee616L,0x0c07bf462e9b4384L },
54723       { 0x9d791b0bd44acd49L,0xf3b3411c9f3b33caL,0x1bf55cb97f9b455fL,
54724         0x77e01607600f0a91L,0xdab95bf26bb7e977L,0x30d0f591fe4633e5L } },
54725     /* 52 << 203 */
54726     { { 0x894bdbd9c48f3ad5L,0x687ff8de09e167f6L,0xf06104a930371c43L,
54727         0x82fd34b7ce84dd10L,0xae122deb66ce5abdL,0x31f041d2fc4a90b2L },
54728       { 0x2589535c9a01c607L,0x231bcc85695bd7abL,0xc67c306262e3a31dL,
54729         0x31be44757af3e186L,0x1a2077a388efa7f1L,0xffe53e22815fad1aL } },
54730     /* 53 << 203 */
54731     { { 0x4ce41f69a3ee310bL,0x38fb07d09bf311ddL,0x5fd284d660985bd4L,
54732         0x2fe99a19e04d3dffL,0x21a352520b3ad853L,0xb0808a89012aa69cL },
54733       { 0x98219cf718c7c301L,0x429e08fc91254db8L,0xface2e53c41d54d0L,
54734         0x180651242decb2d7L,0xa9f65e3f26a9191cL,0x1dadd3deed42831cL } },
54735     /* 54 << 203 */
54736     { { 0x81ce91dd6327460aL,0x4cc880a0e2f22af0L,0x81aa9bb46a6d36f3L,
54737         0x8ad516741dd10657L,0x212267854253b30aL,0x530d1f6a8f161dd6L },
54738       { 0xe7eeb4c7e9ab63aeL,0x84f225bfb72d250eL,0xc81cb984458a8dc7L,
54739         0x39fbbe3bda68c1afL,0x8c6c99b3083cafd9L,0x4700ba37eb07d40bL } },
54740     /* 55 << 203 */
54741     { { 0x8980dd7cd8dcc7b4L,0x0179e9bc7ad18f8dL,0xa9e4fa6a08c60f0aL,
54742         0x4f0d76fa3cc7dd36L,0x53339e4c51a0e67eL,0x1acdaf24cebd80cbL },
54743       { 0x5aaebffcb5264b96L,0x3ebebb22858df87aL,0xb2f4c1cb092a95a1L,
54744         0x34932d51841b1a63L,0xe0631aab49074a2fL,0x71525c4fe3b7fd61L } },
54745     /* 56 << 203 */
54746     { { 0xdd15591366229776L,0x84093730f7882064L,0x6dddcb14e50ee337L,
54747         0xa8e6ec597a1f7e81L,0x8467f998f3738a6aL,0x70fcc6bcad3f1840L },
54748       { 0xf82eb4be723b3f4bL,0xf0f3935406beec1bL,0x1b181ea37ddcb539L,
54749         0x9c82c4faad6a81b9L,0xcc5ea5435c612c2bL,0x63ce7571bb258d6fL } },
54750     /* 57 << 203 */
54751     { { 0xc6c110ecd3b9416aL,0x254403ea024f63e5L,0x92d2965b68aa4a66L,
54752         0xa08bfaafbaed92aaL,0xe2194cd701ad3eb4L,0x7ba66e1da7552847L },
54753       { 0xf68c90ee44eb9bbbL,0xabe38c5c5f6438daL,0xe16d4aa68c38a6a1L,
54754         0xc2f8691bf6294db4L,0x9248492fba64da6fL,0x850c6a6865a3d6b7L } },
54755     /* 58 << 203 */
54756     { { 0xa794308d2599a1f7L,0x06bbefce3e72b328L,0x24f2c6f5420f6ae1L,
54757         0xedf67defaae894c0L,0xf66396eb2e8e9821L,0x21fbf5f7a701c8ceL },
54758       { 0x7fbb192401732f26L,0x3d0063a944f57696L,0xd6bcb1c3513dd8f7L,
54759         0x1fbb11b2c9f8c033L,0x122f94b17b57b3eaL,0x08edce19d24626c0L } },
54760     /* 59 << 203 */
54761     { { 0x06aa75398c3a1e9cL,0x3512ec3c1a08c7caL,0xfad0dddac5a92e6aL,
54762         0xa98059ee3b9022fdL,0xd67b6723103fbda5L,0xc1df32904762c170L },
54763       { 0xfd99ee58c734f81dL,0xa8de2a4b478b8a4fL,0x9e3ed58fb4b557c6L,
54764         0x14d353c571abd10cL,0x10ea798fe3fd4475L,0x157e16f97627f4d5L } },
54765     /* 60 << 203 */
54766     { { 0x1b5888550b96547fL,0x4539c9c065d1a59dL,0xd6c95fea26e15084L,
54767         0xf84ad9e286b96242L,0x92f57d6d451a5486L,0x0215cfcb06a9e87eL },
54768       { 0xe05b10eaf66e46f3L,0xe7b0e72f655a0642L,0x035032677b117f43L,
54769         0xf5b78105779ea4a1L,0x28ee00faa4adac77L,0x1ea67d716a93a2b1L } },
54770     /* 61 << 203 */
54771     { { 0x4b68a01cd6b3387eL,0xc79582a9e7c4c99aL,0xa4ad6429029fc3bcL,
54772         0xf260ad946b83c7adL,0x81360618b09c3b8eL,0xf66e00ccc661ba2bL },
54773       { 0xd064537de29a69e7L,0xe2764d389bb4095bL,0xa3f57eb0f2efdea7L,
54774         0x72c214f27ed3ac00L,0xf8cfa59de392e32bL,0xa5d995124ad99928L } },
54775     /* 62 << 203 */
54776     { { 0xd069a9971dec038dL,0x64401a3fd0b59bf0L,0x33eff74ce7ec5e85L,
54777         0xfef5a1c50d35b207L,0x731cfc17e766bc43L,0xf994c0d01328b6cbL },
54778       { 0x4f2a5eaa2d3cc024L,0x7f83c57036a6fa14L,0x915a126d65f71dbdL,
54779         0x588fdd68acfb54ebL,0x7de9d37b7f57b2afL,0xca52d27170e071ebL } },
54780     /* 63 << 203 */
54781     { { 0x9b9211ada283322cL,0x30c6fa27b7124c9fL,0xda8f88a7474cbf5fL,
54782         0xc2414ee338203749L,0xe5c65cc26b767731L,0x8bdb52952753781cL },
54783       { 0xc8fe770be051cd30L,0x6370ecc4f046aa97L,0x03c83c1cfa287e66L,
54784         0x935bd2052bccef4dL,0x87b2a49646012036L,0xbce6a91de3e6d6aeL } },
54785     /* 64 << 203 */
54786     { { 0x7be81fb126882c6cL,0xe2d5a251ecd25498L,0xbb3d40e27a8d1678L,
54787         0x1806c67ad520811eL,0xadd4bb6686f65d23L,0x3a62b1b3e20e23d7L },
54788       { 0x208b47006548b3ebL,0x0497f09ab7ec2809L,0xbd3964f8121c37e2L,
54789         0xd35ef301a598efbbL,0xbd76a276c5eef966L,0x64700a7f0af64e46L } },
54790     /* 0 << 210 */
54791     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
54792       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
54793     /* 1 << 210 */
54794     { { 0x169474a2d3812087L,0x9de300da6698ca7aL,0x8589de922ede425bL,
54795         0x50e03fea6df8a890L,0x0d8a5c1c4ba8b8e3L,0xf273aa673fffb91aL },
54796       { 0x21cf054475fc8236L,0x6ceafacf9799c242L,0xc3237eaed0962c81L,
54797         0x43d6ac34213f6004L,0x45e619b2d4148b6bL,0xfafa18b5ea5fb80aL } },
54798     /* 2 << 210 */
54799     { { 0x9a8580aa2f063b51L,0xa83c8ff71c216613L,0xb4da0970be07f781L,
54800         0x0ac2a260712f7b7cL,0xc9b8ee84436a7b97L,0xd758c20d11fb2f62L },
54801       { 0x5daabed9f170b799L,0x018d2fddc46bc387L,0x82d6b5b7d96cfb8eL,
54802         0x4d7d0d9344d9e843L,0xfa2a9ea991e7da3cL,0x8230c1a3d531b253L } },
54803     /* 3 << 210 */
54804     { { 0x82412f525ec31754L,0x42f462c89d32e890L,0x1e7b58cece897ff2L,
54805         0xcfef785241164628L,0x34ee0422d8bb22efL,0x6e0d44ac7d32f01bL },
54806       { 0x968251655a3cc196L,0xa26724dc99eb23d3L,0xdb575fafa75f7252L,
54807         0x778e333062a3e5b1L,0x8689884e84cccc80L,0x9883cd19b645502dL } },
54808     /* 4 << 210 */
54809     { { 0x4cc41f2834220e26L,0xb5937c6da49749c4L,0x705366640fa1ca24L,
54810         0xeeb40f3b91e5edafL,0xcdf98235f1d3de14L,0xa65e5b7eff018c43L },
54811       { 0xaa3228e7acee3a6eL,0xb63a6289e08f4ff1L,0x90e90425650b2daaL,
54812         0xe4a8cad26d875f17L,0xc212029c9ce8a46eL,0xce0512835ed7cfb5L } },
54813     /* 5 << 210 */
54814     { { 0xb0df226159b79436L,0x82bd0dafa195be26L,0xbc99a94b3398c317L,
54815         0xbeb44c903c96ee31L,0x3c39ad81664d2e46L,0x081787520a3e0585L },
54816       { 0x9a054b6b413e269aL,0xbe58891d98c3b62eL,0xe7fa4c4de5734974L,
54817         0x8ac535f4d0a846a8L,0xea0f95f1a651339cL,0xa255274fd96aa239L } },
54818     /* 6 << 210 */
54819     { { 0xe23b7b229534047eL,0xbd70aea83a3bd625L,0xf44b05fe238db60bL,
54820         0x9c46fb140293abcfL,0x12cab5d3bfd8875bL,0x1f38d4aa12dd0c65L },
54821       { 0x4bed41572adf9805L,0x3f87da928a56609dL,0x10b93363da02c903L,
54822         0x7ecc726621ce4786L,0x8ae366851e3da5bfL,0x196040ffd3edee12L } },
54823     /* 7 << 210 */
54824     { { 0x4805841fe81508e8L,0xe2a578d3a4808642L,0x6bbf10accd0b2555L,
54825         0xc5071effaf5cde28L,0x665e75439a7124a9L,0x157c11edc1437981L },
54826       { 0x2019367d7aeddd8bL,0x74a1e104386e3b8aL,0xe72d429bfbe09a42L,
54827         0xaca96fd9061b862eL,0xbb2d2bc8122595f8L,0xc90c6503c509d644L } },
54828     /* 8 << 210 */
54829     { { 0xadb5966fcff05adaL,0x8ed26c025c57284eL,0xa76e73e244693a95L,
54830         0x14da74355982bbd3L,0x46e982cd5d2ca132L,0x8f39074024938e76L },
54831       { 0x749206b30a89b09aL,0x429653c793b4a1e5L,0xbee3d1567025bb7cL,
54832         0xe23f0e1e19555c9eL,0x0dec3837751639baL,0xb36cb84405d43bd0L } },
54833     /* 9 << 210 */
54834     { { 0xae76a96e74f90b6eL,0x5fa8e94824c6789cL,0x2b3584bb03abbb81L,
54835         0xe19ce47c5c451f72L,0x35792fbad619ac7aL,0xfa0282a250059bf4L },
54836       { 0x562bfd14dabe692fL,0x1aaf542c47eeb6c2L,0x392d5bba045d0360L,
54837         0x4e7bb31bd80fe998L,0x08f62ef31111e14dL,0x4de917b04e9ee1b8L } },
54838     /* 10 << 210 */
54839     { { 0x8b9d2d5867166271L,0x658db4ea142bab7cL,0xdf84932fa4ad2849L,
54840         0x04b113355f6f86a7L,0x2de6b29c50cfcea7L,0x46d8f68a9be6a3a3L },
54841       { 0xfb88cda7af0204afL,0x3ece449126029d72L,0x69fef1e23f946dfdL,
54842         0x708532fb01ef7bb5L,0x78d5053deb3795a2L,0x819a63206b36d57bL } },
54843     /* 11 << 210 */
54844     { { 0xca07e0c1e509d19eL,0x6c7e42c39f6281b1L,0x0e2ff43977b66728L,
54845         0x1d740e7880e76251L,0x6bfae4c631a0eb23L,0xd78ca917aa9b0b3bL },
54846       { 0xe140c662991e1781L,0x6e396b5f0dd3cfeeL,0xf0a1d1976ce7f6c7L,
54847         0xbe10f8efd5b01564L,0x865cbd54101a5194L,0xf665885266861dedL } },
54848     /* 12 << 210 */
54849     { { 0xe4e52e865b28f7daL,0xeb43a6809a58683fL,0x73b951bfb49f2b38L,
54850         0x7b6cb7db3f8097cfL,0x9dfb8d0b328fbf05L,0x491635a5ebce6211L },
54851       { 0xa31a152390fdd577L,0x334120df1cd2f39cL,0x1d22834e6b563876L,
54852         0xfd91b30d10ee5a28L,0x3d7a282d59aee4eaL,0x36814c6b73300a76L } },
54853     /* 13 << 210 */
54854     { { 0x7b584add6621c251L,0x98da669d4233aba3L,0x4d652b7933aa2065L,
54855         0x901bcfb8df7b4ed4L,0xb2ce587948012f81L,0xc18e2cd63cb71b88L },
54856       { 0xadb0f2bdff86279dL,0x46d9e5d65bd15866L,0x11b1fb3ec635a4c0L,
54857         0x8bcd0ad201b1006aL,0x0f6f7502cbab210bL,0xd6cc3e560d6b3995L } },
54858     /* 14 << 210 */
54859     { { 0xa54a6420137264c5L,0xa6ef0e78f9c2e45eL,0xba8b5a73d58d850cL,
54860         0xc0209ed86ef6fc3eL,0xe39dd0f391f7518aL,0x74697b8942b3eda6L },
54861       { 0x2dccac36abfc9150L,0x80e4fba298b2f5a5L,0xe0e56fd2771018d5L,
54862         0xa31fd1684c22bb94L,0x8b0998f71a66ef21L,0xed483e55b5a53ddbL } },
54863     /* 15 << 210 */
54864     { { 0x95db1c0ef23978ebL,0x80ad1612f04011f4L,0xe76bd1824d7ae83dL,
54865         0x841d6e668fc3bd60L,0xb68e80796875e2d0L,0xe3965efcd5d9dee7L },
54866       { 0xc488bb7e58930931L,0x52f4de19a907aa24L,0x39aebbdd321cc197L,
54867         0xd2f5b1f967de5c66L,0x60f1a8c28efe3e76L,0xf40604a0af988831L } },
54868     /* 16 << 210 */
54869     { { 0x78b5c14c0acb5935L,0xd9ec715c4311d3beL,0xffa22ab209e1759eL,
54870         0x5a86263db4b2f68cL,0x71e77c516b5be7f4L,0xfb5bea3a19844f6dL },
54871       { 0x2519d0060890ffabL,0x426a03f0f0329ef0L,0x2c6d74a685b3c2a9L,
54872         0x9306f68fc294f449L,0x552e77c22c69fb46L,0x7c7337ad10bb9886L } },
54873     /* 17 << 210 */
54874     { { 0x61f8a505d2b9f25bL,0x1d33aafe4c8645ffL,0x26f3fab7bcd333e5L,
54875         0x8ff4fc51be95e40fL,0x11cd52c6b55bdd5aL,0xf2b4782a22d43de8L },
54876       { 0xfe66e399a4c0e1c4L,0x26c6d7fc17954032L,0x44c700f97f20d2caL,
54877         0xdf67c3927187cdc7L,0xe11a98f9da36414cL,0x0bc5763a04052276L } },
54878     /* 18 << 210 */
54879     { { 0xe75b564bcf95451bL,0xd5ed760cc01aac32L,0xccf14dc5980d2c06L,
54880         0x235b5034ce2a5c0cL,0x64dc86aa05fa6780L,0x1d2ea4877385590dL },
54881       { 0xb18696f636c3174eL,0xf530487b608215b4L,0xa073d0750a123172L,
54882         0x8ca24b5afde8666aL,0xd6dd589a9b716dc1L,0xcab7ea504a721d4aL } },
54883     /* 19 << 210 */
54884     { { 0x34dee42c1592ebceL,0x5b0eba2e417636d3L,0xba178703a97d7356L,
54885         0x16f6119f4123e8cfL,0xd2906a53ef179fa6L,0xac5530606b7ed572L },
54886       { 0x82a25857b600f5c8L,0xb1dc1309973d516aL,0x6d53a967245c6e34L,
54887         0x7ce90bf4f670b879L,0x727ad4129732b6ebL,0xf00fb0054411dfd5L } },
54888     /* 20 << 210 */
54889     { { 0xeba7daad2b14da6fL,0x8274d1a8cee90515L,0x985c18f885bdbc82L,
54890         0x86555ff094d43909L,0xb0b1b2b6539e108bL,0xa4f32c66c0bf1313L },
54891       { 0xbd4777c162080e0bL,0x73039da8dadfb23dL,0x85bc57374a27f1ddL,
54892         0x9a8ae24eeaaa58abL,0x161cb2f5e876fac2L,0x54d457e46636e377L } },
54893     /* 21 << 210 */
54894     { { 0x409b17487bece8c3L,0xee36a1d3b49f5c90L,0x8ed9eb2a619ecefcL,
54895         0xc50a917798ab7bb1L,0x1eb247cceee2ccffL,0x07a9566f084a0f69L },
54896       { 0x59bda805a7cbee61L,0xf588124ca4e7ecd7L,0x0f7d8c3dde5eed54L,
54897         0xd98894ddefcb791fL,0x2fd80439ab309d7dL,0x0c8bf15d3e6cf756L } },
54898     /* 22 << 210 */
54899     { { 0x076a19c70e68a69dL,0x4d01c94b24b3854fL,0x9f38c5eeea8a85b8L,
54900         0xea80422d9a56f9c3L,0x10d9ceec9ad36735L,0x42194df742261173L },
54901       { 0xc7332e70c285d22dL,0xf3a3d4be592ff9b0L,0x2fe712f7f59846abL,
54902         0xd6de5201e4362677L,0x16ce8f1d4f30006bL,0x1f3c324d11dba5edL } },
54903     /* 23 << 210 */
54904     { { 0xa5af9e1c0cb4335cL,0x00a46bc0f3d0dbe5L,0x852a18c99d734817L,
54905         0xc12d54a9986c0102L,0x184b407063ffe60dL,0xe05182437d99d723L },
54906       { 0x8d3886cb20ef7647L,0x7e9c618017b1ce8fL,0x194baf260f176141L,
54907         0x978015d3b4694945L,0x2603be2f1c135e8eL,0xbc0f5e72ba074e0aL } },
54908     /* 24 << 210 */
54909     { { 0x1674b959cfe7bcebL,0x62e1279fe7b66a28L,0x3962a32dc67c3648L,
54910         0x4949617368d720a6L,0x4e81df85a957a5b2L,0x28b5c45753123c0fL },
54911       { 0x5091dd347e239c67L,0x10b9c3f6160ef925L,0x5e7720f52c119dbeL,
54912         0xd584ae76c94d609aL,0x476c63ba86dccd1fL,0x70103a1a32508c6eL } },
54913     /* 25 << 210 */
54914     { { 0x64f4f4ee90a17a16L,0x31165bee7cb22fb7L,0x31da800b924825b0L,
54915         0xc2c169db0551e47cL,0xf9ca5e0e0d583789L,0x5e4fbdb53cd42f2cL },
54916       { 0x6ade1fce1d81000bL,0xa105df391d6603e5L,0xd659094da3139f95L,
54917         0x363a882851d01444L,0x13cd7cbb2dece086L,0xaeea2aa96ab9020aL } },
54918     /* 26 << 210 */
54919     { { 0xdcb31a931081405fL,0x200090dcf1326ecbL,0x773fe49cde99f0ddL,
54920         0xf6a7cb67fac2c511L,0x95c93429b40b014dL,0x967708d4198dd723L },
54921       { 0x74591cc184b90062L,0x2539ef20691d2550L,0x7d7290765a5d86c7L,
54922         0xa81f085475c6fdacL,0x103186d1c0f0d5cfL,0x5ae582e07eb3b8d9L } },
54923     /* 27 << 210 */
54924     { { 0x7df39eb2f9f3456cL,0x1e7ad4587be12020L,0xaee54df11fedfb79L,
54925         0x98f3a0879bf1dfe6L,0xdf958d371d13fb71L,0xa745249717dc809dL },
54926       { 0x9f2ec9dd02d4eb90L,0x9db5686e48b0c7a0L,0x7d064cbf72532eb0L,
54927         0xe204d56593a71a9cL,0x0c912346f1aecdecL,0x894224a3d25d243dL } },
54928     /* 28 << 210 */
54929     { { 0x6bbf77cb5a508291L,0x2af81442d35db82cL,0x357feb1a2b9febf8L,
54930         0x74240a81a25330ceL,0x7a9ab575b4917998L,0xa60288d5eda3ef5cL },
54931       { 0x360410d30aea9569L,0xef66acb5b9bf8c16L,0x7baeb466cc381b57L,
54932         0x024a98b8247a4904L,0x6e70b4c3e3c58130L,0x276e2420ae8a56d2L } },
54933     /* 29 << 210 */
54934     { { 0x3b4a25222c57f1f3L,0xf43d352ba8d1f53bL,0x169fb3cce198b03cL,
54935         0x92172ca923235a6eL,0x90b5953683f996e5L,0x32b1a34cb5ab11a0L },
54936       { 0xb944e4b7b9001351L,0x1084de3d28ab5cb2L,0x60f1dc93c70ec63dL,
54937         0x790e1d496cfa10f9L,0x79bcc2277c3cd865L,0x95007ac24fd31fd0L } },
54938     /* 30 << 210 */
54939     { { 0x6b5d8db5f75e17b5L,0xc5ab42961b45a230L,0x586f097b7486832aL,
54940         0x1ec456c14f289757L,0xd11773bb57b04a20L,0xc84dfacd0821d3dfL },
54941       { 0x580da8cd586e399cL,0x58c1355ae3bbec57L,0x0a476934d594a2e5L,
54942         0x0490ffd537e99427L,0xd41348386a4d8c4eL,0xd62cccb3c83d6e28L } },
54943     /* 31 << 210 */
54944     { { 0xe6071a3d57c9e219L,0x88728c47a93f38dbL,0x0426848b50eb1a01L,
54945         0x9df36972cada9a09L,0xf2ad4a2d4f494ec4L,0xae26577de1f34993L },
54946       { 0x72ec08cde3618d7aL,0xd1fb89013ea90c46L,0x915936173b94f996L,
54947         0x8703357705387745L,0xf1961ff818fd5199L,0x7f0b58d34c2aeed1L } },
54948     /* 32 << 210 */
54949     { { 0x3313a9d544b133d9L,0xdb85c25d2da910ddL,0xc0fdef915e4dd5cdL,
54950         0x902a2a93c565dd67L,0xd8eba4dc7fed05acL,0xd453995ce157dae9L },
54951       { 0xd655d0b3f250cb55L,0x4194a09e86119222L,0x5b7e525a0652872bL,
54952         0xaf7968efe68c0ddbL,0x2ec02930f51cb31cL,0x237f3ae4f2be071eL } },
54953     /* 33 << 210 */
54954     { { 0x696d84910dc943a1L,0x1f24fd7d9fe1d7d5L,0xea38c9e349413ad7L,
54955         0xe223996607c1cecaL,0x62094496ea7bd8dcL,0x9aba5bc7236dd525L },
54956       { 0xa138ed5851631b6fL,0xed724f20902f109aL,0x3ab594cccb28f1e8L,
54957         0x3424213b5916dae7L,0x07e5a6df18479651L,0x4c51f2e1c5b48e29L } },
54958     /* 34 << 210 */
54959     { { 0x6306564b6591a811L,0x734b2619fd463a13L,0xa795d0569d8019d8L,
54960         0x103d85004ffe5858L,0xe1962c31adab8484L,0x326b3351b2015dccL },
54961       { 0x2ad52b852ff36c73L,0x5874652308682fcaL,0xf544e162ea37824eL,
54962         0xd4a6b45ec208ce7cL,0x52d09045d2559ef2L,0xde1dfbbe57ebca65L } },
54963     /* 35 << 210 */
54964     { { 0x3a94aec3bb793f9aL,0xd0af44d4b5352511L,0x1d3f1c130b8930cdL,
54965         0x016cab225a729e0cL,0x092a7c11e31b549aL,0x80c462ed90ebfea4L },
54966       { 0x3dcb9606e5e4ae09L,0xad150903ab59a450L,0x1b58210c6c944727L,
54967         0x26599f6024572a80L,0xfce0ad40c0445075L,0xedca1ada54c4037dL } },
54968     /* 36 << 210 */
54969     { { 0x794593303801b021L,0xb19bb405c9a4cde4L,0xe20091667f9cdee9L,
54970         0x762c684f7636d30eL,0xbf2b29f20c215831L,0x4c0d1b651853fe90L },
54971       { 0x196ccb3157defc94L,0x9f3d66b7f6b9cc44L,0xb2328a0eea439deeL,
54972         0x82b3808d7b140e5bL,0x986210dd88e4a35cL,0x9b171fc838a2b7a7L } },
54973     /* 37 << 210 */
54974     { { 0xdc80e3ae91517233L,0xa219f65dc6f20d29L,0xd348a3d8be093f56L,
54975         0x63c233774d33113bL,0x587fd56257f2ce9bL,0x82cf3e3a4e9061c0L },
54976       { 0x0e41f59bee8dd928L,0x7a5641be8aaef52dL,0xa852a171984ff476L,
54977         0x3c37fd1c047457b6L,0x7f00d665972d4793L,0x29dab0fd97b27966L } },
54978     /* 38 << 210 */
54979     { { 0xb1d119c91e9d07c0L,0x2f973a09432c86afL,0x3505b6f05ded5546L,
54980         0x21814b958687f973L,0xc104d7fad3794ae9L,0x81614d707ea91311L },
54981       { 0xb7f3e6b600677961L,0x53fceb8bc0e6a90dL,0xa3a7485699ed4fb6L,
54982         0x07ad488421d4807bL,0x527b1ae6004e0c03L,0x437f306215146393L } },
54983     /* 39 << 210 */
54984     { { 0x917b4cf463e12603L,0x79e0b7363f838ecdL,0x57de4b3328b4f37eL,
54985         0x3085e4887f58fcfaL,0xb9301c4e958a3bc6L,0xef8d10578b044eddL },
54986       { 0x2123d284d6391459L,0xdfcc2be5e196d765L,0xb58216268184b993L,
54987         0x13e21d03937c6048L,0x39eb3d38460d11fdL,0xf8ef123e5bb23c30L } },
54988     /* 40 << 210 */
54989     { { 0xa6f8b354666eb2f0L,0x7fbf6d91f9c7b16eL,0x9b360814161b5e0bL,
54990         0x13726fbd921511a4L,0x37aa1b8013833a11L,0x53f01183407b9889L },
54991       { 0x8a83ea3fd147da9fL,0x25279241db0ad0b1L,0x78353bccd1a8d9aeL,
54992         0x1e33c10e271f7f0eL,0x136d9e7e9e67adc5L,0x11dcef95cc56ff8dL } },
54993     /* 41 << 210 */
54994     { { 0xae530580d84ba919L,0xac2e43ceb6d3ecd5L,0xf97b1afda4bc6a2dL,
54995         0x180d66d5bdfa96a0L,0x935b8a7d1ca12bf5L,0x1d4409a79e678225L },
54996       { 0xdd85bf4b19a2163cL,0xe34197bcddeeb22bL,0x1e33fc3e1210cde9L,
54997         0xc96212a98b9b5d0aL,0xa3ae81f303e4a12bL,0x531a7148ea262807L } },
54998     /* 42 << 210 */
54999     { { 0xf11ac5fd4ace8006L,0x898a388133c499a5L,0xcf27ab9f1d3368ffL,
55000         0xfb6019606cbd6e54L,0x5373c2a901fb58b6L,0x1489f5037cd1b888L },
55001       { 0xb3f0e0b85a238131L,0xd0e11e6e670858bdL,0x897f1584b65768f8L,
55002         0x9252aa72013b1f2dL,0x185842af0a1a5f8bL,0x49a978373d681a70L } },
55003     /* 43 << 210 */
55004     { { 0x8b65c6d23396eaf3L,0x2191764e50b9392fL,0x7a2363b72dcf6d0aL,
55005         0xa6a52402f0591553L,0xfaba81cd5ff7a071L,0xd6be926ae43e37aeL },
55006       { 0x7b34c578ccaacef2L,0x2bc5d248d5eec9b1L,0x9447aab3014c0048L,
55007         0x767309a3c02d54d0L,0x408c6eee1f92297dL,0xf7ad95f40072a2d4L } },
55008     /* 44 << 210 */
55009     { { 0xd0051ab940ee5098L,0x4861b2461d8311deL,0x6b7796e0f31e860fL,
55010         0xde8b243acfd543e3L,0xef9d0957a0161843L,0x70fd43ecefefcbaeL },
55011       { 0xd47392541931a5a6L,0x42e253300342623aL,0x90b33edd52ffbf5fL,
55012         0x0affda4ca015a550L,0x8716376b77e59672L,0x39d84b33fc0e9448L } },
55013     /* 45 << 210 */
55014     { { 0x71b55e7ea0415173L,0x5d0b5e01b10f3cd5L,0x0c35a1b63e3f9d84L,
55015         0x3c68cb5db794ba37L,0xa73356f0dfd6c999L,0xc59ed0650e5e221aL },
55016       { 0xc59443a90cd7d577L,0xa354296e283015a8L,0x202aee3ba7477107L,
55017         0x59f361392ee80330L,0xc52bdfaae875a886L,0x8ca39d9d07637e97L } },
55018     /* 46 << 210 */
55019     { { 0x95be10b8f3a1611dL,0x6db370f0d1f992c1L,0xb964029de8124b40L,
55020         0x618b26aadfc90473L,0xac65c9916f6d5553L,0x10d5b0f0a0a6fde8L },
55021       { 0x4bff23122d164911L,0x876db39d1f7293b1L,0xa2d3cd549de47789L,
55022         0xd8ca4f6eabc9a28eL,0x0bb3145fca7b5467L,0x4dce66338b37bf62L } },
55023     /* 47 << 210 */
55024     { { 0xcdd8ec4dec1b8d36L,0xf76258d888003e0cL,0x35a114e7262723f9L,
55025         0x12933142abb34bcaL,0xf55b84514c188a3bL,0xa0cfdb2c0ada78b6L },
55026       { 0xaf0b62f6ed36781cL,0x0c619486ea7e1ca1L,0x11fae38689162fc3L,
55027         0xe9bd7ae694828e92L,0x081c3acda84cedb9L,0xb34ceca8787a67e0L } },
55028     /* 48 << 210 */
55029     { { 0xd1b2af2f2bca651bL,0x2211e4f97404bc78L,0x787b1cc8fc5068f2L,
55030         0x73d6da299fcbb3f5L,0x6867fb7707d2142fL,0x36f277ae116ad6bdL },
55031       { 0x81c86073a7534943L,0x67188488c4033c7aL,0x13a8415ccc568123L,
55032         0xbc01db07f3f475deL,0x90b8af2e3aaeee1aL,0x320c4880175fa55bL } },
55033     /* 49 << 210 */
55034     { { 0x263afd7d2fcafc9aL,0x9b0c30ebcc9405d6L,0x713fdd27d6720896L,
55035         0xb07f8ec5f7df4a02L,0x05d62e5147ddd4e1L,0x6278227b8ae3b80aL },
55036       { 0x2ef5c81b0d4ab658L,0xe6ad5925016a434bL,0x6c0e30a2b85d8037L,
55037         0x254830037a9cd869L,0x78da543b2cc48c8aL,0x3a65b54e3edca4dbL } },
55038     /* 50 << 210 */
55039     { { 0xaf2a06c3d54b0072L,0x81621ebfaf0310c5L,0x6bd1fe41a8a7a9ecL,
55040         0x942cf6ba03e74289L,0x2a25f0f59f9822e8L,0x16654b13062edd3eL },
55041       { 0x2345a0b19de373cdL,0x425a59f80c0744acL,0xc6738fe96f0d620aL,
55042         0xaa479ef8ed67c1a9L,0x52540af87765b194L,0x17a3bd3bf2b96455L } },
55043     /* 51 << 210 */
55044     { { 0x5b1a1f075f01e608L,0x3c696f4e87b821c5L,0x4358a5243129700fL,
55045         0xfc9816a14be9d001L,0x905de48166744b96L,0x2ca5f8d8eeda3945L },
55046       { 0xb30eeb1aad207f4eL,0xbd113b2dbc66e6f7L,0x1b6c5c6cebaef81dL,
55047         0x6b3863998bfaf32bL,0x5f9f2a2432a83dffL,0xe8cc190e26ea39d1L } },
55048     /* 52 << 210 */
55049     { { 0x51e05f7d450535fbL,0xa5f5181effbe389fL,0xdf178fffaa2d5514L,
55050         0x89358810e51da035L,0x206e324f664d399cL,0xc148ae74c4477d4eL },
55051       { 0xe0c8d4377d6f38d5L,0x327aad6d8c8133e9L,0xa685a889d21cac4dL,
55052         0x1217c68d0ceb5770L,0xa4a09612d21f1d50L,0xab64b4dd889676afL } },
55053     /* 53 << 210 */
55054     { { 0xf263062aee202007L,0x95e90bbda2359019L,0x57740eb39f34e691L,
55055         0xa5f4fd0f355bef37L,0x484b97fb439f091dL,0x642776fe53ac871dL },
55056       { 0x5c8f9b1e494e0eddL,0xbc62c971ae25a6d7L,0x01981994a7d90290L,
55057         0x3cec43524602cdc1L,0x4bd29f5a14403ae2L,0xafaef08b921328d2L } },
55058     /* 54 << 210 */
55059     { { 0xd33e754a53ef149dL,0x82243def548034e6L,0x99c29a9b23ea2dcfL,
55060         0x724e4b5d214848afL,0xe43d4438dcf85b9aL,0xaf7241ea9d7b20dfL },
55061       { 0x60a10c30069edb1bL,0x1aaddd5e9874f484L,0xfc784ac073085538L,
55062         0xc998afe54d69703aL,0xb71f6fd7bf52139fL,0x28f994c46a45b089L } },
55063     /* 55 << 210 */
55064     { { 0x85084ec2eebd9e0bL,0x73e489c6cb9f1929L,0x91e47fd7ebe10e55L,
55065         0xeed6a3a1486a2704L,0xf63deae7e124d6e2L,0xca958204b48b3834L },
55066       { 0xe69cb5bb13185b44L,0x56be0e05868d97d0L,0xc48cb1e50181e64dL,
55067         0xfaa012ddfc7827cdL,0xf535b1c83488352fL,0xd1cce04e9fbf42d4L } },
55068     /* 56 << 210 */
55069     { { 0xa54436b6ba3403ffL,0x1fe4b1ecdcbc4822L,0xb3b351004c6846e2L,
55070         0x360278048d1cac7cL,0x9eff87327e86d5d1L,0x7f435326ba21993aL },
55071       { 0xb51a9da5adc24224L,0x111c19fcc8c14a71L,0x05aa2c86ab77e011L,
55072         0x81edc338ce72744dL,0x20fa8f528d882bc3L,0xc61c3e639d1696f3L } },
55073     /* 57 << 210 */
55074     { { 0xa66674ca0f41637cL,0xa01d08ac418487daL,0x2ce4258b6b593194L,
55075         0xd755220645024db4L,0xffb3366f626732ceL,0x802878f370ba2f1aL },
55076       { 0x80a3f41659b77372L,0xfbb411631a04b19cL,0x7d575112a346d265L,
55077         0x6c30421ffff87d4fL,0x1b62b93fdcb05f02L,0x98ba4397b72649e3L } },
55078     /* 58 << 210 */
55079     { { 0xcca45c1d135a7eb5L,0x2623e629b048126bL,0xada7326e926980f0L,
55080         0x64f334c276bf796eL,0xf0751596b4a562a8L,0x0baa14486f9d0079L },
55081       { 0x6c394aa32205ea70L,0x635b9d2d556172e9L,0xf418fe0cfd37b53bL,
55082         0xcf5fe2ac56b9791cL,0x9d855e67911c68ddL,0x9e40f75f734b57d8L } },
55083     /* 59 << 210 */
55084     { { 0x32c42482b5b8f846L,0xdefec599b61cc3cfL,0x4c3460996506a9b5L,
55085         0x0d9475a0263a6142L,0x1753cd92c80a6713L,0xc015412f420cf67eL },
55086       { 0x1c33f01b6a88d12bL,0xa49f038ef522f7d0L,0x232343decd25f260L,
55087         0x479bc742d6a833c3L,0x2f2ab294cee07b83L,0x02e69a143dec38b3L } },
55088     /* 60 << 210 */
55089     { { 0xbf7fea3aee1fee16L,0x31fb342ce0cde85bL,0x9a232ea51575924bL,
55090         0xc3132e6cbcc4cf26L,0xbc5b7a7102499a58L,0x3064a3b904d99836L },
55091       { 0x6f17475ff8b3bad1L,0xaeeb90c429271790L,0x7f442a13f8eca53dL,
55092         0x6d641eea08882274L,0x8dff43bf88ffaebaL,0xaa92827f5840b198L } },
55093     /* 61 << 210 */
55094     { { 0xf5ce3fca26d803acL,0x6927ddd9d4e1b6b5L,0xb509b5c609f48bc0L,
55095         0x2bc5d1749e35975aL,0xfba3024af570c98bL,0xeba15980aa27d6b0L },
55096       { 0x95abc07290abd2daL,0xd0e30e99232035cfL,0x3dc4e1bcd3f0ecb1L,
55097         0xa5a8c6e556de9d17L,0x878c7403ab73bd18L,0x5cce39260c474b0aL } },
55098     /* 62 << 210 */
55099     { { 0x86a3f001e93b6ee6L,0xa28984474fb3203aL,0xbca0d71e9b3550adL,
55100         0xc225759d0396d796L,0x208b9a02cbd949d8L,0x15b21ec9a550d2ddL },
55101       { 0x64aaed6a2a7dcffaL,0xb8cc7575ed5b6b47L,0x2b4a3aff022dbce3L,
55102         0xe85d690b86f51861L,0xe26a6c3d578f4d5fL,0x706d770a70e7ae76L } },
55103     /* 63 << 210 */
55104     { { 0x822467eb579c91a6L,0xe98a471531599272L,0x7baf0e9f1078d497L,
55105         0xd13f270e25fe439cL,0xae9d58adc0d95395L,0xc3beb60827693037L },
55106       { 0x4d9c4cf397f797e5L,0x4e26167db26d2e9dL,0x06092d5e86a167efL,
55107         0x9827a21128dceb29L,0x30423344552a55ccL,0xae07b37f3fa437afL } },
55108     /* 64 << 210 */
55109     { { 0x9b23ab4e94d0864fL,0x46356266009c9fc1L,0xdbe99e51e798edf9L,
55110         0x38547449307675c7L,0x23ffaf55628c0fb6L,0x56ccd2a31698c372L },
55111       { 0x39f45a578347ce95L,0xe0aaec744f2c6118L,0x2a89079e4af138fcL,
55112         0xb86371ea2ee4ecc0L,0x076d256a06bbf92fL,0x9073adb8ae3c4c51L } },
55113     /* 0 << 217 */
55114     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
55115       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
55116     /* 1 << 217 */
55117     { { 0xba2e9543743c15d9L,0x7d5812db1c99c984L,0xf94db95145bdc19eL,
55118         0x951d00ae382e77bdL,0x9940a5fbb220b29aL,0x6908d50e58fc91f1L },
55119       { 0x682e42eadd0940feL,0x2124e23aa1d32009L,0xbe15810016294d05L,
55120         0xaea13fe32e326d68L,0xc0dfe1ef15e64fceL,0x32dbc0b5b8237a8aL } },
55121     /* 2 << 217 */
55122     { { 0x6ee65a08c36d3f25L,0x7b6c811fe393e4d4L,0xc4a2cc382876e523L,
55123         0xab7aba26d3bf53aaL,0x5bf00871db7f290cL,0x3cb1cd131ee6d5bdL },
55124       { 0x4cafb218de998adaL,0xa1ecf36af6319101L,0xa1fe785520b281ccL,
55125         0xe457198e64d9c65eL,0xa3d1a6d0c5a0e67bL,0x69ddbc3290cc468aL } },
55126     /* 3 << 217 */
55127     { { 0xd4ee3f7f6dadc46fL,0xa1f3dc925d7febd6L,0x4c0bee1363ebab5bL,
55128         0x70e32d77005ec237L,0x302fc73dc52fb006L,0x1af84c0a8f159899L },
55129       { 0x42a5478f0686232aL,0xb4fc56348a308687L,0x042c4970c8378f0dL,
55130         0x70c195758e2c86c5L,0x61a95e6884c7c767L,0xd96a8216d6fb43a8L } },
55131     /* 4 << 217 */
55132     { { 0x0c62fd2d543c1255L,0x71ea9c6fef361a27L,0x76b0933dcef3f9e3L,
55133         0x51b1ec2d9889ffa2L,0x9e84b2ba9a3c88d2L,0xc8996b961913e52fL },
55134       { 0xbafc5e94cee43e36L,0xd9898d2470c658b7L,0x4e9bcc41bed17108L,
55135         0x0db5b7336c7a41c8L,0xd4be07a7795369cdL,0xb899f92f7bd3a934L } },
55136     /* 5 << 217 */
55137     { { 0x1fffcbc010e15fafL,0x8447bdb8910245acL,0x857d521e86476901L,
55138         0xcd1d5f87369ccfe9L,0x560b3277b3f1dbf1L,0x4ac02a1a47ea4266L },
55139       { 0x29ac98b6a8a929eeL,0x020ec6db5e5e70c0L,0xb0be38ba21291be6L,
55140         0xcbe9d362bdba40deL,0xc585450571535a89L,0xc21839de3d7a3235L } },
55141     /* 6 << 217 */
55142     { { 0x831541b39805497aL,0x2ceb5ac879c414cbL,0x86601fa616d2eb82L,
55143         0x373d19079338ce8eL,0x98151a90c1f5c87aL,0x966ebde6048a538cL },
55144       { 0x5c4a8c5ae180ff7cL,0x6d9065dff996d994L,0x4e0dd86e2460ab91L,
55145         0xfbe8b3ff309a8f5eL,0x33d7cb35856f7218L,0x62b2200a1ac59f2aL } },
55146     /* 7 << 217 */
55147     { { 0xb36ad750a460e53fL,0x727006d60df0f7b0L,0x6ca3ac348ee96a11L,
55148         0xb04f6ae930e75d1bL,0x9957738a3a24e9eeL,0xc0117a7d16521e18L },
55149       { 0x79fcea8872ad7e27L,0xcbe2c2d37281e3b5L,0x31915f1cc391fc60L,
55150         0x1c1c0082a13a92e1L,0x362663cc7ddca7acL,0x8021aad689689d35L } },
55151     /* 8 << 217 */
55152     { { 0x3f2eff53de1e4e55L,0x6b749943e4d3ecc4L,0xaf10b18a0dde190dL,
55153         0xf491b98da26b0409L,0x66080782a2b1d944L,0x59277dc697e8c541L },
55154       { 0xfdbfc5f6006f18aaL,0x435d165bfadd8be1L,0x8e5d263857645ef4L,
55155         0x31bcfda6a0258363L,0xf5330ab8d35d2503L,0xb71369f0c7cab285L } },
55156     /* 9 << 217 */
55157     { { 0xc19db6f05890e1cbL,0xc21587edfcac8d05L,0xa9e88798d86730edL,
55158         0xee3e6ee2c27441cfL,0xadb2c63ea23af57fL,0xb524b7da29ff5977L },
55159       { 0xab1ed847d3e4739dL,0x6592a0131cbfb581L,0x1f519c6ea1798195L,
55160         0xfe837a814c324a4dL,0x74fec4a85c813abcL,0x7b3b5351dce539b0L } },
55161     /* 10 << 217 */
55162     { { 0xb886a0c50c99e321L,0x4063d19576e924e9L,0xc03cca041a659dcbL,
55163         0x1e01abbc1bd3dab0L,0x9d7cf04fe9141cd8L,0x5f87dfa73ef58d85L },
55164       { 0xa579e76388d764b8L,0x381dec6a74b9e5b3L,0x354221f99a4c9a67L,
55165         0x8c2556d33f529346L,0xced3642bb4349eb7L,0x1527cec7fef5c92cL } },
55166     /* 11 << 217 */
55167     { { 0xf2e42ef7785ecd51L,0xca3438cf33d9c0d2L,0xeef9ec08c1c097f3L,
55168         0x9e438fa746682aa7L,0x53d0144531a7eefbL,0x04431241e6998a0bL },
55169       { 0x2c1bb2bd55bc7febL,0xed99e7afb44d4943L,0x7f37bc4a3c77d21eL,
55170         0x866c0978398e3997L,0xed7462305bde12b8L,0x24796f7c7194fd1fL } },
55171     /* 12 << 217 */
55172     { { 0x7e4450cd5e83d570L,0x0113cab242b394e7L,0xdf4062a08ee24413L,
55173         0xf8a0fd4931227510L,0x06b798f4b80f0d23L,0x33f17673b72bffa8L },
55174       { 0x4638602b5de9f490L,0xbe3a65834d905654L,0x446e0afaf406772cL,
55175         0xef68dfd7b4ec908aL,0xa6be004966ab5ebfL,0x56049360ff376531L } },
55176     /* 13 << 217 */
55177     { { 0xb47202b760b6ce82L,0x8129c1befe05e9faL,0xcb70cbdde861de07L,
55178         0xcf35fbc5af16b6d9L,0x60071beec9916116L,0x3aaa496ed057e63cL },
55179       { 0x1cb0bb12c356f065L,0x12dccccef4de0d26L,0xe3f59cf67ccc0d48L,
55180         0xd66f10b3d9569e26L,0x95f4d7e79d1853ccL,0x10313dfdbf651d5aL } },
55181     /* 14 << 217 */
55182     { { 0x779b55062a3d9774L,0x3785db08e0554291L,0x9b3a4eb8546c69dcL,
55183         0xfe36824dd22d8fc8L,0x037d9ac9471132a1L,0xc895e332a01e1c28L },
55184       { 0xe535ede71b5e2845L,0xdc90cd7c568743deL,0x3292b40b4691d367L,
55185         0x911fad21b4f16a4bL,0xb3c5f0eb455d018dL,0x2eb2def669033748L } },
55186     /* 15 << 217 */
55187     { { 0xfd1297a4307aa8fbL,0x021f242177952146L,0x17cc2d6f0ba72feeL,
55188         0xa265095d01a3a733L,0x2e12c2e7a07d5f8bL,0x27bb60341202224cL },
55189       { 0xb58b3fab8185dc12L,0x83467b977700f166L,0x98242e227ff9e1ccL,
55190         0x96b2a4d9f4b28f1dL,0x64113c3865ed82eaL,0x7dc9ab732ee160e8L } },
55191     /* 16 << 217 */
55192     { { 0xf16938f514c5969bL,0xde2e3cf0944b2271L,0x2d5095530b6490d6L,
55193         0x8432fef1a28a296aL,0x6f254dd08d26415cL,0x3780eeadd50c2865L },
55194       { 0x4f5bc455665b8794L,0xef31fb9e56cb7018L,0xbab8dd6e65e59340L,
55195         0x676baca2a56dc2eaL,0x38eea06beaa90e05L,0x26e64224174bada0L } },
55196     /* 17 << 217 */
55197     { { 0x309e9fbe109cdb79L,0xc2ed3566977d0e4eL,0x2891f30be6b944aeL,
55198         0x514bd4cf5022e070L,0xae9a22a98726a661L,0x1114a0c8c1916b06L },
55199       { 0xe1b4f8339795adecL,0xcc0f3824ed4dbf8cL,0x432c93c878096a66L,
55200         0xb9450e9da7d2ad83L,0x294b0c192c1e35ebL,0x791427038be5a953L } },
55201     /* 18 << 217 */
55202     { { 0x4d215132881faf35L,0x52171a5ceec736a8L,0x4788813e1ba561d5L,
55203         0x9ca022a7d35e399cL,0xbfcaab926c4b8d7eL,0xde62b2c007c7ec40L },
55204       { 0x7b46c2d96bb54e10L,0x2ce02e5a7d31e85aL,0xb757b699cd776c12L,
55205         0x08f122552c81b71bL,0xaca91e058aa6b02aL,0x35cf7bd37209279dL } },
55206     /* 19 << 217 */
55207     { { 0x24b5bc7086a04b9aL,0xd4d4c640612e0fbcL,0xb19ea7fcf732589aL,
55208         0xa18b6f4081fc63cbL,0xddd7211d84d88fe2L,0x7e8db6f72963130cL },
55209       { 0x8772908c500c491fL,0xa3bf747783fd8a41L,0xca54d0d34e3e9fe9L,
55210         0x9969471866b030d5L,0xc2f5fb98b1fd6736L,0x58d5a851d103fa45L } },
55211     /* 20 << 217 */
55212     { { 0xe4c16fcda97a5decL,0xcc4333092f1dd4b8L,0x8cac9da985d334dcL,
55213         0xb4deff204cda5a0cL,0x59eea4c9be70b1b9L,0x161e73a2ec5b7b58L },
55214       { 0x584c5e098b7fb4a6L,0x697fb795a3f7dd08L,0xc9e15f754bd4ba2cL,
55215         0x66d04f47c83df783L,0x0c03c2452efedf63L,0xa76a08c94a87dbb4L } },
55216     /* 21 << 217 */
55217     { { 0xde4e18c2da669a50L,0x0629350a480fb520L,0x84b3e68b7cac0748L,
55218         0xab718a12da3e1e9eL,0x3f5c5489cc26aed3L,0x81c6b6d42a57ab3bL },
55219       { 0xc4ded8ce15d23825L,0x2d753e6a20c6eb43L,0xbaa120ec555f3a83L,
55220         0xc72f9d3877e93abaL,0x4ce297d0373317cfL,0xf42b3e954845bc1fL } },
55221     /* 22 << 217 */
55222     { { 0xbf162c19d7480e46L,0xa7f45ea76403bf0fL,0x250e936c6c51cef8L,
55223         0x97ba086f1cd24b64L,0x271a22364cfb2889L,0x2685c98804dc4b48L },
55224       { 0x843bb75ac877f6a1L,0xe10cd5c799d5c7bcL,0xbe65eea1db60606aL,
55225         0x9019a9a7a10d0d74L,0x5614c0b987c62e5eL,0xaab2308d38240d05L } },
55226     /* 23 << 217 */
55227     { { 0xc908c6929a772e03L,0x73441df703928ce9L,0x36141b5bcf111c12L,
55228         0xf6b9e2f16c7c3e5dL,0x1f245a77722c5b57L,0x07e3f364635f65e0L },
55229       { 0x1aab7abf272597d8L,0x03954428d4fe8e71L,0x7dd58036ecae1b5cL,
55230         0x9b97c2f28c85b0f0L,0x68ed3dc6ace011e9L,0x8e4ab5ca1744a774L } },
55231     /* 24 << 217 */
55232     { { 0xe6a19dcc40acc5a8L,0x1c3a1ff1dbc6dbf8L,0xb4d89b9fc6455613L,
55233         0x6cb0fe44a7390d0eL,0xade197a459ea135aL,0xda6aa86520680982L },
55234       { 0x03db9be95a442c1bL,0x221a2d732bfb93f2L,0x44dee8d4753c196cL,
55235         0x59adcc700b7c6ff5L,0xc6260ec24ca1b142L,0x4c3cb5c646cbd4f2L } },
55236     /* 25 << 217 */
55237     { { 0x37daf7fd5a96d915L,0x1bba82e6d16a1332L,0x7558b642ce1135d0L,
55238         0xc9fcd6ce3abc5915L,0xc3762a20b93ad4d3L,0xef0cdb45e4e74f82L },
55239       { 0x809b91dcd26fbab6L,0x1264f72ea9b53697L,0x264699ffd7c827f1L,
55240         0x16d4f094d8c4976fL,0x244c90cd997df2caL,0x58eb3b1c76f77b3cL } },
55241     /* 26 << 217 */
55242     { { 0xb99e2dde1ed04268L,0x94247d202497b83fL,0x0c6c21d1fb833507L,
55243         0xa01e682fafab9c39L,0x4938108f4d84c3d5L,0x70b68c75347652d1L },
55244       { 0x458e814740e17747L,0xca752a14c3f8bb03L,0xaa537b4d8598d044L,
55245         0xeec3febb7ff102e0L,0x10ef3cad247fe4baL,0xe4de5b1b5673ac39L } },
55246     /* 27 << 217 */
55247     { { 0xbca2931378d0bb1aL,0xfcc237068e5c3fe4L,0x0f9d6b11dd0d67a3L,
55248         0x9aec22faae14bbd8L,0x75f8d86e5bda7184L,0x6bcad95759aeb4c1L },
55249       { 0xbb1224a5990a9309L,0x00edc04ef7193f45L,0x870c1647c17cbff7L,
55250         0x9855513c65031caeL,0xe5a2e2ded852b607L,0x540a4141e5671e25L } },
55251     /* 28 << 217 */
55252     { { 0xfb0e2f2e4d5efff4L,0xbf3b96e73a143fd6L,0xa18a037f18579946L,
55253         0xae02fd4ce48c8a51L,0x1cb139288745c177L,0x4991594a28c47832L },
55254       { 0xdce3b1d2fd51c1a2L,0x4e707213314cb09dL,0x5312de95ee323449L,
55255         0x4925c4e789389866L,0x2438fd9e28ca17acL,0x58fd2aad872dc0acL } },
55256     /* 29 << 217 */
55257     { { 0x75bcf0ef54ddedaeL,0x3cc75fc6f9077493L,0xc91b78df60f6b874L,
55258         0x7687a1d0622634c1L,0x57fdef4f82cabf32L,0x544819218e2671e5L },
55259       { 0x526cbb27a3c37afbL,0xe0db88340d1aec76L,0xa034badb73cdef1cL,
55260         0x165cdfad6281f26bL,0x5c90d4d1ce24a71aL,0xc404af1125f297a7L } },
55261     /* 30 << 217 */
55262     { { 0x6b21a0ea2fd5df44L,0x2da8dc6cb36e5b1dL,0xa683e08ac3688655L,
55263         0xfc5fbad3454bf878L,0x9d2fb9f12f73b749L,0x4612cf42f920b37dL },
55264       { 0x23da6b697035794dL,0x2763828adff7c198L,0xd320660522dd7eedL,
55265         0x6829994cd1316e68L,0xd732bc8f62831ed9L,0x69c6972c9303d789L } },
55266     /* 31 << 217 */
55267     { { 0xf5901854b0dcc28aL,0x81c92c1fcd18e579L,0x91a412ebc4b8e1cdL,
55268         0x35f00725891d6ab8L,0x10d6bad8ad7aa63dL,0x8cda809d09df2b47L },
55269       { 0xe856cfbfa489c233L,0x7ea921addf1ecf5aL,0x884cc717fd724c37L,
55270         0xe278f2457377136bL,0x240b142d9f3dc9ecL,0x80a384961139a645L } },
55271     /* 32 << 217 */
55272     { { 0xa35e411c2cb40964L,0xdd7d4f4cc331a3d6L,0x7c7c859e89a66f2bL,
55273         0x9908c37e0def8ecdL,0x8274124e344947b7L,0x0d279f7b568b0ce8L },
55274       { 0xe5291961866091ecL,0xb056e3bf3a08acc7L,0x60fb39e156bd3a7dL,
55275         0xe56a34d6268f8562L,0xb3a1fe1613fd8293L,0x6a41e1a967537fcbL } },
55276     /* 33 << 217 */
55277     { { 0x95c2bbfe021fc932L,0xc7e3399db2af7e0cL,0x1224bf06122670f7L,
55278         0xc9e4513ffcc1fe85L,0x8c82371ddb50fa7eL,0x017c5498bb76e4b5L },
55279       { 0x5467926c7fa89f61L,0xa4a65606f3a1204cL,0x22133acfa64b2e59L,
55280         0xab7896bce1247662L,0x75d35fb661780c9eL,0x99199644a91b33faL } },
55281     /* 34 << 217 */
55282     { { 0xf799c4638471104eL,0x43c122dd8b91c351L,0x9db6498616dc06f7L,
55283         0xf7e534410ebcf250L,0xa702c0f18373f9bbL,0x6ed8d39a1024e14eL },
55284       { 0x92913e436cabd9c4L,0xba906ef40dde6283L,0x06835e914a3972d8L,
55285         0xfbba3c7dfd99c4feL,0xf843e6f1b950909aL,0x7ec9866df5160b4eL } },
55286     /* 35 << 217 */
55287     { { 0x68f75bab06722bd4L,0xdeca718813066eeeL,0x4d658fa11152b8c6L,
55288         0xfae01e657257c9e2L,0x999445f923e4189cL,0x2cbe272cef6f0b1aL },
55289       { 0x5f60d9d735fff303L,0x4ca7a54696235360L,0xf506201598758f1fL,
55290         0xba81e7ad1dbaecbfL,0xd326e063c687425dL,0x8c46fa4b193484c5L } },
55291     /* 36 << 217 */
55292     { { 0xa97149cf3c1f5f12L,0x17b04a3d143d72b6L,0x174195ff17449a22L,
55293         0x851803960b136adfL,0x8d87d21f9a7adb22L,0xf9c9fc85a8f46d49L },
55294       { 0x7839f453a7ed1b7dL,0xe19d80ace9067ba5L,0xc387a6a0e41b8d6eL,
55295         0xd11611e1241d287aL,0x2561ed02636240beL,0x3bd8c57df0fba033L } },
55296     /* 37 << 217 */
55297     { { 0x7b5caacd3ea8ec1cL,0x221770e944624802L,0xafb1a4df5a32468aL,
55298         0xdec20eb62e295525L,0xe1cd4fb9e309c92dL,0x0331b9c0e7256005L },
55299       { 0x987d4c55246f2fddL,0xa392d27367f70f8fL,0xccba11994e214e5fL,
55300         0x789f0e4c9943562cL,0xf502ec237235c86bL,0x67403523987746d6L } },
55301     /* 38 << 217 */
55302     { { 0xdd02ced216c97e7cL,0x578d6912dc3347baL,0x760260da2134e993L,
55303         0xf96643dff34fb26aL,0xec214b767ea3285dL,0x19b135d4117733d1L },
55304       { 0x29a0e0636b037168L,0xb5df2bb95d1285eaL,0x5a2d3297796f0cc4L,
55305         0xfcee639f2090e0b9L,0xba11e8a4d93c091dL,0x5b6fc501492250e5L } },
55306     /* 39 << 217 */
55307     { { 0x6019d207263929d8L,0x9821d6e81f164aa2L,0x8f1b33f8d4924236L,
55308         0x389e482fb72de1b1L,0x398785a862554c10L,0xed31cf8408469265L },
55309       { 0xf9b99e158a09f334L,0x9ddfd4eba83df391L,0x28a5cdf4caa4f7d5L,
55310         0x32b9e3c68f68fd49L,0xbce64b93b6f52209L,0x72649c6fea7c4bdfL } },
55311     /* 40 << 217 */
55312     { { 0x8a15d6fea417111fL,0xfe4a16bd71d93fccL,0x7a7ee38c55bbe732L,
55313         0xeff146a51ff94a9dL,0xe572d13edd585ab5L,0xd879790e06491a5dL },
55314       { 0x9c84e1c52a58cb2eL,0xd79d13746c938630L,0xdb12cd9b385f06c7L,
55315         0x0c93eb977a7759c3L,0xf1f5b0fe683bd706L,0x541e4f7285ec3d50L } },
55316     /* 41 << 217 */
55317     { { 0x73bc200cfdd5504eL,0x73322fbf3825b0c3L,0xbf8bf1edd35c24d2L,
55318         0x54eba9f52e2bc29eL,0x80ffb5fff3aa841bL,0xbc676f62cc188be9L },
55319       { 0x2e2f79290383f0dcL,0x886c647e0d42059bL,0x673f0ea113eb7019L,
55320         0x630da63f3f9cd771L,0x2597592b3a0a42b2L,0xfd21fb21b83b8673L } },
55321     /* 42 << 217 */
55322     { { 0xd39ebb9fd2b34df5L,0x622bd0c3db873666L,0x546cc7f77b52738fL,
55323         0x0323cdd1c156c52eL,0x78b00818b5950f19L,0x8065a86a562bec17L },
55324       { 0x0b42eb1427ca5a49L,0x1791eaf1a457ac04L,0x3a2c93a6b2631402L,
55325         0x28b9cd6fcacec5dcL,0x6a0a8826d4535a3dL,0xeb08a884a83fcdcbL } },
55326     /* 43 << 217 */
55327     { { 0x16bae8925a940b6dL,0xfec394c1789562f0L,0x54349605ea412ea1L,
55328         0xccd57783cd18e2cbL,0x394bea1a1c813e61L,0xf11c566ff249dd67L },
55329       { 0x2cd679c112207f37L,0x7780918e83d16012L,0xe8bdbef4646c9987L,
55330         0x6e1882e5082dbbffL,0x811dd74777abe4acL,0x5bbbb740668380adL } },
55331     /* 44 << 217 */
55332     { { 0x0969263a7321c39dL,0xbd13b28bab7aefcaL,0x10e431f205377165L,
55333         0xbbb2a7d009442c57L,0xf935bc2d9cd156b7L,0x66c3d55e42406686L },
55334       { 0x4c529b76d20bdc50L,0x112e0f004d1c9f24L,0x414f1c65ed38dbc3L,
55335         0x63ade49c4eea65caL,0xbefd8af5fab697e8L,0x727bd3b45cc3b209L } },
55336     /* 45 << 217 */
55337     { { 0xb89d450a957925f4L,0xcb39b69c6e1e60f3L,0x55396e61ae3fffa3L,
55338         0xe89d97962986fdceL,0x5521d6b787fcd037L,0x6c20b2b0ec718024L },
55339       { 0xb1e0964bad6529c9L,0xe1bdaba3bc38493bL,0x6a9cf9d6f19b4690L,
55340         0xa2d035f7054466dcL,0x37df7fc07fa65c9fL,0x045b0b36106ef822L } },
55341     /* 46 << 217 */
55342     { { 0xe4fc833eda5c9577L,0x22afb5addfbbca7cL,0x215de02eb902e8d9L,
55343         0x215e4c900f1a6cb5L,0xf6d7e4a9d59e146cL,0xcd0c6c6e4912eb8cL },
55344       { 0xe0616976eae22897L,0xe2279d9f5d809d19L,0x2da1b7b3e282b2e5L,
55345         0x19327068ebf058b7L,0x9b23df0f5934492eL,0xabeb464fb1752d68L } },
55346     /* 47 << 217 */
55347     { { 0x6e754efc00d03f9bL,0x64aed0bd38b94393L,0x9d084ba16df2f6dfL,
55348         0xfe383a56c6abe8f3L,0xd23c6ca2bc7bac13L,0xde8ef161e326b691L },
55349       { 0xbb4e853342f96925L,0x1391974f6601dc73L,0x3a545ffb700480cdL,
55350         0x4d379c538884e214L,0x0fe40f66f713e900L,0xc7f202cbfff783ffL } },
55351     /* 48 << 217 */
55352     { { 0x89e48d8bc6bb5e5fL,0x0880ede01ea95a10L,0x60f033d7302c0daaL,
55353         0x15e4578a048eefe3L,0xfd6dec89b0a72244L,0x1f7cd75e309489cdL },
55354       { 0x7cdcc2a0e9aba7fdL,0xd18dc5c7f28ba00fL,0xa6300a455812b55fL,
55355         0x8fa5c4152ca31d8cL,0x36aa3c234f3a5b5aL,0xd128739ec86cf4e0L } },
55356     /* 49 << 217 */
55357     { { 0x7ac4712f660598aaL,0xe3f00c28aaba6261L,0xb71ac42e1a9b639bL,
55358         0x19674c28f69958d0L,0x3983abfec4e5c60fL,0x67f4583a5de58f9fL },
55359       { 0x83e0bbbaf7278c06L,0xd1883aaa19c5f96bL,0x8ec0f2848b3128afL,
55360         0xc88e07f49166e04cL,0xa515a9e44e3995c9L,0x0680a306b757ec2bL } },
55361     /* 50 << 217 */
55362     { { 0x5673b61e6d6f3aedL,0xcd1275e29524fd2dL,0xa8844f08cde12134L,
55363         0xeca3eb27b8366e0cL,0x5ce49d498bbe04b4L,0x0b7ab7a02882b056L },
55364       { 0x12fddcb840fee142L,0x99b7920b2895df5fL,0x35dd8d5a5829bb19L,
55365         0x271c6a4c46ee8dfbL,0xae09ba7536b594e4L,0x45502d0e1ae12c22L } },
55366     /* 51 << 217 */
55367     { { 0xa9e1b19ad95e0110L,0x6a419f8b2383280dL,0x6c35e8e16eb602a6L,
55368         0x966e0f44d71beeeeL,0xfc5cbdc0c8915585L,0xdce1c36583133b89L },
55369       { 0x3fbdd24289e6a35cL,0x8cd24d1760ff9dc3L,0xb9708c2729dd493fL,
55370         0xabbf39803cf807caL,0x62689ffe5410c80aL,0xf133928be8b31d13L } },
55371     /* 52 << 217 */
55372     { { 0x3645a1910d4bfc83L,0xa564ac85f2114b63L,0xf0647034cc6d9314L,
55373         0xb58e96d331d80285L,0x8b8222d9e269c964L,0xdee12adcd204b214L },
55374       { 0x82d2bfbae1d0a6e6L,0x4fd69d2e9da964eaL,0x1605d9e3200b3ac0L,
55375         0x5ab2886266d133eeL,0x938411c9f72f5353L,0x9fcdcb3a7d40dee7L } },
55376     /* 53 << 217 */
55377     { { 0xd65c1d6c501eb835L,0x37374dd14a0e5861L,0xa13f1070505f1fdeL,
55378         0xedd76943d1351805L,0x0f9501953673091dL,0x0dec24e308aa62f2L },
55379       { 0xec4962e7f50efefeL,0x0acccbdc9d227293L,0xc6c95d29d84fd828L,
55380         0xa4b214c540578ca4L,0x06963d3ba4d41991L,0xeb8c14c2fde0034cL } },
55381     /* 54 << 217 */
55382     { { 0x3d46a2317460e00fL,0xedce1c7dacce513cL,0x3d7b6f388cfdce74L,
55383         0x870082baacfa61deL,0xa86efef862ff847dL,0xc146218368c11d11L },
55384       { 0xb296eede9d21be2aL,0x9dc54e9e761451cfL,0xed1bb1fd53107f7bL,
55385         0x41f9efdb676bfbe4L,0xcdf43b904feb9a1eL,0xe81fcb6409d98782L } },
55386     /* 55 << 217 */
55387     { { 0x00639fa8642789c3L,0xf8e893a03c101e43L,0xc55439302730e33bL,
55388         0xe2967d30460970e2L,0xb33f1976ceacc128L,0x9bb0f896235e8c4cL },
55389       { 0x523f7bbb2fbbbc97L,0x127728a5dab215c1L,0x95dd23ca7ed6ab74L,
55390         0x69f1219feacf4ba8L,0x5ed12355e875dd6fL,0x7aa732dc95565bdeL } },
55391     /* 56 << 217 */
55392     { { 0x9a0e153581833608L,0x5cce871e6e2833acL,0xc17059eafb29777cL,
55393         0x7e40e5fae354cafdL,0x9cf594054d07c371L,0x64ce36b2a71c3945L },
55394       { 0x69309e9656caf487L,0x3d719e9f1ae3454bL,0xf2164070e25823b6L,
55395         0xead851bd0bc27359L,0x3d21bfe8b0925094L,0xa783b1e934a97f4eL } },
55396     /* 57 << 217 */
55397     { { 0x0a700190a5e41f7bL,0x2173e68dae9045b6L,0x28e9ac53f1669974L,
55398         0xcb00ff99d4b9fd98L,0x09c7b907ebe90d1bL,0xbf401f20385744c1L },
55399       { 0x0bb7ea7ae1292c18L,0x82aa43120b58f171L,0x5aa97bb2e3102d77L,
55400         0x1a71e7c570178b35L,0x9bbb9ade6ab76f59L,0x32da60c9dea7bcacL } },
55401     /* 58 << 217 */
55402     { { 0x3c3f113ab3726680L,0x27be1c406f5b5ab2L,0x5f51f684f6864a39L,
55403         0xfaf84229a60c4f39L,0xa788612d01df18c9L,0x65c9fd14951d5ea3L },
55404       { 0x4b2153cdaeeaf44fL,0x6b9e977ba567781fL,0x4dbca3609dbf3e39L,
55405         0x1ad43ad4fc65d7ddL,0x70a7a5e13d8dcf0cL,0xc11b1f4688b91e4dL } },
55406     /* 59 << 217 */
55407     { { 0x1ef5695b0868ad28L,0x09c9c06c2e3a9176L,0x2f2c19672c358e86L,
55408         0x4ff1af54da22d7e7L,0x5ea6716840fa2270L,0xd164b6874d31a3e9L },
55409       { 0xec036bb4345103d9L,0x6c6a130f26e17156L,0x2c491063d872b0d6L,
55410         0xa66be18c4123d04cL,0x8593de34a33fa919L,0x620d2970f025b880L } },
55411     /* 60 << 217 */
55412     { { 0xc194cc1664baf040L,0x8038f31fcc01f35cL,0xfcc82fa0ed2079c7L,
55413         0x1eb7571190d39b9cL,0xf1a89043c108e069L,0x10633334c020880fL },
55414       { 0x492a494086e262f8L,0xaa0208173383f1a7L,0xfbb4e5ba6d99cc07L,
55415         0xd6ccdc5cbde40478L,0x9e0b9d5867ee92c7L,0x5204bab7653eb14bL } },
55416     /* 61 << 217 */
55417     { { 0x721f44f0ef90c9bcL,0x6ebbecd8d55e653bL,0x9af325df6ccc5d5dL,
55418         0x265f0f6d827bd1aaL,0xb82453213487ea4bL,0x1642be42af6ba8d0L },
55419       { 0xb8c4168d4140e5f8L,0xdf5e32c13545d107L,0xf1301b9c2db68318L,
55420         0xb22e20472bf3c067L,0xf40af49ee56ba514L,0xf4090e795575f363L } },
55421     /* 62 << 217 */
55422     { { 0x980de58b1746f6bdL,0xa9e1f0089eb9511cL,0x8f53c6fd1bbdba34L,
55423         0xe6a867a6a1a41706L,0xd4cc48a5d2e48256L,0xd580559e05cb19d6L },
55424       { 0xc8983311e6466ae0L,0xeab62080174df01dL,0x710ebd184a0441d1L,
55425         0x0af69d9a9f653d0eL,0xef3a2510d789c932L,0xb5959cb992fbd39aL } },
55426     /* 63 << 217 */
55427     { { 0xdbbdd5fdccb1cc9bL,0x660110b98a26d874L,0xfa80d8b60fb9ff2cL,
55428         0xfeb5cd6b95040da7L,0xb526ae0c7366cf25L,0xf49d85fce3566146L },
55429       { 0x3b4107e699f505e5L,0x3c2d618f4302bbaeL,0xdaa09d150b199866L,
55430         0x3b65cb88c395abf5L,0xd2af1dedbd5ac4eaL,0x0586f5a5276533d1L } },
55431     /* 64 << 217 */
55432     { { 0xd927283013575004L,0x01a330d620b2275eL,0x58b9207f450db713L,
55433         0xae95338423e16d95L,0x4f10c6d4e60e349cL,0x541d03ecfeb122bcL },
55434       { 0x22548cd22c648211L,0x5c2dc84cd01354f5L,0xa1c6f912b6167b3cL,
55435         0x6967bab27902d2baL,0xebbe0b0836de34baL,0x6985b33a4b79625eL } },
55436     /* 0 << 224 */
55437     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
55438       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
55439     /* 1 << 224 */
55440     { { 0x9e857f33771560abL,0x4ae1ba22250f109dL,0xf8538d68ff4f6566L,
55441         0x35380f15ac339148L,0xfef0bfdd5ddfc12fL,0xf706c6bf1387d93eL },
55442       { 0x618ce77d5357e131L,0xf0921744236478c4L,0x24eaf06e00dc0da5L,
55443         0x049113be07603cc7L,0x5cf489088f6963c7L,0xbe5eb9e6ede4a300L } },
55444     /* 2 << 224 */
55445     { { 0x77e486f85d066c15L,0x0c05b6c24ed5307dL,0x322b28ab7df36628L,
55446         0x2d14d1316704dcd6L,0xd359977af29a3567L,0xc29bb132ec96d3b6L },
55447       { 0xfd6e400ae6bfa701L,0x03db99244c7e5101L,0x62d81c7d9b8533afL,
55448         0xefa638c28de66eb8L,0x7405a9d7e86784eeL,0xafaa74efa6c22223L } },
55449     /* 3 << 224 */
55450     { { 0x6909994f0572e536L,0x9d22f9157fed8954L,0x1505ca05884aaca9L,
55451         0xe4b6530996995a98L,0x30e00a5ed02c000eL,0xb9032350236e7b09L },
55452       { 0xe696f09e14f6c7bfL,0x2126b6277dc18d06L,0xa9ada7b401e1e2a4L,
55453         0x9630acb69d2d025aL,0x9fab2c6ed84ffeb1L,0xc1d0db26ab7584f6L } },
55454     /* 4 << 224 */
55455     { { 0xf9b2dba4b9d36e91L,0x5fb4f6cefda9b2c4L,0x7692a4f33b8104eeL,
55456         0x5da885b0e4e1896eL,0xc2a30fec73d2aa36L,0x7d06e6af86f60bcaL },
55457       { 0xbc8bf16d87287887L,0x6c3dd86a3d701becL,0x8e79e2f37e35610aL,
55458         0x981139f482f9d71cL,0xf8997ec424e62733L,0x330d989aa3518061L } },
55459     /* 5 << 224 */
55460     { { 0x6cf0e6ef9b7e3cc9L,0xb465be6b0320acbdL,0x02777783856111dcL,
55461         0x3a1d36f0c0e9f2b0L,0xfcf4f6365e7fe507L,0x36bf41827fa7c8f1L },
55462       { 0x09a02de8b0f4ce56L,0xa0bbf65ca9cdb353L,0x7211a9654b7f4e35L,
55463         0xa6b2ba79805b58bdL,0x418302c20957860cL,0x3c17ec02f99f9d58L } },
55464     /* 6 << 224 */
55465     { { 0x4e6ef410ca89fbadL,0xe0fc53ba53933b78L,0xa4f03403fd41d143L,
55466         0x3a507177e0774c37L,0x078e8c568ec7484aL,0xfb73c6b6fbb3f66bL },
55467       { 0x169c94753bfbdff6L,0x44d286060a232243L,0x3e8e968508303114L,
55468         0x7a9797b8fad0def2L,0x0ad14404efc1c8daL,0x6daae4e921ced721L } },
55469     /* 7 << 224 */
55470     { { 0xfde0d1b4cbfd18abL,0xa3c9917595850f83L,0x16d3ad79c9eb9de3L,
55471         0x2707ec8b0ffbcdacL,0xd7e6750fa220287cL,0xe51baf059c2e155aL },
55472       { 0x3018c309871e10faL,0x074f08e3f23221c2L,0x1aa323aecf15a4afL,
55473         0xf085d69cc1b8cca0L,0x47a3eaccb143a969L,0x56a04522f3a98430L } },
55474     /* 8 << 224 */
55475     { { 0xc7e9ddef88dd2dc2L,0x2c21a99819a0c0b5L,0x6bc0746db239bb82L,
55476         0xc811a8eb28ea1341L,0x5f714ca71d1309b0L,0x79eabd20d4eb9b34L },
55477       { 0xe0e5afdcdf0fb30fL,0x1b01a16d8c0814c6L,0x670e1e7b84334366L,
55478         0xc8c38f9a0eed1116L,0xf914fae2619bbd50L,0x1ed062cb51c1995aL } },
55479     /* 9 << 224 */
55480     { { 0xce64d065b711b4e9L,0x32760c2eefc4d25eL,0x9e5916caa6292c7bL,
55481         0xa90d40bff2a47deeL,0x90dc6681604933d2L,0x707270c60115cf42L },
55482       { 0x55b601ff6fe583abL,0xdd2fe842a039dafeL,0x602d8de34c2d3357L,
55483         0x7cc979bca7ab9014L,0x4b8dcf7e60118797L,0x7f1f2a04cbfaad32L } },
55484     /* 10 << 224 */
55485     { { 0xd4e60e15cb583422L,0xc6b1ef90320f296fL,0x0714bad0d9bfc834L,
55486         0x5ee2ca8c9050e2c2L,0x074a8ca824f7cf1dL,0xb975024910df8516L },
55487       { 0xecee8ab7c2636d2cL,0x308e5af13b4b7bbdL,0xfed4f27eee2ae021L,
55488         0x7cd4bb192065253bL,0x6b21a3f84de525b4L,0x0f10e7bdac27fddbL } },
55489     /* 11 << 224 */
55490     { { 0xb4f02d9dbb3bf37aL,0x69590395978aacc1L,0xdf99b1309c3def3fL,
55491         0x5c66391e12be0bceL,0x30ab382cb5eaf100L,0x9b84b2b4e0352249L },
55492       { 0x0c22e4e1af14e85aL,0xc29d3c592286ea0cL,0x6c7f8b6a40758aebL,
55493         0x7a91adccde68fd0bL,0x4d8554fec8e8fd4aL,0x9fa863d5bb5621e5L } },
55494     /* 12 << 224 */
55495     { { 0xd5068487870e29cbL,0xf9420b85fc52d5cbL,0x50c3265a496d000dL,
55496         0xe605414a166bd6b4L,0x4de8d724c62b2a6cL,0x16af06f2a1a11048L },
55497       { 0x5406bde945f43c4cL,0x5e15bf6c751ad18eL,0xa846e665b6a59587L,
55498         0xcdb28a7d1816ac55L,0x899b3551819b73f8L,0x2d46297bbc848d08L } },
55499     /* 13 << 224 */
55500     { { 0x76f5aedd44af60a1L,0xf7bd3b4651d1efd8L,0xdfbf3c6439a9721eL,
55501         0xf927fbf0ee9d2ab3L,0x628e9258c7e0779dL,0x062cb2fe4cf1dccfL },
55502       { 0xb2ff57dde2278f00L,0x3f0e140a2d199ca3L,0xe7161304342c0a9cL,
55503         0xe7ca734f0bdbe131L,0x7d070270870057d8L,0xf6f1a65daaa55860L } },
55504     /* 14 << 224 */
55505     { { 0xdc4cc720299127beL,0x5b34e762faab8165L,0x2289b2f7b39c120dL,
55506         0x687a78d06e52b913L,0xd2a091dd2a3ea6a5L,0xc61eced638eab329L },
55507       { 0x652231ea7887ff2bL,0x77a568750479db4eL,0x1ef471c8d43c5722L,
55508         0xf82bf436f3764c34L,0x962af4050445cafeL,0xed8b227f5ff47259L } },
55509     /* 15 << 224 */
55510     { { 0x30e045f4a73c3da0L,0x13d2527df36c6346L,0x3dffe56d3836fb9bL,
55511         0x9518276617c5d2bfL,0xa0ef38724dd0b240L,0xb45e19ebc39c675aL },
55512       { 0x65202bc603e95445L,0x41e2f0d19a2ec9dcL,0x51c719cf2a0d762bL,
55513         0x3bfb9729ecc6b9f8L,0xda8271705a261640L,0x65c2bbbcaeee5f3fL } },
55514     /* 16 << 224 */
55515     { { 0xde849cd1d89594abL,0x00e2d2b10ec4fb3aL,0x3fbd9e3dabe92fbaL,
55516         0x785414d43324900aL,0xdaead1abde20904eL,0xb493e121aa5f1ba8L },
55517       { 0xd60a4f2d6eaea0dcL,0x394746b56fca8596L,0x163dc78934efa243L,
55518         0x3067dccf216a8d8cL,0x116b6534a901617bL,0x8c4bd099bbabe51eL } },
55519     /* 17 << 224 */
55520     { { 0xbb9eb22a97ebad53L,0x791d4f90666f1428L,0xa3a896e06c5d5569L,
55521         0x322d566fdefbc26cL,0xaa581a083c039c26L,0x82d899be62790f0bL },
55522       { 0xeff4bb9a43a0c2f7L,0x60515c10a01df2c4L,0xdd1455a849312160L,
55523         0xc8a15052c4292265L,0xdb2970f97f68d081L,0x29c825b892594c4dL } },
55524     /* 18 << 224 */
55525     { { 0xc8c2df45ac3a082cL,0xc353d074c8d4c40eL,0xb214f9c05a3c2de7L,
55526         0x504bc42cf86b0214L,0xc82df5cbd1922a58L,0x40887948a5bc3267L },
55527       { 0x04bcd21788ba8bb2L,0xe21b3e7f046fd401L,0x8419c338616af5cfL,
55528         0x7f24760baedfce9dL,0xded8035bddbd519aL,0x1f1fb0d71693faabL } },
55529     /* 19 << 224 */
55530     { { 0x7a88376766117f71L,0x8d4e37815d261599L,0xc900e6dff770b193L,
55531         0xb7d1c06b12e9dda7L,0xa86d173a717cb0faL,0xa138b7ba51dfbeacL },
55532       { 0xe84468c57360a27cL,0x4acf8b412e9b82a2L,0x85fa386cb121d6faL,
55533         0xc794d9f283e6169cL,0x7b4cd3fc8c9293acL,0x3096ad868d082719L } },
55534     /* 20 << 224 */
55535     { { 0xbb067b49d02ffcf6L,0x7cedf8f93e657299L,0xc3829961406bbfe3L,
55536         0xefe4b5aa37c12472L,0x7dc01cf9fec7dee8L,0x70a9db2389472f50L },
55537       { 0x29c269f8b31bf737L,0xa26deac3ae3fa7dbL,0x0046e91233caca41L,
55538         0x3bf4bc8ab6e78b55L,0xca83bc6cd9eb5ef1L,0x73f25c62c0c5deffL } },
55539     /* 21 << 224 */
55540     { { 0x117bb83d3ff7d803L,0xe91098c539c56c0aL,0x7bf72fe91e347fa0L,
55541         0xa66201a31e174941L,0x1d069d4d6846a06bL,0x721cdbbdcda59bcfL },
55542       { 0x17d6683a17652893L,0xee1b28f505be2530L,0x2e70558697a69062L,
55543         0xd4b5798682b56c36L,0x1ccc5be09082e781L,0x42e0e429d6b05e30L } },
55544     /* 22 << 224 */
55545     { { 0x697dc47d44b4aae8L,0xb3525cc0782c331cL,0xff71cca40bd7c78cL,
55546         0x5f3d776610c0ab69L,0xbdc10267e2ba07e3L,0xc656f75ce6373f6eL },
55547       { 0x9e2938b4b5607b62L,0xa65017d410b0a0f7L,0x8dad31195cc6ac25L,
55548         0x00f8f2d18ba5d1e6L,0x608137bc43305aefL,0xddad34bbdcb81cb1L } },
55549     /* 23 << 224 */
55550     { { 0x9e46b17c20c78a64L,0x28db365d5c48e678L,0xbe4c3b8eac6ba470L,
55551         0xee737236b6617b28L,0x81c5b94a4f3422bcL,0x4d44c33076faa922L },
55552       { 0xd7a09a719be38835L,0x99d024e1410b382dL,0x103b67c36b15012eL,
55553         0x02b6e094d9808da4L,0x4f5d938a0a7f2fcdL,0xa43058b7e4c5073bL } },
55554     /* 24 << 224 */
55555     { { 0xe133d941b1f82ca5L,0x2af8b98bfdf115bfL,0xdc6179c857aaa6f3L,
55556         0xabaa83e9130ade06L,0x7836b6fb0e8bffd1L,0xc479751ffa103703L },
55557       { 0x0ff3c1299c89963bL,0xe64072560b84c24fL,0xa92a4ea2f34f6bc9L,
55558         0xba45b3053197989bL,0xd12b5a0199243aabL,0x3015772c442af625L } },
55559     /* 25 << 224 */
55560     { { 0x5362ac737e0a5c36L,0xc731132a8c4fbc07L,0x0ef7468d7ca0d4d0L,
55561         0xc43afef835d25de0L,0x096bde6a3fa1209bL,0x21f57eb566846236L },
55562       { 0x878b585cf04d23d7L,0x737f7e527315ed56L,0xb716462c811afdd1L,
55563         0x4d223734a571a3cbL,0x56460e2fa7db2c60L,0x0684d72c61f97485L } },
55564     /* 26 << 224 */
55565     { { 0xd95fca81e6f065c5L,0x45e886d5fc8655deL,0x3580957727cff79eL,
55566         0x92a39a34625877d9L,0xdda02684dfee17eeL,0x6354f871986f635bL },
55567       { 0xb3a6e9edd409c182L,0xf0b1c8d9c4fbbb3aL,0x28721c019b77adedL,
55568         0x3c356df1bf94f028L,0xff221bd229a81f1aL,0x20edf2e856b20b0dL } },
55569     /* 27 << 224 */
55570     { { 0xb8c636db31ac60c2L,0xf3830e72bd987402L,0xfe63957c30e6b969L,
55571         0x3508e67989eb2bc4L,0xc0837f8c9a987e3bL,0xd1d0ce7b3f9b2ef4L },
55572       { 0x08d8f99441fe62baL,0xe73f79d7e17669d4L,0x8801fabaee6d68feL,
55573         0x4ef814891a508a88L,0xcc851bb71fbc4512L,0x69f728704680b88aL } },
55574     /* 28 << 224 */
55575     { { 0x97fff124835fda9eL,0xa79ceb2f0bc68512L,0x70ba93d1a2fc3995L,
55576         0x62bd28ab9e51c5eeL,0xb95fa624d5bbbaa9L,0x0654dc458c1f571eL },
55577       { 0xb9a4edc665a45ed6L,0xbf5ed1bc21ad0612L,0x74adc1a1b1a3551bL,
55578         0x3dfa3dc8dbbd6cefL,0xce5dd40b2fa3afd2L,0x14894e0f30a746caL } },
55579     /* 29 << 224 */
55580     { { 0xe4544006ada9bf7dL,0x9e123b709b75770dL,0x903628d557cea95aL,
55581         0x6429e00c9e8cef6bL,0xafa2cce77b1adaa2L,0xf2f5771e15e488daL },
55582       { 0xda44962269820874L,0x5b20ef1b6e0fef81L,0x3150a8699507b4faL,
55583         0x901897add191de20L,0xf459da31c41dbb2dL,0xc2516dd077146754L } },
55584     /* 30 << 224 */
55585     { { 0x7e729c58b8ca2a2cL,0x0f32ea1ecaac04afL,0x47267f13bdd549e3L,
55586         0x35b9440690be3b50L,0xad0f2bb14b27f670L,0xd7e5874e92341803L },
55587       { 0x7dc841cf1f9ec462L,0xebeff994512b2a42L,0x22998a7f320dc858L,
55588         0xf08eb5c719946f59L,0x228c8dcda68ea75eL,0x40dc6dc37b20dee5L } },
55589     /* 31 << 224 */
55590     { { 0x23f40e331dd722adL,0x0a441bf4c54fc48fL,0xed6c026548b75f84L,
55591         0xc2d3972f3e0fff2bL,0x889b44c4db09b7d9L,0xeb6ccc6541a6a562L },
55592       { 0x5ef1162e8f04e03aL,0x25e2ea895d8102c5L,0x37b71631154644d5L,
55593         0xa9a1a8320446b1bbL,0xe3f58daefb342b20L,0xc6d19decb6d292c3L } },
55594     /* 32 << 224 */
55595     { { 0x929454f6b3952db4L,0x412142ec4d3f69f5L,0xf5b0a7c5ee25c0b0L,
55596         0x7d3372ff2e752295L,0xd6dadc7d6eacac68L,0x5f0076cca96a8e3cL },
55597       { 0xea831db671725b3aL,0x4a286c89c29ab454L,0x5ff817e572e3c00cL,
55598         0xb022e25d2a5fb6baL,0xb611c5bcbb392476L,0x062c14dc190485a0L } },
55599     /* 33 << 224 */
55600     { { 0x44730047ffdc9a7eL,0x44949bdcf078d5bbL,0x8c1a3e4bc486e2b1L,
55601         0x53088ba20801402cL,0x6e20a7cfeac83daeL,0x4407ea8436ec5443L },
55602       { 0x564fb733853f79d8L,0x59ea819afe809670L,0x1ac62174f1ec7e91L,
55603         0x0d7e065566a0b8c9L,0x0c4d072482958221L,0x80db0297a60f984eL } },
55604     /* 34 << 224 */
55605     { { 0x380823e7f3359d47L,0x8a60fb05f5efd39cL,0x78a940669425487dL,
55606         0x1da6abc3f199c67cL,0x7df00b2165f0a6b1L,0xdc0dea58017b1231L },
55607       { 0x9c529db079f4f22fL,0xc7043be3e5dd92b5L,0x10153ffb43661331L,
55608         0x51c459bf6ff02e8fL,0x451483bfa43aa005L,0x3313f903199cd1baL } },
55609     /* 35 << 224 */
55610     { { 0x2f66587e62e1ef1bL,0x942d4c739e3ae33fL,0x4a27ead5c0ab9c1eL,
55611         0x368d8dd89ca91b06L,0xb3f0cf92c4b6ed34L,0x28cc332673e62557L },
55612       { 0x2649e5527910986bL,0x635dcf9cdda049abL,0xbbde12f625d3f201L,
55613         0x5200c3d0a9384443L,0xd996573d51eb3c10L,0xb093c1792b8cd7e5L } },
55614     /* 36 << 224 */
55615     { { 0x15cd1d1cc3fe6fa4L,0xf260a739e2c3c686L,0xf7c2270eb08c65dbL,
55616         0x9ada2cb6ff69d971L,0x65fbbcac212bff0cL,0x40157d075646a735L },
55617       { 0x101d2b7d55de9e45L,0x0db580e83118b763L,0x3203baca8322a9cdL,
55618         0x2a3137ef22cac14dL,0xcc9092e291a14128L,0xbb269f6d98cc368fL } },
55619     /* 37 << 224 */
55620     { { 0x7c8946002ad7f66fL,0x6a8328bb99b438a7L,0x86d06fbbdb440d86L,
55621         0xb74ffe2d20ac5a42L,0xc3a6f01d91b1c82bL,0x606f8ce71d5efbddL },
55622       { 0x8c49c43a6338c99fL,0x50657f7216da7cb7L,0x7f204c8b84f22d9bL,
55623         0xa2612d80ca76978dL,0x80080d868a3e8e96L,0xd8841a1ac0bff9afL } },
55624     /* 38 << 224 */
55625     { { 0xc2a734cb962fa060L,0x2baa26c580a17874L,0xe27b21110b44efe6L,
55626         0xdc1244e531d2154cL,0xfcd86d4116c7742bL,0xf45230df32503138L },
55627       { 0x94a790f4812cf0afL,0x0ab2df23da3f24d7L,0x0c764df181571d54L,
55628         0x989ff71c68d68f74L,0x9896fe62cda535b3L,0xfe0502e05f4fa41bL } },
55629     /* 39 << 224 */
55630     { { 0xf1ffe852c2f58cf6L,0x2ec46d2546d64576L,0x95bfec93d602c51aL,
55631         0x349c58bf3907b766L,0x59cb12bb9b94bdfbL,0xfa95da9515dfcd87L },
55632       { 0x731a8535e1543bfbL,0x14844aeeca14187cL,0x0d73e58aba1f4928L,
55633         0xbb71009fc6bb67f2L,0x5e7c0e988b4142b9L,0x4866b5095f08f58bL } },
55634     /* 40 << 224 */
55635     { { 0xc8295c2fa234de87L,0x1cd7f3fd878e77dbL,0x309c1fefa2155b6cL,
55636         0x2a9bcfd9484afddeL,0x87ef7a56cc999775L,0x34336cb1970aa188L },
55637       { 0xd45eb83cc3e16ba1L,0xf9d72c72b9c1695bL,0xff117458cb980742L,
55638         0x438a7fcb67af836aL,0x5ffad086eb9a6c40L,0xdbd3e518513922a3L } },
55639     /* 41 << 224 */
55640     { { 0xde241983e42021b7L,0xaa70e834542873c1L,0x99c9d35f9daf2b99L,
55641         0x0bf712d549b40780L,0x202d9969d9ab6e97L,0x7f3382dac4932106L },
55642       { 0x1eb5f5d40849e319L,0xc1bdd1179f659546L,0x628ddd3d2329f977L,
55643         0x5944611d363ee601L,0x7b7a631463d5bd4dL,0xaf6c51a5631d21ecL } },
55644     /* 42 << 224 */
55645     { { 0x2d8f9e1db4100182L,0xa08ae2fe4f3d2c03L,0x7548c430589e99f8L,
55646         0x0f5ccee2aede8af9L,0xa21ace3343b34b25L,0xb120c569dee102e6L },
55647       { 0x1cb103ed36f13699L,0xf71ff0dfc91e8cb4L,0x88f141079b22460dL,
55648         0x050af75af509366aL,0xeec8a310fb179bc6L,0x069e7331c26efef6L } },
55649     /* 43 << 224 */
55650     { { 0x3e2a9c713be9cdabL,0x8f235d6f73ac08e6L,0x3de28a6b28832dabL,
55651         0x7d08b9f31ee82d6dL,0x67c3b88f915ddda9L,0xba8f18cc0f7c81a3L },
55652       { 0x38cebc31ca3c0936L,0x745f71aa7816a6e3L,0x00cb85a91a95fcd3L,
55653         0xb92742c6577dc22cL,0x1afdaab592029cbeL,0x0bb43c91278d3f7cL } },
55654     /* 44 << 224 */
55655     { { 0x3d77059d3ba02d27L,0x58e28671440b2d3dL,0xe2d4235726636fbcL,
55656         0xcc448a52c54605d5L,0x73c2902efc0269a6L,0x28a15ed57ea8c26bL },
55657       { 0xf666587a0cfc1a34L,0x8374f2cc1ae0377cL,0x5dca6ae828417437L,
55658         0x15a6d54c94bc87ffL,0x5bf187bbb344796cL,0xc629c14889574b2dL } },
55659     /* 45 << 224 */
55660     { { 0x06d43c6d87748b63L,0x2489a957a7f232edL,0x7aa9174afa407c3fL,
55661         0x8c8b8fd933a762e0L,0xe2e8f1e7adbe94a3L,0xd1e0c8c2bb723045L },
55662       { 0xcafd8f483df092d8L,0xbc89caebb174025cL,0x97595c5649f20c98L,
55663         0x6e520a968a77acefL,0xc3dbd3107a52a4e6L,0xf51db5a91284ff27L } },
55664     /* 46 << 224 */
55665     { { 0x406465742c74cb2cL,0x44eeb9e546c33df0L,0xd2a9f16ecb4c50b2L,
55666         0x68f912a01906a6ccL,0x2b81296d95211e94L,0xddb2988ec8575839L },
55667       { 0xb74d990d33b180c0L,0x290185567d319c48L,0xd3d2e40dac8de56fL,
55668         0x9ad42a60461f30e6L,0x265e4715292a0faaL,0x56c2626c8ac3b2a5L } },
55669     /* 47 << 224 */
55670     { { 0xb7580f2fd468adb8L,0x8e1fbf0388a6a587L,0x1b8c40ed8f4f6cddL,
55671         0x337414f56817b2b1L,0xd877ebafb744d563L,0x59eed3c6df5e18b2L },
55672       { 0x365e148dd33afa01L,0x82e70adc665702cdL,0xccd77955a5e390ebL,
55673         0xd86c343accc90cb2L,0x23bd948d6cd8a33bL,0xb1fc140cdc43a8cbL } },
55674     /* 48 << 224 */
55675     { { 0xefda99d9ce11b02eL,0x9017bd4a3f820083L,0x8b9e6cd1ad14ac6fL,
55676         0x1239ee331f413880L,0xd98e93d993dd7fb9L,0xc280d252894fcb12L },
55677       { 0x33a9201a5230b5eeL,0xc6aeee256e41de26L,0x845051280d0a320aL,
55678         0xc20551db4b607b53L,0x6e63c766ea228c2eL,0x883321aeac48f25cL } },
55679     /* 49 << 224 */
55680     { { 0xa5173910e15a530aL,0xaa2c88b83ac38ab2L,0xcbfbd31ec6a6ba9eL,
55681         0x0fa126cb49ed182dL,0xd6b38897cfc53c85L,0x98d5f6bacb9c2f41L },
55682       { 0x6694e8e5cbd150e9L,0xd470ef226a1fc551L,0x57a63765d5ea1c0aL,
55683         0x95f5eb4318078139L,0xbeaba00585d3e0dbL,0x6bbf010fd314dec7L } },
55684     /* 50 << 224 */
55685     { { 0x5941229729ee46d3L,0x39e5aaa0e66bdfabL,0x9ff1575001c815e1L,
55686         0x709706211f2de195L,0xaac904a968aa571aL,0x9cbefacd8f7625f9L },
55687       { 0xadfd215dfce3a501L,0xc04d09ddf20651b4L,0x688c1421d17b25f2L,
55688         0x3efde5d40073247cL,0x999b7f3a7432c699L,0x33c76487703fea50L } },
55689     /* 51 << 224 */
55690     { { 0xc720aeb10af6e1faL,0x1564b8d8e8771dc6L,0x5983eb44673d8ef2L,
55691         0x5dabb2070679ac65L,0x51a854cdbcdb681eL,0xe2b186a9364a3cb1L },
55692       { 0xfa189eff7222208bL,0xf7161d86477666f9L,0x0ffcc3e6192d1df5L,
55693         0x1523508e39cf5a4cL,0xf5e98687c43ecce8L,0xbf17b63261450309L } },
55694     /* 52 << 224 */
55695     { { 0x63293cb8adfbde28L,0x5df78fb3c6b18ec4L,0xad10da4ffd27e50dL,
55696         0x60202b357ade5c9aL,0x67b9d253c6c8c8b5L,0xdbacffefbc2b30bdL },
55697       { 0x508ff8a67494b1edL,0x87ef48be3769728fL,0x74d4f180ef98d036L,
55698         0xc5d9ef531799e8a9L,0x726d22206e850162L,0xd86d3414239f6b38L } },
55699     /* 53 << 224 */
55700     { { 0xfdde327b3e1f1b96L,0xb6272e94bb58615dL,0x2881350cfc2d8a47L,
55701         0xfcbe87031142ab9bL,0xaa5fccd0f48c7f97L,0x606be6ed29a74ba0L },
55702       { 0x545409ba3afc598bL,0x4779f54aa7d23f5dL,0x2811c0829d68e38eL,
55703         0x5b4646bd3f9c5842L,0xbcd3aa492586219aL,0x7345799313642e3fL } },
55704     /* 54 << 224 */
55705     { { 0x9a61f240ab638788L,0x519742162b0a8449L,0x9a5ec31d43b2abfbL,
55706         0x6f3075740563c9c9L,0xe465f7793ffa198fL,0x8876c5772957418eL },
55707       { 0x10e3d09c976e5875L,0xd66d334e592c2409L,0x3f0d5727b39b7897L,
55708         0x17ca7ad1e37fd300L,0x221d8436da530871L,0x4df38e4179d6b350L } },
55709     /* 55 << 224 */
55710     { { 0xe805096338b7a2cdL,0x9874cc734b8f05cdL,0xfc0821791b74a790L,
55711         0xe18a92f3293049a6L,0xabd525694dfdc13aL,0xb928cc300d843466L },
55712       { 0x12750aec348dc7c0L,0x3c8e205d87f12dbcL,0xa2c71091e0bdbd81L,
55713         0x895b56a0c1c1871cL,0x68dd7414b4c850f9L,0x45a948ecbe806596L } },
55714     /* 56 << 224 */
55715     { { 0xa88dbfe0f4fe35f4L,0x32de3a1c84283011L,0x8a3777bc39caea33L,
55716         0x673630dee4d49959L,0xf3ef842c59070317L,0x33e4bb031fab88a9L },
55717       { 0x88e4538e98ce8bc2L,0x870c2eb81a235c6bL,0x71f62c5640df0e92L,
55718         0xdb43b853f9627486L,0xfde9fcaa95cc473bL,0xe4c5b4bb4b677b11L } },
55719     /* 57 << 224 */
55720     { { 0xa6ebd946dd4091f8L,0xf0e11886dcf0741bL,0xd6267674d9533601L,
55721         0x571926506f74e49cL,0x18269c2f891d6717L,0x350a7869b45ddb53L },
55722       { 0x79ea6a4ac8f62777L,0xbad33c4cae7edec9L,0x14bed149ad7e5578L,
55723         0xb2f4190ba91af4fcL,0xbbd6f68be71dfd3bL,0x23fd3dc8f2fb7a21L } },
55724     /* 58 << 224 */
55725     { { 0x5e0f89e598fd044dL,0xb77180d97cc30e97L,0x64fbfb747f82a12dL,
55726         0xbeebb9ca77629636L,0xe164549feba83845L,0xe65a964a7079519dL },
55727       { 0x8b1bcc08ca88157cL,0x466399c3f7483338L,0x6e2726414b9efdc6L,
55728         0xff8c7027be922e96L,0x9baebf7d48374f59L,0x2a84a23ac18ee18bL } },
55729     /* 59 << 224 */
55730     { { 0x337484e0dca4b3b3L,0x82137cb9f5b27d3fL,0x12ae1d11bbf4c806L,
55731         0xa1e2873f2880c078L,0x9e6bd909058b9a0fL,0xacc5656d2dba5fb9L },
55732       { 0x7fe5467853fd2ce3L,0x2aa4af35452439efL,0x329989a5904ffc67L,
55733         0x007ea4c8520fd31bL,0x58988e2551816b44L,0x644f2469d8f186eaL } },
55734     /* 60 << 224 */
55735     { { 0xcd4d1a9e8890722fL,0xfa0b826b74142916L,0xa494dfa817ba8041L,
55736         0x3fb73e736de2b6c2L,0x156a6cf4344b57a7L,0xb197c8621e205448L },
55737       { 0xf453e348c214acf7L,0x665d7083e9061a73L,0x5ed59ec5ce9868a3L,
55738         0x9bab305f6ad777faL,0x752c490b35315de8L,0xabcfa35b5d5aaf26L } },
55739     /* 61 << 224 */
55740     { { 0x4059fc2f914d618dL,0x88e55ce6108380fdL,0x0c22b21bee61a4c1L,
55741         0x435ecbdb04788627L,0x3f8a5ec7a9f72788L,0xa31eff8a732d5d97L },
55742       { 0x119b6bf9d48d0af9L,0xde6d1de5af70a043L,0xac075ffd3368db4aL,
55743         0x23a33ec94a58603dL,0xd43ad120fe181a89L,0x386b90ed42f0b006L } },
55744     /* 62 << 224 */
55745     { { 0x8096824bf9bf1a24L,0xcdf69abc8260ebd7L,0xaf93b34de9ab190bL,
55746         0x676351ff841cbba0L,0x3db704d3eb6d6c60L,0x3b1b893fc09aebfdL },
55747       { 0xc06b9bfdbfc69f15L,0x28b1ffb8e9c688c6L,0x1607bc68d3c16455L,
55748         0x07d56bcc6d16d937L,0xac28e69f318afd9aL,0x7f4afeb7e77263b6L } },
55749     /* 63 << 224 */
55750     { { 0x796a530ab935875aL,0xd6700ec89dd1e51cL,0xc30301df4d9320e4L,
55751         0xe23090f357157f87L,0xdd3f68a74029113eL,0x566afc6de2709936L },
55752       { 0x830f952edbff8926L,0xe207eae5c7a39d27L,0x9210b3dfd9494592L,
55753         0x3be25582d8460831L,0xec2496575d58edd9L,0xebe8426fefd24738L } },
55754     /* 64 << 224 */
55755     { { 0x0372678dc419b0aaL,0xf95031d8c13fdf17L,0xebaebca4b79594c3L,
55756         0xe587850baf3b75cfL,0x534183ac2c1e09c6L,0x3f5b0bfdc08204cdL },
55757       { 0xdac2cf06e297cc77L,0x5e47d9c6d0487084L,0xf6f509f490b0f6c2L,
55758         0x3ffc3cd6c2c62207L,0xbb21eb1132ff1887L,0x2116a023e62ccc6fL } },
55759     /* 0 << 231 */
55760     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
55761       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
55762     /* 1 << 231 */
55763     { { 0x406a7e2116960728L,0xd03923f85597d8c4L,0xd4402eff020748eeL,
55764         0x7827442af39b58dbL,0x77e3f2768d8cfb04L,0xf6eb49c8e45a978fL },
55765       { 0x9db0829949247f6aL,0xce71a74706669fe5L,0xe434ce47b82775f5L,
55766         0xe84995ef63910016L,0xa35e8b971e47792fL,0xc779cb3d7c6aaeb9L } },
55767     /* 2 << 231 */
55768     { { 0x1fa064cfaf31ea1dL,0x2a9547a848e8d974L,0xda8102a1fa9d9453L,
55769         0x786aecabdc6bd7eaL,0xcaf91e3bca2f6044L,0x67d86ea78573f208L },
55770       { 0xd309fce9c505ae24L,0x67ddc5b17f86eb8eL,0x57791ae0f3d53056L,
55771         0x26b053f00d1fd61eL,0x91c962c0045ebfa6L,0xe95246de076ed979L } },
55772     /* 3 << 231 */
55773     { { 0x156eaf570746d174L,0xa2d4a83dcda35250L,0x60a9f48c0290fa02L,
55774         0x9855d26d5c33b4acL,0x06e379c697eb1c30L,0x4f2e2dbe6e219664L },
55775       { 0x6b7448f829006065L,0x237a1f31115062a9L,0x5c635a90ad92cb24L,
55776         0x2e857f8c2eed977eL,0x3d512df7856dc88aL,0xbde85263e597a27bL } },
55777     /* 4 << 231 */
55778     { { 0x49f24994e7c03ce4L,0x274a8c132aed9ba3L,0x897b9103d5e91bc0L,
55779         0x63db1efbcb404f68L,0x70efd9d842f7fc02L,0xd6e02921c6a230afL },
55780       { 0x8d5b199f11ae0a56L,0xc98287dece33da6aL,0xde583d34504dd889L,
55781         0x03756001f823686fL,0xf19ab86f95fc73dcL,0x300406c693f12f42L } },
55782     /* 5 << 231 */
55783     { { 0x2f73595f7759701cL,0x8dc2069a6fe0e0d9L,0xb7de7114c286a65dL,
55784         0xfecc429e84c0e487L,0x51061a2c14344c07L,0x4d70972596869e37L },
55785       { 0x8b02781f2be9403bL,0x6cb6aa02de3ab5d9L,0xb013508eff6bdc9aL,
55786         0x568d2e84e5438c58L,0x7b35a979e4206c3bL,0x0bb793c0b17a8bc7L } },
55787     /* 6 << 231 */
55788     { { 0x3f896ca9fa4dd561L,0x4b9a98abd2de2ecbL,0xd0741632600e4e2aL,
55789         0x87c7db5f69e702d5L,0x1f5a3b8053e0df2bL,0xe1e24b49f443dfbaL },
55790       { 0xeb90e2305eef3a1dL,0x8f3fc8a6d38f73fcL,0xfb1e8299a5aa335aL,
55791         0xd78504cd4197b32aL,0x0e7a79cc6755918eL,0xc7c98ae2883b1c72L } },
55792     /* 7 << 231 */
55793     { { 0x1a12727c03d2beccL,0x810a37dfc6741372L,0x44ac483fb7049f39L,
55794         0xab73e5e7a36fc614L,0x298d453feeff8aebL,0x2127dd167e1b586bL },
55795       { 0xeadc5c54e07bd60cL,0x67cdae00f5e2d2e2L,0x03fe0446c9d2f10aL,
55796         0x0784098795e38ed2L,0x5d348a7ce1a6306eL,0x4903f1b6562f5463L } },
55797     /* 8 << 231 */
55798     { { 0xbf66baa5b44b1d0cL,0xbbed18eda44f8edaL,0x80bc32abeaaa466cL,
55799         0x605b7897e5f2733bL,0xe9e7e3a1a2531afaL,0x25d66db33deb8369L },
55800       { 0x36212ea3b2f25d10L,0x52d6b3f4a08d303eL,0xefa54b31444e9e9fL,
55801         0x9c2229a169530c1bL,0x68feb9854b79bdd1L,0xd570e84f8b984cc3L } },
55802     /* 9 << 231 */
55803     { { 0xe141b86bde0560a3L,0x858bf4cdb2264bd1L,0x526fb104fabe5359L,
55804         0x95f9c43f185b8a70L,0xf8e3a3eb2d1f75e9L,0x71826067d93bc6b9L },
55805       { 0xf360e01799692f49L,0x00f4fd16c2dc3dd5L,0xeb7f40498b9454d3L,
55806         0x5cb0f3c426c3b393L,0xe8ab4e4357bdc4d7L,0x9abe36b00c123d67L } },
55807     /* 10 << 231 */
55808     { { 0x1df8d98c57b168fdL,0x042fd731b45da94eL,0xa54d64f91703e143L,
55809         0xa12198be9de0ab4cL,0x160e06241ddc4e0fL,0x15cae64a6695891fL },
55810       { 0x808565e70c2b2081L,0x6de4a393cc65040cL,0x6682cd934bac1768L,
55811         0x62e7ac2ca5be965fL,0xd33f6f8ad7a38e90L,0x9cafc4635b8b516eL } },
55812     /* 11 << 231 */
55813     { { 0x0541a391b685c547L,0xe86d35e091765999L,0x65aa03c51db4a2ecL,
55814         0xba53470e6b1c4784L,0x4f848cc8cceca1faL,0x89d0db0b8b18e350L },
55815       { 0xd03e452a7840d734L,0x6cebfa790ca24215L,0x288b4569e8f1d9e8L,
55816         0x18e405af8927ce0cL,0x5aad57e51abfb4c8L,0xbbd99091a197ed1eL } },
55817     /* 12 << 231 */
55818     { { 0xf041e421aa44f3e2L,0x47ed9e8eae6fd2b7L,0x4fea93751128ed62L,
55819         0x041a1c1acec6eae6L,0x1f32359415a65daeL,0x741fea0a0154e8e8L },
55820       { 0x309e9f289c32e224L,0x457d4ffa902ce57bL,0x7bb54dd5692420c2L,
55821         0x193a41aec4fa1a6aL,0x35f5f3b43d779e77L,0x31e84371046ebb8cL } },
55822     /* 13 << 231 */
55823     { { 0xe75a7c1d9d7e5551L,0xb73c987611635e3bL,0x3b07a071e09d29b3L,
55824         0x0a3cc0acc623023cL,0x15ec4a7a1e2ceb33L,0x09a01968c70eb27fL },
55825       { 0x2e5bb53c369d145aL,0x4c93330d9b7fb506L,0xbb10a2f358013308L,
55826         0x3d9da0c4e0b85fd4L,0x8b39c992ce0dc79bL,0x7e6d18b0bec905faL } },
55827     /* 14 << 231 */
55828     { { 0x3a5a366ea1554376L,0x0e1687c052a6ed9dL,0x3e16e4aafe5355beL,
55829         0x6d8bac03ced67666L,0x403eb33ed9344003L,0xd7b9ec0d333ab20cL },
55830       { 0x9fce1986d64c272cL,0x9d52d64bb1e23843L,0x8e689611921a58e5L,
55831         0x8f5f115620d5c61aL,0xb17f612fadc81b4eL,0x36e2db30e562f779L } },
55832     /* 15 << 231 */
55833     { { 0x98d0bcead01f8634L,0x6e9ba675bc5f825eL,0xfac2d3aa05e938c1L,
55834         0x434b712fb9c66adfL,0x81c29163a9a61d36L,0x80eade933be8eea9L },
55835       { 0x10fc6d75c04c45a8L,0xa2c9aa58fb9e8702L,0x9142afaeb200428bL,
55836         0x4fa28c8520eccf38L,0x3b5f63308209b3e7L,0xf74206ca8cd74accL } },
55837     /* 16 << 231 */
55838     { { 0xd6a4d25c845f26e4L,0x71e554ce1b039dffL,0x942059731cdedfc0L,
55839         0x0c4e385603d6502fL,0x981a4fc5e15ce8c8L,0x85d1b0f17aca30b7L },
55840       { 0xf2037ef777bb9e43L,0xc52804f4e87ae187L,0x9c98a23c71f3e4e3L,
55841         0xa73c8b89f47b504bL,0xb9e33f54023233aaL,0xf2bcfc17f92c9f68L } },
55842     /* 17 << 231 */
55843     { { 0xb3c1bc26707fc6ebL,0x0bb585b75ef6dac6L,0x70af297f5f707063L,
55844         0x3d86a8fa967a0ad8L,0x510dae4d4f956cc6L,0x1dbcb2e883c01ad0L },
55845       { 0x0e480cd28bfbb5edL,0x76498f813025fca2L,0xc015064ec5446cadL,
55846         0x4ddfe2af3616f51aL,0x76b0d690e6750b31L,0xc4502c050073f263L } },
55847     /* 18 << 231 */
55848     { { 0x9120912bb3081e59L,0x6c73c4a2f908b364L,0x408af8c94de763d6L,
55849         0x3d9e83084000add2L,0x65d197fddcb5a5a2L,0xbfd29f0b2bd82bb0L },
55850       { 0xa1243e63bdfe09e7L,0x91d90b54d556188cL,0x977dd4a18bc872fcL,
55851         0xa8e6e7bef4ea7805L,0x12c53bd80a467365L,0x9d7abca493b7f0a4L } },
55852     /* 19 << 231 */
55853     { { 0x5faf453a40eeb93eL,0x6801e0d1f1fe9307L,0xe92505d39ea9b800L,
55854         0x7e911f8108eb58c8L,0x5da7ffcc098143eeL,0xe023262056876057L },
55855       { 0x5354045bbfa99a91L,0xee660bbebb346841L,0x1dbf5c7cecb3099fL,
55856         0xe79c78d6a125d753L,0x2a356f10706fc013L,0xe50c50b725f88ebdL } },
55857     /* 20 << 231 */
55858     { { 0x663ca92723ca903aL,0x8a64a4dec7681937L,0xe3ec0966a2baa42fL,
55859         0x688328d7a2906226L,0xc2821e9c94790fd8L,0x7a295b62157501cdL },
55860       { 0x032cd57d3675c2f3L,0x91d66a57f42e6f95L,0xd75056961e97dcd0L,
55861         0x7e8ba3ed7d8b6f52L,0x8ddb72c420b0dccaL,0xe09e53bb6aea2d55L } },
55862     /* 21 << 231 */
55863     { { 0x3815b1028a009f19L,0x4f76d609f5418c34L,0x7a35cb332a9eabd9L,
55864         0x018d6c54ce89e886L,0xe00b99e859c9fab6L,0x4f10a0d9aaf6e7b8L },
55865       { 0xee51f8f0e722fce1L,0x03e8b63179bccac0L,0x66e540c26f327d2fL,
55866         0x31df4a35d22377e4L,0xba5b0029d5c71cedL,0x6a3e20553ed6aeeaL } },
55867     /* 22 << 231 */
55868     { { 0xe932d1aaaffc47ebL,0x75c9d4d8513f85a3L,0x50886fcdf9419cb0L,
55869         0x756a7d7d49081e9eL,0xe45fff1fe14aff77L,0x022b4ac339846230L },
55870       { 0xefc3e8dbe89adc78L,0x921bb1538c09ccecL,0xe4dc6aa17826d461L,
55871         0xa53aa6cefac8f0f4L,0x5d4e4d53954192c5L,0xda721828c722780fL } },
55872     /* 23 << 231 */
55873     { { 0x978609c67e4933daL,0x49fd5c5d2539c807L,0x072a911c6330373fL,
55874         0x40cfa61838177579L,0xf9a7aa4c81c51596L,0x7ba8e7a5b346724dL },
55875       { 0x79298c06d26ee66dL,0x243323702a9c2792L,0x585e8b9eb6aab53eL,
55876         0xa39596c6e14bee4eL,0x89b2758828a76dbfL,0x889fba0aa00dc1adL } },
55877     /* 24 << 231 */
55878     { { 0xd55a3eaf0a9a8ba4L,0x13b1406b2a8cd215L,0xcb44589a93943e1aL,
55879         0x91b5e3493a671a47L,0x488654f8efbe0256L,0x448bee4b392ba5e8L },
55880       { 0x228f478137e762caL,0xe21a2ca7e71b6c47L,0x0e809fe94900fcefL,
55881         0xb05e1db2815f6c76L,0x8cdf28815fa6fa0cL,0x2ed55c1c586fec8fL } },
55882     /* 25 << 231 */
55883     { { 0x7c3842eba210d4d9L,0xd656154e5f69a69bL,0x9e11c6db1f3a0483L,
55884         0xb0314a5e5a217444L,0xe17a274e34f4e54fL,0x6e41c20a9f79d6abL },
55885       { 0xd010d789dffef6dfL,0x704937f17e8915f0L,0x5072bf063d3460fbL,
55886         0xa30814ed5f08429dL,0xe5faf476207d2708L,0x46e56e14af448339L } },
55887     /* 26 << 231 */
55888     { { 0x5a049c8f94af3a35L,0x9ae89160d8b75bbcL,0x8b026d867ff40c5eL,
55889         0x90e54aa4fbddfd06L,0xc85349e7ee418640L,0xbf71e454beb7801bL },
55890       { 0x63f5e068ad912e83L,0x6252a4a4ada5341bL,0x25114b87b44529abL,
55891         0x9b80bea9eadb4f13L,0x7f071c0cfe050052L,0x4c9cd33418612061L } },
55892     /* 27 << 231 */
55893     { { 0xc6f50ed03c768ff6L,0x5b994b58b6de126aL,0x807ad19e2a1ac05aL,
55894         0x012fcb9ddfc66ad7L,0xf8706d5fefeb7d07L,0x132aa6697bfc5337L },
55895       { 0x56bd874310e28d18L,0x33bc53d96e9f8e26L,0x5885b63b152758edL,
55896         0xb8b1bd5e757e1471L,0xdbc689458c0d406cL,0xa664de3bfc605a11L } },
55897     /* 28 << 231 */
55898     { { 0x04df415ea6d4b6c2L,0xb8e33e71d254d2d4L,0x179df4f48b84c588L,
55899         0x8a2a0683d435793aL,0x6147a5a911eecec0L,0x0b8389793a0196ccL },
55900       { 0x855059ce81805693L,0x37babf9f3b27872fL,0xa2ac78b1769be5c3L,
55901         0x16260f0c0a8d267bL,0x31f48c42388266c1L,0x58fee495ead1f238L } },
55902     /* 29 << 231 */
55903     { { 0x5753ee0fc048300dL,0x307dfd57e048abc4L,0xc18bdfeca3ba6c56L,
55904         0xfb2d8daf10495489L,0xd93aebd4e0fd2d13L,0x4736efaf0518a5faL },
55905       { 0xa8ee4995eaa9fc77L,0x2620f08e008adc03L,0xf03981839f06991aL,
55906         0xd47b1eabe25a4f4cL,0x669cf09c79f95484L,0xf30191584a0f8b96L } },
55907     /* 30 << 231 */
55908     { { 0x047b0f0124b240a1L,0x959915dd46cecf58L,0xedf2e74b72980ca1L,
55909         0x6b7b7b4ef2cad32aL,0xf9f01c9d0b9ded1cL,0x009d3a5825e77e0aL },
55910       { 0x62314ab411a39c1cL,0xb3b0c5b2ad557b74L,0x6dbb75dd961619fcL,
55911         0xb8f2d198c934e1e0L,0x4401507542eb7fd5L,0x3a8552efea1be435L } },
55912     /* 31 << 231 */
55913     { { 0x08e3f0e2217de9abL,0x6bdec27bb6b4f789L,0x5b160334685af8e0L,
55914         0x31e651cc61738f6fL,0x37224bc4631989c0L,0x2dc8006ad39f9c4dL },
55915       { 0x2a5d585056c3d84eL,0xb2ef06cc5cc79193L,0x246d92869eaa50e7L,
55916         0x8cacbf7cea6a7cadL,0x109bddc629465ce6L,0xad2f492fb5744947L } },
55917     /* 32 << 231 */
55918     { { 0xba03ba3b7b3b336dL,0xe57ce50928c9c55dL,0xf96b8cfe4f0f60b2L,
55919         0xb908d77e6fcccd96L,0x7208ef7de79dd17aL,0x739095333ec3d048L },
55920       { 0x9c5ad2da1163fe78L,0x4e2a8685cd4a15c2L,0xac999449470eb938L,
55921         0xfaaf27fbee7d772fL,0xfbe402abd0b7ad09L,0x704d4f0e57db00a9L } },
55922     /* 33 << 231 */
55923     { { 0x8f2f736c6330607fL,0xaf4acf66c975432bL,0x838fd8cabd1dec99L,
55924         0x347088aa7c3d0499L,0x28008757e835ea86L,0x43e2fb30c03e1aa1L },
55925       { 0x06c66dabf0d10da1L,0x25d7aa1867321158L,0x215e483811dc063fL,
55926         0xd52dee1e288362f2L,0x790989a1fe300a0aL,0xe0452fa5f163e1ccL } },
55927     /* 34 << 231 */
55928     { { 0xd3eab3ae25e7c044L,0xa3712d11b6d22325L,0x5e3835999e8237ddL,
55929         0x2549047c9dc93a5fL,0x24b07617b546a113L,0xa50359ed2e7b82fdL },
55930       { 0xbbc3eb5889964effL,0x93d490b60d7ae172L,0x68cd6b3f774ac0e6L,
55931         0xf98f1df035e02fc6L,0xfd2625c560857c16L,0xd68f25e845dd06f6L } },
55932     /* 35 << 231 */
55933     { { 0x40dcb41018c1b3d8L,0x8af9a0bf954cc170L,0x9c40a17d5af27d6dL,
55934         0x6b20fa7d7137d35aL,0x7c46f6aaf07f5adfL,0x7caa6e3cafc2f780L },
55935       { 0xef03332694dfb637L,0xd8f330b38d0ac73cL,0xacbf571255d40a9fL,
55936         0x1b4ffafa3f4fde0eL,0xa17488e09fe6b04fL,0xd27808a103957cfcL } },
55937     /* 36 << 231 */
55938     { { 0x85e1de1e96569e6dL,0xc9545920d7ae52f9L,0x04ebc797bcd62008L,
55939         0xe142d0bc04a24db0L,0x5ed44b0d40e9fa80L,0x39fd679a48ddaba3L },
55940       { 0x91aba967ce7ee095L,0x76de8d3a0e97d0f4L,0x92e7a107a221785fL,
55941         0xb028f67e734283ffL,0x987f644168af2f42L,0x0ad882369d7f7102L } },
55942     /* 37 << 231 */
55943     { { 0xc5289301642f7d3cL,0x53ea584de508c45aL,0x86eb66e949337336L,
55944         0xa56d59d668fbc13aL,0x44c464ffe9e51562L,0xe5280ecd8200a27fL },
55945       { 0x92e2a9334cc73f23L,0xf59780325e7b858cL,0x399bd41e90d4b2efL,
55946         0x4faecb8bd0ead86aL,0x6ead9c530ce48b14L,0x941b4807ef74700cL } },
55947     /* 38 << 231 */
55948     { { 0xea281be94d522b69L,0xb6855d45694a08bcL,0x7c47ddc7aa7f4d28L,
55949         0x2028e22b6c36bba5L,0x206b63430c2dee0aL,0xfeb0b3dae68fdcd8L },
55950       { 0x6dda02a44603db5cL,0xa705d0defd786a39L,0xd356f6a426aadd38L,
55951         0xd34acb7d95ef6a00L,0x073ea16e14846402L,0x2cf7a82ab2df8bc5L } },
55952     /* 39 << 231 */
55953     { { 0x8fdcd309bffd7240L,0x6843dd76386e459bL,0x222fa67c0dee5740L,
55954         0xa3801343620d7d83L,0x96dfdbffe21b4af3L,0x017bd3d3dadd04beL },
55955       { 0x1b6adba2bca18337L,0x191b86f1300ed35aL,0x103a380cd73bbadaL,
55956         0xc2f3172f36f95dacL,0xa01a10e220767bf4L,0xda882ca6989ad766L } },
55957     /* 40 << 231 */
55958     { { 0x5bbc748b9cc47708L,0x16d796054026c772L,0xefc3ce3ea053df6bL,
55959         0x30ea7eab0713752fL,0x15b491b9dfd524b7L,0xa751d82010bcd34cL },
55960       { 0xf30c708abbd5da72L,0xf0c55aa86d16bd51L,0x1754060ba6215d84L,
55961         0x3a48d2cbb863542bL,0x992e8340261d8c45L,0x4096f65be8fd2113L } },
55962     /* 41 << 231 */
55963     { { 0x5532411e1045d8cfL,0x2d2f8d6b52bea60fL,0xa850b61825c556c2L,
55964         0x6547892fe8965d13L,0xa7bd4527184d0cffL,0x0e7f7daec25ba558L },
55965       { 0xfcfaf7b234343889L,0x9d6a23aeb82ba1d7L,0x2859023b60514faeL,
55966         0x4d51aeddc82da6b7L,0x6a060dc38273cd00L,0xf2f8923d78478c29L } },
55967     /* 42 << 231 */
55968     { { 0x0baa35154f08b278L,0x26baf331e57297c8L,0x3fef65cc04e27c13L,
55969         0x0f910ee0ca8430b6L,0xa27c5f5c2c445251L,0xc780142dccf3c637L },
55970       { 0x47dc4192e0f3fbbbL,0xf4d12bd6f2a91a33L,0xc1eb18b206352685L,
55971         0x111cc07f5b3db096L,0xbce0cddbcb95c815L,0x6b0bae7e14d28563L } },
55972     /* 43 << 231 */
55973     { { 0x40d16b7705897177L,0x4772a643953915adL,0xc6cfc1d23cabc7a9L,
55974         0x0641e96df80536c3L,0x6c297cd6be4c5454L,0x509a837c9c00216aL },
55975       { 0x17455153c01ce9a5L,0xee76da8a40b825e8L,0x1757a59cd23a37acL,
55976         0x5adcfbd10958248aL,0x043314525d01549bL,0x831f725ab0c42176L } },
55977     /* 44 << 231 */
55978     { { 0x28704bdcdf7d537bL,0xbcae2c15fa88f42cL,0xab32eecd3866ac4fL,
55979         0x446754a2128c4a7fL,0xc69309c1739ef781L,0x216e9f43bd160d81L },
55980       { 0xe0efa3ec6fefc0aeL,0xd179225086a604f5L,0xe43e13e260418c0fL,
55981         0x6f605146f100b9b7L,0x6c39828a6e994093L,0x99558f4706c019e9L } },
55982     /* 45 << 231 */
55983     { { 0xf541b3cd28df49eeL,0x0be75ef5cec2660fL,0xe73d18bb620c81f1L,
55984         0x42e81fef3c775c53L,0xd0a9dcdcbc012ed7L,0x570f5a1b8f292a58L },
55985       { 0x51f302e74c030819L,0x42e1903f50bb8a5bL,0x6d8105a98536e7d0L,
55986         0x66e2fdf1c1ca766dL,0xecaf4a316c5927fdL,0x347803cf96a14565L } },
55987     /* 46 << 231 */
55988     { { 0x794d90ab425d3a7fL,0xcae9008d93ecbe48L,0x211e38c3bd5f11b3L,
55989         0x6020ed2a6db1c1d7L,0xaa5695064437f020L,0xb2b93424235f4d6fL },
55990       { 0xa84a3c1d66ab2a3eL,0x171f9325712a14e0L,0x4a43cd6744d958d0L,
55991         0x53bea85ee95dc3cbL,0x1fba008769f2009dL,0xf0fbc48f31c13eb4L } },
55992     /* 47 << 231 */
55993     { { 0xefa3dea85fb2227aL,0x0160b031e098a97bL,0x92a554e3553377b1L,
55994         0x7b58c26258ccaac8L,0x666400171c3e0a47L,0x40e45f90ae2d7d8aL },
55995       { 0x660df3441ee18103L,0x5515cd66e9b64e55L,0xede93c59de059b3aL,
55996         0x874a0c90ca0e7acaL,0x840188abc8b1daa0L,0x9d49a02601e148a7L } },
55997     /* 48 << 231 */
55998     { { 0xe93ee31ae12b4e64L,0x2ab8e378662d17f4L,0x2544bd9969516582L,
55999         0x7bf80e4b2e1e5485L,0xf30f0b14729d9361L,0xb3ffb5d18268d40fL },
56000       { 0x34605055ac193a63L,0x9e5ca9a9f8e04d69L,0xcbbeebc1085ecbb2L,
56001         0xda03b75bf340eac4L,0x3bf9468a84436462L,0xdfa8b4c80f26f20cL } },
56002     /* 49 << 231 */
56003     { { 0x2e6520714aa497e2L,0x2b9358fd7ecd223cL,0x96efcbdc4f828e86L,
56004         0xa0f76679d2f096c9L,0x3887bef70690b78aL,0x2e7d9cae1a01b10dL },
56005       { 0x8b0cdf0e5656e5d0L,0x0a6ca92d48d3ec2cL,0xdcacbdd3b49e2ab8L,
56006         0x4d087ee0d7485e87L,0x4987078292cc57a7L,0xa1776bd47bb38b8aL } },
56007     /* 50 << 231 */
56008     { { 0x60c113bdb711e087L,0x28694ff4e257e115L,0xf81d5e054c18d716L,
56009         0xd1c04b67eb0af843L,0x16e6e46e40d8907dL,0xb73c3de91dd34d22L },
56010       { 0x9d7f282519825f92L,0xdf5d33edba486ce6L,0x288fafac21c223d3L,
56011         0x21c4df016d05007fL,0xccd9626b197c5badL,0x3a91743902c91b36L } },
56012     /* 51 << 231 */
56013     { { 0x6f950922340ebed2L,0x9e796894beddf06bL,0x5a8ea337cd9d7a07L,
56014         0x1c5dee115bd182ddL,0xba87dd1ae0c79b9dL,0xb16169f3b9002931L },
56015       { 0x68098da138c62518L,0xea7bf413417fdc6fL,0xa500a320b6fdf768L,
56016         0x7870c71c4550c202L,0x0874fd9f6121afb2L,0x49f0fd0cab7d0b6fL } },
56017     /* 52 << 231 */
56018     { { 0x7af3de47f6b7fedaL,0x19b8a51ba30b2296L,0x16886446150a0af8L,
56019         0xdada5aeeb2a4ecbbL,0x77105de8e8de3888L,0xc54d352c7d763f77L },
56020       { 0x754984ae72ff499aL,0x3de4b2785a5a25f4L,0x5df75ece818512a4L,
56021         0xd4fc8093ca7ccf3dL,0xff9bdf544a49f4fdL,0x45d23e77de0a5840L } },
56022     /* 53 << 231 */
56023     { { 0x8ef88682ca85a586L,0x12038785bff64885L,0x99670d8ac98cf695L,
56024         0xf7dc3dca6c3d5832L,0x1e836a59fd3e64d1L,0x8dbb13addd426c1aL },
56025       { 0x21867f0690f59314L,0x7adb6f707da5ce5dL,0x662422ae0da28987L,
56026         0x75a1486466766a41L,0x2d42bede6c8937b6L,0x559e168dff0c474cL } },
56027     /* 54 << 231 */
56028     { { 0xa07fdaa25af635feL,0x01d67fb36a0c8fd9L,0xa226f8dac9eb8d8aL,
56029         0x0795c27ce7fcfd0dL,0x84556c0553578294L,0x92b30a84b3e57574L },
56030       { 0xc8eb6ac0ca5dc890L,0x061a0a195c8b7d8aL,0x60f3351923177c06L,
56031         0x780755917d01bf6cL,0x63ec8a4421f48422L,0xddfcb2c0d804c7b0L } },
56032     /* 55 << 231 */
56033     { { 0xb186daffdb2e385aL,0x7589c9cd43aac848L,0x9b474a411fb053d7L,
56034         0x2f79556be1ada6c8L,0x694badc54d7d9ce8L,0x31ac06a84921f546L },
56035       { 0xacaf91c165666233L,0x6ea97c8ee45b62b3L,0x9c8f3fa66f0096c6L,
56036         0x2db7da39ac68f8baL,0x0ad2da0f19a3d1b2L,0x08c96b0ff80d426eL } },
56037     /* 56 << 231 */
56038     { { 0x07d63f07257d20b5L,0x25475a304e8c62caL,0x2469d661789ac15cL,
56039         0xd0d2ba1b3aae86a4L,0xc716202a4458dab6L,0xa011ca5ec4d5f90cL },
56040       { 0x53ce0273ca2430c9L,0x61040ecf96da6946L,0x6847dd034247c99cL,
56041         0x0c500b4519defda5L,0x263316db365796d4L,0xff9b99e7b982d89cL } },
56042     /* 57 << 231 */
56043     { { 0x725fc8f911591738L,0xe6c16db3f4030f65L,0x66c7622d441b6b17L,
56044         0xad8e4b9c69d93786L,0x732d597473093a4dL,0xa2136d85228f103bL },
56045       { 0x84f1d9397bcf76e0L,0x971a4c55e2531411L,0x9816371d15920fa7L,
56046         0x5515cbc594bbc17cL,0x8b8c76e859d52722L,0x3bfe618e9a240652L } },
56047     /* 58 << 231 */
56048     { { 0x18981da25cd1f7c3L,0x198a91bb09b22c3eL,0x48d11aafb23d71ebL,
56049         0xddaa6e071d31782aL,0xca7b812a39125babL,0xd89dcd825d963539L },
56050       { 0xc7012ed9e5a89eafL,0xbcf0d4c4af0ce61fL,0x6f65a246e6a9f404L,
56051         0xae6a489d51c1302bL,0xab43a2bcfc5ea651L,0xfdb73470293b1e58L } },
56052     /* 59 << 231 */
56053     { { 0x8e860629f5c9d835L,0xf91a0b5d04efe37dL,0xaa2acb55b1956d3dL,
56054         0xe295b30fb5bb48ddL,0xdfad64a7e8275e6fL,0x1e203bb7d41beeaaL },
56055       { 0x4aa2fd5836e64f60L,0xfb0b92a706e01818L,0x68e386d60d29ff89L,
56056         0x617981bc1802840aL,0x6d68ccf7ceb124f5L,0x19193c483b120ddaL } },
56057     /* 60 << 231 */
56058     { { 0x4d02098b8b5d9d67L,0xecb580503148dc75L,0x561545107d898600L,
56059         0x0213ef782d8be728L,0x4123671b1f11d90bL,0x8b9ff1b654c291beL },
56060       { 0x139ba95e52db185bL,0x83be41d0997b3eb4L,0x4a950c9a41e2e288L,
56061         0xdca0290c48916145L,0xf1eb9327cd073e77L,0x384ec5ddbd4f4ccbL } },
56062     /* 61 << 231 */
56063     { { 0x7e538f9036f4b7b0L,0xeb54e9e4ca25008eL,0x0054a07bf8af6eb2L,
56064         0xd96b712f5e3f61e9L,0xf01da03e29aa496dL,0xedbbc2d7d00faf95L },
56065       { 0x178c5bbd104f4dd3L,0x5cbd4783aa11b0d0L,0x4433fe6156eecea2L,
56066         0xdcc01bdcada7991aL,0x89ca41ba1addfa5bL,0xad64ee097a65ee64L } },
56067     /* 62 << 231 */
56068     { { 0x05a8a58d7e276915L,0xee28f77bf1582bf6L,0x6f308349285bd210L,
56069         0xb8b8ec47ab877186L,0x0436930e0ddb857fL,0x20a9973e5346b800L },
56070       { 0x756ab9b5848dd5b9L,0x33a220cfa12370ebL,0xdbd87c391f3d0386L,
56071         0x90c6879075429844L,0x5cc1a9736193f021L,0xf0b80f6543d46e24L } },
56072     /* 63 << 231 */
56073     { { 0x45e5f57bf79f5116L,0x14f02b229bcd30ecL,0xd989ee5426a39a1dL,
56074         0x497ad3c3d5854b85L,0xb61c15e50154364fL,0x5979941f502107d5L },
56075       { 0x0b99f087195934f6L,0x1f852baa605fbf71L,0x68ec80e47206f65bL,
56076         0x0392af1cea5bc3c0L,0xcebe56f81cb1d6bdL,0xdc6279d90f80b6b9L } },
56077     /* 64 << 231 */
56078     { { 0x10c082a63fc14a85L,0x59389ebc1c0b14c4L,0x785d935b4cb291a7L,
56079         0xfc2ae15313e9ce08L,0x3146fabf4df6f1c4L,0xa2a4a457c87dd24cL },
56080       { 0x85fdd8771deb49bbL,0x2b7843709b055934L,0xc81d05013e7e0297L,
56081         0xb56ddd1fb92df904L,0x4612df9f295ddccbL,0xc24bd4cf0e27cf1dL } },
56082     /* 0 << 238 */
56083     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
56084       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
56085     /* 1 << 238 */
56086     { { 0x7830460fd1944d1bL,0xc56f08e784350af2L,0x73bee2aa307d9c78L,
56087         0x1b02af1b5aad8b6cL,0x5e31882703848db5L,0x4785958bf230f476L },
56088       { 0x4ea6535d4f80e25dL,0x9958c9c7d23c7f72L,0x4c197b332fd33cabL,
56089         0x24c7b0b1c566914fL,0x956ce3c371952d3bL,0x8735694bfabae5f2L } },
56090     /* 2 << 238 */
56091     { { 0xca9872e1597bd10eL,0x6725cc9a4aed951fL,0x96b17cb84e05b280L,
56092         0x97987146fa234d45L,0xba78949ebb35a7d8L,0xb82e9b9f6fc59384L },
56093       { 0xa303e54a70f165c7L,0xfd6bb0dcb9c2cad9L,0xe57e2de8ee722045L,
56094         0xa05c106563e27035L,0xaa38e86602d2fe6fL,0x78e02fa8ee2f6aadL } },
56095     /* 3 << 238 */
56096     { { 0xd6256e7c62c627c2L,0x5571edfc3cbb10dfL,0xfedec45771cca8f4L,
56097         0x2e26ac5f8483eed6L,0x8e8c0671173508c2L,0xfd9f25d50f39bf76L },
56098       { 0x1cb080c3094cc1b1L,0xd367ca8c113e6552L,0x4ae2ca36bedb511cL,
56099         0x0de0c3e34707eeb6L,0x204cc610239d3097L,0xb235dbf0adb00383L } },
56100     /* 4 << 238 */
56101     { { 0xc0426b775e3c647bL,0xbfcbd9398cf05348L,0x31d312e3172c0d3dL,
56102         0x5f49fde6ee754737L,0x895530f06da7ee61L,0xcf281b0ae8b3a5fbL },
56103       { 0xfd14973541b8a543L,0x41a625a73080dd30L,0xe2baae07653908cfL,
56104         0xc3d01436ba02a278L,0xa0d0222e7b21b8f8L,0xfdc270e9d7ec1297L } },
56105     /* 5 << 238 */
56106     { { 0x9704cdc6a9c26f4fL,0x96808107908a6756L,0x73be47d40f1def2bL,
56107         0xd32c11d619215394L,0x1a59b9541842c2f2L,0xd64a70bb52c94807L },
56108       { 0x32b08c3e9dd262b3L,0x54d2cdc4440315a0L,0x671b3139425ace14L,
56109         0xd418542f2c7518e4L,0xce5e1712cc1bbdaaL,0xb3268403131f98adL } },
56110     /* 6 << 238 */
56111     { { 0xce4b39874e39e87dL,0x8e60a901966f4603L,0x1b95e4fd73c4a679L,
56112         0xae87f845b004310eL,0xcd50aedf815684c5L,0xa56805d343c77e38L },
56113       { 0x9a429abcf0588403L,0x77dd1a02009e699dL,0x27ad38fb52a417d6L,
56114         0x62591579fd8f6d00L,0xccb12126ea58f822L,0x3a009e76760a3ccfL } },
56115     /* 7 << 238 */
56116     { { 0x17688d3410023b42L,0x9bc8bd6f7cfadb6eL,0xe4cdf89f460aa255L,
56117         0xf709740a99eb21f8L,0x1ea8115cbd460bacL,0xbf7bafe8ac7e6629L },
56118       { 0xf8dc02bb096de741L,0x982f7becd2f6a583L,0xd971589a0f92bfeaL,
56119         0x662793afc02acbaaL,0x1b0f7d5eb771574eL,0xd9f71c4c66985cdaL } },
56120     /* 8 << 238 */
56121     { { 0x4f120aa7e2a07891L,0x9158bab3a25d3225L,0xc96bac5ecfe5f7a8L,
56122         0xd4e73d59bbf3cec6L,0xed8d233560361cd5L,0x9b1a252c562f444cL },
56123       { 0xbd37d3cfc70f23c2L,0xf13b3b6ea52ea19eL,0x7e35535a3d2f41edL,
56124         0x0353b52ee8b1743eL,0x31d89dfd7b5a2765L,0x2b7ac6848d9ea8b8L } },
56125     /* 9 << 238 */
56126     { { 0x3613afb361bd36b3L,0x85171aef3e0339eaL,0xdaf0c280c833abe6L,
56127         0xde566372e4500f09L,0x487dbef84a5bda73L,0x5cc00564e6e3f324L },
56128       { 0xbdf148cfb96abd01L,0xf8dbeda5ba9306ffL,0x05774d1a5ac0b828L,
56129         0x73ddc3248cf4a56dL,0xabc5af5232dc6125L,0x15ad6d2573294d7bL } },
56130     /* 10 << 238 */
56131     { { 0x7b5bbe51bd6086deL,0x7fbc95303816cee6L,0x60ac14fab3354bf6L,
56132         0x2b2abe43c9a6e793L,0x6ffae7342e19664bL,0x1d0e38b90064bd95L },
56133       { 0xc1303ba3fa9f23beL,0x6d5f4ea5d8f0a46cL,0xf8f472517a270649L,
56134         0x126c13ae723a5a0dL,0xe4d0a19e5e21273eL,0x18076170e83abb8cL } },
56135     /* 11 << 238 */
56136     { { 0xc21dc6946b771809L,0x2501f25600f85b8aL,0xb3a21dc347382df8L,
56137         0x25ede3c239dee18dL,0x39709b9db29b770cL,0x6eb314d510fa9c5aL },
56138       { 0x79140b1f508f5e59L,0xcce9f7cedeff2816L,0xa153c050400bc8a1L,
56139         0x052e03c4ff2c127fL,0xf8ffff1f841a03adL,0xc0c2626345896fb5L } },
56140     /* 12 << 238 */
56141     { { 0x06a67bd29f101e64L,0xcb6e0ac7e1733a4aL,0xee0b5d5197bc62d2L,
56142         0x52b1703924c51874L,0xfed1f42382a1a0d5L,0x55d90569db6270acL },
56143       { 0x36be4a9c5d73d533L,0xbe9266d6976ed4d5L,0xc17436d3b8f8074bL,
56144         0x3bb4d399718545c6L,0x8e1ea3555c757d21L,0xf7edbc978c474366L } },
56145     /* 13 << 238 */
56146     { { 0x905ad4bf3023ec1eL,0x8cc101ca16081c1eL,0xe0d47ec79cb74127L,
56147         0x1be5f86725da2dd4L,0xcba2ee4507ebac2eL,0xcee26667e22d87d1L },
56148       { 0xfc339af1c7c409ecL,0x112af9b47b7ef32fL,0xcc3e07898b821999L,
56149         0x4234433c222b3478L,0x55bcc87ddbce50c0L,0xcb6141cd7816f642L } },
56150     /* 14 << 238 */
56151     { { 0x8ae24e6b67f38eecL,0x61adae20ea14bc0dL,0x32737584c480c3fcL,
56152         0x44f61b79812ee744L,0xc8f607d5fe06d5d2L,0xfeaeb2bcea45267eL },
56153       { 0xe004522bb92c909eL,0x5171fe360ab3e854L,0x659936fe63ebc481L,
56154         0xdde6dbbff76649d4L,0xb38c160fe2295d0eL,0xba608b7e1e8f5c1bL } },
56155     /* 15 << 238 */
56156     { { 0x55616c4c86c2cb9cL,0xcfa8b484173526faL,0x096a09d90039a4c9L,
56157         0x6ccb4964f300a73bL,0x42dd78ac66819855L,0xa7c532c10941599cL },
56158       { 0xd15905f0b630220bL,0x9f4893ca5637e103L,0x768c09bf8a2115abL,
56159         0x5091f4399c52755bL,0x4ad1c0f6d38e7c50L,0xf6e6b2d054eb4439L } },
56160     /* 16 << 238 */
56161     { { 0x73457010c46db855L,0xccb68c43dd579fb8L,0x705b0e8c9c25fe5bL,
56162         0x40f36ea182dd0485L,0x3d55bc8527ac2805L,0x15177c6fad921b92L },
56163       { 0x51586cd55ab18cabL,0xf51b5296cbb4488cL,0xbb4e605e84f0abcaL,
56164         0x354ef8e3772dd0daL,0x7f1a8f795e4e1d41L,0x93461f09de5d8491L } },
56165     /* 17 << 238 */
56166     { { 0xe186b0b09cd7d54aL,0x0451cb0dd4303760L,0x90a8b0f84b38f082L,
56167         0x2357f03700b04fffL,0x8a4669f86d81dbd3L,0x2a5cb6f6bd94842aL },
56168       { 0xa13d19c4c498a572L,0xb7b8fe10cd937a76L,0xf8df355ed9842244L,
56169         0x64fc9d62b077c8feL,0xd4b2c3cce9dd337eL,0x7c63799ad3784edaL } },
56170     /* 18 << 238 */
56171     { { 0x39fe6673a780fd38L,0x8bc8d026a4b4cfa8L,0xcc339850801c44bcL,
56172         0xb5d80c4bc2dca07dL,0x745ffb5d91f1408bL,0xb55588f89017d1e7L },
56173       { 0xafef3cf1c3d76a1eL,0xe3a6e8058e1367ebL,0xd09ea1e2a642d2bbL,
56174         0xf303c613216e63e5L,0xe699e51cc98908e6L,0x835d4cefafeac3c2L } },
56175     /* 19 << 238 */
56176     { { 0xd1cbe55ee5000eceL,0xc1a074b01ff0f474L,0xc6681f48d7ffb89bL,
56177         0x7c68011d48d0bb4dL,0xf305627bdcef5e07L,0x0f0e0c36323ee3fbL },
56178       { 0xc5c6b61355f5f185L,0x6e4de5af52d6cc84L,0xa64ea548889fe8bfL,
56179         0xc4c5e4104d28350eL,0xef944a8f7dd3072dL,0x7ed579fa13356185L } },
56180     /* 20 << 238 */
56181     { { 0xec72c6506ea83242L,0xf7de7be51b2d237fL,0x3c5e22001819efb0L,
56182         0xdf5ab6d68cdde870L,0x75a44e9d92a87aeeL,0xbddc46f4bcf77f19L },
56183       { 0x8191efbd669b674dL,0x52884df9ed71768fL,0xe62be58265cf242cL,
56184         0xae99a3b180b1d17bL,0x48cbb44692de59a9L,0xd3c226cf2dcb3ce2L } },
56185     /* 21 << 238 */
56186     { { 0xe646281876ba99afL,0x1d53bd27818b5992L,0xc55e135d67e1d81bL,
56187         0x32b9e37023e211feL,0x91ea63dc130b1176L,0xd7e1cc51a34fbb3cL },
56188       { 0x5363fd962fee934dL,0xd19c50ba0b8fd289L,0x21257825a11c27b6L,
56189         0x19159a966792c1ccL,0x0ccc3cac39a08fbaL,0x841cb58a45512d8eL } },
56190     /* 22 << 238 */
56191     { { 0xae8532c3224ab492L,0x8bc92c85f6acd0ddL,0xc071ba92b796d21dL,
56192         0x1290162943797a3bL,0x8f4c5fb5ec950329L,0xfab6f950cf0578e3L },
56193       { 0xb7b8d211bb6aa75cL,0xb06279dc3d1147f9L,0x060db1a7591820cdL,
56194         0x0e691a412830f356L,0xac00664224b8bc33L,0x579f9c052f17441eL } },
56195     /* 23 << 238 */
56196     { { 0xd8b9dcd50c4cb7edL,0x2f59d64c7619cdf4L,0x7e83d18e284bc6f9L,
56197         0x49af25123e415166L,0x90388976ccd64d11L,0x4708fffdfe2580b6L },
56198       { 0x7a8d25ff17dd4d8bL,0xba7785fefd71355bL,0x7cceb111b9789cc6L,
56199         0xa8fd782ee98d6b78L,0x8d1b7fb66135d4a2L,0x78c2267d35e382beL } },
56200     /* 24 << 238 */
56201     { { 0xf38995589311182cL,0x1bee4c4bb657a7b7L,0x0b1c4fd32df8d1a7L,
56202         0xf16bcc2376d3fbbfL,0xd5888916f4fd52bcL,0x3de6cfb4d5cde1f0L },
56203       { 0x764ffffdd4a07dfdL,0x5e674426e2642182L,0x34f64762ccd57b85L,
56204         0x2233a4c329351062L,0xdf076095d9c642f3L,0xac917a2c59f0df34L } },
56205     /* 25 << 238 */
56206     { { 0xe588d5a8cf2f7d4dL,0xb45923ee86798c14L,0xffefd323f0623572L,
56207         0x24dd7019005f605aL,0xb9e833053a6edaecL,0x039ed04949923a44L },
56208       { 0x0f83a74360789fd2L,0xb4f91a8e9b001515L,0x37b856664261ad9eL,
56209         0xc291caa68b92b7afL,0xfa0f8a5e67ba28e0L,0x362a6808c5eefb98L } },
56210     /* 26 << 238 */
56211     { { 0x8aee939cc64e4ab3L,0x3baac0a844621bb2L,0x9094a09629da9bc3L,
56212         0xa92dc70806d2314fL,0x45c1cd0e34235918L,0x51aeb007c34021a4L },
56213       { 0x58267735a3492237L,0xe8d494bd375eb21bL,0x664dacf5a395bf8bL,
56214         0x2ef1feb612cec40eL,0x90c5f43fa7141e5bL,0x93e80dd03855169fL } },
56215     /* 27 << 238 */
56216     { { 0x2e550006211b2fb3L,0x8c82e59d6cab73baL,0x011bb2fb2bd326b9L,
56217         0xfbd519ff1e0efd69L,0x0fb2f266320cec7fL,0x879e28c03518fac3L },
56218       { 0xd0887775e01294eaL,0xf6e60efd1df5bb0aL,0xb2a5d3a404d04a96L,
56219         0x915eaa29a4f3500fL,0xcb6c03f70db6bde4L,0xfee081a405f30cc1L } },
56220     /* 28 << 238 */
56221     { { 0x9580cdfb9fd94ec4L,0xed273a6c28631ad9L,0x5d3d5f77c327f3e7L,
56222         0x05d5339c35353c5fL,0xc56fb5fe5c258eb1L,0xeff8425eedce1f79L },
56223       { 0xab7aa141cf83cf9cL,0xbd2a690a207d6d4fL,0xe1241491458d9e52L,
56224         0xdd2448ccaa7f0f31L,0xec58d3c7f0fda7abL,0x7b6e122dc91bba4dL } },
56225     /* 29 << 238 */
56226     { { 0x24e2801364ca563dL,0x6f06fde270f8f91eL,0x9abcca1bd2a65c0fL,
56227         0xc5728ffca5aa1e40L,0x654f0f56eb9d3e45L,0xe04ada2394161a0cL },
56228       { 0x001b25626ddbc960L,0x253b447aef93504dL,0x895ce21e2d6dc894L,
56229         0xefb987381c1b63deL,0x6adb6eecde8b806aL,0x9ea3884e0240e7bfL } },
56230     /* 30 << 238 */
56231     { { 0xe8387f68411ad563L,0x98a962eacc5f157bL,0x8093a8d296090321L,
56232         0x240a73083790052dL,0x6cb4a7382e7dcedfL,0xda65bf8481a60e8cL },
56233       { 0x420ce478c66c70aaL,0x0e7959ec42da3021L,0x44bc9d3c7e35aa20L,
56234         0x36e49d764e9df39bL,0x7281073a9b286287L,0xd9a068422524b62dL } },
56235     /* 31 << 238 */
56236     { { 0x00d6e0312546247eL,0xcc2851020fdaebdaL,0xb8a453f15601006fL,
56237         0x0afaa3f138be7068L,0xc87acb442c6cd9f1L,0x10dd5d031ffd5fbcL },
56238       { 0xbae0b62fddacbbd0L,0x1daadc18446bf2e2L,0xaeaf15317ef0facdL,
56239         0xe7b92b76c941808fL,0xda59af2ae6d0dffeL,0x1c09b783e612b888L } },
56240     /* 32 << 238 */
56241     { { 0x3bd258d8775f516fL,0x4bedebd5c715927fL,0x5b432512e3f966a0L,
56242         0x338bfca7709d0c2dL,0xd142cc1049658259L,0xfabc6138636b8023L },
56243       { 0xa9ef94014d4ef14dL,0xd5917ac1c54c570cL,0xfd2f63c55cb64487L,
56244         0xbae949b11cea475bL,0xa45446031e67a25fL,0xa547abc1dc6a7a6aL } },
56245     /* 33 << 238 */
56246     { { 0x6c7b4cf344b880b0L,0x29da87760a388eaeL,0xf434d173fe9617c9L,
56247         0xaf67cc2ea47abf28L,0xe211ad37249d0eb4L,0x88d156e538bce76fL },
56248       { 0x60320c6dd58fa585L,0x7b352c39ebf09a7bL,0x9305dae8a31ce734L,
56249         0x70c35be89361cc3bL,0x6b8b71f8bcd14255L,0xd1b7963572a457a7L } },
56250     /* 34 << 238 */
56251     { { 0xd8d04787ef8849e1L,0x58adf044148375e5L,0x5b613ac476623232L,
56252         0xbd274d2f95d7e359L,0xd97acbd271576bb6L,0xd20bb2c34c7fc4b7L },
56253       { 0xe15465315f837664L,0xddac59b5fb4ce79aL,0x33fef5214fb36e08L,
56254         0x0467811045108b22L,0x0de6c7766dbe57bfL,0x456d765a25fea77bL } },
56255     /* 35 << 238 */
56256     { { 0x4d9838a32922b715L,0x3cd9fc0a6a7bb3a7L,0xb1bf28fc2247e916L,
56257         0x92dd22006f206a16L,0x8ea87d67b51256caL,0x2c535730b5a4bf17L },
56258       { 0x34da42505f584954L,0x72326fb8fefca748L,0x40fd9d09da2844a2L,
56259         0xaadaf71c412da037L,0xa62329a9aa6f884aL,0x1b6165e6726a8f8cL } },
56260     /* 36 << 238 */
56261     { { 0x2a2dedafb1b48156L,0xa0a2c63abb93db87L,0xc655907808acd99eL,
56262         0x03ea42affe4ac331L,0x43d2c14aeb180ed6L,0xc2f293ddb1156a1aL },
56263       { 0x1fafabf5a9d81249L,0x39addead9a8eee87L,0x21e206f2119e2e92L,
56264         0xbc5dcc2ed74dceb6L,0x86647fa30a73a358L,0xead8bea42f53f642L } },
56265     /* 37 << 238 */
56266     { { 0x39de72e225e62213L,0xd885c406a03a58adL,0xa63964b527e76458L,
56267         0x93f83239637c0becL,0x8c9e29b4ba556e65L,0x7d746448a6183182L },
56268       { 0x6dee01aa09a8eb37L,0x97289f2e757ffa96L,0x367ec50fb4785102L,
56269         0x200f77cdb3d07cd8L,0xadc7c000a581946eL,0xa2dba5e52c0b32aeL } },
56270     /* 38 << 238 */
56271     { { 0x95a5a7f0b203f75fL,0x9b574cfcb5df11f0L,0xbf5fe3f2dba4b4e6L,
56272         0x347a7bd7d0987125L,0x858dea6b09377a2aL,0x87cb1e66eea85d5fL },
56273       { 0xe7619b666146a0c6L,0x0012585a8a0bc101L,0x738e6589ea0ce92aL,
56274         0xf23547979a39b3f0L,0x666f3f5d6dc81167L,0xe569cc82fb06b0b3L } },
56275     /* 39 << 238 */
56276     { { 0xef0e64399c7677d5L,0x052bf027efc398c2L,0xa5d253cc515e4198L,
56277         0x7b915f07a71ce047L,0x56880ea2e177dbf6L,0x735dc74f0b5741d9L },
56278       { 0xa108632f0161a0acL,0x0c68765705e7e09eL,0x694e651e211709e0L,
56279         0x334e15e51d879a41L,0x6191d34260c2a603L,0x3a8ce0e6224234d7L } },
56280     /* 40 << 238 */
56281     { { 0x158d814db12c4bb1L,0xe52f75d22f0cf4faL,0xf106023e6141b59cL,
56282         0x5eb8b8ebbeb9d941L,0x1dd3972990cf579cL,0xb273252e69ee6efaL },
56283       { 0xe43a3c593e9947a0L,0xd605124f6c19dd01L,0x8090fdbd05c578b0L,
56284         0x8e6c535a622ff18cL,0x3600b0c257d12071L,0x6d026e5c78d001d7L } },
56285     /* 41 << 238 */
56286     { { 0x6e515f3608e33ad5L,0x3e320c5283512d9bL,0x171ab26a5ca1c452L,
56287         0xfb3061e874c97139L,0x7944644c9cacf3aaL,0xedc724f03687cfceL },
56288       { 0x7252d7590db9b5beL,0x625f17ed0eeaf1d4L,0x6b0b4e5e82e3c58bL,
56289         0xf03d7bcef0f2ecc3L,0x4cbaa878139a7580L,0x982e471672203e07L } },
56290     /* 42 << 238 */
56291     { { 0xa533f574e335d60dL,0x102b66fb2aa6855fL,0x7a57420c49946287L,
56292         0xe3bb702286f393c2L,0x1892642d04a41c49L,0x2c47ba38d44969feL },
56293       { 0x9068650444388ef1L,0xd94f6f131eaf6b54L,0xf81d8782f0b872e8L,
56294         0x7ced5924d013f6eaL,0x76ef63d307cd721cL,0x888646b36cba783fL } },
56295     /* 43 << 238 */
56296     { { 0xd2c858157ec1660cL,0x6c8988a3ee73763cL,0xd6cc562d5e80aaeaL,
56297         0x48f399d975768c58L,0x3189bf68af50c1c3L,0xa3f8d2df27dc372fL },
56298       { 0x99d6b416b8c7c529L,0x531707944406b1e6L,0xafb57933e3ac044fL,
56299         0x530ad3bab2548505L,0x791a290a977590caL,0xb0d07228646fd1fbL } },
56300     /* 44 << 238 */
56301     { { 0x636225f591c09091L,0xccf5070a71bdcfdfL,0x0ef8d625b9668ee2L,
56302         0x57bdf6cdb5e04e4fL,0xfc6ab0a67c75ea43L,0xeb6b8afbf7fd6ef3L },
56303       { 0x5b2aeef02a3df404L,0x31fd3b48b9823197L,0x56226db683a7eb23L,
56304         0x3772c21e5bb1ed2fL,0x3e833624cd1aba6aL,0xbae58ffaac672dadL } },
56305     /* 45 << 238 */
56306     { { 0x86d2f71530cf85afL,0x8e1b053cf7e634e0L,0xe79592f43a4e466dL,
56307         0x26752e8506985331L,0xfd098e83dff73363L,0xaa158e2c505ffbc0L },
56308       { 0xe45fa1cba0fe759cL,0x6e2f5989bc0d1491L,0x4a804eacae7210a9L,
56309         0x0e252f758a63f67bL,0x0d7600cf362a7df7L,0x795069bf6d5b2b18L } },
56310     /* 46 << 238 */
56311     { { 0x25f9f0fc0649613bL,0x109521f05d3005d9L,0xcce1c5b41feba4c2L,
56312         0x6a27cfafacda6021L,0x37ff83303ab6382eL,0x53c7ccb715ca79f3L },
56313       { 0xdffa6c9633611dd4L,0x7555cfd4352d3916L,0x2354bec62cbd44f7L,
56314         0xaf0044c54b0b500cL,0xe4835df7ce9aade1L,0x14e57f6bcb218644L } },
56315     /* 47 << 238 */
56316     { { 0xb5e26899b1c22bd8L,0xde12b0b51aaf3460L,0xc269595c31ee049fL,
56317         0x8c7513c88a73ed74L,0x8273018450cd009eL,0xb2cd2dec4d130b5fL },
56318       { 0x1a9015521971a189L,0x6ce23544c6f39bc3L,0xd76133aa9467badeL,
56319         0xf91173cc071ee7a4L,0xe54d8f44b8267c73L,0x5725e0676dc9aee6L } },
56320     /* 48 << 238 */
56321     { { 0x00e0a003daff1807L,0xcb9d155992c94fd0L,0x3c2b5c3dcebbf905L,
56322         0x9c799ec7d338afa9L,0x60b9908c4e2cfcccL,0x4bfe1a57ae3c6f92L },
56323       { 0x480d310efb116150L,0xa1ed6c31e3e7888eL,0x841a11d9720b5196L,
56324         0xcc337d178adff37dL,0x08c668265faa86c5L,0x945c90d49dfcc7adL } },
56325     /* 49 << 238 */
56326     { { 0x0fcc0854f2b3622fL,0x3a9e218ab6833f04L,0x209125d4ee8fc062L,
56327         0x98b2c628a3c3bf2eL,0x7e051fda83ca6a6eL,0x81afd3933d87981cL },
56328       { 0x8f3beaff4baf556eL,0x0f1b27fdcc7e66c7L,0xbf0b08f59f4a4461L,
56329         0x8eb739fa141985e5L,0xdb5b46112da43947L,0x63bf81cbe5cabfddL } },
56330     /* 50 << 238 */
56331     { { 0x355e40d398ff85afL,0x19f2f3c2b08f836bL,0x0a62d254737cb5f7L,
56332         0x5d0ef7d9f8c50d82L,0x773a399ebbd70eb7L,0xac357974a70bea8bL },
56333       { 0x1de5a45cb3b5d794L,0x67c58b52a48b55b7L,0x724f56f4b02ebc8bL,
56334         0x03dc71e3154ad508L,0x9bcd3939cc84428aL,0x7fdba978158c4a0eL } },
56335     /* 51 << 238 */
56336     { { 0xac08e06e65b93d44L,0x2397625a5358c691L,0xfbc9285a8516e31aL,
56337         0x38ce0d3544ffe25eL,0x13381dd16414072bL,0xf782fddc170ecb4eL },
56338       { 0x78c71a716f815259L,0xb725870573659a85L,0xd37678008712d968L,
56339         0x153d8aee3eda5006L,0xda4fd94818f1439eL,0x6384135352dbfdf8L } },
56340     /* 52 << 238 */
56341     { { 0xce92224d31ba1705L,0x022c6ed2f0197f63L,0x21f18d99a4dc1113L,
56342         0x5cd04de803616bf1L,0x6f9006799ff12e08L,0xf59a331548e61ddfL },
56343       { 0x9474d42cb51bd024L,0x11a0a4139051e49dL,0x79c92705dce70edbL,
56344         0x113ce27834198426L,0x8978396fea8616d2L,0x9a2a14d0ea894c36L } },
56345     /* 53 << 238 */
56346     { { 0x06d57f2920514206L,0x61394b863a2cc1ebL,0x0ffdf49a86c7b2c1L,
56347         0x65334e9349f58f13L,0x180b10b8c08dfb05L,0xec352adef6c95b7aL },
56348       { 0xf9801dc0c4bde0faL,0x428c77f0dabf0c66L,0x2a7d1bb0c2eb80d4L,
56349         0x81774172fdb56fabL,0x7507481f1d965515L,0xee0693bb8ebfadebL } },
56350     /* 54 << 238 */
56351     { { 0xf4589418ac56a031L,0x21f3dec6f2718a10L,0x0ed08d9690f28b6fL,
56352         0x2624bd7a35c3a6a3L,0x1b3f02e8bba795f2L,0xe629b5aa3977fd17L },
56353       { 0x66c8cd7691e8df1aL,0xf36c4e2c1b2b5542L,0x7f6b742f7dff66a7L,
56354         0x00bc68b8242e0fc2L,0xdff5c73360119d9bL,0xe726260fb5c4dddfL } },
56355     /* 55 << 238 */
56356     { { 0x0242fa358eeaa549L,0x2d081bcf8abc93c6L,0xaa31813c55551d40L,
56357         0x1cf21c1271db3aecL,0x5a6dede7203880d9L,0x389c63cabe4aaa9aL },
56358       { 0xff4db7d4bf28086fL,0xd89c039b33146844L,0xc2b32bf06df6f790L,
56359         0x7f4e836b9f22fecaL,0x3f64d0fa0af51572L,0x681a1f5bc67aa565L } },
56360     /* 56 << 238 */
56361     { { 0x9f9ac9608e2941a6L,0x43e7ff902fc4fe1eL,0x5ec413596033e041L,
56362         0x5ce791c46f6ff0f3L,0x8d134b899d907343L,0x7bd15c7786304df2L },
56363       { 0x2cd2ebc777c4a913L,0xcd86a39d45f07153L,0xe7e12d2e88bc423bL,
56364         0x478e814b0b3163f4L,0x78bd9c8abe8ec766L,0x6a5763e87709ce48L } },
56365     /* 57 << 238 */
56366     { { 0xb503ac624329d7f4L,0x3a900374488e3ce4L,0x8a11addab0d8dc97L,
56367         0xbea3ea2c0873bdf8L,0x0f57130115bc7adeL,0xbc98d2070b2b69a0L },
56368       { 0xaefc4047639d182dL,0x0e6db26feb3c44eeL,0xaf0f8b392a68a48dL,
56369         0xde65a6b36bf1e593L,0xe48f8fc989dbd38aL,0xad18a43bd8d285b3L } },
56370     /* 58 << 238 */
56371     { { 0x249d86007e9d48c8L,0xec6109ba109a54bbL,0x64f688af5ac65ad4L,
56372         0xb12c85b4be1796baL,0xcc258d31c9940da0L,0x59590853ff2f151bL },
56373       { 0x9e9edc4d401c5d1dL,0xdd9ad117f230b458L,0xc2c752ac962334b6L,
56374         0x3fab66ce27327e6cL,0xa363d3643816a47eL,0xa6fc57bec180bbdeL } },
56375     /* 59 << 238 */
56376     { { 0xd72dd5893ff345d5L,0xf87c17ae41e1d287L,0xadadbf525964d55fL,
56377         0xecc7f27af8b07db1L,0xa2dacfce6f2aa320L,0xc7936da72aa3f228L },
56378       { 0x2e9e6058fa504b87L,0xf2df43279d0f0634L,0x90d5ee22a4b768c5L,
56379         0x1ea9bf0b5b46ea84L,0x792370f45cc41770L,0xfd17823176c1a3f5L } },
56380     /* 60 << 238 */
56381     { { 0x4f1e1254604f6e4aL,0x4513b0880187d585L,0x9022f25719e0f482L,
56382         0x51fb2a80e2239dbfL,0x49940d9e998ed9d5L,0x0583d2416c932c5dL },
56383       { 0x1188cec8f25b73f7L,0xa28788cb3b3d06cdL,0xdea194eca083db5aL,
56384         0xd93a4f7e22df4272L,0x8d84e4bf6a009c49L,0x893d8dd93e3e4a9eL } },
56385     /* 61 << 238 */
56386     { { 0x4c124a904190257aL,0x09002f52347e517bL,0x2e9b69a1e5760993L,
56387         0xbaa49e53e26672bcL,0x9468fc3bf7820190L,0x637bccfe1f955328L },
56388       { 0x16fd33f26e0aa088L,0x9391550757b2b2adL,0x85e98842e9a0ace2L,
56389         0x8e2bd52b4fa787afL,0x8a86bd85644aeeacL,0x63490956c2814734L } },
56390     /* 62 << 238 */
56391     { { 0x5e902fb3063b3517L,0x0cd006cae5a65212L,0x597bd7804591c4bcL,
56392         0xd853d81be17c1d3dL,0xbc4bf68156e5d24fL,0xbc801615d26b5ce5L },
56393       { 0x1ffa5cd5caeecbe7L,0x16ec32a4b0203156L,0xaaad43269a857672L,
56394         0x0606ebf9189c6f6dL,0xb90730bd57e476f2L,0xed8d82b1d492fb05L } },
56395     /* 63 << 238 */
56396     { { 0x69a2a9b6ff824814L,0xe7b716e7c35c5da3L,0xb6781a5e9a5fde1aL,
56397         0x08bf695dc072e1b5L,0xaadf71462590a817L,0x490297f9c755c83aL },
56398       { 0xbd9fad6191c29990L,0x87b3abc226b6cb9dL,0x6975d59865fd0b64L,
56399         0x0fdc5267f4257158L,0x9f3e10585877bbdeL,0xb7f4cfb04297a2d1L } },
56400     /* 64 << 238 */
56401     { { 0xd699ea2d8d095606L,0x3cd080c51e0ddd3aL,0x46604bad66a8b35bL,
56402         0x0c779b624233fccbL,0x578458acbfd3cf0cL,0x6820f66596bf57afL },
56403       { 0xa9724245bf1f302cL,0xbbde24da277a6c3eL,0x0980a5b8c6be8c14L,
56404         0x6230e3ec774d62c4L,0xda1467d84fbde24bL,0xd9d68d07cc862204L } },
56405     /* 0 << 245 */
56406     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
56407       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
56408     /* 1 << 245 */
56409     { { 0x67c516347378f90dL,0xbc201a7966647082L,0x77fcc8dc9ee450cfL,
56410         0x8dd2b318b41a3e2fL,0xdf6a935e93bf0689L,0x75edabf3a92e5464L },
56411       { 0x49afcd9f604d208aL,0x372f0ea7d465ca48L,0xcdbd8ad2c7ea7810L,
56412         0xfe61571e550822b2L,0x744a4f9386606adcL,0x6beb3c9cd9d4e110L } },
56413     /* 2 << 245 */
56414     { { 0x1fef389ce700b9f2L,0x63029466425bc8abL,0xbd770a1437f04a33L,
56415         0xc7438e29d0169369L,0x6b265742e2377cc3L,0xdf24bf96c369fa4fL },
56416       { 0xdfdbcf470ad94e08L,0xd101b8617f75a7dcL,0x5574a0b82a9c483cL,
56417         0x0563fe942de43228L,0x58ca0e8aead1fabeL,0xdc3d9a8466023966L } },
56418     /* 3 << 245 */
56419     { { 0x383bda07c3fd20e5L,0x9619b1df5c29449bL,0x6f3c717d369f39bfL,
56420         0x1bb593d11a5a3900L,0xd0f07ecc2aec6c2bL,0x9d72eb2a4240b202L },
56421       { 0x35342f6cc50e4a0cL,0x701b46626b93bf61L,0xfcd6eb09ccb6a888L,
56422         0xabb7a6f785aa42c5L,0x952f8824aa4e5895L,0x49860db85c406582L } },
56423     /* 4 << 245 */
56424     { { 0x3667a7203955812bL,0x0d73483b284d1dacL,0xe084535efc62f791L,
56425         0x5bc1652b389faf7fL,0x40cf51683a71b7f6L,0x8a4b19fad4f39703L },
56426       { 0x823e754a2a8eff13L,0xf01b2021bffa5afcL,0x5639ee027225b319L,
56427         0x7533bc86fc282f16L,0x710009d2c69f61aeL,0xe30c499dbf65e803L } },
56428     /* 5 << 245 */
56429     { { 0x0da7ac1b734b4ec3L,0xf47fc1d012a2afbeL,0xbbbc99be87dce4a2L,
56430         0xf7264b4edd5c6378L,0xe9409305f618ffdcL,0xafadda9bd1846ac1L },
56431       { 0xe734f9d0a21850d4L,0x199cb44f8722a316L,0xcfe8704b38cae89fL,
56432         0x2db1e56b6b151b57L,0x116ca5cf69ce7b2cL,0xe9b8625f57de97c8L } },
56433     /* 6 << 245 */
56434     { { 0x18811bd5af247c49L,0xbc180793e124dbdaL,0xed978d3a21234fc4L,
56435         0x516dd9a70616ae15L,0x8f80677774e430b8L,0x9094256906e8fc49L },
56436       { 0x4ca03fb5a4e61235L,0xb91de709b617f361L,0x0898d82d0ed08bc3L,
56437         0x2bd712368cb08146L,0x45b92d45e213176dL,0x05894791f2bf5b9cL } },
56438     /* 7 << 245 */
56439     { { 0x0d79cb892695ea2bL,0x2cb0f8dfc88e538aL,0xc1b8dc3da80f36feL,
56440         0xd756fa6684f00cc2L,0xa6f1cdec9cb9efb2L,0x5c3f15a8a6a21818L },
56441       { 0x9a7ee3516995d09fL,0x88885463d70434bfL,0x18cecc6d4f7d5d33L,
56442         0x3f0138866b353bd1L,0x53bf798b0d9ad368L,0xeffd465a28dbc3eeL } },
56443     /* 8 << 245 */
56444     { { 0xeb29e44cb5d98ac1L,0xe47e57f80e227a4fL,0xd09c04943d2bf688L,
56445         0x3ab7799a47428dd2L,0xdc558d6be9aafac8L,0xc042c4cd87f9f6e0L },
56446       { 0x93842bcd89fb4693L,0x62dbc82f7068fbf7L,0x164552687e6d47b5L,
56447         0xab304b7a4c37eeeeL,0xdbb3d4e13fc412ceL,0x4f65dad0a726a2c8L } },
56448     /* 9 << 245 */
56449     { { 0xb25e01b2605cdaeeL,0x74abec55bc57969dL,0x9c57bfabcdd9d41aL,
56450         0xa3330e3f4a9e32a3L,0x5929a0d8e5792fd8L,0x830b4ea271ea2cdeL },
56451       { 0x80065ac1fd06d246L,0xa2b416e632e64a25L,0x3950bde7c0c927a9L,
56452         0x9951f3bd679d9b8cL,0xc235a274651b6855L,0xbfe5e08e5ad97bc1L } },
56453     /* 10 << 245 */
56454     { { 0x4409a5b6744ae145L,0x5e83fa0b7f620908L,0xfc489bec2e140aa0L,
56455         0x5805a462e3cae337L,0xe56e9ff7c2211c21L,0xb722f2b40c955362L },
56456       { 0xb098a32f41371f33L,0xe6cceceabb4923d6L,0x1cfbe2b3d82a311cL,
56457         0xcf9428936b98f917L,0xd60dc62492ef848cL,0x34af446e5adb5228L } },
56458     /* 11 << 245 */
56459     { { 0x0eb7e743796ce1caL,0x138653e5d851377cL,0x69c7c86f2b11c8e0L,
56460         0x878ec1decdf2b205L,0x03e6688aae0e8562L,0x20810666935a36a8L },
56461       { 0xc8ab7c7f26635c50L,0xe75cdb06744a21dbL,0x4e26f32fd720e198L,
56462         0xa1c6395ad8cded81L,0xb75dc6ea6ce4fc04L,0x71750b33004623b5L } },
56463     /* 12 << 245 */
56464     { { 0xbdef84077e60c447L,0x88570f712a65accaL,0xef3d4a400bb6aa79L,
56465         0x5c9d189060212976L,0x80179ea21d96c43cL,0x3f002e6d53d2948eL },
56466       { 0x14b2cc9149d78183L,0x7a549c71b496c279L,0xf4beac3f44995f6dL,
56467         0x5a34239800bc78feL,0xa874dc1b60e42da0L,0x3a984010cf5824d5L } },
56468     /* 13 << 245 */
56469     { { 0xe514ee06dfb9760cL,0xb8862d7577b8951fL,0x0144676ef8ee1141L,
56470         0x49561a3002eb3e82L,0xb3541c154ff9f897L,0x1670edf0a7a99791L },
56471       { 0xd41d603564aea7f9L,0xf66ffd092b3463b4L,0x0784e015c3b26fb6L,
56472         0x88edce33ec46f8c8L,0x1b1e25a3b6381011L,0xbfaadc03ff95ab97L } },
56473     /* 14 << 245 */
56474     { { 0x727a59fe0c7be4e1L,0x75a7d5e3f58ced15L,0x146fc0d990f569e7L,
56475         0x94dbccd2b7f1dc54L,0x0df1ef90b75bf232L,0x2943a082a2568190L },
56476       { 0x75f2f80d67837b06L,0x07e3506f24b44b6eL,0x7c30829ad0d2231bL,
56477         0x9ce577ca93277abfL,0xa19d1868b17549ecL,0x0ad6ff5525e8c4d7L } },
56478     /* 15 << 245 */
56479     { { 0x16b38dfe1c24d075L,0x3acd4c36992959f6L,0xdaf2fe88ac2da7abL,
56480         0x76e8ff0e89644935L,0xb8547c26e85f7076L,0x9f149faa1cdea7ceL },
56481       { 0x181a60729e125d84L,0xc4aef9fa18751ce6L,0x451c84660e00f00aL,
56482         0x662b3e7ac4e3e6b8L,0x57b7114ec6b64507L,0x07aeb1980b37fb70L } },
56483     /* 16 << 245 */
56484     { { 0x79d88e004516234aL,0x98dd3cb931f9cedaL,0xb528000fce7d606eL,
56485         0xc773557e2fa27fd3L,0x55b53dd3e19436afL,0x675084b3e10b64c7L },
56486       { 0xe583266556d56374L,0xf8f7fd2a307e2e60L,0x7b93bf537af3e3dcL,
56487         0x94fafa2cf47d298cL,0x94c2ff9a21121369L,0xa41de95f33468ff6L } },
56488     /* 17 << 245 */
56489     { { 0xebbafd4720f25aa7L,0xe2becad71ac444bfL,0x323356a092a944b8L,
56490         0x32feccc0c9a3cec9L,0x15ec3aaf5f9e96c1L,0x852142b5c12c8e62L },
56491       { 0x098ffcbf2b6865f1L,0xcca470e8733d7741L,0x0f8c0f5271945bf5L,
56492         0xfb654f6a08068827L,0x3a9e7d742a0e2829L,0xb90742b04b687763L } },
56493     /* 18 << 245 */
56494     { { 0x145afb651fdb2a7bL,0x93315b684eff5eadL,0x0cad1d20e40ca999L,
56495         0xda9b517a379a8173L,0xacb665780ca018cdL,0x1e9d919f481969b4L },
56496       { 0x5c9a058d68130364L,0x872e26620a62ce5dL,0xca598848acaabe54L,
56497         0xdabfcee18aa048a0L,0x16198d034ac52a57L,0x72eb5ec632b6d102L } },
56498     /* 19 << 245 */
56499     { { 0x13f2e1726a0c96e0L,0x55aed9e02d6b6f05L,0x3c919ba3bdce76c0L,
56500         0x647a525ffdda39aaL,0x5c0dbecc01a9011fL,0xa537ba8d9fd9dcefL },
56501       { 0x8472e375cff62467L,0x57672311ed5adf05L,0xd1e178dc6a423de3L,
56502         0x3ebcfe18d3ad3ca4L,0xb8f341d7ae802c11L,0x3f14c424ecdfdb7bL } },
56503     /* 20 << 245 */
56504     { { 0x381e0a136e4d2e42L,0x2f2a4ee183c0d752L,0x50d4647fc8e6532eL,
56505         0x7e210aeeb4e7495dL,0xfd147710bcd142a6L,0xddddb07b06429213L },
56506       { 0x63e06fc64548a6b8L,0x05d9b825904f92a6L,0x4b63fdbf9988ee79L,
56507         0x6cfa412f9b3366bdL,0x0dd5fe3dc8c61f51L,0x3ec77027be8e047eL } },
56508     /* 21 << 245 */
56509     { { 0xea7d01cfc7d81791L,0xfa6c0fe6e2264afdL,0x53c7eea363651291L,
56510         0xe58f8411f2d90f92L,0x4919b4c61faf0e14L,0x0c7dcd07148e98a0L },
56511       { 0xf9ef44cebc8bd43dL,0x3acfb6686f83cfb4L,0x34130e18f883693cL,
56512         0xda9ed2ae2d236c3eL,0xf54da64cc75cabdfL,0x1c3df906cc01722bL } },
56513     /* 22 << 245 */
56514     { { 0x686796c68d8f2286L,0xe0efaf9334d7cd1aL,0x84f9237c93b23708L,
56515         0xcb50cc8ee47f5161L,0x498b81e71f597821L,0x3c3f33e1a491079fL },
56516       { 0xee300c6dc69d1bc8L,0x279760e734778389L,0xe00ac0eb2bb8ed78L,
56517         0x9bf9a10e765c8b5dL,0xc7e95c0cf8c1e909L,0x3721300ae6e63ea5L } },
56518     /* 23 << 245 */
56519     { { 0xc03ad784d8dfd7aaL,0x671384a64b065a2eL,0x9b21e9e7bed74e87L,
56520         0x153b606cf889f75bL,0x7345c62a2aab6562L,0x270e4f445960cb4cL },
56521       { 0x515909fb885f0f88L,0xe43ee4f7067a7928L,0x5f906fc8fc182e56L,
56522         0x297ad5770641d0d1L,0xdcc45aa1d1b188b4L,0x8c817fb2ef062a39L } },
56523     /* 24 << 245 */
56524     { { 0x91e8c992044637f0L,0x01f7838827ee8e8fL,0x7c5e3f6dd095f5b9L,
56525         0xed7522fcddf3cad2L,0x80bb87056c57aacfL,0x495480b00cc5ff51L },
56526       { 0x964def7f04da2565L,0x8b0d0fe3afa72140L,0xcc75192584de66a1L,
56527         0x9acaf7fe075f07c5L,0x6505c2f81eeade93L,0xa2f35aa00e3cf58fL } },
56528     /* 25 << 245 */
56529     { { 0x1ad38a2d80548b22L,0x4d6120df47a37b3aL,0x6d64ef8c23e33cb7L,
56530         0xa1b5f51723c14ca6L,0xd2cdd425039a8e83L,0xa0a359ae229dd2dbL },
56531       { 0xde0788166c2779afL,0xd960453362d2abc2L,0xc5c48b20707c0e4dL,
56532         0xe452debd691c5407L,0x35c37ca882b0a299L,0x5b263014da3cde7bL } },
56533     /* 26 << 245 */
56534     { { 0xde34fa4586330487L,0x8391248153f61e6bL,0xd3f8fe742d04958dL,
56535         0xdade250f6df77d09L,0x3a3a16175649d9ebL,0xf9b77847a23abc74L },
56536       { 0x31d45db63b2e2c8aL,0x311ecc24f61a7bf4L,0x206029f9c56eab17L,
56537         0xb9d9ff35878c672eL,0x0d268c160fbf2d91L,0x2474b527a45f58d0L } },
56538     /* 27 << 245 */
56539     { { 0xad8e84be8436beaaL,0x8f07eee4209eb5d3L,0x47cba1d83ee61bddL,
56540         0xa081f21f72018544L,0x5dffddf493d88d16L,0x539a79efcac3952aL },
56541       { 0x990af57791bc452eL,0xb139d7d5012f5c6aL,0xf818c9f3fb180417L,
56542         0xeeb2d08475566152L,0x287571253f5d4ec9L,0x5a26505daa959798L } },
56543     /* 28 << 245 */
56544     { { 0x6536834e11b0f7b6L,0xcaa5271aad46c10cL,0xb5b6ead1fab43763L,
56545         0x25bf402ff7f7d8fdL,0xf33fb223e19374b4L,0x183ae9b75f348172L },
56546       { 0x1783c235078862a0L,0x9981a6c33cd368fcL,0xf58d2274fd627f9fL,
56547         0x37ac9c265c5e71cfL,0x167c8d047b0f157eL,0x24f522f8eefc7d85L } },
56548     /* 29 << 245 */
56549     { { 0xd25aeab3926cc973L,0xb3e2cffbdfc2cfbeL,0xdd259ed1de742b6cL,
56550         0x9d77c94e7b98bf81L,0x90f9067cb0ead3d1L,0x148f2a192a93fec1L },
56551       { 0xbae3c543c2850153L,0x0d330d758910422eL,0x06f80a9efa670474L,
56552         0xac6cee9f038431a3L,0x4900d17f5c22ee99L,0x62de04aa275a9774L } },
56553     /* 30 << 245 */
56554     { { 0xb6eefcc55f87fb35L,0x9766873b4371415aL,0x308337bd16b058bbL,
56555         0x6d5b1ddae1ac3884L,0x9307aa0835c4630aL,0x22cfcc0c23e91988L },
56556       { 0xbeb3814c37db0207L,0x19ab212fc4bbaf5bL,0x0801a1cf21abf22dL,
56557         0x9e6862cb3bd07332L,0xaa12ba0e4319929aL,0x0da45831f540f97dL } },
56558     /* 31 << 245 */
56559     { { 0x67d8ac9484bbf927L,0x7dd04e4e4ea01d33L,0x24ea6386f13def66L,
56560         0xa8a1acbe28f7f5f0L,0x5f578ffecc84c93bL,0xda8fe295f4ad116aL },
56561       { 0x4b610ae48483347dL,0xcac5c5596255f9e4L,0x19a0e043abcfe47bL,
56562         0xcd0cc9493966784eL,0xcc59a36743279291L,0xaa504087802961b6L } },
56563     /* 32 << 245 */
56564     { { 0xbe45d81a1b270599L,0x50696e7d97d6c603L,0x63c5a516b078ea89L,
56565         0x9f3efe41b4464764L,0x84580e24101e5232L,0x00850a1ac8ae8220L },
56566       { 0xbff4077ded55c404L,0xd74de734f2e7bf50L,0x4df4eef207e1c03dL,
56567         0x4ab3d0396e654d58L,0xb20056cd086f1596L,0xe4d08a278acd7cd5L } },
56568     /* 33 << 245 */
56569     { { 0x5510cebfe354510aL,0x48925b9349998c9bL,0xa05fc961e6d707a0L,
56570         0x85bf38f866ebc93bL,0xea637045254e615dL,0xae25e2e740d8459aL },
56571       { 0xa98583176efafd1dL,0x863931fd5a51c4b6L,0x3810d732d4221708L,
56572         0x959a2f70762a30f3L,0x7bdbaff9420ad3acL,0xba41b20bebdfe90eL } },
56573     /* 34 << 245 */
56574     { { 0x5e4d3280d3171eb9L,0x3fb715851bc65c5bL,0x6558962a901a899cL,
56575         0x78b7cd3e7851462bL,0x21228419ca8f6495L,0xfd8d8f9b2d8be765L },
56576       { 0xe5e90b92bc562144L,0x4f1f7ca1ae3243edL,0xd20178cd0985f4e4L,
56577         0xe5be263304253cbdL,0x1e34141c0d348fadL,0x0073fa0dad0eef45L } },
56578     /* 35 << 245 */
56579     { { 0x922ddb84d403f20fL,0xf7bccbb54681def7L,0x81a1200f6b580442L,
56580         0x64901025dc2f9884L,0x3746675aabe78edaL,0x3e750369aa6f005aL },
56581       { 0x140477ceeb00658fL,0xc76a320ccf89be62L,0x00761f21658c127fL,
56582         0x669186dfb8b6b03cL,0xbcdf1c36dcb26a2aL,0x94a7aba5da876a56L } },
56583     /* 36 << 245 */
56584     { { 0x1872f65c26163265L,0x9fbaf44fda52ad9cL,0xbec7addeeda47d38L,
56585         0x6a04dc3078094f9cL,0x2c73b8f15f4498e1L,0x504909efd4fcfcb4L },
56586       { 0x747efbc6b6b3a63bL,0x856e276de0dadd96L,0xa22459aaae3be3a4L,
56587         0x9ef59e732294a854L,0x0717d4e5d0e36205L,0x5a6afa3eb734cdf4L } },
56588     /* 37 << 245 */
56589     { { 0x6bd8fd330e938950L,0x8b26d7fa0f20c4f3L,0xd29a1121e0604d4eL,
56590         0x23d1cae60711c191L,0x460af39d51914cb2L,0x9cd04208547463c1L },
56591       { 0xeb80d70e493b7a0bL,0x182568869171652bL,0x9f3007ad76ca8b21L,
56592         0xf9bdeb4664ac10c4L,0xdaddd584284ae80cL,0x5c7ea28a0022abfbL } },
56593     /* 38 << 245 */
56594     { { 0xaef75aa7dc3c897eL,0x98bab5852e6432a8L,0x522b383d83fb0ee5L,
56595         0xe0d8620f056a8589L,0xd63525dd39352633L,0x74362bbfaeb985dbL },
56596       { 0x11419f4e8c0f17feL,0x3ca918b0494ba972L,0x39f2bc3c6e074e25L,
56597         0x3bb66618fbbf0d60L,0xee60c8f88579fecbL,0x916f3fe92a9b905fL } },
56598     /* 39 << 245 */
56599     { { 0x14ed31b6482b668dL,0x8e3e10db5b65978bL,0x72ff92eee8011bafL,
56600         0x5183d0bde1143531L,0xdb628188f9c740d1L,0xd23cb9c57570e3d2L },
56601       { 0x9e893cacd2745832L,0x49762940ef4a2b31L,0x02f6f892324361bfL,
56602         0x332e089dd7a881bfL,0xe9303153f788f52dL,0xcd6d15564e7f1bd7L } },
56603     /* 40 << 245 */
56604     { { 0x8caa623d408b62b7L,0xa58aa0b0c0272b41L,0x089af856ee285bfdL,
56605         0x77b461f6d0674ecdL,0xbaa9d9b38d6f6612L,0xa8f26e12590669f8L },
56606       { 0xb164340c5ebb5e28L,0xfdc11f7401ea89a8L,0x73c03b9176e4346eL,
56607         0x6a678eb17caad5fcL,0x103ff0790a87803dL,0x25d6fd2af7430a94L } },
56608     /* 41 << 245 */
56609     { { 0x72cc0aba66116d84L,0x642c88681039c0fcL,0xaeded9e6d96a7423L,
56610         0x4ff4163ccc5fea03L,0x180e4d3616483ec5L,0xefde910a7f6332c1L },
56611       { 0x8042696283367060L,0x4edce3e8c28af356L,0x2452e4de965139daL,
56612         0x15129fd9547477a1L,0x7f628b5ed80998cdL,0x7c56d44541054b54L } },
56613     /* 42 << 245 */
56614     { { 0x4c3f81184d3d9da9L,0x332072f9e1e71487L,0x8cbf7284759ef371L,
56615         0x3d13d85cb98ce007L,0x507b467f980f4fd5L,0x9853b98bc74fdfdaL },
56616       { 0x94b81534993f5e19L,0x316b761beeca71adL,0x09820a2331c04080L,
56617         0xc71a9bd4420e3114L,0x569f813822ea67ddL,0xe3ec5d2b3a41b079L } },
56618     /* 43 << 245 */
56619     { { 0x6085b24a19bb6f27L,0xc2f18e8f64dcb82dL,0x8ff89ed91fd3888dL,
56620         0x9fbe31db0e525a5bL,0xd52dfb5df0527573L,0x90288a3f703193c3L },
56621       { 0x87bb5d30bb1ce380L,0xb6c9a4c9f0dcf59aL,0xcbc52966aeb86e7aL,
56622         0xd151178a9a1636eeL,0x48342994e4b48c74L,0xe5bced925af80bc2L } },
56623     /* 44 << 245 */
56624     { { 0x106882534918179cL,0xdeb69dde08143b36L,0xfb3c527b992363faL,
56625         0x11d05e93e9393832L,0xe3249558383a0f59L,0x2d0f3e11c234ab5dL },
56626       { 0xd50a30d95c599ae7L,0x6d7abc6ce9f98316L,0x3d190629060ab6ddL,
56627         0xfd58473c81d69afcL,0x841193d24b782d62L,0x4f72696da771226bL } },
56628     /* 45 << 245 */
56629     { { 0x288895d056e467a5L,0x78166a95e025a5b3L,0x89df640e895835dfL,
56630         0xdc2b61f483dcbc50L,0xbeaa7363110dd6a0L,0x2346a2a5e7fdbe3fL },
56631       { 0x379ae5fb6947a9c4L,0x9dcf01956370a372L,0x34c3c6c3d70d9a24L,
56632         0x98ee14b7fe6a3d0aL,0xdd37708bba8ce5baL,0x785adb86a15c3672L } },
56633     /* 46 << 245 */
56634     { { 0x4c93de89c5ff194aL,0x56aef366fdc94109L,0xc8cb2a0c5b0b23d4L,
56635         0xd73f1cef587ada16L,0x7138315a364b1463L,0x43940ef59f6bd411L },
56636       { 0xad068e490f4a533fL,0xe8a772a33c7dac91L,0x74b815fc107998b8L,
56637         0x4b8fa9db92699ee7L,0xfb2de4bf4cbb023dL,0xe5833a390f67c29cL } },
56638     /* 47 << 245 */
56639     { { 0xe985acae7fc4fa91L,0x7730e38ec66c4282L,0x4b971449f4bda67dL,
56640         0x55261be02b001f47L,0xccde0c7126d0d8e6L,0xa7ac56fd701f6febL },
56641       { 0x2488b28552642a53L,0xeada397c58fcfabbL,0xa3fc0452b679b0e3L,
56642         0xd0ef09ffec2e921aL,0x9fcfd991575fb70aL,0xf4adcbbb366cb10dL } },
56643     /* 48 << 245 */
56644     { { 0x517075af5faa0cb7L,0x400a22c1efaf68f4L,0x320ce9493b86f639L,
56645         0x511565717f296bf4L,0x0919607a96108276L,0x4fcc39a02f035900L },
56646       { 0x5d13de7cefb73f3fL,0x19d725c5081c38e3L,0xf1b28089c0f58697L,
56647         0x2adcd1a30ca7ca20L,0x96c07f42c21e1be5L,0x94d28cacbaa0aba0L } },
56648     /* 49 << 245 */
56649     { { 0x0ff4983fd64cfa4bL,0x2c49c4918c55942cL,0x6093eb7f98eb20baL,
56650         0x1b33296a060497baL,0x32776a53c92d7b47L,0xf367e6b25241de3dL },
56651       { 0x711119813b65228eL,0x2e5dc541e1394451L,0x940a4a0f98ef33e5L,
56652         0x1a395be32cd4315dL,0x4d49469f3c2e20e1L,0x5384f4b95c314f95L } },
56653     /* 50 << 245 */
56654     { { 0xdda2f3a0a256813fL,0x4363d190ee6cbae0L,0x61f4d607930d0094L,
56655         0x6767ff4817021739L,0x8450091bd2c5fadbL,0x144d02fe870710a8L },
56656       { 0x73f45d9035524b7bL,0xccc7856b04615373L,0x0eb5cd436f081dfcL,
56657         0x9c433cbfe3a70d59L,0x9ee70f509818349aL,0x16de27347241c634L } },
56658     /* 51 << 245 */
56659     { { 0x02a24c5cc47f7db6L,0x519242cd33d60e1cL,0x543f39cf7244a636L,
56660         0x4ae15d698deb181eL,0xbaec81ef44261806L,0xe5cb18bb5fbf13abL },
56661       { 0x7534787a032158e7L,0x770e1e34da0d9a6aL,0x251bfa7158f9baccL,
56662         0x12663214c8d39905L,0xb7bfa81b39c3d64aL,0xd6d439ffe3ee296cL } },
56663     /* 52 << 245 */
56664     { { 0x192ecf72d0aa048fL,0x23af774063e40c0fL,0xe4d98e41d804d367L,
56665         0xd868cc885405bfc3L,0x96909a5b6f6ece88L,0x16b05ad2bae60dabL },
56666       { 0x7382a1dbde621949L,0x569bb6c9c47cf6dcL,0x892da43e1f2d098bL,
56667         0x6bd959b9bfa25649L,0x90617c419cb48f9eL,0x36059b73f110b22dL } },
56668     /* 53 << 245 */
56669     { { 0x1817b140791af82aL,0xf4a44cde042870c5L,0x60b8414ab5c0405aL,
56670         0x3b00f5ddf4dc4a9cL,0xa61aa0cfea81dd5bL,0xd43c37422554907dL },
56671       { 0x3fa264a620569ecdL,0x2cc69c2ba5a46190L,0xecd4f6d3dddd072eL,
56672         0x41083b72dda8de01L,0x4bc047f110d6f156L,0x7164b432cac3203aL } },
56673     /* 54 << 245 */
56674     { { 0x7e7e08f401d45bfeL,0x04f9c9ed0e2d17e2L,0x3213556fa55bc148L,
56675         0xc58983c734449f0eL,0x463217afaf2bb219L,0xe08a51a2f8fba72dL },
56676       { 0x2f44991e974d51f0L,0x15f2171f3f12af56L,0xbcc919de24cf01f3L,
56677         0x9ea371f269399bd0L,0xae8a8eca3ccf4574L,0xf0535b83ae499429L } },
56678     /* 55 << 245 */
56679     { { 0xe9ad8928f72305e3L,0x4144b6b9fce1295cL,0x672732a0c3487eb9L,
56680         0xf19d09a6147f70b8L,0xf45f6a11362a7684L,0x84ce4f25adfbbdadL },
56681       { 0x31e4bb0ac3403b48L,0xefc861b9b478ab38L,0x3323df44a8320c49L,
56682         0xa2838aa1ed4f14abL,0xc80e30cc63bf7df7L,0xdd2d5ef9f15ec5ffL } },
56683     /* 56 << 245 */
56684     { { 0x3027c1698d6f8572L,0x89326850111e64d7L,0xe6eb6cd31b8b0179L,
56685         0x0d2d27ea6dd5a4a7L,0x41682c0007c82f11L,0x5a01c54c81075022L },
56686       { 0xf3903f51fe7220d0L,0x75daeaba1f8e66b2L,0x1b625eed470bd3b2L,
56687         0xa46398a7e85a6293L,0x8ff6ef8c805ad640L,0xb3430f6795bfa3a5L } },
56688     /* 57 << 245 */
56689     { { 0x55d31765bc9341b7L,0x6530526ba312d125L,0x57ad29c02e9eb238L,
56690         0x31658a8282292155L,0x4d3417b169301639L,0xb38d6199e48c3d1bL },
56691       { 0x4399d5ddcc5202eeL,0x4b1c293a5076cc08L,0xa46e87f5824171b0L,
56692         0x16f75919e4cb40e9L,0xd086562dac35d85bL,0xc2b41ad532713f5dL } },
56693     /* 58 << 245 */
56694     { { 0x2da6d2ca3248f02aL,0xae49d2fc675de73dL,0x4abb1a65cfbfee63L,
56695         0xc6cea22cf1246350L,0xdd510cf82d3faec5L,0x8b7d1b0865e7460bL },
56696       { 0xc5b39c802737b182L,0xeee61e0d8963c709L,0x9cf9da61793e7179L,
56697         0x630637e52a295ba6L,0x18b85c9fa3881ba2L,0xca091a9464a94fe2L } },
56698     /* 59 << 245 */
56699     { { 0xcb68739f0bdec121L,0xf4907b3cd3811dabL,0xcf1b079b8c5d7707L,
56700         0x9ef9002d2fc6a56bL,0xc4c9d069809e8b64L,0xaf86a3db90d0eef4L },
56701       { 0x30a52f994b24a04aL,0x03bcd7a958574ed0L,0x330ce8a1a5b52b8bL,
56702         0x632b3c2d5e6a8ed9L,0x7b080a2c18369382L,0x12173e5f65187ce1L } },
56703     /* 60 << 245 */
56704     { { 0x027f654feabe8ef1L,0xd9d327e481a51834L,0x9215df61980faa43L,
56705         0x76b4f8003ba045c1L,0x8f3ce587f400732cL,0x0abe1f34f133a3caL },
56706       { 0x2ec690526de4f504L,0xa297cee4cb7ff026L,0xa31a76e3cadaefe1L,
56707         0xb701391e1173a958L,0x0a4279b08c8768f1L,0xd58927c12f8ede03L } },
56708     /* 61 << 245 */
56709     { { 0x71ea38454e630b0aL,0x4f696b59119263abL,0x9e7cb293f9cbab69L,
56710         0xa448d591c60ea8d2L,0x5021d4ef7d89eb52L,0x1a1ea5e3787663b1L },
56711       { 0xa95af4eb05bedc8eL,0xfe72effcc2fba411L,0xa88b79bb19a2c6bdL,
56712         0xbed948fac84c78eeL,0x022dcf3d5ee7455eL,0x0c39c3689f56accbL } },
56713     /* 62 << 245 */
56714     { { 0xe0e818a8b77c9de2L,0x0dbaea885e07f77fL,0x6ece83b97b1f96f0L,
56715         0x3c02e59631733a5dL,0x44bcdfcdd14828ffL,0x2791ca54b66f6107L },
56716       { 0x1a051c5a6198f24dL,0x9cd5f09a17627301L,0x64323392004a0cb1L,
56717         0x75d6819b3cc13e05L,0xf5cab2874a58768cL,0xbe090e83e3ca9332L } },
56718     /* 63 << 245 */
56719     { { 0xd639e0f3ab9b278dL,0x57f3f8cafa2407b4L,0x6720549f6c11f6abL,
56720         0x6ad1c608e784308bL,0x62c31e4a196babbbL,0x764b4deed1d36447L },
56721       { 0xf44efcefaf4407bcL,0x7c1f45dbb3ca82a3L,0xf43e4a8773b952b3L,
56722         0x145cd2d6ff478bbeL,0x11ef2df450c8e708L,0xa2af06f044491734L } },
56723     /* 64 << 245 */
56724     { { 0x8cd6c9f7c90b13f5L,0xec0c187d52a9d469L,0x9c0db0f589b8ad2bL,
56725         0x692a8db70d9c999dL,0xa407fd03c9f84ab4L,0xa5742fd1cc9a906cL },
56726       { 0x4813a765c8e72867L,0x9c65943de2e9a10fL,0xca6bf2934fa0a23eL,
56727         0x1dfa3af7cb1f8d7aL,0x28036f5498d10c53L,0x7bfbcaf20e012c13L } },
56728     /* 0 << 252 */
56729     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
56730       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
56731     /* 1 << 252 */
56732     { { 0xa53f1a104ec177f6L,0x4a2ef9aa3faa5ca8L,0x30efed8532976d13L,
56733         0xcf5ada165ee692d1L,0x3ceda69d259e7cc1L,0x2aae29e99baab472L },
56734       { 0x7ee5baef737cc8bcL,0x1717af747fe68dedL,0x9e5c8ddacfdaff63L,
56735         0x575c8db9cec07693L,0x9afc8ae0fdfb509dL,0x27836d3685651697L } },
56736     /* 2 << 252 */
56737     { { 0xa7342f9517eb9264L,0x9264a6a00a8a6eefL,0x50e48bf07471c384L,
56738         0x729e5ab130827f34L,0x17199191ea779c23L,0xd13ab8539fa9fd58L },
56739       { 0x7d5799373b1d773eL,0x65f8e7c6d196c3dfL,0x253f7d51e8541725L,
56740         0x107a793dec720355L,0x1c14d0566aa16268L,0x9dc5fca38bbb231bL } },
56741     /* 3 << 252 */
56742     { { 0xf5689c5e12b09f53L,0xc1da32e19e87ff7dL,0x1af879d012eaa533L,
56743         0xdba775e6d9271e94L,0x60f8507310e63c34L,0x445f3e21a686a24bL },
56744       { 0xed5ca8fa15bc277eL,0x9839198a364ab7abL,0xe2ee39426d90a7d4L,
56745         0xe5b3e4cbccd37e76L,0x9013bd08f1412e0fL,0x82f5c532ce999048L } },
56746     /* 4 << 252 */
56747     { { 0x61d0e01bf3fe3441L,0x674e52332af47609L,0xd4a4e224b362902dL,
56748         0x45923c129e0a5d16L,0x4fc2bdd495e580e9L,0x6d1d974ca8c3d954L },
56749       { 0xaeff1135d0bbeaaaL,0x013ab5b31baafc9eL,0x80907d3eab8f9f31L,
56750         0xaf2c12166d566c15L,0x0082daba952e6fa7L,0xa46710032df9e03aL } },
56751     /* 5 << 252 */
56752     { { 0x91b379c63223d561L,0x8cb7b8cce203417cL,0xd0f44208176b3b81L,
56753         0xd18c2118aaba5cd3L,0x4aed5c9770794f9fL,0xfc540dc4f4c33894L },
56754       { 0xb8e6798a0153a8a8L,0x6537dcdf43c4b0c0L,0x1b7eef39ab557397L,
56755         0x175e3934b7103105L,0x943abf4a82ac89e4L,0xeb1a61f957ffcdb8L } },
56756     /* 6 << 252 */
56757     { { 0x99c2b4cd66476227L,0x576a4b0662850cd3L,0x067bb66b5a352b7aL,
56758         0x3c7d6fc43ec757edL,0x2f69291cb9d36adcL,0xc7c0f3257c9143a4L },
56759       { 0x768c3c400627fee2L,0xc214d81da8fde577L,0xd86e4b025299ea1aL,
56760         0xbe46b7e91a2d4005L,0xaf865a169317fa60L,0xfbc3268fcdce2fbeL } },
56761     /* 7 << 252 */
56762     { { 0x66fcba52d8fbe900L,0x9f16434c861b3e33L,0xa371b97241b4305fL,
56763         0xb2d858ce25b6af89L,0xbab07d53275f9e8cL,0x3b5951f8d525bef8L },
56764       { 0xebf79e3ca1755b0aL,0x4e6256e7b467b1c2L,0x7dbd8b66cba1a659L,
56765         0x88ea40138b1eb8b6L,0x210ac1b38fa6436aL,0xe93e22c23df40e33L } },
56766     /* 8 << 252 */
56767     { { 0x5f79f0df1fd64063L,0xd2d39dd381e118ecL,0xd631a68e11571c5bL,
56768         0x6d072b4e2474faf7L,0x5e043a6d862a924aL,0xcae58bd8b0fc8d7aL },
56769       { 0xf54bb7f3b1351f28L,0x4588b6280413275eL,0x81459f4c5909ec04L,
56770         0xd28cda25abd16460L,0xbb676d018db1c69eL,0xc0056e2dac5036f4L } },
56771     /* 9 << 252 */
56772     { { 0x1ce187bf323169baL,0x1dfaef8661ab5073L,0x1893dc7b2ae468b5L,
56773         0x0748ec86123848d4L,0x0d2877b46a96eb12L,0xb6063e75e9322495L },
56774       { 0x1cb17189d7d1828fL,0xde41f11944d1b318L,0x7ce0f87610f0b74dL,
56775         0x2c7c91ee7a98f86bL,0xb641418e750f3ea1L,0xae2cd2e280094054L } },
56776     /* 10 << 252 */
56777     { { 0x9f6c6ed598d8e086L,0xa9ad63ca2d3fad85L,0x055b8323fe016926L,
56778         0x039fbe287b3a8d68L,0x544a8bf5fb6b315aL,0x04b122fb647fed85L },
56779       { 0x1e9807fa98085b1aL,0xb78a36a771c12696L,0x4ccc1a2cdc22f95bL,
56780         0x6ff4997d54d1e818L,0xecb5bdc2f08c22dcL,0x6e07e2c146a27762L } },
56781     /* 11 << 252 */
56782     { { 0x602077aceaaec565L,0x9dacf68224568aeeL,0xa490fc1e9cfcce26L,
56783         0xb2ac94b3303218baL,0xc0208604ab33f9aeL,0x801663b6e39a6668L },
56784       { 0x1defbb42961b0927L,0x688b445e83e318b3L,0x34fe2830c11648e8L,
56785         0xed56e99360066dfaL,0xa5f30f9a07671eccL,0x02c40260a3222e8dL } },
56786     /* 12 << 252 */
56787     { { 0xfb2a11b4ea347db9L,0x2360667e03350681L,0x1aa6e720a02a1261L,
56788         0xac2bd2eba110bb21L,0x8ab2f9063c9b4568L,0x5f46263d5ace1f17L },
56789       { 0x97067801eae704c8L,0x35d2637ea715d313L,0x24cdc3d0c77573daL,
56790         0x6f97cd07e2562b2aL,0x27bcd62d5afb29e4L,0xc38ac1c55d29f5d3L } },
56791     /* 13 << 252 */
56792     { { 0xd9c38ba47c88f46aL,0xdd07c4d79946ebe4L,0x908731dcce0e5417L,
56793         0x43088d11e145839bL,0x9d37419d07b61543L,0x440cdbcd2c3c7c4cL },
56794       { 0xa6a6fed673216db4L,0x15ce171a198cd32bL,0x198c256974e6a085L,
56795         0x5fec853f3dc2a714L,0x329250bdd5923068L,0x1d82373c9f6195caL } },
56796     /* 14 << 252 */
56797     { { 0xa8e17be53777b2aeL,0x534e3a3bcc284224L,0x7f34ce458192cfa1L,
56798         0x0009a72966d0e03aL,0xc42053ba524ce1fcL,0x834e98fe6d092e58L },
56799       { 0x400c65a1c8b0f751L,0x268bfe6f107965ebL,0x0f141c0332e0bc69L,
56800         0x33bc6e64597a2264L,0x039a4ae9454a0d6bL,0x2cb0bf550b07ddaaL } },
56801     /* 15 << 252 */
56802     { { 0x69056cbe63769bb3L,0x710a67d385044d35L,0x971ccbdeea855332L,
56803         0xd655163a0fd0d210L,0x619c3f9adbb8a8b9L,0xd156f73d49a014e2L },
56804       { 0xd04ea0a5a129a598L,0xc9c04da6fa2f12eaL,0xc0ed654ae98b3187L,
56805         0xa254eef6a82f9ec4L,0xe537695fa386a72fL,0x170f1ed4a74eb453L } },
56806     /* 16 << 252 */
56807     { { 0xdbe04c3044ce3ad8L,0x995fbb1b4ce8aad5L,0xdbf8b54670911457L,
56808         0x9e683b5b3f7a1757L,0x7b89a08a9c7bd62cL,0x448865a40b3fc97eL },
56809       { 0x0ac9abfc3bb01e94L,0xa07760421e756124L,0x0aa6c335d9deed97L,
56810         0xe270580f72603e08L,0x70857a946c783bb2L,0xa0047774caa929aeL } },
56811     /* 17 << 252 */
56812     { { 0xf99a63c5e8c4a440L,0xc7fd1d1419d65168L,0xfb6c21d696d5e80bL,
56813         0xa4a7304944b833beL,0x093728d5127b1599L,0x9046cbe2c89e7195L },
56814       { 0x21e2863c146a80d3L,0xb1ac7e1bdd559c13L,0xbe5ba65c72c39063L,
56815         0x7da5feb87722cbc7L,0x122615d0f17c02c5L,0xd44f477179e5fcb6L } },
56816     /* 18 << 252 */
56817     { { 0x0d913830e2d28da9L,0x0465920a8a164385L,0x79959ce1b0ad65d5L,
56818         0x6c94690759a966d6L,0x4ccb0e5e832c24feL,0xa8c5bee5d6af2a10L },
56819       { 0x264dcc118c5791fdL,0x719f23ac5b58ce85L,0xfbff8a2f8e54b029L,
56820         0x0c9240be864e959cL,0x8f7c21733c37c665L,0xfda848d9f164d354L } },
56821     /* 19 << 252 */
56822     { { 0x203ea731f35d11f6L,0x90610383f9f9001bL,0xb9d3c302ed97e6f2L,
56823         0x4c529736c9a67e6cL,0x2e440b1781f6597dL,0xcc798f5616aabf20L },
56824       { 0x490f50642832ffc5L,0x585e462a7a19b125L,0x99d73e391b06d98bL,
56825         0xb817e97aab696d7bL,0x9df2f65ac28dffeaL,0xa48dad47045fddd7L } },
56826     /* 20 << 252 */
56827     { { 0x2878c20d62e5fc09L,0x419ed2ece7f012abL,0x3bbc853fbaa21e7eL,
56828         0x412bc3c54844c009L,0xc4b150508b012199L,0x9d160f4c310d5fbfL },
56829       { 0xcb61b69214f60becL,0x436348c064092943L,0xce8c136e3185cde0L,
56830         0x97b034f68be5dd85L,0x7697adf92701631aL,0x2ddd86361fa6e8a0L } },
56831     /* 21 << 252 */
56832     { { 0xde8c2c963e9ff7faL,0xfdf1e25d8b75bbeaL,0x28ba3be59c146264L,
56833         0xfc1df52e81fcb0c9L,0xf9341c43af3ba66aL,0xe81c22470d72188eL },
56834       { 0x2ff00f1069c62b9dL,0x1077962e71498d24L,0xdf35b17ecc34ece7L,
56835         0x3516c33687eab2daL,0xe71cf7ddc72b7911L,0x6c9233d92c286c56L } },
56836     /* 22 << 252 */
56837     { { 0x7ce6389d162754d7L,0x8f03eff514e0d8e5L,0x9fd2c896ef402e31L,
56838         0x4a4bf70a2195b0e6L,0xe6043a383c8d82dcL,0xd86b647e8bed7c65L },
56839       { 0x21bc56f4a4c87660L,0x8c99d6270c05564cL,0xd6b82e9014050ee2L,
56840         0x09bf6a3eb6b11f0bL,0x9704b36731dcd6b1L,0x871c85c85e3d44caL } },
56841     /* 23 << 252 */
56842     { { 0x93024430e5236badL,0x4c5872728b883d1aL,0xc265b94bba68d3bbL,
56843         0x7d8fc82a648d9b7eL,0x57086e6e75ac264cL,0x4b8a157102fc9ec8L },
56844       { 0x83ae238e86849a9bL,0x2eaad9b8a69acccfL,0x2d82c029d44eaa39L,
56845         0x8f5b9ed833d7a556L,0x05c83328eea8b609L,0x537069efc3c96005L } },
56846     /* 24 << 252 */
56847     { { 0x292f8874b25c4d4aL,0x54961fd87e79f526L,0x949a1fae008c6ec9L,
56848         0x6ae82f0d525524fdL,0xd1f6f4ef2edbcb1aL,0x41617a6d977ddffbL },
56849       { 0x6ae38fb71baf0668L,0xa79ea228d538ab3cL,0x70babb05fc44e273L,
56850         0x247384fbbca85910L,0xdc0e069b6a564959L,0x37a9c5521a7438adL } },
56851     /* 25 << 252 */
56852     { { 0xaf2c87828a4b7251L,0xcb5ebfd3c1bc7f72L,0x160b77e560579615L,
56853         0x297412e3c10f067cL,0x5ad0681ef7df86c8L,0x2e8c63529b3e3afbL },
56854       { 0x32372cc74cfd3266L,0xb7abc8baa820f8b5L,0x857d545519f34baeL,
56855         0x5c055ce920ed65beL,0x1d8a59ca537ad6b7L,0x1135adcf7ad88633L } },
56856     /* 26 << 252 */
56857     { { 0x47e6ed9530034df1L,0x1839f488321bed8dL,0xb6b67d452ac8a9f9L,
56858         0x2fe1efc6182e4a63L,0x2da34bde0c1185c7L,0x6e5d1621edfdf9aeL },
56859       { 0x3bae9db77120804cL,0xf094b0676d986ef3L,0x029c9246853e24ceL,
56860         0x3abacb1b25a82463L,0x58777e1389c5616aL,0xaedd003b5aeed714L } },
56861     /* 27 << 252 */
56862     { { 0x7494e4319da5fb0dL,0xc684d74bee3fd6f3L,0x12fc899403a87d91L,
56863         0xc4c55e692d6e3931L,0x63e1255896336788L,0x36c297a5f78371fdL },
56864       { 0x4cd3f9c4a63b313eL,0xd2825e17c543e507L,0xd37e36d06a4e64d0L,
56865         0xab9559ec11872774L,0xaf168b34880a5d00L,0xb0c916a10c0c3f42L } },
56866     /* 28 << 252 */
56867     { { 0xd389397c834eaa9fL,0x2271ea0d2a5532aeL,0x5e59a23ae1f92e9eL,
56868         0x9f179b8c1f7b91f5L,0x2a1c10028de2dc8bL,0x6ac83e58787a276dL },
56869       { 0x0facd4756d9d1571L,0xcceaae5e4bf118e2L,0x4e8008b7620fbecbL,
56870         0xff633fef7a1474cbL,0xfbefea80ce377357L,0xebb9a9460feb7724L } },
56871     /* 29 << 252 */
56872     { { 0x0bab441ae9803b71L,0x309ef14684e2e21eL,0x17ccd5b6851b6519L,
56873         0x8b5e7e300126f470L,0x0560cb9d847eca03L,0xc45850bf11ade256L },
56874       { 0x08603f5c3c33dbbdL,0x21887bc9708ae545L,0x3bd25ad480014ffcL,
56875         0x5eb0f89fd3a64409L,0xbca2726b4c3dd83dL,0x611afd2fe4259797L } },
56876     /* 30 << 252 */
56877     { { 0xd9cb4233c4f4e0e5L,0xcfc0576818e49029L,0x8e9c8360526f05a1L,
56878         0x8e83037aa56d6c3dL,0x33507065c47e6742L,0x5ca2c8d8788b5da3L },
56879       { 0xf355cee9cfb0b6feL,0x0e86fd73973ddafdL,0x27fc6c56d44fd889L,
56880         0xc9ab416ff7d93f3cL,0x778c3f160d063d62L,0x175e5d920b5085ddL } },
56881     /* 31 << 252 */
56882     { { 0xd62406873be63d8cL,0xe8c93b93b80059a6L,0x33bba7dfe065854fL,
56883         0xcb26543f36b34e45L,0xc17ee58dd2d0c3d5L,0x69752f49bae1bcadL },
56884       { 0x87e31b429b20106aL,0xc520424b06734eb5L,0x993240afa896d17eL,
56885         0x5238851bc2762a62L,0xce399f9d506d7dbfL,0xa4822d23040cc7d4L } },
56886     /* 32 << 252 */
56887     { { 0xf071c9878fa06859L,0x0083e5311a52390bL,0x845eb12a61483bc2L,
56888         0x17471d801caf6dd6L,0x7b603616ddc21b92L,0xd38fe0f6b992536dL },
56889       { 0x433f0652297c25a4L,0x03d4d8fcb1c4bf41L,0xdf617386a9adf49bL,
56890         0x4bfeb3992cb2944fL,0xbf288427b3d9c076L,0x17818c3e965b4576L } },
56891     /* 33 << 252 */
56892     { { 0xfbcff79f6df360c9L,0x342f9ded2bd94c22L,0x2dc5f999283f2300L,
56893         0xbea18d9893cc3330L,0xc197176269a7da4eL,0x72de17ee93ce69a3L },
56894       { 0x6c354a6184170a91L,0x031ce0debe47ef92L,0xbf256fd418658739L,
56895         0x0395088a0d037d9aL,0x61179c42c5a05970L,0x0d5a9f7db8b6ab64L } },
56896     /* 34 << 252 */
56897     { { 0x18be1d605a44a8dcL,0xb512d945f1d18ee0L,0xd2e1f6623af39ec0L,
56898         0x440469136c223676L,0xe7a860836a60a4d8L,0xaefcfc2dc7e09d3bL },
56899       { 0x175817fad685c9b7L,0xe20b6c9e4b9d0557L,0x9212e7bb51fe560dL,
56900         0x748aafb7608b53c4L,0x86186d4fd9b06850L,0x4cc6041376512c08L } },
56901     /* 35 << 252 */
56902     { { 0x2d5be3b00c127e46L,0x8c6f38fad9b04e47L,0x49c444098736f31bL,
56903         0x5469ae47f53aa908L,0xd84856f3492fd120L,0xd04b1fa20725e199L },
56904       { 0x50c2e80a8e7056f2L,0x415db04c9ba2e259L,0x8e4c56ae2eb201e0L,
56905         0x449e4d9e5082ce94L,0xb5ff077a7345459dL,0x96d10f1e07330e72L } },
56906     /* 36 << 252 */
56907     { { 0xac77126e3b3094b7L,0x7c1e7673bdcb616fL,0x90491f8176993114L,
56908         0xf17c08a8cc8da63bL,0x972a3bffaa050364L,0xdef45b7f65a9cd57L },
56909       { 0x105ec5ba2b9b889eL,0x7066821150f7a61eL,0x11daa9dbb1d63a40L,
56910         0x6065451007790568L,0xfaa219cebc2b6d2aL,0xb1b8ace93e5163dcL } },
56911     /* 37 << 252 */
56912     { { 0xf8042ae2859b0f22L,0xd8a5d3a200d8bb8cL,0xe85c596189faae14L,
56913         0xb7d636f906611c0aL,0x35b68bbdd2bc8957L,0xc86f5be5b7cf558cL },
56914       { 0xb602a00369c17e74L,0xc39479cfd8a1fc01L,0x6dca5c81f733237eL,
56915         0x9c8cefd41b2e2cccL,0x2e32a323caacb4b8L,0xf7406874ad639090L } },
56916     /* 38 << 252 */
56917     { { 0xea3a358e24c1bbfdL,0xfd32af33571400aaL,0x2ec3d44da413949aL,
56918         0xa0d8594a7bd121f8L,0xb32997a1d6b6153fL,0xa0f48d98b9469c6eL },
56919       { 0x236b7a18fba15481L,0x49dee3bd98ff970fL,0xbc27ac7a7ee97875L,
56920         0xd1acf2be28ac6279L,0x92e7ef02514c8328L,0xb2d7a8304f48b497L } },
56921     /* 39 << 252 */
56922     { { 0xcaad0554d95946a9L,0x992268c973ed1281L,0x6c0b1edf7b1b25e1L,
56923         0x4de2d9f81d6e73dbL,0xe12a4f1c5a2950a9L,0xe0cdf7af36ac18fdL },
56924       { 0x16e7332d1abcc9f5L,0x4dccc1505bac1c75L,0x1b48bbc141f8c231L,
56925         0x3702cc2693692a4aL,0x9e9e53dd311c5dabL,0x27bc006cfe5d9fd3L } },
56926     /* 40 << 252 */
56927     { { 0x2bb798ff689f43efL,0x5813e4415f26ec54L,0x51f64c495005c929L,
56928         0x60e213a54b42e417L,0xc152844262cc3734L,0x6ecd6c3b09d994e1L },
56929       { 0xa6e72f7183dd047fL,0x3836f663b0019803L,0xbcf1265b257493cbL,
56930         0x59b15ff09e62d78bL,0xaac5ed5b6cb92ecfL,0x37e6ad7d9662651cL } },
56931     /* 41 << 252 */
56932     { { 0x04743bf8b224f6c9L,0xec04b641ae33b1caL,0x6301f51623a76fccL,
56933         0xf1aa954675e15fe9L,0x878c64ecd95c1972L,0x033df5ee3ba7578aL },
56934       { 0xe5e9ff7c47f4721fL,0x9b3d93fa03eef7e9L,0xcd0be6ad573deaa6L,
56935         0xf377570f3bbc8a16L,0xffdc04c161c37393L,0xd9eee46dd26d659dL } },
56936     /* 42 << 252 */
56937     { { 0x33f933604d4b7317L,0xee44b3e02fe482ebL,0x5a96870480f1fde5L,
56938         0xdfd6293b5510952fL,0x2abdc1989cc0af6aL,0xe608e2769ff45aedL },
56939       { 0xf408670e3247e796L,0x3144153535fe07c4L,0xa941f96e2870053dL,
56940         0xbe908795ef6383adL,0x82b620a63560fdf0L,0x2c1cc1ae135de5c8L } },
56941     /* 43 << 252 */
56942     { { 0xa829397c727e5988L,0x305659bac6239b1bL,0x9b13701200392cb0L,
56943         0x4eb1ddf376091862L,0x68b64b19202bdd8aL,0x56c427c5228071e4L },
56944       { 0x354b1beac3375accL,0x94a45b4e54e1194bL,0xf528df0178095edbL,
56945         0x6fb0867146fb9ec8L,0x977efc84c555bd48L,0x8230d6f7c268a20dL } },
56946     /* 44 << 252 */
56947     { { 0x003d4004b8d81c0bL,0xd3d5048f4168a407L,0x7748ecacc6675bd9L,
56948         0x9dba4539e2612cf4L,0xa5ebbccfd8770b8fL,0x206b4a9aadd90558L },
56949       { 0xe446ed9c81b5c103L,0xcd2434184d2199dcL,0x0840f6eacb0d70d5L,
56950         0x6fbbf1b43107367bL,0xde9444f7d29335c8L,0x33ef004c66252eb6L } },
56951     /* 45 << 252 */
56952     { { 0x10eac97aa5a6546aL,0x6129392fe231f95cL,0xfd41bda100e2aae3L,
56953         0x5b1f93299d8c6288L,0xf1d2fc9246b7df40L,0xbc6fbacfc5df62bbL },
56954       { 0x64885d924b5af011L,0xe4f3ade883461896L,0x644ce7a7a4a62e43L,
56955         0x74c9d145337b2730L,0x69d714840f83222aL,0xbfbc594ec27c0fdbL } },
56956     /* 46 << 252 */
56957     { { 0x3263c0517ed92916L,0xc039b94884e3f519L,0x54aa433ede89de6dL,
56958         0x92f76292c0971a03L,0x8457b2312550a2e8L,0x46ab1f0f11cfcd9aL },
56959       { 0xd97b95c1c6d53077L,0xe8db11d159550599L,0x2092c81385ea4b32L,
56960         0x149b6b2cb7ced408L,0x2ada6fa482b9b22fL,0x53a5576a25877963L } },
56961     /* 47 << 252 */
56962     { { 0xa1e2c2a8195ad455L,0x65e90a3de7f61038L,0xb01eaa52ec623680L,
56963         0xfad0f9f110302efaL,0x9e544b5449274409L,0xfc9037de8c3a0925L },
56964       { 0xbcf196fcfd139cdaL,0x0a1f747c4f6a2cdcL,0x580a9abab879fe3eL,
56965         0x08a20f1c5ee74778L,0x7c9be7de464c5271L,0xa4a1972918e85a09L } },
56966     /* 48 << 252 */
56967     { { 0xce23a19aa17e560cL,0x6491b95f62550e2bL,0xc72000121d15a005L,
56968         0x15fde735f4355a1fL,0x3849761f607f7807L,0xcbe322d018204691L },
56969       { 0x75756e4ea95e8e91L,0x365959fe817a9b8eL,0x631232763d4ce3dcL,
56970         0xa769d2fef1d66e00L,0x8624ddbac28829e6L,0x03274297d2df06efL } },
56971     /* 49 << 252 */
56972     { { 0x2ad21bdadf3b1368L,0xf4f9d5270b3001abL,0x10182c5557ecb528L,
56973         0xe00db71565372a5bL,0x2018e0ed74f2bd83L,0xa11b47066175efb4L },
56974       { 0x3172264722d565cfL,0xb20c27ab2f0faac9L,0x4ca2982a6260f995L,
56975         0x3850ef89b7085c6fL,0x5b4a6e235f0d45a3L,0xde562df9b7523682L } },
56976     /* 50 << 252 */
56977     { { 0xb34ecab233bb63f6L,0xe6cd56a202944c4cL,0x2690cc39489a8d88L,
56978         0xcdfe368a4fe612dbL,0x23069ca5e9e9f7adL,0x7b87105cc07d742bL },
56979       { 0x5114645a8b58ea8eL,0xd31fb4821829e8aeL,0x5e235d95c4b28520L,
56980         0x2a1cda885c2292d2L,0x95d77447ee925b6aL,0xeec419a3df18845dL } },
56981     /* 51 << 252 */
56982     { { 0xb8903f10be9ffa75L,0x8bf7fc786432dcc3L,0xcf3f7cf15d028549L,
56983         0x7684baf29846f2d9L,0x4c580edbe9e063deL,0x0ac5c3edf2d70321L },
56984       { 0xb9ba10e184c5d96dL,0xbb854b39d7aaabafL,0xe29d66964793c87aL,
56985         0x7b0fe1d448285ae5L,0xa143454df0121733L,0xa286eb043aa5ddc8L } },
56986     /* 52 << 252 */
56987     { { 0x8e4dcfc88c93bc5fL,0x9f96d60a1b233295L,0xae5262e91d447dcbL,
56988         0xafe58396541d46c4L,0x3e733c2636ff8f80L,0xcb36a37748b81037L },
56989       { 0x9bcbfa9fc406ef17L,0x57a6e28006fb128aL,0xd86b44db9a771eb1L,
56990         0xc7ce106e62545a4dL,0xec6818a6b254c908L,0x4b8d3fc550feb342L } },
56991     /* 53 << 252 */
56992     { { 0x8faa39c8b609ef4cL,0x0209b3a7d8225cceL,0x11254c211feffc0fL,
56993         0x64930dcdc1e42ad3L,0xf5b058eb1cbb39fcL,0x2f870e3341cb5065L },
56994       { 0x61b3611cf7663f95L,0x981890b637941996L,0x00c42b0908dd6854L,
56995         0xac42af5de17da075L,0xaf3a394c282b8d53L,0xb53b3b245d8bab96L } },
56996     /* 54 << 252 */
56997     { { 0xe17c9d98d90f0c83L,0xdd4aa8ac6d984408L,0x94b6fc50f71aef46L,
56998         0x2e6b5d24f0a2009eL,0xcb9d9cd17d8d75e4L,0x5e732a5b962a1708L },
56999       { 0x9d774f1c7fd01089L,0x56bc35aded95094bL,0x6844220bb9c797d4L,
57000         0x40021d8e90ace48fL,0xddc769c5701baad0L,0xe23e8f9e333ac2deL } },
57001     /* 55 << 252 */
57002     { { 0x6cf6faf6e92e42bdL,0x759dc78b0d1e6a0eL,0x18fd55ff11532759L,
57003         0x04a306d7e9af0c07L,0xd7febf615ef7f82eL,0xaa04f1dca65cae01L },
57004       { 0xb084407c16442bc2L,0x17ab4f74f874f10aL,0x236368d40fb6cea7L,
57005         0x451ea8206f66813dL,0x4a61097b1760e6ecL,0xa8655cfba01bdd2aL } },
57006     /* 56 << 252 */
57007     { { 0x52fced3116f01d7bL,0x88c6b172daf046aaL,0x1a189403fe7a338eL,
57008         0x39741ecd61798b1eL,0x6a47b0712934b879L,0x3b1a5dd1828d1e9dL },
57009       { 0xd4bd48487f35a7efL,0x71774b5bc1eebaf8L,0xa86471e5d55344baL,
57010         0xfbf145f17b8a483aL,0x70f9b214aa53802cL,0x995af93010b066e1L } },
57011     /* 57 << 252 */
57012     { { 0xd2714b97aadf25ceL,0xb95c54162a7643f1L,0xae7dc619ba2f1939L,
57013         0x30e5d013b0db537eL,0xfcd1a456753f0813L,0x19f7117cef62925cL },
57014       { 0x40a22e35423d3c56L,0xb0271e9926a5534dL,0xc19f703cc76c9a1eL,
57015         0x9b8fe585560bee08L,0x48c7797d3cc772aeL,0xabd2148e10bd6393L } },
57016     /* 58 << 252 */
57017     { { 0x046fb36cc34a7ba2L,0xd42e56d42a61a8a6L,0x16b8fd2d3d4b1184L,
57018         0x6f9e85a26da29888L,0x1ff7324bdd683c49L,0xdb3746db27bb8e2aL },
57019       { 0xa7e586e684be7f99L,0xfbd0c0ee61740d6bL,0xb80509bab2071320L,
57020         0xb5bf09fea3f03641L,0xe872cd854971e39fL,0x9bed91c0ce2b2db2L } },
57021     /* 59 << 252 */
57022     { { 0x85177e7ca6bad7b2L,0xd5b1f0901425b611L,0x6b5f16223c4bfa24L,
57023         0xde34a692def66d8aL,0x96c0663ee8a1b7a0L,0x43eb91ed459c8bbbL },
57024       { 0x6cc7e78b7d3d8b92L,0x3c9da7efe0338ba8L,0x18d7ab00e21360b4L,
57025         0x0785ca897f9df01aL,0x5bcfb8302220f1efL,0x8c61a3bfa52bbf42L } },
57026     /* 60 << 252 */
57027     { { 0x4dcc3b82196c21d2L,0xef0e0e1e61071fd8L,0xa2a28c3b35a013f7L,
57028         0x7550d3d7f6b58f80L,0x0f1fc9d58101742bL,0x027874f055982d5dL },
57029       { 0x5a10b98c629bc409L,0xa28a1b2baf494679L,0x84afdbe1b96578d8L,
57030         0x201a8062d427238bL,0xe321ee2d89fffdb0L,0x0b304de4fb89f171L } },
57031     /* 61 << 252 */
57032     { { 0x5d8e16c0d7700dfdL,0x336e30fa24260211L,0x7ba72067ad557ce2L,
57033         0xcb388c3169621e0dL,0xcf6b7d813dbf7ba3L,0x7bfe43a91cbd216aL },
57034       { 0x6c40516adcffe0b5L,0xe77507f083b7ea33L,0x5b5cda074ba1fc8eL,
57035         0x46860dd296c6d2c6L,0x4716114f0eb5013cL,0x05bd136898c3642cL } },
57036     /* 62 << 252 */
57037     { { 0x7fac263852ca5d3bL,0x35e5d8d0f5a2a596L,0x4c7129210011a394L,
57038         0x400168f7a9c417e0L,0x220994b447b77b44L,0x01a7580af548c0adL },
57039       { 0x59870c2afe292ad7L,0xdda35a1a2abf8e7cL,0xa3082dc4f16d0c7cL,
57040         0xd4dcd5f38557c9e8L,0x38d45cc6ba7f0f99L,0xdefc0b1da7c18157L } },
57041     /* 63 << 252 */
57042     { { 0x5db2ed891c43e426L,0xeed247709adf4a50L,0x0b5e19765c8b90e1L,
57043         0xe9db695ffa18542dL,0xc16d3bfb8d043dc5L,0x5c5feb44f11d3430L },
57044       { 0xd44e3d57365593c0L,0x1338f26c8796edb5L,0x789b325e051ca644L,
57045         0xaa93b75d1579c2bbL,0xa39a8ec57842c0b2L,0x84225134550ddf11L } },
57046     /* 64 << 252 */
57047     { { 0x9ec1159727a28f9dL,0x96f2c44bb847cd83L,0xacf794e131fca111L,
57048         0x438b917896076f45L,0xad71035b51732588L,0x2db32f32a5d910daL },
57049       { 0xefaad0e8fe1cc184L,0x6f0360b52e00bbedL,0x99402426474ce326L,
57050         0xd53b687a2aa270daL,0x96c8bb78d78fa6ebL,0xd07f3bba6e699411L } },
57051     /* 0 << 259 */
57052     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
57053       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
57054     /* 1 << 259 */
57055     { { 0xfe1f11ad389283baL,0xc87e20b60cd91b22L,0x99d0015a3c5babf8L,
57056         0x7e795b4d5929ea0aL,0xc9cf68331dfb7b7eL,0xc1c07346a64992e8L },
57057       { 0x0b7e0dd89889746dL,0xa89d7b461c43ea4aL,0x64023cf034f02b96L,
57058         0xf7dd410a5662f0c8L,0xa3bb6088a1058ccaL,0xedb25dc34e7801edL } },
57059     /* 2 << 259 */
57060     { { 0x140a0f9fdd93d50aL,0x4799ffde83b7abacL,0x78ff7c2304a1f742L,
57061         0xc0568f51195ba34eL,0xe97183603b7f78b4L,0x9cfd1ff1f9efaa53L },
57062       { 0xe924d2c5bb06022eL,0x9987fa86faa2af6dL,0x4b12e73f6ee37e0fL,
57063         0x1836fdfa5e5a1ddeL,0x7f1b92259dcd6416L,0xcb2c1b4d677544d8L } },
57064     /* 3 << 259 */
57065     { { 0xb6f8d615a033cccdL,0x6aabb87cad75e31fL,0x30a03029a4646d1bL,
57066         0xfad497e6e6547805L,0x4b9d45c3ba291f12L,0x0f74909bca059918L },
57067       { 0xdece1fb0b5a181b7L,0x973f74413be1f21bL,0xcc919af36b06839aL,
57068         0x14427886ad57101fL,0xc63a79882bbc8022L,0x04cf807426742ccaL } },
57069     /* 4 << 259 */
57070     { { 0x279fd119da1c29abL,0xbd0688022b30d40cL,0xd8f57da4da44105dL,
57071         0xb1814b7a28223fe1L,0xcf2fd241e06f2d2eL,0x99003a0201dfde06L },
57072       { 0x876a31affded7e4bL,0x1efaf8272f725094L,0x5117d608493a6a0aL,
57073         0xdcec8088a88c03e7L,0xeae1d352ea916897L,0x8cdc28106e8b2c57L } },
57074     /* 5 << 259 */
57075     { { 0x52fb8e6f7041b903L,0xd7fc4b5b2ad368a3L,0xf16c61d2f890136fL,
57076         0xeee859dfbb52a90bL,0x1651b16b3f8396cdL,0xfbced93eb6462918L },
57077       { 0x1cb3126c4b6bfaa0L,0x65dfc76cc7c8fd16L,0x225b9c21bb46a3c9L,
57078         0x6c3457577f64f9ffL,0x6f65fadd57c297ecL,0x72a630eae5c5bbbdL } },
57079     /* 6 << 259 */
57080     { { 0x0254486d9c213d95L,0x68a9db56cb2f6e94L,0xfb5858ba000f5491L,
57081         0x1315bdd934009fb6L,0xb18a8e0ac42bde30L,0xfdcf93d1f1070358L },
57082       { 0xbeb1db753022937eL,0x9b9eca7acac20db4L,0x152214d4e4122b20L,
57083         0xd3e673f2aabccc7bL,0x94c50f64aed07571L,0xd767059ae66b4f17L } },
57084     /* 7 << 259 */
57085     { { 0x25cb1f44f4fefeeeL,0xe1a6b6c8bce660c7L,0xd25459a00d2118e4L,
57086         0x716532dafedf8f98L,0xaeff37d492cfb480L,0x45919f7da1453c41L },
57087       { 0x5100afe08d8836a6L,0x2ec20fd7b35d4fe0L,0xce8eefd1c00b7d66L,
57088         0x922d535d6b82c7ccL,0x5eb38f3fddd8d80aL,0x7eae5305213ae465L } },
57089     /* 8 << 259 */
57090     { { 0x09f8bb0654e93c1eL,0xb0045884ad81e27cL,0x26ebc7b6076e13ebL,
57091         0xbda0b5535d5ac07fL,0xbcb8132248ab69e6L,0xd3847d2e1c0f21faL },
57092       { 0x7a466528c834d740L,0x6c67a79ae0823ff2L,0x85dd11864c1d7cb8L,
57093         0x096f849f2d081301L,0xb4f503dd8a5ea0f0L,0x71ee0889d1bf69b2L } },
57094     /* 9 << 259 */
57095     { { 0xd7a5f9feaa074b9eL,0xbeda44032fd2468bL,0xca3956309c35ffcaL,
57096         0xb02a1f592de68348L,0x946b0250903b35c7L,0xe9984f24634e9c91L },
57097       { 0x4f70d22fe7303041L,0xf8a05d7fb68b0051L,0x0ce7af4fab5006afL,
57098         0x1011d1644a6bb502L,0xdf959199da4ad1a6L,0xc468cddf1e146f24L } },
57099     /* 10 << 259 */
57100     { { 0x40336b12dcd6d14bL,0xf6bcff5de3b4919cL,0xc337048d9c841f0cL,
57101         0x4ce6d0251d617f50L,0x00fef2198117d379L,0x18b7c4e9f95be243L },
57102       { 0x98de119e38df08ffL,0xdfd803bd8d772d20L,0x94125b720f9678bdL,
57103         0xfc5b57cd334ace30L,0x09486527b7e86e04L,0xfe9f8bcc6e552039L } },
57104     /* 11 << 259 */
57105     { { 0xffd4fd775b5c7501L,0xc43e409ee0600e93L,0xd2a18cba7d522993L,
57106         0xbc2e14dc17c84d1cL,0xe84deb43c1eee29dL,0xe65326f08d691cbfL },
57107       { 0x89760cdd77b726afL,0xb91c302a577b30acL,0xc6a742906e145891L,
57108         0x95bf3e913be85cc7L,0x2ec0285b9815e0edL,0x5b4be6da8aa3ec95L } },
57109     /* 12 << 259 */
57110     { { 0x4ab7a22c02a2d1e6L,0x967e19a31371d5a4L,0x20f59f95078de336L,
57111         0xfd28fa36f7869245L,0x1de42581cbf1d96fL,0x2e0127d7366e1f0fL },
57112       { 0xbc65fa9d2258c741L,0x1f2f3356dd6d65f8L,0x06384f3a4a0822a9L,
57113         0x1c81332bfd05a0aaL,0xbfb12361d95ee3ceL,0x180aaf0642016d00L } },
57114     /* 13 << 259 */
57115     { { 0x329ff57bf08c171eL,0x6cd8122a543af2a9L,0x5209a3d65b2f8d96L,
57116         0x0285b128ba90c881L,0xeb5971ef61b43c8fL,0xf1ec473ccfd759b8L },
57117       { 0xd2a79fb712d58e1eL,0x695f4877fdb6497bL,0x8bf5a4251f1a0f24L,
57118         0x3e79a0dea5c8a189L,0x9c8ada35908b7ae3L,0xd8b8622c5000f772L } },
57119     /* 14 << 259 */
57120     { { 0x3b75c45bd6f5a10eL,0xfd4680f4c1c35f38L,0x5450227df8e0a113L,
57121         0x5e69f1ae73ddba24L,0x2007b80e57f24645L,0xc63695dc3d159741L },
57122       { 0xcbe54d294530f623L,0x986ad5732869586bL,0xe19f70594cc39f73L,
57123         0x80f00ab32b1b8da9L,0xb765aaf973f68d26L,0xbc79a394e993f829L } },
57124     /* 15 << 259 */
57125     { { 0xdd01a72b6024f09fL,0x192c8254378d12e1L,0x03ec536bf5d8b8d0L,
57126         0xb0c4c01873806514L,0x7d3c5f5614d202b6L,0x7c2a7c5c6febb3e2L },
57127       { 0xf2fa07d4f9f2b562L,0x6f717b003ba2a4faL,0x1ff95d598f452226L,
57128         0xe4b3f6ba867c1cf1L,0x907a648a5d0944ecL,0x1ed480007f64f9b9L } },
57129     /* 16 << 259 */
57130     { { 0x0a159f6295b3287dL,0xb18f875948cecad0L,0x6d1ab8ee1661a23fL,
57131         0xcae7f40ec95c41b3L,0xbc3d20407c51eb56L,0xa7527283e8754250L },
57132       { 0x815610561f9e668aL,0xb8aa7296900f5912L,0xabdbc1bf6af2a00cL,
57133         0xe9a942542d0a56c0L,0x4774a7b77bc8959eL,0x0a837ff019cef2f3L } },
57134     /* 17 << 259 */
57135     { { 0xd9c3f4ea3c696c76L,0x3aff88caea5878bbL,0x2b01171b09dda122L,
57136         0xa61d5ca0f599cad4L,0xba0c19bef49772c7L,0x8ee9acc25001f977L },
57137       { 0x15fd3a172549a25aL,0x8f1a25d82263bc97L,0x372b88434db4af00L,
57138         0xa613b31f4f912925L,0x7d83041a0b64efd9L,0x897c521ca7d5f6a8L } },
57139     /* 18 << 259 */
57140     { { 0x9c441043f310d2a0L,0x2865ee58dc5eb106L,0x71a959229cb8065cL,
57141         0x8eb3a733a052af0fL,0x56009f42b09d716eL,0xa7f923c5abcbe6adL },
57142       { 0x263b7669fa375c01L,0x641c47e521ef27a2L,0xa89b474eb08ffd25L,
57143         0x5be8ec3ff0a239f3L,0x0e79957a242a6c5aL,0x1dfb26d00c6c75f5L } },
57144     /* 19 << 259 */
57145     { { 0x04c6a90ae75c82afL,0xe9183100f2488abdL,0xef4b378b111a46baL,
57146         0x77ad9ef502eaa62eL,0x61229a6205e81570L,0x06e26a2db474c367L },
57147       { 0x0bb2ea7e7113f2d4L,0x8ddc6f887f101386L,0x93fe2d7ef4de63abL,
57148         0xc3d038278f44e271L,0xe9f9f48ea94e641aL,0xb84b817b4962467dL } },
57149     /* 20 << 259 */
57150     { { 0x36f3a3d8a084fae6L,0x759835899a9b0d95L,0x70722186cc80fcb6L,
57151         0xf28ed0c796d84c04L,0x95a32263ffb63f90L,0xdd7d60a098766034L },
57152       { 0xe193a31f1d5c387cL,0x6c5eca7eb8310f8bL,0xfe61d523c083ff47L,
57153         0x90c832dbcb2944e9L,0xa9f3f293593334b7L,0xe6cde2e12d7d1c33L } },
57154     /* 21 << 259 */
57155     { { 0x5637d16b065096b9L,0xee3a2ad04770d39eL,0xae605cb56aa94587L,
57156         0xc2d71dae9b600c6eL,0x672ef30d76a87e0aL,0x74d5bebe567e0817L },
57157       { 0x38f591310eb8ca48L,0x92b74866031e099fL,0x654858ca785f77eeL,
57158         0x264b6b7b830be443L,0xb167203d57103903L,0xa73d5d545ce2b21aL } },
57159     /* 22 << 259 */
57160     { { 0x2fd97b9b9dfbf22aL,0xdec16cc85643532dL,0xdf0e6e3960fee7c3L,
57161         0xd09ad7b6545860c8L,0xcc16e98473fc3b7cL,0x6ce734c10d4e1555L },
57162       { 0xc6efe68b4b5f6032L,0x3a64f34c14f54073L,0x25da689cac44dc95L,
57163         0x990c477e5358ad8aL,0x00e958a5f36da7deL,0x902b7360c9b6f161L } },
57164     /* 23 << 259 */
57165     { { 0x5e8eb8f0636a77efL,0xe14290f8970c3a7fL,0xfe6f6acdfa1784c0L,
57166         0x98671d33de6a46b3L,0xe7fd88722ae5a76eL,0xed971ecbae4f7d60L },
57167       { 0x1d90dbd88461b895L,0x3f979ab4bfaaac13L,0xe06ccba1dbd3379aL,
57168         0xb53b04ba108c4487L,0xe42609dd38d2730dL,0x0638fe82e81c4594L } },
57169     /* 24 << 259 */
57170     { { 0xbd079cf1f144b6ccL,0x7f86e29bb4f4a764L,0x5b08b290f21f9cbfL,
57171         0xada0c85b75e3aeb9L,0xd0789f8b6666c2dfL,0xcf5d8a8cd71ec2ecL },
57172       { 0x6f7780c3e7e4364bL,0xdd9a652985d2eb75L,0x8222f66bd952a38eL,
57173         0x9dd5f7eb27260a29L,0xce49b34457947178L,0xaa215f82cdda7e39L } },
57174     /* 25 << 259 */
57175     { { 0xcb91619d1419a50fL,0x44a22eac65dc4c84L,0xc199f93701a92405L,
57176         0x3749a33198045324L,0xf1676e8abc57764dL,0x922f9460a00c33eeL },
57177       { 0xfde98e63d3766db4L,0xae08a82efd5ffb6aL,0x6a9834537c0c6ae7L,
57178         0x0e9a919a54f34cdbL,0xf37a95e8fd88d765L,0x927427d4228a1affL } },
57179     /* 26 << 259 */
57180     { { 0x454ab42c9347b90aL,0xcaebe64aa698b02bL,0x119cdc69fb86fa40L,
57181         0x2e5cb7adc3109281L,0x67bb1ec5cd0c3d00L,0x5d430bc783f25bbfL },
57182       { 0x69fd84a85cde0abbL,0x69da263e9816b688L,0xe52d93df0e53cbb8L,
57183         0x42cf6f25add2d5a7L,0x227ba59dc87ca88fL,0x7a1ca876da738554L } },
57184     /* 27 << 259 */
57185     { { 0x277c833f57c7bf99L,0xbbb84d1d0b301f02L,0x11435cb20713a92bL,
57186         0x8ae509702d02862bL,0x4edc66bdaa7b0660L,0x5bc0d893d6382c91L },
57187       { 0x7992c5d3b94a6343L,0x1cfee04147b19345L,0x57963034964ed646L,
57188         0xd7af0cac3de7b0e9L,0x5123dd8d481b940aL,0xe1d23ad8ad7d3567L } },
57189     /* 28 << 259 */
57190     { { 0xaa44b2863004db31L,0x86f43d7ad43e4430L,0xdc4874cdb0b0240dL,
57191         0x79986a23adc45a06L,0xbb275b443cee4631L,0x21daee8a63a217aaL },
57192       { 0x1e7c5397d7b25c02L,0xe677d3cbc5e668faL,0xc7c84e28ed51b4bfL,
57193         0x7ca19e99923e5408L,0xc6f8a595c3f832e7L,0x2d0a789c5fb049a3L } },
57194     /* 29 << 259 */
57195     { { 0x49702e622b82b466L,0x365d4f6afb8fe508L,0x2f5234e044884733L,
57196         0xcd527f345dd0a3d5L,0x371b02544bf4033eL,0x7d84ad677e3212e0L },
57197       { 0xaf48fd79e69d6b81L,0xd126f83a7a44bfc6L,0xbb8d2b57b2cc4e93L,
57198         0x5f62a3d5eb60ec5fL,0x7b37da33aa76c824L,0x7593d06b89a682dbL } },
57199     /* 30 << 259 */
57200     { { 0x3fa5c1051cac82c4L,0x23c760878a78c9beL,0xe98cdad61c5cfa42L,
57201         0x09c302520a6c0421L,0x149bac7c42fc61b9L,0x3a1c22ac3004a3e2L },
57202       { 0xde6b0d6e202c7fedL,0xb2457377e7e63052L,0x31725fd43706b3efL,
57203         0xe16a347d2b1afdbfL,0xbe4850c48c29cf66L,0x8f51cc4d2939f23cL } },
57204     /* 31 << 259 */
57205     { { 0xc342ed50dd305573L,0xe3055013de86c6c8L,0x0ae84d9776deedc4L,
57206         0xe8e70cbfd1274b52L,0x4bb51dce32e87f7fL,0x32de3672f3748177L },
57207       { 0x528af91681722d55L,0x459af071a5f2ce91L,0xf6883bbdc685a670L,
57208         0x398657f9eeb836b8L,0xa08a793eb9278bd7L,0xe786426bcc09e408L } },
57209     /* 32 << 259 */
57210     { { 0x114a25c844922386L,0xdd084d446d4e8b57L,0xc49b68411e7bd7deL,
57211         0x5b0359fad6da54dbL,0xa6e6e5f93f0da321L,0xb65ec55cd640a87eL },
57212       { 0xc1a4f6ceae64020eL,0x91e29cd2088e1337L,0xf44ceb8e3c0a631cL,
57213         0x0205b11db756445fL,0x04844e845bc8880eL,0xb630ddc0b85e00d3L } },
57214     /* 33 << 259 */
57215     { { 0xac512659c6ee46b6L,0x0c92e402ca82b384L,0x81d79049194fba3aL,
57216         0x9b68376c36b42b32L,0x6dc1c80cf6b410b0L,0x509fbe9196b2b328L },
57217       { 0x988fedd6fdc783b1L,0x9f34cd87436ed055L,0x29f243648bb8809fL,
57218         0x6962ca24b8dc8b68L,0x076cb7b931963ff9L,0xb609ad792b915093L } },
57219     /* 34 << 259 */
57220     { { 0x169e025b219ae6c1L,0x55ff526f116e1ca1L,0x01b810a3b191f55dL,
57221         0x2d98127229588a69L,0x53c9377048b92199L,0x8c7dd84e8a85236fL },
57222       { 0x293d48b6caacf958L,0x1f084acb43572b30L,0x628bfa2dfad91f28L,
57223         0x8d627b11829386afL,0x3ec1dd00d44a77beL,0x8d3b0d08649ac7f0L } },
57224     /* 35 << 259 */
57225     { { 0x4aeb3f870af947c6L,0x9ac9ff2791d090c1L,0xeaaa7e0fcf698277L,
57226         0x737ccc2ff09d6155L,0xd5d4bde86753cc31L,0x3b9063477146d4a3L },
57227       { 0x75106d8959e32369L,0x7a8ee281645999b3L,0x9184fb5cfc3f675aL,
57228         0xaeebd0423ad4e239L,0xcff8f73e12f449d1L,0x2771bec17339eb4bL } },
57229     /* 36 << 259 */
57230     { { 0xf783db44e6674091L,0x57d0eed31e12a3b7L,0x62d2762af3474f91L,
57231         0x3d122edf0562af71L,0xaf78dbf77f4bbcbbL,0x8fbbbd97e55f0654L },
57232       { 0x77e117b004bac36eL,0xbbf6bd463ec582aeL,0x553acd10017eb463L,
57233         0xfc521187fdfd820bL,0x73211103089b6829L,0x9d3fe7ad7e01e5c0L } },
57234     /* 37 << 259 */
57235     { { 0x12a8b7ac04c6babfL,0x7b23210557d2cf63L,0xe03831868f21ad0dL,
57236         0xd14c2b95acdc2184L,0xe7bd19fcadc9bae1L,0xe2dbabf2edea5c71L },
57237       { 0x009a3ab78f3f4266L,0x159691e17f8ff74fL,0x5ae666aa22f40f41L,
57238         0x72fcdc88512387bbL,0xa74e8fb841516c92L,0xd9cee7833b15bf07L } },
57239     /* 38 << 259 */
57240     { { 0x00a93daa177513bfL,0x2ef0b96f42ad79e1L,0x81f5aaf1a07129d9L,
57241         0xfc04b7ef923f2449L,0x855da79560cdb1b7L,0xb1eb5dabad5d61d4L },
57242       { 0xd2cef1ae353fd028L,0xc21d54399ee94847L,0x9ed552bb0380c1a8L,
57243         0xb156fe7a2bac328fL,0xbb7e01967213c6a4L,0x36002a331701ed5bL } },
57244     /* 39 << 259 */
57245     { { 0xd76b43661c8bd222L,0x041c2b87b97e5b19L,0x7b80f8d7b47c4282L,
57246         0xfec3d476d0dbc7d3L,0x84aa69712753a830L,0xe5f336079ec85e26L },
57247       { 0xa425d60cfe2374b3L,0xf88b90f14d953af2L,0x80370e7857ca6c43L,
57248         0xe07d07176f4d6d7eL,0xe60639401e61ab85L,0x171a2bf632a4c829L } },
57249     /* 40 << 259 */
57250     { { 0x38e4168d4f8b5073L,0xf1ddc53fc521849cL,0xd2bf515bab917df1L,
57251         0xab76b71a697d45c1L,0x20fdc6c7cb566a9dL,0x3843bf838a031cf4L },
57252       { 0x9a2d89a58a028b04L,0x52f3cb1922a908cdL,0xb5df9c2b7b8723baL,
57253         0x5142f51060374a3dL,0x949b719800bd9f30L,0x4b7cda16c9b86959L } },
57254     /* 41 << 259 */
57255     { { 0x22a32c50d154fc49L,0xe12242de66357eb7L,0x67571eb89f19ef9fL,
57256         0x2ed01f28b92b20e1L,0xd4fd6efb6cd439c0L,0xc4036cfc03b057fbL },
57257       { 0x605fab271cc48da5L,0x3cbd7a071416a3e7L,0x9cfe7161714bf173L,
57258         0xbd03d786a77eb0f8L,0x1423516678b8f5ccL,0xecc56e02f0523f3fL } },
57259     /* 42 << 259 */
57260     { { 0x20b1632addc9ef4dL,0x2a35ff4c272d082bL,0x30d39923f6cc9bd3L,
57261         0x6d879bc2e65c9d08L,0xce8274e16fa9983cL,0x652371e80eb7424fL },
57262       { 0x32b77503c5c35282L,0xd7306333c885a931L,0x8a16d71972955aa8L,
57263         0x5548f1637d51f882L,0xb311dc66baba59efL,0x773d54480db8f627L } },
57264     /* 43 << 259 */
57265     { { 0x2be2f1d67d64ddbbL,0x3afc2fad6edd7e04L,0x9a57c16d9e797442L,
57266         0x1efecfde9c16769bL,0x86523c3571b2940aL,0x1a9b30035825d17cL },
57267       { 0xa25e99beeefc4d7cL,0x8521b49fb50df9eaL,0x10bd2309bd8f3b06L,
57268         0x1f892e95ea82e80cL,0xf741621c93585741L,0x95687594f5e5087aL } },
57269     /* 44 << 259 */
57270     { { 0xbcdd3a3146f684c5L,0xbc8be436f700b0cdL,0x33005e370de75b7dL,
57271         0x527a8a2c3bd820caL,0x5e44854446997e4cL,0x40921fd93c3dafb0L },
57272       { 0xf3873a8ab7390d9bL,0x30999855495ba2fbL,0x005164f0813c8c76L,
57273         0x05bb04d7fe8da60cL,0xee7c38d503224ad1L,0x172018d615785ce5L } },
57274     /* 45 << 259 */
57275     { { 0xaaf786c0f6442534L,0x3f1344c1e56b44a5L,0x31199702ed073a36L,
57276         0x1f8ba0ec3df17e33L,0xf3e7b63493ceee0aL,0x568bdf39490fc4beL },
57277       { 0x364bdd11b1e1c439L,0xa1aa317ae5a63c82L,0xb12697034c02ee46L,
57278         0x0bc6d92e7eb64374L,0x87538fe740ed83f1L,0x862450abda74892aL } },
57279     /* 46 << 259 */
57280     { { 0x59b1b1347a62eb3bL,0x0f8ce157cceefb34L,0x3fe842a8a798cb2bL,
57281         0xd01bc6260bf4161dL,0x55ef6e554d016fdbL,0xcb561503b242b201L },
57282       { 0x076ebc73af4199c1L,0x39dedcbb697244f7L,0x9d184733040162bcL,
57283         0x902992c17f6b5fa6L,0xad1de754bb4952b5L,0x7acf1b93a121f6c8L } },
57284     /* 47 << 259 */
57285     { { 0x293ff71acc51318fL,0x69437a2e614149cfL,0xb12ea4613b48b348L,
57286         0x2f58020321f6cf90L,0x2e865f77178b53fbL,0xf4774d29231909a8L },
57287       { 0x0433e66bc4d8b703L,0x4fb6256b907097cfL,0x44a2a7fe004470f7L,
57288         0x7d3ebbb46dc5f10aL,0xe9b3af288f5526b4L,0x4bc0d9db1107bd75L } },
57289     /* 48 << 259 */
57290     { { 0x4865c0ffc0391d0bL,0x70d31470176740ffL,0xf44ca9a1ed506d00L,
57291         0xfaac86f6c981153aL,0x713ddaf4e3f86940L,0x64ec27093fc39de9L },
57292       { 0x04d413acac9a26b5L,0xde2052eebb21664bL,0xa6e04de8957b4f20L,
57293         0xd185b640d5487618L,0x1668b6a46fed1707L,0xeed37894c435ac3dL } },
57294     /* 49 << 259 */
57295     { { 0x1fa08a16f69cdfbbL,0xabba54dd0bf735a1L,0x37848c6a68a5cc20L,
57296         0x08e23c52a969298bL,0x48240306f965bddeL,0x48492deaf90bcff5L },
57297       { 0x416b9005bd994e22L,0xa6ce214ce6429f16L,0x5aaeec21f43f86d4L,
57298         0x202db9b7a0b1979fL,0xb2d97b4fdd7ae6d5L,0x4fedb6b9e12f04a1L } },
57299     /* 50 << 259 */
57300     { { 0x7a56867c325c9b9aL,0x1a143999f3dc3d6aL,0xce10959003f5bcb8L,
57301         0x034e9035d6eee5b7L,0x2afa81c8495df1bcL,0x5eab52dc08924d02L },
57302       { 0xee6aa014aa181904L,0xe62def09310ad621L,0x6c9792fcc7538a03L,
57303         0xa89d3e883e41d789L,0xd60fa11c9f94ae83L,0x5e16a8c2e0d6234aL } },
57304     /* 51 << 259 */
57305     { { 0x9c8e64869c85df60L,0xa84692a681e26100L,0x0350e1209c739462L,
57306         0xb6da4ebf99fa1f63L,0x857b534055e2bcd4L,0x7f4001dbdb209cf7L },
57307       { 0xbfa320378757800cL,0x2d56821fa6a562b5L,0xe56d810b6c3e775cL,
57308         0xeba244a6ba757f86L,0xb7ca8dbf80a17cb3L,0x8cbff4a22b7db57cL } },
57309     /* 52 << 259 */
57310     { { 0x650c31da9dff967dL,0xecd1e0f77ed949dbL,0xa7ff9becb20196fdL,
57311         0x5085c68d1e6259aaL,0x5759a166871a71e9L,0xba15e24c2b4d3bd2L },
57312       { 0x22c4f75912c51998L,0x6038fb0a7c8a9400L,0x64827d9c09625dacL,
57313         0xd8ce10c96ec4fb64L,0xe417ac30095686ccL,0x1e624aa88c723f44L } },
57314     /* 53 << 259 */
57315     { { 0x872d3dc953387fbaL,0xaaa0e1b4317ec17bL,0xa12b45519efb728cL,
57316         0x0b43907d45a3491eL,0xb7fa83befa4a239dL,0xbecdae00b59a4f3cL },
57317       { 0xe4e4c7c393407d23L,0x8278f336cf1d3cd8L,0x73dc9356610570a3L,
57318         0x5579653d688d933fL,0x208b96be5881d760L,0x4752a645d12f57bbL } },
57319     /* 54 << 259 */
57320     { { 0x87ec053da9242f3bL,0x99544637f0e03545L,0xea0633ff6b7019e9L,
57321         0x8cb8ae0768dddb5bL,0x892e7c841a811ac7L,0xc7ef19eb73664249L },
57322       { 0xd1b5819acd1489e3L,0xf9c80fb0de45d24aL,0x045c21a683bb7491L,
57323         0xa65325be73f7a47dL,0x08d09f0e9c394f0cL,0xe7fb21c6268d4f08L } },
57324     /* 55 << 259 */
57325     { { 0xe02aca87d4bba3cbL,0xd40ac486652fb181L,0xa1dcfe7ffaa3f999L,
57326         0x116323e0e9eded09L,0xaa3a0f0f07629d4fL,0x9f8e49f5e0dc53adL },
57327       { 0xbae96096742af22bL,0x6d7e24dd518862dbL,0x5c91ba30bb333cd7L,
57328         0xda8df051e65319b0L,0x2b9305ce9b3e43dbL,0xbf1d0e98fe783571L } },
57329     /* 56 << 259 */
57330     { { 0xf629fb233809aa31L,0xb3b66d77650bd2b8L,0xcb643126bd325d57L,
57331         0x29f46272ed41fa03L,0x374e734f406ef56cL,0xbb9ecd36da7428eeL },
57332       { 0x069694a61c06325aL,0x852b2912e40b9e8cL,0x6504bc90cc3d9695L,
57333         0xf1af43587e38707aL,0x552127dc239a0781L,0x0d1b3a6e8fe76173L } },
57334     /* 57 << 259 */
57335     { { 0x207e41f31d681018L,0x8883a6e417a7d540L,0xffc48332bc983c31L,
57336         0x729c4110c6b3de67L,0x5ef4680ad69a2499L,0x4544b58fe7afb2e7L },
57337       { 0xf5a2fb13480e063dL,0x8797357382054197L,0x5dd38cf7131d2df7L,
57338         0x635e91b8a9366742L,0xbd87a407e0d703c5L,0x6cc37be247251f16L } },
57339     /* 58 << 259 */
57340     { { 0xc4ccab956ca95c18L,0x563ffd56bc42e040L,0xfa3c64d8e701c604L,
57341         0xc88d4426b0abafeeL,0x1a353e5e8542e4c3L,0x9a2d8b7ced726186L },
57342       { 0xd61ce19042d097faL,0x6a63e280799a748bL,0x0f48d0633225486bL,
57343         0x848f8fe142a3c443L,0x2ccde2508493cef4L,0x5450a50845e77e7cL } },
57344     /* 59 << 259 */
57345     { { 0xaa129c0ddc428c57L,0xfe619b75aea19047L,0xd6287ecf12ea77aeL,
57346         0x4e6d070fdf7ce104L,0xd0df6788f097c79cL,0xd1c1f8a6ad8b1d07L },
57347       { 0x53eceba296519e66L,0x71670de3d6274109L,0xd2f21ea03f7a82b8L,
57348         0x41efbe939c8e45a5L,0xb5b153436ada3edfL,0x32ba22aca90038f8L } },
57349     /* 60 << 259 */
57350     { { 0xe1d195fad0cbe947L,0xd1fe0c4ef2ef1b72L,0x1451a0b206003fffL,
57351         0xda653fa08239341cL,0x5f834372f2508d75L,0xaeb245f507faeac3L },
57352       { 0x3eb3285b65fdf4ddL,0xfb335c0e84085970L,0x600ad6cae5efc0deL,
57353         0xc9c9f8910cf83e82L,0xf880ff84ad8cc14cL,0x54816725a016aae6L } },
57354     /* 61 << 259 */
57355     { { 0x22ce565ce1124375L,0x30ff1dc5edd968c9L,0x62d74c54e9148534L,
57356         0xf003f0d35de42774L,0xaf9448e6e57f8842L,0x55d5c9a3c5ff761bL },
57357       { 0x7da9398cc4c5edd8L,0x9643424e4ea0e099L,0x497eed480634fcb4L,
57358         0x09ffe2d07dea57cfL,0x30673ba73530a094L,0xfdbf8f24a251cff3L } },
57359     /* 62 << 259 */
57360     { { 0xd0f4e24803112816L,0xfcad9ddbccbe9e16L,0x177999bf5ae01ea0L,
57361         0xd20c78b9ce832dceL,0x3cc694fb50c8c646L,0x24d75968c93d4887L },
57362       { 0x9f06366a87bc08afL,0x59fab50e7fd0df2aL,0x5ffcc7f76c4cc234L,
57363         0x87198dd765f52d86L,0x5b9c94b0a855df04L,0xd8ba6c738a067ad7L } },
57364     /* 63 << 259 */
57365     { { 0xf9ae5fcedb877020L,0xd84ad42f703e5d09L,0xa6a5cc1fbfaed17eL,
57366         0x2099409829362fe9L,0x9f863bb0dd299c2dL,0x82bd3f61fa632197L },
57367       { 0xd3b14097ebe7ff51L,0x7c9e6ec4c719a6bcL,0xd3b46f3d70a51db6L,
57368         0xc8fa2f0692eb8243L,0x68e1f56e02155139L,0x0c35d135fd3b893dL } },
57369     /* 64 << 259 */
57370     { { 0xe76894c3ae7ce296L,0x87737ee2a6cafc34L,0x566dfcfbe55cd1e6L,
57371         0x5421a9f23a7ad5b9L,0xa005838a4687a4efL,0x3837219a23a2c423L },
57372       { 0x4b7800128a82cd1bL,0x401c07bec728b588L,0x2b5f69e937ced8f3L,
57373         0x306b621d8c1e1eaaL,0x8acbbe71d389cc4dL,0x922fa665f4ab7774L } },
57374     /* 0 << 266 */
57375     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
57376       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
57377     /* 1 << 266 */
57378     { { 0x2df6f242d35c2d80L,0xf65a99a93493ce97L,0x9e80232b372bcc87L,
57379         0x26ba13b86e428cc5L,0x2526ef1f13a1b763L,0xcef3edcddc97c5f3L },
57380       { 0x4954867fbde16b73L,0x9817813d368ff6cbL,0x7e39fa69be143027L,
57381         0x12329463cf54f28bL,0xcf0991dc7597c2daL,0x0cda396952e07099L } },
57382     /* 2 << 266 */
57383     { { 0x412f64a3f303955dL,0xe92bdca9bd692593L,0xfbe6cdc2c2e964e0L,
57384         0xe9a3b1fd0011cb01L,0x6c30762dcf228f23L,0x1270b84abe9199a1L },
57385       { 0x732711dfe3c9cbb1L,0xa3aabe37d91d9513L,0x8ee08ba0c6eceba7L,
57386         0xb1711531f3c3d31dL,0x65060b633c716948L,0x046b4ea12ff2caddL } },
57387     /* 3 << 266 */
57388     { { 0x25d1124fbab220c6L,0xcd1423c861524e3eL,0x75e4f45f0434fb51L,
57389         0xb5180a8f5180ab2bL,0x144e214e5b22e388L,0x6b16dad192263054L },
57390       { 0x3ea7590740863566L,0x372d5abddada3b46L,0xb3ff5a3a893d210fL,
57391         0x39f8d1ce5e29f3dcL,0x559186ce68200e82L,0xf48764541202cb66L } },
57392     /* 4 << 266 */
57393     { { 0x6f178dbf8b540904L,0x0264bccd8720472aL,0xa6e8b4b459b46611L,
57394         0xafce8267c72b4a58L,0x21142175a45985adL,0xd23401dfe649d733L },
57395       { 0x6bf42fe085dc7720L,0xc5c8ab9440e3f2f5L,0xb0c8a58acd029197L,
57396         0xa73ff329215492e1L,0x895c545eb1b5a5f0L,0x6dbc24456fcaf49bL } },
57397     /* 5 << 266 */
57398     { { 0x25ef32d60f2d76a3L,0x540650b9af4a7d46L,0x8979a4b8d991d7f4L,
57399         0xdaa706c299202400L,0x8a729680f19d281dL,0xde25bdc44ec44de2L },
57400       { 0x0fc50832c2054496L,0xfee72fb60aaf2941L,0xc8263e64b82ed4f0L,
57401         0x91a8cb736f49055cL,0xb7585458f2bb515cL,0x03d2b23ab855e6c6L } },
57402     /* 6 << 266 */
57403     { { 0x09ec1e3dcfd3f182L,0x1f1c30b5adae7af9L,0xf3a33f7c6b454164L,
57404         0x0318926f94647c4fL,0x8e37bdd787db14ecL,0x811cbd342ab364d3L },
57405       { 0x1dd1e5077c2b369dL,0x7a57bc46a28056bdL,0xfca5be4b089efe44L,
57406         0xb3bd84d76dc1290eL,0x40d7af098793e6aeL,0x4e08e11fa3723942L } },
57407     /* 7 << 266 */
57408     { { 0xca3709ad899ffebbL,0x1a87377877c00602L,0x5ff40c2aa99b4af0L,
57409         0x680464e5a80e870cL,0xd2f7f04494e10b1dL,0xee9b206c4e9aa1a7L },
57410       { 0xb536d67596cbe950L,0x841856899e8305f3L,0xae1b669c369fa255L,
57411         0x62e260267233e1eaL,0xac05c5136aa60c24L,0xdfc6814fd2691677L } },
57412     /* 8 << 266 */
57413     { { 0x8baef5df0a02b0fbL,0x58a2b06bc2b92b02L,0x268558d754c8267aL,
57414         0xf924f795ccf70393L,0xe3763f30f68ee021L,0xc1e856f05c01ba4bL },
57415       { 0xcc01a3e9722b6bffL,0xd2be4623ed5b3b02L,0x1ab3512e6c45e33fL,
57416         0xa978fe484ef433f6L,0x23e2ea018e21f5afL,0x49647d8811524a40L } },
57417     /* 9 << 266 */
57418     { { 0xd50abc94f5d3f437L,0xbf2ffcc546b7b738L,0x0bf53571f80edda5L,
57419         0x167908d4ab90ba5fL,0xad445b102303cf00L,0x9b537d4fb9e59406L },
57420       { 0xfac5e27cf43049a8L,0x05ccb32ebf9db100L,0xe662eeac4d1b535fL,
57421         0xbf21d6d78d27ca90L,0xb960bf652a684981L,0xe16bdaee49236475L } },
57422     /* 10 << 266 */
57423     { { 0x47a5958f92ad4720L,0x12c33193da3bf809L,0xf16493147da6d32cL,
57424         0x42eb4e687102deebL,0x0f8c4ce283088c86L,0xedf91c3bd693c9a2L },
57425       { 0x8a18a4761e8c310cL,0x5e8757c5dc3db0e8L,0xc48b820ef76a0affL,
57426         0x690d788d5c71e596L,0x2b0a00857cfe770dL,0x440ba06bd46505f0L } },
57427     /* 11 << 266 */
57428     { { 0x503f77906087d4d0L,0xc7243aeda1ebfb04L,0x203f0563ad8f14bdL,
57429         0xc20013b7cad73fcaL,0xbace8b323741a708L,0x0b376ff731bdeb56L },
57430       { 0x820b7f1282c22e57L,0x0c08133117830562L,0x306d178a8d0d30c2L,
57431         0x36a6efd1467a1510L,0x558fea1af55b7b97L,0x1e9152b784e546eeL } },
57432     /* 12 << 266 */
57433     { { 0x92a7fbcdac3ce531L,0xeb85f7f059498d99L,0x8e45db2d02a8feb5L,
57434         0x176c0cb2728cecbeL,0x33fcfbb0d1837662L,0x426e192dd6f2882cL },
57435       { 0x75a0f3450a2c9899L,0xd815dc6066148f9dL,0xf4ea90cefa0453afL,
57436         0x5108858ff54c96fbL,0x86b46b5731f77afcL,0x59df021f6bf7e2fcL } },
57437     /* 13 << 266 */
57438     { { 0x48d67f73dab6c0f4L,0x70cfc26cf0d49ef3L,0x25c95a68a65cce7bL,
57439         0x29a05632cf6ad228L,0xbcc2fb5a1a8128f5L,0x360d82a48c9defe0L },
57440       { 0x1c5c5d628d1531d8L,0x58fc4b9a149f6b4cL,0x8097cf56a3b625adL,
57441         0x8821ead7fd8e0e35L,0xb96c2b880d9e1df0L,0xfbf55ba72a243accL } },
57442     /* 14 << 266 */
57443     { { 0xef32e94d70e0d8fcL,0x33ec93dc6d63e65fL,0x134532fb1dc7156fL,
57444         0x98fb5b0c0e8d85b4L,0x05c28df9b64f7861L,0xa7e73afa4160e1a2L },
57445       { 0xbfe60a9b785f6e4bL,0xfcf998f12fec9ec5L,0xf673b8d15c12a44aL,
57446         0x85df3bc736d189a5L,0x4480a189dd83f6e0L,0x3216317ef3d3ab44L } },
57447     /* 15 << 266 */
57448     { { 0x221c1b7ffd3d7532L,0x40939c318bb4e719L,0x75182ce602f8f74eL,
57449         0xf508d6415395f9d8L,0x88fc89ea1fc81977L,0x861d8d0bcc8dc7d3L },
57450       { 0xd76e4f0cec07b0e2L,0xb0a4e2aa5819b99bL,0xa67bed0366a9c935L,
57451         0xce7c8241d2781f91L,0xe7c5c22512af0abdL,0xd1067dbcfde7de16L } },
57452     /* 16 << 266 */
57453     { { 0xe1d42d94d087b788L,0xfbfb221aba0e176aL,0x5f6698e783686966L,
57454         0xbb5e159474a30dbfL,0xef86bb5bcfd20230L,0xf055a1c5403b8f8bL },
57455       { 0xf249aac8d9d85ea7L,0x7318f7bc3d200198L,0x3b80960cefca9a90L,
57456         0xf28e33888f449c4bL,0x0cdfc61bf0cfe09eL,0x3b169c638b22cd26L } },
57457     /* 17 << 266 */
57458     { { 0xf4f13a49b81b45b0L,0xb77a67be3003fe1bL,0x70e648a318d52c97L,
57459         0x701ba8a1ee17ce93L,0x58a0ce0cf672226aL,0x2fcad147cebc3294L },
57460       { 0xf5cd118a104e8f68L,0x0015bc0bd15358e6L,0x75f0d28f1c662df4L,
57461         0xcd54f443a3e038f4L,0xa83507610804c717L,0x5fce0ce3f03bad08L } },
57462     /* 18 << 266 */
57463     { { 0x4c2e2bffa180a71cL,0x067f3e3baff551b9L,0x007610f1afa43e12L,
57464         0xe8a9ae79ef7b9a1cL,0xa558ef6cf9d3b397L,0x8d5229884f172f34L },
57465       { 0xafa906332d425e05L,0xc62c3914207b0bd8L,0xc84d197c059f7d66L,
57466         0x6cc1d8ce421a9172L,0x1d44a46929a7ebe3L,0x96ca4d0171c3c8b1L } },
57467     /* 19 << 266 */
57468     { { 0x31302e094d369fd6L,0x62fe210cf1b62d27L,0x496ac173bb37578cL,
57469         0xb4d3d065aa0907e0L,0x02317db27c822875L,0x60a01580f241ebc7L },
57470       { 0x81a5d5244e4f37d0L,0x5286f7289c3f2555L,0x14c8c7549a73ff08L,
57471         0xd8236689ff478877L,0xf62d426b08e09f00L,0x2ba1833c67a96517L } },
57472     /* 20 << 266 */
57473     { { 0x7013d596831f464aL,0xe57185fdd3cf6ca2L,0xbba7898e35915f51L,
57474         0x9fbe5f139fd967d4L,0x0aba8344d173558fL,0x4c0dd30dffeb6beaL },
57475       { 0x928f68cc5110e40fL,0x1589a327a58b6d60L,0x09b5c4e06abb0ac9L,
57476         0x01ef3f8a68957627L,0x55dbe9f79f4045a4L,0x91976aeeef178ac3L } },
57477     /* 21 << 266 */
57478     { { 0xd9c20a69b85e46d9L,0x1bda1163cdbda686L,0x5c0717f6c02427a9L,
57479         0x2a976c104d2a48afL,0xea276b15921a02e5L,0xf055b980ddb6315cL },
57480       { 0x0ab85663825f00efL,0x95377fd42053a392L,0xc51c245e23f463e8L,
57481         0xe1ae1e5da24c981fL,0xd6a0b44d9f5cfdbaL,0x1205754023c16002L } },
57482     /* 22 << 266 */
57483     { { 0xfe464ce116ac9150L,0xfd629551173ee9e8L,0xd0623ab1781696cfL,
57484         0x7a07cedd58529fa9L,0x831b4a9d449c33a0L,0xb7b7b72417b171a8L },
57485       { 0x0e1ff931f5a9aa41L,0xd43f33dfe356ba47L,0xd2abfc77f003b5d2L,
57486         0xc2909150882c0313L,0x83823f6c7ee111a6L,0x9d7a2d82f59cb72dL } },
57487     /* 23 << 266 */
57488     { { 0x52e712549b33f6fdL,0xd4d9b73f5c414babL,0x9834943177e93a9bL,
57489         0x848b53c99f283fc9L,0x86e48b6234c787efL,0x8b498e1cb3166045L },
57490       { 0xb2259559e5e456ddL,0x0316069fa2c2ca8cL,0x9a70e29ef6524ecfL,
57491         0x2477ffc9bfff600dL,0x80a9a5e081869e1cL,0x84f887e70a78f6a0L } },
57492     /* 24 << 266 */
57493     { { 0x7f89c2c40c9f23eaL,0x8fb025d4d6ec2b2aL,0xbe70e48b12d9f811L,
57494         0x703ac1bdc7a43dd0L,0xa4309a2c2118ca3aL,0x5a95d7b301943012L },
57495       { 0xd9597d87811f6c73L,0xf82e801596079992L,0xfcf8760df1561aa9L,
57496         0xe1e0306e2d91ee39L,0x99979031e0bbcb6dL,0x49259e54cfcc8746L } },
57497     /* 25 << 266 */
57498     { { 0x0de49373a38fb6dbL,0xda9e9036d6bf0a7dL,0xc99fe05fcba221c4L,
57499         0x45b51edd4cb730f8L,0x312670a3b064e142L,0x60dd1edecddb9ddeL },
57500       { 0x94be613b9291d75dL,0xbc49861ca00b9831L,0xccec7a08230320bdL,
57501         0xd1de7bd80ff967b1L,0x5a1164f105fda7e3L,0x864cfc4ce3004538L } },
57502     /* 26 << 266 */
57503     { { 0x06f76165385095a7L,0x3c73ac918514b2e0L,0x8ac1120a04b2dac0L,
57504         0xed6a74174382d5b3L,0x852a5a7864a32d50L,0x7ef5b84bbdc721acL },
57505       { 0x73dd18980480d271L,0x755b23e04ab0b11dL,0x2e78238982391e5aL,
57506         0x4957b5c948923446L,0x4ab9318f6921c1fdL,0x8e455abd3e46607bL } },
57507     /* 27 << 266 */
57508     { { 0x5c41aafbaf25d6b6L,0xe351f1df916b63f6L,0xe28e9ba98a6efd65L,
57509         0xcbca736356afe7b0L,0xa77d6077f7384e6aL,0xcc9ad74a738a90abL },
57510       { 0xe1071caa2333dc2cL,0x4415691000dfc2cbL,0x0ce43c16afd89eefL,
57511         0x0cfbb8767b812045L,0xe6da40fa6d916fc7L,0xe404b3436302af21L } },
57512     /* 28 << 266 */
57513     { { 0x4073f246d9915433L,0xc0149d5672e06203L,0x0abb06c18fcec6a1L,
57514         0x3a7d1295d75a73f1L,0x65fd8700f18c9488L,0xc3cc0b27732f7741L },
57515       { 0xd15d8c8025a261caL,0x518233510dc1fee5L,0x981607c7120e1266L,
57516         0x0e486b11f42cc9fdL,0xe606c16c01a888cfL,0x079dd0b31ea23249L } },
57517     /* 29 << 266 */
57518     { { 0x19c62d3c58624305L,0x44974c41b73eae15L,0x2df48b6dd023231aL,
57519         0x6a82c197c6fad2d0L,0x55758764c623fdceL,0x29f533fbadcebd90L },
57520       { 0xcfbe4155cfff7336L,0xb18415c7bfb609fcL,0xc23395ad8d411a6cL,
57521         0x25aebbcf0c92de60L,0xf4d3b1ebc5ccf268L,0x9646b4a79ac85de3L } },
57522     /* 30 << 266 */
57523     { { 0x0f423f3013d6cb61L,0x239b2baa66674aceL,0xa6f2ba39eda69340L,
57524         0xdbbd20eb43e6918cL,0xe6ce84a3e5e7248cL,0xd9184bb5e04c580cL },
57525       { 0xe4b76d96a0738aedL,0x98662b6090d480a8L,0xfb14bec72610b6c5L,
57526         0xdfcb01f6bb65837cL,0xd7f0b6ad4a97fb21L,0xe6d84f4bad59b2ceL } },
57527     /* 31 << 266 */
57528     { { 0xa79085eb1f7e921aL,0xe2737a08d0aeb41fL,0xa96d7e8169ead959L,
57529         0xbed1731b733b7c6aL,0x7768e32df508a48aL,0x6f73a08651ccc97aL },
57530       { 0xb7f94a4b9122db73L,0x1cd17ca257ec947eL,0x7c83fe278f8445f1L,
57531         0x661f5d82b520fe34L,0x495354942233d364L,0x0bf7abe663925ca2L } },
57532     /* 32 << 266 */
57533     { { 0x923e948c203bb368L,0x58e37a2b231a80e0L,0x345a011a6df27debL,
57534         0xba6784c1d57f4ca2L,0xf01b3703114196e9L,0x981a63eb1aab426dL },
57535       { 0x2ffdc97851770c1cL,0xddd19da6efa722fcL,0x5ca1c01216f09c1eL,
57536         0x612021de5b9cc0b6L,0x910e10e95e150569L,0xacace9dce2ab93eaL } },
57537     /* 33 << 266 */
57538     { { 0xf66601a7aae13423L,0x940bcd2882cf3308L,0x55de590974f632bdL,
57539         0xf677d9d4f183faeaL,0x54026b2828ab364cL,0x2a5353dc743469edL },
57540       { 0x15f02aadd46871d5L,0x4b3ec89b5a2100d1L,0xca85c3681eb9c381L,
57541         0x145cc7fd50e78466L,0x75fdac98c4b4cdf3L,0xb7cb9170796136f4L } },
57542     /* 34 << 266 */
57543     { { 0x6e89c0df54827957L,0xafb26b6d05805250L,0x0c0dc4ea37343465L,
57544         0x2d3c8b873daca876L,0x733b23d9554a2cd8L,0xd4f2936a6a04d38dL },
57545       { 0x0937611686f90d9aL,0xcd854d3211425591L,0xbaf9d4cab55b4bf3L,
57546         0x47259b95144676c2L,0x765cc4b55d7d2835L,0x36e47a8882b2cbafL } },
57547     /* 35 << 266 */
57548     { { 0x2070db373af8c96dL,0x4c2db2623b70e976L,0x7ed4d1e9c01f404aL,
57549         0x04a52764b39d2e07L,0x06e4a7984ebe3ac3L,0x35c9c1f68d7645a7L },
57550       { 0x2e0b48c75e9c295dL,0x5d44fafaf78e0717L,0x2fc27eba04213067L,
57551         0x9f3fb2ff2ab0f0e6L,0x374b32fd0c730af6L,0x06ec846129583945L } },
57552     /* 36 << 266 */
57553     { { 0x583a3272230be37eL,0x4d3298951c55f593L,0x3b3a2d8a350f0334L,
57554         0xec830170b25498abL,0xd65847d9b3a01571L,0x4605e739663f86fcL },
57555       { 0x971b8e115c4bf502L,0x651d179571a892b0L,0x57930832d2d1a4f9L,
57556         0xf97010745b09a4c4L,0x76b023e55ec2d1a6L,0x8648b8bcf49e1329L } },
57557     /* 37 << 266 */
57558     { { 0xc5a8884d6d5c7411L,0xad32aa97d098e2f2L,0xf99569e945d8ad00L,
57559         0x35801c1c0a232776L,0xe426fd65fb1a2cb2L,0x874b559ecb26ae10L },
57560       { 0xfa67c2ddf44461b8L,0xc58f8d229418e17cL,0x5998197169908eddL,
57561         0x8a4a14b8a1f78300L,0x4814c36e61f7fbc5L,0x0389dcc716a1c7adL } },
57562     /* 38 << 266 */
57563     { { 0x777e308fc072cf71L,0x4a2d66928c807ed5L,0xa4fe074124842689L,
57564         0xa3c2a867151ed7b1L,0x52ef24f24d22ee35L,0xe684ac76499053ddL },
57565       { 0x0b7c223b0582cb86L,0xa6c18539bb81f713L,0xb472da7f66d2aab9L,
57566         0x3592ab7b7916d4e5L,0xed651a05770c49a1L,0x7b879da1c0256420L } },
57567     /* 39 << 266 */
57568     { { 0x82eeaa1496f83e29L,0x586f3e8de5cae8eaL,0xb671eddbb298eb5aL,
57569         0x41efea86dd0da080L,0xfe9af019564a382eL,0xb2f370463027693bL },
57570       { 0x65466e5018789c0fL,0x5b0870ac2ebfe89eL,0x9093f416a59f3a53L,
57571         0xab0cd17251864c77L,0x8e3aa9864481457bL,0x46cfd207896346a5L } },
57572     /* 40 << 266 */
57573     { { 0x473bdac887cb6ae0L,0xbd3001b3f155c32bL,0x109643c20026e8a5L,
57574         0xc4f5f6cc188a568eL,0x630aecf64d2758e0L,0x4549949955b91872L },
57575       { 0xb10f19d4b6a09df6L,0xc537a4bb37f26d01L,0xd29f505c4d19a293L,
57576         0xf388a5d2cbb09b17L,0x462efffc6811a49bL,0x8a1cbc40b2f3aef2L } },
57577     /* 41 << 266 */
57578     { { 0xf7d94342b7b42998L,0xcdfd6e43629089abL,0x622e8d3cf7932661L,
57579         0x4818adca0b14b257L,0xcc1dcd1ccdb486bbL,0x58b6cb7ecce8b358L },
57580       { 0xca36c0b4e640cebeL,0xcc5598942d25f742L,0xdf4f2a9ed754d3eaL,
57581         0x072eb5e5f44a8604L,0xfa7b1a03cd5ca1c5L,0x6b6b4967d4779eceL } },
57582     /* 42 << 266 */
57583     { { 0x0f0233df8665f6f2L,0x8cd887463bd40f39L,0x23a41596eedf8d3aL,
57584         0x3f50e3f0b5ef5455L,0x935b24e0a50cd358L,0xfdd0e940d362a9a7L },
57585       { 0x6b00a6d154371aabL,0x2e707c4e1204bcf8L,0xb4d2d2dc30233f88L,
57586         0x470c3201783e58efL,0xf53987865ac21a16L,0x278487d626c3513eL } },
57587     /* 43 << 266 */
57588     { { 0xab5ac4df7d40427aL,0x0c4fb23b66ebdcedL,0xb02f8632b87df612L,
57589         0xebbd2e7f1801700cL,0xdd11de725b675e5bL,0x2adfb20662d7210fL },
57590       { 0xe3ba7c0e28667b70L,0x3e190a438fe31c22L,0x57908f2bc3390733L,
57591         0xe9e8714ccb6fefbbL,0xabba506dfd51c513L,0xd50f979f6b798860L } },
57592     /* 44 << 266 */
57593     { { 0xdf224cea1eed2b0bL,0x10205f438814572bL,0x8b99d85c02eb9b6cL,
57594         0x7a8a3d146c63a672L,0xc8822c6c96f45695L,0x0530f619c7f532f5L },
57595       { 0xb981e182310f8355L,0x49318290f201444cL,0xeaa4c406f9b76d19L,
57596         0x960fa2c7534a91c1L,0xf98966d1522b7d9dL,0x66912542c757dbd6L } },
57597     /* 45 << 266 */
57598     { { 0xe265972e1fe73a1aL,0x77e234c2987a1a34L,0x1814bdfe8c5789c0L,
57599         0x908f55c7df2ca0d7L,0xec207eb2a6a50ceeL,0x63cfeaffee916760L },
57600       { 0x808a758bf466a1b8L,0x2a48112d8383b0afL,0x5238922ef1a4ca6aL,
57601         0x5c422786778de666L,0xf5a8c6b5d2f549ecL,0xcac5d0c5242bbc9bL } },
57602     /* 46 << 266 */
57603     { { 0x33e0e005b34dbf06L,0x7bbdbe1e1fb341dbL,0x443fde882bab5425L,
57604         0x9db5bf1a86b57cdfL,0x72c535c309a93848L,0xf7aa9432b5f216ceL },
57605       { 0xc17dc7ae0242308dL,0xf1cb5dc5db0e4c0cL,0xb9d16d58a2b7112eL,
57606         0x486cda07ee4494b5L,0xeb46ab545d431adbL,0x3261dc5181ab565aL } },
57607     /* 47 << 266 */
57608     { { 0x476a4bfaa2a8a081L,0x43c5f841394f851bL,0x659baa591f5b22ddL,
57609         0x49a786aa65f680efL,0x091bd21608fcb9d8L,0x13f6953d984fe1f1L },
57610       { 0x7b5d9f4b6d6d40a3L,0x2f135dcf0d458d54L,0x2da18c3d3a71204aL,
57611         0x3d93edb97a3486d6L,0x026fec7261846af9L,0xa62197bcd5200dcdL } },
57612     /* 48 << 266 */
57613     { { 0x0cdd83725070e0a9L,0x7c5ad562ec550783L,0x9652b8474f3b8d2bL,
57614         0xfdd60d93e6e98d73L,0xd51cae2ca3479d0bL,0x11b93b6dee05c006L },
57615       { 0x9d72b82d8a3b40d5L,0xc6e996fea7d24855L,0x420672f7398603deL,
57616         0xd551b34a9a1af2ceL,0xdeb8c1d913bdce0cL,0x56ca926debbeba7aL } },
57617     /* 49 << 266 */
57618     { { 0xf63ec096bb85ca8aL,0xc149664173bc52f2L,0xba792560c02fc808L,
57619         0x9a6043e3533c6523L,0xa9d78f0aa8564390L,0x7fef67e494614bc7L },
57620       { 0xb4091b8fd389234dL,0x5913368e82db1d08L,0x178f7df0981cc6caL,
57621         0x19b1f2be725ec048L,0x852aad85012f9c44L,0xb07cac0dc894e777L } },
57622     /* 50 << 266 */
57623     { { 0x1c1709d02c7e0767L,0xec1013234d70b117L,0x95c57e678beb8e05L,
57624         0xdbf29e2e1133fa4aL,0x917f4a6c5139e020L,0xcf0be5098399735dL },
57625       { 0x83014c169c878b4aL,0xe0c14d2cf789b84fL,0x222aba39165a4aafL,
57626         0xe135f2b384441391L,0xb6f1cf7e19c3ee07L,0x2f918da9f810499eL } },
57627     /* 51 << 266 */
57628     { { 0x026ee35816bb2bddL,0x8c8953f8566d8470L,0xf0cd746d0fc63932L,
57629         0xddf3e54f060a07a3L,0x8da877a643b4e92dL,0x7ffd839dfdc9e34aL },
57630       { 0x5c3527445df04d9aL,0x3c5eb576b69f84e0L,0xf73cae300848d993L,
57631         0x3438f2bea0fe7fdbL,0xd4e7511f0eaf0168L,0xa7ffd167c768386aL } },
57632     /* 52 << 266 */
57633     { { 0xbb91877acfc74bb0L,0xbe742182a060a71eL,0x116e5a626ed7786cL,
57634         0x0a496b1bea669e56L,0x3a012174b8f02e6eL,0x6add760c106174f4L },
57635       { 0xaf2606e05e0292cbL,0x7800a495c7b7bad0L,0xca02c9320a1c5954L,
57636         0x904f23c6b245ad57L,0x28d6cc2172934de5L,0xbb7ed903283752cdL } },
57637     /* 53 << 266 */
57638     { { 0xc80288125e58122dL,0x7a5c65f1c4b089caL,0x4ddfd3663b980faaL,
57639         0xe8129f7f96a909a0L,0xc177aa042221ffacL,0xaf444ef78ff46e81L },
57640       { 0xa627f3d76b154996L,0x0f06fa7b115e2a5dL,0x2532b85d43fdb775L,
57641         0xb6d96b32eaacfb58L,0x898766304f834382L,0xfd2ffde9d5636b92L } },
57642     /* 54 << 266 */
57643     { { 0x318cf974973757d0L,0x12882d0a94ac73a2L,0x1fb74a53bc250843L,
57644         0xc612569eccd8d47dL,0x74cff8789d5f7c8cL,0x54e0e475375a7366L },
57645       { 0xe8322d23d0f57cd4L,0xb6ec5666d95a6e0fL,0xc8374b254a4bd084L,
57646         0x9459181b349d93ebL,0x7011f0a61368b9a8L,0xed57a19137eb2833L } },
57647     /* 55 << 266 */
57648     { { 0xd245d180fa5f79acL,0x44c331f35b41fcb3L,0x13188b6e27ee6c0eL,
57649         0x54ce984b23fdc742L,0x66d4e1303c81c213L,0x432174030ecb6fd8L },
57650       { 0xbbeb09fe111ae08bL,0xb22ca6b42e2df05cL,0x0e9d01dd0fec9be9L,
57651         0x9ac4523dfd2fc4abL,0x3d9e98c8fdc059f5L,0xd52e6dfb2d2cbde7L } },
57652     /* 56 << 266 */
57653     { { 0x80d7ef8598100f17L,0xb9795c7112db3f3aL,0x44473659296a7c44L,
57654         0xa46810f21e5bf539L,0x5621241814ee1e3bL,0xea8284e209931822L },
57655       { 0x424c613e42ac1e42L,0xe84a80afbccf9466L,0x21a8cdcc45132204L,
57656         0x9505a4148d58da62L,0x773e09837b3f47aaL,0x0ad0cc91e109bc6dL } },
57657     /* 57 << 266 */
57658     { { 0x98e2509bb527b250L,0x2dd30c824a9c762bL,0x54025da4cb2a00a2L,
57659         0x88ed00ff04d8e0e9L,0x5699890219ab1fadL,0x92fffc41697b0226L },
57660       { 0xb481d1ee7d08a39bL,0xea773f7f82be0803L,0x967e848a6de8ec6dL,
57661         0x6ea1e46380293472L,0x941cded72e988de3L,0x85f96b23399da6b5L } },
57662     /* 58 << 266 */
57663     { { 0xabd86572f1a62473L,0x9ec25d0bec274738L,0xd27d1a8c2052d4ccL,
57664         0x1f2a2a9ba95de3f0L,0xe3b8652ea2c91bcaL,0x1a4f6900822175deL },
57665       { 0xd9405d4662475a44L,0x4ecbe06cfe55c587L,0x30f8d199a4ac2f35L,
57666         0x2a5defd8d3c12844L,0x6d0fd9d673fe9b7eL,0xb0ae1019adf1a196L } },
57667     /* 59 << 266 */
57668     { { 0x6c9a378c30734f5eL,0xdf04359f6aaf7b42L,0x244422fc16f87409L,
57669         0x81dfb15b08bcd67cL,0x24b7d083a5e4a8e0L,0x557183410431786fL },
57670       { 0xc8feeb8c33f3ec2eL,0x360098cb2be371a0L,0xf4f3d992bdb874ceL,
57671         0x47b432ed87af8471L,0x5c4b1dbdf87535deL,0x6bb6d6dd8301f660L } },
57672     /* 60 << 266 */
57673     { { 0xafa9338759769f77L,0xe6c710cb49e502b3L,0xe6fd7b8d1514da98L,
57674         0xb5924c63aedf93caL,0x4cc36795c112b37bL,0x0ee30ce3231def42L },
57675       { 0xe1f436e7daf8a37eL,0xed54b7f56efa184aL,0x09ad65752c0dfe63L,
57676         0x5ed9da43ca530b38L,0xea2fa192ae156274L,0xbf096c54a4429edaL } },
57677     /* 61 << 266 */
57678     { { 0x41401b98f54490cfL,0x361a24a143b21183L,0xf0176431b6570f0cL,
57679         0x851bfe9d05c8bd3aL,0xe44f4ba74611e1b9L,0x587677dc28bf2c27L },
57680       { 0x3e3b67886d85341fL,0xad65a69468aa381bL,0xd269dc711aecf19bL,
57681         0xb94b64a2d98e6a2cL,0x6004b569a94661a0L,0x81713a8e689181d5L } },
57682     /* 62 << 266 */
57683     { { 0x55b1901d3649638eL,0x2e9929c416abaf64L,0x2d2b160ee9cd0090L,
57684         0xb5ef6525f55f13ccL,0x447aacbe11c3e8a5L,0x2c54e602630cf4c4L },
57685       { 0x3f6d99fc641d8eb3L,0x35386c1384877912L,0x7195db8973f31b6fL,
57686         0x63297cb2d3a22085L,0xa627593833fe97cbL,0x2f9a6f0da1eaef0aL } },
57687     /* 63 << 266 */
57688     { { 0xb70d7683c63d6dd3L,0x60ea781084acedf1L,0x7646260c40d62cd0L,
57689         0x687000b456142a6aL,0xce3c4728ccb9177bL,0x45377d059928c509L },
57690       { 0x75cc40bb1a78af0dL,0x43a1661cc69e59fdL,0xf9bbcbf8044a943cL,
57691         0x934fd40d7c372080L,0xb6edae96cb2eb940L,0xa02bb5fd6e063cc9L } },
57692     /* 64 << 266 */
57693     { { 0xac58c9e09db9ca19L,0xd308ea5d390054d0L,0x32ef4afc2cc42529L,
57694         0x08bd48b397c2bdf9L,0xac8a7803a849e19aL,0xcd51c0da75c31496L },
57695       { 0x733dc7def0e2d49fL,0x7c9caad1b44b8cc5L,0x6d9c5b0847be21a8L,
57696         0xfab0fdc55ebf426fL,0xd60748caf94e9e5bL,0x3072e59269366089L } },
57697     /* 0 << 273 */
57698     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
57699       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
57700     /* 1 << 273 */
57701     { { 0xb06c17a3f0ef77c5L,0xc144e7846df6bf59L,0x2440ae990038aeb2L,
57702         0x83bf711b58b402caL,0xb8763e00b577732aL,0x509e91eff651a932L },
57703       { 0xbe02ab9d00ac109eL,0xfbcb426c8dfd78f1L,0x7ed272f64283f80fL,
57704         0x098cf0572365da5eL,0xd90e6f1805dc6bebL,0x09ef177fcf7b9d72L } },
57705     /* 2 << 273 */
57706     { { 0x6f101762eeb791c4L,0x0d942184df261effL,0x2c58e2aaac1dc827L,
57707         0x51410e89f835a1b6L,0x981333a7629915a4L,0x371891b60c14148dL },
57708       { 0x4d20b3d3c0904446L,0xdda7ecc8949776d8L,0xa664b68c2a2645f7L,
57709         0x7a6bc857add082eaL,0xe7467dc63e5ff206L,0x40a6c34004e2dfccL } },
57710     /* 3 << 273 */
57711     { { 0x3d0efae3106ba1a1L,0x9c717ca192d7be5aL,0xa5cb5a253f00eeeeL,
57712         0xc2f9258cd86161ceL,0xd2b0865f5c4a389aL,0x8c06d7689b1f2159L },
57713       { 0x5a758a612753107fL,0x5ab6449d0a539c19L,0x88655a4949d301c8L,
57714         0x129647e61c4bb89bL,0x06f0665ec360259cL,0xcdba2f0b066197d1L } },
57715     /* 4 << 273 */
57716     { { 0xa235456903744726L,0xd2169e6dd8d275acL,0xab0c247b132c5689L,
57717         0x129a5c9dcc4760bbL,0x03eba46726ae821bL,0x67a33fda3df1cf83L },
57718       { 0x010813cfb8421b7aL,0x7b0f507098cd6d76L,0x907320b31fe4b600L,
57719         0xda3bfeb398dd3239L,0x23f1ed1641abb34cL,0x01b30f29946f85f1L } },
57720     /* 5 << 273 */
57721     { { 0x97c5f1c7d3970d9fL,0xd051c518ac8e6227L,0x3f67b3958e87edacL,
57722         0x3a5cbd287b9e4c17L,0x58c009e65671841dL,0x7bc5bddb518b3b39L },
57723       { 0xe7a8a6335e74a614L,0xf92e4c226ed89a92L,0xd0d6e80a118e663dL,
57724         0x33dba4f9dcbb4aecL,0x1d4cb3141f917417L,0xd8b17bfa3b0c5859L } },
57725     /* 6 << 273 */
57726     { { 0xc0fa0d21a093c3e0L,0xad34c41439e902a2L,0x81c8cd7599bc928bL,
57727         0xf7f8be14cdbbe4d8L,0xe46268b5c2339529L,0xcdc54e348283ba7dL },
57728       { 0x4c5cf62778904fe1L,0x056678c11b45e4d2L,0xb555ad6ad265abc2L,
57729         0xb8f8ca3f830306efL,0x48c8764681c20e1dL,0x5bb0a529737a7944L } },
57730     /* 7 << 273 */
57731     { { 0xbd4c2bfc9cf6fc5fL,0x888885140577af66L,0xb5aa2f05f9e3f7c5L,
57732         0xbd477bae64de6007L,0x1da5dcc9747e1224L,0xc2293d1732a15f5dL },
57733       { 0x4dd9daed029d6cbaL,0xf51362d62cf299c7L,0xe1a4b5c4279cd1e1L,
57734         0x4b129a5ea89acfffL,0x8292228ece1c8744L,0x5a440fa04fd12c86L } },
57735     /* 8 << 273 */
57736     { { 0x285248309666f8eaL,0xd579b3dfeff6502bL,0x3a66fa9900e4f78aL,
57737         0xfd8a65bb54a3f7a3L,0x505d3f631965a79aL,0x9524972c1891469aL },
57738       { 0x78367cbc3354da3aL,0xbfe1fe3de4941c6eL,0xe41bb3f6f5af173eL,
57739         0x57cb03ca5ca36597L,0x27f86cb87b99f795L,0x5cae6514ad4dcef1L } },
57740     /* 9 << 273 */
57741     { { 0x4b43f0aef1743346L,0x1700581944324c46L,0x86c77197e3603fcaL,
57742         0x230d516f4a6858aaL,0xee965b4ee7c56f7fL,0x4f4ed301dcefb75aL },
57743       { 0x610b138c4a740b23L,0xda3996a83ffc3599L,0x930698fcb2d1c304L,
57744         0xd55bdcd3702bf80dL,0xdf767c419e334726L,0x975352a9d0e819b6L } },
57745     /* 10 << 273 */
57746     { { 0xc117353b5e816653L,0x0c87bebe820641d5L,0xee588c6d9ecd29a1L,
57747         0xacdfe622c70edf9bL,0xe8b8024cebae414bL,0xd0c426dc9bd7ceccL },
57748       { 0x715cbc2efe735ce7L,0x8376edebc5e7017aL,0xe9b37efc07990dd5L,
57749         0xc89e384ed8d75238L,0xbc594d218438ffb3L,0xbe77e4d4d3628473L } },
57750     /* 11 << 273 */
57751     { { 0xc53720cdd1b4f3baL,0xb8ac3b4fadf2a330L,0xcef037f5fe179e70L,
57752         0x2743b382589d9147L,0x77a094d624423d58L,0x9e34c2e62a23d372L },
57753       { 0x641ea760983a5893L,0x2211e6a49a81548eL,0x56578a1a48735310L,
57754         0xedb91e03a57faa83L,0x4e14d5649b133629L,0x341f3ef957e82ff7L } },
57755     /* 12 << 273 */
57756     { { 0x4952a350d87a86c9L,0x08ed7da7034f45f9L,0x1e9ff8272bd716d0L,
57757         0x2471fd15f1d9331fL,0x0c708362d7370b75L,0xaddedde6fc1a1051L },
57758       { 0xf4475288db27b186L,0x5be4d46b3760bc11L,0xe44435d906d47ee1L,
57759         0x865cf7c8d0b7c8a2L,0xdb412be08d31a252L,0x4b90a9322f24d71cL } },
57760     /* 13 << 273 */
57761     { { 0x71b84eed8f7a3ab9L,0xf41d7edb2dc18004L,0xe408156dcc4a02cfL,
57762         0x0be155a25cd906caL,0xbf4b0f6991516399L,0x2ea85d434a7ff94dL },
57763       { 0xf199b31da26e9974L,0xc584df250b805ae3L,0xd4e7e8597a3634daL,
57764         0xf553f07770db4be9L,0x1cb1056fbf0dafa3L,0x235281b2a817d6edL } },
57765     /* 14 << 273 */
57766     { { 0xc3304e9260d2b80bL,0xab24dac9a38753bdL,0x40373d04cc1ebbf8L,
57767         0xa5a162d3437e68d2L,0xc8018b1257e8db12L,0x0c99c6de9bb52643L },
57768       { 0xafef0ff6ee24e63bL,0x329c46264bea9a14L,0x1b17d2e6effae4f9L,
57769         0xd25b93aaee300afdL,0xe83bfdcba0d62da4L,0x5e919538fd787740L } },
57770     /* 15 << 273 */
57771     { { 0xf5bbb4fe196c38e7L,0xe0011deca5c75baaL,0x2e29fe59b835aa49L,
57772         0xee22e2864230f17fL,0x8774214ff94c1060L,0x35bcca38e6d4c126L },
57773       { 0x18d984dbb7c9d255L,0xb1d5515c9b63dc4fL,0x425360f12a0cb854L,
57774         0x038c7f2317a1e286L,0x5e6b12ce951f18b2L,0xabfbde5ea65b1de3L } },
57775     /* 16 << 273 */
57776     { { 0x38a49bf555f0ad9fL,0x1a84c6b8f3618639L,0x5f709eca01b2f7c2L,
57777         0xc479a6505be8359fL,0x6b6a22bfd6646b3fL,0xcce78878cc5b711bL },
57778       { 0x8e7dbc63b446cc63L,0x231bd027218f800fL,0x2d3a7e04030271ebL,
57779         0xb08b5978e22fb3c7L,0x860d62789be0d46cL,0x253a31c21d49a915L } },
57780     /* 17 << 273 */
57781     { { 0xab4dbdf36ebc28e5L,0x56d5fec527be58b5L,0x6e9375d3cf3fd509L,
57782         0xfffea897ca4ddf48L,0x0a9542ae6a3757c5L,0xb9069a2e7d93911dL },
57783       { 0x3e74ac5f3dc967b8L,0x99c38796ea8f5a21L,0x27797b97a6ddea53L,
57784         0x9501e1c561dfcc1bL,0x568d3abe448e95c5L,0x021f8f4c0e7c186bL } },
57785     /* 18 << 273 */
57786     { { 0x98aa1f7a6e44f63dL,0x6451b170cb597ec9L,0xc0f6ee8721e13b78L,
57787         0x36c3b9c751cfd003L,0xc31718ed2f610040L,0xdddabc6688c48009L },
57788       { 0x5626f090a8369e4fL,0x0eccb1c06004a968L,0x2f0448035da2f1a4L,
57789         0x5390b6dd3846a726L,0x5c4caffea24f3083L,0x3c9baac8c4842995L } },
57790     /* 19 << 273 */
57791     { { 0x58c5fd1205c7a75dL,0xa98007fd10866935L,0x91369e874acd567eL,
57792         0xb7e05dc322c6145aL,0x24c949b4d949d8b2L,0xc5c574a590a6a437L },
57793       { 0x4306f0334798d1d5L,0x82af09f4520e01b3L,0x53fab41b81247f00L,
57794         0x3096ccf44ea93cbfL,0x9665e039f13ff09eL,0xb623f8b158e036d9L } },
57795     /* 20 << 273 */
57796     { { 0xbad6b669376bdc3fL,0xc4a8e7bc23a9ff38L,0x3f54d8c4555fb0a3L,
57797         0xfb3d5e1d2b23db1bL,0x6379f78af0d7eba9L,0x36004febfa0beffaL },
57798       { 0xdf0a373c334ff01aL,0x10314749dff12a1cL,0x1d52ddc7f184c1b3L,
57799         0x79431663ab02d404L,0x1a6488c17f4d3795L,0x3363660f7cca9102L } },
57800     /* 21 << 273 */
57801     { { 0x1e4595c6db3e57d9L,0x49e3d3d9bfb94ec5L,0x4c720de1a4f12881L,
57802         0x91a08340b06c64e6L,0x8e5c72f0ef0857deL,0x2c9b4cbc09bb76fcL },
57803       { 0xd4262fe4b0bba8bfL,0x64c5fa1439fcd07bL,0x518da4de62904ceeL,
57804         0x626182ebae4c9717L,0x900fe9f806351622L,0xf74aaa2241f9e4d7L } },
57805     /* 22 << 273 */
57806     { { 0x9d2c02839fabb29bL,0xb27ac46e172348cfL,0xddc6fb63de1f64b2L,
57807         0x532dc953bb097c87L,0xc7f5180cdaa34e27L,0xf96e4ad755438893L },
57808       { 0xc0b2eba324f54a0bL,0xeba396ce5b50d12eL,0x80b3a7f699772783L,
57809         0xe2fa82ff3ff7df4aL,0x55375369a2359baaL,0xa28388ed856c05bbL } },
57810     /* 23 << 273 */
57811     { { 0x4432fe8495a2d064L,0x4c6380747fec6057L,0xc33705bb33cfb533L,
57812         0x5e7fb7c976991cfeL,0x73d249bdb3ac1b6eL,0x963964c896aeddccL },
57813       { 0x8c1abe0e56b71636L,0x6ebb841f38693cd1L,0x00ef6a7b60e7cf67L,
57814         0x29ecded2c258bcb9L,0xb2d566a5e40fd26aL,0xa2910f4ed512abffL } },
57815     /* 24 << 273 */
57816     { { 0x56d6515604dc109cL,0xcd740cc809c1d307L,0xef9e049f10dfaeadL,
57817         0x19750b3ae30b70b8L,0x11ed860015c6a562L,0x53bdf97e12097026L },
57818       { 0x79559d056c0d908fL,0x8f1d75bab506d527L,0xd6fd7323ae8fb3c4L,
57819         0x834639c9a4111f88L,0xfc69a029a310a683L,0xa4467bbb255f2e9aL } },
57820     /* 25 << 273 */
57821     { { 0xa809a063e9e3953fL,0x09242dc960dc53fdL,0xa48f52d00080c436L,
57822         0x762a585dad2eb70dL,0xc6d52f047a3c6aa2L,0x1b6979dcbe60899cL },
57823       { 0x7a07af246d760794L,0xa5b1f912ef5c1118L,0x36367e4375bb329eL,
57824         0x594f349029e6bddbL,0x13cdc4aaa4a4f1edL,0xa7c3ff97b687a69dL } },
57825     /* 26 << 273 */
57826     { { 0x1e79881146f7c4c0L,0x25730855946abf8eL,0x1741fdeeaac2031eL,
57827         0xef34715b72ea60b6L,0x378eb680350ddcfbL,0xe72ac880ec237141L },
57828       { 0xb173251fff125bf8L,0x37ffb0cf4999b6daL,0x9eeb91a8817779f6L,
57829         0xa9edff0ae93ed1f3L,0x31f2ca241d7772d6L,0xd25c3f3b97f67b92L } },
57830     /* 27 << 273 */
57831     { { 0xb6c4144381478e46L,0x7b53d46350cf8795L,0xe96e7cb9ca5bf2d2L,
57832         0xc8fa39c695ac9ba6L,0x8ab037d12efc83d1L,0x0ccacbcc94bc2536L },
57833       { 0x45e7c7c774038e13L,0x47d5b7292f5e344eL,0x2e0ffb2cb1eed282L,
57834         0xfe88d3a88d5d0b37L,0x804b612e2487d971L,0x6f316d66c95d08faL } },
57835     /* 28 << 273 */
57836     { { 0x5f0a58a8a3526fecL,0x849c171b02f028c1L,0x34d77ce856a5d3b5L,
57837         0x9701621754d5a92bL,0x0cce35c12cc5b70bL,0xd9d5a00ae83f1f4aL },
57838       { 0x064223f826a0368bL,0x328a9f6940e16452L,0x3a6ac093d305ad2cL,
57839         0x759d9a16beba7c44L,0x86021de7637ce7c8L,0x276bed61cc80c1ccL } },
57840     /* 29 << 273 */
57841     { { 0x5d4a529ef9822e60L,0xc6f2702006edd801L,0xb2511d84efa3d8d6L,
57842         0x38cfba656a4c6598L,0x31a5779765c067a9L,0xcee558f387d2ca0aL },
57843       { 0xf22345cff844260aL,0x29b6352a63d2ae75L,0x59dad0ab6cc9f2bdL,
57844         0x615ad3599ae1bcb3L,0x3a29a237f692f42bL,0x543771c40f26163aL } },
57845     /* 30 << 273 */
57846     { { 0x427437e7d722576cL,0xc9d7ac7abb548ef5L,0x72f00f28c331a9e0L,
57847         0x5d9327b564949b48L,0xea75f3b54e2bb808L,0x28acdea068678f8bL },
57848       { 0xe9e787b20878223fL,0x213f47ff7e7b0a11L,0x5e967d39f277a3f7L,
57849         0xe6651015d2006de4L,0x49b87e4bc44eb1e0L,0xf461bb76222cd3a2L } },
57850     /* 31 << 273 */
57851     { { 0xd6b9341fde60d963L,0xb1a8dd0d5319a930L,0xc4f18dc0aa6b20b5L,
57852         0x787de2e7f23f4401L,0xc15b38eb28047029L,0x0bffc0b55c99d51aL },
57853       { 0xf0310f39740b5798L,0xf69ea1064ed8d3bfL,0x545a54d79f6722aaL,
57854         0xe5a9dee3af4017c2L,0x45efa2ec4a659592L,0xc5d64bedbed4e245L } },
57855     /* 32 << 273 */
57856     { { 0x66797f56bbe4bddaL,0xb92a369eda51b1a2L,0x18eef4a531adb034L,
57857         0xcf1cb5ee5d185cfcL,0xf596a59bbd53c27bL,0x1e1dd6f569002569L },
57858       { 0xd9433e797687e48aL,0x7d8d24c20cbcb9ceL,0x233cd7ed65d68ecdL,
57859         0x201bbe09fb2aded8L,0x987f4975ac9b750eL,0x949da385337f7f25L } },
57860     /* 33 << 273 */
57861     { { 0x31439e35b95fd11dL,0xf97e8fa4b691fb77L,0xcfdc02956d4ac378L,
57862         0xd31bc3b0d1a617c8L,0xd857098204bd015bL,0x30cca6efd6198f0dL },
57863       { 0x6a52650a805964edL,0xb656d7abd060eeb3L,0x5267f37ed38a9218L,
57864         0x5f28a2ecd3d6a193L,0xb7dc6e916d0d9c9eL,0xa7f84e4b219d45c6L } },
57865     /* 34 << 273 */
57866     { { 0x550ef2713398c3dfL,0xfe184954307631a8L,0x02cef50606e5cde4L,
57867         0x9687a39c10f11703L,0x02c35937acb10b97L,0x835b00fd13e3d219L },
57868       { 0x5828678b584d1abaL,0xbe55fb9cc9b40568L,0xe5a4a90e8fe19e84L,
57869         0x91e24c9248989b77L,0x094f9e7ae3d5f4fcL,0xfe9bdfb9759029b5L } },
57870     /* 35 << 273 */
57871     { { 0x43b1f8b9c1de72e9L,0xcbc8e0d4a3bdb164L,0x5c45d3dfbcc2e5bdL,
57872         0xb5137b69247bef53L,0x6d889f5673794e3cL,0x43e2fc9b1e2dfdc1L },
57873       { 0xda15dc5da995d3adL,0xa0db9f5ec43d86e0L,0xc42a144bcaac3bbfL,
57874         0x3c855fb174c43eddL,0x0731f33152688272L,0xc1f23e5643d7762aL } },
57875     /* 36 << 273 */
57876     { { 0x00c2ee1c9c7de99fL,0x28a7461d15e50391L,0x1bdc0e32a1c77952L,
57877         0xe98242c4d53d640dL,0x1a4724d2cf153c7dL,0x194e5dccba477d46L },
57878       { 0x871c8cfe3a0d4ccdL,0x62010af09af451fbL,0x9b354f9e6ddec75cL,
57879         0xe5db0a5d680e3511L,0x183d1270d247745bL,0x9910867aeecf52dcL } },
57880     /* 37 << 273 */
57881     { { 0xa970903e8bc2003aL,0x0f8bcfa4a3cf29bcL,0x7054f69e683a7ddaL,
57882         0x53928bf1ece30167L,0x2588bdf1ffffea87L,0x01683b5ed7172ad4L },
57883       { 0xa0ac85379de7e713L,0x217bcdfe9b0442bcL,0xba46b8f64d4adb3eL,
57884         0x320580990a9f8ecdL,0x0173b7bea504bdc5L,0x15321aeb82b1606fL } },
57885     /* 38 << 273 */
57886     { { 0x4f349e5f6e39d625L,0x37cbd935b80760d6L,0xb8657ee14b1e84c2L,
57887         0x502954064cb84bdeL,0x66d678cce8d23ef5L,0xcba173713ec3b79cL },
57888       { 0xed7ab3e526e3cee5L,0x34c68c516c44ef0cL,0xd704e724f8fdd226L,
57889         0x2fa0d2dd3a9b40a7L,0x373c5c70a23be590L,0x0beb611bda9f7f7dL } },
57890     /* 39 << 273 */
57891     { { 0xef506531913bc31bL,0x31210c5f8c320074L,0xb42faf19b861acc1L,
57892         0x26f09b89e041e774L,0x23fec89822f84c93L,0x9f8b9d708ec590bfL },
57893       { 0x604d7d2952644790L,0xb77e3136a2339c53L,0x17f1d7a920f2fc09L,
57894         0x8c6435d9e6bb96eaL,0x5cafeb5f3711b8a7L,0x1ec6c4edfa23ca24L } },
57895     /* 40 << 273 */
57896     { { 0x6fb6b7bc0410ca0bL,0x0e16eed2b3c13935L,0x98ad89d8316ff531L,
57897         0x4800ee179894d65fL,0x034ea3c448280170L,0x8126d12dc30be537L },
57898       { 0x43c2d27e5120e525L,0x96a5d498ee65df90L,0x654540105eaef29aL,
57899         0x1d8f07a17b678fc7L,0x54bc6f737b301270L,0xe58a8102e9473365L } },
57900     /* 41 << 273 */
57901     { { 0x1fa3a458aaaf79f6L,0x1d14ff613a1b7c64L,0x32c7da68f22ddb3cL,
57902         0x7b2345ac58cff63fL,0x214e6d9dce3c3af9L,0x36fba0b78b6691deL },
57903       { 0x69fd813cee1a30abL,0x50daffe91adf6215L,0x55b34de692871a84L,
57904         0x437f1b4b7ff3ea1aL,0xc3258ca580ff1c23L,0xdc220ffbc6d0b822L } },
57905     /* 42 << 273 */
57906     { { 0x93e56b47ad910b37L,0x8cbce4815d20d236L,0x25b50cac5872d763L,
57907         0xb50aa752d8505696L,0x02075e6d6f42b533L,0xf0b34a178f8d8352L },
57908       { 0x59f2feda5234531bL,0xb23e1da1751127c8L,0xe1f65e08b6759ccdL,
57909         0x47d8631c352e9500L,0xab10d299c13feb16L,0xf9e916a3e5c6a220L } },
57910     /* 43 << 273 */
57911     { { 0x55899ffdc06f1b65L,0x4f9ec6e011899630L,0x0df97edc50a29319L,
57912         0x5c4a10ea5e66f0adL,0xea7b4497aa3d14e9L,0x484d8f64d22cc470L },
57913       { 0xd7fd252240a61a0bL,0xebd9f49d42d04a79L,0xf18ba2ec312ddb99L,
57914         0x687273ec2dce1351L,0x68d8b052d0220e57L,0x2c0ecd6b05a7e3dcL } },
57915     /* 44 << 273 */
57916     { { 0x460c29904ac6cf02L,0x01482cfa420a35b7L,0xf793933a34680972L,
57917         0x2cd1f50017e2367bL,0x2411c3523944f060L,0x3d58b97411c06b05L },
57918       { 0x4552e369cddebb3bL,0xe1c38aec009aeab9L,0x9d34737c353b6e4fL,
57919         0xf2c99e2cb16d7b0cL,0x57029fa47bbba6a2L,0x0565d1bcd13ef64dL } },
57920     /* 45 << 273 */
57921     { { 0x93a50cc7eb0112a9L,0xa0d4419984a59bdbL,0x04b9538c82d01160L,
57922         0xdb1d33e163a8d5a3L,0xa710beff08d3effeL,0xc2f37326f9bf02f4L },
57923       { 0x606b6b5555d26856L,0xf528d22a427fe3d7L,0x31b20fac84fb5086L,
57924         0x27129aa592f7e7bcL,0xd88f0d4f44171b33L,0x9b045c897915ede1L } },
57925     /* 46 << 273 */
57926     { { 0x0b15ebebcbe014d6L,0xa4f1504e68d24086L,0xbcf475c979d7c8b6L,
57927         0xd61b92a8d00a6890L,0x78e096742ee24533L,0x6fe9fe6099656101L },
57928       { 0xc9542f53e5e63e28L,0x59ec39e12edf3a80L,0x8fe57ffe24ad9280L,
57929         0xbae0671bf4b9b024L,0x76e36c14d5816ae9L,0xe53256d4805f8688L } },
57930     /* 47 << 273 */
57931     { { 0x006956bfcf9e545bL,0x7829ed13e8fa2ee4L,0x1b108d77d4dd6f85L,
57932         0xf51217bb17045f1aL,0x48c4802986141bd6L,0x8d59b995f8820213L },
57933       { 0x8439949ffc298a9eL,0x967fdcb278188d77L,0x5bbdfd296f35c711L,
57934         0x25b37e5df8e62607L,0x18f5c4251795cccaL,0x260f075af0e35ff5L } },
57935     /* 48 << 273 */
57936     { { 0x3561b3fea329deb1L,0xfdca0e34f1c3c3e4L,0x4374831347fb79d6L,
57937         0xa7f497e1c48002edL,0x86221cce2c44dcb0L,0x65e3f04643785e06L },
57938       { 0x9ee9061fdf4cf461L,0xc7479e8cf022d27aL,0x1d8de85b76f7f52bL,
57939         0x39a713c90fd6c65fL,0xf74ca067711f8a39L,0xad1119ad8ebc640aL } },
57940     /* 49 << 273 */
57941     { { 0x43d9bcba57ec124eL,0xbce6aed98cc29801L,0x1dbb88c72632e757L,
57942         0xe88f49e891f550e5L,0x056f67da7b6e1b05L,0xa503271082a027bbL },
57943       { 0x8471fa55c91844a9L,0x882f25b628479daaL,0x96f606dfa9c23504L,
57944         0x6a42d307fb7fa83dL,0x531c8a5cea310e34L,0x7e2d20565b2e42f0L } },
57945     /* 50 << 273 */
57946     { { 0x547047862e8c467eL,0x26f5efc690e52377L,0x762d8f767f6e71afL,
57947         0x5fc1bd13917ff587L,0x487f6c63fb696a60L,0x889a1dcc3afd2aebL },
57948       { 0x7407d0a0adcf4b35L,0x8f6c9aef91024ecfL,0x3384f1c03e5d9da0L,
57949         0xf87acb00b846d122L,0x6d86aebddceb383aL,0x6a5a90cda8f2d076L } },
57950     /* 51 << 273 */
57951     { { 0xddff7aa3feb71de1L,0x431e106be44644a9L,0xafe96f8ed5190b4bL,
57952         0x31a4dfe40ab42a27L,0x0e2d0cc435762eccL,0x7c928cd91fefb256L },
57953       { 0x5f33c775daeb94f9L,0xa7a91f8894c239b7L,0x6bf418fb4deda3c9L,
57954         0x91ad6e99eefd4f99L,0x7aae05559c25448fL,0xfb7ed9df487b4deaL } },
57955     /* 52 << 273 */
57956     { { 0x59753bf68ba85dffL,0xec8b82efd1c89bceL,0xd7f1a651b8b6a683L,
57957         0x9c329bf36f84416dL,0xaecbf4b9e68db225L,0x94ec3b0f5a614d23L },
57958       { 0xbcb6672593a9543dL,0x90c46c46f19132edL,0x4767c73c950b080fL,
57959         0x0b9b143e971fd9e5L,0xbce6886f8ec8c68dL,0x167b0f8ad47f512eL } },
57960     /* 53 << 273 */
57961     { { 0x51517f9481819dd9L,0x2c2640a0fdd7cef9L,0x59283faabf98b8ffL,
57962         0x39713768a46ad877L,0x13d9c0e6834dcf0cL,0x38c85473cc7acaddL },
57963       { 0x7b58c7666971a512L,0xbe46a58c2a38e57eL,0x3d26d0a06972e213L,
57964         0x2341769b63cd0aabL,0x4a293dd0e86307eeL,0x8d1e338d264c81a1L } },
57965     /* 54 << 273 */
57966     { { 0x66eb8beab2d5b430L,0x50b4af4382136220L,0x6644e673e79d0b5bL,
57967         0xe64cdf10f9fa7610L,0xf1dea591132ff33dL,0x07791ab6b926c725L },
57968       { 0x6c41b4f383f60e02L,0x54bc9049977519c3L,0x618a6f3c2aef73a4L,
57969         0x42cfc9d26fa4ca2bL,0x2784db71a39a215dL,0x378071655cc85253L } },
57970     /* 55 << 273 */
57971     { { 0x9cc3ada3554a7f23L,0xa822f9f21c3d0003L,0xb1654da7303123f7L,
57972         0xbe33e388f0d8c4a1L,0xd8919c79be4366e8L,0x5a41c92cfe292117L },
57973       { 0xc4b02d0678c325c2L,0x89eaf4356d511c4aL,0x726fb6d65fda70a0L,
57974         0xaf7949a0183abdf1L,0x3410915d26f8f929L,0x36b3aeb281f0f83dL } },
57975     /* 56 << 273 */
57976     { { 0x1942c2ffcd74009dL,0x71c4d5f5e9c286a4L,0xf3c152b5771a5972L,
57977         0x4cfb1e74363c2048L,0xcd2ce8249ddb8da2L,0x5d97c8e0a5ee443dL },
57978       { 0x6fa84b3d68d7b3d5L,0x97eaa76d9ce14ec3L,0x2e4571368e13869dL,
57979         0x39ac6a0c96f0f8a1L,0xe24458ac42d93dc0L,0x7eb3689d5f60bec9L } },
57980     /* 57 << 273 */
57981     { { 0x75592736bce6ebe3L,0x84001a886777bd90L,0xe82739774a31ca6bL,
57982         0x6906baf0a8e0dd38L,0x92af56d0848d0c92L,0x7ae700c6501326d0L },
57983       { 0xce418817470339a9L,0x4354d7928e448dfeL,0xc8f593afa48e3148L,
57984         0xdd5fee34db1a96b2L,0x5974e81e357960c2L,0x7326bf016306fdabL } },
57985     /* 58 << 273 */
57986     { { 0x74183618de017cd9L,0x939c7975dcfe6dbfL,0xcad9f8a108ec41e5L,
57987         0xd9edb91d391afcddL,0xadf1f18c7c4a3f03L,0x0566d3e8ab477304L },
57988       { 0x32ae20464c19c62cL,0xfa15fdcb252c8c4eL,0x2ed4767e91de2794L,
57989         0x622e4f38507f8067L,0xd647242bc68ac330L,0x0650e0a9fc1ccf29L } },
57990     /* 59 << 273 */
57991     { { 0x6ecd68a086085cc3L,0xb463f4c165c0cc54L,0x3182cc5c480bc57dL,
57992         0x8f16f2038e6d9267L,0x8c92e446df0d0ee9L,0x7da6001ba4d09789L },
57993       { 0x596390ff976ee9d0L,0x12b8f9dee4c0fd5fL,0xad08673f297b10f2L,
57994         0xc8e9097c7b524a51L,0xd494f0d3009cf47cL,0xf535c07abcdd1b68L } },
57995     /* 60 << 273 */
57996     { { 0x29544fe8588360ecL,0xa1aa9b9fffb550eaL,0xe1f6cf994af4d28dL,
57997         0x723d48b00c6fd477L,0xf51f1b2f5c81b252L,0x88ec11c04f5a33eeL },
57998       { 0x7747f0432cd72de4L,0xcca69b0ad71c92c1L,0x9455d86e4e8cc763L,
57999         0xc9e0aa1bc08444e0L,0x93803b68e8fffa63L,0xc296af292d781b7dL } },
58000     /* 61 << 273 */
58001     { { 0xb1891a2b17329e31L,0x87c2a49056e36717L,0x8c2a50fafd26d8b3L,
58002         0x017e4e417e3c5a5fL,0xbeb4fad0506c382eL,0x5d3e8b16fc281ec9L },
58003       { 0x407f7598890e57a0L,0xda855e8b340cd6d6L,0xb9393129ff388d54L,
58004         0x41113ffdcf355d9eL,0x31d3bb09b357c28dL,0x975bdf00fd39e481L } },
58005     /* 62 << 273 */
58006     { { 0xbfb0c87e10a1b4f2L,0xfaf51153dc2fcc04L,0xd2588e39d6b98d81L,
58007         0x5de5b0eb4953133dL,0x6b65d8135b959ed6L,0x864511dc02eb45bdL },
58008       { 0xb1dcb4d3d7ce20bdL,0x917bcd0987587230L,0x0935790f83a79453L,
58009         0xdc65862e54b35d76L,0x4cd2332ba6d1eeeaL,0x0706fcd030d315b5L } },
58010     /* 63 << 273 */
58011     { { 0x7c91adb3adf2d8d1L,0xfe1549c24a212fd3L,0x8a7cc285c33213b3L,
58012         0x26643cfd3e56d17bL,0xcc007c15684c872fL,0x485643e009e554f3L },
58013       { 0x7f5e9a6ec6569206L,0x252b5393c2f596d6L,0xf7eef1dbbf9cdea5L,
58014         0x611ee7334dffab46L,0x8d93802a805e976cL,0xd07c0ac6f85c939cL } },
58015     /* 64 << 273 */
58016     { { 0x514cc1dcb08d2d0eL,0x4e6b379e30e93536L,0xf0e422ac2fc9230fL,
58017         0xaa50a1ad92e23e21L,0x70ac46d8676d1ac0L,0x698b9991f9f54493L },
58018       { 0x59a6b86a8649519fL,0xc1f11ad6e3511da4L,0xd3d9cff13192968cL,
58019         0x13e700b40b342dd8L,0xfd5dc7bb3b1da441L,0x02426e7c2c883760L } },
58020     /* 0 << 280 */
58021     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
58022       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
58023     /* 1 << 280 */
58024     { { 0x9e9af3151c4c9d90L,0x8665c5a9d12e0a89L,0x204abd9258286493L,
58025         0x79959889b2e09205L,0x0c727a3dfe56b101L,0xf366244c8b657f26L },
58026       { 0xde35d954cca65be2L,0x52ee1230b0fd41ceL,0xfa03261f36019feeL,
58027         0xafda42d966511d8fL,0xf63211dd821148b9L,0x7b56af7e6f13a3e1L } },
58028     /* 2 << 280 */
58029     { { 0x3997900ecc8998d6L,0x8fa564b7baa60da1L,0x71bf5b0a661f3c57L,
58030         0x44b13388aab1292bL,0xcbe80cb9d4d993f2L,0x0b19b4c92203f966L },
58031       { 0xbc82a6520080f259L,0x870ebc08ad96dea3L,0xa388c7e7502f0003L,
58032         0x9c704ef056a38f73L,0x93cde8a73487d9b0L,0x5e9148b0ec11a1f3L } },
58033     /* 3 << 280 */
58034     { { 0x47fe47995913e184L,0x5bbe584c82145900L,0xb76cfa8b9a867173L,
58035         0x9bc87bf0514bf471L,0x37392dce71dcf1fcL,0xec3efae03ad1efa8L },
58036       { 0xbbea5a3414876451L,0x96e5f5436217090fL,0x5b3d4ecd9b1665a9L,
58037         0xe7b0df26e329df22L,0x18fb438e0baa808dL,0x90757ebfdd516fafL } },
58038     /* 4 << 280 */
58039     { { 0x63f27a25a748b8f5L,0x68c8f3ec2cd246c4L,0x5d317cd965f9ce38L,
58040         0x162c92e0635ba300L,0x5259f64ffe343662L,0x4a6b2b668e614ac8L },
58041       { 0x97fb55bb01177c3bL,0xfb586c21a705cb01L,0xa57e732578061824L,
58042         0x892f6b386c1e6306L,0xf12e4c072367b14cL,0x580d5fe2c83a48c5L } },
58043     /* 5 << 280 */
58044     { { 0x1e6f9a95d5a98d68L,0x759ea7df849da828L,0x365d56256e8b4198L,
58045         0xe1b9c53b7a4a53f9L,0x55dc1d50e32b9b16L,0xa4657ebbbb6d5701L },
58046       { 0x4c270249eacc76e2L,0xbe49ec75162b1cc7L,0x19a95b610689902bL,
58047         0xdd5706bfa4cfc5a8L,0xd33bdb7314e5b424L,0x21311bd1e69eba87L } },
58048     /* 6 << 280 */
58049     { { 0x6897401cea2bafb3L,0x7b96ecc215c56fe4L,0xe511b32939e2b43bL,
58050         0x39522861bf809331L,0x815f6c1dc958f8f4L,0x2abbdf6bc213e727L },
58051       { 0xeb09ae59c39bc01fL,0xffe3b831676b56a5L,0x8f4815a2a20f86c6L,
58052         0x748a17669aa30807L,0xf1f46a211b758878L,0xbd421fe76f6fc3d7L } },
58053     /* 7 << 280 */
58054     { { 0x75ba2f9b72a21accL,0x356688d4a28edb4cL,0x3c339e0b610d080fL,
58055         0x614ac29333a99c2fL,0xa5e23af2aa580affL,0xa6bcb860e1fdba3aL },
58056       { 0xaa603365b43f9425L,0xae8d7126f7ee4635L,0xa2b2524456330a32L,
58057         0xc396b5bb9e025aa3L,0xabbf77faf8a0d5cfL,0xb322ee30ea31c83bL } },
58058     /* 8 << 280 */
58059     { { 0x300b04840d6ded89L,0x0b1092cbc3ab55edL,0x17d9c5420cc10a74L,
58060         0x7f637e84eff9d010L,0xd732aa1e27aa1285L,0xedb97340e2a77114L },
58061       { 0x62acf1585ef4dfb0L,0x1e94fc6eba1d7b81L,0x88bec5d22e6eb2dbL,
58062         0xaec272028d18263dL,0x4b687353e4bbd6acL,0x031be3510ff7e4c0L } },
58063     /* 9 << 280 */
58064     { { 0x048813847890e234L,0x387f1159672e70c6L,0x1468a6147b307f75L,
58065         0x56335b52ed85ec96L,0xda1bb60fd45bcae9L,0x4d94f3f0f9faeaddL },
58066       { 0x6c6a7183fc78d86bL,0xa425b5c73018dec6L,0xb1549c332d877399L,
58067         0x6c41c50c92b2bc37L,0x3a9f380c83ee0ddbL,0xded5feb6c4599e73L } },
58068     /* 10 << 280 */
58069     { { 0x6c00f388f086d06cL,0x17ee45035add0cf4L,0xf96984c707caf89cL,
58070         0x9d49d667648ed5e9L,0x3ef95015a0164881L,0x39e28e447d9c651fL },
58071       { 0xb13ad24059f37780L,0x08cee349b9522225L,0x9245ee6f2ba1b214L,
58072         0x12bedaa9a886d8d2L,0xe139ae08fcb8186fL,0x99203fb6fc2ef864L } },
58073     /* 11 << 280 */
58074     { { 0x14d34c210b7f8354L,0x1475a1cd9177ce45L,0x9f5f764a9b926e4bL,
58075         0x77260d1e05dd21feL,0x3c882480c4b937f7L,0xc92dcd39722372f2L },
58076       { 0xf636a1beec6f657eL,0xb0e6c3121d30dd35L,0xfe4b0528e4654efeL,
58077         0x1c4a682021d230d2L,0x615d2e4898fa45abL,0x1f35d6d801fdbabfL } },
58078     /* 12 << 280 */
58079     { { 0x3c29284764c9323dL,0x40115a890491f77dL,0xec141ade2d7a05f5L,
58080         0x0c35e4d9222a5f9fL,0x5ea51791442a3e9bL,0x17e68ecee51b841eL },
58081       { 0x415c0f6cd6ae9174L,0xe6df85f89ffd7595L,0x65fc694f8dedf59cL,
58082         0xc609503efee92718L,0x57d2592e97d565aeL,0xb761bf157e20862bL } },
58083     /* 13 << 280 */
58084     { { 0xa636eeb83a7b10d1L,0x4e1ae352f4a29e73L,0x01704f5fe6bb1ec7L,
58085         0x75c04f720ef020aeL,0x448d8cee5a31e6a6L,0xe40a9c29208f994bL },
58086       { 0x69e09a30fd8f9d5dL,0xe6a5f7eb449bab7eL,0xf25bc18a2aa1768bL,
58087         0x9449e4043c841234L,0x7a3bf43e016a7befL,0xf25803e82a150b60L } },
58088     /* 14 << 280 */
58089     { { 0xd443b26582376117L,0xb91087c11a1beb0dL,0x3fe62a6545cc5951L,
58090         0x49c754bce6e472d5L,0x7e60bb8177c424ebL,0xbcd4088e830cbb97L },
58091       { 0x3da5c94eba26df7bL,0x508b4f55f72b4338L,0x409c5c7469ad7784L,
58092         0x82e5f1b0fdf44d6aL,0x10654a1ceed2766fL,0xef1e65faa6e83f4aL } },
58093     /* 15 << 280 */
58094     { { 0xe44a2a57b215f9e0L,0x38b34dce19066f0aL,0x8bb91dad40bb1bfbL,
58095         0x64c9f775e67735fcL,0xde14241788d613cdL,0xc5014ff51901d88dL },
58096       { 0xa250341df38116b0L,0xf96b9dd49d6cbcb2L,0x15ec6c7276b3fac2L,
58097         0x88f1952f8124c1e9L,0x6b72f8ea975be4f5L,0x23d288ff061f7530L } },
58098     /* 16 << 280 */
58099     { { 0xa6e19d0a5f56dc3cL,0xe387e2690b88326aL,0xef7380950ee527a4L,
58100         0x78b7174b7c4278a6L,0xc133d867e70798ffL,0x9d0fef759e9230caL },
58101       { 0x7431eef01a955ab9L,0x3772e7038868d922L,0xf7a4306a8d6af3f7L,
58102         0x633bb5a0bbec076aL,0x6d07623e7a257ca3L,0xffb5e16521c00663L } },
58103     /* 17 << 280 */
58104     { { 0xebfe3e5fafb96ce3L,0x2275edfbb1979537L,0xc37ab9e8c97ba741L,
58105         0x446e4b1063d7c626L,0xb73e2dced025eb02L,0x1f952b517669eea7L },
58106       { 0xabdd00f66069a424L,0x1c0f9d9bdc298bfbL,0x831b1fd3eb757b33L,
58107         0xd7dbe18359d60b32L,0x663d1f369ef094b3L,0x1bd5732e67f7f11aL } },
58108     /* 18 << 280 */
58109     { { 0xfab0ce2bee1ae33dL,0x7bf9f90b4c5692e3L,0x131a4374d776d6caL,
58110         0x6ba40908a2b135afL,0x5c4ab997e1334bf8L,0x9eb442d07af584e9L },
58111       { 0xd764c506786391c1L,0x07f24c6bbcf6ab3aL,0xf73c7924fad8e1bbL,
58112         0x79f624acb7583623L,0x2b032021b44c14d3L,0x7cc0ae8dbf58ff99L } },
58113     /* 19 << 280 */
58114     { { 0x3c7fb3f5c75d8892L,0x2cff9a0cba68da69L,0x76455e8b60ec740bL,
58115         0x4b8d67ff167b88f0L,0xedec0c025a4186b1L,0x127c462dbebf35abL },
58116       { 0x9159c67e049430fcL,0x86b21dd2e7747320L,0x0e0e01520cf27b89L,
58117         0x705f28f5cd1316b6L,0x76751691beaea8a8L,0x4c73e282360c5b69L } },
58118     /* 20 << 280 */
58119     { { 0xe4d7c8b88929c133L,0xe5f96bef92a813c7L,0xdb8ab0af71c18e09L,
58120         0x0db6ff287dae63b4L,0x54d1fac49a1eaa73L,0xadbcfdf59180c980L },
58121       { 0xd3220f300b584314L,0xa24e4d1cca3697c7L,0x4ade8c7fa44f8067L,
58122         0xbd8bc81aca21ac17L,0x303a2f9fc1d361cfL,0x55648b65c71cf031L } },
58123     /* 21 << 280 */
58124     { { 0x46bcc0d5fd7b3d74L,0x6f13c20e0dc4f410L,0x98a1af7d72f11cdfL,
58125         0x6099fd837928881cL,0x66976356371bb94bL,0x673fba7219b945abL },
58126       { 0xe4d8fa6eaed00700L,0xea2313ec5c71a9f7L,0xf9ed8268f99d4aeaL,
58127         0xadd8916442ab59c7L,0xb37eb26f3f3a2d45L,0x0b39bd7aa924841eL } },
58128     /* 22 << 280 */
58129     { { 0x6f8135c7ce89e8daL,0x21ac20d9d6b5948eL,0x1dc4d48b31cefd7eL,
58130         0x3d34bc2a4a347926L,0xadcd11be8f614fd6L,0x77148b08a8ea116aL },
58131       { 0x7afc75fcfce1d3f5L,0xa9e0557d7d9a8ea3L,0x640cb5850cc864ecL,
58132         0x5811ba842eb332c7L,0xb6c10b6efdb668c4L,0x24d8b10f99f5f6c7L } },
58133     /* 23 << 280 */
58134     { { 0xd811eb32e03cdbbbL,0x12055f1d7cc3610eL,0x6b23a1a0a9046e3fL,
58135         0x4d7121229dd4a749L,0xb0c2aca1b1bf0ac3L,0x71eff575c1b0432fL },
58136       { 0x6cd814922b44e285L,0x3088bd9cd87e8d20L,0xace218e5f567e8faL,
58137         0xb3fa0424cf90cbbbL,0xadbda751770734d3L,0xbcd78bad5ad6569aL } },
58138     /* 24 << 280 */
58139     { { 0x391fa3cd8d075ec5L,0x54d45020c84c81e5L,0xdead561a79fad87cL,
58140         0x0ab3c8544e7ffc48L,0x5967f8ebff02706cL,0x8860de795d31ec98L },
58141       { 0x7476459c6c8a1c25L,0x8d9c484082f16117L,0x5c1b13b33b413429L,
58142         0x1962a435601b5906L,0x78b9d382e006929dL,0x1924e979e5897b16L } },
58143     /* 25 << 280 */
58144     { { 0xcadb31fa7f39641fL,0x3ef3e295825e5562L,0x4893c633f4094c64L,
58145         0x52f685f18addf432L,0x9fd887ab7fdc9373L,0x47a9ada0e8680e8bL },
58146       { 0x579313b7f0cd44f6L,0xac4b8668e188ae2eL,0x648f43698fb145bdL,
58147         0xe0460ab374629e31L,0xc25f28758ff2b05fL,0x4720c2b62d31eaeaL } },
58148     /* 26 << 280 */
58149     { { 0xef1001dfbdb22e61L,0x1626bd9af384bbf5L,0x33f42d385fe8ae07L,
58150         0x59646c42b7218d21L,0x5e27210e6a016f5dL,0x3e9ecf07094481c3L },
58151       { 0xf91609c1f50cc2dcL,0x8bf8c05ad0d43633L,0x9d508972e74ab746L,
58152         0xb625887a33f628b7L,0x557bd493e733952fL,0xd35f450b8981dcfbL } },
58153     /* 27 << 280 */
58154     { { 0x4603cdf413d48f80L,0x9adb50e2a49725daL,0x8cd3305065df63f0L,
58155         0x58d8b3bbcd643003L,0x170a4f4ab739826bL,0x857772b51ead0e17L },
58156       { 0x01b78152e65320f1L,0xa6b4d845b7503fc0L,0x0f5089b93dd50798L,
58157         0x488f200f5690b6beL,0x220b4adf9e096f36L,0x474d7c9f8ce5bc7cL } },
58158     /* 28 << 280 */
58159     { { 0x531c43cdb63f3d28L,0x01289772429708dfL,0xb0ee772ccdb60078L,
58160         0x4131f5cd5f1a6e72L,0xd9d0f8c6a0da0112L,0x58efddd204e957b1L },
58161       { 0x18857c0c32840c31L,0x00825340c4068b2cL,0x0a9217a771ff8800L,
58162         0x69b19e6415530b80L,0xa28e274ee125e3f2L,0xb471a91bc9bfc846L } },
58163     /* 29 << 280 */
58164     { { 0xfed8c058c745f8c9L,0xb683179e291262d1L,0x26abd367d15ee88cL,
58165         0x29e8eed3f60a6249L,0xed6008bb1e02d6e1L,0xd82ecf4ca6b12b8dL },
58166       { 0x9929d021aae4fa22L,0xbe4def14336a1ab3L,0x529b7e098c80a312L,
58167         0xb059188dee0eb0ceL,0x1e42979a16deab7fL,0x2411034984ee9477L } },
58168     /* 30 << 280 */
58169     { { 0x01d04fe04ce2d199L,0xf434bcfd0517c7ebL,0x82f3aca4a7659a94L,
58170         0xf436a7781ff015c9L,0xf5143391d6223e5cL,0xba66c6a2ecb5c340L },
58171       { 0x080f158a4b23a041L,0xb401094cb699acafL,0x1c57626c677491dbL,
58172         0xfb39e317d42d86dbL,0x19e2ca804f6b3354L,0xe919c4c3c1d41ef3L } },
58173     /* 31 << 280 */
58174     { { 0xd65246852be579ccL,0x849316f1c456fdedL,0xc51b7da42d1b67daL,
58175         0xc25b539e41bc6d6aL,0xe3b7cca3a9bf8bedL,0x813ef18c045c15e4L },
58176       { 0x5f3789a1697982c4L,0x4c1253698c435566L,0x00a7ae6edc0a92c6L,
58177         0x1abc929b2f64a053L,0xf4925c4c38666b44L,0xa81044b00f3de7f6L } },
58178     /* 32 << 280 */
58179     { { 0x35ae891bbb71e9b0L,0x1f6ce6ca522b77f0L,0xc2dab3cae63745c4L,
58180         0x55b8c185f218d139L,0x6ab039c889f3b0e2L,0xd9e25bfdc644c3faL },
58181       { 0xc8496f203e2ed47bL,0xc395ec028d67e17cL,0x5c67839292114918L,
58182         0xe962e52fef73f345L,0x3818baf354fcfb22L,0x4d75d65d9d4bc911L } },
58183     /* 33 << 280 */
58184     { { 0x10078824eb7ff5fdL,0x50c65328735ef75fL,0xdfc04d53ec980ba2L,
58185         0x4bfb260f2d519cf5L,0x1f03dff15c854667L,0xd1ad2231badb625cL },
58186       { 0x986064d0be9f7f03L,0xe5ff93e5c13f7d0dL,0x02682a1896e26a17L,
58187         0xc421567c817ec3cdL,0xb740652352615c25L,0x6800a8335d135eebL } },
58188     /* 34 << 280 */
58189     { { 0xde57575b17d8ec5cL,0x72e2257578aeb9bbL,0xce73fa7731605c27L,
58190         0x2f286b79ae77436cL,0x5e78fbb77f4e6997L,0xb03c888e474f23a7L },
58191       { 0x4bb302a3e38927ceL,0x39c6de5f6e1514ceL,0x9daa0ad349b2ddbdL,
58192         0x98fd2377d683dffdL,0xbefa4ae5933476edL,0x4ad53d01173f49edL } },
58193     /* 35 << 280 */
58194     { { 0xdfafc70e44b89837L,0xe0104b9c4935fa88L,0x7625d9d92fd702e2L,
58195         0x27461e6549af2219L,0x4a279383ad3f36edL,0xd87e246b9204e857L },
58196       { 0x8d832190ab1727d9L,0x59205cd82182e291L,0xb96a1d15a6513613L,
58197         0x1c7de3cc49cc8ddcL,0x637ea26af17ab785L,0xc098bb7a09a3ba58L } },
58198     /* 36 << 280 */
58199     { { 0xfb5383cc31bd4f68L,0x6fd5aee3d96a1899L,0x4e39d6eb01d5430eL,
58200         0x12679565ca5a2848L,0xa399e83f062b44fbL,0x3ee2432f3c166682L },
58201       { 0x57229c841de47708L,0x40a5d0cbba528a61L,0x4bae36be8239e7baL,
58202         0xddac65a2f8087427L,0xfd516d1a3cc61266L,0xc89542b5bcef98b1L } },
58203     /* 37 << 280 */
58204     { { 0x3fc8d1b2d49cc0eaL,0xfc591f7f7bca4d23L,0x5f48e27c41fefdf3L,
58205         0x5ca1d08a1039419dL,0xd450c1bddc8042ceL,0x6760e23fb436fc4bL },
58206       { 0xc5642797c06bb34bL,0xb787cd53fde06d4dL,0x2926360ccbf144b0L,
58207         0xb63756f4dce32421L,0x0878deab774abc4aL,0x2d97c7919a4e142aL } },
58208     /* 38 << 280 */
58209     { { 0xf58389ff105c818eL,0xfa29f1eb585fa7f0L,0xb6da09b5917e8924L,
58210         0x1375c3047e7a3f49L,0x9b4792b289cfa1c0L,0x92094a8535571cc7L },
58211       { 0xf986ccf6051e5e50L,0x55ea34d601df6babL,0xe65989eed1363333L,
58212         0xd94bbd918c84e20aL,0x9a4f71dc49e39b8aL,0x6d9fe495927d633eL } },
58213     /* 39 << 280 */
58214     { { 0x30b295f01fdc29e2L,0x71415daae2c2fab4L,0x205e957683c312beL,
58215         0x893c69fefab48afcL,0x8108f3f994ca2fdbL,0x37c860c314f99296L },
58216       { 0x1009a6d2e990ed34L,0xd5350c36ac26b611L,0xd03161102ce23d91L,
58217         0x82bb476e62189343L,0xe255965160ef0cbdL,0x6bab3f53cf5d2311L } },
58218     /* 40 << 280 */
58219     { { 0xcaa3b7a592fa460fL,0x92bb46b804dff174L,0xcd6949b3cf926a1fL,
58220         0x01f95e5559d1bb18L,0x21f90c08d4518f3cL,0x325dbfe920ee8bf5L },
58221       { 0xd0136f3feafb919eL,0x941190cc8e0ebcabL,0x599e91a287b557aaL,
58222         0x7fac4887dcbde1c7L,0x1dad481905a07040L,0x640493978b03d593L } },
58223     /* 41 << 280 */
58224     { { 0x65521bb85ebd3685L,0x16c68e79665d1619L,0xd6ab56bbc52b14c8L,
58225         0x312f1fb4c6d3067dL,0x5afef4f3d50587c0L,0xa3e79e94ace6e2feL },
58226       { 0x52c7fa0825f12a1eL,0x9c1c1ea20dec9f3dL,0xc418d4232e87a036L,
58227         0xa0a19fbb0283752fL,0x52e0a8830b804506L,0xc67fc71b3f7de2a1L } },
58228     /* 42 << 280 */
58229     { { 0x4d062d3d7dad8ca9L,0xb78c81581cf59756L,0xaccb38f8c6b5d9fcL,
58230         0x83436d3f7ddc66eaL,0x37115b6033adcb87L,0x49b74bd45a8b09abL },
58231       { 0x7b8bdb81675ae43bL,0x5284f5b3f0476428L,0x8f1521e7db38b0c7L,
58232         0x792ef9dea0c4b2f6L,0xa15880a162159fc6L,0x70b999e372b09b63L } },
58233     /* 43 << 280 */
58234     { { 0x6f47787d4e8ffde7L,0x19e9434574495a10L,0x8da6d55784f5be33L,
58235         0x110844811884e325L,0x621734c5a9f030baL,0x25cd0544d0e63f63L },
58236       { 0xea6729687e936833L,0x08297af784a34442L,0xb77dc3a342f9ed3eL,
58237         0x9f8908c8258e8d4fL,0xb8281bfc3299ba4bL,0x1f6412920a09849cL } },
58238     /* 44 << 280 */
58239     { { 0xd5d51e60ee9a7708L,0x2e8ab3effd2cfe78L,0x0af5c3bac8e71273L,
58240         0xbfd1b94091041652L,0x4c7c86ab52ce4582L,0x3ab72feff1d9bc29L },
58241       { 0xae89c3d51e1974b3L,0xd859c7ef70433caeL,0x762064c77edd1398L,
58242         0xc0b6a6b6072064a4L,0x3ba43b059bb1b3d0L,0x20f9aa85e47d79bbL } },
58243     /* 45 << 280 */
58244     { { 0xd1a45415c2d001cfL,0x40f3f05d848a480fL,0x03708da0ce554d5bL,
58245         0xd7090557c80f4254L,0x7e57d29907743393L,0x7db8a5e10f2f5903L },
58246       { 0xd0466a0b14e8ff8bL,0xa3c38f49e0cf88b0L,0xde47262e329f71adL,
58247         0x56b2a7935da6d0a1L,0x22e1f9b880ef44b0L,0xb9b96c617b2b6d4bL } },
58248     /* 46 << 280 */
58249     { { 0x3235bc494c500ee1L,0xce0f0b54da4a4f35L,0x628cb91c337ac7b7L,
58250         0xd8a6d4cd88a26e9dL,0xdcf40cba96e44349L,0x073a0f75b54e3fa9L },
58251       { 0xc9b95d29ca44e6e8L,0x42ad9afa2315f4beL,0xdf13a5ddf78617c7L,
58252         0x40aeb346d196504bL,0x9317d6f33d1fef90L,0xf94d308fe1708a79L } },
58253     /* 47 << 280 */
58254     { { 0x45bc768608835815L,0x700d93bc5798c507L,0xae3415b85362a822L,
58255         0xdbce01b33883d21dL,0xb9df7efbe56fb2aeL,0x5ed57d9427d341c0L },
58256       { 0xdc26916e7ee4dfa0L,0xcdb06a17147c075fL,0x0198b6a7fa9e7a63L,
58257         0xc9876c786355b62bL,0x9f4b8f12f565279dL,0xa03aeb619cb6ddb6L } },
58258     /* 48 << 280 */
58259     { { 0x3a35938779493f3dL,0x128301a91f06a9c0L,0xfcce0f82899d204cL,
58260         0x4ca41589158780b5L,0xc28f1bb73c4edd4fL,0xe08e48a87a6aec34L },
58261       { 0x6d4783dfd447c55eL,0xe7c2ecc857803027L,0xb7b8c2bcdf6d7f91L,
58262         0xf0a8d4700f356ca3L,0x229894bfdeb8e964L,0x555c9d40d3aa70e1L } },
58263     /* 49 << 280 */
58264     { { 0xa899a252e0ace851L,0x74b716c9bb9d8476L,0x2ba0bb00571bb175L,
58265         0xee01a9bf7ac2b619L,0x74f0b6d3502ee575L,0x7fdd7856cc45f810L },
58266       { 0x68c0beb1c0ae384dL,0x21955de8fe63d58fL,0x1b98e3951c08bbd2L,
58267         0x5ddaf7e9638701b3L,0xefc264f1b1242d62L,0xa9b8de5c81292443L } },
58268     /* 50 << 280 */
58269     { { 0xf0d713b7131a3bf1L,0x690ae8c147e9f09fL,0x1dc92a5f8cd8bf1eL,
58270         0xdf98927ad61f5445L,0x729b5469ae795eabL,0x939b391c5265675aL },
58271       { 0x5d916c6c7bd7e97aL,0x7c2a3de5d514e72bL,0x0660758379e9915fL,
58272         0x0554d5e543a4d2c7L,0x37eb7f82ca5bca41L,0x90e41b71b640109dL } },
58273     /* 51 << 280 */
58274     { { 0xfdd403b0e6f769aeL,0xa67f97f6906a7981L,0xc86c49be6aa83c6dL,
58275         0x6177820677ab6d8fL,0x60f77c49916933b2L,0xfa33c528fcb3fe39L },
58276       { 0x102ffca0783cb589L,0x6a37a394a96ce10eL,0xd17bf1f89eb4695fL,
58277         0x2a7623af2a53116eL,0x10601afe83af2e60L,0xceebada2582a1704L } },
58278     /* 52 << 280 */
58279     { { 0xcbfb50fa57004c05L,0x0d545f0ea7bea436L,0xb7e30eb77071e269L,
58280         0x435b3df73b845896L,0x48ba27f0b246365eL,0x9fbe883341344f12L },
58281       { 0xb763df280a87ef33L,0x4f9339d70b5288beL,0xc02770d6e722e3beL,
58282         0x6c69bfd918e32f03L,0x20c5c05e74c2845cL,0x09fa0928d6f9279dL } },
58283     /* 53 << 280 */
58284     { { 0x82f43866962fccc1L,0x92bc5f82278c9762L,0xc979a68b39a39a08L,
58285         0xfcae204b97c5a298L,0x78f55c7908676082L,0x210e036447c7b09dL },
58286       { 0x24512cef47d87769L,0xb4b0fdd7e4b53f4fL,0xc2a263fff6818efdL,
58287         0xfa160dc1985bc93fL,0x7b7f82961bf44affL,0xd6c75fb2a6407cdfL } },
58288     /* 54 << 280 */
58289     { { 0xea0b6ec35741c57bL,0x9b148c2668ba5fd0L,0x6206025166461969L,
58290         0x0726919f8cfc618eL,0xf66ac684c1954bcbL,0x160ad0260273adb4L },
58291       { 0x0ec10cffe6f6aac3L,0x232fc7adb4f64d98L,0x0707cb6e73564063L,
58292         0x76daa2c5487a29acL,0xe4ffd6e335768176L,0x4ab87262464d126eL } },
58293     /* 55 << 280 */
58294     { { 0xdbc1d21c553f05efL,0x16e950d0dc115e4cL,0xa727059a354480a5L,
58295         0x32df221efd6711f1L,0x06f9bc2e5c8aa9fcL,0x9f2449a67b15522cL },
58296       { 0xac14774bf498ee00L,0x02b5979f3ec7e0a2L,0xdce96e06e1e00abdL,
58297         0xd7a1bf5a1e00e8a9L,0x19b30fd3a8f42042L,0x29b08eb7e7c507ebL } },
58298     /* 56 << 280 */
58299     { { 0xe91477d3a66b2f3aL,0xf50d3bdfc4deb7f5L,0x19bf2857a1e45e44L,
58300         0x1c104e3270a2126aL,0x4636b4894357b9f5L,0xf65e5aa0962d684aL },
58301       { 0xfcc83a5fb7b52893L,0x8451d02b08adbd4dL,0xf0fb410c19f7a896L,
58302         0x6b90b0faff36caeeL,0x111710d0f5af8966L,0x00a4cfafbd2b8c59L } },
58303     /* 57 << 280 */
58304     { { 0xad9f11cb817bd227L,0xe4733a1465d27b5fL,0xeda46e8dbcf76526L,
58305         0x8db309ecad57a5a9L,0x4a863ec07f1487a8L,0xb0453ed210f1c4c1L },
58306       { 0x9b4df78af2dbfd76L,0x62af38b21525e18cL,0xe6bd0b0ade2c7f65L,
58307         0xad62bfb70b27fad4L,0xd21fd4346d6a8a5fL,0x07b606703e401a5eL } },
58308     /* 58 << 280 */
58309     { { 0xdd14c891e34b192cL,0x6ddfcc793aed3e36L,0xc89c3e6dc49a92e2L,
58310         0xa61954fd6fcf1ce9L,0x420c39a9bd297157L,0x57c20a8a406d3f2fL },
58311       { 0x7ccda02263faf545L,0xb01814a96cca4388L,0x88baf1dce5fb1fd0L,
58312         0x9e1183cfa0bae755L,0x3fe540badbc243c2L,0xe50d52305aeb26a3L } },
58313     /* 59 << 280 */
58314     { { 0x10145b3d52726a98L,0x7236036869e333fcL,0xce9a409323a6f608L,
58315         0x61c121dcddd11095L,0x3349b30a0d39f1daL,0xd07df9d4e3485e93L },
58316       { 0xb4c500a561159e84L,0xbc74918100561c03L,0x8f27e9f3904ad807L,
58317         0x7272786a0108ed01L,0xcf36a5d9c9365dd8L,0xe052fc9d7f859d87L } },
58318     /* 60 << 280 */
58319     { { 0x0e6cd863da97e11eL,0x5b058c6852a818a1L,0x7768c5e73de760b3L,
58320         0x898b7f608dfb4142L,0xd48130977efec180L,0xd7196cd758279538L },
58321       { 0x67c451fb816858a1L,0xbf0e88912ac699b2L,0x21fa74effcb126a5L,
58322         0x1f9dc10123b8df5aL,0x38aefff921136ffcL,0x3408874c47cb395aL } },
58323     /* 61 << 280 */
58324     { { 0xded9035213054567L,0xc61d0628c58c633dL,0x73ff2589f31143c3L,
58325         0xc43594ff0871b05cL,0xcf662dd64db0edf2L,0x6bac019d8d1f33b0L },
58326       { 0xcaa37cd8bb379461L,0x9b077a6934fc0269L,0x421e716788ecedf2L,
58327         0x2d422f95073284cdL,0x9a353114bbb2409cL,0x99e8c7a0dcbb79e7L } },
58328     /* 62 << 280 */
58329     { { 0xfca254cba21c40f0L,0x4945c838e0f4a032L,0x99318ff3fd6cb7fdL,
58330         0xc631e0644a85e726L,0x2e3ca11d9359e8cfL,0x433a0e5c06acf935L },
58331       { 0x665c54c996b37ea9L,0xe78865c4c2d52b81L,0x68596f6ffb27850aL,
58332         0x7e7272221277995eL,0x602b0f5c197344c2L,0x81ff2ad620a9ec11L } },
58333     /* 63 << 280 */
58334     { { 0xb2ce6cbe7c4c464fL,0xd7c11ef5741a4b1fL,0xf3f987f621a7eb17L,
58335         0x6b2812ef79f4e274L,0x3a0117ae38a7d5ddL,0x5d8c75a9cfab6bb5L },
58336       { 0x3827c04052394166L,0x897eb181e00e621dL,0x6693817f8aa19361L,
58337         0x67cac329959d81a8L,0x21e7133869a7ca51L,0xa02fd11269a46a87L } },
58338     /* 64 << 280 */
58339     { { 0x7f1f985c022ea83aL,0x90a22662a7584e7fL,0xb40a930a5188fcf6L,
58340         0x3fad79aba3a82904L,0x7bee8d22f3151027L,0x79a1a838c2c3e17bL },
58341       { 0x1fbe06e933cc3509L,0x629c56aa9abd5ccaL,0xfff290ec2d9cf7a5L,
58342         0x5d0dedaa9bd062c5L,0x080344abd7d35381L,0x0848373af5cf9edaL } },
58343     /* 0 << 287 */
58344     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
58345       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
58346     /* 1 << 287 */
58347     { { 0x31d31f7a7a0c0bc0L,0x7a37a84ab251d2bfL,0x1793362e52f04d67L,
58348         0x5808e70921c7b651L,0x33fe9123ed6f47f6L,0xdeb1dde958f71405L },
58349       { 0x821d3045ae56b472L,0x9f61f761e02043adL,0x932ddb145b2048a9L,
58350         0x17d989fed7811330L,0x032ae4cb128fd85fL,0x8f1956b47d1ef434L } },
58351     /* 2 << 287 */
58352     { { 0x070d34e116973cf4L,0x20aee08b7e4f34f7L,0x269af9b95eb8ad29L,
58353         0xdde0a036a6a45ddaL,0xa18b528e63df41e0L,0x03cc71b2a260df2aL },
58354       { 0x24a6770aa06b1dd7L,0x5bfa9c119d2675d3L,0x73c1e2a196844432L,
58355         0x3660558d131a6cf0L,0xb0289c832ee79454L,0xa6aefb01c6d8ddcdL } },
58356     /* 3 << 287 */
58357     { { 0xe5d473dc7521f457L,0xe9ef09bda00be577L,0xf6d0965fb6eaa640L,
58358         0xeb49486875726560L,0x452116d528817302L,0xf0424fdbfbde3597L },
58359       { 0xd6096da3bb454915L,0xde48280841422141L,0x7a1351972d19fac0L,
58360         0xdc9a5ec421393f6fL,0xcabcc1e3eb2c8adaL,0xd436643142d8c4f2L } },
58361     /* 4 << 287 */
58362     { { 0x0ed1082f89e4e449L,0xdb1fb471833f2378L,0xa35fef0eece77352L,
58363         0x76adaa464bf0c426L,0xfbab929aa011b2fbL,0x6f475d5b9d8cc4d3L },
58364       { 0xbe6d7f2174351480L,0x2d1362d193e4a7aeL,0xc7e2cba5106ceaabL,
58365         0xfe94528a45258697L,0x7109b17d075945b0L,0xfd395b2ccae17f7aL } },
58366     /* 5 << 287 */
58367     { { 0xdf534b80dece6d4dL,0xcfaa60a28737af46L,0x7d76a921b9ba3d56L,
58368         0x61490bd199338721L,0xc514e950ed25cfbdL,0x5041fbb2dc09b8b1L },
58369       { 0x2410310d46fbcbf0L,0x2c46bcd14f7e8aa4L,0x08ce31f5d0d5fe1dL,
58370         0xb11efdbebeac3c97L,0x406e1d05b01633e9L,0xde48cdba766391adL } },
58371     /* 6 << 287 */
58372     { { 0x68550299845e12c9L,0x979b5406361d027fL,0xf601d2b4a8e92e70L,
58373         0xfd02799f0cc9fca9L,0x89f99ca013bc2e96L,0x22a12c0bff9db9b8L },
58374       { 0x6ae7084a32efcea8L,0x5ddd3ee9a24b9376L,0x394d92a4e0945e8fL,
58375         0xddab6752ecea36f6L,0x650b74d60d18a069L,0x37f91cebad650860L } },
58376     /* 7 << 287 */
58377     { { 0xe3e559bd9d839b3aL,0x50e8d4e9719de3c7L,0xf7bb377cea70b986L,
58378         0x63753cace1b2707dL,0xeb239a870e585c4aL,0xec40a379b0e32380L },
58379       { 0x836ebcefc86d6685L,0x703c296a70d18b76L,0x47e2c004b94aa268L,
58380         0x33ef7d0cbaf14d61L,0x74aa00fcd315c72cL,0xf23c789eccf5d75aL } },
58381     /* 8 << 287 */
58382     { { 0xfc1faedc310404a8L,0xea339148d3bcb128L,0xf00485456416defdL,
58383         0x75de7770c58653e7L,0xdd2dcbebe2f6f99eL,0xa4380ef4d159ac07L },
58384       { 0x45dd713ce4173608L,0x44919b61446a6789L,0x3f73756b6b962b38L,
58385         0x3cb9f53bbffd3f0cL,0xd723c40b7f08ebaeL,0x998a9b170c3cddbaL } },
58386     /* 9 << 287 */
58387     { { 0x261c9fe6f21ae889L,0xa589147edf3cb243L,0xd09452f71976deecL,
58388         0xf80ee8bf2497f6b2L,0x0b5f1b19eee697d4L,0xce9b6b680de48ab7L },
58389       { 0x3ad3bbc4bbf29546L,0x544406a697f51becL,0x51d44dfac2e2e75cL,
58390         0xcfc8625d3da3f634L,0x0845ace6a1f5995dL,0x11850d8bf3b65c55L } },
58391     /* 10 << 287 */
58392     { { 0xa804b2f089ef2489L,0x06a2a805fb22f7d6L,0x31baf4fd353970beL,
58393         0x3481c8b712854a91L,0xb0424eecf3971398L,0x748ef3820f4ed94aL },
58394       { 0x92b74ad026722164L,0x23f71d5831b1302fL,0x6741b28070a5f0c9L,
58395         0x46c12cfb9f5101caL,0xe7014d7901d0f81eL,0x129bd87ad758c288L } },
58396     /* 11 << 287 */
58397     { { 0x6c43d8307b00cd09L,0xb794cb012141eb00L,0x95fe13a75cf23ec5L,
58398         0x3de5ad7b8f2c799eL,0xa378434a025de83bL,0x07f681bba3a14a3cL },
58399       { 0x8fa0b5d2983ba419L,0xe477bf361781bf08L,0x5b8162845e8ce6bdL,
58400         0xb36a78ee199ec8eeL,0x444fc01a6062d5d1L,0xc026ab4586ee9ac2L } },
58401     /* 12 << 287 */
58402     { { 0x6a565269a3e0c5b3L,0xaab7ec7104c6ae54L,0x0bda11a7d8c6ddb8L,
58403         0xb7ebfafb2332347bL,0xcf791881e99dff48L,0x81600214dc357c83L },
58404       { 0x2a264f8931d7495bL,0x8ca430004ec885a7L,0x6d478260bb47d417L,
58405         0x544de4ec3d817032L,0xac7150a9dc05f901L,0xffef225775c0963cL } },
58406     /* 13 << 287 */
58407     { { 0xacb83aadb65296f8L,0x04c96c3e18151422L,0x8913311e7a9f126aL,
58408         0x3baeaf8010b74e8aL,0x253c9dcbb7410105L,0x30a13e42da2d5437L },
58409       { 0xde31fd5533a2065eL,0xde2caf1ffe099595L,0x54c762fe795076b5L,
58410         0x8beb51fe635ed402L,0x369603c1e5c3d2a6L,0xc5083f0700a472b5L } },
58411     /* 14 << 287 */
58412     { { 0x58805ca8d2eaf294L,0x910d085ed7d5abb8L,0xf9cbc9a1349cfecfL,
58413         0x67bc7b417800a980L,0xe7e6dbc0f6847e9dL,0x7a0f22c4af379c48L },
58414       { 0x80b6fc04b1d2822fL,0xa1cae656d8517a70L,0xd2d11ed14e9dc24bL,
58415         0x48d74f173fab87e6L,0x1feca5af50c630aeL,0x263e04cc62d0620aL } },
58416     /* 15 << 287 */
58417     { { 0x7dd330ca16b2a52aL,0x25133c614157ae5bL,0xe6ee0e4edd606b2fL,
58418         0x700840423f2b59a7L,0x58d27587d03f54eaL,0x62ebc668d34605e9L },
58419       { 0xa764392ab3155e07L,0xf0810f3e3c6ae6c8L,0x1b32e5ae94614cd4L,
58420         0x45b49262b9cbf481L,0x0034db795b3d1184L,0x463237825b1b9ab9L } },
58421     /* 16 << 287 */
58422     { { 0xf6377e3bf6ba1469L,0xc334fb6c09c832d3L,0x7f85ac42c21c0cf1L,
58423         0x7a3e31c9857d8edbL,0x2eb1076327b77ed6L,0x2bfbbdbc38dae10bL },
58424       { 0xed7c6fb17bae3b4fL,0xc5911d9f36d04e6fL,0x4dc435504569e72fL,
58425         0xaa82fb97bedae3abL,0x06d37bef4f27e463L,0xd0dbce6df0c35a11L } },
58426     /* 17 << 287 */
58427     { { 0x4482c7b704414726L,0x72c9cb5b26d23eabL,0x3747b8cefd5cb171L,
58428         0xe4ecabc300312ffaL,0x5909f29b9cf10a38L,0x209bc3f4b8d0e5acL },
58429       { 0xd34c84db60fac147L,0xd64dea89f8938c89L,0xb18285f8b815267cL,
58430         0x719a7e355a2437d1L,0x45f8d9dab769c5a2L,0x2d0e4281a412cfccL } },
58431     /* 18 << 287 */
58432     { { 0x23c14c43d8f6e236L,0xb14be0d28ee39386L,0xd3c55814262dd390L,
58433         0xa1b40401e1f23d0bL,0x1377b07c61534375L,0xfe4e3eb116f6d95eL },
58434       { 0x17b1af0040b4386cL,0x2dc657a837ca3851L,0x6862ca92ef976731L,
58435         0x9f0c380ba4118d3bL,0x23bf793977c1aa94L,0xaadee0612bc27d4bL } },
58436     /* 19 << 287 */
58437     { { 0xfa5e4cb6f1847a9aL,0x0e13a60cba6f07f1L,0x68d9db450ac86498L,
58438         0x44b02de3920ff013L,0x43724c2d84b46078L,0xb3686ee81f951b93L },
58439       { 0x019b3e77d712fe85L,0x313e7b7497dfb295L,0x7d883ed826d50e37L,
58440         0x64815565d32562ddL,0x2f9e48bed7b3e2f2L,0xc97cf156dcb93450L } },
58441     /* 20 << 287 */
58442     { { 0x0573d9963ab4c707L,0xee5d87691420fdf1L,0x41873aa55e2b9c12L,
58443         0xe09290456810bf08L,0x4ff4143fccbe4bbfL,0xd0e5a74969328301L },
58444       { 0xab5912621c4b73beL,0x550ea0633f3edf99L,0x8a77633734c93db1L,
58445         0x5c51d3f832b21521L,0xcee9f604713feea0L,0x0d6f8a5a7bf4268eL } },
58446     /* 21 << 287 */
58447     { { 0xc415d467009a0cffL,0x32dd46ef55960242L,0x4ccc6f676d6a81b0L,
58448         0xa860bcb6b2571d81L,0x7e74150991f9b6c9L,0x9a96b2f9d3a0592aL },
58449       { 0xcc3d821071248929L,0x586062daf1cb0f52L,0x18d993483d48b6c1L,
58450         0x667f17949f4e612aL,0xf1d7a77ffb3a12e9L,0xf7586397f5753220L } },
58451     /* 22 << 287 */
58452     { { 0xb87d5ce2722f405fL,0x24d1f993d7c6a322L,0x09d837291e0d8113L,
58453         0x70b5cdbf89a6cbc3L,0xdfb3ee16fb2c9607L,0xf0acc1163465c7c6L },
58454       { 0x10cef4b707e6659bL,0xc280c4331fde9940L,0xc8b5e9819a2d3f25L,
58455         0xc36faa763f7f68c1L,0x17878bfa8d54e281L,0x8fda8b359c42c5a2L } },
58456     /* 23 << 287 */
58457     { { 0x2aa1366305d22d7dL,0xee77da6eb0c62a12L,0xff8f99c5bacad876L,
58458         0xcbe33479f8a0f0baL,0x4c69bd7f4a232c8aL,0x760ce3fd485d3f48L },
58459       { 0x0b286a59268d7411L,0x2dd746b6589819b9L,0xe017a53060ce76f2L,
58460         0xe4407828d642a7f0L,0x12761e51b6badaecL,0x4f4f286b78d07257L } },
58461     /* 24 << 287 */
58462     { { 0x43c78835661019ecL,0x68e916b124e66d29L,0x02c0f3a224094671L,
58463         0xab6f1c05d0f17d86L,0x6d3bac72a22d4264L,0xd7b8f152f6e5fafeL },
58464       { 0x95627c6339447eb3L,0xfd15901879e1ff93L,0x39277c835ad80806L,
58465         0x758aafc90d7c7b74L,0x605ad8ca4cb8bec9L,0x6a90085c5741828aL } },
58466     /* 25 << 287 */
58467     { { 0xbc11d3d559cdebfeL,0x75c31b4531b2796eL,0x8d11e18a07b1055eL,
58468         0xcf522c1fb2d2986dL,0xc994c377eafcbec6L,0x840d27ebc0c0e2f0L },
58469       { 0xd4124d17859550d3L,0xeea6047aba21b2b6L,0xbd2a036e335a2854L,
58470         0xd8703d6b207ac2e5L,0x09d2244a94a34bbbL,0xd6b9481417ec6f44L } },
58471     /* 26 << 287 */
58472     { { 0x7d8ddca252aa7ff2L,0x0985e47d6953b9a2L,0xed328993dfff63ccL,
58473         0xbfeca5327cfa6ee5L,0x7535a871b1e6a010L,0xb0052764303c2ec5L },
58474       { 0xd39c72102fedb0daL,0x7ee2b384e1001505L,0xb638a1b1c82a7e1cL,
58475         0x1b94a47b4573fd7dL,0xef2bca7792cb2b88L,0x49ad6e97a75b21efL } },
58476     /* 27 << 287 */
58477     { { 0x591bdd0d8f4093abL,0xa2c63f1ba1322343L,0x5e548f71b32a4331L,
58478         0x9930891c5e7f3c14L,0xb2b2406e54c27043L,0x7ffe3e5ef1281af8L },
58479       { 0xc31ba363900742d1L,0xf24c8ae1e61ee209L,0x687c56b7beed46f4L,
58480         0x0b63e47895682562L,0x9117cf4c0c8a45a8L,0x0744a86824c20748L } },
58481     /* 28 << 287 */
58482     { { 0x9ac777993acb39ddL,0xd1d3ecddbb7c6a8aL,0xa5271c9e7a75159cL,
58483         0xa6ffb41f2c276e4dL,0xc526556e0bb9a955L,0xa32e1352233b7774L },
58484       { 0x103f124bc2cf09aaL,0x1816d1eff10bae5aL,0xc5f9197ee8837629L,
58485         0x064d5dcb13b1b76bL,0x109c70748d0fe0b1L,0xbb4e9743fce5f6e1L } },
58486     /* 29 << 287 */
58487     { { 0x4636f36d3ef05af6L,0x3695267b3e498920L,0xd59830285d773fc8L,
58488         0x939591245d3cc515L,0xc3f52a9569134370L,0xc9d0db7af8848992L },
58489       { 0xcd1be9bf15906eeeL,0xa95d25fb916d576fL,0x08de893be152fb62L,
58490         0x65d743658ab1e35cL,0xd6d97057fef14ac1L,0x67ad47b9574508c7L } },
58491     /* 30 << 287 */
58492     { { 0x1b403c4f1470433eL,0x6f8cb19257e53eecL,0x87b5b93df0cce4f5L,
58493         0xfefaa5008c566f77L,0xf6aa8066db71517bL,0x9f01b036d67f5952L },
58494       { 0x9524306faaeb40dfL,0x5cb2e8e1421350a6L,0xa57d05ea3d69040cL,
58495         0xd0ff12a1b9bbdcd8L,0xed64d3259e3e19bbL,0x29509c0fed0a490dL } },
58496     /* 31 << 287 */
58497     { { 0xc94191e7a607c050L,0xb918a096b98d3d4eL,0x97413dbce3f253f3L,
58498         0x8476c03cdc6d8418L,0x50247d1d2402202dL,0x077476225f8097c5L },
58499       { 0x1457ab609b71c6d6L,0x9ff312c447cf0c94L,0x954dce23ee79d2bcL,
58500         0x3ba2b1a4a0da6e48L,0x363df36f532be9f6L,0x816642ddc742c7d4L } },
58501     /* 32 << 287 */
58502     { { 0x6edf5561ff8b1fbeL,0x614b788ef6eac0c0L,0x7699ae56d8d66d29L,
58503         0x5f81602ae9d58eb2L,0xd0c04874faf9176dL,0x4b3a0046523153b1L },
58504       { 0x9690930ff6315883L,0xa81c0b44a60ca92dL,0x2d0e725873bcba90L,
58505         0x57efe72de902e329L,0x3fcd598676bc27b9L,0x492adf0393940c09L } },
58506     /* 33 << 287 */
58507     { { 0xf2ab8e22973a4b6bL,0x6a96f2ef6ad73ce7L,0xad5e22547235e929L,
58508         0xfab3e4a9bc6c3b76L,0xf69fb2062dc950d0L,0xd863ca9049478ff2L },
58509       { 0xec669f122749fabbL,0xe1d28bdc71a6d279L,0x766ee6458372942dL,
58510         0xd118b90480ade5ccL,0xedcfb0a72293740bL,0xa3ee3a67f16b29cbL } },
58511     /* 34 << 287 */
58512     { { 0xc29fb53e118a0c7dL,0xea7a1017193b834cL,0x678072a2cec93ecbL,
58513         0x9054d6b72475dedfL,0x4a7d477342ee616cL,0x05cec7f8680f8a43L },
58514       { 0x39c491d496915870L,0xe07a2b1d8746edeeL,0x1d8ed3c83566e7fcL,
58515         0xc7d744e5e002298bL,0x8a0acec99c0e6388L,0xb2daac39ebf48fe3L } },
58516     /* 35 << 287 */
58517     { { 0x773ad1cb8e133d97L,0x1e29f5a2872523d3L,0xa2a742293a09c1ffL,
58518         0x809e6d284369ca06L,0xf22e521a7fe148caL,0xbaaf90c383ef9578L },
58519       { 0x65aa9b54d633b2d5L,0xe55f2ce29a2994a8L,0x8a0af446e67e0b85L,
58520         0xb9714de9c1f062c8L,0x1f4047dd2a3aa1d7L,0x39658ea965179222L } },
58521     /* 36 << 287 */
58522     { { 0x0322b29a57fbc5cfL,0xf55af7863078be9cL,0xd4b186e6ecb59f79L,
58523         0x50f5fe746d950733L,0xaf8a1898a9f90d02L,0x483801a742d6d9bfL },
58524       { 0xf0a0af145ec09c0eL,0x85af0e6188383360L,0x404b295e42592235L,
58525         0xb3199d63c596493cL,0x7aadacdb194abb80L,0xac84563ec1c845c6L } },
58526     /* 37 << 287 */
58527     { { 0xd78d1dae5336e58dL,0xa3f36e0bc5ff354fL,0x8421f95e5d1ed78cL,
58528         0xff4c16019f360c43L,0xd5efa09f8bb582a1L,0x0ece005aefb39652L },
58529       { 0xce8bb58036c2c940L,0x11f8f74bcd1ae8ccL,0x923c350b57a2f2b3L,
58530         0x2438e3213c86faacL,0xe76129503e230776L,0x35c73d415e6158e2L } },
58531     /* 38 << 287 */
58532     { { 0x8ffda4643672507aL,0x76301be7dd91327aL,0x42720bb0958860bfL,
58533         0xedc0b8945ad4f455L,0x2fb553201bfbeb4dL,0x22a425bda1c6494dL },
58534       { 0xfb927a85de0e7f52L,0xb84a82cf49a4b6a1L,0x8afd0546b640fe0fL,
58535         0x23b78fbed2fc15cbL,0xeab469c26742a49fL,0x308e453fe277c7cdL } },
58536     /* 39 << 287 */
58537     { { 0x60ce0f55af7b14aaL,0xf2577fbe5cf5a2caL,0x7bb9521fabf3bb41L,
58538         0x68b6409def00287aL,0x700bf423bfaf9391L,0x98e6c3017d637300L },
58539       { 0x342ed4870ce28aeeL,0xad8b8dc383b059dbL,0x1b8a892b85d0a485L,
58540         0x553c4fad6b7a7d3aL,0xf5692acc198d0379L,0x6004ebb3ce932f00L } },
58541     /* 40 << 287 */
58542     { { 0x6895dbe2f820c195L,0x3787a5003f6c7b40L,0xdc718243ac1e90f3L,
58543         0x352f8c91ba5d0870L,0xf3d1c53eec0112b5L,0x08a0782f6b84f64aL },
58544       { 0xd659e6358eedd5d4L,0xfc30df6c29537276L,0xbfb09978a1755ce0L,
58545         0x227f7b12aa2b4187L,0x828730b9226539d2L,0x9051a37cb2472c95L } },
58546     /* 41 << 287 */
58547     { { 0x430c2a45d0a0ddabL,0x916aa68926a6291fL,0x9db5510268dff24fL,
58548         0xa22121c1850a7aabL,0xd43416194e2d9670L,0x7ef2cb9415cf7636L },
58549       { 0x2cd6ddf6bf97b27dL,0xac5676b625aba9c0L,0x3ca96f7ec4ee110fL,
58550         0xc6900abd08e7ebb4L,0xcd3942fbdcb91135L,0x62d6b6f6a8ad56e2L } },
58551     /* 42 << 287 */
58552     { { 0x1ec7f2410828d35fL,0xd94c2a926ccae554L,0xdf4227273c36ecedL,
58553         0x2facd6d89fa6582bL,0xed43247ed349d3beL,0x1d59d55d1db6fcc6L },
58554       { 0x2b5074b1ee1bea38L,0x025496aac9c21a8fL,0x57dd7fa1d1d817edL,
58555         0x57b5572aead03124L,0xdc024be87314616dL,0x5bb5b23c10f6e38eL } },
58556     /* 43 << 287 */
58557     { { 0x643cb9cd53812134L,0x016a11e8092ff9b5L,0x227f3dfbfcde37bfL,
58558         0x01b9bcebe8a8fc6dL,0x7009ae45e1da0dd6L,0x193b6f519e2908f3L },
58559       { 0x28656302230db5feL,0xb0a730c41aaeee73L,0x028320ab387addc8L,
58560         0x92165d909a92488cL,0xb0b2f8f09066c95cL,0x0fa55db564007634L } },
58561     /* 44 << 287 */
58562     { { 0xbff4fe0844284b10L,0xc7e3f8da19c2f775L,0xdcd97e54a45ab746L,
58563         0xf53158a9540ee8a5L,0xfd19068728c4aa74L,0xa3447e30648fa2e1L },
58564       { 0xa6794670c374cedcL,0x605629c258204248L,0x1b86f8e6f7d8db3dL,
58565         0x1e8ffe8bff0f38c9L,0xe4a556b8e274c82bL,0xb31406c94c0076d6L } },
58566     /* 45 << 287 */
58567     { { 0x198999821e555a0cL,0x831e923fbc196442L,0x8b294623f682e135L,
58568         0x79ba90c01743c6e1L,0x74f8dbafeff5ed22L,0xe4c3257d5c010835L },
58569       { 0x9cf94a208f9ec66bL,0x9fe9da3ddc303c43L,0xa53870be0cb716daL,
58570         0xc322ffaa2aef881dL,0xb9ff76ff0fcd5580L,0xdcc125d49ebb1d7dL } },
58571     /* 46 << 287 */
58572     { { 0x747b6b6ddecaf88eL,0x1a32f8ba368cc7caL,0x52a3a00f60d84fd7L,
58573         0x60052af507adacf7L,0x8b7bf25650b8de16L,0xb8b2acf8194926baL },
58574       { 0x4bda72c81d1ef524L,0xe350f73288993f96L,0x63fee4e2e08c5d39L,
58575         0x1f2cd9cd5db46904L,0xbf11ac311668d3bcL,0x8eaa064371d721aeL } },
58576     /* 47 << 287 */
58577     { { 0x33cfdcb3e14210feL,0x4abad5ec4946aa01L,0x14b42417a8cb53b3L,
58578         0xeebb0d70238d4edfL,0x8c9d87fdb5bdb30bL,0x3cc680f17c928b33L },
58579       { 0x4b2b2358757c2607L,0x51a70a33c1c8dedfL,0x62a26d776b22d113L,
58580         0x2f4acd62ef3b4f5eL,0x403e91bf6ed00636L,0x219ba3577bf74d3cL } },
58581     /* 48 << 287 */
58582     { { 0x7de743e2b39317b8L,0x9205d4472d372acfL,0x8226fc303eeb0012L,
58583         0xab2a3e052af74be6L,0xbe4767804af91ac0L,0x98497c710ca36bf4L },
58584       { 0x74fdf7cd8d6dedb4L,0xb50778eea0fc5919L,0x5d5ec33f2fcd7c63L,
58585         0x667b81937f33cde0L,0xce48ae4b38364d44L,0xb8578963223ed67eL } },
58586     /* 49 << 287 */
58587     { { 0x3e5688e46bfd7adeL,0xb3f1eb051b80bd4bL,0x8626c4cafe3de456L,
58588         0x8846bc714b7e5444L,0xa54c7cff689e8a67L,0x8c3ea61f43eadcf6L },
58589       { 0x924f17d6fde15178L,0x45319eb705c08d2dL,0x6d55775d9f85dcbcL,
58590         0x2aaf9f7405278280L,0x574a13e77b617153L,0xe7fa921ae8b15bebL } },
58591     /* 50 << 287 */
58592     { { 0x9dd54056514e343aL,0x8d9116dff12aa25fL,0x5322ec38e3397844L,
58593         0xe1843921571036a1L,0x2cde0a48650beb19L,0x41ad4a7e4f259728L },
58594       { 0xf314fceeee6448b2L,0x80006b2aff0e81f5L,0xb5ee5524d51d229aL,
58595         0xeba6d733128e900bL,0x79278cb8030f391aL,0xb24bcd63a9a5f9fbL } },
58596     /* 51 << 287 */
58597     { { 0xed867a7b37d10743L,0xd57d2d8df510023eL,0x4d500e4c737e0a50L,
58598         0xcfa119900ecbf795L,0x3ac126b89373bdaaL,0xb06324fb735449a1L },
58599       { 0xfe321df5cd79de70L,0x52d625dbfd07c6d4L,0x88ff505a3d628e51L,
58600         0x120350fab044d725L,0xf718b20ad02f9515L,0x766698630bbea1b2L } },
58601     /* 52 << 287 */
58602     { { 0x6293e0ff50d9bda1L,0xe7259ada433b4dd3L,0x39aee63e821cee67L,
58603         0x4d707c7144b10739L,0x42b9e0f69bd6efc3L,0x7d71edcc0717a61dL },
58604       { 0xe7df9e56d1e5a5bcL,0x7895b638ddde509bL,0x6fc597b3d2a6a822L,
58605         0x022da65d96d2a8abL,0x95541ce7cff45c72L,0xa5bb7799e649800fL } },
58606     /* 53 << 287 */
58607     { { 0x7472e4c963676cd5L,0x2836b1d52687f376L,0x1460b664f732a51aL,
58608         0x7c4541f22a214ae1L,0x743a524d107d6622L,0x9c64e3ff082fc015L },
58609       { 0x9341f3fc8e0d13bdL,0x9946043e529554edL,0x6fbbbcda5798d6ccL,
58610         0x3bfad5fb242115c5L,0x1f46bd1945ab793cL,0xd9383bcf3b42f81aL } },
58611     /* 54 << 287 */
58612     { { 0xe4ff888f820a13b5L,0x7cd18b3eaf1bfbbbL,0x3fb7f681bd4e4dd5L,
58613         0xaba364c287d46c40L,0x44e209ab659b3498L,0x5e071a272dde85c1L },
58614       { 0x8a029b1fb969c790L,0x51bab9f0c6fd1c22L,0x9ee9b047b83eb0c1L,
58615         0xda0b39439e5b2c35L,0x0cb30625f20ca425L,0x8e4dbd013d25c2c9L } },
58616     /* 55 << 287 */
58617     { { 0xe7aa41a96b8f7599L,0xe97ff24a3f556ad5L,0x10e07713dd6a9329L,
58618         0xaf464b18c4d06a93L,0x9b8e5145a1ccc85fL,0xa256680bd0487ca6L },
58619       { 0x420b60bf815652f1L,0xeaf09eff5bb45b6fL,0xa31e875f8845a557L,
58620         0xb035ee09eebe0911L,0x1402d1d86531c356L,0x24aeeaf0b630f75aL } },
58621     /* 56 << 287 */
58622     { { 0x4b20d1829567f5f4L,0xde7e814918f02b34L,0xc9a4be7becff9dd7L,
58623         0xe2f70bbe9812fd3fL,0x471bf90c9c889263L,0xb60d01b53e61f5bfL },
58624       { 0x258c7f89d22d855bL,0x35ef5c15b75a7d4fL,0x26d8e1dab247f27dL,
58625         0xcf1361998d0f7757L,0x312447803f8e894dL,0x8d2a20bae1a3d47dL } },
58626     /* 57 << 287 */
58627     { { 0x6447cc97f08a0417L,0xd98ea6837afee809L,0x81426d20bf7990aaL,
58628         0x848bd6223526ad26L,0xb6cdc5b4fe1f3381L,0xe7e10bc7a26189ecL },
58629       { 0x25a9f7cf57464e6bL,0xf90c1aa12c86ddf0L,0x2126ed530124705fL,
58630         0xf384e7e5b58e6341L,0xb2dfeb0a12207e57L,0x72875c55e0e23287L } },
58631     /* 58 << 287 */
58632     { { 0x37579c3eb954b7a4L,0xf0291f8f3f2ea608L,0xde68104f90a85ed2L,
58633         0x6a35fea9e1088788L,0xe8d5517470d15d00L,0x0bc72de552467f90L },
58634       { 0x2ded3293297be2b8L,0x76c53e5761ddc65bL,0xae4b2b5015562d6aL,
58635         0xfe7cdd329e0aeb79L,0x98ef4c518dd474ecL,0xfca56ffb0076b23aL } },
58636     /* 59 << 287 */
58637     { { 0x120adcba6f60309aL,0x41e46edeca8ab2c7L,0xd68aa4c529b79ce0L,
58638         0x21a21f8d7a3b11fdL,0xea68dc4739d0809fL,0xd4faa71a27973044L },
58639       { 0x65b42172810be134L,0xb2dafa6c793aee92L,0x951e9f6f1f78f7dcL,
58640         0x2affc70a17fdba97L,0x4f0f4c51dcaa2789L,0xfde1951c9e703980L } },
58641     /* 60 << 287 */
58642     { { 0x80826a196488d9d8L,0xfa452795f3ad867aL,0xdd9bf8f5bd4e6674L,
58643         0x324386227e8e3ee5L,0x7af4c605dff05c96L,0x79efb6f9541cbbd2L },
58644       { 0xeb5ff62675e78961L,0x5318c4c30be43d7aL,0x02df456daa4a0562L,
58645         0x4d6002d88a916a81L,0xf0dbc349f68eced2L,0xfd75d4d5ec8c3fddL } },
58646     /* 61 << 287 */
58647     { { 0x6c15d903544378f3L,0x0a9bc9d735ea3c77L,0x9d9066408caa4acbL,
58648         0x9ba27502402be833L,0x1ed4123f8773fd7bL,0x236364ba190eac92L },
58649       { 0xd6287f17f8383ee1L,0x75b7b0b5d9739582L,0xeb6cd50d0292806eL,
58650         0x216f36dc43448409L,0xec136f8cb6c4958aL,0xfa805ab49ef7810eL } },
58651     /* 62 << 287 */
58652     { { 0x5c6448f70d00b29aL,0xaa134b87124cd55dL,0xc2c6b269d94b72d9L,
58653         0x0f0dd472412f76d8L,0xb4cf3c1873f6571aL,0x6aed00218b9218ffL },
58654       { 0xa55b74eaa0c9dde9L,0x59b952125b4c8fccL,0xbc9873ea4ddc367bL,
58655         0x26b369ba0fd30421L,0x71763a45e446f4fcL,0x67e800edaff54707L } },
58656     /* 63 << 287 */
58657     { { 0x4de97de1126b4919L,0xd631d908883ea109L,0x37c77d729f6ec50cL,
58658         0x910932e6df718c7dL,0xa798406855028d0fL,0x21b09540a6119a26L },
58659       { 0xb837cceced4b4962L,0x3c83f4bdba66002aL,0xa067aa3d2ac41124L,
58660         0xa64bff30d08dc360L,0xa22778a5c108d3abL,0x7f732064aac4dee4L } },
58661     /* 64 << 287 */
58662     { { 0xc68b641ec795a2c7L,0x4fe559b15a4d6647L,0xeda98cbad89ce668L,
58663         0x15f84dc06c269d8eL,0xf0eb685ecbf34023L,0x3668c530c032634aL },
58664       { 0x2e3d7fffe4531f59L,0xe627030685494d06L,0xf02cabcfa3e050dfL,
58665         0xccd2da67c001dcd9L,0x50aa3723066d2d52L,0xdb0756507224a41fL } },
58666     /* 0 << 294 */
58667     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
58668       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
58669     /* 1 << 294 */
58670     { { 0x04418b5965b55050L,0xa8a797c3d324aa67L,0x5f87e22c7c65a6d9L,
58671         0xaac710651dbeffe4L,0xff619d64bd3cc05cL,0x9a29c966e65c92c4L },
58672       { 0x23af2b21dad7fcbdL,0x4950a767153b817fL,0xc34a7efac6478c55L,
58673         0x57cde95af6cd140eL,0x64b74575f5a0db2eL,0xd4b5ea5275d7fb76L } },
58674     /* 2 << 294 */
58675     { { 0x284050628e72aafbL,0x655bf3538ea8bf00L,0x789d944405547f7bL,
58676         0x7fa445ed3441e472L,0xfeb198254a44ce87L,0xccb5f12c129aed14L },
58677       { 0x22b05de3af94fb34L,0x7422a040d3f03199L,0xfba252caa83f7f08L,
58678         0x0f6ad6e6cefaa757L,0xe1ad18716517d806L,0xd16dc8ed8e9d97adL } },
58679     /* 3 << 294 */
58680     { { 0x0208092a0e3dca68L,0x9a49bdccd1a09971L,0xe5194181aefab9c1L,
58681         0xc1c9690a0076f47cL,0xd7499e95b486c2fbL,0x83a69e43d4b72e00L },
58682       { 0x75f2838a2d1a6c2bL,0x57a24c69751f6366L,0xd956ee08626cc684L,
58683         0x434cadd7e6ce3249L,0x3d4eaececfe289bfL,0xbbd53b961b8aafddL } },
58684     /* 4 << 294 */
58685     { { 0xcbb99194a3736eb6L,0xdd5161cd36dcf470L,0xd50b24aab6ab6c03L,
58686         0x419d2810bc41f4b7L,0xe2e88d7a295496cfL,0x350713f2f2457ac0L },
58687       { 0x838e4a360427e2aeL,0x7631472a4d974e5aL,0x9fa3ab1c7a5c5fdcL,
58688         0x324798cdde34cb8dL,0xbfa5a9d0889105feL,0xd05dad34fd0df249L } },
58689     /* 5 << 294 */
58690     { { 0xb47c1d47d6a3a1baL,0x99bb7e6572f65bd5L,0xf251794578abfda2L,
58691         0x827f2aba3e3e3420L,0x436ee73250e2de70L,0x5c9ac6dc10eca926L },
58692       { 0x2ec67465181f5e18L,0x1e8f32fcc6c83d02L,0x9dd3aeaf3953bd81L,
58693         0xca955f4b07086daaL,0x7b4b6f3fd14eaa88L,0x562e75f1148d826fL } },
58694     /* 6 << 294 */
58695     { { 0x536e5657cb419fc3L,0xe8c208bc1d271dd1L,0x6a3713bd22d2b9adL,
58696         0xa4c761a7471d808dL,0xd93aafb67e6dca35L,0xc46c0ae38f55ca32L },
58697       { 0x55dc0de7a78bfca0L,0xe9cfb3013407d0caL,0x777e2a60b3256c14L,
58698         0x32b2238c6d8fee02L,0xe8b3539646e43ee8L,0x310bc1ba247985ddL } },
58699     /* 7 << 294 */
58700     { { 0xbb9bce6810168f49L,0x32edc368717445e3L,0xb0b5a04426aa3ff2L,
58701         0xc671f1fcd166542bL,0x3142864df61d2523L,0x11b2dfc7b0c67410L },
58702       { 0x2e031a05c99690a5L,0x4782fb749fb7bae8L,0xeac2cd506b7175acL,
58703         0x2e116782bef2313aL,0x67992027241c4d2dL,0xf8aa0e09a6952d9fL } },
58704     /* 8 << 294 */
58705     { { 0x9974759c581f9d3cL,0x9e76a970e5cb1973L,0x8afec58ec64941caL,
58706         0x2d7c57fa01d05575L,0xc07c74cc5c448db5L,0xa52474ce01bb1440L },
58707       { 0x93162d9700115bbbL,0x483b6147fd7480f9L,0x4f28c57e6af18dedL,
58708         0x36faed8f174a3089L,0x702dbd64a3dd6265L,0x86a9c43f6adc0d7bL } },
58709     /* 9 << 294 */
58710     { { 0x9d4d4b3c795eb646L,0x727e2aa17485839cL,0xb50018a5aa9250baL,
58711         0x5a15808d1ba716adL,0xb1748d580ff91cebL,0x0131bcff76144b6dL },
58712       { 0x23fea4a58dcccffaL,0xe8eddb5ceb64caaeL,0x011a65971c3c5e66L,
58713         0x7723dfba377a8f6cL,0x00167c71dee2f651L,0x3e89ddf5ee0e4325L } },
58714     /* 10 << 294 */
58715     { { 0xa3510710b9de7b63L,0x9f364ad14019c9dfL,0x5b66a5d79b5bdce3L,
58716         0x2b2f695178b1b385L,0x3e4783d33cfa9f99L,0x1af517506bd6bcf4L },
58717       { 0xf9c0686a81d8d7efL,0xdc0f22ec37c068d3L,0xe1b8665393545fafL,
58718         0x37ca8501a8a52881L,0x07ac5c8a5603e359L,0x98fb2bab542cc937L } },
58719     /* 11 << 294 */
58720     { { 0x96326ec323da6b81L,0xdb48a5e1f90a6f83L,0xbb141660f640a0fdL,
58721         0xb51609375b92f5c2L,0xaaabd54c997244e4L,0xbeb8ab2f859bb92cL },
58722       { 0xcac7c5dda4be476bL,0x7093faea7f58c1b2L,0x3167a2c45c6ad412L,
58723         0xabd86bc9544fb9a7L,0x571296a72448c363L,0x4da64cd9c6cd4621L } },
58724     /* 12 << 294 */
58725     { { 0x4981be690c5bbd3eL,0xb047df0a185fdb55L,0x3168e05074cff00cL,
58726         0x111150a1b52c7f9cL,0x0db2ed84a51c7986L,0x7d991630e61272adL },
58727       { 0x7443d93628de14ddL,0xfdf31f41a5daed5fL,0x71e0ef4e866b5e40L,
58728         0x05c57a45b965a670L,0x85bdb58c70e1aa77L,0xe4d1fe2a9df3ce32L } },
58729     /* 13 << 294 */
58730     { { 0x6ff2b1a1772c3796L,0x9b88c1178e186fe8L,0x342ba11f4312af31L,
58731         0x9a93a4d1a86ae2b6L,0x496d5f219d59e3feL,0xce519a7d6924acdcL },
58732       { 0x6fdef82327c46e44L,0xab5504c34d31c9bdL,0x6fa52bca71693677L,
58733         0x31221119033c80f7L,0xdb2cb49dc0a22f91L,0x4962d58f9b4aeb5eL } },
58734     /* 14 << 294 */
58735     { { 0x5d4618982f722563L,0x11d22b39567db14cL,0x9a8f004e6779cd40L,
58736         0x0812ae3d5473ecd5L,0x4ed828624e6c296aL,0x2d9ce40c064ee61fL },
58737       { 0x4856d586d8a9eb1eL,0x2ddd6b125d1b5e3aL,0x0ab5eec0382fba3cL,
58738         0x302018dffcf4a9c8L,0x7b4e6fd2ab3cdedbL,0x266c246a8f64cb1dL } },
58739     /* 15 << 294 */
58740     { { 0x55bad54bd6dc35e8L,0xa43d72ff38642612L,0xe39a191609bc85ddL,
58741         0xc9d4bc9b0f85d3baL,0x84cd12b61367a70cL,0xf4ebc0e04937bb2dL },
58742       { 0xd083145949dc027bL,0x110751601cf29970L,0xa443a29c0b76b4c0L,
58743         0xee5b8d0ca0de3249L,0x368aa3259002e7d6L,0xeb48afdc6182e2e4L } },
58744     /* 16 << 294 */
58745     { { 0xc41e4aedf5c3af59L,0xa0284ad06de9a78aL,0xf5eaab7b8ed812d2L,
58746         0x7801fbb81afb58b8L,0xbe5cdba671efcc3aL,0xe31a0e3ccd10cb91L },
58747       { 0x882e821e85dc0bc6L,0xd3ad070fbb32e506L,0x3afede2bd8a0f038L,
58748         0xe20a117c857fd3a0L,0xebaa2aa43060f767L,0x6524aa0d2b9d1da1L } },
58749     /* 17 << 294 */
58750     { { 0x86aeca0ffd81174dL,0x19bc6ee60c6eefc8L,0xc85f7f2ea91f0e19L,
58751         0x09b9276ad2354dc8L,0xb62adee0542a669aL,0x8354ad1a88097445L },
58752       { 0xe67d2834df9984a1L,0x2330c8cfa64b2864L,0x309dcdeb39e7b54aL,
58753         0xbbba4737a18cf5eaL,0x47511b1d92861a8eL,0x99d4bd673286d404L } },
58754     /* 18 << 294 */
58755     { { 0x9cc5847c88cffe33L,0xff726b0f6e8eb6c1L,0x9bb2ca161bc45d8eL,
58756         0xe7903009a6d8a5a6L,0x4f089cc047db2201L,0x4135884de6b5928aL },
58757       { 0xb1a86a0ae5c017cfL,0xb1d9bf6db0a393dfL,0x33d9c1c628bb3277L,
58758         0xcb05b67b45b582ceL,0xa72585fcf33792c5L,0x78b7c5e8a7d1ed84L } },
58759     /* 19 << 294 */
58760     { { 0xbb83b446b1b4a091L,0x66440b3d9603d875L,0xd1931f33c2b45d1aL,
58761         0xb8b67f20098d4cccL,0xa3583818790f208aL,0xe01194bec4a3e88fL },
58762       { 0x29301bb192e8b150L,0x1795cabe9448ee60L,0x377d8f9752500c48L,
58763         0x474e73d65a457e79L,0xce0a50ef30159027L,0xfe69abaafbb2c214L } },
58764     /* 20 << 294 */
58765     { { 0x70e478fb9346df25L,0x01dc0c2eb4a4ada5L,0xaec82b005be36ea7L,
58766         0x82618b8f6717e06aL,0x2db1f6d4008f1977L,0x4e493f3b16b390d1L },
58767       { 0xfe86fd4d990a75ebL,0xa1cf7f99783f6076L,0x6cbb23e70c049158L,
58768         0xd05be7e5ed456235L,0x601374069bd836efL,0x94ec964432e5f604L } },
58769     /* 21 << 294 */
58770     { { 0xd96e4d920fc48c7bL,0xa2e29660f66e491cL,0xb92d850601146906L,
58771         0xa43f4803afe346d6L,0x27885d98700b6bccL,0x90662e9f595d8de2L },
58772       { 0xefa7f261f70d1007L,0xfe8a8be3fc72531aL,0x3b3f7541f1aa8d93L,
58773         0xb31bea258215966bL,0x15faa4acf35d2be8L,0x0a5f95e786c9a45fL } },
58774     /* 22 << 294 */
58775     { { 0x3361e1ce3d87bfa8L,0x92f235e78dcca4f0L,0xc8084cb4be323fd1L,
58776         0x3fd481a5c24c6d16L,0x9b1bd9402cea81baL,0xf50911910c5aa59fL },
58777       { 0x4cd8c9eff81d5e2aL,0x5ad000131550bff4L,0x29d47b9f8cc32e55L,
58778         0x66e3e6f111694eceL,0xd5edf7017950dd7eL,0x9ccb10960f6350c6L } },
58779     /* 23 << 294 */
58780     { { 0xc31e47ff95e784e4L,0x7ad0dfd63fa14241L,0xc91482092dab896eL,
58781         0xe9a114cccb9bb463L,0xedce9e6f16cb16afL,0x0ee2ce0607508893L },
58782       { 0x1aedb80ce31c0f54L,0x235d4591512658ccL,0x9029fad2a38583f1L,
58783         0x95b1e1ddebef898eL,0xeb2f21809efabef3L,0x458c4338b10e9cbbL } },
58784     /* 24 << 294 */
58785     { { 0x09db138d18f2470cL,0x63bd2290f613658fL,0x0bb647794feebab9L,
58786         0xfce4aee17fdb1e71L,0x7d5c0c61a7f1f65dL,0x46405b618d02d6cdL },
58787       { 0x7cac04856fdcb0d0L,0x85224c4b2f8ec5afL,0xb5879a59db0aa864L,
58788         0x75f391b8ff94f8b5L,0xa6c994ae49c97f8eL,0x4d968fadd690b232L } },
58789     /* 25 << 294 */
58790     { { 0x1e436df6e11a616aL,0x9eb49c76bdb932a8L,0x207d2fe90e6591aeL,
58791         0x6e05acc8233ac034L,0x464dd321f3d04d32L,0xd4ba4889af43c171L },
58792       { 0x0808e5207120fab9L,0xb9e4726c3fbac672L,0x5dd1c13b9d7d883bL,
58793         0x1c091808771f1edbL,0x76988d1c75eac1a5L,0xb0fcd3a893a67be8L } },
58794     /* 26 << 294 */
58795     { { 0xf5cd290a67e0b4e7L,0xaa6fa6807c1594b6L,0xebedfbd7b63270beL,
58796         0x574b410ba369bfeeL,0x431cba5a020ea888L,0xd3a3102f56c71d47L },
58797       { 0x4894bfe0a90a853aL,0xd78bd98b5f9c4b6bL,0x9b1324f6d900c5c1L,
58798         0xc65c944d718c2147L,0xf661de6ba987f634L,0x0315e69f172628d8L } },
58799     /* 27 << 294 */
58800     { { 0xb12e0ab8aac7ab64L,0x8ce877abb06cf9cfL,0x39b694b40bb11fb4L,
58801         0x0c2428369b0d8850L,0x6bc9a033ccd50c6eL,0xaa2e77739a1e8fb3L },
58802       { 0xa7d8be09608e2e9cL,0xeb4cef0542b9f458L,0xa7268c9b985f66fdL,
58803         0xd60eeab27acf4968L,0x02eb2db3b6e5621eL,0x82fb4abfad8236c4L } },
58804     /* 28 << 294 */
58805     { { 0x07c60c7522ea5f1cL,0x35beae34a36bee4fL,0xa8b00a09dcba8997L,
58806         0xa77f1f3a802ce50cL,0x6c4050df2a2144b0L,0xf79bfa96ab1b10dbL },
58807       { 0x9025d470433a9b1cL,0xaf3e391790d9eec8L,0xbcad2d629ae2d535L,
58808         0x7a152829eff0f6a9L,0xe87345cd925fa5a0L,0x6ce007200e84039cL } },
58809     /* 29 << 294 */
58810     { { 0xc65acf36c3d095d2L,0x9192c5fe72427e6cL,0xcb84c43c3fa8b90dL,
58811         0x2f458fe965e15b23L,0xd8bf193731469f11L,0x1ccd8bb93638cc3eL },
58812       { 0xa067022f78e35577L,0x382e6af730ee676dL,0xf197adc2f6d135bfL,
58813         0x06360834c9a1cf58L,0x413813f7930371beL,0xf7461d04f5dcaccaL } },
58814     /* 30 << 294 */
58815     { { 0xdae449c007f6a05aL,0xbc1b84f55bf26c9eL,0xe3b3f9edb1c13820L,
58816         0x5442ad5b4090598bL,0x794ef65613749e4dL,0xde809180948b71c5L },
58817       { 0x4c72dc7de203c5b5L,0x8902b0971b349fc4L,0xa899bedb225a1569L,
58818         0xeb7da73de6ff3f53L,0x6ee8e1607c0be37bL,0x9ee667d2a31bf943L } },
58819     /* 31 << 294 */
58820     { { 0xbc91031108b6fb2bL,0xa5e0ab3e25e06a55L,0x16ff0705360f1698L,
58821         0x71c0aa7487e72a67L,0xa1f1497b355c75e8L,0x179b67bffa6bbcd7L },
58822       { 0xc9db6590b6738583L,0xf77660c4d87e72bdL,0x0ee2e7b3f13abc2dL,
58823         0x0cdf5a37a4d922b6L,0xaa8af2d596c853a4L,0xdc452af4e0092356L } },
58824     /* 32 << 294 */
58825     { { 0x5017e145db81146dL,0xc7d2086d45c54db8L,0x2541059dfa98234aL,
58826         0x4bf344d99985af98L,0x39737ed67b5b7b1cL,0x8e24691987c411adL },
58827       { 0x2fad8cedb877a75fL,0xe42352df17e60ee2L,0x1a53d856404043f7L,
58828         0x6c1f07a5863927a1L,0x38d3a4f4b6892121L,0xf4c1092001976c8fL } },
58829     /* 33 << 294 */
58830     { { 0x541732a70224214aL,0x61617b515cb2d019L,0xc560c24bcb4fc6b2L,
58831         0xd0ad737943670d99L,0x08cdd32eb83112a8L,0xbe57493d7e29810fL },
58832       { 0x7834124899d4523fL,0xae1a5857cc8e5fb7L,0xf8b62a59b8454efaL,
58833         0x7c63c900ab0f4729L,0xeef9243d72dd0f5fL,0x6b865dfbad766386L } },
58834     /* 34 << 294 */
58835     { { 0xd11536eefee626b8L,0x1d2471dd8077b5d4L,0x7db062debdb9a4dbL,
58836         0xfcc62c0ab9f808ebL,0x619b54c6ef392bc7L,0x81e146fc51b9f5c9L },
58837       { 0x0343807c7bbd52b3L,0xe024a9f1572125c5L,0xf8b886d86c57cb31L,
58838         0xcb92aa7d5398a318L,0x4ce0870d2410ef34L,0x1a40c103f8366683L } },
58839     /* 35 << 294 */
58840     { { 0x46485baa7bb78552L,0xc0f685f23e6a3f0fL,0xd24970b5fb3cc0ecL,
58841         0x0d1f380e7bf91feeL,0xf0f7fcafe7624351L,0x27cb99bc697a8055L },
58842       { 0x55be14685cdc7560L,0xf006927927ba7f93L,0xb0c25c759fdd0e70L,
58843         0xda82e73785818253L,0x7d40d86946304c51L,0xe06ea6fdcc18ba58L } },
58844     /* 36 << 294 */
58845     { { 0x99d37ade6b65e17aL,0x61ca538e38ce217cL,0xd3ea83f68ebb89edL,
58846         0xce6611eb4b02964eL,0x0ec7cc2f5c0a8e44L,0xa985b0c2974240a4L },
58847       { 0x7a3abb6c42ee5b0fL,0x55f049a0cb2eddadL,0x69348b027c44a60cL,
58848         0xcabc65191974a8c7L,0xd9def4bc07b91a35L,0x684a2d71b93b34c3L } },
58849     /* 37 << 294 */
58850     { { 0x21c37d21f48f274cL,0x2de96b4da082a098L,0x82520e0ca606b6a6L,
58851         0xf76c9ec6e1050b81L,0x248c5efbd1ce149dL,0x5a36ae1e9a909790L },
58852       { 0x8790b09bec8b43afL,0xd592dce560ff709cL,0x726d699724cc8e21L,
58853         0x61e37bef5e2cb745L,0xd55a68c26eff3ba0L,0xd47f02659ad265c0L } },
58854     /* 38 << 294 */
58855     { { 0x3e6351ef3932ef94L,0x65625878db5d64e6L,0x118a688e091ec7b7L,
58856         0x2a95072abdf60b88L,0x5200703540dc0afeL,0x59c3d90b6fc1cbffL },
58857       { 0x5622b1b21dfb1a7fL,0xdcb0344834d92243L,0x18fccfa86d7d36c4L,
58858         0x5d43a14181341761L,0xef375542eaaee79dL,0x4e4667216999d399L } },
58859     /* 39 << 294 */
58860     { { 0x1bca97aa9d3c6b9eL,0xb4bb4f95095cb250L,0x4f2c216a996fb52aL,
58861         0xc4d01916f379790cL,0x510882a4359df53dL,0x6457d76a671d6a8fL },
58862       { 0x0ded2623061f7d64L,0x3cb4f38f1ce7dcf2L,0x0d86313a224ffa88L,
58863         0xba8a15012b99aeb3L,0x2fb92183d69f72b5L,0xd3b9d6daf1fdb8f0L } },
58864     /* 40 << 294 */
58865     { { 0x5d573a3a0b6320aaL,0xf9ac8ccf289b6700L,0x8bad05cd8f28dd72L,
58866         0xe2eabd446b62c306L,0x60f70353906ef302L,0x147cdd0c367a768eL },
58867       { 0xea9d871635a9e846L,0xdd71e80aa8684430L,0xa56a5ccd530768a8L,
58868         0x59d241270a3e42f6L,0x707cbaf0faa367d1L,0x5419b14f52a0cbd0L } },
58869     /* 41 << 294 */
58870     { { 0x625bf4e6d991d842L,0x56b95a56a81daaaeL,0x2101137c9911bdadL,
58871         0x1141b0a1bbded1c2L,0x85deb889d1df8d43L,0x51e3e17edac3e376L },
58872       { 0x5d31639381fb19f8L,0xd1cb634b92eed2c4L,0x72a6ed7b943746dfL,
58873         0xd55f55fb22b85e00L,0x255b025804193aabL,0xd0b94c5d86a78c96L } },
58874     /* 42 << 294 */
58875     { { 0x121c15d859c3556aL,0xabe25c21864380dfL,0x2de101832627f78cL,
58876         0x19988e4b4bcf4a0cL,0x4ed3aad8a2f9cb52L,0x50f8cef5b2b257e1L },
58877       { 0xab0b000c49f7f596L,0x6cb997471fb9c471L,0x331974b95fefb8f4L,
58878         0x57cf97578e2e0e5cL,0xa82a8d06174a626cL,0x40ef371b03e80567L } },
58879     /* 43 << 294 */
58880     { { 0xfea713e1324cbab8L,0x738885e61897e7baL,0x8234ed08126aaa13L,
58881         0x4f66467661ed1548L,0x61fdc2aa172c432bL,0x78eade7c9ebf0a29L },
58882       { 0xd50ae7156aa104a9L,0x977d7a605536df98L,0x024014bdc9eb983cL,
58883         0x75d53c0585e21649L,0xc181d67098404cffL,0xe00f5f5dfdb3f05aL } },
58884     /* 44 << 294 */
58885     { { 0x3cfe2987d10542b1L,0x5935e0dc29f5b006L,0xce5932d6d83344f2L,
58886         0x67aab7ad9800a6d5L,0x3ef2b0e765073619L,0xc381a99454aa9ccaL },
58887       { 0xbf069577d4011571L,0x33b70c5d4d1ce997L,0x801ba41c758c9b1bL,
58888         0x6c2dd5ec36968958L,0x31820ca087921665L,0x0b7f0d337ca55668L } },
58889     /* 45 << 294 */
58890     { { 0x0b099a5afce6c55fL,0x91d1caca408dd628L,0x42a5181165449db1L,
58891         0x540935b040715d49L,0x8feabc5433b00823L,0x7107c06240c2485fL },
58892       { 0x13f307ac4fea64e4L,0xae4ec4a713a04327L,0x8297be380eff71f5L,
58893         0x3434286f1ecd0b2eL,0x4d7a5456a3e9d625L,0x657f950b6a0d04e2L } },
58894     /* 46 << 294 */
58895     { { 0x2237f78ecebadb15L,0xa1184339da01f9e2L,0x542c3354ef37abd1L,
58896         0xbec90883de982d70L,0xbacdbb9c457d3024L,0xf1d167c19840ea52L },
58897       { 0x9ed827d8433bd3cdL,0xf4e5b4231102fdf3L,0x2038c92fb63d6056L,
58898         0x490cb0188eb9ae35L,0x776331b87c75ffc8L,0xafbe7c6a3fe2e400L } },
58899     /* 47 << 294 */
58900     { { 0xf668460c9176a02dL,0xa843a70011d322a2L,0x6424f0e8a8c5d1c8L,
58901         0x0b45a1ab1bc440e5L,0x3b740cb11c3e391cL,0x5aaa89c4d5850e1bL },
58902       { 0x77739ee6d632c592L,0x171fd350fffe373cL,0x6a648fcdbd7e83beL,
58903         0xd98650c6b619f4d5L,0xa4e4ae5438dea07cL,0x10001f5afe0bf5c1L } },
58904     /* 48 << 294 */
58905     { { 0x31cb896b57dfc732L,0xc6b74a1edc323e91L,0xd24a41d0f11b04f6L,
58906         0xb609a26dab8f7159L,0x96d84b372adbec34L,0x154f5307d24ae7f6L },
58907       { 0x36dd3243e10eb34cL,0x055d3b714f6dbbd3L,0x30b1efde36d0c561L,
58908         0x3846925ce9bffd15L,0xaf401286aa99ba07L,0x3a191267fd48b839L } },
58909     /* 49 << 294 */
58910     { { 0x67145f18e42a26cfL,0x580857fa491122d7L,0xa4e2db8dd03b5071L,
58911         0x47a39a0d3e379882L,0xb6bfe4b35970766dL,0xe40f4daea8bce767L },
58912       { 0x38f199a7e812a217L,0x1407f98d97eec7caL,0x25d6f750236a41a0L,
58913         0x644327340e811ee6L,0x84d5d9c9dddd6e5cL,0xc1b6ef13c44cae4eL } },
58914     /* 50 << 294 */
58915     { { 0x79879d4f6714e8daL,0xce409617a17abd07L,0x6f2b14d008a6e685L,
58916         0x817d467409b5e150L,0xa1181873eb51b966L,0x573ba855da6b9544L },
58917       { 0x836ec3e5c4a37013L,0xb8da1bbe93fded69L,0xdb5bb6f16edff4c1L,
58918         0xff30b837f1657d36L,0xa20cf000223270b9L,0x29d60562d44a57cfL } },
58919     /* 51 << 294 */
58920     { { 0x0d6f36b9b98b029dL,0xc4cd72d07a371233L,0x23bd419e4f95cd4cL,
58921         0x2c95b0a2b80d1e13L,0x0f76e62f7edfbef1L,0xd077194dd303a470L },
58922       { 0xd6e20e7cd1b50934L,0xf4201fca2dfeb806L,0xa57dc150bced28faL,
58923         0xa84d621be3172301L,0x119768fe9aa14d6dL,0x34f1ae864b363253L } },
58924     /* 52 << 294 */
58925     { { 0x2fc83aa3afabd13dL,0x521b745f53c45a27L,0xc6f345a660c18225L,
58926         0x9609076eb5faa47aL,0x8bdd97fd535388fbL,0x8f5f3bd6e7fd7e87L },
58927       { 0x6de4454c1c8e1d5aL,0x8d61ca3b2b35e823L,0x93b66fce4672d30eL,
58928         0xcb9d601721d09ec5L,0xef98137fb1de06eaL,0x45e212758b051877L } },
58929     /* 53 << 294 */
58930     { { 0x117b89e9ee6e35f7L,0x2ad205aadd203ed9L,0x3f6c950c0689bd4dL,
58931         0xaba1e4b342f20742L,0x67464b793e22f0d1L,0x74436dfdbe0ad6c1L },
58932       { 0xc4a6e964c1470ac7L,0x853ad39b361da35bL,0x261c6fd6a187a6abL,
58933         0x08d7e89d59fb860eL,0x158e2697e8f88299L,0xf3f1f6f34b04a8ecL } },
58934     /* 54 << 294 */
58935     { { 0xbdfb8d006b562705L,0x76dbc217ed9f2aaeL,0x62f713778cfd02ddL,
58936         0xa05eed177a5d27e1L,0x60082379a006983aL,0x312af914bf7c2c05L },
58937       { 0x7d163fe76c8500fdL,0x722a35299d4d0dbcL,0x9b4c5c3539f93a78L,
58938         0xb193734c34c7ec06L,0x457db178cda87a84L,0x088dae087f816e0cL } },
58939     /* 55 << 294 */
58940     { { 0x746e73055896ac5dL,0x1d8326c21a7b69f1L,0x695197743132a40dL,
58941         0x3899f8a03f58720fL,0x2c3070a5df0b7fb2L,0x49bc59f2acb839e3L },
58942       { 0xf7d5d3f66b8f5a9aL,0x704ed893a4c3b570L,0xbafde26cab591c03L,
58943         0xc447dac83388a62bL,0xda80991d4416acfeL,0x1625c9151e729d69L } },
58944     /* 56 << 294 */
58945     { { 0x3104e59e6b843647L,0x4eccb42720bad138L,0xa575b8e150efd6a9L,
58946         0x68a6b7055a6e4729L,0x670306798f5b2a22L,0xb2cfcf81df9253bfL },
58947       { 0x9c3eeb19b8f81c39L,0x082ca86c986b4dfeL,0x1f64eca250250d8eL,
58948         0xbf26bcfb67f0c713L,0xbc5d0e2a49b609cdL,0x175acb34e6aa3c76L } },
58949     /* 57 << 294 */
58950     { { 0x5237d7368c53aae2L,0x2a88098bbdbc0b10L,0x18f1af11cec6db6bL,
58951         0x12c23392c4e08b3bL,0x23b652bf3eab43f3L,0xb79feb949f3dca0dL },
58952       { 0xb71e311d2b24e0d9L,0x85e48aede37a0f90L,0x93e8a0e753200b6dL,
58953         0x5d44b87226bf3a30L,0x466c31d1d0496b98L,0xabec12f7dd39874fL } },
58954     /* 58 << 294 */
58955     { { 0x58bc23928ca41326L,0x0744ba8524aa5067L,0x900e7e9baaf80bb2L,
58956         0x510bd122aff38fe1L,0xf90dd6a1002b277bL,0x829379dc81bf7df2L },
58957       { 0x5443b8736372d502L,0x124c2abab5b6f9a2L,0x88b237a4d6020c14L,
58958         0x3542215108f7a498L,0x39e84240e6234eb1L,0x43d721dfcc5827eaL } },
58959     /* 59 << 294 */
58960     { { 0x43e7597234658dcbL,0xed936b96bdf3a7caL,0x74acb7f60f1923abL,
58961         0x6a52b28cc007995bL,0x5abf2909a560fbf4L,0x79d571dd256bf1a8L },
58962       { 0xa8d51082e4c3281dL,0xc0d6f8aa0b9fdd38L,0xd589f2c57ac30640L,
58963         0x6abb8faf07635c58L,0x2af1b083d7520b0dL,0x18b9f6c893b951fdL } },
58964     /* 60 << 294 */
58965     { { 0x32e678b4c1ba956bL,0x9e8b137248f32982L,0x9b380a118a8f262aL,
58966         0x5c2d6ce0807f6d1aL,0xe99c2e909f1b3fa2L,0x6a0c9e4a7c4bb836L },
58967       { 0x30d80329ee8dac83L,0xabcf7b76b60bd5fbL,0xc589a0c8c14d56d4L,
58968         0x9e40af665de24d43L,0x932f4070230f8331L,0x96bba1c19b87948dL } },
58969     /* 61 << 294 */
58970     { { 0x8b83af0c4efaae9aL,0x25e55686770c85cdL,0x0beda54fede0c999L,
58971         0x6c5749398d249a2eL,0x520ac2ba2f476146L,0x162e482de95b05acL },
58972       { 0x2d3d19b6c73a32daL,0x945e5e3c33fd2c48L,0x361d9770a36b4ee8L,
58973         0x8aed760d014cacb3L,0xae66e5de5ae302c7L,0xb5fd5959b5d4d6a4L } },
58974     /* 62 << 294 */
58975     { { 0x25df58ff147da470L,0x1b3941ec3f4e3e98L,0x7543b1227aee3587L,
58976         0xb7bc2b31b4a28218L,0x8628b5400bb3224fL,0xe3e7644d373222e6L },
58977       { 0xb4e3269299244dc9L,0xe72c679d49781bcdL,0x894d9eb0bb6f0700L,
58978         0x4a08cdbc443c3639L,0x52c4d04e5baeb02cL,0x53f550ffb5f93552L } },
58979     /* 63 << 294 */
58980     { { 0x2b908f693c1f524fL,0x59fd6ae7090970ceL,0x595e15721eb9ec29L,
58981         0xa55adbd6fbc4f04cL,0x575a2344bcc38bf8L,0x89397944f2b659b7L },
58982       { 0xc77532a18c87fe8bL,0xa5a75677de4c9eefL,0x2e3d873a0e4a1704L,
58983         0xe18ff4fcc4d02aa1L,0xd842074275573a79L,0x0fcb532115296dcbL } },
58984     /* 64 << 294 */
58985     { { 0xbcc88422c2ec3731L,0x78a3e4d410dc4ec2L,0x745da1ef2571d6b1L,
58986         0xf01c2921739a956eL,0xeffd8065e4bffc16L,0x6efe62a1f36fe72cL },
58987       { 0xf49e90d20f4629a4L,0xadd1dcc78ce646f4L,0xcb78b583b7240d91L,
58988         0x2e1a7c3c03f8387fL,0x16566c223200f2d9L,0x2361b14baaf80a84L } },
58989     /* 0 << 301 */
58990     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
58991       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
58992     /* 1 << 301 */
58993     { { 0x7a1a522b246dc690L,0xb563cbe14b61ab70L,0x41bb4abe3d4ac4abL,
58994         0xc52950b337f996e8L,0x01d991e679727761L,0x35de93bd978fd7d2L },
58995       { 0x86bad5e65706d336L,0x10844155e7f26c20L,0x58ffeb7705757453L,
58996         0xbb1861293939df77L,0xbfdd394a6a78ea0fL,0x907ff0546e33e1d3L } },
58997     /* 2 << 301 */
58998     { { 0xa7f295320df93b34L,0x855934f25c14df30L,0xd2f54ce9efae348cL,
58999         0x5acb931cac52758dL,0x287b3e18d22961a4L,0x42a5516d748f8fe1L },
59000       { 0x1b62b341877224caL,0xaff58db3d30a4aa7L,0xbad78dadbe8da847L,
59001         0x85fa710954f18276L,0xe2cc9d287c4bfdadL,0xbb131f762c75f237L } },
59002     /* 3 << 301 */
59003     { { 0xcdcdd7d703844670L,0x79ec59afb4a23f91L,0x5923c569c00ce5c3L,
59004         0x099c17ffc589d0c7L,0x0335eeea89fa6fe6L,0x916bcacaa4e868c4L },
59005       { 0xb7037325fb687bd5L,0x57d6bca79853b564L,0xdf3132efd5e26d28L,
59006         0x7ed994b8de919cbeL,0x12df67cd6fbbb18dL,0x516e07c06baff508L } },
59007     /* 4 << 301 */
59008     { { 0xf2ec9ef597e833e4L,0x97bdef9734ec7e41L,0x90e2b2387d2ac6e3L,
59009         0xcf682b120318a3b7L,0x7fe76089ea84a7a0L,0x85c489f916546d05L },
59010       { 0xf987118f6abdda05L,0x675cf998aa4b95fcL,0x544c7774888a7e8cL,
59011         0xbd2647ba63ec5831L,0xb479cea3fd2fe985L,0xa042134528d163e8L } },
59012     /* 5 << 301 */
59013     { { 0xd93506a4e5947c6fL,0x4340d76a39b81d08L,0x741aee5917930d30L,
59014         0xfea3d99a18fdb81cL,0x1088ff6b289bcb07L,0xc6b45602b7c082c6L },
59015       { 0x50e2baab453d8d69L,0xda9bf561e893e183L,0x0af25f86b29a284dL,
59016         0x0e92e67473e01380L,0xe173a0e32be00e59L,0x402d2f3dada8954aL } },
59017     /* 6 << 301 */
59018     { { 0xca9cb3890399721dL,0x03ad9f4aa3291479L,0xd85b5df56dee003dL,
59019         0xe1fa7b0264a4f83aL,0x01c4cbfdb73f7324L,0x707010d45cf2ddf4L },
59020       { 0x3c6df430b12e02f8L,0x921a290185531489L,0x302fc77c91d1022cL,
59021         0xc3733ec0342d8f3fL,0xb83bc75f6195a665L,0x4a14b9e7a79f8027L } },
59022     /* 7 << 301 */
59023     { { 0x9f0e5428e2a57359L,0xc690a3c714998c16L,0xd73c3ca2de37e07eL,
59024         0x2ddf91b8dba0bc0dL,0x69d834b27570ae71L,0x2ac8bed4735195a6L },
59025       { 0xcd8c51ff3b1fcc5cL,0x7aa8cf4e1ba6863fL,0xebb69e72ae70f428L,
59026         0xa29409dfaa9e936dL,0x43f6ee805a332b9bL,0x0de49efac2eab0a9L } },
59027     /* 8 << 301 */
59028     { { 0x04baa1762310333eL,0xdc75e35f7b9bad46L,0xc4a6031dc6cd6108L,
59029         0xba2534d030bf87a5L,0x7ebc6e2131e497ccL,0x8a2a82b4851fd665L },
59030       { 0x9ecae0116d5faf40L,0xfa3a6d7f96956ecbL,0x39e8a9c22fa52782L,
59031         0x74c93801236d442eL,0x8b21ba23b1c289ceL,0x7f3e221b25c769cfL } },
59032     /* 9 << 301 */
59033     { { 0xed800e4d08aa4dfdL,0xf524b107d8105bc7L,0x8c4addc9ab07fc03L,
59034         0x2b0f038d26a71b4cL,0x5055c471a83d19a7L,0xc6c5ecba27e20a5bL },
59035       { 0xdbad26b7aaeaa017L,0x4e3abc20d2493554L,0x626310143a0c15bfL,
59036         0xbafcc06798cec55cL,0x9204e17ce6f87607L,0x8f1c10eed9302c05L } },
59037     /* 10 << 301 */
59038     { { 0x53680ce08afe59b9L,0x36a3cec75665022dL,0xb3a5091654490b50L,
59039         0x803d383f0838f0aeL,0x65531a008005ba2eL,0xb7fa6b4a1241a17dL },
59040       { 0x9aaec449b17e07bcL,0x19b7d9113d190dd0L,0x79da42457fa5e7feL,
59041         0x725bd045598ad850L,0x49f96cc45f94ee82L,0x114bbcbf03850eefL } },
59042     /* 11 << 301 */
59043     { { 0xf566a287d43a6db8L,0xffb8944b2aeb120cL,0x3e7099427e294c1aL,
59044         0xce122b126c31214eL,0xe59b280c2a21282dL,0x03916e2ba01a4fc6L },
59045       { 0x56e65da29f5e409cL,0x374d3dfe7f5c3e11L,0x150684fc13967e2cL,
59046         0xfbed4f5bdf4bc38eL,0x5973c67182e54b82L,0xcd36c873363f307bL } },
59047     /* 12 << 301 */
59048     { { 0xcb42c5617c3805d4L,0x0e74e75c3b43a8b3L,0xfd58f864369f579dL,
59049         0xf471aa774a3dfe97L,0x2e0dbb51ab37bd2fL,0xc4704487729c887bL },
59050       { 0xcb7958a9cff32948L,0x3e36de368505e71fL,0x2232fd2dd38ccfbfL,
59051         0x6f3c502042005175L,0xd1280a3e306fb63bL,0xef7abd792e368ee9L } },
59052     /* 13 << 301 */
59053     { { 0x29c5712d56ffcac3L,0x20307670e1a8e0eeL,0x676a23c26356aea0L,
59054         0xb9c17e3f432f15d5L,0x0008512e287c5705L,0x6ae2704bc5f7ccfeL },
59055       { 0x6a200db709a13b60L,0x24fb1e9241043271L,0x2e455e9741b766a2L,
59056         0xa11ff26fbe056684L,0x3cfb8a64ad9178ceL,0x5786978d5d675b79L } },
59057     /* 14 << 301 */
59058     { { 0xf4cf2c8e6070a72cL,0x0bd73aecabc3251cL,0x1af44eff17539f67L,
59059         0xec3ee99e44e8d8f7L,0xba698f6a279afdf7L,0xe871accfb771d4a1L },
59060       { 0xbf92963d8bb0f264L,0x817b1fcfb10716bdL,0xf57580786b23076dL,
59061         0x994ff3c535a994cdL,0x05d984e82604847eL,0xd728e292fc9f2e43L } },
59062     /* 15 << 301 */
59063     { { 0xa44bf023b900b696L,0x1f82fe54037bb770L,0xa6d12f820717e747L,
59064         0xf154ac51e3b83029L,0xfbd343128cf3984dL,0x7f734beaa76c72c2L },
59065       { 0x05c5b443114548b9L,0x4ce414f396af4132L,0x1474c0b79d080a7aL,
59066         0x865827c6497366a3L,0x34760c457816a0a8L,0x6da2474c15d2a176L } },
59067     /* 16 << 301 */
59068     { { 0x761e10e2ca114c4aL,0xe39d121d894301b3L,0xa0870ff43dbc6fcaL,
59069         0x97651286cbe0ba8aL,0x47d46075c0f1ff6aL,0x18669c843abeb5b6L },
59070       { 0x1234c80ead8d9309L,0x1ccbe4d51f6f97ffL,0x399a2d41d82ab780L,
59071         0x8a03afafde426e50L,0xa2bcb109ca6dde77L,0x840e13b00618f5ecL } },
59072     /* 17 << 301 */
59073     { { 0x9552a8184929f7eaL,0x514e9ce9acc61766L,0x03159a525a219015L,
59074         0x5efeebfa14eace54L,0xe8a3736f853da94dL,0x3a0f334ff45e8a32L },
59075       { 0x71ebab39c9dc65c9L,0x6ef37f49d7c24f39L,0xde3d45f8b24a9383L,
59076         0x7193bbb80c218869L,0xa1bdfd30c0f7b6beL,0x82b2c4c5c1d9206aL } },
59077     /* 18 << 301 */
59078     { { 0xf9d9b678b197099fL,0xfa8548c4c15b2bbeL,0xa36f17fbdd2817beL,
59079         0xb35597021732d1edL,0xba145100744f3955L,0x7c274633344b43a3L },
59080       { 0x9b0ee7c8686b65a5L,0x438eaf4823f0e973L,0x79a658a7288c5019L,
59081         0xf6d938c546d04413L,0xe39bf9a6a6cb9853L,0x880d5b83801b70ddL } },
59082     /* 19 << 301 */
59083     { { 0x8f23f00303825482L,0xc4a9f214a6b35023L,0xf0905573794e7de0L,
59084         0x7ff790144dd68979L,0x8d9c14942959beffL,0xdb34474f82282e48L },
59085       { 0x423bdfa281fde794L,0xfc31e3e792a8810bL,0x19d316ba8bae4eceL,
59086         0xddcf30b7159c1386L,0x997968a38e7d69dfL,0xcf67ae9aa6b21be0L } },
59087     /* 20 << 301 */
59088     { { 0x877866a3697b4dd0L,0x32a872f4e76481aeL,0x300387bad609cc04L,
59089         0xc761ae79d74566d4L,0x9fd3e5bff22e2d24L,0x363ef5bf1c46bc0dL },
59090       { 0x121b25bce299a690L,0x7932471dc2d32b7eL,0x7f89692e94bb4272L,
59091         0xaf9cc4111a3ce076L,0xaf02ea22ea02e452L,0x43154e581d19dc60L } },
59092     /* 21 << 301 */
59093     { { 0xd9389e05e25dbe97L,0x3a8689b162b3afe3L,0x4d5556467014953bL,
59094         0xd6894c42af5ba9bcL,0x4b233690b3bacaa6L,0x0fc8ad07fc191181L },
59095       { 0xcd3a1e4df0764f39L,0x18a47233d79567f1L,0xf0f9eb765f921f79L,
59096         0x7f3d814d19d12a7fL,0x5e48cc36ff33a995L,0x9589679b8960331eL } },
59097     /* 22 << 301 */
59098     { { 0xa2ff78bb477d7226L,0x3216fcc085e04a8bL,0x7c594f81e4c3c24aL,
59099         0x075eefaa029d6ef6L,0x5ae51000493ab006L,0xcdfcc6939ab165efL },
59100       { 0x50b7eee276073bfaL,0xee52d55b3b60cdb4L,0xc7f7b3af45027275L,
59101         0x01d5444ac15b2ecbL,0xdf56f8c12a61d1e1L,0xcf032e7e4992e1bcL } },
59102     /* 23 << 301 */
59103     { { 0xc8a4dfbf15b6d8d5L,0xcb34e0e4e87ff88dL,0x6dc95befa6ebbff6L,
59104         0x2a55ca1372ff2cc0L,0x3c4c0f3c6a62588fL,0xa8de444ece156917L },
59105       { 0xced7c4523e55eba1L,0xa109b7949f05820eL,0xa021717e0e6c318dL,
59106         0xa0156b8d0b308f5bL,0x3c65ab9daa6634baL,0x1666e650e2839e0eL } },
59107     /* 24 << 301 */
59108     { { 0x0d27500f9ebe3c40L,0xeb9ac1022b700fcfL,0xee7578f8610763e3L,
59109         0x6e56078f47ef08feL,0xa8d03a7f047d04c0L,0x2143606f27cc8aa3L },
59110       { 0x6b08eb383b004721L,0x1f505c0dc4e36bb6L,0x6f9b869ae3f10ba9L,
59111         0x3bfb9833e500e846L,0x6d975557b9171b1aL,0x7af9cf4f18fa0045L } },
59112     /* 25 << 301 */
59113     { { 0x35bfb51b3b35836dL,0xc834e59003b0fba6L,0xbe6e17d378937ce0L,
59114         0x2f796f7c4daa9aa8L,0xd7896a0ad310eba9L,0xda258ab05ea4056aL },
59115       { 0x2d872d2170626628L,0xc9b26d7c2ee433f0L,0xb176220ee72f7491L,
59116         0x4869adcd895e9b52L,0xd37540e4d3a6d786L,0x024aff303a86b44bL } },
59117     /* 26 << 301 */
59118     { { 0x5e78606bd8424b90L,0xc83a5af9ebc9c9fdL,0x8d5b63740b65ada7L,
59119         0x4d01d6a221fca70fL,0x8ed7787ba1838061L,0x29901318f4a1716eL },
59120       { 0xc4d260527f25fd2dL,0xa66dc0a98b5147e0L,0x4355e26c269d726fL,
59121         0x1284fecce3a27644L,0xc9aa6cf7f98e1d0aL,0xa25ac1be3ff560c9L } },
59122     /* 27 << 301 */
59123     { { 0x5bbb87ded64d103eL,0xcb53a2f24d20fb37L,0xf8a9c2993a46b892L,
59124         0xb552910ca793aa9dL,0xd09e5bea51ef0806L,0xb57a0568e0c3817fL },
59125       { 0x9ca67c5f4e85598fL,0x04f6361fb0336008L,0xf028231b580afa5aL,
59126         0x8d938c0ef2bba03cL,0xa5984c1f894f37d3L,0x62ead7f4af695ac5L } },
59127     /* 28 << 301 */
59128     { { 0xf897de9213a48775L,0x505e21681b0041bbL,0x9f5533aad598ebb7L,
59129         0xd552ae1e1e87b2fbL,0xbb35a6319b736f5aL,0x391ce7dcc3a4c54aL },
59130       { 0x4c677d87f90124d6L,0x2ceebe51a9292210L,0x8882ae3133c63951L,
59131         0x8222c6482d44c9d0L,0xb97511420d607658L,0x3a999028b85f5997L } },
59132     /* 29 << 301 */
59133     { { 0x7b23f424eabb3f68L,0xa622a3ba4294750eL,0xb382b118e535b446L,
59134         0x7dbab9ee5fab292cL,0xcfabbfb037fe2f8eL,0x2283d7606670925bL },
59135       { 0xd18e90715be9d07fL,0xe191daa7d257745dL,0x86d59808df915e35L,
59136         0x87f68d5987370b6bL,0x76b9d255f945ac1eL,0xdcf9e8f2dc94ddbdL } },
59137     /* 30 << 301 */
59138     { { 0x004f1db65b986506L,0x5da683c32b0d22acL,0xf2afd1d85ee0c71aL,
59139         0x3b99a78a8f2ad25bL,0x8145d2ffd1c0cb69L,0x4511dc4e4009a536L },
59140       { 0x5539e8b8a5cb0c13L,0x4f8fd0186aae4603L,0x15dde4476d2365f3L,
59141         0x7cb887f7380df270L,0x815343a6a741b88aL,0x81a085e4bf99e7e1L } },
59142     /* 31 << 301 */
59143     { { 0x37d0460fd647fbd6L,0x2ccc7b01b9541f89L,0xec0e8826877a1b2fL,
59144         0x54d9e611cd462979L,0x016e8458453dcce6L,0x99b5dbed20ea6a24L },
59145       { 0x64072ec778550386L,0x279fbd9959d02307L,0x7f2ca27e9183bfebL,
59146         0xa191d6e8bb5132f5L,0x2b9f6163ba49ee68L,0x5a58a11fa3ee1672L } },
59147     /* 32 << 301 */
59148     { { 0x15d47e52ec645a62L,0xabe0ddb38d6d4423L,0x51226a3070cddb11L,
59149         0x63a253d32b5a8db7L,0xe8be4d1fbef37d65L,0x41e625d9c0920b91L },
59150       { 0x08b713a8d9d040ecL,0x467fb08dc450cdbaL,0xa8975877917ee393L,
59151         0x294792e91528cd12L,0x4512dc8c37daf6aaL,0xa83becc9197a99b9L } },
59152     /* 33 << 301 */
59153     { { 0x1b7bfdb118815b20L,0x1aa602e8629b81b9L,0x11e6df9d199aa5abL,
59154         0x1a521728bef9296aL,0xeba3e03b89e127e7L,0x6e69893553dffcf2L },
59155       { 0x24355785101615e1L,0x126b4c5282e42593L,0xe344ddd85c23144bL,
59156         0xc73a49b3746c0ca2L,0x1ec2432be6f63f9bL,0x6080ba870243120bL } },
59157     /* 34 << 301 */
59158     { { 0x6ab2936a4c3e946aL,0x8de2e0ae3ab052f0L,0xcaf8c35eea109739L,
59159         0x21d69383032418c8L,0xefab535ae7ee60faL,0x1a3a1be794b44fabL },
59160       { 0x0842aaa5eb911cbbL,0x789c2b7e0286862dL,0x8bff708715c0b148L,
59161         0x71100d79d8d7faf7L,0x47caa89a6dfa0c8fL,0x82385cf44b546332L } },
59162     /* 35 << 301 */
59163     { { 0x4f5d8c35e4b814fbL,0xe534b7be6a427f92L,0x468fb2819ca1d37aL,
59164         0x8c1c86347949961cL,0xf9d00305db0f7f19L,0x77534b3a976f7102L },
59165       { 0x94ecb7933f530710L,0x072f6fc7a916827aL,0x9247acdecc926f8eL,
59166         0x0d4a8997281d0a50L,0x659712669f353507L,0xd4730a15fde80a6bL } },
59167     /* 36 << 301 */
59168     { { 0xde68ca25bd37b630L,0xcfa9d32ca899d623L,0xaaeab905937c9ba8L,
59169         0xcb261334348ed39dL,0x8d12531fc77e1512L,0xfb7934b6213b63d1L },
59170       { 0xc6a6fb0096a13f19L,0xe940f3aac8f88d6aL,0x014c7f95c3d2829dL,
59171         0xc33d87e9fff01f41L,0xbf9c3c23c5cdcb4bL,0x8b8c0afe5d5be5c1L } },
59172     /* 37 << 301 */
59173     { { 0xe4f84bf12aac2c23L,0x5bde1744f823f90fL,0x65ffefbc02d5bbe2L,
59174         0x385aff9332a3b756L,0x3813f2b362abfdacL,0xbbb444cb0a144325L },
59175       { 0x0cf9d137ec625be1L,0x86b8fcd4c143816bL,0x03f7a9d060ac32d8L,
59176         0x0428daf9366165b6L,0x6ef94260d2a806d0L,0x94a100a598134bb5L } },
59177     /* 38 << 301 */
59178     { { 0x4b68325ca4a34cb5L,0x74f41f7639fada89L,0x34bf397236e593e7L,
59179         0x0cc75d461c6179c4L,0xe62d5ba577d711e5L,0x7bec1be7876964c7L },
59180       { 0x768f35d13809fc73L,0xfe55a9a57dcf1703L,0x86405336e69d3390L,
59181         0x68f5ea2d00bfc544L,0xd4cf822b4834b2d8L,0x77dc1ac22b0d3ad6L } },
59182     /* 39 << 301 */
59183     { { 0x45603dfa0337f57aL,0x50623184344b6968L,0x3fb9957ef160d9aaL,
59184         0x40eef1697c8db44fL,0xa8f394e98bf71121L,0xa55ecf3b86a920f5L },
59185       { 0x1f3c1f22bb0822e6L,0xb3c2f21357747a3eL,0xfbdb4465bef56f08L,
59186         0xa9844890a46ac73fL,0x3fd564a5bde3652aL,0x008cc1a97c653c82L } },
59187     /* 40 << 301 */
59188     { { 0xcfebe027ca0a98d5L,0x946b0d9aa8914697L,0x00f89d16725ebd08L,
59189         0x94c6f2b07a584e8dL,0x095ac9cc911cab58L,0xfc9c3b499c4073c8L },
59190       { 0x265919b0c7233aa8L,0xe6c0c7f474be5217L,0x6db597f1815a70a9L,
59191         0xdd9e4a101c5fd35aL,0x38b8e35112d52a8bL,0x5d0ed83f2ef20fabL } },
59192     /* 41 << 301 */
59193     { { 0x4f47e10a6c96b43eL,0xe406ab39f3d744deL,0x1caf45d83c893b01L,
59194         0x4f089452a7582ea6L,0xc02f58cd62b5a868L,0xf6532017c2a9aa7bL },
59195       { 0xf0d8bf6f32b01bf2L,0xfeec5f68a97246f3L,0xb2ead70a1aa7c238L,
59196         0x1a1d6f77ad83e05aL,0x4b7110533dca7e9aL,0x44a89fb85f96e5adL } },
59197     /* 42 << 301 */
59198     { { 0x86a7ebe0f02461f3L,0x6a7a9cc6862282c9L,0x7f8857944a97e48bL,
59199         0x191244cd20662db2L,0x8d85175183489311L,0xfbcb17b0f934c1fdL },
59200       { 0x33b4d86e032a7bb3L,0xa99864cb573f5c28L,0x49fe8e799c4f12cbL,
59201         0xe34c32e32c8bb49cL,0x5888421e962d6d9bL,0xa317c2d1bf1be44dL } },
59202     /* 43 << 301 */
59203     { { 0x3454c424cc1dcbbfL,0x67e61434aac98717L,0xfecd8125cc2d3044L,
59204         0x2032be70df7f8891L,0x04c5a0c81028059cL,0x6563dc8c76ade6b7L },
59205       { 0x9ff3815192f460aeL,0x8c2c3c632d54785dL,0x1fa99d8e43eabf60L,
59206         0xd75d9559383be317L,0xc9ef068e3dfc908eL,0x2217c8c1959d3e6cL } },
59207     /* 44 << 301 */
59208     { { 0x5828d71bf2e5f345L,0x8b756075929fe375L,0xca625ec12c43a6d1L,
59209         0x08cd01f53b31e127L,0x56c622619cfc1be2L,0x093ea207b3a6caeaL },
59210       { 0xdf53b20970b42dc9L,0x2d2dfdf2235f4aa0L,0xcaac3b3598786c94L,
59211         0x1ce1f893b4998150L,0x40341c41526a98bdL,0xef39e97eedce5288L } },
59212     /* 45 << 301 */
59213     { { 0x08cd60d461ea4256L,0x8031748b9461f861L,0x9c96e1f9019c7908L,
59214         0x7e6e08f4e46bcf7dL,0x8e8408f123ffa986L,0x0bee857ed467288bL },
59215       { 0x702fa8536e36fcceL,0x3bb25fa905a89edeL,0x642105f4e96866ceL,
59216         0x6a5207cc16e37536L,0xcb6a96d1372a3e06L,0xb1c7c85a1da6bc6dL } },
59217     /* 46 << 301 */
59218     { { 0x0bb97497a97a3316L,0x9416659ce402a800L,0x79656970503a2314L,
59219         0x0070a7eef8007c50L,0x8093cd4372624892L,0x4c0ee444f9b96830L },
59220       { 0xc7c10b9fe300c49bL,0x97f5f90a5f7baf99L,0xf04a5a7cfaa064deL,
59221         0xd5b01fa6b0c111fcL,0x4d12d6fb65d8a2b7L,0x807a381c27770e2fL } },
59222     /* 47 << 301 */
59223     { { 0xcd1aeeb43b6a9c22L,0x7fbdc6c19d71dcd0L,0x9bb43b6e6221669eL,
59224         0x1b76f2bf526f8a00L,0xaeba54302efdf661L,0xe1f623e745537bbdL },
59225       { 0x340966ae067c5f4aL,0xe2cdb27e4799b2aeL,0x9aeec5989b8458e0L,
59226         0x1d0588487655b632L,0xa5ffe5897abd70b1L,0x84db43db6721054eL } },
59227     /* 48 << 301 */
59228     { { 0x3b21dc1f538d92d8L,0xc80b22b3c005aa86L,0xf536e5d30da87d65L,
59229         0x4ce10edf0cd999a0L,0x8949181450e08f5dL,0x77fd8f2e526647e6L },
59230       { 0xcb207ee9250099fdL,0x03c7d1abfd6aa078L,0x7d4940d225e0cf15L,
59231         0xb688b311067fa052L,0x89308326a98b2e21L,0x3ee4cc2b72311eabL } },
59232     /* 49 << 301 */
59233     { { 0xec49fc4e06d255b2L,0xabd0c002fb309d28L,0x97490ff08c601c3cL,
59234         0xe17102fd58042cd6L,0x861411f11416ebc3L,0xfb31ce455c6c630cL },
59235       { 0x0a24d561c6cc5e9bL,0x80bec25c9a7c1524L,0x8003494fbe53e50dL,
59236         0xe89b75e28633c559L,0xafb1f6d6763b3360L,0x0e7e58c52bf70cd3L } },
59237     /* 50 << 301 */
59238     { { 0x72322d26aab6c9b5L,0x953e43d0070d7d08L,0xe2dd5444954645c3L,
59239         0xc5de051cb276ca86L,0x195d454439158c74L,0x26e2cf9fb90a8f97L },
59240       { 0x774baec15b217a76L,0xdba4bc63f94172baL,0x96ddaa4022e20037L,
59241         0xfe1ce4aac111af69L,0x6f6d3c428ad6dacaL,0xe59257d8376cdefeL } },
59242     /* 51 << 301 */
59243     { { 0xf2cabe73184d44ecL,0x4bf744d60bb08687L,0x10cb9e9209865d58L,
59244         0x3a63fe414ea221e0L,0x8f595e5892961becL,0x1b8ad036855d186cL },
59245       { 0x75dd5f70086542abL,0x8b357e087bddbb6bL,0x22de89f06e829a06L,
59246         0x44ca8b64ecc6cc26L,0xd02fa871a5ddebb6L,0x6adf1d0c6a60a0e3L } },
59247     /* 52 << 301 */
59248     { { 0x0102775982e4f5c3L,0xac8eac172c014fc4L,0xa0cd26e85bd843eaL,
59249         0x9b0431ec056d4b1fL,0x89df7db58eb9c55bL,0xf17f917298fc9b9eL },
59250       { 0x2cf1e4a78e6b770fL,0x0d6ef9e2b842fe52L,0x40b4ddb76c578172L,
59251         0x6630657627533b9eL,0xf8d8661eb50ce390L,0x6ceba0aa16577df7L } },
59252     /* 53 << 301 */
59253     { { 0x6dff66c19ec8ac93L,0x6261295bfdf6fe7dL,0x9ad1536fcf9fbbb2L,
59254         0x5cfa30a92a6d6d31L,0xb3bcf1b0296224dcL,0x42e4b410608371daL },
59255       { 0xd6bad6dac32945fdL,0x0fab7d1dc0c031a1L,0x054df9599b192d32L,
59256         0x29830094ea78052fL,0x8d73ffce03f2ce45L,0xc14c7012f9d840ebL } },
59257     /* 54 << 301 */
59258     { { 0xdf74522e74ce5c21L,0xf864cbac930c4b92L,0xfe0d2358eb0fbe9cL,
59259         0x10b31736a5cf765aL,0x185bbbe96a9c95c6L,0xcb14d694e5362993L },
59260       { 0x3f5c921da5332e61L,0x0820b32bd244cc98L,0xdaf09f24d7c32062L,
59261         0xb2241c9ad5959a1cL,0x16bb89a3226127ddL,0x0b46e3f03723d04dL } },
59262     /* 55 << 301 */
59263     { { 0xa38b1a796975230aL,0x25c6db8c3991b5ceL,0x0d89c3fe9c1bf52aL,
59264         0xe186e293cd8f9f8cL,0x777bb327e6ec37afL,0xa974132a0ae31c7eL },
59265       { 0xfb9918305c50f089L,0x4a653d6999497954L,0x5055c690774e8a26L,
59266         0xf94ffbae3815d67aL,0x99d74f5e74ea4481L,0x3b352a327d477151L } },
59267     /* 56 << 301 */
59268     { { 0x2a62804172fb61e9L,0xa9bfa73ab13d053fL,0x4a2cdaa3c647fcb9L,
59269         0xe1a9e91f4952d3a4L,0xbc1b3d8011e2e2c3L,0xe58ef59c18e4340eL },
59270       { 0xeb8696ff1cf859b8L,0x5b0f5cc4ee918cf4L,0xa471d6ce6c1e905cL,
59271         0x4e13d6091ed2e8cbL,0x52951509c77c8c91L,0x0926dad8e234884eL } },
59272     /* 57 << 301 */
59273     { { 0xb168a6c36e3aa3d7L,0xbd0086ea5ad9142fL,0xbc4da0293c24fe23L,
59274         0x7ed3b34808b90de6L,0x7a7a2259e33b0df9L,0x483b389c9c3a173dL },
59275       { 0x02080c626334a061L,0x61944965b020cfbeL,0xece528e9ede88ecfL,
59276         0xcdf3e2fc99389758L,0xb21470cb7a3fb92fL,0x717cfbe083937e21L } },
59277     /* 58 << 301 */
59278     { { 0xfac97f2910e3e93fL,0x1505c7d2f1101b88L,0x7cea978823bc0d11L,
59279         0x27ead95d45045667L,0x711bc4dcd17ea199L,0xe3f93fb522f3142dL },
59280       { 0x31b05e6ad7233d64L,0xac28e6c154e7c9d5L,0x892b6366716d273cL,
59281         0x1622230470da8a48L,0xc85bbe6070d560b3L,0x555e6de987fd38a0L } },
59282     /* 59 << 301 */
59283     { { 0xac593f746ed50680L,0x89bdeabbcb01cfd3L,0xfa43158ead35524dL,
59284         0xb2393726e8d66ca0L,0x248c67c2c36bb495L,0x27d4b0b85c933625L },
59285       { 0xdbb1364a78c8bb4bL,0xdcf4b1e13486ef0eL,0x554f95cec498b2c9L,
59286         0x2b76da29811a2329L,0x750c10271a10d941L,0x07045eae375b01b6L } },
59287     /* 60 << 301 */
59288     { { 0xd3fb9bef82621500L,0x09b18748f0f647a6L,0x186bed054c357e73L,
59289         0xd58281f0a85f3174L,0xdcf2e0bb91ded0e9L,0xe77faad126894faaL },
59290       { 0x6843c160bc3a3c4bL,0x7f8058944c76592dL,0xc53be0883ec05e95L,
59291         0x318d8ce7cce0c822L,0x6d615f1b4c761dbaL,0x0115824c46ff47e0L } },
59292     /* 61 << 301 */
59293     { { 0x1815391cf8d0b74bL,0x903ad8fd797625dfL,0xad1ca24d3983100eL,
59294         0x0883fd415572ff15L,0x0e9e572cadeb4e56L,0x800bad6f7d0e25c4L },
59295       { 0x52a394b44c7e2f03L,0x5150c01398f2c416L,0xf4ab35c68ce503c4L,
59296         0xa0ad209a41b4beeeL,0x050c52c80189706fL,0x86780a924049e913L } },
59297     /* 62 << 301 */
59298     { { 0xa398529c74ded2a1L,0x5e7248f52d7ea6e5L,0xbeb250bc28c2225aL,
59299         0xf7068fc0b40f4843L,0x62098aed839b7290L,0x947087e293ddfec4L },
59300       { 0x81ba8c8824d71004L,0xa877f443bf4813c2L,0x3cf5f473ca4751bcL,
59301         0x2533890e633cc635L,0xb358f7781e6d9465L,0x50693deaa7801dc7L } },
59302     /* 63 << 301 */
59303     { { 0xaf306f56cbebedf6L,0xdd733be7837acb84L,0xc767237afcff0b9bL,
59304         0xdf948f12e555bee9L,0x86b85657826dc76dL,0xa4bac032e702b1c0L },
59305       { 0xdf3544bba81bb117L,0x69c20dff34f4f0aaL,0x846b78577050d98dL,
59306         0xde0ef0403c70120cL,0x4483872c12c3bd64L,0x870b758550acebacL } },
59307     /* 64 << 301 */
59308     { { 0x37be5d3f68d7dfcfL,0x97bdbd49b945e6f2L,0x165a24b59d1569e7L,
59309         0x254aaf59b4e293abL,0x3c751fbd6fb7c0a4L,0x14eda4ba5018cb18L },
59310       { 0xacb3b8971b5f6aedL,0x6d10be441e4b6b78L,0x245d7258621df6d7L,
59311         0x2af0e283185f0e2aL,0x1e7edc818fddbd81L,0xbd1e6c72c538d02aL } },
59312     /* 0 << 308 */
59313     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
59314       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
59315     /* 1 << 308 */
59316     { { 0x6858b674844626a2L,0x610cd40f0cbba6a6L,0x324e674e29d9194dL,
59317         0x2dc6fdf6dcb30a51L,0x3f3ecb77528aa549L,0x0721f8f923ffaa92L },
59318       { 0xd8efcbd627a77538L,0xf4e642bfd6162c9cL,0x04f2b0b74cf4a16fL,
59319         0xbc0bb49fbbf335fdL,0xc6b6e5bd5a928c36L,0x981b01f4d893dd45L } },
59320     /* 2 << 308 */
59321     { { 0xfb083c2af810465bL,0xb66a8de902ce0deeL,0x6e4130e747a81b95L,
59322         0xcd704dc658a98737L,0x842ae329592829c9L,0x99bedc34be20dd63L },
59323       { 0xabee8e55d53b2df4L,0x6ce657586010b37cL,0x781f39b2467112b9L,
59324         0x6f06058fbe341038L,0x5effdca512a2f8beL,0xaa9bdad7af34466eL } },
59325     /* 3 << 308 */
59326     { { 0x3933b4c1575782aaL,0x610d3ba25c66e501L,0x52fd3c0f0b7e019dL,
59327         0x7f8e5ddfa48715d6L,0x0879c5defa39be53L,0xe32c886c56f01cdcL },
59328       { 0x71b2dcbb1726779cL,0x6caaff052c6aa84cL,0x6af94846640b2d74L,
59329         0x78a10710049a2cbeL,0x41a1ce67ac2ab0f1L,0xd160b7faa76d8438L } },
59330     /* 4 << 308 */
59331     { { 0xab86639e9c216137L,0x45a12fb882b18d64L,0xb5734418d763f0bbL,
59332         0xd2cc332211a9802cL,0xe41d7db881269b8aL,0x91072fc12ecfa355L },
59333       { 0x59d6912504ce306fL,0x916d9d4da131b86dL,0x84478b6b8a739738L,
59334         0xe86ad7d91cc83ae3L,0xbc9b2084797ccd97L,0xc1e94af4694944c6L } },
59335     /* 5 << 308 */
59336     { { 0xbbb6725b5c82c857L,0x72c66c3f140b561eL,0xab65dd0664bcb2d5L,
59337         0x755e848a780d5c1bL,0x84e6f686a3a61e6eL,0xd84bf486bd100b4bL },
59338       { 0xb34fdf846354e899L,0xcbc312da55ec5654L,0x3c2cc881f9a125f0L,
59339         0xb1fcce564aeadf8eL,0xbdfc54c0c46bf0c2L,0x11d7ea4f09d281beL } },
59340     /* 6 << 308 */
59341     { { 0xe1aa844b1601940eL,0xd22221821797e84fL,0x3025aba65ddcb5d1L,
59342         0xac8cdaba38009c6aL,0xb9ee07b46e261ee5L,0x84069bc106ab8430L },
59343       { 0x7a36b46278b9b112L,0x2d91ed2c08e77879L,0xae4ef469341275a1L,
59344         0xf7cb393f1c7cf858L,0x83c00eafd192af3dL,0xa81697a7a1e15176L } },
59345     /* 7 << 308 */
59346     { { 0x687d0980f9bfd795L,0x9a7539377ad882bcL,0x641407fabbcde5b3L,
59347         0x12ec9d216ed103a5L,0xf858c7851fa6ee22L,0x329b61bc818f2c11L },
59348       { 0x4720d42ad9d48b30L,0x3f61c66082a66766L,0x99aff25533723e4eL,
59349         0xd6c67ce3d3260b62L,0x63a6fc9d86391c33L,0xc002433a31de2381L } },
59350     /* 8 << 308 */
59351     { { 0x585edee3895c0318L,0x775e142f45e8205bL,0x3bd7924fd85ad31fL,
59352         0x2e7d8f919124bffaL,0x885397c044c62868L,0xc0c2dff47fda9f5dL },
59353       { 0xd302582ec14e693dL,0x53d6e33a6cec31baL,0xb0216b5b63653c06L,
59354         0x8f08a1ad9c70dad4L,0xccf014aaffbba93dL,0x900b0d2ca33f12b7L } },
59355     /* 9 << 308 */
59356     { { 0x4960ccb6e9824c45L,0x3c5a9b74c7e4cd06L,0x1e78cdfe37cfec62L,
59357         0x8cd49ca80da56a05L,0x5ba51217dca05707L,0x0d1f6e459d66c960L },
59358       { 0x7178089467f9c82bL,0x342e4a5b18974c55L,0x16263f18f9b32fdaL,
59359         0x844b5a02935b3636L,0x9c5abd51c139ea58L,0xf54c69428beef953L } },
59360     /* 10 << 308 */
59361     { { 0xbe51552d6d2dedd1L,0x6bc86dc1cd997093L,0xc9b600c4418f03b8L,
59362         0x4ea4e857e7a9208aL,0x7aac3d96883b639bL,0x4127ed0735d2f4bfL },
59363       { 0xf5f6310d76bd792aL,0x3da9b6a5fa223d0cL,0xd75f88075a041b79L,
59364         0xf3261457e4dd58f6L,0x4f0f5b18b0d9a51bL,0xf5aeedc1b8c84f9fL } },
59365     /* 11 << 308 */
59366     { { 0x1e08d6a81375620eL,0xed9a4fbae1f62c24L,0x0d3bb90381ab5de2L,
59367         0x885781f0df1b6a13L,0xc3fb9f97e1c7de7eL,0xf12e4bcf9372b033L },
59368       { 0x9bc3cf4dd5868448L,0x89465649552016adL,0xeea40cf92a8b2c23L,
59369         0x57d720ee3af98886L,0x97b14c0b72db853dL,0x65d10f42f23504deL } },
59370     /* 12 << 308 */
59371     { { 0x0dd2395e9b8cfa41L,0x50e203abd4f92a44L,0x7280aff16630023bL,
59372         0xfcce59dc07de820eL,0xa686be05bc8189adL,0xac4b59bfaac70b7eL },
59373       { 0xd2c0070e7a3c71acL,0x1d550add35ac1c47L,0xd42b6389fb881c1bL,
59374         0x57ca3fccd0dafd42L,0x909e8284be26ccc9L,0x1abe7595a002235cL } },
59375     /* 13 << 308 */
59376     { { 0x02562f1c6b1878daL,0x52a2cd069fce0ee6L,0xf25b35bdeb16199aL,
59377         0x0320c326a75fb01eL,0x2006d7587de2d46aL,0x6f9d0e256842b459L },
59378       { 0x70a89562a68b5482L,0x9653726e1ab35865L,0xbda3cebbd8f849adL,
59379         0xe2f8d9e60b6fc51dL,0x9c3fd51246104400L,0xbbd260c9bab5d34eL } },
59380     /* 14 << 308 */
59381     { { 0x1f5094703cbc1df1L,0x9f752a663f962634L,0x98089d2ca2435048L,
59382         0x05256acb0e755318L,0x91a21f707f3845f4L,0x473ac1e0d68c8fcfL },
59383       { 0x57ee51417f2ff0c9L,0x959a84f32013c48bL,0xe701f13c4c111ee5L,
59384         0x70219eee86db5763L,0x385f890cdb0782e5L,0x81fb64b2fea04d2eL } },
59385     /* 15 << 308 */
59386     { { 0x61b4bf7eeaa07bd9L,0x49832879afe544c0L,0xf788e97f54eb4d80L,
59387         0x78351b41338af327L,0x3a631bba77cb8057L,0xeb9a6f23f218e4ceL },
59388       { 0xbd4a0dcf025b6453L,0x2aad6a467b876222L,0xaee94361215c42cfL,
59389         0xf8d1fd5de496cddeL,0x3c3af08022d0fe06L,0xb3d5dde0d09cc3f7L } },
59390     /* 16 << 308 */
59391     { { 0x1e34781aa6a1913dL,0x9a8f32287d0adc38L,0xfc185ccc28af85baL,
59392         0xc923d78b3ae9ba11L,0x7d494d7ea7bdb313L,0xf774dfa5af8f8b87L },
59393       { 0xc178ccc116e863b8L,0x2d472f2aa8899691L,0x608747cc80a50372L,
59394         0x8147aa90e6f90197L,0x4683d4c978c2f216L,0x8323652c552f3b51L } },
59395     /* 17 << 308 */
59396     { { 0x7d6bff984dc9149fL,0x79879e1f499b443dL,0xf4ec65232aff2a1dL,
59397         0x6cf3c97f27253aa1L,0x95b9471eefe6f72cL,0x3959bd816c8457daL },
59398       { 0xe2870635cf112073L,0x84e44933ec12174fL,0x67a592deedf434edL,
59399         0x0c93cdae2897d0e0L,0xe344ecf463c89730L,0x28098b7567a1133fL } },
59400     /* 18 << 308 */
59401     { { 0x62e96dc7a12a0cd8L,0x09d7c6f0f02a3d87L,0x9d9fd51233f8929dL,
59402         0x1231952dab376555L,0x6ef6823c8e3d2d63L,0x7ad2e5405a01c12fL },
59403       { 0xd1bfaec479af6fc8L,0x4555fedfdad97daeL,0x0e6d3f0155750bdeL,
59404         0xd37ed9f0056f6128L,0xf1fdf91c65fe6ff7L,0x3ece19ae92d05e43L } },
59405     /* 19 << 308 */
59406     { { 0x07d2075e750fc5d0L,0xdc2b03f6a07ca45cL,0x0248d87552efef7fL,
59407         0x2dfdaf3f744e727eL,0xbef861b8d9b2bcacL,0x5e6363f0baf394c7L },
59408       { 0xe8f23bbec973934cL,0xb43d619a50ea324dL,0x2bd5e0075842d6cfL,
59409         0x5c5af62217646e90L,0x5d95d8fd222ec05eL,0xc9adabb45bd67c31L } },
59410     /* 20 << 308 */
59411     { { 0xa5c08e8bcc2c9a2aL,0x70e1b4058baaf0fcL,0xf29e1e5c9e36e50cL,
59412         0xa3d9080080f258c5L,0xc9ceac25ecad4498L,0xcb73130fca32f3feL },
59413       { 0x2dbe620c48b3863dL,0x8c52727f14ff53bfL,0xb60b22a86b45e9b8L,
59414         0x81e05bc0f6483c5dL,0x217caa6bcd542972L,0xffab716afa780778L } },
59415     /* 21 << 308 */
59416     { { 0xaef1278b0ba5a344L,0x253be7ad2d0c3947L,0xce58bf0fe5408f09L,
59417         0x867b0d6fe21228f4L,0x815abb5dca61e691L,0x0da28f58f3e94434L },
59418       { 0x5b0fd178ca4cee2bL,0x8989604240b13224L,0x8e2fe19616c251a7L,
59419         0x7b3381cb11b17162L,0xc73d96a427ef2c0dL,0x76b7fcf36899c135L } },
59420     /* 22 << 308 */
59421     { { 0xcaee3387cad8b585L,0x58446c1ad59d8777L,0xb8755fa540888d8cL,
59422         0x7868510654428813L,0x7bd21629136e2b59L,0x249903a6998254a3L },
59423       { 0x2cc73a751f8fd813L,0x4b1a64576d4f3a70L,0xea2aa620b2e7a0fbL,
59424         0x77c8cb98202f6ddcL,0x68ba9d261e3851cfL,0x936fe8cbfe02e6efL } },
59425     /* 23 << 308 */
59426     { { 0x8b84121bda75aba3L,0x4440272d74602c33L,0xb8110b2a1e8a8ab0L,
59427         0x4de462e9391cf47dL,0x9173d756519b9ab4L,0x3df52d13ba8d5dc7L },
59428       { 0xd7a822eaa418b01fL,0x58be2b076585f7d8L,0xaa814fde00fb449fL,
59429         0x6b8260fc7da43c5dL,0xaecbfb442351ba9cL,0x9cbe3d199f8db60aL } },
59430     /* 24 << 308 */
59431     { { 0xe5d3e0d80d7410d6L,0xcfa9ed742be432c9L,0x60044434a85a0686L,
59432         0x93b357166ad6918aL,0x1a3c3e6d051762beL,0x80813589b0ab32d6L },
59433       { 0x64214b92aad403fdL,0x684befc14d3fb746L,0xaca5a51479515046L,
59434         0xacdba03472e84485L,0x61aa2834287d9e97L,0x07a515a5cad222e7L } },
59435     /* 25 << 308 */
59436     { { 0x8f631b17bc04e9c5L,0x017527212c515161L,0x4358d8e9ee7769a5L,
59437         0x18f0aed0b59dba1bL,0x035c6bb644973218L,0xa49a4cbcfb3897e6L },
59438       { 0xd2a0b7505841ab18L,0x8fe952dca6d2d43dL,0x2d30add69a71d0ecL,
59439         0x0cb84c402c5d440aL,0x33f3cf7c7c47846bL,0x88703c65bc8e8b3dL } },
59440     /* 26 << 308 */
59441     { { 0x3c3db9419474059cL,0xcfbf13ad72820ae8L,0x3f84300c51c37d62L,
59442         0x0f78adc45529d333L,0xa19be46482e34cfcL,0x9ed07ee011c98376L },
59443       { 0x5113e660b5b6f6beL,0x56f2d2b37a5bc818L,0xd99290c61c2c822cL,
59444         0x39c026b8b27aafceL,0x8692150b12ef7c76L,0xa55426d1c6de9e16L } },
59445     /* 27 << 308 */
59446     { { 0x889aa8ee3465358fL,0x5885ee29afbefa70L,0x05f9dbd290b6ff58L,
59447         0xc74be0d09b5e02afL,0x4b7da27ea6b29d44L,0x2ad60aefcf68eeddL },
59448       { 0x2ba942b3388c81c5L,0xda8badcc368e2e62L,0x33e95ac87a9e8511L,
59449         0x37453bbae72008b3L,0x3e1f181195eceea0L,0x719f550c7b19a417L } },
59450     /* 28 << 308 */
59451     { { 0xb03093068af19670L,0xd784125a34c6bf0fL,0x0b425ee0255a8396L,
59452         0x91076433fb541162L,0xc4d8188586f47a0eL,0x3b767d54fd7bc7c1L },
59453       { 0x98b405d3bee196e9L,0x4ef9c511edaccf4aL,0x5a6deb6503f4f1a6L,
59454         0x4a22ca641b4c5104L,0x2cce36679145ce41L,0xd05187523206810dL } },
59455     /* 29 << 308 */
59456     { { 0xa5746e07f7e11342L,0xb50e390f2e2ddca0L,0x3847749bcb288bc2L,
59457         0x6ff43ec646ee679bL,0x343b3fe2c5257b02L,0xc0f57f509b823eb7L },
59458       { 0x5ce3d2c8aff42c7dL,0x984c9b99c3c76f3fL,0xc8559f58b8823b92L,
59459         0x883ac8064ce4338cL,0xecf8aac3389d8ebbL,0x9edaec10b40bfb16L } },
59460     /* 30 << 308 */
59461     { { 0x0ed8a07cafb04e5eL,0x7e95ed898f6bc911L,0x6a4ed37113dcc222L,
59462         0x9aa3a43296f07c7dL,0xe819a80b9b338e4dL,0x65fc2778278f53b5L },
59463       { 0x788408e9024163b3L,0x159de8bb7de54f06L,0xc953e21281239dccL,
59464         0xacb5ea2c6dd62ce9L,0xf56ac93b753f4ab3L,0x2a1a09b5eacc39a6L } },
59465     /* 31 << 308 */
59466     { { 0x89dcbf021c5f4cb9L,0xc0fbe7ce210f98ffL,0x3dc3c743b897cdf2L,
59467         0x931f9dbb5d02c43fL,0x0ea9f164f74db981L,0x504938874af9f53aL },
59468       { 0x86bd3ed62531b8aaL,0xcc1fb6dddcfca2a3L,0x24b0cbf2b97abaa9L,
59469         0xd81ad35c9073f19eL,0x4dde5dc05db7fd5cL,0xce410880e3ac9b63L } },
59470     /* 32 << 308 */
59471     { { 0x29d81538037bebadL,0x76e52c73d9e0b78cL,0xaa4ace6e8783d1fdL,
59472         0x9c14ebddf0e3c126L,0x0eb1c08d6eca4b71L,0xd10c6b961c91df35L },
59473       { 0xdb8119bbe81bb84aL,0xf784d3c117e3ceefL,0x053c916835436f81L,
59474         0xeb41ccbb9b18d212L,0x93b3fb43b1bc3497L,0xd85a7c758c1ced81L } },
59475     /* 33 << 308 */
59476     { { 0x90b606b2fc9958e6L,0xd39965b6f94234b9L,0xf4a86f1676f4dd03L,
59477         0xd6a7ba54470f0f7aL,0xa1b85c0ca86fce7fL,0x2b50f14e574c4cfdL },
59478       { 0x4aff867d80e783bcL,0x031092eb61f78fc4L,0x8ad0d7486fe0af1fL,
59479         0xb56b1a1a0cdfa574L,0x586c916a56466e12L,0x427e5946d09a9d1bL } },
59480     /* 34 << 308 */
59481     { { 0xdd0e3ca276d1b2e5L,0x07dea7e48b4cb3a6L,0x62a63cc7fc4a0f0aL,
59482         0x048478ef5ea2eccfL,0xa77eae472e34c1a9L,0x7a2120751bfa5dc6L },
59483       { 0x0c1fbbecabc233ffL,0x6255fd91dee18d7fL,0xd6da39aec38462ebL,
59484         0xd86bc3194be435f9L,0x23567d64291c606fL,0x6b85038af67051adL } },
59485     /* 35 << 308 */
59486     { { 0xbe79e1b1eef4ae7cL,0xa45668dc42fb7357L,0xcdb3b3ee2d497a36L,
59487         0x6ef724e6c5f8d861L,0x7e8834523802a324L,0x641b3a81aba90442L },
59488       { 0x13bec555ae4c2544L,0x340d34f927d172ceL,0xfcfd933bd92f558cL,
59489         0x57d8e300d5a669bdL,0x9f745ce71883049bL,0x19690a31e261f9ceL } },
59490     /* 36 << 308 */
59491     { { 0x004105c3811af84aL,0x01307934a7934a0fL,0x179fd49b9b3226a1L,
59492         0x195d9e5cde6834b4L,0xfbb79dc00e6051bdL,0x354273ed367f4487L },
59493       { 0x4afa9d4574fb892dL,0x03ae905ea1b7f3bbL,0xea32cd5d592f6122L,
59494         0xa758eed2f1103301L,0x9dde4238c59d1cc8L,0xe2760bcc51022a42L } },
59495     /* 37 << 308 */
59496     { { 0xfed7077b7a7134a8L,0xe65b4eaefe0cf05aL,0x130de76be626841bL,
59497         0x499934ca300117fcL,0xce74885d4e186b5cL,0xd352d0d2029bee7bL },
59498       { 0xd86c448c857a38ecL,0x8139eb50a956da9eL,0xa036de4a93ce7131L,
59499         0x3f9eba375041c9d4L,0x8c24408e548f74fbL,0xa74053fde942bf8fL } },
59500     /* 38 << 308 */
59501     { { 0x64cb00f586ff10acL,0xd1eebc4c9cbba8d8L,0x427fad8af3157125L,
59502         0x9f8eb84cf7523b0bL,0xbdd082bf2e6dc29cL,0xfe40623823d3c315L },
59503       { 0xad5df7fb546d9dd4L,0x83cadc4b8e42f3c7L,0x7c90502c36876485L,
59504         0x4f33eccda35bb6d2L,0xdf7571383a79b9baL,0xd250b7d2e6ddafaaL } },
59505     /* 39 << 308 */
59506     { { 0xa52a7595504417a1L,0x540f70b014683af9L,0x5f0d1560f27a9620L,
59507         0xccad06444b2147c9L,0x92223275e52c8eccL,0x30d6b52b7cfedb7bL },
59508       { 0x2161f8bb9bb5b844L,0x075b9db87033586cL,0x5748d512c8c5189aL,
59509         0x95d76a950f0aab91L,0x91f85aaed0ce9c56L,0xeab8cd9b8434e695L } },
59510     /* 40 << 308 */
59511     { { 0x54f84d70d377d7b0L,0xb745d1903344bc4eL,0x1c693ed08f33aa53L,
59512         0x990ed45f8bfbee7fL,0xad620c9fe9b258fbL,0x465ccb101a54bf46L },
59513       { 0x5330a0d3ebc40951L,0x34423e8ca405da61L,0xeef1ce78b83043b6L,
59514         0x99678f22ac06d182L,0x9213f57d1802f14cL,0xf8549616adf11fdaL } },
59515     /* 41 << 308 */
59516     { { 0xc6ca95476c66fa6eL,0xcae41345bdd5b16dL,0xd72a41a4ef022783L,
59517         0x810f4615b2d5154aL,0xfddc469e6d333af9L,0x3154ccbb02d2bf38L },
59518       { 0xb33d5c59fc1a0bdfL,0xd8c3f8743c971fb3L,0x5e47ec01114e68b2L,
59519         0xa440a83fe9baa164L,0x353d01c397c26b35L,0xfaabf5dff03b7672L } },
59520     /* 42 << 308 */
59521     { { 0xdc2a97651e22de2eL,0x91eef436b6cd3b6dL,0xff099200f99ac721L,
59522         0x20faacfed4f89e8aL,0x91bb24373fcfe45cL,0xb7a152897b6d3ff6L },
59523       { 0xfee966c0ef94332aL,0x944728473c81b942L,0x831d36dfab1a553fL,
59524         0x244bc8393023cca1L,0x3f4a49d57e7be940L,0x4159aa9d7b71c0e0L } },
59525     /* 43 << 308 */
59526     { { 0xfc25fcab5b16ee64L,0x44f807e06841acd2L,0x5f43cfedf59c3f06L,
59527         0x9279c8110c5b59a7L,0x825df117194b80beL,0xe2c18880d27d6fa7L },
59528       { 0xc9aab2e66a333721L,0x1665b6f55b034c1cL,0xf28fffd13df9796cL,
59529         0x23caca87bbefb8a2L,0xfc556d575f7510f0L,0x41990ce8552dafd0L } },
59530     /* 44 << 308 */
59531     { { 0xf31796d2b6e392e1L,0x199d624893b3395eL,0xef14c7c212f9b763L,
59532         0x721ebf2143edb7a5L,0xa40b88945e96f3baL,0x8770608c4cff8394L },
59533       { 0x990c99ae8d0def0eL,0x292b26dfa15a5649L,0xa98fda2c91ca89d7L,
59534         0x916cb1b4973e5f5fL,0xa2823f13a72de0bbL,0x415f7bd28cd3219dL } },
59535     /* 45 << 308 */
59536     { { 0x5cfde16a9fc0e90fL,0x61bda4caac6c15d3L,0x5935e48e2a79d928L,
59537         0x31213c7c82f986eaL,0x170dc539bcc4c0dfL,0x2e0d29406f11823cL },
59538       { 0xd2dbecac80fe659eL,0x98b7f46b8399d8b8L,0x259f975abb204589L,
59539         0x65f3073cd5c52a46L,0x0f4c007805dc7fc4L,0x16c49d403031a8ffL } },
59540     /* 46 << 308 */
59541     { { 0x95705b15359816d5L,0xce0c4379d0641ed7L,0xb3f0d8321e8a448eL,
59542         0x8bea060873e2d711L,0x5a85fb2f6a040c03L,0x7c19a2185bcebd4aL },
59543       { 0x2b10a87aa31cffddL,0x4fc728fa9a5814a2L,0xedabb0dc63bdd2ceL,
59544         0xdb90173f96bdaa40L,0x543c4f01527ff659L,0x5dbff7ad0a33b251L } },
59545     /* 47 << 308 */
59546     { { 0xeef30ea55e636f5dL,0x8df2d4040bccc4ddL,0x8b0d6f35ef1afe9fL,
59547         0xbd288e6ef8f86f6aL,0xbc68817ebda45411L,0x8a6f50070faf9e7bL },
59548       { 0x6158c57a53d4050cL,0x6d5a3af165b2252cL,0x10f62839f450886aL,
59549         0x8b9ac19b1df85080L,0xc160c1567553ed58L,0x2195ab29cb449cd9L } },
59550     /* 48 << 308 */
59551     { { 0x521f4af73ed03d5fL,0xe3461f66eaf9064cL,0xad099ab7ae03777fL,
59552         0x541cadcdb65f73ffL,0x53430463a86059b9L,0x8ff88fe5043e9f82L },
59553       { 0xd515f4c7e42cde45L,0xf7f3dec3f41c3269L,0x7bed53567ef1b8ffL,
59554         0x8782b45f1295b5feL,0xab54ebaa03917627L,0x8516beb28787ed9fL } },
59555     /* 49 << 308 */
59556     { { 0x24b2b95b113940daL,0x8c24d8d3f9c6e6d1L,0x7c584170eddaaf29L,
59557         0x249267171efd01aeL,0x692cf8f40cd0f2d5L,0x0bf82e142f960244L },
59558       { 0x6dbcb6162dabe927L,0x76d826d20aa1eed3L,0xe4492fb3be98af99L,
59559         0xd4f27cbea50dd711L,0xb7796efe2d8085daL,0xf2d42519ec4e8ec2L } },
59560     /* 50 << 308 */
59561     { { 0x3fbaf46dccc3c261L,0x773c240c1b646e80L,0x151a711f363b6a5bL,
59562         0x3c8680b1c53b5b59L,0x8ee6795f9fb234b6L,0xab7840aa2f673211L },
59563       { 0x0a1a0ff3224a8184L,0xcab87319c71bb575L,0x7a9e9daa8125668fL,
59564         0xdc607b016c4cff5bL,0xa54cb4c792e5c760L,0x977e4c93d99e4655L } },
59565     /* 51 << 308 */
59566     { { 0x87d4ff71ebe95680L,0xa2093915e5adaac7L,0xd5bbbdade32f5d9aL,
59567         0x5d61056cf328a4e1L,0x61fcdb0f353f565bL,0xb7b8ba004efab5caL },
59568       { 0xb5bbcfa410f05eabL,0x483ae9221f09a105L,0x17d94ca44bbf4753L,
59569         0xf734a8cdbbdc9a94L,0xc7f01a4244e81e2dL,0x60c3e777b3ba8033L } },
59570     /* 52 << 308 */
59571     { { 0xba7df5a965b68624L,0x30b4d6ed6e7d58bbL,0x67e52341dbb81762L,
59572         0xd697ab1b0deeac1dL,0x01d15e8e5577ea92L,0xbb12d72498fb38daL },
59573       { 0x302faa6d4e04908dL,0x66cf6cb909b90a9cL,0xcd665dbd98d96736L,
59574         0xf7d3c528b86f3af4L,0x4844c7541d8b07f4L,0x2a77d7b91eaf7dc0L } },
59575     /* 53 << 308 */
59576     { { 0x8a36c9b57fceaa87L,0x5110912b553c7ad3L,0x4aa51166d5eca67cL,
59577         0x05740dcf07a5eb58L,0xeaafb3e3396857a4L,0x1ae9571bba8d62d9L },
59578       { 0x2736975500272434L,0x2c74325c59872fbbL,0xd1d8291709dda11aL,
59579         0x2a5334eb4683e8a1L,0x22cdd088e3481df0L,0xab1c5f5b4fddc546L } },
59580     /* 54 << 308 */
59581     { { 0x1966aa0515f46174L,0x495901bd2a074050L,0xda5b0cdebba902baL,
59582         0xc47c518a684325bfL,0xa5df133ec4d9d6d9L,0x3771f465fbf7d31aL },
59583       { 0x0a73718c02b05d1aL,0x1107cd45534237a2L,0x582cfd2980f5d897L,
59584         0xf51a0a88dab0269eL,0xfdea51cfea1a22faL,0x3c9a0d247a13a324L } },
59585     /* 55 << 308 */
59586     { { 0xcc330f58c42f1ce6L,0x8e1fb7df534efc38L,0x2a37208f5fa5a01fL,
59587         0xc06d8447369bdbb6L,0x0b1ea5161a3e36e7L,0xfb4a48366ff9abbeL },
59588       { 0x5989c2d524419909L,0xdeaa6136f1d5b1caL,0xac6003b04ba760f1L,
59589         0x3a6d5422059081beL,0x96c7fa9df797e22dL,0x67c2f77fa9f3addcL } },
59590     /* 56 << 308 */
59591     { { 0x53e59f251d70eb73L,0x8aed17afe69d0525L,0x26ddc17864413768L,
59592         0xa7c8d40f5e48c349L,0x29ad92d187ff01fbL,0x8f4e1b3b965b2de1L },
59593       { 0xb83cfadf1446eca2L,0x7432bda4e609d416L,0xcf97e8a3f1c7de69L,
59594         0x45899bd832f55f07L,0x41a6811751175738L,0x89eeb115b8efff21L } },
59595     /* 57 << 308 */
59596     { { 0x9dcda4f3723fc25eL,0x710de79fb5d954deL,0x095ffbf1f0b7d129L,
59597         0x419a2a5e32651179L,0x7b249135827d4268L,0x9dccc98d909fbfb4L },
59598       { 0xcb4b0cb016554ab5L,0xb2fc635f6d84b255L,0xa7f8f3f553512b87L,
59599         0xc72633f300ec778bL,0x4e07d91a4f1841a9L,0x2a1adbbdcb4f478cL } },
59600     /* 58 << 308 */
59601     { { 0xe31333093bb794fdL,0x34c68bac33b3be44L,0x953fa2c412172b7aL,
59602         0xa9afc12d4fdde6ffL,0x30b5302ae9c7804cL,0x4a1746c702119e68L },
59603       { 0xc4d0c7d323e2ec51L,0xbc821f217143d613L,0x8f41251a673e203dL,
59604         0xfa32c06aac2ca4c3L,0xf4343f2799a7c431L,0x8f7d489e6b96d959L } },
59605     /* 59 << 308 */
59606     { { 0x183311763f6278f9L,0x4fcc5b653593cdd5L,0xb09b5880e643f83dL,
59607         0x0f130a3d2c78466eL,0x926d7c3d2b1c1ebcL,0x7217f875662ed4ecL },
59608       { 0x2d3be028d81cdad3L,0xb2a04e3507a38019L,0x8da8cddfc9a3097eL,
59609         0xbaa67f60ddb20228L,0x698fc1c407f04de8L,0x6f0e1d6d7e86db6dL } },
59610     /* 60 << 308 */
59611     { { 0x54a01e60936c3ebaL,0xf326fe96ec01b12cL,0xcdfaf00366e4de2eL,
59612         0xc53dba07392fd0a8L,0x00d9b80f6ec46004L,0x84d59be83ba63f8dL },
59613       { 0xbac4ea439dea6062L,0xb4b4845badd568caL,0xa6ca3d34d225e2d0L,
59614         0xce72955db50070a2L,0x56e5c91321c78b68L,0x888eb198999488a3L } },
59615     /* 61 << 308 */
59616     { { 0x65bead3c1c2de335L,0x0ecdc057b18a6778L,0x821b836983e57ea8L,
59617         0x84c80b574a5c11dcL,0x0b6432822ac9ad27L,0x8e09a7f344fe943fL },
59618       { 0xe510f47daa92dc94L,0x8bb0b5cc6a1666a3L,0x55315bcc24645380L,
59619         0xe3acbed113dcf7a1L,0xff99c90e3c9a1610L,0xfbe9aa1bc326e1f5L } },
59620     /* 62 << 308 */
59621     { { 0x5040bea56827b6e3L,0x1049e004d935eb24L,0xa15f9a07ba9bde68L,
59622         0xda430c55e6087e70L,0x30ed69af8e84b7c8L,0x8498514eac9d6a72L },
59623       { 0x69c783d64cb27e79L,0xe55d31a09647a572L,0x0479e8b2fbfb82e8L,
59624         0x3e845922b52f08c0L,0x252f755f0dbca622L,0x6219778389ddfee8L } },
59625     /* 63 << 308 */
59626     { { 0x175264893ca1461fL,0x54c432f92b6476bfL,0x0e0be36a530795f9L,
59627         0xb9896dacca583429L,0xe4af98239d4e6085L,0xa38b7c4b4a7422ddL },
59628       { 0x74643ef47163e421L,0x74c28314895ee61aL,0x637c79c20d62b657L,
59629         0xb232ec619bf2b3afL,0x27bdbfb4b2d5992eL,0xcc6e424c49afb181L } },
59630     /* 64 << 308 */
59631     { { 0x5255508c11c92f34L,0x9a346cf3a294d382L,0xd9765eea3095205bL,
59632         0xfea2ed702c470ef7L,0xf5e8a0fc9c40bf0aL,0xb572390ee4137a16L },
59633       { 0xb91753712bf2f545L,0x2c2d0f4c58cd9cc7L,0xbea6bce902385486L,
59634         0x46208408a8bc3a94L,0x64a87a2a3ac45044L,0xe40da33c7df70151L } },
59635     /* 0 << 315 */
59636     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
59637       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
59638     /* 1 << 315 */
59639     { { 0xee9e25d939161b8aL,0x8763f2a2e2eead91L,0xd2fc1157d2d91300L,
59640         0xe7597e2fffcbe50fL,0x4be3814fe11d376eL,0x1eab3d7edbf14562L },
59641       { 0x38a107c0c0ad183aL,0x829766267c753bbfL,0x18014e09caebd481L,
59642         0xb28c331bf9ace60dL,0xe8fba04f211cb8e7L,0x41c4b797e42dc65eL } },
59643     /* 2 << 315 */
59644     { { 0x009dc2f4c3e88580L,0x4a405be899db1fb5L,0xc89bfaa2ec5d91feL,
59645         0x461be9a0f160afcbL,0xfdd084bb7d7566b5L,0x795275e8e48099a2L },
59646       { 0x1b461fc9fe9815dbL,0x576214cd73627bbcL,0x3246332d9f09a206L,
59647         0xbde4c0c36941d6efL,0x44ef03fdf387f5f6L,0x99c8ac0157b63400L } },
59648     /* 3 << 315 */
59649     { { 0xaa512f202f6e4301L,0xef668a5fbf94a1ccL,0x08713c3015861b88L,
59650         0x49d47551c99bb2b6L,0x6db5f812e2f0258eL,0x70c9b299998d7435L },
59651       { 0x46168e1c5d176ae0L,0xec3306e4f730ec30L,0x49439df3ab69c15dL,
59652         0x1040408bea0143e4L,0xb48ab8eabc549b0aL,0x4aa38bbf10f89223L } },
59653     /* 4 << 315 */
59654     { { 0x7e4851599598f49aL,0xbdac3d5e9629305bL,0x20de0dafa6fbabfbL,
59655         0x04f015838f09fff7L,0x5a0562976a06994fL,0xf51dac8f6e3ccd33L },
59656       { 0xc087ef9c3af507b8L,0x525ab76e6a5c6663L,0x4fc04814d916ee93L,
59657         0x3369c978d23d140bL,0xb0fcd70f1662028fL,0x2ca77de2e1e28adbL } },
59658     /* 5 << 315 */
59659     { { 0x838acd1bc512bc71L,0xac06d6bddc18afd0L,0xc991c1e39ec45f4bL,
59660         0x667c5e89cc27c68eL,0x0e059b04ed07f829L,0xceccf1d4cec4b3a7L },
59661       { 0x3d9c2dc9b953f9a1L,0x4be2f7e72d599b16L,0x1a2054b197256c26L,
59662         0xcf66fa478b4fdfebL,0x896cc1b38134d7efL,0xa17264cad41dadbcL } },
59663     /* 6 << 315 */
59664     { { 0xe3ccfe8e37627e56L,0x00733a867b6b21a6L,0x3f13e2cbb605c427L,
59665         0x5ee12395b0d80992L,0x4dcaea94b9991381L,0x4cfed7ee8c4c4b6eL },
59666       { 0xd7aad54b7f7f45dfL,0x2229407fb3809bf8L,0x6eb31eee68048fd9L,
59667         0x693842dfd57225fcL,0x3e62cd85a88dfd3fL,0xc6307d53d5462cf1L } },
59668     /* 7 << 315 */
59669     { { 0x2d15615ef344f5fdL,0xe0ba6a8aa7f23989L,0xbbfc58041c84e3f2L,
59670         0x22ffeaae6f4ba826L,0x1e9bf27494292682L,0xc768f89146c02af9L },
59671       { 0x894127d6177cdafaL,0x8d0523da2acdc791L,0x71ada9aedc78c3c4L,
59672         0xf21dbbb92c532a01L,0x0c797d5eacb20fdaL,0x1ff99d7616cf57b0L } },
59673     /* 8 << 315 */
59674     { { 0x99b5f150493c1d64L,0x3422b656fb74075eL,0xe7493900ff19bf24L,
59675         0xc82e5b80260925edL,0x3398d340c0ea1eafL,0xe7de2ba11287121eL },
59676       { 0xea6dfb0b87847031L,0x73bed0a1566af2f2L,0xe26678bf12012999L,
59677         0xb5369e4d32e5cebcL,0x2304eac86d181e32L,0xafdbd9543d364addL } },
59678     /* 9 << 315 */
59679     { { 0x5b1a53ca75da4189L,0xa90485802eb4862bL,0x319424092783ad6aL,
59680         0x15a4c5e11a9e025eL,0x841bc53313837199L,0x6e9d3e14e642954aL },
59681       { 0xf4a02bbdd436ec5cL,0x62fe177bc6d6ad53L,0xedbf1e4eac86425aL,
59682         0xff9359c8d9f752f5L,0x79c685d92d7ad656L,0x8d82c0c4fdde9052L } },
59683     /* 10 << 315 */
59684     { { 0xf55f868e702f640dL,0xe459aa9b1dedda11L,0xbec0ff9bbb5ba193L,
59685         0xf7325c4957724703L,0x5ab8f06323e0e4fbL,0xfbf02e91ecb0fd7cL },
59686       { 0xcc72e8daa2e5fa31L,0x47de252832cb53cfL,0xbfa646e64252763cL,
59687         0x7a769efeb8d81de3L,0xf5ec70031e772f00L,0x049bea9a2729aa5eL } },
59688     /* 11 << 315 */
59689     { { 0xe987ba54759090d6L,0x904d6901619ef08bL,0x9e16d1382024a6fcL,
59690         0xb6f0459ba9f3b7e4L,0x1f2a530817ee069aL,0x99403b2e2be31049L },
59691       { 0xba1663c6bfb2f288L,0xf829195cc7a92b41L,0x89b915ee8ae621b1L,
59692         0x3fbbb1e150f8ea92L,0xb1fe7f978c901ddcL,0x16d1f62cbbc69ca4L } },
59693     /* 12 << 315 */
59694     { { 0x51f19bb3fda072dbL,0xa815459fe3f7e0a2L,0x5f7cde2f987112caL,
59695         0xdc51d948759de2cbL,0x9d05c410ed49bd98L,0xf063ab99364341fdL },
59696       { 0xd7869d68d1aa0a11L,0xc20291065d862d01L,0x7f258180c2591073L,
59697         0x7b90fc7a6ebc4ebcL,0x5565390f3dda1d68L,0xae77fca8a44e4493L } },
59698     /* 13 << 315 */
59699     { { 0x97564e4847c49ee8L,0xc56bb5a9ab4ebef5L,0x80d969417b4f86bcL,
59700         0xa594b4e541026cf0L,0xd56c89965a89ece9L,0xbcf609316a0f922bL },
59701       { 0x702596161103475cL,0xb1224fb58a2a2abbL,0x0a437a03715cd61bL,
59702         0xcbe2d2b2739921edL,0xf3b1b5e9385541c4L,0x5d0984f4ae010520L } },
59703     /* 14 << 315 */
59704     { { 0xb4a2742dcfd9295eL,0x9cd36774ae929cd0L,0xb15fadccdd7fcf4fL,
59705         0x0b1fa2b337d4fcc6L,0x242c7b26f01c7ab7L,0x2be8131b50574cc9L },
59706       { 0x6ee50f42bd89a03cL,0xc7f6ff8f005e7765L,0x04d13af18420501bL,
59707         0xc22e092b1b6e7d2aL,0xa393be7ee9516f80L,0xa2593652b80bb5b5L } },
59708     /* 15 << 315 */
59709     { { 0x5caa5da68b23bebbL,0xa1ad33e81fdbbdf4L,0x18dc93cf4e5c1de0L,
59710         0xc3e6addb5bd9e178L,0xf30d517e7cb8cd03L,0xbb84ce54f1abc417L },
59711       { 0x0774b64c67699659L,0x228005b9b7d4a401L,0xd8c2ec5b80b2d3d2L,
59712         0x419c4cd93450ba7fL,0x520ae681789286a6L,0x24b67ea9aa8bcfbbL } },
59713     /* 16 << 315 */
59714     { { 0x9e41b9b70f74808fL,0x2d835dae0c061bdbL,0x67e50c8cf272346cL,
59715         0xc98a5ef5def57493L,0xc2dea8afa02676fcL,0x59508de26ace4659L },
59716       { 0xc2b707aada6cd733L,0x6c1f226a4be7bfb9L,0x5b580fa2a778c20bL,
59717         0x272c3a1d57af166bL,0xe47a64a9ca78ce62L,0xd12db7d771d35087L } },
59718     /* 17 << 315 */
59719     { { 0x6a37ac5a2ada7e64L,0x664594de04e35dbdL,0x3a82f748ffdbf300L,
59720         0x4525ddf155975f5dL,0xcfe5a76bbdf2035fL,0x1693a99f0fcbda84L },
59721       { 0x5bdb76856a297cdeL,0xdb9ad0cef1d1009aL,0x9e9dae1caf902a00L,
59722         0x7e36f79f271a0a50L,0x688a0f41a2a2f652L,0x33d2178613722e40L } },
59723     /* 18 << 315 */
59724     { { 0x2f4abaff356f4ca1L,0xa2e419422d13be2bL,0x58d72e2f3d7db731L,
59725         0xafc2f505cd455649L,0x8a0794cd1583705cL,0x4a43066288ffe8e7L },
59726       { 0x2c0c031d135c8e7cL,0x8ecd9ed76b371b41L,0x17cc1ad9563843eaL,
59727         0x9603987cfc6b810fL,0x6e291ed7f0d9498dL,0x8c69ae62e1a4058dL } },
59728     /* 19 << 315 */
59729     { { 0x934666dd40680b5aL,0x37a9c6ac91e762f6L,0xa0a10533e4d26e7eL,
59730         0xd811d558ade18237L,0x6e2918ed411b121fL,0xbd9352b93c24a52eL },
59731       { 0xe31569ccb811ec4fL,0x3b5b977553f7d097L,0xa0d9ebfd7198e959L,
59732         0x63e10ab13f0a942cL,0x65b8b87f8ea55897L,0x935ea3c129aa0212L } },
59733     /* 20 << 315 */
59734     { { 0xe14dd3708ba8a3dfL,0x49c1fc3750a645b6L,0x3f0db6a32252ff87L,
59735         0xea2ac3c4a34ad040L,0x97a37936decf9f0fL,0x810f02326f7f92ffL },
59736       { 0xd96c2641184e9c88L,0x08c4cd333d5ab12eL,0xa938d8c3eda80fdfL,
59737         0xf2dded68bfccc054L,0x4b3da61ede36ac9cL,0x2c266df8347ef904L } },
59738     /* 21 << 315 */
59739     { { 0x4653cbfbe3443739L,0x53ea14dd8dd85382L,0x2f6d0513f26ba2fbL,
59740         0x374d9bee51269be1L,0xf976cdb243f1f612L,0x68b47bf7b5f171b8L },
59741       { 0x726e93dc7095f377L,0xe6f18c57b59fcfb8L,0xffb56a4023d9eb60L,
59742         0x678c9508447caf79L,0x4cec83e459740ce0L,0x820ab7eff4d7d58cL } },
59743     /* 22 << 315 */
59744     { { 0x88eac51c8e376fe4L,0x096e70c49ef465b6L,0xb35265852004969eL,
59745         0xbd581669d29cc63dL,0x88094298745b6919L,0x317e386c12e7d67fL },
59746       { 0x33848bb2e3d6f4daL,0xbace887f2a0ca785L,0x83b32feb197e67a7L,
59747         0x2b58535ade9c851bL,0x3e428b19c38beaa9L,0x784aa3d174f26de1L } },
59748     /* 23 << 315 */
59749     { { 0x10c5f1e5b292efd6L,0x47d92b88ddc96103L,0xc8743717e5e802e0L,
59750         0x47781ba8008dbb2dL,0x7abcd3acf02360fdL,0x673e2b05e9142308L },
59751       { 0x501db7c76db93818L,0x285ced71f33dbda3L,0x30aa5fb5cdba4b44L,
59752         0x93d536c2df0445b0L,0x28a77bfa10196091L,0x26b9f668e38c4c7fL } },
59753     /* 24 << 315 */
59754     { { 0x98c3a697c0909659L,0x35c3b0f297d847aeL,0x67d9f71273a7a5a8L,
59755         0x28e83651b47bed08L,0xfca9e849567b3410L,0x5fa9a6ded291fe1fL },
59756       { 0xd79682421976a995L,0xcff5bb36a0261383L,0x34166ef962e9922bL,
59757         0xd816b0342d433139L,0x3b62d3589c4b99c3L,0x8521f917104f7cc4L } },
59758     /* 25 << 315 */
59759     { { 0xc35a5c7874e09962L,0x1c340269e1690418L,0x2ed61ab4dca0de49L,
59760         0x2570d29ede2534ffL,0x9077691bc5143c88L,0xaa249a4a346f3ec1L },
59761       { 0x57e4f1e104de76b3L,0x206859c3f415b99dL,0xdac6f415f9a15eb1L,
59762         0x2bf456d00a9501bcL,0x1ceb7dc41ef91323L,0x19c1fa8c3cb8afb0L } },
59763     /* 26 << 315 */
59764     { { 0x7761d8fc6f7b6eafL,0xdc439bfdcc0575e5L,0x33853d91f1ff4383L,
59765         0x6da20e4b75dc1254L,0x25a53b581969a1d3L,0xb40df56723311968L },
59766       { 0xac150a297dd6aaebL,0xfe6865ce2a3ba337L,0xea05d97cf71013feL,
59767         0x0ab3cf008053c65aL,0x7cd38b647bab4869L,0x788cb867204cc6a5L } },
59768     /* 27 << 315 */
59769     { { 0x253a041e36e88e48L,0x1610f836b86297fdL,0x379d3da109334bb9L,
59770         0x62de4308777fa7a9L,0x604a46bd6dfefd1dL,0x9e4740ae314eed76L },
59771       { 0x40ec32e12efde5ccL,0xa5b841bdd92c1faeL,0x01852e23dec68e16L,
59772         0xc76173b88b55b2c2L,0x4609f350377d5e77L,0xe9c4167ffd67c6b2L } },
59773     /* 28 << 315 */
59774     { { 0x52732a0a4b0fc112L,0xe654744e9d125dddL,0x9f76cf7e269beee7L,
59775         0x2fb8bf32ff80a2f0L,0x1bcef16262b7153bL,0xdedc255a43a4201eL },
59776       { 0xb1b30b91acbd8a37L,0x147fae6f240adc8fL,0x5558702cb39bf39bL,
59777         0x171e58803e1eb997L,0x095bf301ed7c79b4L,0x29f1dbffeef752f4L } },
59778     /* 29 << 315 */
59779     { { 0xcbb2506e7535c370L,0x40ee37ec7ab20106L,0x74f502d4caca3675L,
59780         0x167e778db57c0364L,0x7726715b13fa3dccL,0x76097791f42e0c3aL },
59781       { 0xe1d990c3379dd41aL,0x432454d785c8f5e2L,0x1f90c59562ac45e4L,
59782         0x63e156998ffe0c09L,0xc3bb8c29d42bf0a6L,0x027d5a86ecca4cfcL } },
59783     /* 30 << 315 */
59784     { { 0xaf8ca08b20492da0L,0x37b1fa1547508667L,0xc9fc925b96077958L,
59785         0xb78c83c19ecac8b4L,0xd9d953a17c05a67fL,0x970ee229b9ebcaaaL },
59786       { 0x689cad7f55dc989eL,0xf02f05bc66c941fcL,0x8d00516281e23d8bL,
59787         0xfe603ffc8caebcc3L,0x592860bff303153bL,0x9ec1d5ab3344e524L } },
59788     /* 31 << 315 */
59789     { { 0x7e374b7b0f922941L,0x44b3f00174466c92L,0xcb3eb28c3c2fe678L,
59790         0x91079467bb9bf05bL,0x0d268749de2dcbe3L,0xb6383ba4c5204680L },
59791       { 0xd50269f4951d3c71L,0x9209a2d53ffbf2e0L,0x2f6496258110f811L,
59792         0x08fc9fbb0b31e275L,0x697960ea1faec287L,0xae95e4a8c5420ad4L } },
59793     /* 32 << 315 */
59794     { { 0xc20fb9111a42e5e7L,0x075a678b81d12863L,0x12bcbc6a5cc0aa89L,
59795         0x5279c6ab4fb9f01eL,0xbc8e178911ae1b89L,0xae74a706c290003cL },
59796       { 0x9949d6ec79df3f45L,0xba18e26296c8d37fL,0x68de6ee2dd2275bfL,
59797         0xa9e4fff8c419f1d5L,0xbc759ca4a52b5a40L,0xff18cbd863b0996dL } },
59798     /* 33 << 315 */
59799     { { 0x1304bd65ff0e8fbfL,0xa249adb53343deecL,0x20635fa9826e1293L,
59800         0x6283f098b7bddaadL,0x0d0a7820bc96fed6L,0xcd7605d47de0b9bdL },
59801       { 0x4f0a9751586f9eb6L,0x2f6dde5556b2521bL,0xb7efccbd76264c6fL,
59802         0x7df9cd35b2613621L,0xc334c8f924a2ff4fL,0x914f472a0b13b604L } },
59803     /* 34 << 315 */
59804     { { 0x89092cbc5f6bb241L,0x8b4dadacca123b83L,0x9ba420eecd2dbaa2L,
59805         0xf269d1982dd6ef2fL,0x29f68d03809b338dL,0x18cf8675958ae927L },
59806       { 0xc179d4b2bffac33aL,0x5356ffc1522695e1L,0x453474986d039c90L,
59807         0xcba0e0fc5a675530L,0xf369b7ab98a0c70cL,0x51f82173d508c254L } },
59808     /* 35 << 315 */
59809     { { 0x5f98e5aae8490374L,0xdd84a7506ca52a68L,0xb6904ff8a9244f56L,
59810         0x4c908c0362a5502fL,0x70ff1e01a8df73b3L,0x573a37f20df382caL },
59811       { 0x5df73cf8c7dd1209L,0x965ad402abfbcd79L,0x61a633a59e67af24L,
59812         0x0953c83cc64203f7L,0xe14f58f9a1fd8dcdL,0xb5ea722887a5fadeL } },
59813     /* 36 << 315 */
59814     { { 0x55466aa1d896c2f9L,0xd03ade059831fb31L,0xc46711547d968dfbL,
59815         0x8ade0c97bce2fdb9L,0xb408c7457f6d843eL,0xb1bbe028a709cf63L },
59816       { 0x1dbd25383ba4fe36L,0x1438d322dc1f2720L,0x1c3c46b9c37694deL,
59817         0xe57133dc3997e650L,0x754c171e422b95bcL,0x29c47f0da209c7bbL } },
59818     /* 37 << 315 */
59819     { { 0xe520480823822d0dL,0x745fe7aae3eab177L,0x6f0f4a7e808500edL,
59820         0x9383c632200c2bf0L,0x6f3130d7be22d432L,0xed7713d465511061L },
59821       { 0xff84bc04049067acL,0x33c2be61d56210e1L,0x57d63f885ac04f01L,
59822         0xc2fbb773284fb49dL,0x46422426e1f349adL,0x3cb627c465863455L } },
59823     /* 38 << 315 */
59824     { { 0xea06cbe9a1edcfccL,0xb0438e198aff46ecL,0xa93fb88ba450240dL,
59825         0xfc4a370021b6b45dL,0x2503aa5d82a21241L,0x7533f1d7f540d3b7L },
59826       { 0xd7a58a679277538aL,0x466d981a539c347dL,0x46f1682bf26488c2L,
59827         0xee2b4976318282e4L,0x8fe5e5b85a94409dL,0x40ca43a7b1a4fc28L } },
59828     /* 39 << 315 */
59829     { { 0x0ed4414c901e48d7L,0xdcabb46418340890L,0xd50bf12f20998781L,
59830         0x498a90232a596ffdL,0xcc877212b43f456cL,0x98d9d531f796c4fcL },
59831       { 0x061e3b31977c11b9L,0xe56bc6f00a00c822L,0x756e62c96887ea43L,
59832         0x29129d53859ec944L,0x42342589146c1fbeL,0x2f2cd4bdd1884196L } },
59833     /* 40 << 315 */
59834     { { 0x3d3815d645d94a24L,0x4cd9fe1139f3e6e2L,0x8c7b8dae8e7eb572L,
59835         0x7e69faf40f7deecdL,0x0e54b3c0387e97ddL,0xd12e473175a1b6b1L },
59836       { 0xb7163632c664f92aL,0x86ab4ea88d94e55bL,0x37212aef1133dcbdL,
59837         0x0c6c7fc6dfc0d47aL,0xacbcb077aa9e1ccaL,0x43cf50a726ef7fb6L } },
59838     /* 41 << 315 */
59839     { { 0xc0eb003c54d7bac5L,0x89780aea2b770baeL,0x13a194e8076bb29cL,
59840         0xb863585046f8aa90L,0x79ebc6066df515f0L,0x25ea422dd1ead000L },
59841       { 0x16b03b8106c89b71L,0xa964da878ad9fff7L,0x2c96dc6b2e7b9072L,
59842         0xf71788978c93f6bfL,0x4c7ecef912688648L,0xed7b4a577c663be0L } },
59843     /* 42 << 315 */
59844     { { 0x5b7cdd0ad74a20d2L,0x273184f48bcdd2f5L,0x4d8d3b4ce3ac03f7L,
59845         0x0e2ff518a02cc60cL,0x9c006ad8b6fa606fL,0x401606caccf627a0L },
59846       { 0xe7429a6f7b967844L,0xe4e5d1c1bc8ac8beL,0xc050f89ff4f46638L,
59847         0xd23a3eb452f918c9L,0x4528e4e202944b49L,0xeb345a689268719dL } },
59848     /* 43 << 315 */
59849     { { 0xf4fbd190ccec4c27L,0x7e042c8722674e8fL,0xbc79835ae8b33439L,
59850         0xc7923b8fad2124d1L,0x0ece42272c72542aL,0x02d638e2b9264875L },
59851       { 0xbdf9fba1904e7683L,0xcbbc0e0aac934377L,0xea154d99459ec213L,
59852         0x87db3f66c3023e2eL,0x7f9262d518de83a8L,0x432fef4f3524400aL } },
59853     /* 44 << 315 */
59854     { { 0x3b5566d7938a395bL,0x920dc1111f256c82L,0xcee7f231a059c8f8L,
59855         0xdc3da434d48b3179L,0xb1e819e913f78de6L,0x94a21bb01f9819deL },
59856       { 0x8ef14a96f302a94dL,0x9f897e1a079fff9eL,0xff9a4e0e54122af0L,
59857         0xac6a6cbef0b7f1c7L,0xfd15d9756401df3dL,0x500531a323a0b7b6L } },
59858     /* 45 << 315 */
59859     { { 0x12e22a012da0c724L,0xa0a837f3b80cba90L,0x89df9a3e2a9b5434L,
59860         0xf3299f64925840acL,0x0cc78a3a125b3dc1L,0xa4ea6203c723d647L },
59861       { 0x5cee8068d369522cL,0x3e479803432d5e87L,0x86e809363ad8126bL,
59862         0x93e871c9cf89d85dL,0x892e4710286c9010L,0xa075a6d3ec3a1792L } },
59863     /* 46 << 315 */
59864     { { 0x095768bc7dfddf6eL,0xc4e331b4e63c4e60L,0x1179808104f28a2aL,
59865         0x415e33e1bee48983L,0x7fe8050144af7eb7L,0xdf6c423b2f28fbfdL },
59866       { 0xd10886db007a2b56L,0xea578b286613f26dL,0xd18a9d1c2b90a815L,
59867         0xd4c6e8b2675c2c8dL,0xff973df5788bf2d6L,0x4fbeb6210d7e611bL } },
59868     /* 47 << 315 */
59869     { { 0xcfab317671674fa8L,0x78038a1afef7089eL,0x3109736aa27b5b55L,
59870         0x1b31325fc0193518L,0x3afd21a8be19b5f0L,0x548196a2d8028eabL },
59871       { 0x15b0d6d2a94e6be0L,0x1552ffb67afd5dd6L,0x49b1150d89bed9eeL,
59872         0x2c59b0bfb0d1444cL,0xab265d7eb695a900L,0xa24d0788a1dd1ef4L } },
59873     /* 48 << 315 */
59874     { { 0x4e913e1131e325ccL,0xe92f7c8f2a65fe01L,0x8e61a80d5857aae9L,
59875         0x2c36923d53104397L,0x5b0911d6b36d5379L,0x76eb9b56b1207ae0L },
59876       { 0xb5cd11646723c4aaL,0xa6bec13b98891a11L,0x09af8be29d806056L,
59877         0x7da8d29ecc1fc0e6L,0x231cc00e2aa8791dL,0x2ded362c042171c2L } },
59878     /* 49 << 315 */
59879     { { 0x26eb2ac96afa51d2L,0x83485eff13c04ce8L,0xdedb48718072d8dcL,
59880         0x4da1771d8ac3d411L,0x2d8f99ef849c6c0bL,0xea65f6bc2b5882e4L },
59881       { 0x60a90f58fd671216L,0xb9f3e2058af33bedL,0x29c41ec92bf02916L,
59882         0xcdf15b1de5ddeae8L,0x67f9ad163109e99dL,0xb9b5585f517d25e1L } },
59883     /* 50 << 315 */
59884     { { 0xae016b4811b3e20bL,0x5ccf3cf1e5164179L,0x1281ff8efe9fd47cL,
59885         0xb85438038e61bdf2L,0x694e42feba5856a0L,0x53f7e09759b32aa1L },
59886       { 0x5b9848e9c341a531L,0x9a5fb85025952b73L,0x9d5fe0dea6f82c5eL,
59887         0x9216a8ca44090933L,0x3e986d4bc3272875L,0xc20534f8f3512e42L } },
59888     /* 51 << 315 */
59889     { { 0x718124a1033495a6L,0xc4f28a746834851fL,0x91186d80e1baaa77L,
59890         0xca4e13222a761e95L,0x7b6b8322582ddee2L,0x75d396c6c3c70c6bL },
59891       { 0x075dcd6b54c75102L,0x3669b97c0b92622cL,0x621154e6f0cd45adL,
59892         0x7ff0029ff381a6d3L,0x3d37e750a726f84bL,0xc4f79202874de604L } },
59893     /* 52 << 315 */
59894     { { 0x215018fdec26297dL,0xaa06fd0bbf35d225L,0xe5fb438cab40bc17L,
59895         0x6a0ab335acb7f4c5L,0xbe1f4de4187a8e6cL,0x651deba961f7e842L },
59896       { 0x2b30b0046f629aedL,0x63bdbf8e2218f107L,0x21a21aa5f9ca8bbdL,
59897         0xa88cd9138304f7e1L,0x23594fc6c5e6f9d4L,0x4d4db41a6682fc06L } },
59898     /* 53 << 315 */
59899     { { 0xca2317b0428dcb40L,0x9a7bd387288b5eeeL,0xd62da6d0a060584bL,
59900         0x601a3d6ce8f10251L,0x65718f0584885319L,0x5a87b1c2a1bc252dL },
59901       { 0x27ae8015a37b05d5L,0xa624af9c98394605L,0x988220050ba4565dL,
59902         0xb93395c9da2613deL,0xcef9a880edcaa74eL,0x7b2ef0fe0976687eL } },
59903     /* 54 << 315 */
59904     { { 0x094f20588e5c6b80L,0x6e5a5f52846eabebL,0x9eaef2d7370a9345L,
59905         0x12d6f20687c19719L,0x0d2494ab9c44076cL,0x15ccc737de9309a6L },
59906       { 0x8eeb8faf94ca6587L,0x7dc9a4fe3fe363f5L,0xf02f6e03b3b08270L,
59907         0x31adbe77daf15507L,0xc0fb2814343bb4efL,0x724007519bdc1d91L } },
59908     /* 55 << 315 */
59909     { { 0xd301525c1677fcb7L,0x11b7141bfb6b0dc1L,0x01f4950eb2163b70L,
59910         0x34c758c6ed3c0025L,0xd1b1c7573a5196cbL,0x7926f0a42fa19c66L },
59911       { 0x107e5d32b1c47233L,0x0fe50b00cacbdaa0L,0xf45dd7e8e213397aL,
59912         0xca6b2de9eaa1db7dL,0xbf234b55dd09c2eeL,0x10db87d1a1db37f3L } },
59913     /* 56 << 315 */
59914     { { 0xaff57c87de0572ecL,0xc0745250826246c4L,0x523910fc700ef250L,
59915         0x8c23aa5793faa067L,0x87f7c7198e7dcf75L,0x45ef4adb46695227L },
59916       { 0x0ffe09d196ceb1e0L,0xfb72a05790f3383aL,0x62d26e5e07c220d9L,
59917         0x03e19605766b1e64L,0xa774669458c17fb7L,0x9a851d828e7acfa9L } },
59918     /* 57 << 315 */
59919     { { 0x150e936f4baea8efL,0xeb5328d68239dfe4L,0xe064fd95b5f987adL,
59920         0x13d3803d52e7313dL,0x0e9738f5b215317dL,0xb6dd60a7974be106L },
59921       { 0x00fa92bd6bac81d0L,0xdee050f9e7cb2338L,0xd7943d4f9075745eL,
59922         0x07cc4170819cfd9aL,0x21b7e0b04aef1468L,0xd7520b77aef07b1dL } },
59923     /* 58 << 315 */
59924     { { 0x126c012681097c49L,0x95339f9475c02669L,0xec3fc15b100115ecL,
59925         0xea5c8e9c49fb787eL,0x63168108bd3fbc19L,0xdbf2430541573590L },
59926       { 0xcaa3a69686dbc847L,0x2c464fcb70d76739L,0xdd9e0bcd69e2fd74L,
59927         0x4ae92cc01652728dL,0xafe3e24812b060cdL,0xf3776c6ff951a38dL } },
59928     /* 59 << 315 */
59929     { { 0xe4ab1c417af22e76L,0x35a8addf038840dbL,0x95ba3e3dafd0d7b2L,
59930         0x2a7bf827f84417a3L,0x0bc177c729bf5a83L,0x29ef7f8bd09905a3L },
59931       { 0x1df34fb1385e6c69L,0x079bc0fcf99e0d19L,0xcd2dbbc4f30eb5c7L,
59932         0x2d364701afa7447bL,0x3c7bfa087a791ef9L,0xe21508c8e71166d0L } },
59933     /* 60 << 315 */
59934     { { 0x0b204c9ac746ec60L,0xdd5efe2718b93b24L,0x484474e0ce15332eL,
59935         0x690be23d05a308b7L,0xeea3abfcb0f7081aL,0xaff69f36cd8e8720L },
59936       { 0x5dadd080d951329cL,0x060c379c8cae67c2L,0x8e284705b20851baL,
59937         0xacc8d8a0e5df0e85L,0x8c024e789463544dL,0x15a9a3f08003076cL } },
59938     /* 61 << 315 */
59939     { { 0x095e284899e0ecb5L,0x61e9d5893415c1bfL,0xb1207d3017f5c585L,
59940         0x75f73f1d04e97243L,0x868551aa77bd50d8L,0xd530e0cc197f7d84L },
59941       { 0xdd6ab731ea9fb71bL,0x26e5b52e2cf9510cL,0x4fba03ff11a88911L,
59942         0x6608b634e921e323L,0x4baf22f836d46a1fL,0xb8bced501bc7ace0L } },
59943     /* 62 << 315 */
59944     { { 0xaee397fa327d9bbaL,0x9a45e7a2d832e3dbL,0xccb43a730582ae33L,
59945         0x457b3271d4093b12L,0x409caea6370bd663L,0xa5019f25657f693aL },
59946       { 0x5851c78a16478fe7L,0x5e09ace7ddf17dd5L,0x89ca68da0763656cL,
59947         0xb92d3321e2bad2d0L,0xdd5642098422f6bcL,0x4a6ea69946c04923L } },
59948     /* 63 << 315 */
59949     { { 0x7ba1f48579120405L,0x6c136597898be69cL,0x1e75e1586dcacc38L,
59950         0x3d3cb58b65ee4cbeL,0xbccee7a308db0caeL,0xee8bff34e77edfb7L },
59951       { 0x123bc3f036f60cf7L,0x3b1dc9e779bb4c78L,0x036a8049fe5f0d85L,
59952         0xc4de23d318f66f39L,0x593cf51e3c436c16L,0xd4d40e906769584eL } },
59953     /* 64 << 315 */
59954     { { 0xf6827150844eefc5L,0x002e82c44515ef68L,0xa46c8f55c51916c4L,
59955         0x98c3524b61ee081fL,0x5ab7f2c2ad64872aL,0x0b503ff07e555faaL },
59956       { 0x802e0d23b4c58d29L,0x122890402fd917feL,0xb56d19087af20d26L,
59957         0x8d619e216be50784L,0x10fdbb721372b851L,0xf2c1673e4935576eL } },
59958     /* 0 << 322 */
59959     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
59960       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
59961     /* 1 << 322 */
59962     { { 0xd97a9b1451a135f6L,0x6d16aaf597b4df14L,0xc57160c254818818L,
59963         0x4dbdeab61d59be44L,0xb93a9dad81f2b247L,0xe2868cf5ecbcab33L },
59964       { 0x5e1ce82883a86711L,0x29a9ca2f29c55428L,0xe716273a2d82b0dfL,
59965         0xb017f5f6ac8ff52fL,0x7563e79970ea7ccdL,0x5fedf0a63f0e674bL } },
59966     /* 2 << 322 */
59967     { { 0xa7f8501488d7b3fbL,0x3b5ec513ec78386eL,0xc6586b8a2ad5053dL,
59968         0x88c09a43fbcebe43L,0xde7f2a4a20054f16L,0x63daba80bbbb147fL },
59969       { 0x087e48f37d352b55L,0x997e32a08317ab79L,0x8ae802ff7f27cac7L,
59970         0xb01a131c37b1f6e1L,0x3f0d4c2e9a6d1deaL,0xe06114fce7ceef80L } },
59971     /* 3 << 322 */
59972     { { 0x311df84c359590bfL,0xf907d69ddf6ca4b4L,0x876fd36782f22c64L,
59973         0x64c4d14d9713e68cL,0xd431858d6b07f539L,0x39dfea3384990283L },
59974       { 0x6afb8cf080cf6498L,0x327056bcde060e9eL,0x5103ce4a49a71086L,
59975         0xfc94be75cdf853abL,0x2bfb105f8ca579cdL,0x02d19c3a50454b41L } },
59976     /* 4 << 322 */
59977     { { 0xaa03b474cde121c7L,0x74a648cb55e52c76L,0xb286ef86f37b57bcL,
59978         0x95b797eb2a6371d2L,0xa489ef894077ccbdL,0xf46ade048e99ca6dL },
59979       { 0x5cf9e23723242d03L,0x33c7d32acb708390L,0x329523b6ba7ba477L,
59980         0xd406ab8757de30bfL,0xaa10e4a21536ca01L,0xdcec94f4dfa7aac5L } },
59981     /* 5 << 322 */
59982     { { 0xb5839fa424700097L,0x82fe2251759eb8beL,0xec5f34bd5f104a39L,
59983         0x7f3da509ed1cf49eL,0x62fe425244621c76L,0x2118b68dc7bba926L },
59984       { 0xb0ac18009ea4b7e7L,0x33b21ca1fcc83f56L,0x1856161208458096L,
59985         0xba0e6aa95650f3feL,0x918d427231006f05L,0x955f3951b1066473L } },
59986     /* 6 << 322 */
59987     { { 0x0cb41ada3c59ee1fL,0x38b2465861d1633dL,0xde863b47d03e9452L,
59988         0x2bfab5b41548d45bL,0x580af6272ccb7528L,0x6744c7cb13c04327L },
59989       { 0x5eca3ab339cc5075L,0x51dbfc7b6d243f62L,0xd64d84b7981ee3ceL,
59990         0xf639a03db4f2bc63L,0x8a411c36a317a1b6L,0x51edc4c0ed34eb3aL } },
59991     /* 7 << 322 */
59992     { { 0x01511b8a9d6fce5eL,0xb5c7b33f89a2875cL,0xa88e720e2fd79b67L,
59993         0x5337034404229e94L,0x40bb7e7ec94af25cL,0xc11501b99183a7b3L },
59994       { 0x29a4d81fcec3cc7bL,0x143976fdd75b8febL,0xac8dad2cfa261ad0L,
59995         0xb14793006a2db8a8L,0xd4981293929c4a12L,0x5703506fb6eef856L } },
59996     /* 8 << 322 */
59997     { { 0x762a5eec1f5a9609L,0xfe4f5f6a765b337fL,0x0fd534aeaa4f964aL,
59998         0xcf46648ed6526f01L,0xbc62a54a18d71d72L,0x48d94f2a4f8488eaL },
59999       { 0x62c40de7a0c72a86L,0xd73ac51a725dd2efL,0x3a51d7466ab19096L,
60000         0xf07bea4b2dd1ad3dL,0x2a0ec4672ef88078L,0x92598cb3664e435dL } },
60001     /* 9 << 322 */
60002     { { 0xd49f753012fbc44aL,0x769a4fc941c51d91L,0xeb1ed485981fd6a9L,
60003         0x90a4b3cad7daf430L,0x4bbffd5c75d07405L,0xd998a096da671888L },
60004       { 0x0514ad4b6e10976cL,0x5d40328aab11d9ecL,0x86de976bfa180702L,
60005         0x259ca429f6f8a4b7L,0xe08970f05772eb4fL,0xca428fa1b5feb7a7L } },
60006     /* 10 << 322 */
60007     { { 0x9f3d76ae35af4a88L,0x0b92f48a242af3e6L,0xd4f8a37b7165d261L,
60008         0x30e1fa8b2b917832L,0xd26f821f8fdfc06aL,0x75359bcf3669d1a2L },
60009       { 0x0ba3bcebb638331aL,0x8d02c0996c73b62bL,0x2a8c078d8c4f63a5L,
60010         0x55458ccaa312c282L,0x901ea0ea5eaaad9dL,0x03665da20e39eba1L } },
60011     /* 11 << 322 */
60012     { { 0x79a30b82da9affceL,0xafb188567204a29dL,0x2e64e6105a8ed24aL,
60013         0x6bf3695a9e44aa24L,0xc22320690c77fa6cL,0x20b3c69531524429L },
60014       { 0x91e60caad6e0f847L,0xf0fa30c4542d6b57L,0x56a3a66bff98ceffL,
60015         0xec44f0b72c9507a2L,0x4ef13008c37e17e4L,0xc819ae81cda21355L } },
60016     /* 12 << 322 */
60017     { { 0x17c563be1cac0b58L,0x889cfcecb8491347L,0x591d49ac4cd1bfc0L,
60018         0xd4465510d4e53d3bL,0xca95ccf6ad079a6eL,0xce391389b5ea6eb4L },
60019       { 0x600ccc9ca48b6447L,0x20d0c7dbc20d56a8L,0x5f27edc569c6c6e7L,
60020         0xb3fc0f4a586abcdcL,0xdbfdf3f985dbc5b6L,0xfba1cf254ea80fe0L } },
60021     /* 13 << 322 */
60022     { { 0x38d6267e427a9075L,0xd1df12006d63ea4cL,0x9887a99881407b57L,
60023         0x41accae4688e9f0eL,0x33c63c9e10886dc3L,0xf8332ac57574a033L },
60024       { 0x7d77d41f4c636d00L,0xf6f4ca28add70d4bL,0xbe496330c0ee111dL,
60025         0xa4de7670b74bc69dL,0x683a93d369e5eabdL,0x4c5461c710963bd5L } },
60026     /* 14 << 322 */
60027     { { 0x9bbc99b59310424cL,0x6f4bce534568e290L,0x21373f5bc1572fd6L,
60028         0xe5ecd5b6a28b4394L,0xd56968f646ef7bacL,0xcbce8614726cc043L },
60029       { 0xb2fa6101d0a49bd8L,0x65eaa7725a7b41c3L,0x10d7515296e5ae18L,
60030         0xec8f4639af389838L,0xac660d81bccaff25L,0x3c546ba931734025L } },
60031     /* 15 << 322 */
60032     { { 0x81b13d3ee098c584L,0xf8eb4e41fa3460caL,0x1bb889d1f0b905e3L,
60033         0xd158ebe939a3faafL,0x7ad0f829cf09735eL,0xc89611963aa8b3beL },
60034       { 0x522327781be516cbL,0x9118d851ee88d911L,0x35ad130f0bf2a62cL,
60035         0xf35bcf1b39c05087L,0x73b992c3bce42949L,0x93ce50b95b42744dL } },
60036     /* 16 << 322 */
60037     { { 0xee6e7006b515fff5L,0xaedf6e3913258ed5L,0x373adf7dfc45111bL,
60038         0x0c7535b1875c23c8L,0x2a7e04f897039d49L,0xd76787ae9afd1a06L },
60039       { 0x049dd38591b6dc89L,0x8f0c8ad0932dab78L,0xdce057b9925498c2L,
60040         0x7b9c9bd2da25daa3L,0x6d0b70a3d4decb7dL,0x099a218303df76efL } },
60041     /* 17 << 322 */
60042     { { 0xbfaf4b848c5520a2L,0x36fa343fc6741e50L,0xadcc36dcbd5211c4L,
60043         0x2cae5a8514bf0578L,0x8fee4d403fe4171eL,0x2acd2756624d0daeL },
60044       { 0xaf99a323623aa9cbL,0x120cd2038c8191e2L,0x2073e8884068d993L,
60045         0x144851ac579bbf88L,0x54d458a4ee29fa34L,0xb7704255e5e5d676L } },
60046     /* 18 << 322 */
60047     { { 0x02f6e396617dc4bdL,0xbc48c42961497feeL,0xb27487fe0b4d22d7L,
60048         0x33d6b1161d0b0aabL,0x5e21cebad31278e5L,0xf7119a50dacd8f27L },
60049       { 0xe47eff2cc8ab54acL,0x7c7ccd3bbbe16c9cL,0xc056d817c584bafcL,
60050         0x868ead2b97790d9cL,0x8fea6eea1a58126aL,0x67d323640fab2640L } },
60051     /* 19 << 322 */
60052     { { 0xee1a958ffa14b58eL,0x900644f9760b54e3L,0x97fa6fa451579d09L,
60053         0xa7351c3b26e7f95aL,0xc3546595aadfd139L,0x07b7ef48f14f1e6dL },
60054       { 0xc8d100ec4d139608L,0xf98609b2d8741228L,0xf0890d9d33030d3eL,
60055         0x893b874fe28ed106L,0x5439b7aff7bb558aL,0xe68a3adba71a2261L } },
60056     /* 20 << 322 */
60057     { { 0xff54e8bc8acd597bL,0xdae781e94682b8c6L,0xb2265bc4ed1fae2dL,
60058         0xa5e23c29ea983db1L,0x4af5f55909851454L,0xffe9538836eb4506L },
60059       { 0x4c72b2d1c2247b8fL,0xb179573331a67505L,0xb1aa8ad4e19c9c25L,
60060         0xb9cfea953e8b8004L,0x07782d788ac747fdL,0xe23e547fce9d9e41L } },
60061     /* 21 << 322 */
60062     { { 0xbc6b0088fd9e8e72L,0x7e51aa5dc6453462L,0xe8615fb9c8b1725bL,
60063         0x031f0d2a5a371c9bL,0xb9db0a647441d8aeL,0x0dd0446e9d5783c5L },
60064       { 0xb3b7be2381720779L,0x49a8ecbb6cc5a610L,0x165c626152cd016cL,
60065         0x5fcd657da3f6ae6aL,0x30497fbc9f6988dbL,0xd734927936a73fe7L } },
60066     /* 22 << 322 */
60067     { { 0xb30ddd0e388562b4L,0xc485506b1f61067fL,0xf0da517684947c84L,
60068         0x04830cedeb067f33L,0x05084c8262404b76L,0xe7e7efad7996707cL },
60069       { 0xc2a6a57fc78b9a7eL,0x4e55fd8c7bfbf308L,0x204e7c44d1386117L,
60070         0x979ecd5a4e56595eL,0x3bfc790853707b85L,0x2c3a41c59fcc5b7aL } },
60071     /* 23 << 322 */
60072     { { 0xcdbfd951ed6e2671L,0xb72c42ee135f6b96L,0x38c8d1ca40bbb789L,
60073         0xf6fa984cda03f270L,0x76dc5a19ed88deb9L,0xa8c88f2a9985bcd7L },
60074       { 0x2b0d3b66c6628a44L,0xdf679b6a2b311954L,0x30a363c25f851b07L,
60075         0x78a5d242aecdb9cdL,0x42d7ca82a968b4e6L,0xb188e99af2efb94fL } },
60076     /* 24 << 322 */
60077     { { 0x779905b6d8948f95L,0x3c7085b591cd0206L,0xce9af0aa679096dbL,
60078         0xfdf04f10f558913cL,0x05300cb06f24a2e2L,0xf9d9a2f25d581b35L },
60079       { 0x855c8de96a713751L,0xc9ac24bc0e0c0dfbL,0x67612a4197740d65L,
60080         0x7588a52744c9360dL,0x928ac910325cc880L,0xa74abdafacdd3188L } },
60081     /* 25 << 322 */
60082     { { 0x98d80359e7c5fbc7L,0x6abc82b7047c61d5L,0x8d8f5fbd58f2fd49L,
60083         0x321f2426ccb0a4dfL,0x379f10e2e96cac24L,0x34c0444130666763L },
60084       { 0x8dd3972043632c61L,0xb2bbe2eec19f98eeL,0x00d5a467c464dfa3L,
60085         0xa44ceb19a85b6fecL,0x88bf80ddc9b1fa77L,0x7e5123c8e6dda98fL } },
60086     /* 26 << 322 */
60087     { { 0xf73ad540b75a6b88L,0x57bcf1cc08487cc1L,0x00358de735cd0c27L,
60088         0x86d469a2573df808L,0x4884cd5684716abfL,0x0157687fa7da61d7L },
60089       { 0x8efd8acda732c2cfL,0xb6c9bf7198677236L,0x3d1f01826d46c473L,
60090         0xafa65fd82f497476L,0x535ee757e54f17daL,0x432b5878fe7aaef6L } },
60091     /* 27 << 322 */
60092     { { 0xf091c4ff3370e118L,0xabf011ee118d4b8eL,0xb489c4b7a13c7279L,
60093         0xc2dd44e93bfb19feL,0x10b68e92c5d859dcL,0x57935fc39249205eL },
60094       { 0xb97e63b06c929bf4L,0x98cb08a739a25097L,0xb13f17c15eeedf15L,
60095         0x1e27a85c240884feL,0xda1515ad9b601298L,0xe01251fd4ce36c3eL } },
60096     /* 28 << 322 */
60097     { { 0x3774af36ba6aca8aL,0x562fcfb1340e6a03L,0xde45205ec1187539L,
60098         0xf3b114418799c22eL,0xfd53f681e8b0842eL,0x45a0039066d36d64L },
60099       { 0xa2c3391d353eb1e7L,0xf9d9fcc55840eddaL,0x4df1fa4a6ab8ab4aL,
60100         0x2b0cd34bd841a623L,0x52441d79b10b189aL,0xfd86d3c2fa025da7L } },
60101     /* 29 << 322 */
60102     { { 0xe28f3bab5872204bL,0x6f87cbaf0ba35c66L,0x783e85c03d877c60L,
60103         0x376e5e2df132df52L,0x213d53a9bc2cd6faL,0x2e2a573008a13174L },
60104       { 0xc0988fa9ba15290fL,0x51d81b9485456f81L,0xfe371f32a0ef5b80L,
60105         0x9aca060ff129171bL,0x0b02b39e0e402e65L,0x8e6bce1eae9c209cL } },
60106     /* 30 << 322 */
60107     { { 0xb0cb0f0c532f78c8L,0x83113e752d133635L,0x3f64aad5123dc64bL,
60108         0x4d3201c85aee8c59L,0x265905dbe75e8642L,0x9d1d277805f9a759L },
60109       { 0x84778aead9e2a07eL,0xc747cc3a9c0aed31L,0x10d1b4e87af2dc61L,
60110         0xf58a6bd8af0bf23cL,0x83836c2352e1ee75L,0x88c4d1c6d899062dL } },
60111     /* 31 << 322 */
60112     { { 0x27eb26a3f3842d98L,0x90f712b69da68159L,0xd11177052676f05bL,
60113         0xdf603446073bf994L,0x28ad2b498bfcbb7cL,0x6916c6e2e5e1266cL },
60114       { 0x37d516996e98d62bL,0x155d8ef749634968L,0x0676ea286a1b2222L,
60115         0x1dc3f8d71566cb3bL,0x95fb3f177dc6aecbL,0x092f4c8120807b13L } },
60116     /* 32 << 322 */
60117     { { 0x3c6c5618b9d926c2L,0x7e14c3ae4a9099f9L,0xb3259c90ae2fb830L,
60118         0xf7cc6e43ec31a504L,0x83bb13c6126230bdL,0x5a1f4313ff1dae3aL },
60119       { 0x0cc6c1a549b0b65bL,0x67fa836a274a84c2L,0xd454c75fe604a58dL,
60120         0xceadfd912491f872L,0x6c5575da9ce116a5L,0xfaa4903fb24a4481L } },
60121     /* 33 << 322 */
60122     { { 0xc9ade1497c4579f8L,0xdad7eff3be316db0L,0x4ff3abc613fce23dL,
60123         0x09103a75da708e56L,0x4cf139fa8ab52827L,0x0f82219b8f251a68L },
60124       { 0xd19719c7dea33388L,0xa482548423085413L,0xbb63cb43f8eb4b18L,
60125         0xeec33735f3b88079L,0xee79d331de3ddb97L,0x56fc93090e5acf8aL } },
60126     /* 34 << 322 */
60127     { { 0x951a780bcef9c5bbL,0xc37d442ddb35bf11L,0x8e2a0e7d64a776b0L,
60128         0xbf461becc652cf34L,0x3970eb603194f918L,0x2768daedb3bda869L },
60129       { 0x8e81257557b24bf2L,0xae05e2db38dd69cbL,0x0adab288cee2f522L,
60130         0xc7a0e1f148234f13L,0x285f6ee36728c9e9L,0xb9ae7b9fc4541e19L } },
60131     /* 35 << 322 */
60132     { { 0xfd90c5c1f6422b56L,0xd9fc8cce4dfdb947L,0xf3566dc4d088588eL,
60133         0x25dd9e27f22682e6L,0xb077392119b0a532L,0x54da228c0d05a9f9L },
60134       { 0x0f7fda40986f60d4L,0xb6dafff6c9b112feL,0x7eb99e1a4abfdfcaL,
60135         0xed499eb9389611caL,0xf230d6d6f251477bL,0xc09d328c227ecc92L } },
60136     /* 36 << 322 */
60137     { { 0x9b21ef6c16cdcfeaL,0x233be0c3694edecfL,0x110243df7c49c931L,
60138         0x03a59a2ea3113ed1L,0x6470f721023c9a77L,0x7d1640c88e9ff099L },
60139       { 0xc21488316f2c7b37L,0x9e1c9e1dac6eebc7L,0x6af65a671109ca9cL,
60140         0x8379fdd9cc6f80d9L,0x33f74ade7e666a4fL,0x07ac728b7be081a5L } },
60141     /* 37 << 322 */
60142     { { 0xa3df31a312354705L,0xffc8fdfc1aec1bd7L,0xd9dd39c112cc342cL,
60143         0x8077a57e37bf43fcL,0x0f037ce49cb8751eL,0x5740f6b5b805b530L },
60144       { 0xd26422704e2b5b93L,0x114bb1f02dc158efL,0x71881767a9bec3d1L,
60145         0x1174386d266d95cfL,0xa373d7ea7cdd4461L,0xaf4f7b40d814a33eL } },
60146     /* 38 << 322 */
60147     { { 0x0db94a18f79761beL,0x263e2acb5717b98cL,0x78c28d8182567b0eL,
60148         0xce1b366b893c35b4L,0x1e20b1bc0d6907a7L,0xd6f123474b973588L },
60149       { 0xfb945471f717e91bL,0xef85653cb027bd4dL,0x048e9e1df07dc0e1L,
60150         0xc494aa9cc163b83dL,0xfaec72d3021b4fa5L,0x5c63c30fc9869fe6L } },
60151     /* 39 << 322 */
60152     { { 0x2dfa058d510d8d86L,0x772fad416a89aa0cL,0xdf55d15cd586f23dL,
60153         0x7d96b7a989b604f6L,0x352fe049a38d821bL,0xfc56b8df4fbb5795L },
60154       { 0x264122b4b3d5dd0bL,0x89317f4a980177d9L,0xc060ab4a13e2aeecL,
60155         0xc2676725e2cafc87L,0x78863cf45eb1df3cL,0x2e1572dc0ab1a715L } },
60156     /* 40 << 322 */
60157     { { 0x7a8a898d5a4703aaL,0xc59933ea1cd6f9d6L,0x703265f5d28124cdL,
60158         0xe1c1bee10178d1feL,0x9ff31cd4241262e9L,0x9174a939a3c9f80fL },
60159       { 0x0f7a3d2dbc2a62eeL,0x0454051c62f1b3acL,0x83502c9ea2421254L,
60160         0xb4fa51fcb684199bL,0x257e9e2bc5e36a44L,0x14efeed597d8647fL } },
60161     /* 41 << 322 */
60162     { { 0x09bddbc28f2b12baL,0x8af83a779b7f1c14L,0x88f9b4d3bcc934bbL,
60163         0x8d8312df8d072340L,0x2ee105bc615989dcL,0x6044fa00de3bab08L },
60164       { 0x98c499d603cc86ffL,0xf0b48aa7c5068033L,0xdaa536d2c96606d8L,
60165         0xef905aa2bc6a843eL,0xb6f108ee8ac620ecL,0x0dec7dfbb6dd66f9L } },
60166     /* 42 << 322 */
60167     { { 0xb9157d4ab0fe18a8L,0x139bbcbc68cc7a70L,0xd546a06d7dea2914L,
60168         0x8db142d4a01cc59aL,0x127ce2d9aa09fcdfL,0x3950a5a63bfef8deL },
60169       { 0xf41ef6d42527522aL,0x4b4e6f107e6fb19cL,0x2a2735d1345788c5L,
60170         0x87963e1ee72a7ae3L,0xb58d8934fc443360L,0x93552692b16b6f2eL } },
60171     /* 43 << 322 */
60172     { { 0x70591a849518f0c7L,0x5c282b6fc67c438fL,0xdbf61b6b100facc1L,
60173         0x3c5d969f2bf2a5beL,0xe1a0c6cbab980c70L,0x70f4981c680619fdL },
60174       { 0xc6905d7cc65be256L,0xde3340fbb5c27acdL,0x17be9d182c1b3fbcL,
60175         0xd584e4f96fb00b1dL,0xac5dc14eb819646fL,0xf5c3279a3242935bL } },
60176     /* 44 << 322 */
60177     { { 0xfdb13b31be970ebaL,0x119b1c08b0bfadc2L,0xed62f35e21875542L,
60178         0x73c8f9b0349a6d12L,0x8c35d8f8bd1622c0L,0x501b9d288b6521a0L },
60179       { 0x377f8fa1c918b2d5L,0xe2a9580cd0239ef9L,0xee24f4f0371d7bebL,
60180         0x4cc697a669231b47L,0xa55193c8dc4c5a07L,0xd4e51e1db0ab8507L } },
60181     /* 45 << 322 */
60182     { { 0xcb811c27265f267fL,0xb85593aa9e2688f4L,0x57a1969dd76bf364L,
60183         0xc29946c9014483a2L,0x5bdd72490915bddeL,0xba6d13ff22746ae4L },
60184       { 0x524121e0d25f6b7bL,0x9011309e0d68a3f9L,0xf25e89ccdb91c66cL,
60185         0xae79cad781df593aL,0xef8c6bec4f103231L,0x832659c3e038f02eL } },
60186     /* 46 << 322 */
60187     { { 0xd58eeece37761959L,0xba6d8ab5b328f084L,0x3911e6ae324a6706L,
60188         0x299921c8ad139296L,0xb81a3fe4f6b8d9e1L,0x2680c46f5ef06a6cL },
60189       { 0xab9cdf368611d63cL,0x6c9fa5b3cc0a5da8L,0x712356a3da4d4412L,
60190         0xc1707a10cd3f550dL,0x5c25b2f3ce468303L,0xe4be20bffa546b6aL } },
60191     /* 47 << 322 */
60192     { { 0x797a2919515ee1dfL,0x65dd5991119dc9d3L,0x82e8201b41e4c5ffL,
60193         0xd27b35130d3dd45aL,0x9ba590c5b13b2dd7L,0x0f15b35282992935L },
60194       { 0xef39971e227e4e46L,0xb74c524b2786fd6dL,0xe09c28ec71b1579eL,
60195         0x0d1418e285f6a935L,0x173265448719fbe7L,0xfe3b1d831200b35dL } },
60196     /* 48 << 322 */
60197     { { 0x6e96a8195cecb21fL,0x3a58d8b2d8beecaeL,0x93c3cbb0c0c715a8L,
60198         0xfb06f977541759b7L,0xf25ba095771c3d2cL,0x7560446ea3bfd322L },
60199       { 0x7cd99f35a015cb4fL,0xa0e541960786f235L,0x0f868f768b8e291aL,
60200         0xc8260b0b2f95050bL,0xaf38376ef4c0a462L,0x2b3c0f3b98a3395dL } },
60201     /* 49 << 322 */
60202     { { 0x99d4529efed6a724L,0xc6f1b084071d8d31L,0x6c48062ba097da1fL,
60203         0x1dd10493301c1d74L,0x5288f194f554cbccL,0x77b1b81f39dd42c7L },
60204       { 0xeb1f2d53a007a6d8L,0x43bed54e05648d75L,0x1a85326f29801a1eL,
60205         0xcb9a91a4f564d78aL,0x4f38fc7893f071deL,0x920117d8aeeeb5adL } },
60206     /* 50 << 322 */
60207     { { 0x709b5904b35cba78L,0xef0c321021b11d3dL,0x38f07eec46844b18L,
60208         0x2e79f99934870a55L,0x9e9df80400d7b924L,0x857a95625cafba4bL },
60209       { 0xef8ab68f4adfea6fL,0x4a83bfc16ea764e1L,0x21f4c75475e8d874L,
60210         0xa3597f526ecdf5d1L,0x9d3a4766eff2e1e6L,0x9872db39e5e6ae81L } },
60211     /* 51 << 322 */
60212     { { 0x42d9f39e99bb9a10L,0xe617263ce35e4852L,0xb3f8ace1a06b71d0L,
60213         0x861520de6419d9d1L,0xc2c521cf37b1fe38L,0xd537001b9edf9936L },
60214       { 0x92614b9f39af94e7L,0xd2003f2e25286664L,0x249d04aeb836d4b1L,
60215         0x3c6c192ab26df88cL,0x6e0b25442c72ec0eL,0x69d7f6d7497f03dcL } },
60216     /* 52 << 322 */
60217     { { 0xbb5a95f6293cc00fL,0xb202a82a65fb729eL,0x819c26aa12e35774L,
60218         0x70cd5237c2b3f0b2L,0xa752224a89b2c5ccL,0x71c09cbd0ec89df5L },
60219       { 0xb849e352bab45d24L,0x290f0307d313f461L,0xf083031cee885e9dL,
60220         0xdf42a973a60bf2faL,0xe39f2118d4842999L,0x8b54cf1d0508febeL } },
60221     /* 53 << 322 */
60222     { { 0x8942b4df0d846a3cL,0x18db708662b6605cL,0x6549e019fafa6508L,
60223         0x85d97fce43ef9443L,0xe9f13da373485de4L,0x5743297bb0f46e8dL },
60224       { 0xc52781bb70908255L,0xcd88a48a6bc6e666L,0xf857caa5eb4f54d1L,
60225         0x32dc925320974dfaL,0x6dc79fad965146e6L,0x24e3a8d2edc1f747L } },
60226     /* 54 << 322 */
60227     { { 0x1993fa650e81671fL,0xc6acd9f3dd1a1e4fL,0x227edd1a7bf36f1cL,
60228         0x4ad2478370867ca3L,0xed0254f758b9a7c2L,0x63fe279a7013a5a4L },
60229       { 0xa65787ee232e6a88L,0x5faceda487161d5cL,0x36e351b603d64c37L,
60230         0xaa265f1de9e30871L,0xbf3432f521e6f66bL,0x69d68c068621289dL } },
60231     /* 55 << 322 */
60232     { { 0xd2bd143ea0807eeaL,0x474ad99582568efeL,0x0fcd6bba7d482c5fL,
60233         0xf83e6f15e2628f4eL,0x314508252210e41cL,0x8f0a9402f47de776L },
60234       { 0x7f20bc562ee4d1e0L,0xed4157de791aa7a7L,0xbe443399be2dee9aL,
60235         0xb461643371625f13L,0x1be21ba8771f55c6L,0x04b3035a300fc187L } },
60236     /* 56 << 322 */
60237     { { 0x0952b888b9d0bdf0L,0x3973763c8ce32fb7L,0x221f0ba56dd860c7L,
60238         0xbb7a27feb16ac501L,0xf113b194bc8fe58fL,0x18f3297a65839ffbL },
60239       { 0xa2d4eb7c8dc30003L,0x3fb4b4878e334479L,0xa4f32c651a8310e3L,
60240         0x944cd644f78f46acL,0x14e40c4af96fb91fL,0xc31402bd4ddf6e72L } },
60241     /* 57 << 322 */
60242     { { 0x9eb2c9e51ff0ab88L,0x0a29fc0695cc3436L,0x3f4b4ebdbd298127L,
60243         0xeb8ad8b52ef56848L,0x6159700f5b211ff6L,0x8fb98f2fc3a67bc0L },
60244       { 0x5c5998ffbd195b66L,0xea99d6767e44a64bL,0x314316e4bafd1471L,
60245         0xb5f48757cc8c0e77L,0x922a91d15b259ac8L,0x2458279cf9fc4e4eL } },
60246     /* 58 << 322 */
60247     { { 0x945c5a3c6aac3e97L,0x5cbdfad9a266ad50L,0xa3e38114fe59f5ceL,
60248         0x1ca1cfdace3ae206L,0xbe1f15e12a84cfdcL,0x682514726a12ec3fL },
60249       { 0x48409f871f57341aL,0x632c369e8461bf7fL,0x1c96fc87d8865ed4L,
60250         0x1727934ae1ffc51aL,0xa60f0ebb6d71f51dL,0xb6c354052e411888L } },
60251     /* 59 << 322 */
60252     { { 0xc7b3d3bb72a77726L,0x04b9bdfbbdb03d78L,0xdbdbaa7e2fe88db4L,
60253         0xc5848e58564710b6L,0x7bbd84863ec55713L,0x1b5aea5670183191L },
60254       { 0x95d91bb25340d9b7L,0x9a1462e4187a3252L,0x5cee9b8cec352fedL,
60255         0x7db8350137049284L,0xa1d2822cd3b714f3L,0xe4cf6d53c2e51da6L } },
60256     /* 60 << 322 */
60257     { { 0xdb2a2ac9a63f6f62L,0x4c0d2da695f20639L,0xa485a6adb475e177L,
60258         0xf6dad8b5aa93055fL,0xafcc1e954974bc52L,0x6686940224fcf32fL },
60259       { 0x10c138bfc103b013L,0xe74ea82bc6faba1bL,0xddb399c581824de5L,
60260         0xae797b70cdaad079L,0xc648e7ad6ea955e2L,0xd07c5c919be79db6L } },
60261     /* 61 << 322 */
60262     { { 0xf4b7a33b39d93befL,0x4be176f9659da9f0L,0xbf57d975f36642cdL,
60263         0xe10b452d16d5528cL,0x7c062421a6bdd74bL,0xc093e346e7aa1d9eL },
60264       { 0xb7cc38cc2f5c19ddL,0x9fc7f69b230c8790L,0x9b667acd5e3c5282L,
60265         0x1cade31144cd22ebL,0x53a0d702bb43a1e4L,0xb25868777906519eL } },
60266     /* 62 << 322 */
60267     { { 0x46e2415deb5003acL,0x05aee8855e8a6a0aL,0xbda9f162bbaf343dL,
60268         0x658b350b21853341L,0xaf6b4948ced47246L,0x1d454740723cd3bfL },
60269       { 0xc4b7ce3fe1aaef54L,0x619420daa35c9e24L,0x65d455b14eb7a52cL,
60270         0x2f9b700a4c961515L,0xa5b7b962d3aed448L,0x4e32a6d937851d3fL } },
60271     /* 63 << 322 */
60272     { { 0x2c4c1b2ed00f8cb9L,0xbf83ba500fd305aeL,0xb75bcf9f801a8e64L,
60273         0xd8ab465ccba76b29L,0xf5a2bcd74ea718f4L,0x81501d563b592ae0L },
60274       { 0x9734e4e26ae6bac5L,0xc4860b0eee304e5eL,0x8bd59b7b1d59f1acL,
60275         0x7c9497e8e799594dL,0x4bc6634c08292918L,0xc45583aa92619229L } },
60276     /* 64 << 322 */
60277     { { 0xc5ad791eb45a8002L,0x4a23fd68ba2d7a40L,0x673b9e4998544bc4L,
60278         0x934d8f55d273c360L,0x7fb48d0768a75a8cL,0x2e6201055e0fac97L },
60279       { 0xbe01655ff10ed580L,0xd21d52ae9e96731fL,0x74f830de53325138L,
60280         0xa7240331de9f3fc5L,0x96b25206a7e01fa5L,0x3fcfedee07eda4b4L } },
60281     /* 0 << 329 */
60282     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
60283       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
60284     /* 1 << 329 */
60285     { { 0x3e6e93818d5c039fL,0x809494228a8d2cc9L,0xf2d7c8b4b843ec06L,
60286         0x0055d882af8a23f1L,0xe848010ed3792335L,0x9b41a55f55e08e74L },
60287       { 0x956ea8e95de83059L,0xf159a9973263678eL,0x5f7b9271cca1b548L,
60288         0xd41d2281f1d0b7f1L,0xb187047b5c9963fbL,0x213ff6af02536cd8L } },
60289     /* 2 << 329 */
60290     { { 0xe51a95700d0fa76cL,0x67c7890e4d2e9c8eL,0xc6160fa2f974d2cbL,
60291         0xe00474f74c6a78deL,0xee916e510ac89d11L,0x1adad97af826f133L },
60292       { 0x3fc65d3f8d2d77f3L,0xda9420750ba6c300L,0x5237a82e0b9196b1L,
60293         0x4975e680a572b6f5L,0x41ea8b92b9bed2bcL,0xbe0ad7109826825eL } },
60294     /* 3 << 329 */
60295     { { 0x06f721d30a9ec81fL,0xf0359222034f3e78L,0xc5ca6b7a5a44ffd9L,
60296         0xc53e328915764390L,0x7f16917459747d7dL,0xc3a9981461f79122L },
60297       { 0x099f4e3a97aa46f7L,0xcb0570c9d70458a6L,0x270a43576b72f327L,
60298         0x9d6bb26cc33695bdL,0x60f9202126224902L,0x8eb0e108e1b0a51fL } },
60299     /* 4 << 329 */
60300     { { 0x8a390dca9fcaba39L,0x3879f0b4278d22b3L,0x77bbea69bc5e82f1L,
60301         0x71f02e2d4628d6f1L,0x6260790cf968e240L,0x1c7f3df5665270eeL },
60302       { 0x336395451a87b1c8L,0x2011fd214ffd9fb8L,0x69060f867807ed55L,
60303         0x1b0ac0119dfa452cL,0xbbdb25fe06d27c0dL,0x5c25d23aa60ef90cL } },
60304     /* 5 << 329 */
60305     { { 0xc08dc153d9f75d6bL,0x5c1f07e7a0330237L,0xb3e6fb677d67a5c9L,
60306         0xca949ed098f9faddL,0x48b16b2dd7720835L,0xfdb1b735fee4d341L },
60307       { 0x1a6b37b1debf3207L,0x5b3eeb1e3218c63aL,0xc19b57b504c23b30L,
60308         0x178bd3bb40669e2dL,0x74e57b26fb6b162cL,0xc3626931a0932b58L } },
60309     /* 6 << 329 */
60310     { { 0xd3eb69e4734b2e9cL,0x1c2754e2c35ff1b3L,0xa26681e69f3e8c51L,
60311         0x7892ad11a2cae737L,0x88b1da43cbd8bda6L,0x8a576942419d21c4L },
60312       { 0x7c124343c90f4545L,0xa5a8d93b26453baeL,0x9a4c08fd76ae72e8L,
60313         0xa08b82d97b064e94L,0x4f803ba083725330L,0x33672455865235f3L } },
60314     /* 7 << 329 */
60315     { { 0xf7a5e2f0a51e695fL,0x3099bf9484adf10bL,0xb2a03c0f22a3ff04L,
60316         0x30303a910acec674L,0xaccb2f3ca59522f8L,0x00ff4d88f273ba94L },
60317       { 0xf0056b4210e735ebL,0x3337279a7786e93bL,0xfecc77c44bb3c31dL,
60318         0x3385bf5be0e26a05L,0xa9454ab85f45fcbfL,0x41a4158346edb553L } },
60319     /* 8 << 329 */
60320     { { 0x1877dfd0c8110f1fL,0xea88f59d18db27c2L,0x9d089536c78e295eL,
60321         0xcbb5d55374a04cc5L,0xe3666006827f75edL,0x8557b81a61e7378cL },
60322       { 0x74170170ed223f48L,0x84197a6ed86ee829L,0xd75a30f8ac1c4a0fL,
60323         0xd7e7be0d3cd92824L,0x5ea0abdb1b5e86d4L,0x41146ae1b3b615efL } },
60324     /* 9 << 329 */
60325     { { 0x6d340fd3fabd376bL,0xb5066b1ccc169cb3L,0xa4148142d20ef8f1L,
60326         0x0c5d66fb461544d0L,0x84c7a232d67043d2L,0x4c0e77867e609af4L },
60327       { 0xb1e83f1af4619e4eL,0x40fca1a0b225d174L,0x39bb3a882e42fa4dL,
60328         0x04dfe833d2682205L,0x49016d9d685296f8L,0x2da587198b735155L } },
60329     /* 10 << 329 */
60330     { { 0x570deceb1ae5e9daL,0x5c079c70b73ead01L,0x522a30a6d2ce6639L,
60331         0x71dc5c3ff4056ac9L,0xd93c7a2dbaac149fL,0x5c3298b8f1844cebL },
60332       { 0x282adf408c23c0dcL,0xbe4981899b646f86L,0xe77c1950628da9e5L,
60333         0x38cc27baa1fd5a18L,0xb5579728aacdca52L,0x8d34fdb4c8e1ecbdL } },
60334     /* 11 << 329 */
60335     { { 0x563e0b8a7a7fa597L,0x6697c375bb7dd079L,0x95758ff6c6233951L,
60336         0xca07993fa2059c40L,0xc3065507ce2aaefcL,0x9faed33c6ea927d5L },
60337       { 0x0f8b48241207247eL,0x0044f6115eb2263aL,0xd7c9ce7c851596fcL,
60338         0x54729d523c69d424L,0x42cbdcca45876770L,0xc1e0e6ceeff2adcbL } },
60339     /* 12 << 329 */
60340     { { 0x323f2102adea7d6aL,0x035b354eb694b253L,0x66dc4e4a5b8a36c2L,
60341         0xb609222471795ca4L,0xd8c6d7eed300d80fL,0xf31f258db3b94954L },
60342       { 0x0f2eb679277ced5bL,0x0b16efa3eba40e3fL,0x400035070dca4f36L,
60343         0xd34c91cb59a9a3a1L,0x5e8fea3286da6408L,0xf237959f03f31728L } },
60344     /* 13 << 329 */
60345     { { 0x1d3173653412e8d3L,0x1d14cd1b09695abbL,0x9044adf2a2cda00cL,
60346         0x60a6ccd60b7ba011L,0x614b100417284b46L,0xfb3d84b9cf840203L },
60347       { 0xd65b3566532b068dL,0xc8c03996c2465150L,0xc9035c2df71c35f4L,
60348         0x350231a752222e21L,0x59440020451935b1L,0xd723a55cccfdd206L } },
60349     /* 14 << 329 */
60350     { { 0x1b5bc630bbaaedc6L,0xe7d25088b49cbb3bL,0x5622cbf70deb8cf0L,
60351         0x3b20803cd309c3baL,0x64c2e7deff45e2fcL,0xfa730ffb9aab84a5L },
60352       { 0xba83cc514edfb52eL,0xe05c0140748bbd69L,0x27bbb5f52254ec43L,
60353         0xca740989324c8c40L,0xa21488b1d26491b4L,0xe2753a1f69d8626bL } },
60354     /* 15 << 329 */
60355     { { 0xea04908f64dab001L,0x8ea1f127b4debb2eL,0x87adb69534f155a0L,
60356         0x41595cfcca8afe0bL,0xffef042f8763ba08L,0xb7b4865decd3e667L },
60357       { 0x2c46c97070c4c8a3L,0x1ab18c080403d206L,0x08b2d3c94b3df379L,
60358         0xc6a4c268a87a7166L,0x449bc61f5323b1f0L,0x8d4b7ced489ada74L } },
60359     /* 16 << 329 */
60360     { { 0x618ca06b8956146cL,0xd51f1e6f552cdecfL,0x981372cca3b6ce7dL,
60361         0xb44a68ee5f14bb57L,0xfc1167e96373abbbL,0x3d621f8b767d4c0aL },
60362       { 0xc6dcdfebf6ecc778L,0xddda926282d1fbddL,0x477501aabfcbf2f7L,
60363         0x0be7228a67aa8277L,0x5de7b8331daab9cdL,0xb88a4f9a262feb4aL } },
60364     /* 17 << 329 */
60365     { { 0x203a666c608fea53L,0xbf71f8fde8979c08L,0x3bd58feba22a3d2cL,
60366         0x596bfcf521f178a1L,0x6f207d89f84beffcL,0x8a7c6dbb18097607L },
60367       { 0x208f5e64a1c5c927L,0xd7d0e33478dc83c3L,0x5e9397261d4e30f5L,
60368         0xf3877242fa09a36cL,0x68e4338ae6a7b0feL,0xcf8cd131ac47b369L } },
60369     /* 18 << 329 */
60370     { { 0x28f18586936fb33fL,0x9809b2ab381bf7bbL,0xf6e16931eac3c252L,
60371         0x366d18335e151187L,0xe5b4c2357a3b6460L,0x693a9fa50a68bc91L },
60372       { 0xa35f104a6a7f8b6eL,0x3e5d6981688676c4L,0xc0c081b10651a609L,
60373         0x6df5da2dd77057c9L,0x8bb271bbc4602847L,0x322547b3c4bd07d8L } },
60374     /* 19 << 329 */
60375     { { 0x9b56b9444deb8158L,0x5f4b15a6da5eb70fL,0x120afa9514cb0126L,
60376         0x01f6d00d6bdd0d78L,0x73dd7c5c463b1ce6L,0xc770cf35df00a133L },
60377       { 0xb5db93a1247ff879L,0x1c12f3f0c70ecea1L,0x10168c4e5b59cc9cL,
60378         0x1e9e0f8a0e19efe5L,0x43987dc1cfd44b62L,0xb1d265c204814e2dL } },
60379     /* 20 << 329 */
60380     { { 0x8c283529233d39e4L,0x96300796c6092096L,0x2c549de55dde766cL,
60381         0x27e0b444b4151002L,0x802e5fc3f2f88f1bL,0x2af579c28ba1956dL },
60382       { 0x52edd04ed68196c7L,0x2e22e71474a202b0L,0x338948248bf66459L,
60383         0x8f0d8c259e39df55L,0xee4f109e6c5276d9L,0xc0c893f0c5dc0bf0L } },
60384     /* 21 << 329 */
60385     { { 0xa3081bc75b3f17e5L,0x299e7a0222e46b9dL,0x36184c98a9afa278L,
60386         0xee2043319095a8a1L,0xf5e54622cd5ac080L,0x08d649013fa844a4L },
60387       { 0xb20ddfc6d7fbb42bL,0x15130bdbd868a81eL,0x25e5fd2f32ff1a03L,
60388         0x907e3c01ca5288d3L,0x2f2f7496a1f6f96cL,0x831feefd38ab83d9L } },
60389     /* 22 << 329 */
60390     { { 0x06054c76f8482849L,0xc24b4a6a5fcca65dL,0x71c27e01a17ebda3L,
60391         0x1ffce0281be9dfb8L,0x3784c950ebc43854L,0xcf0ecc2dd5086510L },
60392       { 0x86d0fc3cbe24d8ebL,0x5bad01911f21788eL,0xe2c3bcb9c49b3a12L,
60393         0x66f82433f7d5992dL,0xf7cc5eb913969246L,0xe52defd48660a6daL } },
60394     /* 23 << 329 */
60395     { { 0xd6d6a42b102490deL,0x9e6532acf40d27d7L,0xcd1591cdf2a08bbeL,
60396         0x973e09f234eb47ccL,0xb3a5915add4fa316L,0xb36ca6ceac38218dL },
60397       { 0x73d370b3e58a0cafL,0xbc8fd39f07766be2L,0x3d5d9ef7c2ea7997L,
60398         0x22877500bbfcc1a7L,0xc54d0c6406e0547aL,0xf7bc1d2d564e9ef1L } },
60399     /* 24 << 329 */
60400     { { 0x7a9623b653fd1a04L,0x13bd35bf3a3b8500L,0xf8a5dec9e0f8e530L,
60401         0x88bcbe291d65dcd4L,0x09fe38036739541cL,0xebd04b7fe716a97aL },
60402       { 0xbd8e34df1e5ef7cbL,0xddfc4243d7c4fd6cL,0x0183d9053519411fL,
60403         0x63450996f7a3c483L,0x18283cea01355739L,0x8c1d72cf9aaa72f7L } },
60404     /* 25 << 329 */
60405     { { 0xffcd4b6f9be9ff57L,0x0bff01bb939327efL,0xde596626b5ed90e3L,
60406         0xc07464ff4379e17cL,0xefd3e2c470d31340L,0x78b2192f4e7df61bL },
60407       { 0x7cfe28def3faf2fcL,0xd2d1a994dd642f87L,0xa5d4fb1410b3377eL,
60408         0x2cb4978ead6fa00aL,0x5b6fe7a765fb3688L,0xc26c1b3336d5acdeL } },
60409     /* 26 << 329 */
60410     { { 0x551e1b4e8dc72468L,0x8a926cb2a7b2f1acL,0xb873e83b0fd12fadL,
60411         0xb6cde14fa4e7fb13L,0x81ae41415befc256L,0xffb0c636b4c7631cL },
60412       { 0x80f1408f8a2478feL,0xde6d051d44fa7605L,0x5a15b1f84d44a1e4L,
60413         0x1a0031c5a0daafe3L,0x304338dd597652a7L,0x6830dcc7f257f17aL } },
60414     /* 27 << 329 */
60415     { { 0x62fae4072fdc8ea4L,0xff77522fcbe76ee3L,0x5fa03a454fd2bae6L,
60416         0x774c635e8dc90431L,0x718081b62ddc4376L,0xf4901a2c03e7aec7L },
60417       { 0x5339a3109eb023d7L,0x15dd4f96366e35f7L,0x1f802d4a0e2d2e95L,
60418         0x8e5e9cb2fe1b1226L,0x175806f623a0de5cL,0x115a97db068c7bbdL } },
60419     /* 28 << 329 */
60420     { { 0x4a67ec76193aabbcL,0x3da6dec6d74761f9L,0x751720c90b35bb70L,
60421         0xe5e049058d9e0f8bL,0x3cd37c840858f29cL,0x7ff1abfbb881733eL },
60422       { 0xa0c2698b0c4f7694L,0xc736419296b95e4eL,0xcfa55c5537ece651L,
60423         0xa2bbd6ae7cb1e9e1L,0xcd2292b9a0eb0e8aL,0x8aba99e18d5030d0L } },
60424     /* 29 << 329 */
60425     { { 0xa3f508a498fa3d8cL,0x4d894cbf45bcff40L,0xbcdac17d0c095cc4L,
60426         0x397caa6f407c2ed8L,0x2195056b5f97b4a9L,0x41eb6e0e97434508L },
60427       { 0xbb5e4e4a73f211f8L,0x5e8e638f720a451cL,0x8470bc9e4974252dL,
60428         0xc487aae29f6a9a96L,0xaa66417101165deaL,0xc8af7172b603771bL } },
60429     /* 30 << 329 */
60430     { { 0xb7c74c58dc4a1d3eL,0xe3ec30160331ea39L,0x83afb271023c8712L,
60431         0xc2670d56c9c82680L,0xd426f350feca1061L,0xe8aee692ba6edc01L },
60432       { 0xc916fbe546e801d9L,0xcb001c377097286eL,0xfcf79d2678ee1328L,
60433         0xb05b0634b6a4afb3L,0x2ab327bb306da14fL,0xc11a0294ba5ff534L } },
60434     /* 31 << 329 */
60435     { { 0xcaa287c30f00dfcaL,0x9ca672930601cc7eL,0x435e883fb105d00fL,
60436         0xf9cddbf91238536aL,0xda604ccb45f558c3L,0x7e51d9d182f48366L },
60437       { 0xc1e8d50d7e8396c3L,0x58638b85edbb75e3L,0xe926aabe9b088d2eL,
60438         0x8103a34a428c41e3L,0x03e5e35d089deeedL,0x64969c6d93bb0b99L } },
60439     /* 32 << 329 */
60440     { { 0x7b7da028e19763ddL,0x662f54df8b98ff78L,0xc056d83c51f3dbd9L,
60441         0xe2f4d46fa91d085aL,0x31759c9ceb35262dL,0x624d0cf20c9dd29eL },
60442       { 0x108cf9bb1624b02dL,0xa241444e345531d6L,0xf69816b273d372b2L,
60443         0x126575a7d5415e53L,0x546bb4c1306b8b0eL,0x82bb0c124d54ea5eL } },
60444     /* 33 << 329 */
60445     { { 0x85b355304c397362L,0x218a3b0eeda72e19L,0xd8eae54461729c56L,
60446         0x3d9b4a62735b571dL,0x12f3ee775629e437L,0xa72f9809095e5378L },
60447       { 0x5420a641bbe6dd1eL,0x8121eb3d02f41fe9L,0x5698eaf945e7acbaL,
60448         0x8a5e1a89469c2f12L,0x801740e25b434e0fL,0xa4dbe1cc670f58bcL } },
60449     /* 34 << 329 */
60450     { { 0x2f1919df5819e9f2L,0x156489e7a62287a9L,0xed038deb20a0c2caL,
60451         0xf63ac2d5c5ab4fdcL,0xca2b648ce391ec06L,0x8258e3f45b047d2eL },
60452       { 0xb7dcff56fd17b40aL,0xa8ace11f4bed747eL,0x542d70d175018429L,
60453         0x6c568967951bb2e2L,0xce420f73bb0e089cL,0xdae9623ed13f8eb5L } },
60454     /* 35 << 329 */
60455     { { 0x2d561034009a41d3L,0xf078204f5734d3a1L,0x2b8973ff7408e71fL,
60456         0x07cb9f95aab9c533L,0x376c1f59d0b35fffL,0x4a756c7fe851b313L },
60457       { 0xdc690e9874dedeaaL,0x625b082f70cf3f5cL,0x44839b5803dfc301L,
60458         0x5835a6c3c520f618L,0x695425e3afdb68d5L,0xc04ce4c62db97ee7L } },
60459     /* 36 << 329 */
60460     { { 0xc1d9b27ecb5833e7L,0x9911909567a8a669L,0x9317f8c30ab9ee27L,
60461         0xfad65eb9f34551e6L,0x7725ec2e016504f6L,0xca492cb47ebbdfc1L },
60462       { 0x6d2a3c962706aa66L,0x53e6d650836d8ee2L,0x109496434bc84bf3L,
60463         0x8442ee826df7c0f1L,0x7ab2eb9918fe80c5L,0x6a8579b35cd2ea35L } },
60464     /* 37 << 329 */
60465     { { 0x96adba7706e80e68L,0xa8839d6a0fe580e1L,0x755227e337a31a9bL,
60466         0x40b5fc70e27ec051L,0xb900a11b29af222aL,0x8fea2e509dd84811L },
60467       { 0x4f844c8861b59ab3L,0x26739874560c0948L,0xb39f85ba0cc08828L,
60468         0xcdce2fca829082edL,0xbd17998eb4555dceL,0x827eae97a3608a9fL } },
60469     /* 38 << 329 */
60470     { { 0xa77087f4c98e17c4L,0x9fa12dadbe2985a5L,0xa68cabc94bdce4e2L,
60471         0x222a6fb6d3500913L,0x15e28fd5a9c0904eL,0xed31c63f7a91f825L },
60472       { 0x9cd9f3e56f2f35b0L,0xa2b14261923cab8dL,0x71a780516d8ccbeaL,
60473         0xf1fe532bdfa937b4L,0x6e3d7252539d0a74L,0x27ef2720814cd797L } },
60474     /* 39 << 329 */
60475     { { 0x8bd8341e6899b9bfL,0xc2ea111680865aedL,0x0cabb5cf13fed0e6L,
60476         0xa11e82c1e4ce70c0L,0xefe3d4eb99aba16aL,0xd774db4dd8df10c3L },
60477       { 0x72ee5c98bae14dbaL,0x9161d0b179b86e02L,0x1ba8b84585e5ba90L,
60478         0x3830148f17228bdfL,0x222499e2ba89b2a5L,0x5d50922cccd4f87eL } },
60479     /* 40 << 329 */
60480     { { 0x81dd074e4398751eL,0x87b11b480a3f3ebcL,0xb5afe1f0352b58f5L,
60481         0x6d2d94829c390eefL,0xd073f9a0f36a8d23L,0xa7c5abec466ebbe5L },
60482       { 0x968c04a60539f145L,0x52a3ad0c93f4d3d3L,0x98e196bb15c0970bL,
60483         0x2af28ea370ab8ddaL,0xb912fbda7a039fa9L,0x3dd8d87acbd02ff6L } },
60484     /* 41 << 329 */
60485     { { 0x849b2f0b4ee5ebb7L,0xfd1b015158bea2f9L,0x260a6b5bfbc530f9L,
60486         0x2b6c198d06776366L,0x6540793f8074c6d2L,0x1c722c259871be11L },
60487       { 0x8ce5241ce0560ce9L,0x3574db548096df0cL,0x1d9dd078b0fb8c98L,
60488         0x6049c7f25625a023L,0xd2c0853cb18d0dd0L,0x5e57bd71cd645f78L } },
60489     /* 42 << 329 */
60490     { { 0x8da9b831361ce377L,0x6496515b7dc06076L,0x870e7df3b8cba83eL,
60491         0x315ac0049f8f495bL,0x1a09dee576fe0978L,0xae7af621c18059a2L },
60492       { 0x2bc9dea404fac2afL,0xc630bd5021b90a79L,0xbded6b8628c0f9a1L,
60493         0x709d72c7be4fe93cL,0x3d1e2eed74b22303L,0xcdaf6b1d0e81dfcaL } },
60494     /* 43 << 329 */
60495     { { 0x42d004f3be8ec138L,0x5379a3063d617cfeL,0xcbbd274ec1a87d06L,
60496         0xb9967c5284c9df0dL,0x0238d715c421e288L,0x787ee6abd239639fL },
60497       { 0x746e4071adace009L,0x2e2545db61377666L,0x47cc241cf07deb1fL,
60498         0x0a0742f1847dee19L,0x50175dd06e59b0acL,0x95ce3065d2333a87L } },
60499     /* 44 << 329 */
60500     { { 0x65c33cf4ca5eba6eL,0xbc48b22e12c2f19aL,0x6c5bbde461fbdcb0L,
60501         0xe086202bbc503a00L,0xa9483799deecbb11L,0x9b2c0216279aff50L },
60502       { 0xc10fce1069f99456L,0x2b0051d5b7820d55L,0xd2de9cc32129b5a4L,
60503         0x711166d9e4f565d6L,0x7a8c3dfb88075f30L,0x6914edda224ac45fL } },
60504     /* 45 << 329 */
60505     { { 0xca481b6e4e1e3cabL,0xf390ed5f7e12d8b5L,0xcda82616dcd06247L,
60506         0xf7d791422cec8917L,0x0c2ea9fe2364e5deL,0x471b71ed21f98e3fL },
60507       { 0xbebd6a753b9aae94L,0xf9914c0b45f5d5a5L,0x07c823ca4b3dd18fL,
60508         0x0b8c09ab74ad2bafL,0x21048cf7c7376302L,0x080e4a00efb16ac2L } },
60509     /* 46 << 329 */
60510     { { 0x1699d711379e6c77L,0x9126d88c7427418eL,0xbb05797d825210acL,
60511         0xc0b611df315cb277L,0x90f82a9d61f69206L,0x39a79014f517228fL },
60512       { 0xd9f2def450e8a693L,0x88c1104381e9d71aL,0x28e20b56451f8a9dL,
60513         0xeaa794763e101231L,0x3f1ba0c56423e8c3L,0x2fe7ce4e3c6c558dL } },
60514     /* 47 << 329 */
60515     { { 0xd706ab9cc55b1a3cL,0x99c453663aa386f6L,0x348c8f743617676aL,
60516         0x5f3c49092b9ef7bcL,0x26969963ff5d4864L,0x1f952e03f5b490ffL },
60517       { 0x4007914e30cd5518L,0x3b38fd1e0b0e6513L,0xb25e0a81decbba43L,
60518         0xb7e77345a7d78431L,0xbb7bc23062467d4aL,0x616c1724598ad852L } },
60519     /* 48 << 329 */
60520     { { 0x5bcf287864e60ac2L,0xf70e78a455d53345L,0x88685de6707a7138L,
60521         0xa77646dcfb2041a4L,0x8608695289db3060L,0x08b7c4d8e27a1690L },
60522       { 0x4148d9373ca7fd81L,0x58c7440bff7698a8L,0x9d722d4db0391d14L,
60523         0x5683112462b0373fL,0x87b0363be9a9992cL,0x51870cd18853db84L } },
60524     /* 49 << 329 */
60525     { { 0x775086f481eb73b1L,0xddf02d0e4db4d236L,0xab3d637445b09e54L,
60526         0xb7ef92657e883a2eL,0x20e6ae8f7f42b4b3L,0x26a14629bc49d85cL },
60527       { 0xf0ee4e5ca4ed9ba3L,0x288c5b0793b0b721L,0x9c767a59e9917114L,
60528         0x3dde322015085ec5L,0x3176507f7ece24dbL,0x71e1995686cc47fcL } },
60529     /* 50 << 329 */
60530     { { 0x86dedf2e9b1ab85eL,0xf3330387c2d0593eL,0xf5e6143997e907a5L,
60531         0x1992569d8cd66e4aL,0x836b215e0869329eL,0x8b5c4891153ff215L },
60532       { 0xf6c52f1b609dcc15L,0xa3a5258c085722c3L,0x0a4e81501c378dfcL,
60533         0xa8997ddc739040aeL,0xb1c4417a7180a073L,0x618009bff1dbab34L } },
60534     /* 51 << 329 */
60535     { { 0xc276e23733ec753fL,0x196a1ccee112da60L,0xcc049e2b953211efL,
60536         0xa60e1aa711dcc43cL,0x091ceb49cdfed2ddL,0x8fe1c52e72c69037L },
60537       { 0xf66eac87a986ba11L,0x4917f822b273d90dL,0xf7ef04cc957befacL,
60538         0xf8a7ac1320b8aeebL,0x71f0db3dbe6af428L,0xcb0bf8ba566429c8L } },
60539     /* 52 << 329 */
60540     { { 0xf617674d2cbb40a8L,0x446ad46b4d11399aL,0x4d4246943076b6b3L,
60541         0x1b9e7d881c33ea9eL,0x8e1aa6716954589cL,0xf1099b26e221722cL },
60542       { 0xb18904f94917576eL,0x0512b21bb549058bL,0x12c89a64a209ad3cL,
60543         0x421f5e575557cc67L,0xb42e17371b5a17edL,0x427c6a621ff3230cL } },
60544     /* 53 << 329 */
60545     { { 0x74e75db02bfb49e4L,0x7685588d58cf18dfL,0xfbfe8f56398e27a9L,
60546         0xd2711ec365666b9fL,0x1df7714d2c59b787L,0x0f2c4b4c486f8fc0L },
60547       { 0x098ed315f847b688L,0x60c367e332a20ae2L,0x58f48cd6bba6dd13L,
60548         0xc41e31960616128aL,0x7f90dd69a3205005L,0x8e6ce9d23581c177L } },
60549     /* 54 << 329 */
60550     { { 0xcf2da6044a3b3618L,0xcfd27cc6b83f1814L,0x8cb45c0a6b9369a6L,
60551         0x1f11501633976ef1L,0x2654a1574afc708cL,0xb47f423860970498L },
60552       { 0x548be9389fd8536bL,0x454fde1673ff1ecfL,0x44657efae96be82dL,
60553         0xc8e7e96b555df813L,0x2a0b3f4a4fccb822L,0x2e0f36b114b6dfdaL } },
60554     /* 55 << 329 */
60555     { { 0x227ba88551cefcb8L,0x81e8f52e00071a19L,0x4afd5a5d170fee3eL,
60556         0xc8864e274e17ff05L,0x1d8c2083710ffa4dL,0x22529baa9839c46fL },
60557       { 0xad771341825a0a87L,0x34a3049edad7c56cL,0xf1f14e1712f3625fL,
60558         0x6103d1fabcd36dfbL,0x9f5ce7a949a7cf78L,0xa5a4e38a333cf634L } },
60559     /* 56 << 329 */
60560     { { 0x6c8e5a261d99492cL,0x6e5bab8e77f916a3L,0x9b014aad50ad6f39L,
60561         0x2a3933c51f107e26L,0x4b04395cc951bf73L,0xf8f683b4b0ef56dfL },
60562       { 0x28c9fcdd1905c84fL,0xb03604f14141feacL,0xb546f58e53ace23dL,
60563         0xee5fec4efe688f02L,0xd8b43f6d2e91406dL,0x75e44b21261764d9L } },
60564     /* 57 << 329 */
60565     { { 0x56905026e84e6549L,0x1dc1958c5b84b0b7L,0xcb477afba55d3c52L,
60566         0x6c67cf7bc1434094L,0x739da94d2ecb03edL,0x8c45e5ee778ca2fdL },
60567       { 0x66084f9712e2fe43L,0xee6a89e66c3289d1L,0x623b73abc5d1a215L,
60568         0xb0edfa31cbf45830L,0x8024dffbd7de3b1fL,0x2ddf805a27f25caaL } },
60569     /* 58 << 329 */
60570     { { 0xb4e5a5d5605d7341L,0xe7a7a4069a1d3465L,0x234783d66c60b1b0L,
60571         0xdd7ee2fb3b480129L,0xfd183240dbb7032fL,0xba2a97accaedc8c1L },
60572       { 0x1a1824d3b0185c9bL,0xddc0f82cd36edae3L,0xaf7bbcc03116b17dL,
60573         0xefc9095985f6e8e4L,0xc6bde428acb9c328L,0x69d80732cbf991a7L } },
60574     /* 59 << 329 */
60575     { { 0x455a23a465ecec1dL,0xcf0b2a221d9e9887L,0x0b43131e3fbb1cc9L,
60576         0xd4ece789bdad49b9L,0x370c2f9aedfa4d17L,0x7f6855be15163f17L },
60577       { 0x868a16f3735ecbd1L,0xd84527db08897c01L,0xcdbf5b18f2df294aL,
60578         0x8c500b1f12b99a2fL,0x929c58df2591e3b9L,0x314cb13714eae6cbL } },
60579     /* 60 << 329 */
60580     { { 0xd014cc6deda2479bL,0xd2586003f1a85fb5L,0xceb0611153cd207cL,
60581         0xe8c9fbfa647b3c16L,0x1f53e8e6ab7d6738L,0x06dcceabb060b5f3L },
60582       { 0x80e023b2ab770ccbL,0x83ca0a5f4cda70d2L,0x19f7f5dfea1caa2cL,
60583         0x769041414ffe884eL,0xfa4d93a3fca3c05bL,0xd381f527e88e1169L } },
60584     /* 61 << 329 */
60585     { { 0xa4553b3534914b85L,0x03968ddddc176f80L,0x095fb9531f258fa3L,
60586         0xda9d2df7a554bb6dL,0x012a30ed84926864L,0x3fea37b12aa219d2L },
60587       { 0x730d2c6d81cc6036L,0x96ea83c9ddd81991L,0xfab080dcef1678dfL,
60588         0x16e25c6bfb2fe230L,0xf083a2b298ef2fb5L,0x0c0d0767581feac0L } },
60589     /* 62 << 329 */
60590     { { 0xd464a6525bc81cc8L,0x513353adebfa99d0L,0xd1aa97c0be51245bL,
60591         0x0d37e590e4d20201L,0x7afc95cbb45c5c19L,0xdbd640cfb6a4ea8cL },
60592       { 0xffcc3ff2be9c5b78L,0x61cb76ac1b2865d1L,0xb145bb0011352d21L,
60593         0x69568e5ce550ac6dL,0x454a33043bf7ee0bL,0xa2fcf9b45dad3642L } },
60594     /* 63 << 329 */
60595     { { 0x2e2c8fb3f33eaca6L,0xae1c78b265f75366L,0xbdc601092280d2b4L,
60596         0xed8409b7b6f472f0L,0x69eafa4f439e09afL,0x3b9ca2ecaa2b1531L },
60597       { 0x59b2e8eb336e484bL,0x93ec3ecac5f0481aL,0xb01e690ad575157bL,
60598         0x811aebc262e9d767L,0x1b26c0e49a9065eaL,0x5712d2c969a18827L } },
60599     /* 64 << 329 */
60600     { { 0xdaa7fcc9f9474bb7L,0x3c82e74bafa5db2aL,0xfbf918c59894edceL,
60601         0x470c45eda9ac29a7L,0xdfd44f6fbc372f2cL,0x73a4790aa1e38d3fL },
60602       { 0x23d2400ba9674837L,0x3dad71bc136a92daL,0xc76a488148baa4abL,
60603         0x73227e4ebc26e6b0L,0xe732edcfe8ef5662L,0xfe96aa5f0c5662bbL } },
60604     /* 0 << 336 */
60605     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
60606       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
60607     /* 1 << 336 */
60608     { { 0x87c7dd7d139b3239L,0x8b57824e4d833baeL,0xbcbc48789fff0015L,
60609         0x8ffcef8b909eaf1aL,0x9905f4eef1443a78L,0x020dd4a2e15cbfedL },
60610       { 0xca2969eca306d695L,0xdf940cadb93caf60L,0x67f7fab787ea6e39L,
60611         0x0d0ee10ff98c4fe5L,0xc646879ac19cb91eL,0x4b4ea50c7d1d7ab4L } },
60612     /* 2 << 336 */
60613     { { 0xcfbcbc4a7db62b5aL,0x2919bf514ab45ddeL,0x735de05622322f91L,
60614         0xd2590bda7662ae23L,0x63d468fed82be7a6L,0xc84d0435695ea172L },
60615       { 0xc50f494120a6fccdL,0x2d613990620f44f1L,0x680ccd041fd25778L,
60616         0x25ddac444a3d0808L,0x41d8b738c4684cbaL,0x2611645f53963888L } },
60617     /* 3 << 336 */
60618     { { 0xb05cb834b0279be5L,0x2de7d0ebf08c5f93L,0xf023b5aaefa9e4f0L,
60619         0xb8061e5d9bd075ecL,0x7d2ba50f1aa41bfbL,0x8963f3e390865d96L },
60620       { 0x7f221a794713ec7aL,0xc83bc5178500b4c3L,0x085feb6af6ab1540L,
60621         0xfd141024dc87cd93L,0x3e196fdb3239dbf6L,0xb7cf3e16dbcd5364L } },
60622     /* 4 << 336 */
60623     { { 0x1466c9f5e03a2fb4L,0xb866c006862a58a2L,0x291e8c75b5865550L,
60624         0x1ddb7154e65862ccL,0x285153bc2b997167L,0xe2fce0e7954b6c19L },
60625       { 0x985d450616dc2937L,0xf7f14216ee41d9c3L,0x39e098dafa5fe5e5L,
60626         0x3fc26046f90f231dL,0xde5d5ced32afd0b5L,0xad688b1d60c09c18L } },
60627     /* 5 << 336 */
60628     { { 0x3720b1720f806b59L,0x1f696d47f224597bL,0x03c46e315b54eefcL,
60629         0x387e466472b0edaaL,0xfc59b03dee77476eL,0x86854e54607a7259L },
60630       { 0x1478bcee3e9320dcL,0x4aa825a88c9d87e4L,0x71272f72cf272ee0L,
60631         0x19e3a4a38bd885cdL,0x9af6415b376ba31cL,0x6394b5a7807b2b36L } },
60632     /* 6 << 336 */
60633     { { 0xdbfcfa75e572e06dL,0xafa019d08b7d5653L,0xcc6c851d67a19b60L,
60634         0xace88bf431ae1a67L,0x74554a6193d1e135L,0x51ba2cdd4211890aL },
60635       { 0x7cb326899e8d1f02L,0x29a6b8258b66ab99L,0x0a672c21766e72f3L,
60636         0x24bb718a880642e3L,0x425dc41d184d2b36L,0x96a1468e891024abL } },
60637     /* 7 << 336 */
60638     { { 0x3180789c26df7050L,0xe375a43e96cdfd31L,0x7951b895e99e922dL,
60639         0x987ea2503d0bbe80L,0x6d2f49f0e2fe79c0L,0xc9c2c636c2b18d2aL },
60640       { 0x707798f3d8c8620cL,0xc2d603dad5c6a0eeL,0x46cf1e32bc447940L,
60641         0x4dfc145938a845f3L,0x210083fe455e5d92L,0x6be989eaa1fedc3fL } },
60642     /* 8 << 336 */
60643     { { 0x72fc8198dacc038cL,0x5fdae1d9f1077bbdL,0x369198bbd99e3036L,
60644         0x6b68390a0efddfcaL,0x8c35f3e4f0914741L,0xd2bc54ecca7d7807L },
60645       { 0x564d991e3a8695d1L,0x5e1e14c81b0d937dL,0x51f30dab5d635893L,
60646         0x0427e346f944e49aL,0x1e0bf1b56a233bc0L,0x75b0ee6c617bf93eL } },
60647     /* 9 << 336 */
60648     { { 0xcd2db6797b1bbd75L,0x1ce5acecaac388b1L,0x715ab9f634c1fa9cL,
60649         0xa531e1b8e0815643L,0xa64511c692de769bL,0x8425126b785b8bc0L },
60650       { 0xc8d9320de72e155bL,0x9cf36dcd5600a04bL,0xbea8b0f4c6e1f7fdL,
60651         0x6f9af6349767d85bL,0xc3ea9fa4c403ecb8L,0x0af7be1ed60a0e70L } },
60652     /* 10 << 336 */
60653     { { 0x180afdcc20928729L,0xec2e90f436bce72bL,0xa8a8c54d8f48e48cL,
60654         0x9d0c6a355248109bL,0x8bdd819baa6c3ae3L,0x95e221a6dc0bebc1L },
60655       { 0x83e568eceb113737L,0xaa6d29c8a1a3a0a8L,0x0ebd5015c54fbda4L,
60656         0x692a84832a5c8b17L,0xa08e384b51836490L,0xf1904bfc37ded786L } },
60657     /* 11 << 336 */
60658     { { 0x2093335463919940L,0x34e4f27397ea3359L,0xbe64c5584d4156a5L,
60659         0x368a6c980497cf92L,0x59931a502288b8cfL,0x67d70ff8c36cf906L },
60660       { 0x4175562a8886126fL,0x46ecdd1d55114ffeL,0xd12876f94efde702L,
60661         0xb0c9333fc046d908L,0x8358b04a2cd6c180L,0xcbaf4612336d3c84L } },
60662     /* 12 << 336 */
60663     { { 0xd77d9cd4fe8dee55L,0x7a0f60c12e43fc84L,0xecc5cd746d5da126L,
60664         0xb5ac6fee2382a984L,0xd9db83e26ccd0feeL,0xaa4dbcba350717d4L },
60665       { 0xb3c0562c812ead77L,0xf7a995eea96cdd07L,0xd5419bf1ffeb4e67L,
60666         0xba0aa22e1226df29L,0xb8d0d7f4c1e333d1L,0x86fecca60a27388cL } },
60667     /* 13 << 336 */
60668     { { 0x9ea1d715dc579084L,0xc1e715dd0b1cf2a4L,0x624fa6e4926bf7d5L,
60669         0x5034c9d34f7b4e51L,0xc1b0ed7aba3a42a6L,0xd1847c28b73cdb77L },
60670       { 0xa4794bc36ae49ff0L,0x50b2d908b9144fa5L,0xad112c778f073479L,
60671         0x040499dd4b98f590L,0xd415d273152b5e30L,0xd3f4ff3f39054cabL } },
60672     /* 14 << 336 */
60673     { { 0x1e0318d5fff93451L,0x40b91fa9283e197eL,0xdebc5a28089ac579L,
60674         0xcf25f527e9d98537L,0x73f7818d4ae08f51L,0x397f2cb6a956c875L },
60675       { 0xb7d74ac57515436dL,0xc29a2ffd830664abL,0x02e273563cabe01bL,
60676         0x418417c103c78924L,0xd12994116535005eL,0x53fc391258f66295L } },
60677     /* 15 << 336 */
60678     { { 0x6b1fceac4d87dff4L,0xd31aef70f262f722L,0x894361782612da01L,
60679         0x1d3bdfa9963bc230L,0x9a46505ba7afa565L,0x662c2fc7a31db4ffL },
60680       { 0x33983a9ae5ef30c0L,0xb8c874ee723f085aL,0xfb5fbc860f279c05L,
60681         0xcd9cc376ad0a380cL,0xcb19d881fdfad736L,0x1c3d9734585167ddL } },
60682     /* 16 << 336 */
60683     { { 0xd23658c8d2e15a8cL,0x23f93df716ba28caL,0x6dab10ec082210f1L,
60684         0xfb1add91bfc36490L,0xeda8b02f9a4f2d14L,0x9060318c56560443L },
60685       { 0x6c01479e64711ab2L,0x41446fc7e337eb85L,0x4dcf3c1d71888397L,
60686         0x87a9c04e13c34fd2L,0xfe0e08ec510c15acL,0xfc0d0413c0f495d2L } },
60687     /* 17 << 336 */
60688     { { 0xf791c8196726ae9cL,0xc95c53f13cee0ca7L,0x816b37ae601b0802L,
60689         0xcf28a2371b854925L,0xdc4f6bc111d5d9f2L,0x222d6102df6862aaL },
60690       { 0x93d3fcc5c0053ee2L,0x1d30937fdf873eb7L,0x925a2c2527d098b9L,
60691         0x8564c199001cf28aL,0x87cb85ed748b8479L,0xd12d6b2b184c1020L } },
60692     /* 18 << 336 */
60693     { { 0xeaf36b865bddb3c8L,0xa4bab6e0099f18ecL,0xe22839208addee4cL,
60694         0x485307e053bb454eL,0xf981c80d362db12aL,0x012190355cb4b460L },
60695       { 0x62824680c78bd110L,0xf3e0b963d87df5f5L,0xd96de5e2758da525L,
60696         0xc6a810faa60956abL,0x913d5a7b8e3eb6dbL,0x27c581fbbc9e8c3cL } },
60697     /* 19 << 336 */
60698     { { 0x5edcd7dcb0c55d75L,0xaeb0b5c727838c23L,0x13d65db758c3fea0L,
60699         0xe821d853b36f1f15L,0x3435a4bc365e7703L,0xb890e52f3a04d292L },
60700       { 0x6a96ae92e7a823f3L,0x3960ecb0ca611036L,0x81638aff210cb460L,
60701         0x5f95793ce6b983d1L,0x0d5029ffa3ae1a8dL,0x54f749b492ca1229L } },
60702     /* 20 << 336 */
60703     { { 0xefe0a702537c4a5fL,0x322ff89c151d0e69L,0xcee88b48491b757cL,
60704         0x8e92cc15b5da77c0L,0x3138b90bf6af039dL,0xeb73edd2f3748d35L },
60705       { 0xf29f06435b8bb06cL,0x91ea9643560e4966L,0x013c274875acbcc8L,
60706         0xdb2d1d9703f1d40dL,0xed7aeef1fcac606eL,0x91395dcabff4b849L } },
60707     /* 21 << 336 */
60708     { { 0x952e4e21c8967f37L,0xdc9f71994bf85ec3L,0x6b01f3d00c141bd4L,
60709         0xc6601dec06c9ba55L,0x7d884fc0c4a5945eL,0xcab1de947e19d3baL },
60710       { 0x9ca6aff02e3c9c5eL,0x01e828a1445e4a8bL,0xf97165ae80d065c1L,
60711         0xe2195895881978a2L,0x4834501fc6b77acbL,0xbcf7545445d99f5fL } },
60712     /* 22 << 336 */
60713     { { 0xbfc9c5071e434ba6L,0x30768f646f2634adL,0xee3a7cec1caf9c0bL,
60714         0x27c4fd0bc232910fL,0x5c5813ee24ff4510L,0xe5e731af901f2ce6L },
60715       { 0x440ca2cf68f9aef3L,0x54ff9e837fa17587L,0x4d792db7982acc0bL,
60716         0x73c3863834846c98L,0x76cff95f8d6243d9L,0x5fa573399d015583L } },
60717     /* 23 << 336 */
60718     { { 0xe0419a6fb007e4cdL,0xc44ac4961f613529L,0x3408e15af18f82eaL,
60719         0x66bebd87d92d3b39L,0x1c563ee4f85d0c1eL,0xb31a8c891f7eb37dL },
60720       { 0x65c7bf8c458a056dL,0x9d2ba592f25b6f73L,0x1ac4f0bc94eeb39dL,
60721         0xa008b562d9a9ac29L,0xe7de714589d1c354L,0x420f5cf04c2e45d2L } },
60722     /* 24 << 336 */
60723     { { 0xe11cc2e117cc0d20L,0x9b4cc698d406fabfL,0x6f6e9b0cb8567c18L,
60724         0xa0dcda9c61b22b83L,0x4c8683fa79ee53abL,0x7d46b3f82f11f0c4L },
60725       { 0x91e74e482740aed8L,0x75afb62a056466e3L,0xc60bb430e8d0c16fL,
60726         0x36cf252522b4aae9L,0x3713f254aceb6dd2L,0xc2906379eb8c6fd9L } },
60727     /* 25 << 336 */
60728     { { 0x440da0369eb8b2deL,0x6c4d1a38462fbb19L,0xfd86930fb050f995L,
60729         0x2e5f1a8c954823a0L,0xe9122aefcb9f8e9aL,0xc9e923f2794be14eL },
60730       { 0xdaa5663dbf740c2aL,0xf3a7ecd6df75c915L,0xa047a07efa80015aL,
60731         0x846b4d27ea4a720bL,0x2389717e295845f4L,0xf56f77f6cbf2eabaL } },
60732     /* 26 << 336 */
60733     { { 0xaac4f6a7e67b6dcbL,0x59ccb836d51c5183L,0x78d19f452b7ccb20L,
60734         0xb32d4ffd5a619a1dL,0x86b11dbe5c4bd17eL,0xd983e839a9b52073L },
60735       { 0xfe9c0b92993455c1L,0x3a156676ea36006eL,0x578217fea907ca7aL,
60736         0xaa3c5489440a251fL,0x6760a166d7fdf3fbL,0x4a2fc54b4415c6fbL } },
60737     /* 27 << 336 */
60738     { { 0xaedf171dbe18bc16L,0x00febab2b2d026ffL,0x82b6d8890cdcca4aL,
60739         0x1b1e4c53445bc877L,0xc2174e10ed74285eL,0xced66cc02b243f6bL },
60740       { 0x73e9ff69c7b9a66eL,0xc4fe5caad5e4d121L,0xaef80d67402c5d1fL,
60741         0xd3b95a0f2f3dcaf9L,0x00cb6e798ceeea00L,0x1ee2ca8c436f35e1L } },
60742     /* 28 << 336 */
60743     { { 0x0b21c764a6db111fL,0x7c36dfde24c5721eL,0x53a0b6db66e2d428L,
60744         0x6f37bf728169d776L,0x9baf6385a68511c8L,0xeaef9c919b218151L },
60745       { 0x712cdd5bdd58d201L,0x50bcd0988d3f78c3L,0xfb6427b571fcb05eL,
60746         0x6245fe7cc4675aebL,0xb5b75b50fb767bdaL,0xc1d8b76ddd7a18fdL } },
60747     /* 29 << 336 */
60748     { { 0x6392686cbb52f636L,0xf10df7c41c46a5c1L,0xab7f88acc504a122L,
60749         0x2a179193fdb6a9d5L,0x2a7c7e4e2901f29cL,0x3ab41b80a2cc726eL },
60750       { 0x8f577fc31fb5e412L,0x65cba0aeff7c47faL,0xa79191697f45c04dL,
60751         0x2712fcaeb29a4c06L,0xf2a879e4099f76e3L,0xd333fabd98a22a04L } },
60752     /* 30 << 336 */
60753     { { 0x87a905e056ddf14cL,0xd36289cb95a1c633L,0x2fb251aa57f8f0f2L,
60754         0xbf9c72a9fb7907a4L,0xb4f9b6f3f771333dL,0x7b5ed437469ea10bL },
60755       { 0xe8cfa847fa5a8f93L,0x456395c945a4c9a9L,0xe20ffc39f7fac5a6L,
60756         0x8b07c9ff287a3c78L,0x117f306f67e66d0eL,0x97c8a6388b331e09L } },
60757     /* 31 << 336 */
60758     { { 0x1b3e04c26a98318fL,0x04d5ed5dd5a63b2bL,0x4098d09f3cebabecL,
60759         0x226bb70565a14306L,0x5bdce76fd962a94fL,0x47a66e96c40dedbcL },
60760       { 0xd514ae5bbedcfbb0L,0xa8c0fe40892f07e7L,0xcf78e224c9186f1cL,
60761         0x2499f68fe94329e0L,0x3ea3fae5ebbe3d2fL,0x681fca8bbc631de3L } },
60762     /* 32 << 336 */
60763     { { 0xb097b2c5c4e81268L,0x7ef175521d50ca8cL,0x638266e942099644L,
60764         0x43d059deff729073L,0xeebb5fe1148c3940L,0xb82e73d1daa8e925L },
60765       { 0xf43c78d8254380fdL,0x2beabc58fce37fa0L,0xcdd5a7d66b636357L,
60766         0x8b70a2ebe096a954L,0x011d5419d0afa2fcL,0x3e49eb6704fb095aL } },
60767     /* 33 << 336 */
60768     { { 0x5c73f69fb99abd8eL,0x0a7c36aacc1ed636L,0x9d2fe67e7f69a6cdL,
60769         0x04d015fd48c34b1fL,0xc50f88c17f84915fL,0xeee3e105a706fb24L },
60770       { 0xbd42861c734d0513L,0x544b6ef495408b60L,0x4526e680d40179beL,
60771         0x9f984c4140ab740bL,0xbed7baee67a02ab3L,0x09e3446862a9fb2eL } },
60772     /* 34 << 336 */
60773     { { 0xdf64ebcf28eedf59L,0x435531be73b5d9f4L,0x1990df01cf35d981L,
60774         0xa34d4fa9a2cc41b0L,0x9f643bd6b5a10b37L,0x90cae11158a6cd14L },
60775       { 0x2b0490701943d2f3L,0x2c9f8af4eda3fc20L,0x48c245c5f96e72f3L,
60776         0xb4505a3a861355deL,0x4dfab1b9be032112L,0x69c1a9195942de24L } },
60777     /* 35 << 336 */
60778     { { 0x761c2c356efcc891L,0xd06710d1fa376241L,0xc83a491c8a78b0fcL,
60779         0x0c0ee8d8af75b3eaL,0xe6d9d92e4532b587L,0xcb3b652d64eba138L },
60780       { 0x1cc504ca34ff5d2aL,0x207e7443d0eae0baL,0x94ad1676428382b1L,
60781         0xfcb5909992ec17c5L,0x7f99e1b5ce3b2e48L,0xa8c38c0fac9bc921L } },
60782     /* 36 << 336 */
60783     { { 0x5763ff1af4ba4711L,0x6aac1315bfaae662L,0x51b9c30ede4b5505L,
60784         0x50e63d1891b25d3eL,0x41938349e65ea695L,0x11260360f514dd15L },
60785       { 0x231f7f574a086eecL,0xa2c3237f55bd9ee1L,0x8afafa043e0705bbL,
60786         0x44607900e9fc754fL,0x7250929678519ce3L,0xe751c3a74d17708eL } },
60787     /* 37 << 336 */
60788     { { 0x0098a3254611d3dbL,0xbee52036dde82f67L,0xec432a62cdd50282L,
60789         0xae8a144e52f994f2L,0x027e9e60aa5c03fdL,0x1a49ce47821f55f7L },
60790       { 0x46fbbd6c4d10c0ffL,0xe14c82ff8c461df3L,0x95570f44aef902b8L,
60791         0xacaa04ec0eb7eb26L,0x3c8c86a8e738570fL,0xb87d47ccb77cc59cL } },
60792     /* 38 << 336 */
60793     { { 0x2f4f68377bbf7168L,0xd5b67947f03f7145L,0x2c6ca74d4cecfe22L,
60794         0x0e559b9f0a7d6fadL,0xdbcd039ff6b37f98L,0xaaf1f6edfa7a3877L },
60795       { 0x97b779f0f607316fL,0xe2185ccc72b99fd4L,0xd3f696bf2bdfe399L,
60796         0x20d9baf15e6c403cL,0xe5bbc1cb4c4f1216L,0xd1c0761a428838fcL } },
60797     /* 39 << 336 */
60798     { { 0x4f433b8abd08dd65L,0x27849a72773bd3c0L,0x62351b911854502eL,
60799         0x836580ffca24ce7dL,0xa5c224a39355258aL,0x8d33fb43e65db7f0L },
60800       { 0xe44d391edf49a825L,0xc28e0d9bd2f5d4bbL,0xf7208342efb61ae9L,
60801         0x43686b414dbce055L,0x7f7562d01800c062L,0x5031bd7c8b8ace99L } },
60802     /* 40 << 336 */
60803     { { 0xc183199375476a4fL,0xa6383a0055fc4367L,0x23a72dea98bf90c4L,
60804         0x67ee6f451045a947L,0x4e6518836920d0a2L,0x49132c9ac8042a04L },
60805       { 0xe249e46d5dfa9fc8L,0x6ff9eba1c60d1a11L,0xa4d9362d43490335L,
60806         0xe8fad79ade504480L,0x519e8d1bac43c951L,0x7e688047952d6f54L } },
60807     /* 41 << 336 */
60808     { { 0x135d677342e27f9eL,0xd58b98fb8fcc77e0L,0xf3bb847d7f64928bL,
60809         0x15ec841663176905L,0x83e75b6a0f755173L,0x4c3eff5c7a24de69L },
60810       { 0x289e9a45313bf61eL,0x01b15aadeafa2733L,0xae7fafe1d2cf501dL,
60811         0xd6fba525d5ac0b3eL,0x4bf48be0689bb20aL,0xa591843255bf610eL } },
60812     /* 42 << 336 */
60813     { { 0x0f019b64c5f8df0bL,0x112f06a979307310L,0x91dc57276d16102eL,
60814         0x34070a5be2651248L,0x0b9f35dbd3423044L,0xf29bb4a072b10ed1L },
60815       { 0x87071a9a07fb6388L,0x4246d532b7dbdb1eL,0x87db3d2285a039c9L,
60816         0x76620a5d42b030cdL,0xc798e3816a42d8ebL,0xdd97441ac441ef9bL } },
60817     /* 43 << 336 */
60818     { { 0xa9b004a0f08592c3L,0x984d17e5d069c54dL,0xc96f2132ccb87e81L,
60819         0x67fd082f3b1f9eccL,0xcdd0827ac4ff9feeL,0x9d1025070e04b7a6L },
60820       { 0x4ff3424177c67935L,0x4f2246f58efea5b9L,0x128085b12fbf7615L,
60821         0x9f111f65174b0575L,0x0b27d8e2f455cba5L,0xda20626b536054eaL } },
60822     /* 44 << 336 */
60823     { { 0x4a3df6de3761fa82L,0xb839d6babc56eb6cL,0xe41afc5e13977a26L,
60824         0x64022937fc0686d5L,0xa5d6dc19e2d681a2L,0x81afab3128f411b0L },
60825       { 0xc089aff74321a117L,0x32b0ae2657d18f89L,0x650aacd5f66aacd0L,
60826         0x7b317bf6b8d3f677L,0x2cd5789777ea82dfL,0x935be0f3c74e7509L } },
60827     /* 45 << 336 */
60828     { { 0x4387f8f602de9e59L,0x529c06f337589811L,0x6dbaab60bc9f06b4L,
60829         0x0063bc3db5f181faL,0x7bcb289969b906b3L,0xdca70d1331d1ea3eL },
60830       { 0xca65e546ee373e94L,0x13cd365c779f415fL,0x4183460e9d71cb08L,
60831         0x60f312726e35eaf7L,0x3d0c265f14bc5e0eL,0xe7a1b9af39ce618bL } },
60832     /* 46 << 336 */
60833     { { 0xc234c892f46aac36L,0x213076ada55983a9L,0x81f96142dcf335a1L,
60834         0xf21ceb724b22e311L,0xa12d6333dc053e1dL,0xe7808925a930732bL },
60835       { 0xb5a9eb81b1f1075aL,0xd13739c0f0a3e623L,0xbcd842e9ff2f24d5L,
60836         0x200cda381b16ff0fL,0x0a85ea521d6a6c54L,0xe1c0dc8756785463L } },
60837     /* 47 << 336 */
60838     { { 0x3287c8d39100f769L,0xb349ce8c052e8bcfL,0x5fdb952dd0d3e44bL,
60839         0x68715110d0639cc4L,0xc9a5fbaac8efc67eL,0x14ebb97da009aec5L },
60840       { 0xf0684e1ca1423e1eL,0xb282f2f56357fa17L,0xc2e79d3c5af78041L,
60841         0xe0ca9f4bd7d2ba8bL,0x20629f1e04dd84bfL,0x274ebccc3ee73228L } },
60842     /* 48 << 336 */
60843     { { 0xeb05c516156636c2L,0x2f613aba090e93fcL,0xcfd573cd489576f5L,
60844         0xe6535380535a8d57L,0x13947314671436c4L,0x1172fb0c5f0a122dL },
60845       { 0xaecc7ec1c12f58f6L,0xfe42f9578e41afd2L,0xdf96f6523d4221aaL,
60846         0xfef5649f2851996bL,0x46fb9f26d5cfb67eL,0xb047bfc7ef5c4052L } },
60847     /* 49 << 336 */
60848     { { 0xeadd123d385f2b36L,0xe3b14829ddf58569L,0xa4fdf0ec47c7e485L,
60849         0x93c0d8380623ea5fL,0xeb9c0a2c9e2661deL,0x8046fc69e72e0ca6L },
60850       { 0x6f439e5c7be1c918L,0xcd8fd2f92a9ffcdcL,0x7f134747420e939cL,
60851         0x8e880ef05ae283f9L,0x502c5c99f780a249L,0x68a529ab94bf9d68L } },
60852     /* 50 << 336 */
60853     { { 0x3cf994ed88c9d290L,0x9209f5610bb34d46L,0x8170b567b2bfa21eL,
60854         0xae87b6f7c62f86d4L,0xac6fc431d71bccebL,0x5f3a62ba83cf2970L },
60855       { 0x390262d1d943b10aL,0x8fc9a27f28aec573L,0xe59beb203e3069f9L,
60856         0xf3e7bd365e0812a7L,0xc29c8a433aceffa4L,0x015feecb41c25e2dL } },
60857     /* 51 << 336 */
60858     { { 0x5b6a4d6ca8e61f40L,0x35825d762f9a6e70L,0xd48f6d8d346a8b94L,
60859         0x12bea60889801a40L,0x5182192ad57115f6L,0xb5a8dc6b954c1b47L },
60860       { 0x084a5c71793b427eL,0xeb66d699f8de2a03L,0x9835b2fb8eb6d905L,
60861         0xb4229923c79dfe40L,0xa7c8aedddee34c0aL,0x12a00675337b0658L } },
60862     /* 52 << 336 */
60863     { { 0x38ca9f61d44aee32L,0xb2cd0f505484905aL,0x23ecb3a4d812e727L,
60864         0x9be645b874a3ac5dL,0xaa4a1d114bfa93b9L,0x5be5277d147072caL },
60865       { 0x623a4bd9ba0a6d93L,0x03419661dcf3d9b1L,0x9bffbe8231de1cf4L,
60866         0xbadfa2ab56a6af06L,0x9103f7256746f09cL,0x0cd5e956344a2688L } },
60867     /* 53 << 336 */
60868     { { 0x50a18ab1f40b0edeL,0xf963b76736e01032L,0xba2029b4d4f9a6deL,
60869         0x8baec9b85a8446b9L,0x7a4107e766fa8a92L,0x06e78bf99f6543d9L },
60870       { 0xdaa894b3a5043e86L,0x172858a8f4e6fe37L,0xff0265cc0844608dL,
60871         0x5db1a8f1d5def174L,0xdf9f8a698874fbedL,0xdd2292a977a274d6L } },
60872     /* 54 << 336 */
60873     { { 0x46f522196ad8d03dL,0xb63e0eaadaf8b0d3L,0xd667f0a66e29df38L,
60874         0x6e77432f96ef3b57L,0x78fe0872139ca180L,0x300a0c78d1e4af21L },
60875       { 0x650f32462148816aL,0x31ef1e883b4301a2L,0xa2222b25f18442fdL,
60876         0xb26b63066884291fL,0x977b6f7d713d88daL,0x3e8173248cd5f7f7L } },
60877     /* 55 << 336 */
60878     { { 0xd5687c9a9684771aL,0x797808e396cf65d4L,0x793d4eb6ea9ee562L,
60879         0x2359b991fd94defcL,0x4e75cdf03a8959adL,0x7a08566900ce7815L },
60880       { 0x5c61df5da699fc46L,0x02b62d4868da56d5L,0x8a6972d1eaea27d5L,
60881         0x727582b3c8e5d04fL,0x0ab2e6c2de87c408L,0xaa9a62e47b9ed157L } },
60882     /* 56 << 336 */
60883     { { 0x9c6247d631af03e4L,0xe5a59ad075f9ee90L,0x1da1d64f6ac4b5a6L,
60884         0xd2fbd169c521ec7dL,0x6d168015dfaa39f7L,0xe9bcf5b59c69d9d7L },
60885       { 0x3d1d3e6693ae2925L,0xcda60beae4bc73a3L,0xb2456adc954e2f3bL,
60886         0x5d312fdc02a8fe08L,0x7b37c00e0e497a0cL,0xbd1f3aafc2f8b148L } },
60887     /* 57 << 336 */
60888     { { 0x60f3bb27bc00d150L,0x159c5af42448affbL,0x4492b6bd2cfa563dL,
60889         0x7e58219683c833b8L,0x9f9ebdb20edfafa2L,0x93a7048f31a39a8aL },
60890       { 0x4172f74d50149d01L,0xff38fceec58b7588L,0x2e71ba9099f25353L,
60891         0xdf50fb440604e555L,0x7effa7ca8f3b5969L,0x3bbe8d49b836b8bfL } },
60892     /* 58 << 336 */
60893     { { 0xc18c375c29d08d49L,0xb04c0c29c1a681bbL,0x0c4acce9e74dd458L,
60894         0x1d6da95c85c920a1L,0xc67280d285387462L,0xeba99725e7e804adL },
60895       { 0x08f80e5a8811a138L,0x26f442138f2136e3L,0xf67f157c2d028cc9L,
60896         0xb436356d14cd7cbaL,0x1c9c610290281895L,0xf67f16ea48598bdbL } },
60897     /* 59 << 336 */
60898     { { 0xbf926a077a326266L,0x4045c18bef43cfc6L,0x6fad4cf56ce45553L,
60899         0x613ad2dc45a9abc8L,0x7b086ace8836eed8L,0x855857c213ad51d7L },
60900       { 0xa3b19c2d167664adL,0x422c548abbd2c452L,0x8cd3681f85928ef0L,
60901         0xe969e45c3ed435ecL,0xf76f2cce746c9aacL,0x514df58d1dd90e35L } },
60902     /* 60 << 336 */
60903     { { 0x9b66219c4d09cd36L,0x6c6fa570b54f0853L,0x95c268bcf29a8fffL,
60904         0xc8cf84bf5420c324L,0x5bfc975ebb61617aL,0x935cfe24e78f1bbaL },
60905       { 0xa6e2afe919d71ea1L,0x8a321e568c9b950eL,0x42dd9e28ec097826L,
60906         0xf06e600ef391633aL,0x94e5512b46acbe2eL,0xb0bca2cc61cc7a08L } },
60907     /* 61 << 336 */
60908     { { 0xcd361103e8b2d41dL,0x2d0d982cab0b5f13L,0x8158129618d55aecL,
60909         0xf1c28a71579caa03L,0x5ddedfd7e50b83faL,0x932d2c03222105d0L },
60910       { 0x48fd0ead75ada3f4L,0x29209d988c533a40L,0xc2acc587f2acf0c8L,
60911         0x05a8703ef689912fL,0x8f28953b9182995aL,0x1cbba2f20fb3eeeaL } },
60912     /* 62 << 336 */
60913     { { 0xa1472574180e5eb2L,0xde27569b93fc7b21L,0x3bb956816b9af8aeL,
60914         0x8a25fc0ee155f89bL,0x8aff018d825126b2L,0x6eda2f31906f0bdcL },
60915       { 0x19cbbecc4e8fbe4eL,0x04e0a4a40568d248L,0x6de2c002ff07b863L,
60916         0x6d388447e8d1595dL,0x6a193b70c2cfd10fL,0x00bd826ee6f6bf96L } },
60917     /* 63 << 336 */
60918     { { 0x2a0165a40a5b4d1dL,0x49c85ee904f12309L,0xc2d221031ded788dL,
60919         0x510ccbb3735bd89fL,0x92d2eaebd8eb0e1dL,0x6bda8e346e428c11L },
60920       { 0x44c01a1d361f7495L,0xddda8e97cc7a95bdL,0x95cbae30524a53baL,
60921         0x266d7192dacad45bL,0x8a42793f22fa4b99L,0xbb393cb5ed204904L } },
60922     /* 64 << 336 */
60923     { { 0x88e7ac8e168d5e60L,0x53abd5696188a98fL,0x3b96d52918be419aL,
60924         0x7e75e354c057621cL,0xcb1b709f5ce57e59L,0xe78befa2844f2463L },
60925       { 0x536081993276d4a0L,0x92636ade157f2024L,0x6dd0d348e0411414L,
60926         0x5b28e9504d73eeaeL,0x08439232690ed85eL,0xdde1a3496da14b58L } },
60927     /* 0 << 343 */
60928     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
60929       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
60930     /* 1 << 343 */
60931     { { 0x6cbd275739ed9ec9L,0x5db68a68fe5d4aa8L,0x177eaa0be4c58c7bL,
60932         0x603551ef0e488784L,0xc8eba131df916b0fL,0xd0dbceda159732e2L },
60933       { 0x55acca84b0834afaL,0xdbe98440b59ffbf5L,0x162a2c703bd3b202L,
60934         0x4c5e5d256ddd8ebaL,0x66e7844a77b1d93dL,0x1292bc0e110b9dcfL } },
60935     /* 2 << 343 */
60936     { { 0x1b66faabf9e89beaL,0xc81c5ddc3a441284L,0x1a82f3a0a675f7c8L,
60937         0x82884a2f30313a71L,0x7ac5d7b058aea9e6L,0x1954f075cd5ff05dL },
60938       { 0x7c29638d6178d270L,0x6af7f8ba19381929L,0xe85e3c47a17ae3a7L,
60939         0x91b107c77009e38aL,0xf3b777d8f1f9c52eL,0x5b7b74ff11b688a0L } },
60940     /* 3 << 343 */
60941     { { 0xe1e5b76914b87b2aL,0xee187f5d143a4ae1L,0xa9a38728908cb988L,
60942         0x2027b2ed4443d8daL,0x1c6b4813c0c98675L,0x509ea7d1323bd978L },
60943       { 0x43b16a587f4dc19eL,0x385f8be812940ae9L,0xa4ed64e57d59acadL,
60944         0x47e7abed51ca7f14L,0xead594b82bcce6b8L,0xa2bff60cfc03cf06L } },
60945     /* 4 << 343 */
60946     { { 0x4ae3d232c0385874L,0x83bda9e6cbf96d2aL,0xba73c769ec62fd6aL,
60947         0xd586ba7f62a4720cL,0x6497cd140cc1f491L,0x8b012b707b2ac571L },
60948       { 0xa65eabb6268fd705L,0x8caf100a1431873dL,0x25b31b84231457d7L,
60949         0xcab62f75901645c5L,0x2377d74db2f7b656L,0x4008277c2d33c95cL } },
60950     /* 5 << 343 */
60951     { { 0xa7be70c04bfeb784L,0x4633ddadc222ab44L,0x00e397d30f5924bdL,
60952         0x5446db3ae25b7b9eL,0x433ea2c4fa1dd048L,0xbb9ae36a1421321aL },
60953       { 0xf879069dc59fe8f6L,0xe0f2b8b4820bfee2L,0xcc6cf7c49cf239e4L,
60954         0x0e3545c207dc3122L,0x23b0f48b1d2c737bL,0x1c6b6d9cfc1137d4L } },
60955     /* 6 << 343 */
60956     { { 0x10105dfd101d2433L,0x64e009b58ab6d664L,0x122e68324e80fc07L,
60957         0x3b26e76287dc7da6L,0x7bc183de6d4728cfL,0xebfecf4f8bcdc129L },
60958       { 0x8b995cec265c66f5L,0x080572d7c4b0e942L,0x612e9e6b4da5b77dL,
60959         0x8ec048a96caf9161L,0xe3628ee2c7f45eb6L,0x0190b71bd85650e9L } },
60960     /* 7 << 343 */
60961     { { 0xccf79a81017fbd3fL,0xa852ca29c875bc66L,0xbb4cd90c0592f8e2L,
60962         0x2ee786f455b05c79L,0xe1a2b6baf382e6e7L,0xf2d6cf6e6d2e952eL },
60963       { 0x2f0b534abc9304fcL,0x1d63fd80795629a3L,0x42e70cd9322d8e03L,
60964         0x8a282cdfb057e36cL,0xd18a0c313ceb177bL,0x270e31569c58b890L } },
60965     /* 8 << 343 */
60966     { { 0xaae2f448ed001c43L,0x08ad1d9bcf4be493L,0x3262b2f482c1f372L,
60967         0x5521febd351a5f7fL,0xf8ec9190916c75a8L,0xf3c258c72728dfb8L },
60968       { 0x5dd4ff4f8af19574L,0xefddf5795d076b1cL,0x318b5b98ba8b777aL,
60969         0xd971d426fb7f8409L,0xed1465e8b0fd31dbL,0x80d24d4300f66347L } },
60970     /* 9 << 343 */
60971     { { 0xe8263e8012eb6baaL,0xc452c7581dde8c37L,0x5112af2840baa45dL,
60972         0x949b8a740793703aL,0x8ba78382e60e007eL,0x38cd110412823c99L },
60973       { 0xdeb0d555f86cf04bL,0xb2f20bfdfd9f6320L,0xff1d399d17c39502L,
60974         0x1340aedd1bdf0760L,0x36b2b43c88cc0c09L,0x5f3dba7e9ce285edL } },
60975     /* 10 << 343 */
60976     { { 0xcea0374a69ca5051L,0x19e060ad5294ae7aL,0xf6ce02361bb01f47L,
60977         0x2a5b28ba8c328b8bL,0x6991b1d8b253d630L,0x360afd40859455d8L },
60978       { 0xf5c6e1427c1f5946L,0x1eab83084cc8c391L,0x4eb4032f67e76ecdL,
60979         0x5bf14aa233898059L,0x0804a7c00e001b76L,0xe3866a93734cd134L } },
60980     /* 11 << 343 */
60981     { { 0xbe85177db72e5eadL,0x47c15fad59fd2463L,0x2cf5f07f4bd51f8eL,
60982         0x82f48288c2898713L,0xdb08aab4c8f753e8L,0x18a1f5c510f58eddL },
60983       { 0xaeb7bde366d0b94cL,0x04539620079fb6dfL,0x64d1aff2ebe8c4b9L,
60984         0x08d9ef431a10a101L,0xe326c7ec6c602789L,0xd8b1b3e7f6efc3d1L } },
60985     /* 12 << 343 */
60986     { { 0x5ba5288c1ae586a2L,0x044f1fc61b715821L,0xc1a9a997602f3c65L,
60987         0xc5c7512fe08c0223L,0x48a19c3c367e6f1dL,0xa9f2195dfb241597L },
60988       { 0x9f674a5fb5ba32a6L,0x275a060f0a312742L,0x5aeb8c4303d6f13eL,
60989         0x0fed575d917433fbL,0xe4a5ef9a59f53490L,0xa9f86145f315e616L } },
60990     /* 13 << 343 */
60991     { { 0x770d01ab2c1deef8L,0xca72f761f61b2a4eL,0xff686a4ceff9ee49L,
60992         0xd6b338d30d07000aL,0x885b4e8ce1050b10L,0xd6326179b2364b01L },
60993       { 0xceb2bafc672b298aL,0x7df8941aba628946L,0x9c94004ebc56b115L,
60994         0xde09cc2d7b12cdd2L,0x9c2dda163833ce43L,0x88da691a6265b59eL } },
60995     /* 14 << 343 */
60996     { { 0x7059c58669a03980L,0x91f2dfe4e88e1287L,0x96dcd9318d9633ccL,
60997         0xb2abc44f37bda148L,0xe31adb3feb8964dcL,0x7b07e015e316876cL },
60998       { 0x31732880ababd240L,0x5c37a667e95854a1L,0xb5b334c91d6f69adL,
60999         0xe613e5622c34e118L,0x8bbdbf5c5f5984edL,0x82ecfd95cf4f63a1L } },
61000     /* 15 << 343 */
61001     { { 0x813caa72ade4e3bfL,0x29055be8600c93c4L,0xcb346967e6e4ec1bL,
61002         0x39c1152d50ce992fL,0x4682c20e5ce62852L,0x04e9dcb7f4e45ed4L },
61003       { 0xda75355d7c0fa5bdL,0xe80f29b078949d91L,0x6214610130fb9e33L,
61004         0xe70cda8f325eececL,0x49217f74efca3e14L,0xd3c890b36bd7246aL } },
61005     /* 16 << 343 */
61006     { { 0x315ad7a47e5a59f4L,0x1c615bfc543c8b00L,0xe12f97a8baa56473L,
61007         0xf263db4446edcfcbL,0x47cf91d53c1a968eL,0x1a1165b4c15db875L },
61008       { 0x5d35e53a3479616aL,0x649f87b45c59958fL,0x5d3d11ea246da3d3L,
61009         0xc1ddfcc653f06820L,0x8169d7116610c00fL,0x15f16ba54bddc8c7L } },
61010     /* 17 << 343 */
61011     { { 0x307b040d9977713eL,0xc03f7787dee9e016L,0x761a5d03e12c354fL,
61012         0x8fa1a4141cc88904L,0x2e079008b7675e71L,0x649c789591d68d60L },
61013       { 0x63467e93c98f1c9eL,0x81931ac7fcc52703L,0x2060c89538e59af3L,
61014         0x8c12e002a87024c4L,0xfc881e69b3b8496aL,0x2b4e482e1e827081L } },
61015     /* 18 << 343 */
61016     { { 0xf80ed61a30fa7e86L,0xf2e5f324a15ec5d9L,0x139ca085ecba2d64L,
61017         0xd164ee5ff3f5cfd1L,0x758c0008e5cc3cc5L,0xd180c463ce8fa1f9L },
61018       { 0xe5dd27054adc6e61L,0x061e0c3c592c39e5L,0xec5a8d4a4e437781L,
61019         0x9e4c6f461e6d4540L,0x33ab232e2526e6eeL,0x3c551685ea282d9cL } },
61020     /* 19 << 343 */
61021     { { 0x59507a2162ce1459L,0x88b465d1c6a2cb30L,0xa5ef8b2b5c8ef7d4L,
61022         0x73145f4c4dc9a457L,0xabad3390d19186f2L,0x7036b424f9b78a7aL },
61023       { 0xf76f51bb16e04046L,0xecd1ece92b2b71efL,0xda8d82011900f2b9L,
61024         0xc2d3291b268d1bfbL,0xa6c1c79a2d176459L,0xb27e5d5885ee1b7bL } },
61025     /* 20 << 343 */
61026     { { 0xcf19fb2a1e548ef0L,0x8bb6dfa0cc694171L,0xeb1668ca5c5e390fL,
61027         0xf5a3485be1975263L,0x4edfc596442cc850L,0x9901f447f9627d74L },
61028       { 0x3a6b85c984d0413aL,0x1466366167de639cL,0x9fc9fdcf11705bbbL,
61029         0x6d066e2bbff2cf80L,0x38dedc2fdc3026fdL,0xad533a981b828538L } },
61030     /* 21 << 343 */
61031     { { 0xa7d51d862222dcb3L,0x52e2531cd1a6c525L,0x742b1234532126d8L,
61032         0x226043f24e9e77acL,0x02f270afb3a75b2bL,0x7ede5714d4a8dc0aL },
61033       { 0x24699e16b34fd97dL,0x4e5d785e8d417ad1L,0x273f5dd1ec307ecdL,
61034         0x742373863186955aL,0xf46805fde6afd38dL,0xae100ba424562906L } },
61035     /* 22 << 343 */
61036     { { 0xed9f434e5216636cL,0x242bd09bc5c1668fL,0x8bb747bd804f3d6eL,
61037         0xd66d8753c7c83dd2L,0xa71016c2584540b8L,0xd8b16210fdd41a90L },
61038       { 0x5eb5947e1b65be60L,0x1bf995e7616dbdc2L,0x71b7099abb7dbdd8L,
61039         0x53650d29079eec24L,0x6bdd1b0e8ebd86c8L,0x0a9658ed9a31624aL } },
61040     /* 23 << 343 */
61041     { { 0x3be2ce89b8cf4d55L,0xf9b3c501822cdcd9L,0x0cc8423010e12f3aL,
61042         0xee09031a3c580ec7L,0xf4c256a812f4b48bL,0x71a8323104018d0cL },
61043       { 0x69ad6d7babfcf13fL,0xfa79b457af658743L,0x249f32816001af58L,
61044         0x158430fcea127a64L,0x25a3e4549a9be713L,0x68ba3f0fcc6b5bb5L } },
61045     /* 24 << 343 */
61046     { { 0x6c75bc93b7bfa29eL,0xf86f22b218ef6d69L,0x90ce6a1536dcadf2L,
61047         0xf11f711c7ce50921L,0x0739ceda38a479e3L,0x840b825e6ec3dbc6L },
61048       { 0x7c36c0a59fa23481L,0xceb61fd170cb186dL,0xac6f7d3c26e4754dL,
61049         0x4076d3b5f317b385L,0x52f1bd723fd9e9c7L,0x6649d8b6bf316043L } },
61050     /* 25 << 343 */
61051     { { 0x5f03dcdcceb1e25cL,0xafff6561d50ff864L,0x17208b6f3a6bb787L,
61052         0x61d96c978e15abf2L,0xb1beb427991107b1L,0x436328475008aa3fL },
61053       { 0x8a326eeb3595febdL,0xa8e5a037ec60dc0dL,0x762ebd2a3159f062L,
61054         0x8ea005adbd1b0bd5L,0xd4d863cf696d4121L,0x2a07a637eacc9b9eL } },
61055     /* 26 << 343 */
61056     { { 0xf352e28b54a8ffaaL,0xa8317f089ce68b6eL,0x7deb148770cad820L,
61057         0x2411b382b2c3579dL,0x20b21ed214d36e66L,0xe7331bec353b9ff5L },
61058       { 0x5692636840dff0b3L,0x13356f7b646eff07L,0x1e6e6e4508c64091L,
61059         0x913b83f2ea0b920eL,0xb69e5f839f713aa1L,0x8e59d3794632a60dL } },
61060     /* 27 << 343 */
61061     { { 0x3594c0d3cdefc3dfL,0x9d850e2fd21cf9e7L,0x245322944e38263bL,
61062         0x597964610e43acb7L,0x13fad563bca9408aL,0xe52983dba985390cL },
61063       { 0x9c5e71e08c000a9dL,0xde6b0b2f800949e2L,0xc58032d131d94108L,
61064         0x36cd4099b31811e6L,0xa8d9bdeb3981d619L,0x06f644e03d4760c2L } },
61065     /* 28 << 343 */
61066     { { 0xdc2870f8243cfbd5L,0x000b71b31ab496f3L,0x53511a3f708f4507L,
61067         0xbd7bd0381949d835L,0x723a007d938f4db6L,0x5bc8679e2d04e9fdL },
61068       { 0x51ca5fd176ec7fc4L,0x86c4205c988f354eL,0x9042e76b2a0a4a90L,
61069         0x368f52a84ad44d2dL,0xddc2cab8912edfb7L,0xde74ccf5cde80199L } },
61070     /* 29 << 343 */
61071     { { 0x91b31fcbcaa3f1d2L,0xb8a29af1bcc99f53L,0xc5842b2695662f80L,
61072         0x13954262a4b4b396L,0xc1fac956a6acfdffL,0xbe37fa4dcf60b88bL },
61073       { 0xc7715493dffff3deL,0x06dfaceda1274350L,0x9dfcaffd7460fa94L,
61074         0x5f1d3a351e9c317dL,0x2fbf393d377b84ceL,0xb4d9bc8404b83635L } },
61075     /* 30 << 343 */
61076     { { 0x29871ce22855a74eL,0x5418f0dc98696474L,0xd8bc07d6b90d0498L,
61077         0x391012a79fdc0ea2L,0x271396949b09f60aL,0xa0a43dbf3371f0d7L },
61078       { 0xab5849422af8d992L,0x64cbd121409eb3faL,0xd36faf01766864fcL,
61079         0x69189faea2a83417L,0x3c24d85e3733b772L,0x125a915d2ee497adL } },
61080     /* 31 << 343 */
61081     { { 0xa8f9eb2abab3fa8cL,0x484584f654ab1e16L,0xee74e5aab21b34edL,
61082         0x3ce626ff4eb689f0L,0xd757f22b0006e5bcL,0x611505d024a25e65L },
61083       { 0x212df14c46382659L,0xd17898d78c73da0aL,0x5604a93e51421c2cL,
61084         0x76147f7603a580a1L,0x325b5c8ae5c34d09L,0x6ff28848db857152L } },
61085     /* 32 << 343 */
61086     { { 0x8002f4583e455a61L,0xafbafd375bea205aL,0xa8ced112fb93f735L,
61087         0x27cb6292196e3084L,0x72395bdd77e8c744L,0x02e018d8ee71f5ffL },
61088       { 0x7cfc14d9c1337a1dL,0x94e14c0ad7b4d86eL,0x66e50129d213738eL,
61089         0x7a905d91bc0b5ea3L,0x92cb630afca06700L,0x65e06d5cbf3a0821L } },
61090     /* 33 << 343 */
61091     { { 0x769ff9191e1cde66L,0x6ef257d1944a8786L,0x881437da4f75233eL,
61092         0x15266f3768665eafL,0x21fcccafc1777505L,0xe9513e1ab7fea0ddL },
61093       { 0x67806e9c53c8a735L,0x24be9a769b11ae2eL,0x928c1455045d2065L,
61094         0xea0395b53557f62eL,0x910d7cb4c7d3a450L,0xe849c853c634443dL } },
61095     /* 34 << 343 */
61096     { { 0x76c6e48d3b476f69L,0x28195cdffe694ee4L,0xa3a9a99e2d3aacc9L,
61097         0x0f68fe36b7f320d8L,0xca84a6c9889ce762L,0xc1eafac94901907dL },
61098       { 0xa28b9916208c9770L,0x6846e639f8403e57L,0x12fdf9fa1d179e3eL,
61099         0xb81e47c843d046dbL,0x700ad19468c14491L,0x136395cebbac51d7L } },
61100     /* 35 << 343 */
61101     { { 0x7452dfd4f775003bL,0xb38a2031f1a4765dL,0xef36c513a2888c68L,
61102         0x2039b168a2339fd3L,0xf74c24be2cc498e9L,0xbeeaca157b622e31L },
61103       { 0xda72e5a005f2fb8fL,0xab4a98f0568d5811L,0x231aa495fcb15e1eL,
61104         0xf981bd7f537023f1L,0x29d6eb2db367e5fbL,0x15247194b8cd452dL } },
61105     /* 36 << 343 */
61106     { { 0xa81e4a4e55c2369dL,0x394de01b60a0f544L,0x22acfd07a8906e17L,
61107         0xf59b37a6cc9bc4d0L,0xdd16a22c7ffec12fL,0x07decc2ad5976455L },
61108       { 0xc5019463abe1d122L,0x2bf0ac0ce318c92cL,0xfa50280ab2bfc47bL,
61109         0x53354fc5c7cf8bffL,0xaea1d293e20ca341L,0xec25ecda8b626244L } },
61110     /* 37 << 343 */
61111     { { 0x05c6f1c99a2f572bL,0xf13f8c7747987918L,0xccb406d74101fdffL,
61112         0x93cea27bee1abcf4L,0x32703ada8f5adca8L,0xceaecb5f76313a1eL },
61113       { 0xf1c558980b9620cfL,0x942c28b51046c388L,0xbed4e9dc5a07cf8cL,
61114         0x423b695a6c734b85L,0x1ce0a2392ac87737L,0x40f126ac4d1cc7d8L } },
61115     /* 38 << 343 */
61116     { { 0x63e3bb09ad9e132dL,0xaa2880c5c9e84778L,0x23de89ea06049834L,
61117         0x442d1df3554e23bbL,0x87214f9f08c5f124L,0x305d967a6beb4996L },
61118       { 0x01676f804409f827L,0x16992f73a50147f9L,0x77ee56796081b38aL,
61119         0x8c75d293290afd9bL,0xf9578bca813f0aceL,0x395212dd0e786ed6L } },
61120     /* 39 << 343 */
61121     { { 0x63475e65c21b0f48L,0x114f9af5326c2c63L,0xa897bc01310f768aL,
61122         0xcaf47a8fc1bf3f5aL,0xc023bb3718cb887aL,0x3572f633685652a2L },
61123       { 0x2dc4ea0d7523287cL,0xafd60b92a121a141L,0xb6b4bf6e085ca490L,
61124         0xf599f8f2e5351ecbL,0xe38c8eacddba3d60L,0x2540585f5be9e748L } },
61125     /* 40 << 343 */
61126     { { 0x313b66cafd8ba33eL,0x10bdb130fabe27ddL,0x1181334c125e2b8cL,
61127         0x0f4f198fdb6f94baL,0xf7000076ac3f5de9L,0x1a78813d9d6402aeL },
61128       { 0x3427f75dc8a9e758L,0xcdac8b34b01f791fL,0x922c36d12a9ebaf5L,
61129         0x195ea05fb0487cc4L,0xe33de901a808baecL,0x15e1d5ac57291d89L } },
61130     /* 41 << 343 */
61131     { { 0xfe52cd9cfdc7e2deL,0x3947e578da6dccf1L,0x0548d4b5738751e7L,
61132         0xc73fc23f4b52a5ffL,0xf38eb8ff1b066accL,0xe9a40d37a27b40f5L },
61133       { 0x723b0752a264ad77L,0xe5d0c4efdea83bf8L,0xf7301e3fafad27a0L,
61134         0x336b0d86298d09b3L,0x462766bdb2ef2fb7L,0xa5311241141a7607L } },
61135     /* 42 << 343 */
61136     { { 0x10adb987ee1f44a1L,0xd6ebd1c3e51c0152L,0x0cf1303f4dd3b9eaL,
61137         0xd06351b837a33a3aL,0xb5ce1d941cff1f0fL,0x326b3e055476e2bcL },
61138       { 0x90f76b5d3426b8ddL,0x77497380648042f1L,0x48684604f9f83902L,
61139         0x00275191180f197aL,0x36fd84ecde7ce932L,0x52b428e65391a268L } },
61140     /* 43 << 343 */
61141     { { 0xd2c1ccb0695c2851L,0xd722b84ff1c78f17L,0xaaa53d26fe52f2a4L,
61142         0x3057f4ed24742143L,0x951332a4a2aea258L,0xe5e4db6091096878L },
61143       { 0x71db9e48f0b9ef38L,0x7e4b25c1ac542c26L,0xb7250394dd021df5L,
61144         0xcdcc6118ee48e711L,0xbc324af1fcdd5db9L,0x71a664ef3e6de57fL } },
61145     /* 44 << 343 */
61146     { { 0x4e2a05c1c21cdd1fL,0x8a232097dd46e76aL,0x8b55313cd871b1d6L,
61147         0x976ce5f6af396bc4L,0xeb91527dafd381b1L,0x6cfd449014455ee2L },
61148       { 0x8723be9e1f274d1eL,0x1c63fd011999fa9fL,0x5f1726258049b6f8L,
61149         0xe18a3ecd99a51b4dL,0x329fc2c1b13d4e65L,0x94da252b0f18f300L } },
61150     /* 45 << 343 */
61151     { { 0x583adeb8b893316aL,0x69dce1efee5122deL,0xc5cacdf319b77627L,
61152         0x061fedee5e8aedd8L,0xd53fce220257dce1L,0x0e4124bdc781e069L },
61153       { 0xf097c697d44ed517L,0x7704e33e9a4e9019L,0xac245dc23e0088dfL,
61154         0x70e1176bb76102a3L,0x55261ab235e4dcaeL,0xc2ba59230ede3501L } },
61155     /* 46 << 343 */
61156     { { 0x6edf35f3af073b6dL,0x7ab4118107376eb0L,0x4ef3e65be7ff1c9aL,
61157         0x654ea359d2ac6d70L,0x2b41a7f67ffcd91fL,0xe5da0511e0a60e8cL },
61158       { 0x97fefd9756701b93L,0x7a4a827dd34afe15L,0x8bd6c2299090536cL,
61159         0x110156f217e510a0L,0xce62a26ec801ca6aL,0xa786e9b05522b64aL } },
61160     /* 47 << 343 */
61161     { { 0x3c73c2868f02f70bL,0x744a580d0eeca325L,0x58b7ca1733534669L,
61162         0xd7d17d77800b0270L,0x864e3509538b116aL,0xc7eda5dce4797818L },
61163       { 0xd6c00fbaf741f023L,0x718ed11131d022bcL,0x4586baf2f2ce39efL,
61164         0x1095729dcd9a09f8L,0xf5ff3f2d7652f5ddL,0x29d95a09dbb72722L } },
61165     /* 48 << 343 */
61166     { { 0x7b151b98e28fd10dL,0x8fc01ce81dd884cfL,0x1f0ffb5098d56c2cL,
61167         0xf9df1fa2b084606dL,0xf86232bfdc7d2008L,0xeae5cb8fd8751699L },
61168       { 0x70f0229883ed54fdL,0xb575283a86087697L,0xad2191350302e2c3L,
61169         0x1c09a0d6c4b57e01L,0x0f65e1e1c541b9fbL,0x85493d9bf4fe76c0L } },
61170     /* 49 << 343 */
61171     { { 0xecf595d6bc19db89L,0x32cdf31bd607e09bL,0xfaf93c636217e9faL,
61172         0xa9a1619884d37c72L,0xa2688a33bd929e8eL,0x2ce3442e2842b31bL },
61173       { 0x906ac09ab37184daL,0x93a1a54492587ea0L,0x1acfab1ec5b4ce7eL,
61174         0xd4788cac7131e80bL,0xb463d67bc8cf0e18L,0xa754ffb81f24067fL } },
61175     /* 50 << 343 */
61176     { { 0x634f8d6db04ea518L,0xe8c424b4c60108a7L,0x3553b6d11ef6f4bdL,
61177         0x1fe850dfbc0a8e1cL,0xa077055473a66e4aL,0x5417bd50da985b55L },
61178       { 0x3f99edcaed53259aL,0xd243f2d1b3d5ae6cL,0x70f404b8cb49e74eL,
61179         0xf6893edc51fec8f0L,0x3f3ac23871521335L,0x127c055436e39048L } },
61180     /* 51 << 343 */
61181     { { 0x459a96595ab6a5b5L,0x14ec172bb5ac2238L,0xe556f7061642ba57L,
61182         0xe18d92d2da35bad6L,0xe64f9bcdd5805c1fL,0xabb4e0243b297094L },
61183       { 0x95429e14b8b876f3L,0x27961a7d9c04bad0L,0x81c74cf57fa32b6aL,
61184         0xb035259ebb0f1f24L,0x828c42da2e773f8bL,0x06c996366ea73c24L } },
61185     /* 52 << 343 */
61186     { { 0x353718ce191c21ccL,0x08e6edf64ad6bd18L,0xc2bb0d6e4dc5b572L,
61187         0x328e19df88193daaL,0xccc9f6ab7211c958L,0x377d99ef58aae5c5L },
61188       { 0x40e2ecc91c823442L,0x036d6d528b0d36abL,0x2fe0cd7eda4d0ad3L,
61189         0xb8fc3c7ffc8af791L,0xdb7e44a42b201b20L,0xa5176004ebcf527dL } },
61190     /* 53 << 343 */
61191     { { 0x24d19ca6fed20bb6L,0x0c02db9841d634aeL,0xfb55998930310b8fL,
61192         0xf9d0818506c00c8bL,0x2b9983fb4742362cL,0x16ae9bfbdce1b6f3L },
61193       { 0x679057e6a161a419L,0xe1e80fe04db28bbaL,0x2ca0c869f06c9a98L,
61194         0x7b80c43bc448ffa4L,0x100f205cb7ef73f7L,0x29565a93a938bea7L } },
61195     /* 54 << 343 */
61196     { { 0x4d00c613e1e7a831L,0xc90021dc56d9ddf2L,0xbb80b8385286ccccL,
61197         0x156b05b771f5f09dL,0x120f47f47bc921f7L,0x6ea1715f8a65c50aL },
61198       { 0xa070c9f695aa8348L,0x96120fe273171f56L,0x10c7d592ebc69e4eL,
61199         0x73f6ba27c1c7ef52L,0x10f5b9cef8bb536dL,0x8bc82b225ce0220eL } },
61200     /* 55 << 343 */
61201     { { 0xac25749af4f3fa3bL,0x2376bcd76f50e4a0L,0x9c68fd1028b2332dL,
61202         0x130ed4d12130b66bL,0x91842d58038dfc9fL,0x4111e4cbc401a53dL },
61203       { 0x85532deafb5d9b16L,0x0c5657503025e3b1L,0x1340aa49b6cc0c31L,
61204         0x1cfdd7d68b7f71a0L,0xee911d7e8b6e548fL,0xcddf07f021456ebdL } },
61205     /* 56 << 343 */
61206     { { 0xe19b7576fa5256d2L,0x418d5425db3f8bfdL,0x00424869951a1719L,
61207         0x2383c7a8533b69b0L,0x166a38e2e67a86fdL,0xa6baa01c5876c435L },
61208       { 0x574ddc4584a208f5L,0x8cee30b826b18dbbL,0xeced99c1e9f6b30dL,
61209         0xb638d88da7d34beaL,0xa4836806069adedfL,0x62beb7ee7a07c593L } },
61210     /* 57 << 343 */
61211     { { 0xffc89d6de16d63b2L,0x4da3b04f5df40d2fL,0x3437da2ab48706d8L,
61212         0xc35290a1d677df03L,0xe54fc6567c5b6c8aL,0x84f052ff2c77314eL },
61213       { 0x59c33a99d968b4eeL,0x2424c5d0facce444L,0x022d7bfbf505307dL,
61214         0x5372518d00c142ffL,0xcc82d21aeefa787aL,0x3517f3c0473ef630L } },
61215     /* 58 << 343 */
61216     { { 0xaf576c307a8a437cL,0x15852131de3f2cc9L,0x96bbff4371759da5L,
61217         0x106934ec66f5257dL,0x712e7d0ba9cedae6L,0x5b0b876ddabf131bL },
61218       { 0x1605f3a8b741f94fL,0xe5d961c109305b04L,0x3fb97996346266c6L,
61219         0xaf4eafc0b3ec7458L,0x0aefa01abcd90b0cL,0x2b7723e3505ea305L } },
61220     /* 59 << 343 */
61221     { { 0xe5c6f37b43d12de3L,0xdc34fdad642baf26L,0x89d716d647268e1bL,
61222         0x50047b391df8d657L,0x40da6352c64470a7L,0x406e3bc97879824eL },
61223       { 0x9677b4c38b9ecc36L,0xc82bf16fd246788cL,0xbc9fa99cef5dda3dL,
61224         0x3050febf0e7b676aL,0xfbb1301a53e448afL,0x3239f20267c84d67L } },
61225     /* 60 << 343 */
61226     { { 0x5093950b724fb94dL,0x107822718117ff50L,0xdc9e34b59f5961d7L,
61227         0xfaa2fc012351a33eL,0xb9e0f1d9d5fc462eL,0x276a5b3bdd9c6914L },
61228       { 0xe6136d1775365ca5L,0x228b77e2a91eed68L,0x5cd6a269411e4770L,
61229         0xd8857b0e17590390L,0xe7094f3aa0d45fafL,0xe52d11dcf40693e4L } },
61230     /* 61 << 343 */
61231     { { 0xc873fdf565a0d2bbL,0x848244dbaa42c6cbL,0xa5d2d766ac50ba78L,
61232         0xc650cf4343f38ad7L,0x901cf122ea895d06L,0x3ec1b583cbf46321L },
61233       { 0x863dce6193c3db94L,0x902459202445bb4fL,0xae716052673385dbL,
61234         0x9266b0bfff830253L,0xd201095844375610L,0x9e008b9712cf8d71L } },
61235     /* 62 << 343 */
61236     { { 0x2b1b2a551448e73bL,0xa8486146b5f97da2L,0xcf24d8636c848202L,
61237         0xa3d6431c5e483407L,0x47a33db852edb78bL,0xb09256a37dad3826L },
61238       { 0x740222a74dfa2b26L,0x23f43bec2a8ebe04L,0x4081e512a8072f18L,
61239         0xe53f0d05751ad7e8L,0x100d0a17332361ecL,0x8a2122e9e0c3a152L } },
61240     /* 63 << 343 */
61241     { { 0x28be8affe7e6417aL,0x4e18b452d6a30763L,0x73ae410310d0d5f2L,
61242         0x5151fe80003625caL,0x45ebb636ba7a91ccL,0x50f4b49d994e7e31L },
61243       { 0x02eaeaa93ebac455L,0x7632c7dac830fb1cL,0x06fe1dde3bb0d765L,
61244         0x0d2f7623a6789d20L,0xabba46de01a43e9dL,0x2e822e08f27917f9L } },
61245     /* 64 << 343 */
61246     { { 0xe96c4aebe5f5b545L,0x10a85a002d4c43b0L,0xf86ad2f632f9151dL,
61247         0x05daf874302b99e2L,0x4299dbfa14fd3171L,0x27cbedd6812cfc62L },
61248       { 0x42e61536b8772164L,0x52eecef76a5423efL,0xc34c6c70548fffa3L,
61249         0x1fbed7777b6db825L,0x850bded44ef2989eL,0x3b8a542c815463eeL } },
61250     /* 0 << 350 */
61251     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
61252       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
61253     /* 1 << 350 */
61254     { { 0x9decf2173079fe2fL,0xc32ec5707c817f6dL,0xd5649ce8aeb36b92L,
61255         0xab9f77d158fb4dc8L,0x66b11fb6b52d60cfL,0xe217941deaaa4619L },
61256       { 0xf3522a9a1607c412L,0xea2eba4fc2a3d8c9L,0x267997c625e38722L,
61257         0xed5047b72d4595eeL,0xaaa41e5f55e5456cL,0x891e3d1278cfc6feL } },
61258     /* 2 << 350 */
61259     { { 0xa438634ed7357a51L,0x918f14cd18c04d59L,0x2ab4dedfac40dd56L,
61260         0x758e95ee4956a5deL,0xfc11e3945113f84dL,0x6d71b6736059f16cL },
61261       { 0xfd8e2236fb357c3fL,0xd7c8681232dca873L,0x02aeb1538ea13b44L,
61262         0xde1275d3013d3827L,0x470a7b7e659ca201L,0x862c83c55c77b351L } },
61263     /* 3 << 350 */
61264     { { 0xfc9b800f05084cfbL,0x1c4d4510496f23fcL,0xfea0003cc1d08465L,
61265         0xf0281da09af48a41L,0xa5c0d97144d32eedL,0x2613b73e023a2e31L },
61266       { 0x455013c87dc8ac1aL,0x581b13195958b3daL,0xd293f2f22290aaeaL,
61267         0xa068256496f6223bL,0x38fd18fa69410ef6L,0x74eaf35f2b2cf629L } },
61268     /* 4 << 350 */
61269     { { 0x281f6e58c7ff5b50L,0xbc67791ecf9cd114L,0xe29fa41afd89abd8L,
61270         0xfcb0b0b07984feefL,0x0b0928a6d9d20a64L,0x2fd385c46979ccd5L },
61271       { 0xce9c34c81fbe72e4L,0x69364344aad0135fL,0xd464635250946a5bL,
61272         0xb09a97c6f39f53b9L,0x1d47bc20dcbc8b64L,0xcda5c7bdd458b0d6L } },
61273     /* 5 << 350 */
61274     { { 0xad5b8c2887eff3b3L,0xa8a3917d9937833aL,0xbafdc493200c3b49L,
61275         0x9e27aac5972c6fbfL,0xfd292bb20518c97dL,0xa62126db33515a63L },
61276       { 0x9892a8bb1bcfc875L,0x93b066b7e0b674d1L,0xcde9b0087fd3d080L,
61277         0x1e285a8859401ae8L,0x4679e32982cfea96L,0x52406ea023e615d3L } },
61278     /* 6 << 350 */
61279     { { 0x27de61138b6e9462L,0xb8ade1dc473464bfL,0x911ad49394dacc08L,
61280         0xd036f28e44252cb1L,0x3865abf6d13dc20dL,0xcea487cdd528f0baL },
61281       { 0x14d77eaf4fc290feL,0x5106533bc5084101L,0x11001dc7cda9eccdL,
61282         0xb79ad4bc49fc4a78L,0x4f6369f54567f8a9L,0x64050aa2df7ab817L } },
61283     /* 7 << 350 */
61284     { { 0xffe057aade07f615L,0xf3f91b55342700bdL,0x294761e127a839f9L,
61285         0x6411a2b480eafe1cL,0x4900eb120737b80aL,0xa1134d10bb73264cL },
61286       { 0x0ebfad730ddbf7f1L,0x57bbe692cd1f73ecL,0x675931fca20f8944L,
61287         0x1950eefffad2ad19L,0x60d304029cdf88a0L,0x121af89e33fd2c6eL } },
61288     /* 8 << 350 */
61289     { { 0x763e3664295c4db2L,0x632fd676dbbaa92dL,0x62ab11a8c66b40e9L,
61290         0x06244698f384b708L,0xe7cdf3bd69197876L,0x9cc79c48064f8837L },
61291       { 0x95900a229486589eL,0x7953f6e72ff01639L,0x3f65fbbddd3e6e46L,
61292         0x84f52e06baa2e2a0L,0x1dc462a8e3852824L,0x9be69c3f7e4c032cL } },
61293     /* 9 << 350 */
61294     { { 0xa40afc3670977e01L,0x965f110da6c3b289L,0xc4952f87805a8491L,
61295         0xb36804b80b65e2d3L,0xd3f6f5ace8cf2b2bL,0x0f37a79da4b71938L },
61296       { 0xb2f810d9489ef671L,0x1feae0262df23cd8L,0x7412eee321a14e4fL,
61297         0x1458b8ad179d51faL,0x2156a90ee201509cL,0x39f29fca72605867L } },
61298     /* 10 << 350 */
61299     { { 0x231f70adb2e066e3L,0xf09db880bb477a19L,0xdfa0e503907e5c63L,
61300         0x12fe09f4f97022adL,0xdbf06f3620bce7ddL,0x0140e197f1371cbaL },
61301       { 0x917b6da464b0b4b0L,0x9a6f4d9b20fe3320L,0x0981d60ed66bdf87L,
61302         0xb430e4e062d3487cL,0xc3440fb934dc4a94L,0xe7972dda09a5e3c9L } },
61303     /* 11 << 350 */
61304     { { 0x29d6394093f47052L,0xadf04e70847e5937L,0xa0ef4fee731bab6fL,
61305         0x21de31956ee7d7bdL,0x99af4a8dbd716777L,0x9e15c983df4c569eL },
61306       { 0x2ec7bc0ce94401eaL,0xda1835ad85727722L,0x2b5862ce5dad81daL,
61307         0xb2be508188dddc2eL,0xa02482101414286bL,0xc52c436d8ea33f3fL } },
61308     /* 12 << 350 */
61309     { { 0xcc580ea73b24e776L,0x0f3a8b189d721d6eL,0x8665604fb23480cfL,
61310         0x95787cba34414689L,0x425d7c6f4d10a945L,0xb5ec2626b2f1cc78L },
61311       { 0x55da88858658de6bL,0xb50919d1e9aba03eL,0xc64881d7d99e417eL,
61312         0x1eeba5aabf28fba2L,0x20feb7b3504eff80L,0x9f5f9db650debfb7L } },
61313     /* 13 << 350 */
61314     { { 0x4eb94584230923dbL,0xba8611287b3a6929L,0x5aa7faa3ab1d6b31L,
61315         0x95c1e23916ae0966L,0x98674fd3a2fe2297L,0xa8da0ee53c42d488L },
61316       { 0x103cabace0740db0L,0xf0b860d45bf16882L,0x03cb0cdc289e48ceL,
61317         0x3c15d3759e52c7d5L,0x524f731998103ca2L,0x828ed65cc609ffebL } },
61318     /* 14 << 350 */
61319     { { 0x518f231b83dfb993L,0x4b0987db37c0826cL,0x0c34961cd5177eadL,
61320         0x9d882d3e452c92daL,0xbfeaf5588765bcedL,0x83957b62b9962295L },
61321       { 0x2d1d01757bb084cfL,0x04c4cfcde8cffcfcL,0x2f35e33d8d4536c1L,
61322         0xbebb31cbd83124cfL,0xe342bed2abb29019L,0x2af0fcde2692a0d3L } },
61323     /* 15 << 350 */
61324     { { 0xece5d865c7e3b29fL,0xe58106a4622839ddL,0xf5272d43f2969d76L,
61325         0x90c72c1b2a1a240fL,0x1e2aa0acaf15e14fL,0xfa2f1c7bf1b6b5a0L },
61326       { 0xfb5d343d880224a5L,0x47b88a84f91881c5L,0x140f5ee9dd142fe7L,
61327         0x4e76982e24b37c44L,0x6aaf61e9578b482bL,0x01950e22765bc4e2L } },
61328     /* 16 << 350 */
61329     { { 0x20ebf79ce8a2e8f0L,0xec040d0daca418a2L,0x016c07e78d630d2aL,
61330         0x20021d57fa605dcbL,0x6190f3e942d04705L,0x4e000df58974b7e6L },
61331       { 0x6710da6c5abcedacL,0xf31aa4965f95d37cL,0x192c4b8ba5830899L,
61332         0x171ab8c4ea7dbcddL,0x715f60818cdf1097L,0x0e0135bf205d10edL } },
61333     /* 17 << 350 */
61334     { { 0x070fbbe1687645c4L,0x4dd859c8c7e0261eL,0x749fa1e9fad54b60L,
61335         0xb35942f483cdc91fL,0xcef26d0018eeb83cL,0x4dddd5787462064fL },
61336       { 0x0420ed6e703e8740L,0x9087d805c180c7d3L,0x93807412828424f2L,
61337         0x8bcea69a6dcae236L,0x22aed9a2d1973c78L,0xe3d0f6f83328d690L } },
61338     /* 18 << 350 */
61339     { { 0x5ce5bc6da85a13acL,0x868f385c7f1dd71bL,0x15aa63a420c376c6L,
61340         0x7802fc9e749127dcL,0xfad59f8e67a98935L,0x6bc97b1d60c0fdf3L },
61341       { 0xd24caa7ebce87ee6L,0x8aa08bc27ba511f8L,0xe5ba94f47ba61c1cL,
61342         0x9fe9c343364d2d75L,0x8ee0468161273932L,0xab2f0dbe5e8c4861L } },
61343     /* 19 << 350 */
61344     { { 0x13239c0a8254ded6L,0x594182e61762f9cdL,0x6326369d480efa21L,
61345         0x7fee5afd33101382L,0x9e1ea59c4688bc0bL,0x7a3b1b8eae19c17aL },
61346       { 0xa8f8f8e5777aedf3L,0xe2d018bfc6bbdeacL,0x3625b03b54328db4L,
61347         0xda7540c8711ab8caL,0x7faa19fc46930a99L,0x61a5d1845b59a973L } },
61348     /* 20 << 350 */
61349     { { 0x4a6226f9f7092423L,0xfe6b7a6dec945231L,0xb44e2e60a1193cabL,
61350         0x2ce6393543dda270L,0x1a9e8a2138d64738L,0x863d151a9d843675L },
61351       { 0x98a1222ee2b14443L,0xbf8b32712826846fL,0x80475be555508801L,
61352         0xc39ccd917b38f064L,0xea31304de8e249f5L,0xa3b6891b4d42db74L } },
61353     /* 21 << 350 */
61354     { { 0xc0f1627a147e0f32L,0x59fb7f2f5e8822d8L,0x21d8be6371097441L,
61355         0xa6169f1b855543f5L,0x188c420645102ae3L,0x4c20a136131b674fL },
61356       { 0x05487c4d15999699L,0x8a82a130e6ba5542L,0x93a2119519ec0de9L,
61357         0x634d644cc8d0538aL,0xa90c5eeb3b6bbd60L,0xd59105125e4db926L } },
61358     /* 22 << 350 */
61359     { { 0x5140a7172119e821L,0xe5a2ca8cbc370a14L,0x0c17ad48a6db3398L,
61360         0xd7094545ed6fc82aL,0xcf32984dedb976d1L,0xcf04ac16cdf83a9bL },
61361       { 0x9bbea16b49775502L,0xb4855286452a6f35L,0x45cbc3b7a86f445dL,
61362         0x5972ec64763f5990L,0x14d0b9c0b780b2f0L,0xb120273456e707feL } },
61363     /* 23 << 350 */
61364     { { 0xbf6b76e1e41c43c6L,0x64ea1824db033acdL,0x7fc0399987c9406cL,
61365         0x9427585a51b371d3L,0x464f3559c9705e0aL,0x6639797ac8cb6ff6L },
61366       { 0x5104a72e842fbf01L,0x7cabb009fea7af74L,0xe42aa69b19a1db1cL,
61367         0xca9599a3a6a7ab69L,0xf31e4aaa1a70d770L,0x0fcc7f1b8a5ef098L } },
61368     /* 24 << 350 */
61369     { { 0x39a689bc281548baL,0x11aacfca138eabbeL,0xcf33108a8d29457bL,
61370         0x312612e014ed4b4dL,0xcbb21f345115625fL,0x4e7217de303a363bL },
61371       { 0xaeb0c8c0d137f67bL,0x4ff84a937bf78dfeL,0x7a022604683b37dcL,
61372         0xfa4ced77862b0847L,0x5a49bdc136d69390L,0x6d9dff06c0215314L } },
61373     /* 25 << 350 */
61374     { { 0xcb116e787b1320bbL,0x6310206258ed15fcL,0x1a7891a082c13108L,
61375         0x203d73d939eb4c93L,0x0485b8493c78c65aL,0x663897e93c935525L },
61376       { 0x9b79708088b41afbL,0xbd34d5134f2b649dL,0x0b4c156f62f6b652L,
61377         0x24125d1d6863dca7L,0x726a8bb2edb6638bL,0x2ec5deaf82aea7a2L } },
61378     /* 26 << 350 */
61379     { { 0x9fb22ca52a3706f1L,0x5a265b5279f5203eL,0xc8844f096fcbd426L,
61380         0x52a165f0ed8a3267L,0xff0b3a00dfdfcac5L,0x80167cf52de9e1c6L },
61381       { 0x9e9c4391b0b969c7L,0x279440c41e0dabf6L,0xaa535b8f85133e39L,
61382         0xef61e22234660228L,0x8ea81a41c386528bL,0xd0bb1f6e71a8c66aL } },
61383     /* 27 << 350 */
61384     { { 0x75a689bfa67ab0ecL,0x53eaad3e54843363L,0xdb71f81619a3ba98L,
61385         0x817257fdc244f33dL,0x8181c028c0fb3720L,0xc813c4651cb7bb39L },
61386       { 0xbc44c1e71b189585L,0xaedef8701eea3a29L,0xcdd828d7ccb5dc90L,
61387         0xd224f1774fd2e0f1L,0x2a4723b0e78883e6L,0x33bb05473128e260L } },
61388     /* 28 << 350 */
61389     { { 0x544874b71477473cL,0x253a455a3907385fL,0xb303afd631411ba1L,
61390         0x30047aa0466d6415L,0x3a1b676594d4c2deL,0xc265f1912860c7b1L },
61391       { 0xfe140a73688e7975L,0xf08a652bf37ce7deL,0x6c9f6df9f46f144eL,
61392         0xf7e7b95bc0defbc4L,0xfbc9a9697824c075L,0x9745d768d7773c39L } },
61393     /* 29 << 350 */
61394     { { 0x7170ab4699873dabL,0x765eb89b8952bc0fL,0xbe3fe2c4f78fd020L,
61395         0xde51f8579f194b70L,0xa625839e7cc68fbbL,0x50e59b49f7105097L },
61396       { 0x625294f3b82e287dL,0x98daa85288ca9d10L,0xfa0eb790b499d9bfL,
61397         0xe280de610382dba8L,0x3fd350e0e76a7d70L,0x1e5c2bebece5ba7aL } },
61398     /* 30 << 350 */
61399     { { 0x73e187e000ce469bL,0x21dc6268dbd717ceL,0xe9d63224ee564ef2L,
61400         0xa7553c854c4c444bL,0xdd409398f6a9b713L,0x902c9cff72f94d6fL },
61401       { 0x944edb33f50a36eaL,0xa48a5ae4cfb65a8aL,0xcb9a83b9ed82fddfL,
61402         0x9476090c209aa829L,0x66cd0cb1c7e2347bL,0x0f1fe07c86fa005bL } },
61403     /* 31 << 350 */
61404     { { 0x7c17a2e0c65e52b9L,0xa987f030615b8325L,0xa39b78aaa3d4dba8L,
61405         0x738ce26396e96e82L,0x313f7bb7f08f99cdL,0x29571b3cd1a1b7c1L },
61406       { 0x00c0e66c89ead6e5L,0x231de4ff19b9874dL,0xc9445296a4137755L,
61407         0x7b95f3ea336ea724L,0x7c0a222c49bfe5a0L,0xa265c41d782f8d4fL } },
61408     /* 32 << 350 */
61409     { { 0xd2db4d35c8d2bf7bL,0x52105d0981571d06L,0x447565cc723a57bfL,
61410         0xd98c3597d8ded62cL,0x0aeac6d9de2f1a9eL,0xd363b0b70a98d3b2L },
61411       { 0xd9708f0702ad9933L,0x9334677564f5809dL,0x499332cf49cda010L,
61412         0x546df74a858467e2L,0x8b84a55093748e8eL,0x9e88ef9706f09073L } },
61413     /* 33 << 350 */
61414     { { 0x1cdc6b4f673d9c55L,0x4300148a0c11743eL,0x2f924ce4c38b8c99L,
61415         0x5300ecc925f32459L,0xb9cd815004473c2cL,0xffee15498eebdcabL },
61416       { 0x42c292d54c537dbcL,0x32f6d8a293a133d0L,0x4da3a50c35dc41a6L,
61417         0xc16dee6a102f9ea4L,0x69a017a1f00d0bd6L,0x6a95ee1527acbc5eL } },
61418     /* 34 << 350 */
61419     { { 0x6c02c17adcb73b47L,0x10073a3454b70b07L,0x417ca218a7fe7a73L,
61420         0x6f81a38e4ab64b0aL,0x4e25301f8fa7fc44L,0x180f3e1b27d41e1eL },
61421       { 0x88925649ce1cfbf5L,0xae279fff2eedaeb9L,0xeac9b033eed426cfL,
61422         0xa8488f8aa1740d49L,0x6f748bc3711b5da7L,0xbb1c46fd23bbe135L } },
61423     /* 35 << 350 */
61424     { { 0x6b2f317b9da70c21L,0xebddc2b5c99dc82dL,0xf4a85d4c5c807d1eL,
61425         0x47a79b298a15ad6eL,0x02afb05befbda553L,0x34f3998e6941a669L },
61426       { 0xa4a413fb72deac14L,0x2bd9306c1941b899L,0xae023fa5788c1db8L,
61427         0x38cd6c42e1012bb6L,0x77ae298c13bd860bL,0x6312af9d63bb40cbL } },
61428     /* 36 << 350 */
61429     { { 0xbb7742f370fcad48L,0x6dcce7ff57d444acL,0xfc338485b6abc122L,
61430         0x03c1118caaf9060bL,0x095dc123cb997905L,0x2dfe24453dd9bee4L },
61431       { 0x9bffbbf9d45cdcdfL,0xc5b50babb4b26fe5L,0xe985754e87d31873L,
61432         0xb5b007f5a503d2e0L,0xe25c4eb620bb8357L,0xb6f00e50803fa8ddL } },
61433     /* 37 << 350 */
61434     { { 0x21cab682b8035f01L,0xec82f6ae301c96c1L,0xf25d6a0c1539a503L,
61435         0x94180ece1e35b449L,0x13fbc96f1ede3c57L,0xe4a63eac01d8e678L },
61436       { 0x3d1a745c068c6886L,0x0659d6ff233be378L,0x493d7a6f3244a214L,
61437         0xfa852b1b772bd953L,0xbf05cc0ce87db547L,0x28f497ccb30aacf9L } },
61438     /* 38 << 350 */
61439     { { 0xa92f28b88ea312ecL,0x9c702e953a3b5f1eL,0xf0a2f787583053edL,
61440         0xf99506f29cb41eceL,0x4c3b00b5c2b5c214L,0x59bb943717b8d5caL },
61441       { 0x9ccc7869af5e6b94L,0x6eb795a7f340d02cL,0x7fc613c80a09eca5L,
61442         0xdac14e61d155f16eL,0xda25c7fcccadb39eL,0x160fda8c9c7fe2b3L } },
61443     /* 39 << 350 */
61444     { { 0x8aa83310312ee9dcL,0x702ad7bc2af291bfL,0x3940f883ec915c5dL,
61445         0xdfb7e44f6fe07c64L,0xa7af875c72d09357L,0xb5df04f4f70b766fL },
61446       { 0x738af1bb96f8b10bL,0xab27b86735563f8eL,0x18fccbec2ebaf570L,
61447         0x94e9066dc1d7d59dL,0xa1e3518dc63373e4L,0x0722fd0f22d8306fL } },
61448     /* 40 << 350 */
61449     { { 0xcd42d2391be93e28L,0x93c11fcae2ea0d1cL,0x8acd0b17345984efL,
61450         0x3e3feaf350905d0dL,0x4124e89a6f35b49cL,0xafdd8d27a2bae979L },
61451       { 0xce1e814015ad5661L,0xb0f9296dde281bc6L,0x11e93935c31ea529L,
61452         0x1c4c3bd7ebb898ffL,0x7cb73fc76ccc32c2L,0x69e5307da3ac9b8bL } },
61453     /* 41 << 350 */
61454     { { 0x37bec50c8e5a9a8fL,0x7f0daba5055a1aa3L,0xa56bc577a1c00a74L,
61455         0x0656b6aeab88258eL,0x2959237fb88f0f0fL,0xffff63bb9ef15ca9L },
61456       { 0xd9a2909eb94ae6c0L,0x2506a1779b304c76L,0x5658fed3abdf17c8L,
61457         0x9c95765e0f90cc53L,0x80ffd7b38e74dc97L,0x97e032e6b8c73479L } },
61458     /* 42 << 350 */
61459     { { 0x7073ada11780b0c7L,0x6d4ce321f35f07d8L,0x27b26ee589f35e5fL,
61460         0x5af10ecd324349d4L,0xf9a0a9071b9bd956L,0x5dde968571350ba0L },
61461       { 0x678158f5b6400a5eL,0x93764a022842e0deL,0x71a17724057c9ff8L,
61462         0x04c4313c72f58c63L,0x07fdf15cc4e81260L,0xd6c25e82a509f1acL } },
61463     /* 43 << 350 */
61464     { { 0x4f8a719ae3cf3138L,0x7aac7f0d9b1a2e30L,0x3fe8dcb88c0c76d0L,
61465         0x34afed4ade0b5be0L,0x824e043cfdf7c28eL,0x5b700afce708e71bL },
61466       { 0x6c7fa728eeffc50dL,0x2488eee97ca62450L,0x25490cb59d969f4eL,
61467         0x8bbbac3d8bd629aeL,0x7e5213b56e75e171L,0x1385bff25324b23bL } },
61468     /* 44 << 350 */
61469     { { 0x364e7371c7d996d5L,0x053390bf8cc483aaL,0x69c23cf281e948d1L,
61470         0x65e45d618e822ec6L,0x9240ee412ed94568L,0xe0f33912510a84cbL },
61471       { 0xad42eb0f6ecabdadL,0xb35afdb4bc7e39f6L,0x4ee63cb10cb50316L,
61472         0x7ccfa14a2a27dc3fL,0x584328f0b4141347L,0x361b2614a23cd89fL } },
61473     /* 45 << 350 */
61474     { { 0xe70edc42ee93ec36L,0xec773e52bccc99efL,0x9b0367a0ce0816e2L,
61475         0x43baad458c6757e4L,0x5d25fa821fb7b01aL,0x65913e86bb6bc3fbL },
61476       { 0xb1f1fcab67fafef2L,0xe5ffd89c9e9261cbL,0x86f7b89ff29bb205L,
61477         0xa76ed6722db408b5L,0xd6f1ce5cf83f53a5L,0x9cb5cd26c2882d51L } },
61478     /* 46 << 350 */
61479     { { 0x03f6ca364b2582d0L,0x70345ae80f8116e4L,0xc2612cbfc562aba3L,
61480         0x9cdd127789898142L,0xea7f202c02d762ccL,0xa00c15da33662a74L },
61481       { 0xcb5cc621aa430b63L,0x6dd1482fb1550d67L,0xb27e7df46216f063L,
61482         0xfffe57408f49403aL,0x9403206cfc2bc9f9L,0x132504014593a578L } },
61483     /* 47 << 350 */
61484     { { 0x6b9c67e6076b2d5bL,0x54509f61883d31d1L,0x25905831fe051be5L,
61485         0xe6633c1be93608f5L,0x284afa7697480e6aL,0xb124e6063a06cc65L },
61486       { 0xcbcb2c2e2c608edaL,0x07a39d8f813795a2L,0xf27742a8bd108bbeL,
61487         0x7425519005b4e5b6L,0xa27620b2b0145a3bL,0x6e3d1210c0f42782L } },
61488     /* 48 << 350 */
61489     { { 0x0eeb9dc702ed3c24L,0xe7cb624dfb39fc44L,0xded105f581d4cceeL,
61490         0xaa675d0c46465cc3L,0x313f4fc99af0a81bL,0xd129819f227e6a72L },
61491       { 0xaa6b690340b16103L,0x3dba75b2fb4c2fdfL,0xc9feeea1e7c79c2aL,
61492         0x14f503104e024e75L,0x3704aaa8b5729449L,0x39ac6b0c24b86accL } },
61493     /* 49 << 350 */
61494     { { 0x7e25860735214575L,0x3baa75cb068c68c2L,0x93b6a33f10be8d33L,
61495         0xa88f3cc11ba06b10L,0xe70e7ec2a4f8fe72L,0x32fed39fd4835710L },
61496       { 0x16137edf3e6059b5L,0x57b1bb9fbb064775L,0x68d3f26dac98cfccL,
61497         0x89339bce7f9fd53fL,0x15b32212825e946fL,0x55b0a89bf92a0ef1L } },
61498     /* 50 << 350 */
61499     { { 0xf419d9becd3eed01L,0x851b31659851492fL,0xa9ac81a9c9b0a402L,
61500         0xf67bdf20122c09acL,0x9b26b131f442a030L,0xf7a548f517e72d1bL },
61501       { 0x9e0dbf852a7f505eL,0xaa8e7348c7e93ff2L,0x4efa7877134d8017L,
61502         0x48f476fc13e5fb0eL,0x552d0447154f4040L,0x8d5b166569b18f6aL } },
61503     /* 51 << 350 */
61504     { { 0x65ef443e63c90cfcL,0x3a0dfb8194ed3ad4L,0x75570ba710b5547dL,
61505         0x5e161fa498e84064L,0xf55dc5003c576f89L,0xe46bd28c7f530eabL },
61506       { 0x367607400109f9c1L,0xde7a997bb15e9598L,0x25386f307593c3d7L,
61507         0x680e3639def120b7L,0x43fab687aa6e213eL,0xce48861daa99cf3bL } },
61508     /* 52 << 350 */
61509     { { 0x93c2cf3e53ead820L,0xfca3b3564f4444e1L,0xeb6d82bfaac7a37dL,
61510         0x9c0915d4cf49947cL,0x771f9f7cc7edadaaL,0x51418e487b2df679L },
61511       { 0xad1b249173f28cf8L,0x8fe4fb7baecacd2aL,0x539764bdb20d0b77L,
61512         0xb0073685a6a4f808L,0x4c6f5602cf909196L,0x1ae89342d45e9e7dL } },
61513     /* 53 << 350 */
61514     { { 0xcf8aa4e5f007985eL,0x833ea882c325d2dfL,0xc1cbaaf5f9f326e8L,
61515         0xe779a4a9bf906c20L,0x29f475bbc923cf15L,0x6598d52a54055b74L },
61516       { 0x1001a5f1e4fbd4f9L,0xb4933d56cc74cc71L,0x45c04a50fed802baL,
61517         0xda140558052bd04cL,0x71c127d63dfbd563L,0xef2b85ba42ebaafcL } },
61518     /* 54 << 350 */
61519     { { 0x76569e44bc325891L,0x8f8a1487fa2604afL,0x07a8bacdbc90be04L,
61520         0xeb53b1087b2c9bb7L,0xcfdc78aaad3c7943L,0xd74807da3bfcd779L },
61521       { 0x642552417189257eL,0x28138e8d23cb9584L,0x0ce0b331476b888dL,
61522         0x6d9ceaa0f2a9bbe5L,0xb4f1185653b872efL,0xfa9e6fb222d06df6L } },
61523     /* 55 << 350 */
61524     { { 0x0d45565ce6eabd52L,0xaca75463f41a4559L,0xc3e4064a846eb291L,
61525         0x22ac04bc8613d2f2L,0x74cf6fac2364ce2cL,0x61bbaca8be4fce3cL },
61526       { 0x302e8117b24dc7b4L,0xa72ae24dd89a053fL,0x75b2023967de96e1L,
61527         0xbe51cfd2a9e6d1bdL,0x807a8e3d07c9259dL,0xcf3cd92e43cf6384L } },
61528     /* 56 << 350 */
61529     { { 0xc040412c754b8669L,0xbda7e0cde2c1d3b4L,0x2ac3b3d5ba29b9beL,
61530         0x98a415e3f63bf3abL,0x25aee93ed1776a16L,0x46db7347ec3bc968L },
61531       { 0x8e44180a02612d2bL,0x4e3dc4e82db990ffL,0x2050f58f5f7705dfL,
61532         0x7b41f5892672d845L,0xeb301603c96e4fecL,0x66ecd24e6cb16a6eL } },
61533     /* 57 << 350 */
61534     { { 0xd428e7e3d01edc1fL,0xef608062873fadf8L,0x05e7c80d5606965eL,
61535         0xb818d0c6a979f826L,0xe9b4c5c7c4793537L,0x7ef637225e83bb66L },
61536       { 0x825d89499fbb3a85L,0x557abf0396e34cabL,0xfc3db05b8040ad0cL,
61537         0xbdc8e907e305204eL,0xdfc1628d1c1637e1L,0x10841d2a947a78deL } },
61538     /* 58 << 350 */
61539     { { 0x99432df309c7b138L,0x288eef14593b1fc1L,0xf47f9fb21b55f0b4L,
61540         0x5cc20dd46788b9a5L,0x2e87fb4605e43a77L,0x08cf86be849c700aL },
61541       { 0x467ec61374680ce7L,0x44e5c8d45884aff8L,0x549f2ea86b33a1a9L,
61542         0x2ebf696a8b4a815dL,0xc1705b152a74323aL,0x930a9fde69745934L } },
61543     /* 59 << 350 */
61544     { { 0xbb11fe102d168ee9L,0xba4aea667f39e124L,0x139364b6fca2841fL,
61545         0x6feef5b13d359df1L,0x4fe89fe19787be92L,0xd4cea92e0f6b6aa9L },
61546       { 0x794006c0039bd8f5L,0xdce0eb5b0be647abL,0xf4a97f7d4e40c1d3L,
61547         0x78d19059d5f7254eL,0x464ddc1d0df22d8bL,0x990b0a39e0fc7628L } },
61548     /* 60 << 350 */
61549     { { 0x72f5a0f70ad3bb67L,0xabb15e3dce6396d8L,0x2ae94788463efba7L,
61550         0xe77b53b41fd4c512L,0x09921a1ca88606cdL,0x1b86b75608e980eaL },
61551       { 0x2def667af3d22731L,0xadebd3a39641b175L,0xc0f35509045da920L,
61552         0x8fbf85e4952b7ca9L,0x4ee7565023517a65L,0xd31eeea30e75a4a4L } },
61553     /* 61 << 350 */
61554     { { 0x6d9a5d3cc4508650L,0xe71fcf32d1a2ac1bL,0x784b9148d62ec2dbL,
61555         0x9a3d5d572088946aL,0xc488178757848c00L,0x2f50a62e0875c1e9L },
61556       { 0xbd23d4aedec0f2dfL,0xc9c28dd5188dad0eL,0xf87ef6460977ba29L,
61557         0x89ce8330ab03e4d7L,0x7dbec90dbcf1a5a9L,0x3ddc39c1f6c2a4d4L } },
61558     /* 62 << 350 */
61559     { { 0x8c0518c7618b787eL,0x6f226212b95734feL,0x3e6cab90c66e138bL,
61560         0x6e56d68037a7c0b8L,0x67a3c7df16f6acbbL,0x43df95107921bb92L },
61561       { 0x967846f6a0887d25L,0xf717017766908fcbL,0x1a8ec350267430d8L,
61562         0xebb46f1a25855c90L,0x73eb78cb396c1714L,0xf766957cdc081e43L } },
61563     /* 63 << 350 */
61564     { { 0x0700da846de27e73L,0xfac9dcfd78c35563L,0x01af330ccd073b09L,
61565         0x0bf5c3b1bb784ceeL,0xd3d9a9ff5d465498L,0x4836b065bde8bafbL },
61566       { 0xf5bf3316329b4cf5L,0x387388fc54a5275fL,0x73e880d8254af26eL,
61567         0x07ebcddc8d05311dL,0xe8b9965a4f46cec2L,0x4f07a4fa01b06069L } },
61568     /* 64 << 350 */
61569     { { 0xc0a40cac52133095L,0xfe1b22fd93c162bbL,0x8625898c34018741L,
61570         0x69c9f3f636d9e57aL,0x69d9d7f3378aa211L,0x6b03f897e7dca168L },
61571       { 0x24d49aebf997a48fL,0x1d984c67c149ac40L,0x667c1d01576f533fL,
61572         0x372eee199ef82eceL,0x577723c0c207c14dL,0x4225907a0eed37f6L } },
61573     /* 0 << 357 */
61574     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
61575       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
61576     /* 1 << 357 */
61577     { { 0xc61db977bc0e0903L,0xbaf6e4da645c32fbL,0xce89b8ca060b1adbL,
61578         0x41db448188e2c178L,0xba6339f3923bdd3cL,0xff25b818d29db42cL },
61579       { 0x3521116ee6d6b35dL,0x4e1bd283b22f16acL,0x9357c984bd79fe5dL,
61580         0x2eda73be9d45eee4L,0x1a50c59f6288e01fL,0x37baf64975018873L } },
61581     /* 2 << 357 */
61582     { { 0xc552c6c6097f322fL,0xdf59a3028bc06287L,0xc9ed375c19610b0cL,
61583         0xf0e7b4ebb051dad5L,0x7267a304c6556643L,0x0044f6d8c96dc1d8L },
61584       { 0xf0ed5f9af4fc3725L,0xbbaf9f2c9de8e1ffL,0xef5d66f4af5a4b4bL,
61585         0x0b5bed3d20644cf2L,0xf7e4543a75ae23c0L,0x696f60dc41325b66L } },
61586     /* 3 << 357 */
61587     { { 0x9949b33d2c20f868L,0xdb3aa790b5706250L,0x88ce71e788e17f2bL,
61588         0xd851baf2da9c0881L,0xe869c5ba86d8c9e9L,0x1af68d65a01425b6L },
61589       { 0xeae8b1c69bbd3963L,0xf34900b1ec087425L,0x14942910c374bb96L,
61590         0x3e13c45705487483L,0xe0e6fad435bc6ee1L,0xc7c38dc7b54d247bL } },
61591     /* 4 << 357 */
61592     { { 0x6d34bdf6ab463fa6L,0x7bb127b60093b9cbL,0x61d051135a3bfdd0L,
61593         0x4abab575f1296bddL,0x72da68494d2e9a7cL,0x90267bca8d11f03dL },
61594       { 0x478111223e9b310bL,0x8ffe91d31b1920cdL,0xec293ec67521898eL,
61595         0xf0cf026996c1da75L,0xb0dbd4c380f2c7b3L,0xe528175534e4baf8L } },
61596     /* 5 << 357 */
61597     { { 0x7ce1ce36189e2f1bL,0x36ca8fe3fa84ca41L,0x54cc2c13a6a568e4L,
61598         0x1967d9ed25a6d223L,0xf8d20c88537252afL,0x5a58936cac3d697cL },
61599       { 0xa2659671b0084ffeL,0x08a9e041ec25bb0eL,0x6bd405ed4074ccedL,
61600         0xaeebb470dacb5503L,0x6f18e32bd5448d3eL,0x0412973ba94cd45dL } },
61601     /* 6 << 357 */
61602     { { 0xd72fcc3742fb1cd7L,0xadfb8967c49c359dL,0x6dc988a55935bb0dL,
61603         0x3fb10981e3080802L,0x12c4494f3be161ceL,0x5a0e22d44b649dd0L },
61604       { 0x5c57cbfd62a85259L,0x7ad55b3c0e5ab7a2L,0xcd53564928de30e7L,
61605         0xce35e6e76867e6a7L,0x626810562f6716fbL,0xd8b4ff26a88d3bf8L } },
61606     /* 7 << 357 */
61607     { { 0x5949ddfa53abe7a9L,0x944a2ae0716f63a6L,0x90961922675d1f43L,
61608         0x36c41c12f5b55722L,0x85b8250f7782775eL,0x89a3a733748663beL },
61609       { 0xd4358450475d2d88L,0x4183f45e1beef8adL,0xee3bfe8b06ec8d58L,
61610         0x2e462b1609cc4d82L,0xf9cc307ec6148e1dL,0x70d3b2f77b1281a3L } },
61611     /* 8 << 357 */
61612     { { 0xc32730e8dd14d47eL,0xcdc1fd42c0f01e0fL,0x2bacfdbf3f5cd846L,
61613         0x45f364167272d4ddL,0xdd813a795eb75776L,0xb57885e450997be2L },
61614       { 0xda054e2bdb8c9829L,0x4161d820aab5a594L,0x4c428f31026116a3L,
61615         0x372af9a0dcd85e91L,0xfda6e903673adc2dL,0x4526b8aca8db59e6L } },
61616     /* 9 << 357 */
61617     { { 0xf0467111e854f886L,0xe228021d8dc6117fL,0x07ff954cac432e28L,
61618         0x373be2ef31d9b69bL,0xaa214d016fd61f0aL,0x27bb7932f950b029L },
61619       { 0x1caa914f967c97f0L,0xfb133ec0d548897dL,0x598514173cfad251L,
61620         0xd41d1da432d14208L,0x446c79f2cee424ceL,0x8b5272a175e839a5L } },
61621     /* 10 << 357 */
61622     { { 0x26b5e85d62f50c12L,0x8418cecf5ff562d5L,0x0d35b4d459be698eL,
61623         0xd79ca9ee93730d2eL,0x2414d99325627fe5L,0xe31dc5293fc64803L },
61624       { 0x5c9100d60d027a12L,0x9004ee36f2208db5L,0xe734b13b135d02bdL,
61625         0xf905c01a7bc09b60L,0x4eb51557b21b68fdL,0xe6e98bea8c583359L } },
61626     /* 11 << 357 */
61627     { { 0x14dbcf1a61dae7e6L,0x559a7b52ea0da075L,0x7391545d439d10d6L,
61628         0x187e00e675e617abL,0x453b546b5142355dL,0x9bdbddbc84bca97aL },
61629       { 0x742a699591e5035dL,0xcf86d3e1831209ddL,0x6fb66757f5f2a999L,
61630         0x2e360aeff0e71f2dL,0x6c6f71f2dc97114aL,0xef686b8b17c3a3dcL } },
61631     /* 12 << 357 */
61632     { { 0x7d07a61d13b5ea74L,0x7f4b7157c8afecd9L,0xefce9c89820b0298L,
61633         0xe85c4510e3888d59L,0x9cd3352001234b9cL,0xba2692c0fef767e8L },
61634       { 0xd2bea3d45b3ca353L,0x9ad478e5b51a704aL,0x1fc9bd0d9426f25bL,
61635         0x52f930bf864a1ba4L,0x559f36353765ff27L,0x548c7f0dae28479fL } },
61636     /* 13 << 357 */
61637     { { 0x6296d54f68b0df62L,0xace420ee9e6afdd4L,0xa20a510dfcd1812fL,
61638         0x488f113a8cd04a29L,0x1bee07640765cb70L,0x50bb5c446d0f44e5L },
61639       { 0x5ea842cb7e320ebfL,0xa6e0c1e6e795a7fbL,0x89cd1f765e7e79c9L,
61640         0x7436ec1e87ce6c5dL,0x1376222de28309f9L,0x9ed7d6fb7f01548aL } },
61641     /* 14 << 357 */
61642     { { 0x32e9740ae2fb0467L,0x3a7a32b3ec039d67L,0x630d8d346a425a7cL,
61643         0xc9af74ae418a7dd0L,0xc903576daf502870L,0x7e02b3b7e98cce5dL },
61644       { 0x0bfdee7a158f005bL,0x88eff4a363b91d59L,0xf23079728bfe3ed3L,
61645         0xc75536bce6b1fb4cL,0xf61a82e1a04d46fbL,0x771a8fedfddd52a5L } },
61646     /* 15 << 357 */
61647     { { 0xf5efc82065af5b94L,0xd618a9e8ce5535a2L,0x70cfb112cda6249cL,
61648         0x6986f00f9f217280L,0x41e46ce605faa951L,0x2abb39f3a3ad613cL },
61649       { 0x3e04b28b07671c94L,0x61d323ac53cdaf80L,0x2389875cbb9580f8L,
61650         0x64800835febb0b34L,0xdaebba99d0d21027L,0x0f1cebfc23288a7fL } },
61651     /* 16 << 357 */
61652     { { 0x51a033a5cecb916fL,0x2ac62f638d7de61cL,0x92eece49a42a266eL,
61653         0x87e037db82c4d11eL,0x875be1416fbae08aL,0xf348fe26c539478cL },
61654       { 0x51f8b907ff94c01eL,0xc46cc0e019695a9dL,0x2c74bd666c51b9c2L,
61655         0x635d3d24ee565de8L,0x6bd656638982c8c3L,0x5c345b79daf6a93cL } },
61656     /* 17 << 357 */
61657     { { 0xee7265ee93f081dcL,0xe8f90a6be03493f4L,0x4e8d10275328b0b8L,
61658         0x13bb82bb96fa0930L,0x764c2915d1f7d5a7L,0x1896c78f73476481L },
61659       { 0xe9a34ff267873b76L,0x8a9a719cfa0afda4L,0xce93d4cc9ccb715aL,
61660         0x9ba00f011495d1ffL,0x3131e6666df0e119L,0xe68e1815c902ac6bL } },
61661     /* 18 << 357 */
61662     { { 0x0ce4ae1044f4a2dbL,0xa8645e2310bcc5c6L,0x6d9728b5e489762fL,
61663         0xd365c12a9d46ad88L,0xedf484fee1a527aeL,0xfdf5c519e5be2bb1L },
61664       { 0x4706cc2870a3d4e3L,0x07c60129065f1506L,0x42e2e16478298553L,
61665         0xa56a2bd5bae646dbL,0x893bf45c61437e62L,0x97dbf9266c525900L } },
61666     /* 19 << 357 */
61667     { { 0x65c56764b52213c3L,0xa171ba9d97aefe9aL,0x5904e8c934336916L,
61668         0x727209b6ff187f05L,0xaf4e50525cb68a5bL,0xb46a6abadc4319feL },
61669       { 0xfd48d0d57890cd90L,0x5b0b68c7252942daL,0xc41023352b01887bL,
61670         0x582251eb5ad09a7dL,0xbd79b557e1312726L,0x9f5ee3788057db5cL } },
61671     /* 20 << 357 */
61672     { { 0xa30486a6666fdcc5L,0x5cb7f7ce84056f89L,0x0f8a6b96505636a5L,
61673         0xfeafdf97c6624ce2L,0x9dade91c55b8a7d6L,0x3d009219ca2b459fL },
61674       { 0x483549845a969337L,0x37d57cbd323c09adL,0x32a91e91e74b9e74L,
61675         0xdb4f18ff1c317c24L,0xf9f0daf342418667L,0x735a1eb946946667L } },
61676     /* 21 << 357 */
61677     { { 0xb395bfd1c8eaa54bL,0x8181d6262ee25219L,0xf4bf437b38d912f1L,
61678         0xf9f1161228a8b32eL,0xe359adacc2be5c61L,0x71557ea2971b60c9L },
61679       { 0xf071404b1b00cf1eL,0xb163c3608da3141fL,0xd9dedc07a8d51d98L,
61680         0x29e89ac5ac827b74L,0xc38cef633ef35dfbL,0x9abd281097d477f1L } },
61681     /* 22 << 357 */
61682     { { 0xb34e560f0e6d9646L,0x4fc05a0dc0ba033fL,0xc9f5e040ddc1bcc8L,
61683         0xf723b78ab92068cbL,0xd558f5912b5c7030L,0xb16bdec774ed778bL },
61684       { 0xc12aacc3b32980e0L,0x856e90411daaa32cL,0x34f7a28596429db4L,
61685         0xcc2c61ea415dcd04L,0xa0e192cb46b7d996L,0x5b7c845d55d87ce9L } },
61686     /* 23 << 357 */
61687     { { 0x9ba0a26fc0ee684eL,0x1b871ac353573254L,0x76a094bc5783e706L,
61688         0xe78bea66dcc01e8fL,0x7e20c5aedfb74e56L,0xbdc5314a8710f0e6L },
61689       { 0x2bcc7a0085f2233aL,0xc58dd45b8aba1575L,0xdd1c6b78e411b6d8L,
61690         0xbb8d19529d23d2eaL,0x5293f3cc0066c9cbL,0xb7d0d7b0249c6d93L } },
61691     /* 24 << 357 */
61692     { { 0x68fe359de23a8472L,0x43eb12bd4ce3c101L,0x0ec652c3fc704935L,
61693         0x1eeff1f952e4e22dL,0xba6777cb083e3adaL,0xab52d7dc8befc871L },
61694       { 0x4ede689f497cbd59L,0xc8ae42b927577dd9L,0xe0f080517ab83c27L,
61695         0x1f3d5f252c8c1f48L,0x57991607af241aacL,0xc4458b0ab8a337e0L } },
61696     /* 25 << 357 */
61697     { { 0x614c4bc273041ddfL,0x4fef1cf6364135aaL,0x2c9ac204ecf0e610L,
61698         0x75a302a991a6dce1L,0xa5899c96651ec9f9L,0x6c5384f64bcad1a6L },
61699       { 0xa41012e560f705ebL,0xfcf6512235e85d67L,0x2fdcfc235ced3638L,
61700         0xf834fac02deac34aL,0xf5a64ec510a8ad80L,0x843855e1a412c4feL } },
61701     /* 26 << 357 */
61702     { { 0x440dfebd76ca517aL,0x79924057c577eb59L,0xf1aea290d038a921L,
61703         0x77afb37fb0c95974L,0x48a5b9a715763d44L,0x713de85155c8683eL },
61704       { 0x250e8f8239d7e1deL,0xc5f1f61c8a2c846bL,0xf26ea6f9faafd017L,
61705         0x8ad26055f9d7cd35L,0xc980ba773b2df598L,0xe23b7eabd5e299a3L } },
61706     /* 27 << 357 */
61707     { { 0x5d37811464744605L,0xfab096990278c1f0L,0xc4d32b208448c344L,
61708         0x767a24d2d7d1df17L,0x842de148773ea0fdL,0x73d7dfbdff6e40b4L },
61709       { 0x3d61439283576d1cL,0x4820c435ec865519L,0xf99e84dd6bfa5e48L,
61710         0xeb18687a9d0d2adcL,0xc3b7369da7fd75d2L,0x7e332b5739f5f093L } },
61711     /* 28 << 357 */
61712     { { 0x0796a8b6ec13d2acL,0x19036c255677347dL,0x2f0d36eef527c827L,
61713         0x7c8a3d17ca61ed60L,0x3920bc68748cf7c2L,0x61835bdf9018b300L },
61714       { 0x9cf595c1689d5826L,0xdc547999fb51aea5L,0x11bb04120fc297c6L,
61715         0x88770df2b2f9fe0eL,0x99e031f5f6856a85L,0xbb59e8c7afe29c50L } },
61716     /* 29 << 357 */
61717     { { 0x714e784820dfc5f8L,0x35cde8ae2a2265bcL,0xf6b29ce4bfc32fecL,
61718         0xbd5e91f1918043a5L,0xd3766f8b60f8c218L,0x273c41935298904cL },
61719       { 0x0a76492d5d441fb5L,0x99cb3b1d164d9275L,0xb2be87c80ac7935eL,
61720         0xbd1a1b3f0962981bL,0x8a0c207b96d0df2dL,0x1bb1e505929752d9L } },
61721     /* 30 << 357 */
61722     { { 0xa574de94621b2705L,0x0d0ca1b73e3f2227L,0xbdc9ddf2e49bc2d8L,
61723         0xfbc7254309d314f0L,0xf5900cbb827e0b1dL,0x3994eadd8a7e8164L },
61724       { 0x2e7949793046f170L,0xde21ddc3c6883cc6L,0x9ea19d34bcd40da7L,
61725         0xb4334df8f01a9ae5L,0x801496ebce8c53c7L,0xc2a5e8527a4b0601L } },
61726     /* 31 << 357 */
61727     { { 0x435a6c512ecf62d2L,0x757cd8f6559a6a0cL,0x47833f815e4c0d40L,
61728         0x2d0b48047d960c6aL,0xf5474833473d5eb3L,0x70264154bf756b52L },
61729       { 0xcc46e58d940bfb7cL,0x2e0dd3a69c89d48aL,0x483f3ee19387df66L,
61730         0xb3097da4585d3600L,0x82d64b4d76411ef9L,0x0df7d95719682e87L } },
61731     /* 32 << 357 */
61732     { { 0x179c59cf210c3144L,0xfb613c5733eebbc4L,0xdda75cfdba0cf384L,
61733         0x94081a5b3a8fbafaL,0xb91de90a33384e0bL,0x7d1f8f4027aa2a45L },
61734       { 0x0747bcc162031148L,0xd2db8e39f324160bL,0x9c1ce3e9722484f0L,
61735         0x13a7ee5da62d1ddaL,0x77fd79343a963bceL,0xcd3d871783d2f21bL } },
61736     /* 33 << 357 */
61737     { { 0xc7c8eedc93a27196L,0x0832b0dfa8abe585L,0x31fe11e8d8adfb86L,
61738         0x1091601e9d50e4c7L,0x7931a284ac3d2ca4L,0x0f1464b6f3fc6641L },
61739       { 0x2ead94f3260f29a7L,0x914b8396d88a7696L,0x950be4bbe73d807dL,
61740         0x26d0115e5b3ad83dL,0x3de8a73146c22525L,0xe50825dac5fffff1L } },
61741     /* 34 << 357 */
61742     { { 0x716378cae4b98aa8L,0xacf8d67b59b746a9L,0x78f0b5eca65ce8ebL,
61743         0xe5997983523cfa35L,0x85bf5badbeba89e3L,0xc8052bbfcfd73b41L },
61744       { 0x0b3d77139fb311a3L,0x821a20e2d96f696fL,0x0f087e5744657c9aL,
61745         0x72031f281ecfea36L,0xd0765f333f32b010L,0x0412c69929c48643L } },
61746     /* 35 << 357 */
61747     { { 0x53d361b89f501481L,0x8970937717153c6fL,0xb52280b916bb8d8cL,
61748         0x5985cdc0b33dabd6L,0x35ba0cd9dca8ae72L,0xf55c6e7301bc4efdL },
61749       { 0x2106ed2f269577c4L,0x4cc34291bfe765b4L,0x9f4168ea812eb958L,
61750         0x02869228999ba5cdL,0xff91540d3ab27498L,0x9020e6e158e55a79L } },
61751     /* 36 << 357 */
61752     { { 0x1a5b15377f1c7cbdL,0x5b31930b7cc17c56L,0x5b91e1a492cc8cf5L,
61753         0x970e43deeca08bdeL,0x36424bfe0e2e963bL,0x2e49534968b1a489L },
61754       { 0xe350ca52d8e85a9aL,0x3cb9f599ae2cdd7cL,0x0ff35a0aa83215ecL,
61755         0x64cf57b81973a966L,0x128be6cd36b26702L,0x8067afbd5f65f7bdL } },
61756     /* 37 << 357 */
61757     { { 0x23d1f49215876c71L,0xafb21c1d41e7495bL,0xdb3ab62c2705885dL,
61758         0x20ff803f7ba216cdL,0x26cb190699c9ee55L,0x8280dc9c0fb05389L },
61759       { 0xadf55171df1020dfL,0xc044e9bcbd011b5cL,0xe21aaa60cbed2430L,
61760         0x5939fe583336df4dL,0xfa306816ff78c665L,0xba92ca8243eb18f2L } },
61761     /* 38 << 357 */
61762     { { 0x6f05e6241b7edb64L,0xc280105b6681f48fL,0xd1b94413f993dc9eL,
61763         0x84f24c01e46de412L,0x092017d54abbf7dbL,0xb73193a56f7b1b08L },
61764       { 0x22a7c5765195ae46L,0x81dd6b12610c28efL,0x61959874ad7bfcc1L,
61765         0x3ade0a77d15f8cf9L,0x124cef4d954db624L,0x0733bd7a5c247650L } },
61766     /* 39 << 357 */
61767     { { 0x52d7f9ddf1cee098L,0x538b7fa17a6a2ad1L,0x5f2294312911e75aL,
61768         0x71c337b7e6ef0271L,0x5e278a1267ee72d1L,0x7b348c756f33fea9L },
61769       { 0x7bb59f1a694bb928L,0x5783e43f292b258aL,0xe3b53ca77181f1d2L,
61770         0x028ba90e051c7d2eL,0x4bb06f9364789d76L,0xcf97fc4da228a7a7L } },
61771     /* 40 << 357 */
61772     { { 0x3dbb3fa651dd1ba9L,0xe53c1c4d545e960bL,0x35ac6574793ce803L,
61773         0xb2697dc783dbce4fL,0xe35c5bf2e13cf6b0L,0x35034280b0c4a164L },
61774       { 0xaa490908d9c0d3c1L,0x2cce614dcb4d2e90L,0xf646e96c54d504e4L,
61775         0xd74e7541b73310a3L,0xead7159618bde5daL,0x96e7f4a8aa09aef7L } },
61776     /* 41 << 357 */
61777     { { 0xdf5c2fa79111caacL,0x493ada25b04d2b3aL,0x5c4850bfa39a7872L,
61778         0xbeae16c067e07e93L,0x63bd7d390178358dL,0x7a7e56a1cfe0bcd0L },
61779       { 0x9ba7a4500816b666L,0xea6c70c8dae070dfL,0x84013756832c2b35L,
61780         0xa28e5dd08d3e9fc3L,0xd67665aac653c08fL,0xee54d7b6aa6bdff8L } },
61781     /* 42 << 357 */
61782     { { 0x99b870afadbd24baL,0xb34fa9083bee289fL,0x4a20f29bae836fa4L,
61783         0x4188ed5024b464c3L,0xfb93f48fc6c00297L,0x334b8689736186ecL },
61784       { 0xbf7f1c424e1016f1L,0xf95e6e59413ca088L,0x5878156c288912d8L,
61785         0x9e99199704c7ce69L,0x0f0c185d5d6520d1L,0x1ed2ece33fe6f498L } },
61786     /* 43 << 357 */
61787     { { 0x319fb249607cfd40L,0x5920056f62b40e28L,0x9ab4528058631ab5L,
61788         0xb527738f413452d2L,0xb2885e46b296e602L,0xb1dcf41a74824807L },
61789       { 0xca9d2b06b2ad2fc6L,0x500c5f11ad05eeceL,0xca94160f21f3db6aL,
61790         0x693adf4e262470d6L,0x1f4c62c5480b0cffL,0xb3ebf11f54c748e4L } },
61791     /* 44 << 357 */
61792     { { 0xc8ae4d2bb4ef93b3L,0x4967da7b99758d99L,0xd1483a1fe04db9baL,
61793         0xf5e657df3033474dL,0xdd9371c89db4b96fL,0xb5f288956044b259L },
61794       { 0xe8987a43b2ec27bdL,0xaabb1ae68fce67bcL,0x4518fa3eb2b97680L,
61795         0xa0142a13748591e1L,0xf9148ab96c2db557L,0x65592253e0e4f9e7L } },
61796     /* 45 << 357 */
61797     { { 0x21163809bccf41d8L,0x0eafed515b3f09d1L,0x3b5360d9d84b27f6L,
61798         0xee752fd04411d37aL,0x1cea3b5c6a3f5027L,0xb206e74d9454d9f6L },
61799       { 0x710715dab52af43dL,0x8175ca136e6c6463L,0xbdb123d39689144dL,
61800         0x569e6edd4d9c459fL,0x070f09a4f02e5b25L,0x691c23ef3d79a7b9L } },
61801     /* 46 << 357 */
61802     { { 0xc0c94165781356cbL,0xcb9fb705876a839bL,0xfe23f07e89db25feL,
61803         0x710f0fa3a52cec3bL,0xb0ab363073e0f037L,0x3b79a8167c9aa037L },
61804       { 0xdbc7f83ca1f13fe1L,0x8bd910c63d653a81L,0x2e54ad408c78d003L,
61805         0x0de02157a3e9ccf0L,0xe9081e8bf7670dfbL,0x6a2ad476c8647bc8L } },
61806     /* 47 << 357 */
61807     { { 0xaf58106ebf047836L,0xadc3245e195e5675L,0x75612e175290e051L,
61808         0x27b81bd869d46bb9L,0x9d4dad5b5417b5faL,0x19850d70fd024259L },
61809       { 0x987daa604b0a86b5L,0x5d5a5f9c0358a944L,0x9008682f48d2ff67L,
61810         0xc9db4d4b89e81cf9L,0x133516bc850eaae4L,0x0b5bfdc81da8bd19L } },
61811     /* 48 << 357 */
61812     { { 0x609deb162d8bcd6eL,0xe42f23a92591750dL,0x4a9f3132b378305cL,
61813         0xf101799869275f5eL,0x14be746761b089b5L,0x05f620d20c81b0c5L },
61814       { 0xca90a9c06cb8412eL,0xfe0f6a8915b1b0d5L,0x1b25ac9620c71988L,
61815         0xb971b61a390aedd0L,0x995214d779d8cd39L,0xd7fa135b65c6e11aL } },
61816     /* 49 << 357 */
61817     { { 0x5aaa98f875330325L,0xc900a7781f3541a6L,0x69bcf864174a3200L,
61818         0x3abc5ef71c46b3e2L,0xa53c9e4e47851b97L,0xc166a4e22acdc42eL },
61819       { 0x49e4e6fdb19b4678L,0x4fe02cb162b7da19L,0x575c61a6633153feL,
61820         0x49578b28a4f83b70L,0xc6840d063737532cL,0x93047d40480f55b9L } },
61821     /* 50 << 357 */
61822     { { 0x835be7417d930332L,0xa4d001bb2cd86fc4L,0xef141e30a6e3a24dL,
61823         0x4047620adc328d2eL,0x5c80a3bc9a5f1f12L,0x6cde5e4ca19b423cL },
61824       { 0xcdd5d7773ba0fa5cL,0xb96dbe62ea85c28eL,0x963c02245c804896L,
61825         0xb2a581abe5dd6b98L,0x28a908a2abc8dac4L,0x5834b212985fd18fL } },
61826     /* 51 << 357 */
61827     { { 0x02757b1f0fbe0c5dL,0x2d0d05a854ef99e2L,0x2bda526d0377ffa0L,
61828         0x58ca8b08925985afL,0x1fb7dbe727b69722L,0x322d7db5f1c57fe5L },
61829       { 0x4049c8bcfdf111f3L,0x0b4712974148b027L,0x34fcb1e58782dab0L,
61830         0x697dc9431665557cL,0x3ae30e2844659ba2L,0x479dbc2f118e7417L } },
61831     /* 52 << 357 */
61832     { { 0x10b10d86227e8607L,0xe83536281d1be36aL,0xe34068f9d952b0e9L,
61833         0x148eeb38fdb6ea99L,0x82657d605547e7ebL,0x9c35dc82a86155eeL },
61834       { 0x408f79262060a81aL,0xf2a79205a6282e8aL,0x10dbb58526e70e7cL,
61835         0xd636f8225df85d6cL,0x03202c027682b922L,0x31323940baf18500L } },
61836     /* 53 << 357 */
61837     { { 0x5882374401879796L,0x068943ccd1249281L,0x20dec1c12e1d6effL,
61838         0x5f4c2c070bdddecdL,0xc56d52b37ee724c3L,0x93bc2c7a559e25ddL },
61839       { 0x0c95d2e5f98a9940L,0xc570e96ada60a809L,0x94c4a964076233eeL,
61840         0x843c99627dbbc526L,0xe4075129d4cdc652L,0x0afff70561cb2698L } },
61841     /* 54 << 357 */
61842     { { 0x3ec1e3a5f607f893L,0xd476dd24054aaa8cL,0x2cb92280a93488abL,
61843         0xc8d1207710d1dc68L,0x564839b9bfb494e6L,0x7a13930ceabdfe56L },
61844       { 0x52f72a9724f9b183L,0x30ae4bc87e9c6fc3L,0x3d7d2765f35b8e6cL,
61845         0x701f3d89a665ba55L,0x98f2fe85c466111bL,0x338073600c1c0dadL } },
61846     /* 55 << 357 */
61847     { { 0x7dd106bab3a48d42L,0x7eac4690ebfc75aeL,0xdbf3547e68ef4ea3L,
61848         0x3629c438a1a5faa2L,0xac2aa55e653bfd97L,0xae5cc39752c3b8f9L },
61849       { 0x117380552853b626L,0xd5a955f224a0dfe2L,0xc4356ca25940233eL,
61850         0x73f7eda97994aedfL,0x2bfa76c693b185d9L,0x091cef91a0327108L } },
61851     /* 56 << 357 */
61852     { { 0xa8393a245d6e5f48L,0x2c8d7ea2f9175ce8L,0xd8824e0255a20268L,
61853         0x9dd9a272a446bcc6L,0xc929cded5351499bL,0xea5ad9eccfe76535L },
61854       { 0x26f3d7d9dc32d001L,0x51c3be8343eb9689L,0x91fdcc06759e6ddbL,
61855         0xac2e1904e302b891L,0xad25c645c207e1f7L,0x28a70f0dab3deb4aL } },
61856     /* 57 << 357 */
61857     { { 0xf5dafec85f102704L,0x2f3b6b6929f5b946L,0x84472c029d4c9979L,
61858         0xed49f3e6341f0150L,0x3ee3432eb3bb085fL,0x84c553183cbac42eL },
61859       { 0xbb358bd9dc4c7ffaL,0x0713917d2db356ccL,0xc73e9fd0670c7139L,
61860         0x87600c4c3581108eL,0x2ae731d7586af51dL,0x30630ad6614c126eL } },
61861     /* 58 << 357 */
61862     { { 0x15f8fba7712c0edfL,0x4a1f93baa2c363ceL,0xfabca37e8f2948a4L,
61863         0x652922e4dd765560L,0x2da78559220cb98bL,0xb797746a54b940c4L },
61864       { 0x8535fcfc591bb7faL,0x58857815c25376e3L,0xcd8db789da627557L,
61865         0x718072ca318512b7L,0x92266469813efd94L,0x3217649aafa85382L } },
61866     /* 59 << 357 */
61867     { { 0xd517b39e51c4bf28L,0x6614c16261f583a3L,0x79c72f414739ea59L,
61868         0x597e1c2ff76e80f8L,0x3a72b05e7b846f3aL,0x1849e5126c0a45a2L },
61869       { 0x79a6ea5b9d506d83L,0xc48e570219b7f46eL,0xc89c5047c524bb48L,
61870         0xafc1fdd99cb88cfdL,0xb07eaaa0b82056e6L,0x60f6544f05885df8L } },
61871     /* 60 << 357 */
61872     { { 0x9894ef75f39e2738L,0xac585d07b40db6ecL,0x07d9e938c4cfdb92L,
61873         0xda174933737f1a7fL,0xa4f1fb65484031a6L,0xa96d9f612c21b546L },
61874       { 0xaf981519d24ccee0L,0x238de6de9d53b571L,0x09afc481fd78c3ffL,
61875         0x4351715d9ea7f6fbL,0x91a02325b14a7320L,0xcd8958d8bbb6346aL } },
61876     /* 61 << 357 */
61877     { { 0x22ef4217452ae6a0L,0x3192309d9ced837aL,0x773585ed2ba43ee9L,
61878         0xa9b29d94f3379e81L,0x43838b3aa6835e44L,0x1afe27ab0c7b2336L },
61879       { 0xca1dc61683ecd230L,0xc9e8b95e6d235df5L,0x9667829b2af11adeL,
61880         0x27254b0fbe532148L,0xb50bc3c86d233f14L,0x30e0e450bb35d985L } },
61881     /* 62 << 357 */
61882     { { 0x8b3f79087b95cf32L,0x67c654b06272c619L,0x61160a9d22c0f46eL,
61883         0x1cce95721d2e36ccL,0x62bd951d3990db3cL,0xcf0005c8d9700d14L },
61884       { 0x304aff9c70116120L,0x1c919dd2b08d57ceL,0x841b058ec0c0c0b0L,
61885         0x7cfd4deb7af05aa2L,0x4fbd13c57b11ce5bL,0x03e07dc9f8259bebL } },
61886     /* 63 << 357 */
61887     { { 0xe9b37f569d0703e0L,0x7b5e0df5f83c215bL,0x7fbb40f0d3c21efcL,
61888         0x87a2ff119fb33620L,0x208b062bd1176635L,0x806bc549950d30efL },
61889       { 0x862de3a4ae2bf355L,0x917b06bacf9ef6e8L,0x55f1ec4cadacc178L,
61890         0xbcd679fc81d752fbL,0x9404d6ce65a00270L,0x25ce99e6000c6e1fL } },
61891     /* 64 << 357 */
61892     { { 0xa13f19b40f3ff12dL,0x57ee08b1019564aaL,0x00ec0c997044a6f4L,
61893         0xaf5665f8dca1075cL,0xded5ca3f0620ab0cL,0x9b2cb8c7a896deffL },
61894       { 0x032ab2b307df2345L,0x964d109ef1da3f88L,0x2286b6f725133304L,
61895         0x0d16d531977a4567L,0x00a66036f1abae4fL,0x5debab1d95f0103bL } },
61896     /* 0 << 364 */
61897     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
61898       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
61899     /* 1 << 364 */
61900     { { 0xf2cdae3196230a58L,0x47cf36b4f304e1eaL,0x9d14f25ad750b29bL,
61901         0x931b9c65dba15f3eL,0x34db169ebf9fe2ddL,0x8a89e47c52663433L },
61902       { 0x8859a4f8026ec31fL,0xeeb703eaa913ceeaL,0x74638d6a67ac4db7L,
61903         0x5c8ea7b2be25d755L,0x8a0f0a8738db10eeL,0x96a26bace890bcd3L } },
61904     /* 2 << 364 */
61905     { { 0x883533af64a5e869L,0xaaa778c26973ec23L,0x8f0b5fb546d0fcf3L,
61906         0x7e6b0a0a4ab05da7L,0xcd91a869c67b6614L,0x7de9f2ff6c6f7cf2L },
61907       { 0xc072a106d1ec14c3L,0x3f4b960642a128eeL,0x7378192c8f0ce946L,
61908         0xdf2e7b9fd1149441L,0x4fa17cb614ccf45aL,0x575680e945f03568L } },
61909     /* 3 << 364 */
61910     { { 0x0f4ca7803374f910L,0x5948ae98fedc5b5bL,0x4873625b4ef805afL,
61911         0xbddba22fc015c586L,0x7091b50aa41a8c93L,0x721dd3384c005f42L },
61912       { 0xf43d37462065f41dL,0xd16bae3e172512b3L,0x3efca10c8277068fL,
61913         0xd0c25d7b77513f00L,0xc0015cc12dc3af9bL,0xdf11a4ec94c6cadaL } },
61914     /* 4 << 364 */
61915     { { 0x8b70e94f8f458c68L,0x292726544160ecc7L,0xe22219ba4d3ef22fL,
61916         0x7f8a712a1999f948L,0x25575e96abfe7302L,0x21c6ffc6564a1af0L },
61917       { 0x045e9c667e8500daL,0xef7c3cf704ef8ea6L,0xdd23b825c3db161aL,
61918         0x05fb173aba33a906L,0x9a8b5ecb870e41f2L,0xf3d9db0bccc30d1dL } },
61919     /* 5 << 364 */
61920     { { 0xbed7d94ca1bf2c8cL,0xbb7f437cb8b719ddL,0x65416af6106834bfL,
61921         0xdade8a144c4f7448L,0x62227a1d881dfc06L,0x37bc7de58dc2b7bcL },
61922       { 0x4f11541712ce030bL,0x72439d8ac2a9e0d6L,0x98cc53aba0f1b961L,
61923         0x2f68011d48b0ec8eL,0x4bbc34679c72d034L,0x0320c1469c576e38L } },
61924     /* 6 << 364 */
61925     { { 0xd9243926e873ff0fL,0x2e2a5ab6f20b0e49L,0xa1bcfeee0e35f201L,
61926         0xd25be5f3196f23f3L,0x298c67f2ffc1d068L,0x77dae55c0c3d950bL },
61927       { 0x5e15ab998822c996L,0x52de2e6d83f60a98L,0xa9f82ec947a7e269L,
61928         0xf02af9a22ac22e49L,0xdfb3103fa706f090L,0x125599623cf8dcb0L } },
61929     /* 7 << 364 */
61930     { { 0x9f5f44fa666e278fL,0x53c88803f5582c78L,0xd7e8f258f9627f9cL,
61931         0x22499dc938fd51bdL,0xa9d7497c846a4a79L,0x791b8ead026ae250L },
61932       { 0x84d47d19db15ff63L,0xb58a82c0267b44b5L,0x9b2f138806a52e30L,
61933         0x3fc8da027f08953fL,0x22d074d292fcac08L,0xb9c7c3db701d73fcL } },
61934     /* 8 << 364 */
61935     { { 0xb7b8562588ad12b2L,0x81f5958b1e44b254L,0xb4ebddd5c91b8ffdL,
61936         0xef815ae155d38511L,0x98587d551b0da525L,0x1d41817734a9ebbdL },
61937       { 0x844811fb1e6057d7L,0x0c16977176e5976dL,0x4b268bb4f623789bL,
61938         0xb26ae5be40498058L,0xb47a5ded3c2b435aL,0xe15a684b8fceceb3L } },
61939     /* 9 << 364 */
61940     { { 0xd55407583353db48L,0x0e334ccac0c0b5e9L,0x679a935f270c48d3L,
61941         0x170693e436ef0e90L,0xc72fb12f9de59023L,0xaae13a0e9371697cL },
61942       { 0xe98ed704d8d56e4dL,0xc6de5384eb71f091L,0xba63adccc6d905a8L,
61943         0xc84e614d66e40dd4L,0x15dcf1a3fa0f55e3L,0x4e26ee3af157c7a1L } },
61944     /* 10 << 364 */
61945     { { 0x122a3eedd09dc3c8L,0x6a19907faefe0819L,0x057aafa1da325339L,
61946         0x138033bdd42a5345L,0x8ac206af1a065ebeL,0x0a46f5ae25c31ed6L },
61947       { 0x7fc577a9d7e379dbL,0xc6df694369dcee54L,0x4c167ba2a8336bc1L,
61948         0x0fbd9708f3a1339cL,0xc6b8c01f226f612fL,0x5d4ed789d51332e1L } },
61949     /* 11 << 364 */
61950     { { 0x67ead4e0f6a40814L,0x42fe051ca2ec9ae1L,0xc09f84395eba62cdL,
61951         0x7bb5ba0c9d8e7305L,0x85962d0db46f81abL,0xc7183752628b18ebL },
61952       { 0x7a1f023edf58ec0cL,0xf21bfdbaab6535dfL,0x12add590801d2481L,
61953         0x1fccd1e37a11520aL,0xf83caddd6fa8f8e2L,0x99e7256c24e58433L } },
61954     /* 12 << 364 */
61955     { { 0x26aa2c2e5a1abcd8L,0x2b16a12e9609d9d8L,0xe485a551a2bee00cL,
61956         0xfa28c30bf4f2292eL,0x99abef78b7358f1bL,0xda6b3cdf10a276a1L },
61957       { 0xbd3858b747c03f71L,0x4f0bf5f0b22d05d1L,0x2d80f5d28250f760L,
61958         0x060f9b278cd9666cL,0x6a6c40b0b1b014a9L,0x44537af38c440a9eL } },
61959     /* 13 << 364 */
61960     { { 0xce1c070a2275263dL,0x2723b3d149cea971L,0xedca02f5817001b6L,
61961         0x5c160e9349c946e4L,0x273b4952458a5265L,0xc7bcd7c610385173L },
61962       { 0x22cddfd17fb08b14L,0x959d5dfe10f73d01L,0x900f5f348e387351L,
61963         0x6d7381dfdadb8695L,0x8dff2b193aeafba6L,0xe4a8d6bd8adadc36L } },
61964     /* 14 << 364 */
61965     { { 0xb564cfd676faaca5L,0x8a6e3925920dd223L,0xee59a140a590a383L,
61966         0x9e29b552a1922ad9L,0x604367de60a0da63L,0xc498aca592c35fd0L },
61967       { 0x74135082250ed8a0L,0x5d109d1a6c7c3e77L,0xf9e2d84dc63dff94L,
61968         0xca50f5e4f7aa2b0eL,0x7cba9e87d543d389L,0xaf5fbbefd8fd1292L } },
61969     /* 15 << 364 */
61970     { { 0x3163e2e895bcc345L,0x4ceaaf2d80d9a931L,0x4d2dc44b2f621612L,
61971         0x2a5f60b86cc8ffd0L,0xf49038cf7e8c9434L,0xb580b8c508015b8fL },
61972       { 0x4283ec01d52af80bL,0xac9dc35f99076245L,0x38785f7bd64c3dd8L,
61973         0xca19c17623bf8915L,0xd778291370478260L,0xc1e48e6816e34149L } },
61974     /* 16 << 364 */
61975     { { 0x707656834fc11c3aL,0x53a9403166aac4d1L,0x2a935ef0a6db6169L,
61976         0x002927612032d599L,0xb5babb2d3a6f1316L,0x601a7dfadb26af51L },
61977       { 0x00c340131322d983L,0x45b062ec2bb507c5L,0xa1bbe2ed0f9b3656L,
61978         0xe17a5d4934031d18L,0xe3661047f8fe1224L,0x0e4f3b3d623c6cf5L } },
61979     /* 17 << 364 */
61980     { { 0xb335d83c7c3b8c3cL,0x01eb94f059359a67L,0x3a8359a6aef3ffa0L,
61981         0xb0270076ecd2d862L,0xc946b1610377e30eL,0x9a5506c282bd6ae1L },
61982       { 0x737bdad0218512dbL,0x449238633487fb13L,0x36026dd12a8e7907L,
61983         0xb67bdc80784811eeL,0x9f92cc2405c90646L,0x02c551554c370746L } },
61984     /* 18 << 364 */
61985     { { 0xffaac084ca45cccfL,0xaea5cc3d061ffe3cL,0x7c5d7c60b355f387L,
61986         0x4bbb2a0c99cba92dL,0x6b4ba3ef2f7768d6L,0xc7484ed2cc5f9c40L },
61987       { 0x5d4e92fc52b57a7eL,0xba9f16c4ca2c200bL,0xebe02a8a3797ccbaL,
61988         0xb6b3f42138c4133aL,0xad5d85b68153d033L,0x782d6ee85714f269L } },
61989     /* 19 << 364 */
61990     { { 0x4654991087f226ccL,0x97894d5fc7bfffcbL,0x94f67786b3cabb83L,
61991         0xa6abaa960d788dc4L,0x08ae72d61723738dL,0x5003f41d86704dfeL },
61992       { 0x67687c3d40fb0a3cL,0x6fdc98c9b43320aeL,0x0f22572fdeb08964L,
61993         0x05bb02a4c8002624L,0x4c5adb7f987c2991L,0x3f1c6dddef4e60cdL } },
61994     /* 20 << 364 */
61995     { { 0x7845b6969c0cf752L,0xb82d052b5a732acfL,0x7760564c1262877bL,
61996         0x29b3c57a8ecc7aa5L,0xb58eccb0df1ebbedL,0x86fc15443c3a3303L },
61997       { 0x44761ddf13060f0eL,0x5a3dacfd7371a5a8L,0x846f6faaf7cbc2bcL,
61998         0xf5e098b0368caabfL,0xe23ea10710c08769L,0xbc5df1db1563fcdaL } },
61999     /* 21 << 364 */
62000     { { 0x75647f6476638edbL,0xb76ceb04aad6e25bL,0x33c73367d9393a41L,
62001         0x8396726dc55f0feeL,0xe1cbd48e751b3d43L,0xb779c5bdf47141a3L },
62002       { 0x122b85434eab6097L,0xeabacf45e08c6fa4L,0xdb32eab7769f49cfL,
62003         0xf956976a04ac2cb4L,0xf55c6fcb5ea8e71aL,0xd72940dfbad47ea9L } },
62004     /* 22 << 364 */
62005     { { 0x65c3a54e142d8955L,0x5c6583cce7814f25L,0xbd5a07d8d924dc7dL,
62006         0x9f717bd9c28f6e8eL,0xa0c4ec4e3b6540a7L,0x3153bb2b142b3283L },
62007       { 0x53bf403c9b296946L,0x659a828ab1cdb6d2L,0xe9517d811369af19L,
62008         0xd8c7a0998990e7a0L,0xbaa9f59de535cd04L,0xbb0cc68e0f269551L } },
62009     /* 23 << 364 */
62010     { { 0x2b4a0e69d0cd5fc2L,0xeb8dd25981167a94L,0x356198ae61b73503L,
62011         0xb159ca12e5289d45L,0x99d71c97991765b5L,0xce3a3b6c198e10b0L },
62012       { 0xcf6ee0bcafbb512eL,0x4aadd1381e19b49aL,0xcf6a9cf3b4806f0aL,
62013         0x6aff0386ad688bb4L,0xea487c6e4f2e5065L,0xec200f4b56573b51L } },
62014     /* 24 << 364 */
62015     { { 0x3c00ac526a78c6e5L,0x9c61aca6defaa52cL,0x0034128939794a09L,
62016         0xe08910d141cd7c0aL,0xa58ffbb6a732e3bcL,0x87bf51ab91fe8fd8L },
62017       { 0xc4f4f2674a59e2beL,0xdeb512c7438071c8L,0xddf82842e9cd290bL,
62018         0x3e17311d6ae85fe0L,0x6e9236a9b41be881L,0xbb9ddf9853555ebfL } },
62019     /* 25 << 364 */
62020     { { 0x07d2df1162bb0e3aL,0xe74ce211ce469affL,0x9629d7d4756b5a83L,
62021         0x61d2a633aefd449eL,0xd39a6afe491e503bL,0x0f1568d14d2b2ed7L },
62022       { 0x8216304cd19611bbL,0x6df99bbeb27388daL,0x2b0f60c0b7a3b4beL,
62023         0xcff84c1c7dadf840L,0x470201e28a9f8a49L,0xcda3693c21afc717L } },
62024     /* 26 << 364 */
62025     { { 0xccc163ea09f3f0beL,0x9932b56f6a5b0a63L,0xf89fae919c69668eL,
62026         0x555f98215ce13021L,0x4b02693f37037aa9L,0xc4afee79bde50f35L },
62027       { 0x4b0919c202aa6c7aL,0x3166de2a991e15e9L,0x284baa3e7077fb38L,
62028         0xbb7a6416a116ddecL,0xe8c89547b7636772L,0xff9403620ef92c54L } },
62029     /* 27 << 364 */
62030     { { 0xcd183e8bd3ea4c3cL,0xc8ce2f2154b7ac32L,0x75387e04be960826L,
62031         0xaf878400f2e39f5dL,0x7fcefcd94fa628f7L,0x76eb621c34582cbbL },
62032       { 0x44e1f848f29d2496L,0x42aa36174ab4eb21L,0x43cead840c08b50aL,
62033         0xfa4ecf60dd44f7c2L,0x5ac9ffd59f817546L,0xec11567eabcc594dL } },
62034     /* 28 << 364 */
62035     { { 0xd5d81275e2ce6008L,0xc45bdf250b3b9d10L,0x15ab5da36cbc83e2L,
62036         0x85a18cf8c52a66cbL,0x77e202b8b042c047L,0xc4dc3de2e7e7997eL },
62037       { 0xfe9335b1995fa67aL,0x809e161d75b96a00L,0xfb03c2a5a0c3baeaL,
62038         0x5c7e0523888c2f77L,0xa8fda1c887ad10e2L,0x90484f78858a3577L } },
62039     /* 29 << 364 */
62040     { { 0xefc5aa2681bf26c9L,0xdbe91f606bf105bcL,0x0d70c4d4369dd3aaL,
62041         0x2b357b847af9bf66L,0x4293e9a01f27f163L,0xc846f67cb3eaeddeL },
62042       { 0x4556bb787da305dfL,0x4ecebf83a5a26bf9L,0x8e05af924c1bc430L,
62043         0x4f3bdaba70f80402L,0xccaccfd3cf204577L,0x8fdee135a0c42d1aL } },
62044     /* 30 << 364 */
62045     { { 0x49e41f0af9fde126L,0xec9600443613d3c2L,0x2c62a49d10421d3bL,
62046         0xe24024648131a0d8L,0x8a7ce188bdf794fcL,0x704dea7d4665b1b6L },
62047       { 0xbdb9c18e4d57c6baL,0x5288a053f669b3c0L,0xbf7d01b878a5e252L,
62048         0xb26cccf926b9cb7dL,0x14191a3284326c47L,0x460ff74791f8425bL } },
62049     /* 31 << 364 */
62050     { { 0xb9958c5397698b9bL,0xe1f74292c27f96ffL,0x172b0d50806da6bfL,
62051         0xaf3d889ddd38b97eL,0xe7a75ea409c688daL,0x1f0951b85c631b2aL },
62052       { 0xdad8b2adda1c111eL,0xbacb9cc832813338L,0x30b8336b10582abaL,
62053         0x0ff3d7549494e71cL,0x8d99be5cd663ed6dL,0x8eb412cf7073a941L } },
62054     /* 32 << 364 */
62055     { { 0x59367582bd27be7bL,0x92bf5bbc1ab2c596L,0x5d96351af6a27741L,
62056         0xeab94db87f929e0dL,0x865ba011043f1afbL,0x43acea125fb631ddL },
62057       { 0x192e0652b2fd1436L,0x44f22ff17b38d121L,0x7bcc228db7cae5f6L,
62058         0x02eaeccd6a828b03L,0x7c48a2ea91f301aaL,0x1e090717f5eb1a07L } },
62059     /* 33 << 364 */
62060     { { 0x4c7f41b4609c6818L,0x978c2a561c82b3c4L,0x68404f1d7f6ba836L,
62061         0x91e056d0c863aa7cL,0x0b24599ba2261804L,0x16e9060dcdd7596fL },
62062       { 0x42aa49434eff004eL,0xb99408690438f1e4L,0x28299e8581775712L,
62063         0x498998eb83be6877L,0x84273d9e91328a67L,0xb7e9076e9a87bc8cL } },
62064     /* 34 << 364 */
62065     { { 0xe8d204865e5aea08L,0xaa946076addc7ba0L,0xc0153a9bb6a5cabdL,
62066         0x622271bd4fbe43e0L,0x44de159cbd62e5cfL,0xefca41112b9b63f8L },
62067       { 0x30774d3cf5269928L,0x4fbb7ff84ac0c8b6L,0xe0611f1f8839106aL,
62068         0x5d4121204ffa4a64L,0x9552c123e86251c0L,0x57d029680efbdb14L } },
62069     /* 35 << 364 */
62070     { { 0xdf3f8e06d7aeacd2L,0x725b25fe4d0e7af3L,0x1794f0da5c17392dL,
62071         0xabc807dac977ff46L,0xd90e6c8f0d5ca66fL,0xaf8eb526c2d26d49L },
62072       { 0x4661962e8a8efa37L,0x2a2cbeade87ad53aL,0xa57d34b1ce3ff40fL,
62073         0x1190437dc6aa3067L,0x92c31e779db66b47L,0x86a8ee0f8e8a70d4L } },
62074     /* 36 << 364 */
62075     { { 0x7b65bb14de97229eL,0xad6e3fee4c6d35b8L,0xfcbbf6afbee3f5d8L,
62076         0xb51549ca4a438fe3L,0xe66e615d437d531dL,0x9ee793eabf168624L },
62077       { 0x796789b0f8878a84L,0x3d38950dd32ec2ecL,0x74c37196a638d45bL,
62078         0x35d318327aeedaf0L,0x082c44f046a001e5L,0x93fae5cf89886220L } },
62079     /* 37 << 364 */
62080     { { 0x8e585fea499b635cL,0x60afcb3566781e83L,0x06594d9267482257L,
62081         0xb9f6101128773448L,0xba9ef7102817fd2aL,0x494e05b2aad046c8L },
62082       { 0x65d804fc1614e265L,0x1b0884c6d97fe002L,0xd7d34f60875bcc2dL,
62083         0xf34725444b440852L,0x49386bfb95591325L,0xe3966f4ccf68a142L } },
62084     /* 38 << 364 */
62085     { { 0xa5f3bc6cea06320dL,0x1bf855c637ad6e7eL,0xce7ff06ec58befadL,
62086         0xcf0d22cf1c2c0478L,0xf53e473e75616621L,0x00539f8700829986L },
62087       { 0x45398355844866d3L,0xbade46a2d710bc63L,0x6b3da567d4e2641fL,
62088         0xff70185978fd963cL,0x2eefaabaa5bc18a6L,0x61eeca92eb64cd49L } },
62089     /* 39 << 364 */
62090     { { 0xdf7c7c0b4cd4c82fL,0x67a26a97188ab9dcL,0x58c5bd74dd189cebL,
62091         0x3e1e93a9bb6409f2L,0x0d18a8bca6bb744bL,0xad3eafb45328dcf0L },
62092       { 0xacd15db5e311dfe8L,0x13a1c10ac1e849bdL,0xfaaa7227e1e73aa5L,
62093         0xa4cd2400e33d4665L,0xb9be68d9d6d527b4L,0xfe282bc05efbfc40L } },
62094     /* 40 << 364 */
62095     { { 0x159b38e17f8fd522L,0xf3ea27b5755e2bd8L,0xfaa52efebf11ac90L,
62096         0xc2014b892cb9f6dfL,0xa711c179d8baa5d6L,0x5474c1ceb22c2f27L },
62097       { 0x3cbc74cb031d05d9L,0xddd97ca6c44e469aL,0x21b386a647db83e5L,
62098         0xd1431c7b7abc0595L,0xbc05d009a416a325L,0x1c29eb709da53e92L } },
62099     /* 41 << 364 */
62100     { { 0x7f1aaf98181ce8a0L,0xa890cd3b6caa5b6cL,0x5d78dfaa5fbeac66L,
62101         0x36c63cef3d3d4594L,0x6f89ac3ec36d117aL,0xce9095640fc90e27L },
62102       { 0xaa356b1ac127aa76L,0xfa42cc119d181455L,0xbe4622fcd27f5ab7L,
62103         0x58d924542c3d54f7L,0x78a84f6b07e93c24L,0x5bf7cd278bce9a46L } },
62104     /* 42 << 364 */
62105     { { 0x4bde9ce5f810db3bL,0xec4a74b7281552edL,0xf5b4fa5fee085bb0L,
62106         0xb07a62936192c8b2L,0x163ff0d1fb18d219L,0x8d4b5e1d8e0ce753L },
62107       { 0xbfa6211baebcbf50L,0x1ed6d4b4fecc19eeL,0xbf6d514b82393e94L,
62108         0x90b356c1711e7d6fL,0x87b28dc2f975139bL,0xc41900648d8bebe9L } },
62109     /* 43 << 364 */
62110     { { 0x3468af53e8d49368L,0xa0a07369ff825262L,0xfad134fd662958f7L,
62111         0x5be79c00ce900822L,0x4909a56c44bde5abL,0xc2e8c4df4862e335L },
62112       { 0xd5e9b9386e7e41f5L,0xd3828d424fe474afL,0x058b2723cef44adaL,
62113         0xc74ac74617eebe66L,0xc3e6e014bca4416cL,0x2e30bc88167c2e86L } },
62114     /* 44 << 364 */
62115     { { 0x68211ba4969c2c58L,0x7a34733977f218e4L,0x0237eb3696ea1d64L,
62116         0xdc97f94b7416f3caL,0x63aa82e476bf9e52L,0x4b88a32d388465baL },
62117       { 0x7322d9f44adc7579L,0x70c01c7fb24d28f6L,0xdf7f4213c7517ecaL,
62118         0x42c027f0a8db6d56L,0x2708360eb6c2f8baL,0xf20690d1c2dde09eL } },
62119     /* 45 << 364 */
62120     { { 0xf139c3e3bc6158ceL,0x19207b6a4c86b780L,0x55af3eb977c036b1L,
62121         0xd192686abd563ebdL,0x8bd0afb05550266dL,0xaaa7376d83bf81bfL },
62122       { 0x26aa74ae4a114541L,0xd92549dfbb6745ecL,0x6ad6a14ec6bbfbd0L,
62123         0x63fee75b411771f3L,0x111ae3101938e8b5L,0xce3e5e346c363756L } },
62124     /* 46 << 364 */
62125     { { 0x2a53c88ae0a45b56L,0x26367466da72228fL,0xdd65516edfdbb135L,
62126         0x5fe254e82d7e37bfL,0xc0f5cbe433ef39e3L,0x249b7e3ece85effeL },
62127       { 0x85951a5391ffba8aL,0x41117672c8dd5ec6L,0x7a74538d9dbb0761L,
62128         0x0b35fba0cfb06ddcL,0x8c36be4d1a0aca2aL,0xbf884a8e45848e1dL } },
62129     /* 47 << 364 */
62130     { { 0x191eef31788596c8L,0xa7413be65a2d0ef8L,0x30894fcc5c3c09e1L,
62131         0x6b0e429b2f72a333L,0xceea52a1e70470e2L,0xfc638b316b682db2L },
62132       { 0x31af73cd615f7f21L,0xb31663760094996eL,0x7ec37e33dfff756dL,
62133         0x38c50101d9b63a4cL,0xa517c6df192f18e4L,0xd674c53a841fb337L } },
62134     /* 48 << 364 */
62135     { { 0x4dd3bd842446fc6aL,0x4654b82ef25ab510L,0x1ad46998ba066896L,
62136         0xb7c679acad713bbdL,0xef9389aff7ca4fa5L,0x1b864105d68b6a1cL },
62137       { 0x3acfff604b6f5ea4L,0x81ef58f7b9e5a475L,0x5e2f6441c66ad734L,
62138         0x49f144c42fd3eb16L,0xbd7f22082e4e2117L,0x30865994417911a3L } },
62139     /* 49 << 364 */
62140     { { 0xc2f25d9e80d2adb5L,0xa0e77dc5242430feL,0x7f30e54b4f504e97L,
62141         0xdc114db4680ca2cbL,0xf76fae57adec4d89L,0x06f892eff313535fL },
62142       { 0x50af729a9a266407L,0xb0cbc4f0764dffd1L,0x153ff8f8d20c2e19L,
62143         0x27fa845a7388d22fL,0x26e08ef5d784e057L,0xccbe49ee53b5dfc0L } },
62144     /* 50 << 364 */
62145     { { 0x6fa8e5ff3082ceb5L,0x81f4dd02ef4850ccL,0x626b324456483f9aL,
62146         0xc0acbd8782e65652L,0xf9bef3117e23f93eL,0xc2474777c2310f6fL },
62147       { 0x6b4617704379fd64L,0x2f8fc599f18c3b14L,0x2287f1d0bd076aedL,
62148         0x9f8eac0fef366016L,0x517cd2e371fd845dL,0x0fc2f219a30c371dL } },
62149     /* 51 << 364 */
62150     { { 0xfea0464721c56ce8L,0x4f7b055b6a32a26bL,0xf8c8d93e487ed396L,
62151         0xe620b440855f4df9L,0xa3f6f21dea870c14L,0x0518225207dad127L },
62152       { 0xbdfb7b12c68ab5f6L,0x5f58bdd7fc68f296L,0x2df9cfc505e4fdc2L,
62153         0xed12a102379c282cL,0xd388362654d8de77L,0xaefb0f7fb01065afL } },
62154     /* 52 << 364 */
62155     { { 0xdc64f8d23d80d738L,0x7ae74ab1d95a1c6dL,0x4dba93a8dd46de0dL,
62156         0x271aeb870fddbd1dL,0x1bab6546e9e7ed31L,0xe6445d22efec8f37L },
62157       { 0xd927df1797a718a7L,0x738c2450351b1ceaL,0x3809e595d51a7422L,
62158         0x4f8d5ea58969456cL,0x74d9168421c9ad95L,0x59a69f8f4f796a11L } },
62159     /* 53 << 364 */
62160     { { 0x2542fcf1f07717aaL,0x032abb3f405a7717L,0xc757e6e294cade8cL,
62161         0xad4776adf2e84dd1L,0xb7e277243d5e397bL,0x173894a605f8921cL },
62162       { 0x0e3a78531f6afc3fL,0xf33732b8ad62482fL,0xa6b4e0f03e4cb6e9L,
62163         0x51ba565eda02264aL,0xd0afaa4600f3f376L,0xf5506a1e35252e93L } },
62164     /* 54 << 364 */
62165     { { 0x3574783b5ea1c662L,0x675894e514fadc8dL,0x64dd63935ac6ea7fL,
62166         0xa76c00dc77f16c96L,0xf73ef2c62eb9574cL,0xdd39a89a2e408008L },
62167       { 0xbef8c8c72bafa10bL,0xa31f030a074733f8L,0x5620dda5445b4b6dL,
62168         0x4e08fb0173040ab8L,0x0a279f38598ad48aL,0x03e8b55e2d40d775L } },
62169     /* 55 << 364 */
62170     { { 0xf49d4d54c20c8610L,0x1b1d70bbc0d62b65L,0x524d3a0c16285ce2L,
62171         0x0be553b08a0785b4L,0x9b93e5093c84975aL,0xbeac761160769465L },
62172       { 0xffaaffcb3331dd0aL,0xad0f01542d70fcf1L,0x65aaabab66fe24bcL,
62173         0x283edb562cab253eL,0x1659deca80383c87L,0x06de45fd83fc6d7cL } },
62174     /* 56 << 364 */
62175     { { 0x7bcb055d5f76c311L,0xdb2d05878e293aaaL,0xb15036e7207360b4L,
62176         0xbc38cc9f163f0ae4L,0x5a942f85a44d0a0eL,0xee8633a23f553a88L },
62177       { 0xf66b65c5c9bd4ee7L,0x7a4ca96a80b8ceefL,0x7b71cc55f6f08036L,
62178         0xc0408b198c41be7cL,0x885fd72f80860d93L,0x338a567be7f68b7bL } },
62179     /* 57 << 364 */
62180     { { 0xcba302e939d99b60L,0x2557b3d903b8faa0L,0x2a99cd6e9efc4461L,
62181         0x03ce3e08268f14a3L,0x59226a83b1c68a01L,0x81a18c69fe379976L },
62182       { 0xfdfc9f148af62557L,0x0cdf327140b2d4ebL,0xf99ff3ded26c6085L,
62183         0x2c138ffdf9b0273cL,0x393d6de6888dfbd3L,0x75903c68e5cc102bL } },
62184     /* 58 << 364 */
62185     { { 0x0c56d477b78a7b91L,0xbedff933c7c3ecf4L,0xe02da64223ead65aL,
62186         0xf7e7cc19a8162300L,0x3719fb8f2f3dbd03L,0x4f150cb8cff88c59L },
62187       { 0xa564c5eda7fcb233L,0x9b042870b6a41ca7L,0xf253b65ac1615f1aL,
62188         0x9ccb49a7b8aaff46L,0x38bbc5f7af0086fdL,0x688f7c2054a6d8a9L } },
62189     /* 59 << 364 */
62190     { { 0x3702c5e5d22a0892L,0xf17510a28d510809L,0x5c36dc68bfdab4e7L,
62191         0xf72c9357623a98e4L,0xc660fc5146624a0cL,0xf0b4983d3e64dd4cL },
62192       { 0x5cb98cc9a5ecf45eL,0x79759acdf5082a78L,0xfd0daf366e7321dfL,
62193         0xf61c54f7f1ebcacaL,0x782e5e74b8f665c4L,0xb1d54c2145d78c08L } },
62194     /* 60 << 364 */
62195     { { 0xb64f3b9bef1af123L,0xc86dc5ffe1b75401L,0xc3a76d81d928e989L,
62196         0x075005abff8ca002L,0xca6226325c3cd8b1L,0x017a97b2bd8f772aL },
62197       { 0x187eb635039c4757L,0x9eb7a9d1e905c6e5L,0xdacb98bfbc251cceL,
62198         0xe357c60e8704c639L,0x50563b8558fd987aL,0xb2f89c864cea5d4bL } },
62199     /* 61 << 364 */
62200     { { 0x3d13c0bfd32233faL,0x997c424145aceb7cL,0x77ff5a75ed2e9df0L,
62201         0xc4279aa23c91d085L,0x5a11a276ca0392c7L,0x928e06032daae653L },
62202       { 0x21fe225fc4046f85L,0x591fa82f512dbfb4L,0xb5b01a3f51aa53feL,
62203         0x900012ef7133befbL,0x24609da17130c15dL,0x3c4a09b33d2549faL } },
62204     /* 62 << 364 */
62205     { { 0xcdd3073d3ceabe32L,0x56e155bc5a848977L,0x07f4c7c6da48eef6L,
62206         0x00a2f9f79e021b38L,0xeb683e17ffc4bd6bL,0xa7d6b87592b7e240L },
62207       { 0x651d21de7e48836eL,0xf9c9ede775de3c75L,0x72cea748d90f2634L,
62208         0x29d8022283fc524aL,0x1e412b510dd044faL,0x1b9b332a76a04fdfL } },
62209     /* 63 << 364 */
62210     { { 0x4dc8421f06f49d8cL,0x6a3fd9a83f979e4cL,0x50b0e3760b51bd69L,
62211         0xec22f486a592313eL,0x5e4663ff8e8904d4L,0xde7b9e23f3362548L },
62212       { 0xa1ad270d1ab757abL,0xb91fd935a3089f6aL,0x1d6b1524a635f996L,
62213         0x8673f8e29c718c6dL,0x0e04360725932b9fL,0xb5d0447222ac239fL } },
62214     /* 64 << 364 */
62215     { { 0xdf0ae8df941948e3L,0x123fee901d010bcdL,0xde3717ca1dd28691L,
62216         0x0c1db879709b678eL,0x0288959a400acdc6L,0x66c691815ca2d03aL },
62217       { 0xe52534b3dbbb75deL,0xe914938c3de927cfL,0x1a9a34f873eece30L,
62218         0x0fb0c7bd642a6799L,0x375cc0cfeaa7e8a8L,0x75fb9eb5d00ec238L } },
62219     /* 0 << 371 */
62220     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
62221       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
62222     /* 1 << 371 */
62223     { { 0x9ca8cc9db72958ebL,0x3c8cd0db1014f562L,0x72115d53059b2bbaL,
62224         0x8fe7ac30730e5dc3L,0x4e67ef69841d8998L,0xfb6439ffc8ed37a5L },
62225       { 0x48164b3e26df84c4L,0x37d492ad365bc99eL,0xb7fd4643beed38ceL,
62226         0x993cfa9fa3e30b3dL,0xdcc5e7af01ddd484L,0x5edf3ac06840175dL } },
62227     /* 2 << 371 */
62228     { { 0x79768e9f51d33c11L,0xeec34505a4b24889L,0xc194821bbe0c67d7L,
62229         0x537a6a4a6909fdfcL,0xae6d705195ccdda7L,0xed4b722292b3926cL },
62230       { 0x2c5dd6af6b24a3d4L,0x9282ec39e4386095L,0xdd3c7388397a3bd3L,
62231         0x9d176c6a8baf59c2L,0xd5c6219e380ec958L,0x194fc11654e8e315L } },
62232     /* 3 << 371 */
62233     { { 0x0b7576f901ec1432L,0x84b30eecabc5f603L,0xdaaf7ba9f4a84b7aL,
62234         0x9e3a5daa3bb37a99L,0x56bd964880378cffL,0x2fdeeeb78e6ed856L },
62235       { 0x079014a73c81ac34L,0xf8de4004b4211c27L,0x0cee3df97fe4391eL,
62236         0x441aa7fb2fd2fc38L,0xeba7be864d1b575aL,0xca2fb5b7231c2d01L } },
62237     /* 4 << 371 */
62238     { { 0x0683349e463a8251L,0x97dc4f475103e72cL,0x47c7181050663b9eL,
62239         0xf327d1499733dac6L,0x03f55e4a292137c5L,0xccc6232ada59e1c7L },
62240       { 0xbaa8b4ddadc59cb8L,0x45370d35fe7486e4L,0x99a88c1db0322df9L,
62241         0x394440a7fd69954fL,0x9060473da5a29889L,0xc8ca43e32f04864aL } },
62242     /* 5 << 371 */
62243     { { 0xd5c7241add8b9644L,0x45a5f2d1993116d2L,0xbacacd4a823048dfL,
62244         0xa278fa042568547aL,0x3a4f2482bff72820L,0x1305d1a713e4314aL },
62245       { 0x9d84c33334ba28e3L,0x9995b5bb6a32fb41L,0xb0f75f3c520946d8L,
62246         0xd7c4b8b7de98aa63L,0xee5efcf3ba856b6bL,0x36af33683324ed66L } },
62247     /* 6 << 371 */
62248     { { 0x90762c1f5827fe2cL,0x20160f7aeaffda88L,0x7420849f5c47c645L,
62249         0xb08231956d72e748L,0xaeac683b8ee11773L,0x8c2a0a79fb5c550eL },
62250       { 0x6d986d696c07cc1eL,0x57269140ba8398b9L,0xd13e136fd94d5223L,
62251         0x1aa75419ed5b01c6L,0x7c2014b1408fcdccL,0x0680a985cffde5eeL } },
62252     /* 7 << 371 */
62253     { { 0x92fc9a3342c5a7eeL,0x8768614af9f0ed71L,0x1ea5f7ed87ebfb66L,
62254         0x296852ded361069cL,0x1cec6f1a0192498eL,0xbfd4858fa9cca3aaL },
62255       { 0xfba98c242ef240e8L,0xc8b500e4ab635d9fL,0x9f49c572913a3eddL,
62256         0xe6181f93d42b2d4dL,0xf96b5db26aa77fa3L,0xdfb2241fe43558d8L } },
62257     /* 8 << 371 */
62258     { { 0xc7d0abb2edee15a5L,0x72dc0105228cc4a1L,0xeb67defca80767deL,
62259         0x6fa174d871820908L,0x3215df485674d19aL,0xf944531a960a081aL },
62260       { 0x93ed7180ef2cce62L,0xb318edbfc8bcfc0dL,0x0909d56efe787e58L,
62261         0x5ae74fc98fe8b96fL,0x8fc342c435ab6811L,0x6fc6cc5c0b991e0cL } },
62262     /* 9 << 371 */
62263     { { 0xa8eaba6e291f689dL,0xfbfa9a2cdea0cba9L,0x5b1b4a21727bfa11L,
62264         0x3b69505fac59c8c4L,0xb06290c89368ddb2L,0x4181abc294bcc14aL },
62265       { 0xa19f65813e29d997L,0xab1ae8408864aac2L,0xb04a24300fcc9ae8L,
62266         0x3ca2428e1059e4dbL,0xe288731117e1e01dL,0x1f5d4164be56238fL } },
62267     /* 10 << 371 */
62268     { { 0xc600dd57354416d9L,0x6f5840991f829d6bL,0x2d7b0a27de43c1d6L,
62269         0x21bf3a9e616bdb16L,0x33ce767c96297953L,0x99bf97b69e4398b2L },
62270       { 0x4069cced8d441287L,0x52e0edd6bf01017dL,0x9981bf89c5394236L,
62271         0x07d9c079acb24e38L,0xd2e5e904a2da4735L,0x4c3c12162f1b6cd9L } },
62272     /* 11 << 371 */
62273     { { 0x1f28bd0de6f1c85cL,0x4a49d0864e6f3db6L,0xc9a8e70c4ef7d981L,
62274         0xde8abcf2682bc68eL,0xd0ef89a4a66cbee3L,0xfa03108432df7f0fL },
62275       { 0xe361e0f803594856L,0x1f423bafc985c77fL,0x50397b67010ee4acL,
62276         0x502f4a20c0a48e96L,0x260bed875435539eL,0xdae03cefa0391250L } },
62277     /* 12 << 371 */
62278     { { 0xfeecc6e83be5ba68L,0x3293dbda40445158L,0x48454e20e81879caL,
62279         0xd0ea9cb89c4a2712L,0xba8b6f33540749c3L,0x95e6d6e3e971df93L },
62280       { 0x4c2a1b13478a2eb5L,0x8b5f9af330b92170L,0xe6c60b5343573986L,
62281         0xb9f56a6a57040c00L,0x6de6489f6291a7b4L,0xa9a7784653bc3246L } },
62282     /* 13 << 371 */
62283     { { 0x0dd4172f9025411fL,0x978e952ac6129de8L,0x9afa974bc7ab7609L,
62284         0x7bd29a644e42f223L,0xc0232f5f3deb639bL,0xacce69d05f39a264L },
62285       { 0xdaee07cb3070b24cL,0xe3adc8556b532246L,0xae5935ce1e6ee4f6L,
62286         0xba9c4329ea018a45L,0xa1a4002e6b97ee9dL,0x98390aab8a9460cbL } },
62287     /* 14 << 371 */
62288     { { 0x828a9dbe67154a02L,0x57a3af981866aadfL,0x1558428089faa581L,
62289         0x2da092202dba2a1dL,0xa225f631df197ae6L,0x0abff5cf8f4ebabbL },
62290       { 0xbbadc9b3b98e5e4eL,0x7c7cc36e4509f98fL,0x072a6cc2759413f6L,
62291         0x7b39ea4121dd1222L,0xd6baf9e196ac2c73L,0xee38818c75d46296L } },
62292     /* 15 << 371 */
62293     { { 0x19befeacfa37c53fL,0x32c29b361f95c29aL,0x1d282db40d5aeafdL,
62294         0x8812b6c8f102a97eL,0x1cd4a23c8402f481L,0xbfdf7b6b8eddec81L },
62295       { 0xc8039ae0616b2654L,0xdc6f38acabd23a57L,0x2431c763f147dd44L,
62296         0x7c45ed50d795bc37L,0xdbc30ab9842022aeL,0x568f7d4ba1f05a43L } },
62297     /* 16 << 371 */
62298     { { 0x55671129542f4e90L,0x43bedccf0623d4cdL,0x7e21207ce99ca16bL,
62299         0x785fa1057c7a26b9L,0x33c28658c2c3ab00L,0xcce42a48d79cd59fL },
62300       { 0x9a674db4b8c3bc75L,0xea701d156904e3feL,0x990e722166bf2c6cL,
62301         0xba29affabd4c3791L,0xd98510cf20696ee1L,0x722ed471f93d26a5L } },
62302     /* 17 << 371 */
62303     { { 0x74e6c2624ba40f04L,0xf7ad1f159a63b3c2L,0xa89e8490ef75d482L,
62304         0xaf8e79b83bb5f5c4L,0xb094f8660c624d8aL,0xb571ce6613c69a60L },
62305       { 0xcbf9722d53787457L,0x97e24cf5c15d097fL,0xdba98bede99e034bL,
62306         0x8b6c171a57773590L,0x5d2b441cfe822efbL,0xb8c6dc57fc74ef1aL } },
62307     /* 18 << 371 */
62308     { { 0x37c70bdf7db1c03fL,0xd9368612964632abL,0xcf6368d742530338L,
62309         0xe56beecbb1d9522eL,0xb1caaf16bb6fba3aL,0xb7bd485ac8384d26L },
62310       { 0x4ba13818528d4372L,0x95c469bab9c5e8f6L,0x4e5cef0c4a370695L,
62311         0xb87c97ca663f9b07L,0xa9e1b388e5f3b79aL,0xc0416bb84c845a1bL } },
62312     /* 19 << 371 */
62313     { { 0x4483db00e4634d8dL,0x4d8d623d0a268bd8L,0x296f179c64e6d10aL,
62314         0x048f3a1cb6c7ff95L,0x60f8ad62c60c76d1L,0xa0a497610d028845L },
62315       { 0x10128387aea1b714L,0x81e5c75ca18bd98cL,0xac30d7361dac4200L,
62316         0xb83c1c12821380f1L,0xc8ca7c6afaaeb726L,0x13fb870dfead4cfbL } },
62317     /* 20 << 371 */
62318     { { 0x3921332a6b393648L,0x49ec6df649584f38L,0xa0fc013dce243a6cL,
62319         0xde5b16b5f8da8a00L,0xabcd0c0471ab1c9aL,0xff6594bc78b83305L },
62320       { 0x3546004b76c1900bL,0x87428fa236fb3186L,0xd2e464ce59cdeb49L,
62321         0x1260bd28faf6ec08L,0x1ada2f08d0c9d098L,0xe0b66299dea06396L } },
62322     /* 21 << 371 */
62323     { { 0x603d58167c1212e8L,0x95bb823fa4590144L,0xf239058a4bc3ba48L,
62324         0x21f2aa610db724b3L,0x29c706e8cd6792a2L,0xb143a84a634f01e6L },
62325       { 0x68f37382626ee80eL,0x56daa0e51fcd8c4aL,0xe01b52b39e5299a5L,
62326         0x2224513c3accdac7L,0xbb21c7d74acd435fL,0x039bc010bbcb948aL } },
62327     /* 22 << 371 */
62328     { { 0x5006c3a00848d6b7L,0x726b8648b28285aeL,0x7162e3c0277c5a87L,
62329         0x567f7ab02019c20aL,0x490c858fa551d5efL,0x0029a108d134a2bbL },
62330       { 0xa9e19284ef0aca3cL,0xbc399dc16e414f83L,0x5bdf85f86efa5a8eL,
62331         0x5291e1a674fe7c5fL,0x249ddf2acd7091dfL,0x71d4cb4c2e29fcf6L } },
62332     /* 23 << 371 */
62333     { { 0xc374acf4c1ded13cL,0x300d96132b69132cL,0x909ce34b055622d2L,
62334         0x26f033f6bad97809L,0x30987ebed1f7a220L,0x23147226db775b8cL },
62335       { 0x8d45c2c28d05ecfdL,0xeee0c679f0c1b419L,0x9f7df70d8c380da2L,
62336         0x4d49f3d130212a25L,0xa9602e8c64491ff3L,0x5ab91d223a254c49L } },
62337     /* 24 << 371 */
62338     { { 0xedd3291c9dac47a9L,0x02d64634fb5d396dL,0x2ce21bf163264c51L,
62339         0x0fdcc68e092c4724L,0x653acb286e3e4c2fL,0x2f9c77f12f1fa1edL },
62340       { 0xd91d4c3aa58afea2L,0x5a91b2ba7b0d8092L,0xd47e0f61f10a15fdL,
62341         0x01652d86f9c86edeL,0x1cc1b668d6006daeL,0x2763e36d24af68beL } },
62342     /* 25 << 371 */
62343     { { 0xaa5f387c2314a1adL,0xb8c00105e2647c74L,0x1f950dd8d6719178L,
62344         0xb7dae31de79881efL,0xf2d49aa2e45a615eL,0xb22dc098f17352afL },
62345       { 0xa4c438728ac23ba4L,0xedd6e4092c55e588L,0x1956b199022f5632L,
62346         0x18adcaa58c11bc50L,0xa0c11f6458b1cbf5L,0xd1204377f961ce1fL } },
62347     /* 26 << 371 */
62348     { { 0x35a2685bbb77f5dcL,0x1b5b79bbc08efa67L,0x4ebec6e6ea5f411eL,
62349         0x1800a21988c57793L,0x8d7397f2cbb13c96L,0xbc13ac35dc0327f4L },
62350       { 0x53ac05a6fd94b150L,0xd898fa600423e787L,0x802aad2c2a66b97fL,
62351         0xb604ac0692c62b03L,0x9f395d3a45911e7dL,0x5d38164128ae56b6L } },
62352     /* 27 << 371 */
62353     { { 0xa7d5a3afa5fb0decL,0x0d11c0cd5b27e02dL,0x8d854b53366c6cc9L,
62354         0x87ef4c140ad9a5f5L,0xaf7c2e6b0c5f8acfL,0x81fc22b69f010f1aL },
62355       { 0xe49e0c7e4e25ddb3L,0xd30bc860ef233d23L,0x0b63afb89fa41205L,
62356         0xd14b326c702fea93L,0x10ab93662c2a5fc8L,0xab35bab356cfff28L } },
62357     /* 28 << 371 */
62358     { { 0xdf0f79524130138bL,0x117e4628934c58afL,0x227be6867b6a4087L,
62359         0xe73fb2f3b8d298a3L,0xe32e89fda9bacb9dL,0xdd3be6130e9ea7e3L },
62360       { 0xd3d655ead4da2d1eL,0x153cce647833bb3dL,0x4a32a9f0b36da20cL,
62361         0x025768e5a69c4b27L,0xb0b5da379cf1fcecL,0xd0ecaba23aa3b99eL } },
62362     /* 29 << 371 */
62363     { { 0x9ab6dae0aaf6b398L,0x2d50f46b4f8e270cL,0x46c1e676fd7b7005L,
62364         0x4b8b203e32cf8be9L,0x0253ec899451bca9L,0xc3a7eab7f512b7a5L },
62365       { 0xf3bed3fdc5bd61a6L,0x5c0eb52f0a37ef8aL,0xb61aee11140894dfL,
62366         0x690607f9bec928f6L,0xba2b1db65148b45cL,0xbd309bf56619b652L } },
62367     /* 30 << 371 */
62368     { { 0x79d624c7a7b92932L,0xcd086bd7cc75e7a8L,0x3cddc1bbb48eab26L,
62369         0x10282df1f6791cfdL,0xffedb4fb1048f114L,0x937ed0e7c092d899L },
62370       { 0x045e4f60b84b6d20L,0xdd67bd36877ed915L,0x9bf8fede97617aa9L,
62371         0xa7ff9b0789cb8e1aL,0xc49e310e74f4e7d6L,0x12dde0fb3f62eafeL } },
62372     /* 31 << 371 */
62373     { { 0xe2e3dc4d50ba6e73L,0x31c19ebce6114f87L,0x8df0ffb01ffa99b5L,
62374         0x305142f1bfcf7fbdL,0x39931954ab88b782L,0x1952bbab43de3650L },
62375       { 0xb32ed678aa09e528L,0xa5150011acee68ffL,0x0307716a97b98b23L,
62376         0xb60c3edd4fc8d2b7L,0x91c81725b2b2f887L,0xf1dfc70ab9fb0288L } },
62377     /* 32 << 371 */
62378     { { 0xe7cf5bacbc579793L,0x11db7ddfd73f881cL,0x9c1a531d04fa8473L,
62379         0x399e84845780efdaL,0x6e9c12be4f62cb5aL,0xf21bdc4994a5df3bL },
62380       { 0x3c15fe1211da2a4fL,0xdea123bb23e631d1L,0x3ef76da4be294c90L,
62381         0x5cf21d5aa99b8398L,0x50679cf8751b9f6aL,0x4b3f3b9c54d0b7bfL } },
62382     /* 33 << 371 */
62383     { { 0x442dc0fd27174604L,0x5aa056efebc95895L,0xbb8cf9b54c96a2dfL,
62384         0xf43342d440f8618bL,0x58b0d00a8f89a8bcL,0x74d32dbc81f69f20L },
62385       { 0x5caf0910ab22a49eL,0xa0e9a677ff372f3cL,0xec90b5aef5c05066L,
62386         0xe2d98821b663f0e1L,0x388804bf50c7abc2L,0x2fbab16e97ba64d3L } },
62387     /* 34 << 371 */
62388     { { 0x09138c6071ed8d4eL,0x994d0fa991ef82b1L,0xe6089dbb931f3193L,
62389         0xb3b229d0aac23611L,0x52cf03fdacb8affeL,0xf64f9872bd99d6e2L },
62390       { 0x52ebb8b40186279dL,0x36a2349fb09efd7aL,0xa85b5d802225772aL,
62391         0xd2dc3c1547522562L,0x659297a666471319L,0x65913b608c8e7b68L } },
62392     /* 35 << 371 */
62393     { { 0xd54591f9a713f82eL,0x0ecfcffc6fae64b7L,0x7df9d7ea7287e218L,
62394         0x8b260162abe71460L,0xf75097efb12d48beL,0x82d5902482581904L },
62395       { 0xc5c0b5dc400d4288L,0xf6493c78190f768cL,0x1844b5f895bc9fccL,
62396         0x24afb04ba615bff9L,0x6c9638ee8bf51197L,0x38bce012b9ab9fcaL } },
62397     /* 36 << 371 */
62398     { { 0x087a2790494efdc0L,0x0b5f23c9e1645cb8L,0xa6e1d1e8193a99baL,
62399         0x0d324e67c0e0c026L,0xa86d993820d608b5L,0x48ddfbfd8d6944dfL },
62400       { 0x6aa07f90d371864eL,0x5cf727eef2060df5L,0x7694e02c9a7cf2d0L,
62401         0xe091982f6260f63cL,0xd2d481a72cae5da6L,0x045e3685ebcb4172L } },
62402     /* 37 << 371 */
62403     { { 0x1765632323c82633L,0x5de90578d590cdd3L,0x5cc5e7b9525caf0aL,
62404         0xdd9be80dd53e825aL,0x9ed28b29949073f3L,0xd15024156a6ce0bcL },
62405       { 0xbc34beeabf355f49L,0x73724878d2b210ccL,0xe47b7af911e8122dL,
62406         0x381a4cccdf53a9eaL,0xaa22c9b229e8a466L,0x7a05e2081a4fa093L } },
62407     /* 38 << 371 */
62408     { { 0x3dfb53521830d848L,0xea183d5cd2820590L,0xc83a65bcabbeb376L,
62409         0x5d9ca4d189bb9ac9L,0xb32217be137c900aL,0xcc40daebb0827afdL },
62410       { 0xc76130060c58b0afL,0x39f4ed8adf32389dL,0x04a586e2bc1fe9f6L,
62411         0xcf018c2abb50450eL,0x5072b8f016d55d0dL,0xc3c72e90d59e1dbdL } },
62412     /* 39 << 371 */
62413     { { 0xb3291b4e50b4e9f4L,0x79a2e8121b7b9e08L,0x81855db1ddd5f0adL,
62414         0x91fa12fc884392e5L,0x6373de02291c5694L,0x15c77432a7171428L },
62415       { 0x6016a06c1132df9eL,0xa4286939a0c21c8fL,0x70c5ebe26dca3f37L,
62416         0xc5278c510f115497L,0x8f5b07a35ce1953cL,0x4d75c1dc41f6ac0dL } },
62417     /* 40 << 371 */
62418     { { 0xfeac8e8ac24002e7L,0xa43892076643fa6aL,0x06e7ed63daa68b52L,
62419         0x8580bbd5d8c7b952L,0xb17ce22410c8fe9dL,0x40266bd379b88ceaL },
62420       { 0x32afc840dd63ffa5L,0xb4a3eb27a2280b83L,0x90528bf685897e28L,
62421         0xe4612391d231f941L,0xa7b3a2ccacb5c909L,0x2606844e5558d57aL } },
62422     /* 41 << 371 */
62423     { { 0x49ad52380519dd66L,0xe1b0b03b3c1470f4L,0x15e42792cd3a4852L,
62424         0x91c954b7388ba040L,0xe9fd8c7f857711f1L,0x8552d3d44b63a36dL },
62425       { 0xbf867fde230ffab0L,0x362a32a0793f885dL,0x687802cba11e0225L,
62426         0xd95b073b308c1972L,0x13b104aa6b3e5120L,0x60bef12333673f57L } },
62427     /* 42 << 371 */
62428     { { 0x4c4cc5561c8a5d9fL,0x5c6e1fd52b8a42c9L,0x73fd66c44ccfa024L,
62429         0x73c777563c50d038L,0x26964a68a5076758L,0xb14cdbfa7484d080L },
62430       { 0x24c499cf3f4b92ccL,0x40c8c0d84682daa1L,0xaa156edf785561beL,
62431         0x36718fb6de75af0aL,0x4d391cee03f5b180L,0xcf28d08a3100efc8L } },
62432     /* 43 << 371 */
62433     { { 0xbf1fc9fdd113a97bL,0x19cee87f5ff5ff3cL,0xfc140acf8f8213a3L,
62434         0xe70d50d546127d5cL,0x78cd24032faa7ac9L,0x409675f1c1808096L },
62435       { 0xaa7b6cd91765da93L,0xc0755b924f508d86L,0x09b8fb7640169a6eL,
62436         0x9ca977e52e7da664L,0xee1aab6c9a9616daL,0x54d740391ca0f4fdL } },
62437     /* 44 << 371 */
62438     { { 0xfe011830c37c7fc5L,0x0b2b965b2ee958c7L,0x99fd253588a43cf6L,
62439         0x6a73d62dbf8dc33aL,0xd53c0241a99247deL,0xb8186dccb4127f94L },
62440       { 0x86c4c274964cc3d3L,0x2f3f2742cbfa9429L,0x5b4bd23c5391abd3L,
62441         0x030b211bc5838fe2L,0xd2263dc4ae2e36fbL,0x45583a3ca0bf7280L } },
62442     /* 45 << 371 */
62443     { { 0x9ce7f43f1ed3f49aL,0xd8094c4afcdce20cL,0xd8b423d12b37b162L,
62444         0x332ce47c53d90a7dL,0xc686fc0c94a38ff2L,0xb44938d6c33d842eL },
62445       { 0x5ed14772cd9b0002L,0xffa5d063e800c655L,0x4511ec79ffcb6120L,
62446         0xb8c9de3f9da8e70dL,0x4d0759ca952b0ef7L,0x685f7005dfd88f4cL } },
62447     /* 46 << 371 */
62448     { { 0xcbdb755f1dbdc85dL,0x63d0d7047961be6aL,0xf65af35d8220a1b3L,
62449         0x8dcea7df77db51b3L,0x8cb2c5d14bfe8fbeL,0x740579bdee2f03e0L },
62450       { 0xa7eeea4ed3f0181fL,0xedbdfaa3c12ef399L,0xee3cc40f1c332118L,
62451         0xdae0995e731ef93fL,0x05165c6c0f24d954L,0xcbcc014219fca63aL } },
62452     /* 47 << 371 */
62453     { { 0xff24bcd842c7c110L,0xa5ddfffc56dc10c6L,0xb9937fcdaa1a09c5L,
62454         0x8e18ed5b852dd22fL,0xf24e43c7826fb5a7L,0x13989a43415c2c63L },
62455       { 0x71ad7c21d36ffe0bL,0x68b77701129df418L,0x1c5324cd9a8d424aL,
62456         0x2e2a2b1ba9bf46abL,0x7d0c04d19cd0ea12L,0x8b4186bf2f9869e8L } },
62457     /* 48 << 371 */
62458     { { 0x6c8d97e075a46271L,0x0fa0c4cd9dbed39fL,0xfb6da5e2de74ac6cL,
62459         0x041ce886c17c1ec5L,0xb42941a8d7419105L,0x79768eee002fdfd5L },
62460       { 0x64849afd88c8111fL,0xf425fe14814192d6L,0xe916e8640448fd7eL,
62461         0x31e224ad72ed351fL,0x73e6e6ac7c0183c1L,0x375657c621bf7cebL } },
62462     /* 49 << 371 */
62463     { { 0x093d8039114fd7b9L,0xb6bed3eb45c5e1c7L,0xb73ab7fe50fdbf14L,
62464         0x68d95e57af0cd23dL,0x5c260eacc7b750fbL,0x79bb142bb5358c26L },
62465       { 0x5aa9845158ace251L,0x04b2388637dbfef5L,0x1051172dc0532263L,
62466         0x686ee9e6294890d9L,0x092617b3bffd1609L,0xb4a50e50ea3836a4L } },
62467     /* 50 << 371 */
62468     { { 0x8bdb3886cdf950abL,0xe2bdc8d3d595dbd5L,0xd28211254ecc49f1L,
62469         0x946566081d3c2f24L,0x8124ad390c87df6dL,0x6020c322d16272baL },
62470       { 0x2150f7e694af134bL,0x38512401a1a14e33L,0x39a54386b1ff7304L,
62471         0xfaf1ffea078d8f0fL,0x7739ea99dea995bfL,0x3252e815c020816eL } },
62472     /* 51 << 371 */
62473     { { 0x1609832322f1bd8dL,0x6b02533cd4df163fL,0x25108619a8296363L,
62474         0x373bf9988f8c755cL,0xebfbc5b23b32542dL,0x7ada597688b9d360L },
62475       { 0x3914406ebd605f01L,0xe245ba48cb3a40b2L,0x11a1dc4ed3171f32L,
62476         0x4a10d5d26ffb5915L,0x9326b23e997460b6L,0x53ddfee92aa0c77cL } },
62477     /* 52 << 371 */
62478     { { 0x44f51dd51104ed7fL,0xfca4773e270f6135L,0xe36c8b266bc757f4L,
62479         0x2cf0515d6941c7a0L,0xdeab655d5fb16e2aL,0x75c28116cff7be07L },
62480       { 0xb24ca428abbbca02L,0x6aaeca9b1e7f8116L,0x4252f4c3510f0c81L,
62481         0x01462d856f3ff7fcL,0x4df702879d1c25e3L,0xddd47a1dbebd1559L } },
62482     /* 53 << 371 */
62483     { { 0xdffaef2c6f2e2611L,0xc2c2e6a41f29efa2L,0xa29bc3b75ebb40c9L,
62484         0x8473594bac31a2c4L,0x100d7d6a8604447aL,0x80318670794bbab9L },
62485       { 0x78979f72054dfc75L,0x94b4c17e55232511L,0xac44836b78b883c3L,
62486         0xc1f7e98168422328L,0x34fcdee68266747cL,0x18533b3f0475c011L } },
62487     /* 54 << 371 */
62488     { { 0xede6728e3bab17f0L,0xfcd9c96879b94302L,0x6410ae37544a677bL,
62489         0xeacbf6de1dcd0fdeL,0xdae70841e2f3ac0fL,0xeea2a9b6e41ba13bL },
62490       { 0x1b06aeae9349cdf0L,0x28571e3d33c0ea87L,0xceaf9dd46043e874L,
62491         0x32cbcc69fa6fea15L,0x7db75664e135aa11L,0x588d4458f816929aL } },
62492     /* 55 << 371 */
62493     { { 0xf70797d02b014160L,0x1ddf312d8d7c3263L,0x3bdd58f3c78beacbL,
62494         0x8bccd90101c71f77L,0x3c637f58166c1486L,0xb62c0aa45fd1a307L },
62495       { 0xa68db7b05f2544d4L,0xb9727946f860585aL,0x91565060a068412eL,
62496         0x1283d6d1ab536c42L,0x86c2a11c79caa387L,0x2687309b62bd7797L } },
62497     /* 56 << 371 */
62498     { { 0x525cd8849b711a38L,0xd413d82b8c95bf61L,0x19ecc14a36b82970L,
62499         0x65190ee6e3416342L,0xde9834c93066fcf7L,0x3b87b15e8302cd85L },
62500       { 0xec6f67a785268eb2L,0x5ab08b5af95aef07L,0xb5257f70adda86a5L,
62501         0x53e95ec4b934400aL,0x9611a632c33b870bL,0xd27929522723a3d5L } },
62502     /* 57 << 371 */
62503     { { 0xcd203b542c95b469L,0x89b140e768713ca6L,0x451646a165701050L,
62504         0xb97a582575e54715L,0x070fabaa93bb6a91L,0xe517e07a196421b3L },
62505       { 0xc8d741235f46e495L,0x920ee94fdf60eb8dL,0x885b86dd19564c3eL,
62506         0x6c9e973231670005L,0xb52eed1fe4893763L,0xa8f9fbd759157417L } },
62507     /* 58 << 371 */
62508     { { 0x0c41f2eb56517cafL,0x47778a92798cf8b0L,0x4232ab390dc60cecL,
62509         0x5de0b7e39e3eb6f1L,0xa2569d8571562511L,0x37b3c62a1ce1cec9L },
62510       { 0x312caccd8b3391aeL,0x6b22c9447dcbe533L,0xc890d22f4fefd4edL,
62511         0xd1504f7df007a64eL,0x117e4e595845d5bcL,0x999386c7723584e1L } },
62512     /* 59 << 371 */
62513     { { 0x02c396533bdadbd5L,0xc07325fda1fe704aL,0xf78d7e23350aa0c4L,
62514         0x9f09cf22ce50784cL,0xcdea9a6a1a6e8abcL,0x245fba06ee5a5e06L },
62515       { 0xf1fd3b9b4a3d0d7cL,0x24c65a131a4952c4L,0x40ea3ef37236b6f4L,
62516         0x60aa573d8f7addcfL,0xdd5ec47b0305577dL,0xd92dc5035deacea5L } },
62517     /* 60 << 371 */
62518     { { 0xc666f8f3fac2de80L,0xabb2b8aba8fa36a6L,0x1bd0ec8f12202b09L,
62519         0x88b184be6d17a3c5L,0x00d501fc670a77c1L,0xe1f94f1db3de1c7eL },
62520       { 0x953179cd2d6de8caL,0xa8873a5bb9263791L,0xd76433098d7ac5d1L,
62521         0x3d751cab4d2f8224L,0x7417b8262e5458eaL,0xf4eb3c669e454a8cL } },
62522     /* 61 << 371 */
62523     { { 0x65b0d7e9ae3284a2L,0x3d4770bb1e3cbb18L,0x217a0cdb808ea164L,
62524         0x9ed6d0f689810270L,0x62d9cc95f14139e1L,0x4d39eeef6a2c82a0L },
62525       { 0xecf319f40dcf14afL,0x62c95df6ab0fd145L,0xfe85014d22db0105L,
62526         0xc37756e6a652168cL,0x6ba9f6b370a67e9dL,0xe453fd0af18d8058L } },
62527     /* 62 << 371 */
62528     { { 0x265798acfe3bf4f8L,0xc1603abdc1183f63L,0x14e3952f1063e086L,
62529         0xdcb106d2910f0a78L,0x27c2aee2f454f625L,0xf16d83e60f463fe9L },
62530       { 0xaa5547207f5ae172L,0x42ea8fea9a2133eaL,0x9f3b33f6e9253e7eL,
62531         0x6224ef75d67af0afL,0x06f0ddfbb92d6cc9L,0x12e66e32656e9e9aL } },
62532     /* 63 << 371 */
62533     { { 0x1a93be3424ace7f0L,0xb993bcb9a56be2eaL,0x3b054afac33608d7L,
62534         0x36e782c3aea3d7e9L,0x54f1dda950e9b3adL,0x04dd021f55f51bb4L },
62535       { 0x9c76f7c0347bb352L,0x3d9a04ee2f1dc5fbL,0xea5e582ae80e06f0L,
62536         0xe523aab927e1e818L,0xe2f1960252d4904cL,0x1bfa8b03adecc51fL } },
62537     /* 64 << 371 */
62538     { { 0xc84f917203bdf6d6L,0xcfc4718769f60e03L,0xcdc4753ba05068eaL,
62539         0xa177ad14077777efL,0x0b7f54eb7e4cf44aL,0x4ee443f91860144eL },
62540       { 0x1279ed4d42bb6a93L,0x511137d7436c1b54L,0xebc958fab8cdb6ceL,
62541         0xbc4f93f4a0c7614aL,0xc5bd6cde7b2c6d8eL,0xecff7dd78d65f38aL } },
62542     /* 0 << 378 */
62543     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
62544       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
62545     /* 1 << 378 */
62546     { { 0xffec6674f65de0f5L,0x4043079cd23ad193L,0x31811365ee61bc95L,
62547         0x358bbd6e8948b6e2L,0x1cd9c342e31644beL,0xbab3aa8c60a8a7a7L },
62548       { 0xe065519fa375beb6L,0xf7d0b0414439990cL,0x8957c03b8517ae8aL,
62549         0xc96a040173750d6eL,0x4eb2e364b2aee6d7L,0x813054feed099114L } },
62550     /* 2 << 378 */
62551     { { 0xbb39a17a7c34f095L,0x7be330a822fbbe61L,0x6be6abe3b91f1482L,
62552         0xf972804fbd39a2bcL,0x06737e54f91d813eL,0xbd6066681a87cd4aL },
62553       { 0xbf88b2e5f538d56eL,0xb8206a8134afd68fL,0x7a93aedfa58af042L,
62554         0x8853cdf6ac0511b0L,0x9d7f416d067e2c19L,0x5d0bc923f9671d8aL } },
62555     /* 3 << 378 */
62556     { { 0xf3b6fd79dd3532a7L,0xf60262b5dbbb9e4cL,0xbf75bb57da4d6ac4L,
62557         0xf016adf1c094b38cL,0x9114cdd012def474L,0xdc74d638c785f143L },
62558       { 0xdea060d6a8d90bbbL,0x1f141878cbcd0d4cL,0x552685b79ddee1f5L,
62559         0x381dfc0c636ea6b6L,0x8c601615cb08f34fL,0x5b843830271041eeL } },
62560     /* 4 << 378 */
62561     { { 0x2e7d0a16204be028L,0x4f1d082ed0e41851L,0x15f1ddc63eb317f9L,
62562         0xf02750715adf71d7L,0x2ce33c2eee858bc3L,0xa24c76d1da73b71aL },
62563       { 0x9ef6a70a6c70c483L,0xefcf170505cf9612L,0x9f5bf5a67502de64L,
62564         0xd11122a1a4701973L,0x82cfaac2a2ea7b24L,0x6cad67cc0a4582e1L } },
62565     /* 5 << 378 */
62566     { { 0x139d9fef6bfc08e4L,0x4399615939ffcb3bL,0xaa299008a84ace07L,
62567         0xfce43e873cbb2b3fL,0x07b3e8b9191a320eL,0x3ec851d706c4d485L },
62568       { 0x03d8a672a4bb8477L,0xb6a5dcb213c31d5cL,0x58b79d01c439ab23L,
62569         0xdd6f8b5134f66137L,0xccb178a0b29be48cL,0x4c71b7aa4df8a1b2L } },
62570     /* 6 << 378 */
62571     { { 0x92bf8c4508359896L,0x77253434ae2c30f2L,0xf05086ec827e6cf8L,
62572         0x46d4729f1771c5d3L,0x92587306f37f0bedL,0xb82c99d2e7c30180L },
62573       { 0xee0141dcb1684841L,0x7fa984be994ddaf5L,0x5c583347165c238cL,
62574         0x1a1ad3eea5d78204L,0xcfed795f2736bce6L,0xa7a413318961204eL } },
62575     /* 7 << 378 */
62576     { { 0x87451ca71400851dL,0x3aace28e3573ecf6L,0x3a5902cee85717c5L,
62577         0xe4b51dd0c9f57944L,0x33cf684789a9d8aeL,0x2f6fb08031e6e769L },
62578       { 0x4bf3da323b78dad1L,0x2d73fef4e7809638L,0x84d76151965109abL,
62579         0xa2c932c9a2098f46L,0xb8c457c3bc17d1fcL,0x5ef2562d0c8012a4L } },
62580     /* 8 << 378 */
62581     { { 0x96a1e74f51e4de5eL,0x72913696e37f5006L,0x12449c4fbe35109cL,
62582         0x1fad8b304521d7e6L,0xc85eb23d57d00293L,0x4ebd334b35f68229L },
62583       { 0x7c5b86682df5acf1L,0xc2b4da6e5463de2eL,0x067b0456757cd570L,
62584         0xeaab81be3a1c866bL,0x72a6af75bbba88c0L,0xaed4dbde0ef567dcL } },
62585     /* 9 << 378 */
62586     { { 0x085e33cd9273818aL,0x8fb9294a8cf4e306L,0xaed46bbc35052bd1L,
62587         0x031febb3374661eaL,0x9386a35d4868dbb2L,0x381e5b521d3f2dddL },
62588       { 0xa938a3a5179617edL,0xb0fc99f49dc95af1L,0xf446dfa92b9dacbcL,
62589         0xbae262ae490c1969L,0x042707ffa7443354L,0x8dc0511f267d5c14L } },
62590     /* 10 << 378 */
62591     { { 0x8f0e1908fac2674dL,0xd86e85a483e43c26L,0x1f719f7036fb5a4eL,
62592         0x7ad61b8ca57dbcbcL,0xcf6ba7db0f63dc79L,0xb4315ab11afe8540L },
62593       { 0x0448e852425c4df3L,0xf51969ef8838a51dL,0xce98589b9eab87deL,
62594         0x55867b5645149689L,0x9b70bc8c60d2a624L,0xc158a2710b6dbd45L } },
62595     /* 11 << 378 */
62596     { { 0x0b262f808f1915f2L,0x64ba3bc73d501e01L,0x8ce2db1f4645152cL,
62597         0xf4a4f3afab047cdbL,0x1a7c4af600d31e7fL,0x0005bca678d1c0ecL },
62598       { 0xf5ed135f6fe5ebb0L,0xa299b1002ea9abdfL,0x4fa387e5fccb58f5L,
62599         0x105b9dd2fc657b72L,0x1494c6050dc3c22cL,0xf7468e8a92d281c7L } },
62600     /* 12 << 378 */
62601     { { 0x597a26ffb4dc8600L,0x264a09f3f9288555L,0x0b06aff65c27f5f6L,
62602         0xce5ab665d8d544e6L,0x92f031be99275c32L,0xaf51c5bbf42e0e7cL },
62603       { 0x5bb28b061e37b36dL,0x583fba6a8473543aL,0xe73fd299f93fb7dcL,
62604         0xfcd999a86e2ccad9L,0xb8c8a6df334d4f57L,0x5adb28dd9a2acc9bL } },
62605     /* 13 << 378 */
62606     { { 0xc760823646dd14f3L,0xc6d97d37e7a97f33L,0x05037f26de2f444aL,
62607         0x5267ded09aa9a5c0L,0xd1ef46340be2d841L,0x308b37a8d48b9574L },
62608       { 0x102f7878487bad5bL,0x1d5169d938b7c1efL,0x2d8adde62c39c75aL,
62609         0x71bfb8bc0b80f3bbL,0x126505999bff252fL,0xf99e952f24f8bd3bL } },
62610     /* 14 << 378 */
62611     { { 0x24496a8b7a8a6d47L,0x9fc75c0aec6afe43L,0x4200e00670744f15L,
62612         0xe2f87d5e2973be1dL,0x0f6c5993c82e2013L,0xe9ecf6ce198c99f0L },
62613       { 0xcbdf72058b37d828L,0xbef4b8c8325d1d93L,0x8e962ffbd0fbb134L,
62614         0xe4273a124bcffc61L,0x4f24ba23f3d93d73L,0x8f02df83bcfcb930L } },
62615     /* 15 << 378 */
62616     { { 0x985c8f4b0614348aL,0xca4ca7cd5a03c014L,0x5bdd4382a7b62effL,
62617         0x623d44b9e4a0bb42L,0x1f28862ef23931d5L,0x30568303868326beL },
62618       { 0x850d2a0d82e76f04L,0xf4dc02330ac4a153L,0x62b74879b1e70a9aL,
62619         0x7b32249baf3f0dbbL,0x2f50395d155eae92L,0x6d990c16f6f5c9a4L } },
62620     /* 16 << 378 */
62621     { { 0x3afdee277d221ab6L,0xecf10abc47bb619eL,0x340c8ee3ba4a3301L,
62622         0x1a6ea51a2a883b7fL,0x64f27976d5d7412bL,0x7fcf0ecc91251b6eL },
62623       { 0x5f3f8f41365b18b7L,0x38e48b96e2e13e58L,0xde3b73d6ad61b2cbL,
62624         0xf08398d5d542676dL,0xd373931e8e7d712bL,0x89325d7a7f96e023L } },
62625     /* 17 << 378 */
62626     { { 0xeb2e48c10bf4e94dL,0x00614bf206b7e166L,0x536c999ce295c451L,
62627         0x951f92186359cf06L,0xe2a938890afc827fL,0x63102e93ff029787L },
62628       { 0xab297c7d2ac89645L,0x7354df74928742bfL,0xc0934ca6c8604304L,
62629         0x36b7e9711cc2f3b4L,0x487ce890e10ee837L,0xe6aa9eabae2ae9e3L } },
62630     /* 18 << 378 */
62631     { { 0x6e7a578340517347L,0x7db868f3a950dfa2L,0x7fd7fd8eb3c2eff7L,
62632         0xae7b59c5fbe10a47L,0x5239b5c4109797d6L,0x3838356a53264b8aL },
62633       { 0x8df8454c320a8c5aL,0x67c86ef46958fa2cL,0xfe1aad846241a50aL,
62634         0x3df64ef5a06f3cf3L,0xde6af0ff83282fbdL,0x25ca45046cdbe5feL } },
62635     /* 19 << 378 */
62636     { { 0xa319340d6e6c0debL,0x101f055acb1b1cd5L,0x4bea31ad623e7e55L,
62637         0xc0c88af6aec23cd2L,0xca98c4364aaf2f73L,0x1969eca437dd1341L },
62638       { 0x6b03989f97866dc3L,0xafdc99532eaf5b08L,0x199ec0e93d6ea9c4L,
62639         0xc3d1069474f262e9L,0xa7e5670079911cf9L,0xc0213ec56844da05L } },
62640     /* 20 << 378 */
62641     { { 0x5adf3d9a111792b9L,0x1c77a3054f1e0d09L,0xf9fbce33a82d3736L,
62642         0xf307823e718c8aa3L,0x860578cf416ccf69L,0xb942add81ef8465bL },
62643       { 0x9ee0cf97cd9472e1L,0xe6792eefb01528a8L,0xf99b9a8dc09da90bL,
62644         0x1f521c2dcbf3ccb8L,0x6bf6694891a62632L,0xcc7a9ceb854fe9daL } },
62645     /* 21 << 378 */
62646     { { 0xfc9660a3c8808373L,0x84c5d6a71a50c560L,0x13fe0588ba057fe2L,
62647         0x29b0341dafb73ad1L,0x37b11137f15f0cd2L,0x84422ba89c2d7eb0L },
62648       { 0x0b595ac52554ef7fL,0xd7a8303f08b37a84L,0x908895a9e02d77fcL,
62649         0x70cdeb0c9f242a42L,0x535e8540116e2db8L,0xc88f0cf685c54d31L } },
62650     /* 22 << 378 */
62651     { { 0xf534f145e2290ebaL,0x3d081c0d7f15c9e3L,0x716574c5e9ae3da0L,
62652         0xbe6bd7b92c078aa8L,0xab8802bab8da8e68L,0x0c5be4a1ab204fb0L },
62653       { 0xad25c5ee0d3f12b3L,0x3929d0d78fc9b7a5L,0x9c6e2ce0bb5cd2fdL,
62654         0x855367c4924ec2d2L,0x6b532891e6550d3cL,0xab2bc89575ba5c99L } },
62655     /* 23 << 378 */
62656     { { 0xb56b035e2a0349adL,0xcfa41da6f89ce836L,0x9d86bcac8b5c43fcL,
62657         0xc77375da47644b07L,0x9e9c222607f4b670L,0x71d663c80482a61bL },
62658       { 0xb423e739ef237431L,0xf1cedf7e48832b5bL,0x09e0cb2a7ca7548bL,
62659         0x9b463559631b9850L,0x8a2bd7fed4dd03deL,0x46115292ae0c97d3L } },
62660     /* 24 << 378 */
62661     { { 0xe44e3f864b3759cfL,0x90cab0eb9d74e3f6L,0x1004254501c4e171L,
62662         0xc12df68cce52defbL,0xb1fae2fbf363100aL,0x5016c8533573235fL },
62663       { 0x8d4deb661d922e9bL,0x8a20d42317f84ef2L,0x324985835a4e118eL,
62664         0x5abfa961308772e9L,0x41c7611ff54e4876L,0xc1da40d31f5867b2L } },
62665     /* 25 << 378 */
62666     { { 0x4df02a7d3088aebcL,0x7dea27ea12487485L,0x2a773270df98069eL,
62667         0xea435fa0e9ceaf44L,0x08e952e365e5ebabL,0x972877d5c3511480L },
62668       { 0xef5685f859a04cd0L,0xe50abe68b8c7c796L,0xbbb792e2c3225f20L,
62669         0x7d9878e811c89153L,0x4b72a1e619354751L,0x7d5f05a3faa1be22L } },
62670     /* 26 << 378 */
62671     { { 0x61dd7692f27eed54L,0x8540213ea7a3f2f7L,0xe659cbd6ace07e13L,
62672         0x3a998cdcc8995cacL,0x0accb4a7922d3b25L,0x762b3406c6577d81L },
62673       { 0xa09db4f57e043740L,0x7f78e02d8cc9bc5fL,0x080a522673b98cd3L,
62674         0xb6d72f7ce6490808L,0x36815de2c724284aL,0xc27d13df98b867b5L } },
62675     /* 27 << 378 */
62676     { { 0xbfeffd5356adb6e4L,0xb5e8876c499a1455L,0x4771281390833f18L,
62677         0x5f49ef880115b9a5L,0xb041ec67cf575de5L,0x490753350b7e4afcL },
62678       { 0xad4dc4a15f0b9f24L,0x9dbb181edafad9a5L,0xa84431a6e6ed5198L,
62679         0x33ee16e27993eed6L,0xfdf76899c1e4f8b4L,0x868d06baff60e943L } },
62680     /* 28 << 378 */
62681     { { 0x46303171491ccb92L,0xa80a8c0d2771235bL,0xd8e497fff172c7cfL,
62682         0x7f7009d735b193cfL,0x6b9fd3f7f19df4bcL,0xada548c3b46f1e37L },
62683       { 0x87c6eaa9c7a20270L,0xef2245d6ae78ef99L,0x2a121042539eab95L,
62684         0x29a6d5d779b8f5ccL,0x33803a10b77840dcL,0xfedd3a7011a6a30fL } },
62685     /* 29 << 378 */
62686     { { 0x5d782a0778664144L,0xc1413da46682c779L,0x937a15f52a67b12bL,
62687         0x8ec00d9fc04d8cd5L,0x3f16d1ed3b5fe8d6L,0x24ad6b0ca28c8067L },
62688       { 0xdd1eecc532732b19L,0x62c4c2beab2fa785L,0x7d863f5b2ac0c238L,
62689         0xd686eb7239384e15L,0x3770e54d16bd75b2L,0xdcd9e4e8120b3881L } },
62690     /* 30 << 378 */
62691     { { 0xe3052838df5147e1L,0x87bc4d75b1baaa7cL,0x49b13eb95acc5572L,
62692         0x919081881990c13cL,0x5d43a4a6191cc808L,0x20b358444182aa55L },
62693       { 0x70d49a4a670b1fd1L,0xc6e6e061722e91e7L,0x8d130b3900c5ae9eL,
62694         0x5db7d06920f68ec5L,0x85b6c505470fbe13L,0x14101ec7326c4d38L } },
62695     /* 31 << 378 */
62696     { { 0xeef03450e10e8018L,0x75921e487576c3ddL,0x6c8e22676e97f5afL,
62697         0xd7323e01a856ae6bL,0x43a195425fed884fL,0x010865380377ba8fL },
62698       { 0x7cdbd06ac82a8f67L,0xc6fce58bf0fd4281L,0xae098b7f9e67bed0L,
62699         0x0c8d328bdd918524L,0xddf723ec0a11fb83L,0x210d6016e25a2073L } },
62700     /* 32 << 378 */
62701     { { 0x3c90a59f85adde98L,0x35414174e5269140L,0x9aca885c1a0d58e2L,
62702         0x77b9b6dd6816b009L,0x8e5c12139ee4718fL,0x60ad991e4e4eac45L },
62703       { 0xc00c35694d71f624L,0xacbf4eb25bc5fd2aL,0xcba1ffc75eaf3eaaL,
62704         0x5f99092d42a87e32L,0x2e7b49c76f7a882fL,0x5e9bfc5c29040512L } },
62705     /* 33 << 378 */
62706     { { 0xa31d3524b295958dL,0x9713a5e04894f486L,0xe8804ab3329a0b9aL,
62707         0xd4447c1b20eefa54L,0xf5b944c9040b7ad4L,0x9db0ee0b907f2cfdL },
62708       { 0x0b1a1f3a5384a999L,0x3137241ea8351764L,0xe0663b5ab29c3cffL,
62709         0x2b47ca0622d4deefL,0x4f952109f1172bcdL,0x1e7a7fca9b447bd4L } },
62710     /* 34 << 378 */
62711     { { 0xc9898355ecf2a473L,0x20d0c4740dcd66f6L,0x6459720f8eeefff5L,
62712         0xd9b625dcf9ce0cdeL,0xed3a6508ea56be90L,0x6847c20de211c90eL },
62713       { 0x36d86bed71a73ceeL,0x9222eab23023d16eL,0x3155874750209b4dL,
62714         0xcac8f277d145b831L,0x49cedc634470e754L,0x6c7c065add370f77L } },
62715     /* 35 << 378 */
62716     { { 0x46a95735f8171804L,0x1ff2549ec4c93476L,0xfb8a08285bb5202dL,
62717         0xaff5505f1070737aL,0x162aaad842f412c5L,0x02a37213fac8a477L },
62718       { 0x05ff9238932f08e2L,0x9be6a0b29fc66787L,0x373a9039db1e5a40L,
62719         0xe657e8c782d04913L,0xa2006f207e6ee867L,0xd7aa1d2378d82f9aL } },
62720     /* 36 << 378 */
62721     { { 0xfa070e22142403d1L,0x68ff316015c6f7f5L,0xe09f04e6223a0ce8L,
62722         0x22bbd01853e14183L,0x35d9fafccf45b75bL,0x3a34819d7eceec88L },
62723       { 0xd9cf7568d33262d2L,0x431036d5841d1505L,0x0c8005659eb2a79aL,
62724         0x8e77d9f05f7edc6aL,0x19e12d0565e800aaL,0x335c8d36b7784e7cL } },
62725     /* 37 << 378 */
62726     { { 0xdcac39d87c1d9f4dL,0x88322d8bc225ce6eL,0x5c240cefa3ef5202L,
62727         0xf60ce5d991f1d487L,0x8e857069e462cfa8L,0xa6e5585e996d2033L },
62728       { 0x709675a556281e6aL,0xcd90c140f907ebf0L,0x5343a0a2a3231eecL,
62729         0x74b1443214892291L,0xf8cb9c26a5325b8cL,0x1bb28be140089be5L } },
62730     /* 38 << 378 */
62731     { { 0x2bb6e7ec3092d0b2L,0xc7c9e5f1d27d1f31L,0xbac785aeac0939e3L,
62732         0x186d3d934f810d8fL,0xda296dacfe7d778fL,0x6189f5e41a991ea2L },
62733       { 0x098f794e9634363eL,0x04aaf59a88a4dccaL,0x09d718487196dfa8L,
62734         0xa447a31ed83044a6L,0x720cd3908d1363fdL,0x6f670479e22efa03L } },
62735     /* 39 << 378 */
62736     { { 0xaa452e81cdf60f9aL,0xf3dc472a8e2c58e9L,0x16ddefa50589fd01L,
62737         0xd56ec8f223a1656eL,0xcccb784f77921ca4L,0x9bace7adf8a7c0baL },
62738       { 0xc94ef3ef51f052e2L,0xa70c0579c34e7cb5L,0x3599817883ce8674L,
62739         0x033647c392a20951L,0xc828fcc77a21add6L,0x5a446de871ba27a5L } },
62740     /* 40 << 378 */
62741     { { 0x75cba9d530a3ada1L,0xb69e308bf8ae9565L,0x990e3425ca7b8369L,
62742         0x9f67567fe0a7ad0bL,0x76ed6fe718bd01b7L,0x282358aa2ff95cfeL },
62743       { 0x28d2ea41410f8841L,0x89d1533fccd67c81L,0x969bb272b6a7b8f9L,
62744         0x54f8664c26330782L,0xb89f3ae81dcd9164L,0x54d845b93d962c14L } },
62745     /* 41 << 378 */
62746     { { 0x08ba5b61fde4ca03L,0x39b1a9c697b17ee6L,0x885253779336b2b9L,
62747         0xe964dc9c9aabc3fcL,0x6aed101a5295e728L,0x30369ea0ee12356aL },
62748       { 0xe081e022c8e80e5eL,0x3a769ef0df9f47c0L,0x3b2f7aab5590750cL,
62749         0xd16c7a85a1a5e504L,0x9e528623e854d7cfL,0xaca079354468e419L } },
62750     /* 42 << 378 */
62751     { { 0xee521c0af93098bfL,0xf517c925b79aa0ebL,0x17779f5e7bbc58feL,
62752         0x093c3dc2769de891L,0xafbf32372a69ad0dL,0x33a95de702001e8cL },
62753       { 0x3b30afc73410a2b0L,0xb379a3f425bc7d9aL,0xf1c069251604a646L,
62754         0x04f0bb334fca052fL,0xe5cd9c39cab33871L,0xf259795816fa1b16L } },
62755     /* 43 << 378 */
62756     { { 0x291d65c801189d9aL,0xb16ca18bd8e94e49L,0x55f7680599440d4bL,
62757         0x55d40c1b2eb7f0fdL,0x752d98f6018d7c64L,0xa1cae78c7b491c4dL },
62758       { 0x898fc8c78f66b8d3L,0xbb48956a3ceecd27L,0xb8f9498dfaa9451fL,
62759         0x583b336aa5683ef8L,0x0deaa373e92656f4L,0x7f87b4412a9a0272L } },
62760     /* 44 << 378 */
62761     { { 0x8b2fc4e96484fd40L,0xee702764a35d24eaL,0x15b28ac7b871c3f3L,
62762         0x805b4048e097047fL,0xd6f1b8df647cad2fL,0xf1d5b458dc7dd67fL },
62763       { 0x324c529c25148803L,0xf6185ebe21274fafL,0xaf14751e95148b55L,
62764         0x283ed89d28f284f4L,0x93ad20e74cbebf1aL,0x5f6ec65d882935e1L } },
62765     /* 45 << 378 */
62766     { { 0x4b0c7d0c69c284cbL,0x907e4f38199c5176L,0x4ebfbda7cf3dab12L,
62767         0x675f12cca4fa74a9L,0x86628102bdf579e6L,0xf08cbfe771c4d061L },
62768       { 0x9dde390e03bc1cb9L,0xb6d0d48b4c727915L,0x7cad28c370c0b7bfL,
62769         0x8d978a8110d1e881L,0x1c071597924baeb1L,0x83c09192eb103fe0L } },
62770     /* 46 << 378 */
62771     { { 0x494dbd2665925506L,0xe239b1d404b6fc45L,0x38a1ec5ce16b874dL,
62772         0x1588c4712a3f012dL,0x5bd45adcdc6938b9L,0xe4c35c2244ab2fccL },
62773       { 0x87cbd9ff887108a2L,0x92a9c3b2144fd3eeL,0x3a0e55c7982a4928L,
62774         0xcaf679765bb0fddfL,0x04616318263ea256L,0x56eb022838caa901L } },
62775     /* 47 << 378 */
62776     { { 0x2f7de141a48da000L,0x323bd638835a4edfL,0xd2d9da967e155bd5L,
62777         0x717c302a766b69daL,0x5927968beb0f6ca5L,0xfd96bd168940c766L },
62778       { 0xf89f7539a334fd71L,0x4ba9cd8bd870954fL,0x7e639523a3d57aa8L,
62779         0x88f31e162314c0ceL,0xa836a6ad53b7e6e9L,0xd35a825190e43169L } },
62780     /* 48 << 378 */
62781     { { 0xb3984b176c0f3509L,0xf9fa4483d8b4d6bcL,0xf4ac2b677dec20d2L,
62782         0x67ef024eb3dbe034L,0x2dcc51180f94f4d7L,0x024cdcfd74a51393L },
62783       { 0xf1c0fead20e7abcbL,0xffc18f81d3a7414fL,0xb00ce5567062cb0bL,
62784         0xeccb0521817bc8d1L,0xa0c0fe6040411c15L,0x053113221defbe00L } },
62785     /* 49 << 378 */
62786     { { 0x74faca8a6af7e742L,0x6f206002d878a97aL,0xd69b7c83177305ffL,
62787         0x605e7a32d2e2bcf1L,0x65bd03584590bf03L,0xab3ae700d1a378c5L },
62788       { 0x037e79028a929b0dL,0x83625ae0a7c451c6L,0x82a18f03492b01d4L,
62789         0x12c6d168e67756b1L,0x1e704c3bd7924df1L,0x7708617f1989244eL } },
62790     /* 50 << 378 */
62791     { { 0x4c98c61d097bde48L,0x6a55edf1c354f433L,0x1ceee947c3f39212L,
62792         0x162cf27f36ba3cebL,0xd9f3982e3ec5f7ffL,0xd363e435d58d42d2L },
62793       { 0x2ee90d7bad36681dL,0xd916df56ebfbf51cL,0x61d94ed8d7c27fe7L,
62794         0x5010582e923c1acdL,0x89d23e8b6de52994L,0x0a4f9c10525dbccfL } },
62795     /* 51 << 378 */
62796     { { 0x7778fad7e65573e2L,0xa4af7a2d74986210L,0xd78ecebfec57d967L,
62797         0x9be8a33f67d61b2eL,0x6888444f98a9add7L,0x218e7fb1b71a25a4L },
62798       { 0xf75a6b795f46323bL,0x2f8610ad11a52cd9L,0x23692f85fc6837caL,
62799         0x3a37965f71fe847bL,0x29c25cc3fe3bdeeeL,0x68fefc83f624665aL } },
62800     /* 52 << 378 */
62801     { { 0xe222eba4a4dcefe9L,0x63ad235fec1ceb74L,0x2e0bf749e05b18e7L,
62802         0x547bd050b48bdd87L,0x0490c970f5aa2fc4L,0xced5e4cf2b431390L },
62803       { 0x07d8270451d2898eL,0x44b72442083b57d4L,0xa4ada2305037fce8L,
62804         0x55f7905e50510da6L,0xd8ee724f8d890a98L,0x925a8e7c11b85640L } },
62805     /* 53 << 378 */
62806     { { 0x8357d8bb460e77b2L,0xc749a6a77709a52bL,0x94035a1f0c82ab81L,
62807         0x15245ac616c11ef4L,0xbf3cd96c034d021bL,0xf79e2d39b2e8fac1L },
62808       { 0x387015194b6cf1bdL,0x341f9b53b3143bf7L,0xb2584aabdda9acf2L,
62809         0x16f34bdd553a8e68L,0x89d0c4c5da7830b3L,0x6cfe44c63f488c2eL } },
62810     /* 54 << 378 */
62811     { { 0xee536a26d4bcaa59L,0x5ea6a57c699397bfL,0xb28f476b59a7eb99L,
62812         0xa901f2551406ec90L,0x7b6e3e4d1f54ef38L,0x058ff1904c89c9a8L },
62813       { 0x5690fa10fca546ccL,0xfe98793145e14268L,0x6181fa1675362f5dL,
62814         0x3ebe84466964b9aeL,0x3e1957812ce0f969L,0xb33ea619b0195852L } },
62815     /* 55 << 378 */
62816     { { 0xeef402410ec537acL,0x1f72c1f8911316f6L,0xab4bb08268cc6678L,
62817         0x031fc087255e8c5eL,0x99c2ff0b948ac53bL,0x13db3201919c1870L },
62818       { 0xdec81fd312057a3cL,0xbdffa226ff7a44cbL,0x748d2e93d97167e2L,
62819         0x33a9fe40bd21effeL,0xe08e4213817ea560L,0x2221798b9f4337d5L } },
62820     /* 56 << 378 */
62821     { { 0xda828fe556467257L,0x5e9abf67d640c2a1L,0x0eed233cc25c696aL,
62822         0x72483dc5b3e1d84fL,0x30bf1ee34f114abcL,0xf58b321ed1f9bce8L },
62823       { 0xcb26564c97524f33L,0xdc2f105e1e453229L,0x9da43ceb72a982ddL,
62824         0xecf5649dfeef8862L,0xd8afda341fa2f06dL,0xf0d0ced355035432L } },
62825     /* 57 << 378 */
62826     { { 0xec22bb32205a5301L,0xe4d168e75b0b727bL,0x91217a6be34fe2e0L,
62827         0x03c6831675f0f139L,0xb21e275d8b991b29L,0x7f517c9c01f3f401L },
62828       { 0xbbe95d19e55e49faL,0xc5470808504514b1L,0xb88be15c7cc1367dL,
62829         0x242cb06bbfd24bacL,0x08647a158d2ab0baL,0x8f1fd1bd5716ed9bL } },
62830     /* 58 << 378 */
62831     { { 0xe787054518ba5236L,0x243622f9e8a47507L,0xe7d94f4697b97d7cL,
62832         0xb120589021649255L,0x8b5101310dd4e1d4L,0x1690687e164c44baL },
62833       { 0x65bb4d8cf100fef5L,0xfffffee70a684c3dL,0x2aa11707c463a975L,
62834         0xccaddeaf391ad03dL,0x4d2cda1c81cca7deL,0x9d3eaa58c5b0f8e7L } },
62835     /* 59 << 378 */
62836     { { 0x3d92ecc18f8802dfL,0x3024ce311a719461L,0x6bdf53fc46c1f31bL,
62837         0x4f4576a12c9c7744L,0xe1ee7508c3ff7356L,0xd4b25ed3883ebf03L },
62838       { 0x1dc46052420c3ac9L,0x376ebbfa11ecefa9L,0x36e175265e9693f5L,
62839         0xeb82b33740ed3143L,0x6960312ff19fa66aL,0xc7edb5db6c742e1bL } },
62840     /* 60 << 378 */
62841     { { 0x5bfa10cd1ca459edL,0x593f085a6dcf56bfL,0xe6f0ad9bc0579c3eL,
62842         0xc11c95a22527c1adL,0x7cfa71e1cf1cb8b3L,0xedcff8331d6dc79dL },
62843       { 0x581c4bbe432521c9L,0xbf620096144e11a0L,0x54c38b71be3a107bL,
62844         0xed555e37e2606ec0L,0x3fb148b8d721d034L,0x79d53dad0091bc90L } },
62845     /* 61 << 378 */
62846     { { 0x4b98cb69c5c8a182L,0x887071bbcac96dabL,0x03d42e96afc190c3L,
62847         0xbc2c3b8d7a813820L,0x1ee7797f6590d0ecL,0x4a95f7f3ad4777a4L },
62848       { 0x7a36de4e2a8d2736L,0x7f8c6751ad78dab6L,0xf9874bf6974c0a8eL,
62849         0x759fee1c8b53025aL,0x1b00fb28a2171c8bL,0xdf206f19be8f2e7eL } },
62850     /* 62 << 378 */
62851     { { 0xe6bbcf0bf8ed6302L,0x7734dc91f8fe7a42L,0x840210ee61ff9d1eL,
62852         0xbbf2d5477007f2e9L,0x0f17d421a6542ac0L,0x0b2d3d2ee01df4e9L },
62853       { 0x520e4fbb84f3703fL,0x8362f7b1431106b7L,0xdcfc96ae6e50d836L,
62854         0x2dfa176cc44153bbL,0xeef1c6710b09ffe2L,0x633a2ac888531d81L } },
62855     /* 63 << 378 */
62856     { { 0x29262b6d7636a78dL,0xdc504f01d3ce2967L,0xa441e5035bcf0e19L,
62857         0x8025224f7ad39d9aL,0x780ec65de871b792L,0x977b4bce597694b4L },
62858       { 0xe05eaeb87fe3ef11L,0x1cff87ac9748b10eL,0xb669c1d60c34153aL,
62859         0xf5da63e0f8f90368L,0x6f7f2fc47d31bf61L,0x37e9158235c16a0fL } },
62860     /* 64 << 378 */
62861     { { 0xcf17f9dc08d1be5dL,0xb55de4c8afdfeb23L,0xa69454ffe437b29cL,
62862         0x6628d789e27ee9e2L,0x56e3b975ee3af03bL,0x0083fe9c2f532d62L },
62863       { 0xcae15213e63e7511L,0xdb5384f386ed849cL,0x902ba959fa4d825fL,
62864         0xbad700d55ae17566L,0x16b2c5dc14c82eb4L,0xa4b057a736708ea7L } },
62865 };
62866 
62867 /* Multiply the point by the scalar and return the result.
62868  * If map is true then convert result to affine coordinates.
62869  *
62870  * Pre-computed table containing multiples of g times powers of 2.
62871  * Width between powers is 7 bits.
62872  * Accumulate into the result.
62873  *
62874  * r      Resulting point.
62875  * g      Point to scalar multiply.
62876  * k      Scalar to multiply by.
62877  * table  Pre-computed table of points.
62878  * map    Indicates whether to convert result to affine.
62879  * ct     Constant time required.
62880  * heap   Heap to use for allocation.
62881  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
62882  */
sp_384_ecc_mulmod_add_only_6(sp_point_384 * r,const sp_point_384 * g,const sp_table_entry_384 * table,const sp_digit * k,int map,int ct,void * heap)62883 static int sp_384_ecc_mulmod_add_only_6(sp_point_384* r, const sp_point_384* g,
62884         const sp_table_entry_384* table, const sp_digit* k, int map,
62885         int ct, void* heap)
62886 {
62887 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
62888     sp_point_384* rt = NULL;
62889     sp_digit* tmp = NULL;
62890 #else
62891     sp_point_384 rt[2];
62892     sp_digit tmp[2 * 6 * 6];
62893 #endif
62894     sp_point_384* p = NULL;
62895     sp_digit* negy = NULL;
62896     int i;
62897     ecc_recode_384 v[55];
62898     int err = MP_OKAY;
62899 
62900     (void)g;
62901     (void)ct;
62902     (void)heap;
62903 
62904 
62905 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
62906     rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
62907                                      DYNAMIC_TYPE_ECC);
62908     if (rt == NULL)
62909         err = MEMORY_E;
62910     if (err == MP_OKAY) {
62911         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 6 * 6, heap,
62912                                  DYNAMIC_TYPE_ECC);
62913         if (tmp == NULL)
62914             err = MEMORY_E;
62915     }
62916 #endif
62917 
62918     if (err == MP_OKAY) {
62919         negy = tmp;
62920         p = rt + 1;
62921     }
62922 
62923     if (err == MP_OKAY) {
62924         sp_384_ecc_recode_7_6(k, v);
62925 
62926         XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
62927         XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
62928 
62929         i = 54;
62930     #ifndef WC_NO_CACHE_RESISTANT
62931         if (ct) {
62932             sp_384_get_entry_65_6(rt, &table[i * 65], v[i].i);
62933         }
62934         else
62935     #endif
62936         {
62937             XMEMCPY(rt->x, table[i * 65 + v[i].i].x, sizeof(table->x));
62938             XMEMCPY(rt->y, table[i * 65 + v[i].i].y, sizeof(table->y));
62939         }
62940         rt->infinity = !v[i].i;
62941         for (--i; i>=0; i--) {
62942         #ifndef WC_NO_CACHE_RESISTANT
62943             if (ct) {
62944                 sp_384_get_entry_65_6(p, &table[i * 65], v[i].i);
62945             }
62946             else
62947         #endif
62948             {
62949                 XMEMCPY(p->x, table[i * 65 + v[i].i].x, sizeof(table->x));
62950                 XMEMCPY(p->y, table[i * 65 + v[i].i].y, sizeof(table->y));
62951             }
62952             p->infinity = !v[i].i;
62953             sp_384_sub_6(negy, p384_mod, p->y);
62954             sp_384_norm_6(negy);
62955             sp_384_cond_copy_6(p->y, negy, 0 - v[i].neg);
62956             sp_384_proj_point_add_qz1_6(rt, rt, p, tmp);
62957         }
62958         if (map != 0) {
62959             sp_384_map_6(r, rt, tmp);
62960         }
62961         else {
62962             XMEMCPY(r, rt, sizeof(sp_point_384));
62963         }
62964     }
62965 
62966 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
62967     if (tmp != NULL)
62968 #endif
62969     {
62970         ForceZero(tmp, sizeof(sp_digit) * 2 * 6 * 6);
62971     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
62972         XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
62973     #endif
62974     }
62975 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
62976     if (rt != NULL)
62977         XFREE(rt, heap, DYNAMIC_TYPE_ECC);
62978 #endif
62979 
62980     return MP_OKAY;
62981 }
62982 
62983 /* Multiply the base point of P384 by the scalar and return the result.
62984  * If map is true then convert result to affine coordinates.
62985  *
62986  * r     Resulting point.
62987  * k     Scalar to multiply by.
62988  * map   Indicates whether to convert result to affine.
62989  * ct    Constant time required.
62990  * heap  Heap to use for allocation.
62991  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
62992  */
sp_384_ecc_mulmod_base_6(sp_point_384 * r,const sp_digit * k,int map,int ct,void * heap)62993 static int sp_384_ecc_mulmod_base_6(sp_point_384* r, const sp_digit* k,
62994         int map, int ct, void* heap)
62995 {
62996     return sp_384_ecc_mulmod_add_only_6(r, NULL, p384_table,
62997                                       k, map, ct, heap);
62998 }
62999 
63000 #endif /* WOLFSSL_SP_SMALL */
63001 /* Multiply the base point of P384 by the scalar and return the result.
63002  * If map is true then convert result to affine coordinates.
63003  *
63004  * km    Scalar to multiply by.
63005  * r     Resulting point.
63006  * map   Indicates whether to convert result to affine.
63007  * heap  Heap to use for allocation.
63008  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
63009  */
sp_ecc_mulmod_base_384(const mp_int * km,ecc_point * r,int map,void * heap)63010 int sp_ecc_mulmod_base_384(const mp_int* km, ecc_point* r, int map, void* heap)
63011 {
63012 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63013     sp_point_384* point = NULL;
63014     sp_digit* k = NULL;
63015 #else
63016     sp_point_384  point[1];
63017     sp_digit k[6];
63018 #endif
63019     int err = MP_OKAY;
63020 
63021 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63022     point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
63023                                          DYNAMIC_TYPE_ECC);
63024     if (point == NULL)
63025         err = MEMORY_E;
63026     if (err == MP_OKAY) {
63027         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6, heap,
63028                                DYNAMIC_TYPE_ECC);
63029         if (k == NULL)
63030             err = MEMORY_E;
63031     }
63032 #endif
63033 
63034     if (err == MP_OKAY) {
63035         sp_384_from_mp(k, 6, km);
63036 
63037             err = sp_384_ecc_mulmod_base_6(point, k, map, 1, heap);
63038     }
63039     if (err == MP_OKAY) {
63040         err = sp_384_point_to_ecc_point_6(point, r);
63041     }
63042 
63043 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63044     if (k != NULL)
63045         XFREE(k, heap, DYNAMIC_TYPE_ECC);
63046     if (point != NULL)
63047         XFREE(point, heap, DYNAMIC_TYPE_ECC);
63048 #endif
63049 
63050     return err;
63051 }
63052 
63053 /* Multiply the base point of P384 by the scalar, add point a and return
63054  * the result. If map is true then convert result to affine coordinates.
63055  *
63056  * km      Scalar to multiply by.
63057  * am      Point to add to scalar mulitply result.
63058  * inMont  Point to add is in montgomery form.
63059  * r       Resulting point.
63060  * map     Indicates whether to convert result to affine.
63061  * heap    Heap to use for allocation.
63062  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
63063  */
sp_ecc_mulmod_base_add_384(const mp_int * km,const ecc_point * am,int inMont,ecc_point * r,int map,void * heap)63064 int sp_ecc_mulmod_base_add_384(const mp_int* km, const ecc_point* am,
63065         int inMont, ecc_point* r, int map, void* heap)
63066 {
63067 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63068     sp_point_384* point = NULL;
63069     sp_digit* k = NULL;
63070 #else
63071     sp_point_384 point[2];
63072     sp_digit k[6 + 6 * 2 * 6];
63073 #endif
63074     sp_point_384* addP = NULL;
63075     sp_digit* tmp = NULL;
63076     int err = MP_OKAY;
63077 
63078 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63079     point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
63080                                          DYNAMIC_TYPE_ECC);
63081     if (point == NULL)
63082         err = MEMORY_E;
63083     if (err == MP_OKAY) {
63084         k = (sp_digit*)XMALLOC(
63085             sizeof(sp_digit) * (6 + 6 * 2 * 6),
63086             heap, DYNAMIC_TYPE_ECC);
63087         if (k == NULL)
63088             err = MEMORY_E;
63089     }
63090 #endif
63091 
63092     if (err == MP_OKAY) {
63093         addP = point + 1;
63094         tmp = k + 6;
63095 
63096         sp_384_from_mp(k, 6, km);
63097         sp_384_point_from_ecc_point_6(addP, am);
63098     }
63099     if ((err == MP_OKAY) && (!inMont)) {
63100         err = sp_384_mod_mul_norm_6(addP->x, addP->x, p384_mod);
63101     }
63102     if ((err == MP_OKAY) && (!inMont)) {
63103         err = sp_384_mod_mul_norm_6(addP->y, addP->y, p384_mod);
63104     }
63105     if ((err == MP_OKAY) && (!inMont)) {
63106         err = sp_384_mod_mul_norm_6(addP->z, addP->z, p384_mod);
63107     }
63108     if (err == MP_OKAY) {
63109             err = sp_384_ecc_mulmod_base_6(point, k, 0, 0, heap);
63110     }
63111     if (err == MP_OKAY) {
63112             sp_384_proj_point_add_6(point, point, addP, tmp);
63113 
63114         if (map) {
63115                 sp_384_map_6(point, point, tmp);
63116         }
63117 
63118         err = sp_384_point_to_ecc_point_6(point, r);
63119     }
63120 
63121 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63122     if (k != NULL)
63123         XFREE(k, heap, DYNAMIC_TYPE_ECC);
63124     if (point)
63125         XFREE(point, heap, DYNAMIC_TYPE_ECC);
63126 #endif
63127 
63128     return err;
63129 }
63130 
63131 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
63132                                                         defined(HAVE_ECC_VERIFY)
63133 /* Returns 1 if the number of zero.
63134  * Implementation is constant time.
63135  *
63136  * a  Number to check.
63137  * returns 1 if the number is zero and 0 otherwise.
63138  */
sp_384_iszero_6(const sp_digit * a)63139 static int sp_384_iszero_6(const sp_digit* a)
63140 {
63141     return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5]) == 0;
63142 }
63143 
63144 #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
63145 /* Add 1 to a. (a = a + 1)
63146  *
63147  * a  A single precision integer.
63148  */
sp_384_add_one_6(sp_digit * a)63149 static void sp_384_add_one_6(sp_digit* a)
63150 {
63151     __asm__ __volatile__ (
63152         "ldp	x1, x2, [%[a], 0]\n\t"
63153         "adds	x1, x1, #1\n\t"
63154         "ldr	x3, [%[a], 16]\n\t"
63155         "adcs	x2, x2, xzr\n\t"
63156         "ldr	x4, [%[a], 24]\n\t"
63157         "adcs	x3, x3, xzr\n\t"
63158         "stp	x1, x2, [%[a], 0]\n\t"
63159         "adcs	x4, x4, xzr\n\t"
63160         "stp	x3, x4, [%[a], 16]\n\t"
63161         "ldp	x1, x2, [%[a], 32]\n\t"
63162         "adcs	x1, x1, xzr\n\t"
63163         "adcs	x2, x2, xzr\n\t"
63164         "stp	x1, x2, [%[a], 32]\n\t"
63165         :
63166         : [a] "r" (a)
63167         : "memory", "x1", "x2", "x3", "x4"
63168     );
63169 }
63170 
63171 /* Read big endian unsigned byte array into r.
63172  *
63173  * r  A single precision integer.
63174  * size  Maximum number of bytes to convert
63175  * a  Byte array.
63176  * n  Number of bytes in array to read.
63177  */
sp_384_from_bin(sp_digit * r,int size,const byte * a,int n)63178 static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n)
63179 {
63180     int i;
63181     int j;
63182     byte* d;
63183 
63184     for (i = n - 1,j = 0; i >= 7; i -= 8) {
63185         r[j]  = ((sp_digit)a[i - 0] <<  0) |
63186                 ((sp_digit)a[i - 1] <<  8) |
63187                 ((sp_digit)a[i - 2] << 16) |
63188                 ((sp_digit)a[i - 3] << 24) |
63189                 ((sp_digit)a[i - 4] << 32) |
63190                 ((sp_digit)a[i - 5] << 40) |
63191                 ((sp_digit)a[i - 6] << 48) |
63192                 ((sp_digit)a[i - 7] << 56);
63193         j++;
63194     }
63195 
63196     if (i >= 0) {
63197         r[j] = 0;
63198 
63199         d = (byte*)r;
63200         switch (i) {
63201             case 6: d[n - 1 - 6] = a[6]; //fallthrough
63202             case 5: d[n - 1 - 5] = a[5]; //fallthrough
63203             case 4: d[n - 1 - 4] = a[4]; //fallthrough
63204             case 3: d[n - 1 - 3] = a[3]; //fallthrough
63205             case 2: d[n - 1 - 2] = a[2]; //fallthrough
63206             case 1: d[n - 1 - 1] = a[1]; //fallthrough
63207             case 0: d[n - 1 - 0] = a[0]; //fallthrough
63208         }
63209         j++;
63210     }
63211 
63212     for (; j < size; j++) {
63213         r[j] = 0;
63214     }
63215 }
63216 
63217 /* Generates a scalar that is in the range 1..order-1.
63218  *
63219  * rng  Random number generator.
63220  * k    Scalar value.
63221  * returns RNG failures, MEMORY_E when memory allocation fails and
63222  * MP_OKAY on success.
63223  */
sp_384_ecc_gen_k_6(WC_RNG * rng,sp_digit * k)63224 static int sp_384_ecc_gen_k_6(WC_RNG* rng, sp_digit* k)
63225 {
63226     int err;
63227     byte buf[48];
63228 
63229     do {
63230         err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
63231         if (err == 0) {
63232             sp_384_from_bin(k, 6, buf, (int)sizeof(buf));
63233             if (sp_384_cmp_6(k, p384_order2) <= 0) {
63234                 sp_384_add_one_6(k);
63235                 break;
63236             }
63237         }
63238     }
63239     while (err == 0);
63240 
63241     return err;
63242 }
63243 
63244 /* Makes a random EC key pair.
63245  *
63246  * rng   Random number generator.
63247  * priv  Generated private value.
63248  * pub   Generated public point.
63249  * heap  Heap to use for allocation.
63250  * returns ECC_INF_E when the point does not have the correct order, RNG
63251  * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
63252  */
sp_ecc_make_key_384(WC_RNG * rng,mp_int * priv,ecc_point * pub,void * heap)63253 int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
63254 {
63255 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63256     sp_point_384* point = NULL;
63257     sp_digit* k = NULL;
63258 #else
63259     #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
63260     sp_point_384 point[2];
63261     #else
63262     sp_point_384 point[1];
63263     #endif
63264     sp_digit k[6];
63265 #endif
63266 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
63267     sp_point_384* infinity = NULL;
63268 #endif
63269     int err = MP_OKAY;
63270 
63271 
63272     (void)heap;
63273 
63274 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63275     #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
63276     point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC);
63277     #else
63278     point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC);
63279     #endif
63280     if (point == NULL)
63281         err = MEMORY_E;
63282     if (err == MP_OKAY) {
63283         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6, heap,
63284                                DYNAMIC_TYPE_ECC);
63285         if (k == NULL)
63286             err = MEMORY_E;
63287     }
63288 #endif
63289 
63290     if (err == MP_OKAY) {
63291     #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
63292         infinity = point + 1;
63293     #endif
63294 
63295         err = sp_384_ecc_gen_k_6(rng, k);
63296     }
63297     if (err == MP_OKAY) {
63298             err = sp_384_ecc_mulmod_base_6(point, k, 1, 1, NULL);
63299     }
63300 
63301 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
63302     if (err == MP_OKAY) {
63303             err = sp_384_ecc_mulmod_6(infinity, point, p384_order, 1, 1, NULL);
63304     }
63305     if (err == MP_OKAY) {
63306         if (sp_384_iszero_6(point->x) || sp_384_iszero_6(point->y)) {
63307             err = ECC_INF_E;
63308         }
63309     }
63310 #endif
63311 
63312     if (err == MP_OKAY) {
63313         err = sp_384_to_mp(k, priv);
63314     }
63315     if (err == MP_OKAY) {
63316         err = sp_384_point_to_ecc_point_6(point, pub);
63317     }
63318 
63319 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63320     if (k != NULL)
63321         XFREE(k, heap, DYNAMIC_TYPE_ECC);
63322     if (point != NULL) {
63323         /* point is not sensitive, so no need to zeroize */
63324         XFREE(point, heap, DYNAMIC_TYPE_ECC);
63325     }
63326 #endif
63327 
63328     return err;
63329 }
63330 
63331 #ifdef HAVE_ECC_DHE
63332 /* Write r as big endian to byte array.
63333  * Fixed length number of bytes written: 48
63334  *
63335  * r  A single precision integer.
63336  * a  Byte array.
63337  */
sp_384_to_bin_6(sp_digit * r,byte * a)63338 static void sp_384_to_bin_6(sp_digit* r, byte* a)
63339 {
63340     int i;
63341     int j;
63342 
63343     for (i = 5, j = 0; i >= 0; i--) {
63344         a[j++] = r[i] >> 56;
63345         a[j++] = r[i] >> 48;
63346         a[j++] = r[i] >> 40;
63347         a[j++] = r[i] >> 32;
63348         a[j++] = r[i] >> 24;
63349         a[j++] = r[i] >> 16;
63350         a[j++] = r[i] >> 8;
63351         a[j++] = r[i] >> 0;
63352     }
63353 }
63354 
63355 /* Multiply the point by the scalar and serialize the X ordinate.
63356  * The number is 0 padded to maximum size on output.
63357  *
63358  * priv    Scalar to multiply the point by.
63359  * pub     Point to multiply.
63360  * out     Buffer to hold X ordinate.
63361  * outLen  On entry, size of the buffer in bytes.
63362  *         On exit, length of data in buffer in bytes.
63363  * heap    Heap to use for allocation.
63364  * returns BUFFER_E if the buffer is to small for output size,
63365  * MEMORY_E when memory allocation fails and MP_OKAY on success.
63366  */
sp_ecc_secret_gen_384(const mp_int * priv,const ecc_point * pub,byte * out,word32 * outLen,void * heap)63367 int sp_ecc_secret_gen_384(const mp_int* priv, const ecc_point* pub, byte* out,
63368                           word32* outLen, void* heap)
63369 {
63370 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63371     sp_point_384* point = NULL;
63372     sp_digit* k = NULL;
63373 #else
63374     sp_point_384 point[1];
63375     sp_digit k[6];
63376 #endif
63377     int err = MP_OKAY;
63378 
63379     if (*outLen < 48U) {
63380         err = BUFFER_E;
63381     }
63382 
63383 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63384     if (err == MP_OKAY) {
63385         point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
63386                                          DYNAMIC_TYPE_ECC);
63387         if (point == NULL)
63388             err = MEMORY_E;
63389     }
63390     if (err == MP_OKAY) {
63391         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6, heap,
63392                                DYNAMIC_TYPE_ECC);
63393         if (k == NULL)
63394             err = MEMORY_E;
63395     }
63396 #endif
63397 
63398     if (err == MP_OKAY) {
63399         sp_384_from_mp(k, 6, priv);
63400         sp_384_point_from_ecc_point_6(point, pub);
63401             err = sp_384_ecc_mulmod_6(point, point, k, 1, 1, heap);
63402     }
63403     if (err == MP_OKAY) {
63404         sp_384_to_bin_6(point->x, out);
63405         *outLen = 48;
63406     }
63407 
63408 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
63409     if (k != NULL)
63410         XFREE(k, heap, DYNAMIC_TYPE_ECC);
63411     if (point != NULL)
63412         XFREE(point, heap, DYNAMIC_TYPE_ECC);
63413 #endif
63414 
63415     return err;
63416 }
63417 #endif /* HAVE_ECC_DHE */
63418 
63419 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
63420 #endif
63421 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
63422 /* Sub b from a into a. (a -= b)
63423  *
63424  * a  A single precision integer and result.
63425  * b  A single precision integer.
63426  */
sp_384_sub_in_place_6(sp_digit * a,const sp_digit * b)63427 static sp_digit sp_384_sub_in_place_6(sp_digit* a, const sp_digit* b)
63428 {
63429     __asm__ __volatile__ (
63430         "ldp	x2, x3, [%[a], 0]\n\t"
63431         "ldp	x6, x7, [%[b], 0]\n\t"
63432         "subs	x2, x2, x6\n\t"
63433         "ldp	x4, x5, [%[a], 16]\n\t"
63434         "sbcs	x3, x3, x7\n\t"
63435         "ldp	x8, x9, [%[b], 16]\n\t"
63436         "sbcs	x4, x4, x8\n\t"
63437         "stp	x2, x3, [%[a], 0]\n\t"
63438         "sbcs	x5, x5, x9\n\t"
63439         "stp	x4, x5, [%[a], 16]\n\t"
63440         "ldr		x2, [%[a], 32]\n\t"
63441         "ldr		x3, [%[a], 40]\n\t"
63442         "ldr		x6, [%[b], 32]\n\t"
63443         "ldr		x7, [%[b], 40]\n\t"
63444         "sbcs	x2, x2, x6\n\t"
63445         "sbcs	x3, x3, x7\n\t"
63446         "str		x2, [%[a], 32]\n\t"
63447         "str		x3, [%[a], 40]\n\t"
63448         "csetm	%[a], cc\n\t"
63449         : [a] "+r" (a)
63450         : [b] "r" (b)
63451         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
63452     );
63453 
63454     return (sp_digit)a;
63455 }
63456 
63457 /* Mul a by digit b into r. (r = a * b)
63458  *
63459  * r  A single precision integer.
63460  * a  A single precision integer.
63461  * b  A single precision digit.
63462  */
sp_384_mul_d_6(sp_digit * r,const sp_digit * a,sp_digit b)63463 static void sp_384_mul_d_6(sp_digit* r, const sp_digit* a,
63464         sp_digit b)
63465 {
63466 #ifdef WOLFSSL_SP_SMALL
63467     __asm__ __volatile__ (
63468         "# A[0] * B\n\t"
63469         "ldr	x8, [%[a]]\n\t"
63470         "mul	x5, %[b], x8\n\t"
63471         "umulh	x3, %[b], x8\n\t"
63472         "mov	x4, 0\n\t"
63473         "str	x5, [%[r]]\n\t"
63474         "mov	x5, 0\n\t"
63475         "mov	x9, #8\n\t"
63476         "1:\n\t"
63477         "ldr	x8, [%[a], x9]\n\t"
63478         "mul	x6, %[b], x8\n\t"
63479         "umulh	x7, %[b], x8\n\t"
63480         "adds	x3, x3, x6\n\t"
63481         "adcs	x4, x4, x7\n\t"
63482         "adc	x5, xzr, xzr\n\t"
63483         "str	x3, [%[r], x9]\n\t"
63484         "mov	x3, x4\n\t"
63485         "mov	x4, x5\n\t"
63486         "mov	x5, #0\n\t"
63487         "add	x9, x9, #8\n\t"
63488         "cmp	x9, 48\n\t"
63489         "b.lt	1b\n\t"
63490         "str	x3, [%[r], 48]\n\t"
63491         :
63492         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
63493         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
63494     );
63495 #else
63496     __asm__ __volatile__ (
63497         "# A[0] * B\n\t"
63498         "ldp	x8, x9, [%[a]]\n\t"
63499         "mul	x3, %[b], x8\n\t"
63500         "umulh	x4, %[b], x8\n\t"
63501         "mov	x5, 0\n\t"
63502         "# A[1] * B\n\t"
63503         "str	x3, [%[r]]\n\t"
63504         "mov	x3, 0\n\t"
63505         "mul	x6, %[b], x9\n\t"
63506         "umulh	x7, %[b], x9\n\t"
63507         "adds	x4, x4, x6\n\t"
63508         "# A[2] * B\n\t"
63509         "ldp	x8, x9, [%[a], 16]\n\t"
63510         "str	x4, [%[r], 8]\n\t"
63511         "mov	x4, 0\n\t"
63512         "mul	x6, %[b], x8\n\t"
63513         "adcs	x5, x5, x7\n\t"
63514         "umulh	x7, %[b], x8\n\t"
63515         "adc	x3, xzr, xzr\n\t"
63516         "adds	x5, x5, x6\n\t"
63517         "# A[3] * B\n\t"
63518         "str	x5, [%[r], 16]\n\t"
63519         "mov	x5, 0\n\t"
63520         "mul	x6, %[b], x9\n\t"
63521         "adcs	x3, x3, x7\n\t"
63522         "umulh	x7, %[b], x9\n\t"
63523         "adc	x4, xzr, xzr\n\t"
63524         "adds	x3, x3, x6\n\t"
63525         "# A[4] * B\n\t"
63526         "ldp	x8, x9, [%[a], 32]\n\t"
63527         "str	x3, [%[r], 24]\n\t"
63528         "mov	x3, 0\n\t"
63529         "mul	x6, %[b], x8\n\t"
63530         "adcs	x4, x4, x7\n\t"
63531         "umulh	x7, %[b], x8\n\t"
63532         "adc	x5, xzr, xzr\n\t"
63533         "adds	x4, x4, x6\n\t"
63534         "# A[5] * B\n\t"
63535         "str	x4, [%[r], 32]\n\t"
63536         "mul	x6, %[b], x9\n\t"
63537         "adcs	x5, x5, x7\n\t"
63538         "umulh	x7, %[b], x9\n\t"
63539         "adc	x3, xzr, xzr\n\t"
63540         "adds	x5, x5, x6\n\t"
63541         "adc	x3, x3, x7\n\t"
63542         "stp	x5, x3, [%[r], 40]\n\t"
63543         :
63544         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
63545         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
63546     );
63547 #endif
63548 }
63549 
63550 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
63551  *
63552  * d1   The high order half of the number to divide.
63553  * d0   The low order half of the number to divide.
63554  * div  The dividend.
63555  * returns the result of the division.
63556  */
div_384_word_6(sp_digit d1,sp_digit d0,sp_digit div)63557 static sp_digit div_384_word_6(sp_digit d1, sp_digit d0, sp_digit div)
63558 {
63559     sp_digit r;
63560 
63561     __asm__ __volatile__ (
63562         "lsr	x5, %[div], 32\n\t"
63563         "add	x5, x5, 1\n\t"
63564 
63565         "udiv	x3, %[d1], x5\n\t"
63566         "lsl	x6, x3, 32\n\t"
63567         "mul	x4, %[div], x6\n\t"
63568         "umulh	x3, %[div], x6\n\t"
63569         "subs	%[d0], %[d0], x4\n\t"
63570         "sbc	%[d1], %[d1], x3\n\t"
63571 
63572         "udiv	x3, %[d1], x5\n\t"
63573         "lsl	x3, x3, 32\n\t"
63574         "add	x6, x6, x3\n\t"
63575         "mul	x4, %[div], x3\n\t"
63576         "umulh	x3, %[div], x3\n\t"
63577         "subs	%[d0], %[d0], x4\n\t"
63578         "sbc	%[d1], %[d1], x3\n\t"
63579 
63580         "lsr	x3, %[d0], 32\n\t"
63581         "orr	x3, x3, %[d1], lsl 32\n\t"
63582 
63583         "udiv	x3, x3, x5\n\t"
63584         "add	x6, x6, x3\n\t"
63585         "mul	x4, %[div], x3\n\t"
63586         "umulh	x3, %[div], x3\n\t"
63587         "subs	%[d0], %[d0], x4\n\t"
63588         "sbc	%[d1], %[d1], x3\n\t"
63589 
63590         "lsr	x3, %[d0], 32\n\t"
63591         "orr	x3, x3, %[d1], lsl 32\n\t"
63592 
63593         "udiv	x3, x3, x5\n\t"
63594         "add	x6, x6, x3\n\t"
63595         "mul	x4, %[div], x3\n\t"
63596         "sub	%[d0], %[d0], x4\n\t"
63597 
63598         "udiv	x3, %[d0], %[div]\n\t"
63599         "add	%[r], x6, x3\n\t"
63600 
63601         : [r] "=r" (r)
63602         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
63603         : "x3", "x4", "x5", "x6"
63604     );
63605 
63606     return r;
63607 }
63608 
63609 /* AND m into each word of a and store in r.
63610  *
63611  * r  A single precision integer.
63612  * a  A single precision integer.
63613  * m  Mask to AND against each digit.
63614  */
sp_384_mask_6(sp_digit * r,const sp_digit * a,sp_digit m)63615 static void sp_384_mask_6(sp_digit* r, const sp_digit* a, sp_digit m)
63616 {
63617 #ifdef WOLFSSL_SP_SMALL
63618     int i;
63619 
63620     for (i=0; i<6; i++) {
63621         r[i] = a[i] & m;
63622     }
63623 #else
63624     r[0] = a[0] & m;
63625     r[1] = a[1] & m;
63626     r[2] = a[2] & m;
63627     r[3] = a[3] & m;
63628     r[4] = a[4] & m;
63629     r[5] = a[5] & m;
63630 #endif
63631 }
63632 
63633 /* Divide d in a and put remainder into r (m*d + r = a)
63634  * m is not calculated as it is not needed at this time.
63635  *
63636  * a  Number to be divided.
63637  * d  Number to divide with.
63638  * m  Multiplier result.
63639  * r  Remainder from the division.
63640  * returns MP_OKAY indicating success.
63641  */
sp_384_div_6(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)63642 static WC_INLINE int sp_384_div_6(const sp_digit* a, const sp_digit* d, sp_digit* m,
63643         sp_digit* r)
63644 {
63645     sp_digit t1[12], t2[7];
63646     sp_digit div, r1;
63647     int i;
63648 
63649     (void)m;
63650 
63651     div = d[5];
63652     XMEMCPY(t1, a, sizeof(*t1) * 2 * 6);
63653     for (i=5; i>=0; i--) {
63654         sp_digit hi = t1[6 + i] - (t1[6 + i] == div);
63655         r1 = div_384_word_6(hi, t1[6 + i - 1], div);
63656 
63657         sp_384_mul_d_6(t2, d, r1);
63658         t1[6 + i] += sp_384_sub_in_place_6(&t1[i], t2);
63659         t1[6 + i] -= t2[6];
63660         sp_384_mask_6(t2, d, t1[6 + i]);
63661         t1[6 + i] += sp_384_add_6(&t1[i], &t1[i], t2);
63662         sp_384_mask_6(t2, d, t1[6 + i]);
63663         t1[6 + i] += sp_384_add_6(&t1[i], &t1[i], t2);
63664     }
63665 
63666     r1 = sp_384_cmp_6(t1, d) >= 0;
63667     sp_384_cond_sub_6(r, t1, d, (sp_digit)0 - r1);
63668 
63669     return MP_OKAY;
63670 }
63671 
63672 /* Reduce a modulo m into r. (r = a mod m)
63673  *
63674  * r  A single precision number that is the reduced result.
63675  * a  A single precision number that is to be reduced.
63676  * m  A single precision number that is the modulus to reduce with.
63677  * returns MP_OKAY indicating success.
63678  */
sp_384_mod_6(sp_digit * r,const sp_digit * a,const sp_digit * m)63679 static WC_INLINE int sp_384_mod_6(sp_digit* r, const sp_digit* a, const sp_digit* m)
63680 {
63681     return sp_384_div_6(a, m, NULL, r);
63682 }
63683 
63684 #endif
63685 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
63686 /* Multiply two number mod the order of P384 curve. (r = a * b mod order)
63687  *
63688  * r  Result of the multiplication.
63689  * a  First operand of the multiplication.
63690  * b  Second operand of the multiplication.
63691  */
sp_384_mont_mul_order_6(sp_digit * r,const sp_digit * a,const sp_digit * b)63692 static void sp_384_mont_mul_order_6(sp_digit* r, const sp_digit* a, const sp_digit* b)
63693 {
63694     sp_384_mul_6(r, a, b);
63695     sp_384_mont_reduce_order_6(r, p384_order, p384_mp_order);
63696 }
63697 
63698 #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
63699 #ifdef WOLFSSL_SP_SMALL
63700 /* Order-2 for the P384 curve. */
63701 static const uint64_t p384_order_minus_2[6] = {
63702     0xecec196accc52971U,0x581a0db248b0a77aU,0xc7634d81f4372ddfU,
63703     0xffffffffffffffffU,0xffffffffffffffffU,0xffffffffffffffffU
63704 };
63705 #else
63706 /* The low half of the order-2 of the P384 curve. */
63707 static const uint64_t p384_order_low[3] = {
63708     0xecec196accc52971U,0x581a0db248b0a77aU,0xc7634d81f4372ddfU
63709 };
63710 #endif /* WOLFSSL_SP_SMALL */
63711 
63712 /* Square number mod the order of P384 curve. (r = a * a mod order)
63713  *
63714  * r  Result of the squaring.
63715  * a  Number to square.
63716  */
sp_384_mont_sqr_order_6(sp_digit * r,const sp_digit * a)63717 static void sp_384_mont_sqr_order_6(sp_digit* r, const sp_digit* a)
63718 {
63719     sp_384_sqr_6(r, a);
63720     sp_384_mont_reduce_order_6(r, p384_order, p384_mp_order);
63721 }
63722 
63723 #ifndef WOLFSSL_SP_SMALL
63724 /* Square number mod the order of P384 curve a number of times.
63725  * (r = a ^ n mod order)
63726  *
63727  * r  Result of the squaring.
63728  * a  Number to square.
63729  */
sp_384_mont_sqr_n_order_6(sp_digit * r,const sp_digit * a,int n)63730 static void sp_384_mont_sqr_n_order_6(sp_digit* r, const sp_digit* a, int n)
63731 {
63732     int i;
63733 
63734     sp_384_mont_sqr_order_6(r, a);
63735     for (i=1; i<n; i++) {
63736         sp_384_mont_sqr_order_6(r, r);
63737     }
63738 }
63739 #endif /* !WOLFSSL_SP_SMALL */
63740 
63741 /* Invert the number, in Montgomery form, modulo the order of the P384 curve.
63742  * (r = 1 / a mod order)
63743  *
63744  * r   Inverse result.
63745  * a   Number to invert.
63746  * td  Temporary data.
63747  */
63748 
63749 #ifdef WOLFSSL_SP_NONBLOCK
63750 typedef struct sp_384_mont_inv_order_6_ctx {
63751     int state;
63752     int i;
63753 } sp_384_mont_inv_order_6_ctx;
sp_384_mont_inv_order_6_nb(sp_ecc_ctx_t * sp_ctx,sp_digit * r,const sp_digit * a,sp_digit * t)63754 static int sp_384_mont_inv_order_6_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
63755         sp_digit* t)
63756 {
63757     int err = FP_WOULDBLOCK;
63758     sp_384_mont_inv_order_6_ctx* ctx = (sp_384_mont_inv_order_6_ctx*)sp_ctx;
63759 
63760     typedef char ctx_size_test[sizeof(sp_384_mont_inv_order_6_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
63761     (void)sizeof(ctx_size_test);
63762 
63763     switch (ctx->state) {
63764     case 0:
63765         XMEMCPY(t, a, sizeof(sp_digit) * 6);
63766         ctx->i = 382;
63767         ctx->state = 1;
63768         break;
63769     case 1:
63770         sp_384_mont_sqr_order_6(t, t);
63771         ctx->state = 2;
63772         break;
63773     case 2:
63774         if ((p384_order_minus_2[ctx->i / 64] & ((sp_int_digit)1 << (ctx->i % 64))) != 0) {
63775             sp_384_mont_mul_order_6(t, t, a);
63776         }
63777         ctx->i--;
63778         ctx->state = (ctx->i == 0) ? 3 : 1;
63779         break;
63780     case 3:
63781         XMEMCPY(r, t, sizeof(sp_digit) * 6U);
63782         err = MP_OKAY;
63783         break;
63784     }
63785     return err;
63786 }
63787 #endif /* WOLFSSL_SP_NONBLOCK */
63788 
sp_384_mont_inv_order_6(sp_digit * r,const sp_digit * a,sp_digit * td)63789 static void sp_384_mont_inv_order_6(sp_digit* r, const sp_digit* a,
63790         sp_digit* td)
63791 {
63792 #ifdef WOLFSSL_SP_SMALL
63793     sp_digit* t = td;
63794     int i;
63795 
63796     XMEMCPY(t, a, sizeof(sp_digit) * 6);
63797     for (i=382; i>=0; i--) {
63798         sp_384_mont_sqr_order_6(t, t);
63799         if ((p384_order_minus_2[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) {
63800             sp_384_mont_mul_order_6(t, t, a);
63801         }
63802     }
63803     XMEMCPY(r, t, sizeof(sp_digit) * 6U);
63804 #else
63805     sp_digit* t = td;
63806     sp_digit* t2 = td + 2 * 6;
63807     sp_digit* t3 = td + 4 * 6;
63808     int i;
63809 
63810     /* t = a^2 */
63811     sp_384_mont_sqr_order_6(t, a);
63812     /* t = a^3 = t * a */
63813     sp_384_mont_mul_order_6(t, t, a);
63814     /* t2= a^c = t ^ 2 ^ 2 */
63815     sp_384_mont_sqr_n_order_6(t2, t, 2);
63816     /* t = a^f = t2 * t */
63817     sp_384_mont_mul_order_6(t, t2, t);
63818     /* t2= a^f0 = t ^ 2 ^ 4 */
63819     sp_384_mont_sqr_n_order_6(t2, t, 4);
63820     /* t = a^ff = t2 * t */
63821     sp_384_mont_mul_order_6(t, t2, t);
63822     /* t2= a^ff00 = t ^ 2 ^ 8 */
63823     sp_384_mont_sqr_n_order_6(t2, t, 8);
63824     /* t3= a^ffff = t2 * t */
63825     sp_384_mont_mul_order_6(t3, t2, t);
63826     /* t2= a^ffff0000 = t3 ^ 2 ^ 16 */
63827     sp_384_mont_sqr_n_order_6(t2, t3, 16);
63828     /* t = a^ffffffff = t2 * t3 */
63829     sp_384_mont_mul_order_6(t, t2, t3);
63830     /* t2= a^ffffffff0000 = t ^ 2 ^ 16  */
63831     sp_384_mont_sqr_n_order_6(t2, t, 16);
63832     /* t = a^ffffffffffff = t2 * t3 */
63833     sp_384_mont_mul_order_6(t, t2, t3);
63834     /* t2= a^ffffffffffff000000000000 = t ^ 2 ^ 48  */
63835     sp_384_mont_sqr_n_order_6(t2, t, 48);
63836     /* t= a^fffffffffffffffffffffffff = t2 * t */
63837     sp_384_mont_mul_order_6(t, t2, t);
63838     /* t2= a^ffffffffffffffffffffffff000000000000000000000000 */
63839     sp_384_mont_sqr_n_order_6(t2, t, 96);
63840     /* t2= a^ffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
63841     sp_384_mont_mul_order_6(t2, t2, t);
63842     for (i=191; i>=1; i--) {
63843         sp_384_mont_sqr_order_6(t2, t2);
63844         if ((p384_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) {
63845             sp_384_mont_mul_order_6(t2, t2, a);
63846         }
63847     }
63848     sp_384_mont_sqr_order_6(t2, t2);
63849     sp_384_mont_mul_order_6(r, t2, a);
63850 #endif /* WOLFSSL_SP_SMALL */
63851 }
63852 
63853 #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
63854 #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
63855 #ifdef HAVE_ECC_SIGN
63856 #ifndef SP_ECC_MAX_SIG_GEN
63857 #define SP_ECC_MAX_SIG_GEN  64
63858 #endif
63859 
63860 /* Calculate second signature value S from R, k and private value.
63861  *
63862  * s = (r * x + e) / k
63863  *
63864  * s    Signature value.
63865  * r    First signature value.
63866  * k    Ephemeral private key.
63867  * x    Private key as a number.
63868  * e    Hash of message as a number.
63869  * tmp  Temporary storage for intermediate numbers.
63870  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
63871  */
sp_384_calc_s_6(sp_digit * s,const sp_digit * r,sp_digit * k,sp_digit * x,const sp_digit * e,sp_digit * tmp)63872 static int sp_384_calc_s_6(sp_digit* s, const sp_digit* r, sp_digit* k,
63873     sp_digit* x, const sp_digit* e, sp_digit* tmp)
63874 {
63875     int err;
63876     sp_digit carry;
63877     sp_int64 c;
63878     sp_digit* kInv = k;
63879 
63880     /* Conv k to Montgomery form (mod order) */
63881         sp_384_mul_6(k, k, p384_norm_order);
63882     err = sp_384_mod_6(k, k, p384_order);
63883     if (err == MP_OKAY) {
63884         sp_384_norm_6(k);
63885 
63886         /* kInv = 1/k mod order */
63887             sp_384_mont_inv_order_6(kInv, k, tmp);
63888         sp_384_norm_6(kInv);
63889 
63890         /* s = r * x + e */
63891             sp_384_mul_6(x, x, r);
63892         err = sp_384_mod_6(x, x, p384_order);
63893     }
63894     if (err == MP_OKAY) {
63895         sp_384_norm_6(x);
63896         carry = sp_384_add_6(s, e, x);
63897         sp_384_cond_sub_6(s, s, p384_order, 0 - carry);
63898         sp_384_norm_6(s);
63899         c = sp_384_cmp_6(s, p384_order);
63900         sp_384_cond_sub_6(s, s, p384_order,
63901             (sp_digit)0 - (sp_digit)(c >= 0));
63902         sp_384_norm_6(s);
63903 
63904         /* s = s * k^-1 mod order */
63905             sp_384_mont_mul_order_6(s, s, kInv);
63906         sp_384_norm_6(s);
63907     }
63908 
63909     return err;
63910 }
63911 
63912 /* Sign the hash using the private key.
63913  *   e = [hash, 384 bits] from binary
63914  *   r = (k.G)->x mod order
63915  *   s = (r * x + e) / k mod order
63916  * The hash is truncated to the first 384 bits.
63917  *
63918  * hash     Hash to sign.
63919  * hashLen  Length of the hash data.
63920  * rng      Random number generator.
63921  * priv     Private part of key - scalar.
63922  * rm       First part of result as an mp_int.
63923  * sm       Sirst part of result as an mp_int.
63924  * heap     Heap to use for allocation.
63925  * returns RNG failures, MEMORY_E when memory allocation fails and
63926  * MP_OKAY on success.
63927  */
63928 #ifdef WOLFSSL_SP_NONBLOCK
63929 typedef struct sp_ecc_sign_384_ctx {
63930     int state;
63931     union {
63932         sp_384_ecc_mulmod_6_ctx mulmod_ctx;
63933         sp_384_mont_inv_order_6_ctx mont_inv_order_ctx;
63934     };
63935     sp_digit e[2*6];
63936     sp_digit x[2*6];
63937     sp_digit k[2*6];
63938     sp_digit r[2*6];
63939     sp_digit tmp[3 * 2*6];
63940     sp_point_384 point;
63941     sp_digit* s;
63942     sp_digit* kInv;
63943     int i;
63944 } sp_ecc_sign_384_ctx;
63945 
sp_ecc_sign_384_nb(sp_ecc_ctx_t * sp_ctx,const byte * hash,word32 hashLen,WC_RNG * rng,mp_int * priv,mp_int * rm,mp_int * sm,mp_int * km,void * heap)63946 int sp_ecc_sign_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
63947     mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
63948 {
63949     int err = FP_WOULDBLOCK;
63950     sp_ecc_sign_384_ctx* ctx = (sp_ecc_sign_384_ctx*)sp_ctx->data;
63951 
63952     typedef char ctx_size_test[sizeof(sp_ecc_sign_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
63953     (void)sizeof(ctx_size_test);
63954 
63955     (void)heap;
63956 
63957     switch (ctx->state) {
63958     case 0: /* INIT */
63959         ctx->s = ctx->e;
63960         ctx->kInv = ctx->k;
63961         if (hashLen > 48U) {
63962             hashLen = 48U;
63963         }
63964 
63965         ctx->i = SP_ECC_MAX_SIG_GEN;
63966         ctx->state = 1;
63967         break;
63968     case 1: /* GEN */
63969         /* New random point. */
63970         if (km == NULL || mp_iszero(km)) {
63971             err = sp_384_ecc_gen_k_6(rng, ctx->k);
63972         }
63973         else {
63974             sp_384_from_mp(ctx->k, 6, km);
63975             mp_zero(km);
63976         }
63977         XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
63978         ctx->state = 2;
63979         break;
63980     case 2: /* MULMOD */
63981         err = sp_384_ecc_mulmod_6_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
63982             &ctx->point, &p384_base, ctx->k, 1, 1, heap);
63983         if (err == MP_OKAY) {
63984             ctx->state = 3;
63985         }
63986         break;
63987     case 3: /* MODORDER */
63988     {
63989         sp_int64 c;
63990         /* r = point->x mod order */
63991         XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 6U);
63992         sp_384_norm_6(ctx->r);
63993         c = sp_384_cmp_6(ctx->r, p384_order);
63994         sp_384_cond_sub_6(ctx->r, ctx->r, p384_order,
63995             (sp_digit)0 - (sp_digit)(c >= 0));
63996         sp_384_norm_6(ctx->r);
63997 
63998         sp_384_from_mp(ctx->x, 6, priv);
63999         sp_384_from_bin(ctx->e, 6, hash, (int)hashLen);
64000         ctx->state = 4;
64001         break;
64002     }
64003     case 4: /* KMODORDER */
64004         /* Conv k to Montgomery form (mod order) */
64005         sp_384_mul_6(ctx->k, ctx->k, p384_norm_order);
64006         err = sp_384_mod_6(ctx->k, ctx->k, p384_order);
64007         if (err == MP_OKAY) {
64008             sp_384_norm_6(ctx->k);
64009             XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
64010             ctx->state = 5;
64011         }
64012         break;
64013     case 5: /* KINV */
64014         /* kInv = 1/k mod order */
64015         err = sp_384_mont_inv_order_6_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
64016         if (err == MP_OKAY) {
64017             XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
64018             ctx->state = 6;
64019         }
64020         break;
64021     case 6: /* KINVNORM */
64022         sp_384_norm_6(ctx->kInv);
64023         ctx->state = 7;
64024         break;
64025     case 7: /* R */
64026         /* s = r * x + e */
64027         sp_384_mul_6(ctx->x, ctx->x, ctx->r);
64028         ctx->state = 8;
64029         break;
64030     case 8: /* S1 */
64031         err = sp_384_mod_6(ctx->x, ctx->x, p384_order);
64032         if (err == MP_OKAY)
64033             ctx->state = 9;
64034         break;
64035     case 9: /* S2 */
64036     {
64037         sp_digit carry;
64038         sp_int64 c;
64039         sp_384_norm_6(ctx->x);
64040         carry = sp_384_add_6(ctx->s, ctx->e, ctx->x);
64041         sp_384_cond_sub_6(ctx->s, ctx->s,
64042             p384_order, 0 - carry);
64043         sp_384_norm_6(ctx->s);
64044         c = sp_384_cmp_6(ctx->s, p384_order);
64045         sp_384_cond_sub_6(ctx->s, ctx->s, p384_order,
64046             (sp_digit)0 - (sp_digit)(c >= 0));
64047         sp_384_norm_6(ctx->s);
64048 
64049         /* s = s * k^-1 mod order */
64050         sp_384_mont_mul_order_6(ctx->s, ctx->s, ctx->kInv);
64051         sp_384_norm_6(ctx->s);
64052 
64053         /* Check that signature is usable. */
64054         if (sp_384_iszero_6(ctx->s) == 0) {
64055             ctx->state = 10;
64056             break;
64057         }
64058     #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
64059         ctx->i = 1;
64060     #endif
64061 
64062         /* not usable gen, try again */
64063         ctx->i--;
64064         if (ctx->i == 0) {
64065             err = RNG_FAILURE_E;
64066         }
64067         ctx->state = 1;
64068         break;
64069     }
64070     case 10: /* RES */
64071         err = sp_384_to_mp(ctx->r, rm);
64072         if (err == MP_OKAY) {
64073             err = sp_384_to_mp(ctx->s, sm);
64074         }
64075         break;
64076     }
64077 
64078     if (err == MP_OKAY && ctx->state != 10) {
64079         err = FP_WOULDBLOCK;
64080     }
64081     if (err != FP_WOULDBLOCK) {
64082         XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 6U);
64083         XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 6U);
64084         XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 6U);
64085         XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 6U);
64086         XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 6U);
64087     }
64088 
64089     return err;
64090 }
64091 #endif /* WOLFSSL_SP_NONBLOCK */
64092 
sp_ecc_sign_384(const byte * hash,word32 hashLen,WC_RNG * rng,const mp_int * priv,mp_int * rm,mp_int * sm,mp_int * km,void * heap)64093 int sp_ecc_sign_384(const byte* hash, word32 hashLen, WC_RNG* rng,
64094     const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
64095 {
64096 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64097     sp_digit* e = NULL;
64098     sp_point_384* point = NULL;
64099 #else
64100     sp_digit e[7 * 2 * 6];
64101     sp_point_384 point[1];
64102 #endif
64103     sp_digit* x = NULL;
64104     sp_digit* k = NULL;
64105     sp_digit* r = NULL;
64106     sp_digit* tmp = NULL;
64107     sp_digit* s = NULL;
64108     sp_int64 c;
64109     int err = MP_OKAY;
64110     int i;
64111 
64112     (void)heap;
64113 
64114 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64115     if (err == MP_OKAY) {
64116         point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
64117                                              DYNAMIC_TYPE_ECC);
64118         if (point == NULL)
64119             err = MEMORY_E;
64120     }
64121     if (err == MP_OKAY) {
64122         e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 6, heap,
64123                                DYNAMIC_TYPE_ECC);
64124         if (e == NULL)
64125             err = MEMORY_E;
64126     }
64127 #endif
64128 
64129     if (err == MP_OKAY) {
64130         x = e + 2 * 6;
64131         k = e + 4 * 6;
64132         r = e + 6 * 6;
64133         tmp = e + 8 * 6;
64134         s = e;
64135 
64136         if (hashLen > 48U) {
64137             hashLen = 48U;
64138         }
64139     }
64140 
64141     for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
64142         /* New random point. */
64143         if (km == NULL || mp_iszero(km)) {
64144             err = sp_384_ecc_gen_k_6(rng, k);
64145         }
64146         else {
64147             sp_384_from_mp(k, 6, km);
64148             mp_zero(km);
64149         }
64150         if (err == MP_OKAY) {
64151                 err = sp_384_ecc_mulmod_base_6(point, k, 1, 1, heap);
64152         }
64153 
64154         if (err == MP_OKAY) {
64155             /* r = point->x mod order */
64156             XMEMCPY(r, point->x, sizeof(sp_digit) * 6U);
64157             sp_384_norm_6(r);
64158             c = sp_384_cmp_6(r, p384_order);
64159             sp_384_cond_sub_6(r, r, p384_order,
64160                 (sp_digit)0 - (sp_digit)(c >= 0));
64161             sp_384_norm_6(r);
64162 
64163             sp_384_from_mp(x, 6, priv);
64164             sp_384_from_bin(e, 6, hash, (int)hashLen);
64165 
64166             err = sp_384_calc_s_6(s, r, k, x, e, tmp);
64167         }
64168 
64169         /* Check that signature is usable. */
64170         if ((err == MP_OKAY) && (sp_384_iszero_6(s) == 0)) {
64171             break;
64172         }
64173 #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
64174         i = 1;
64175 #endif
64176     }
64177 
64178     if (i == 0) {
64179         err = RNG_FAILURE_E;
64180     }
64181 
64182     if (err == MP_OKAY) {
64183         err = sp_384_to_mp(r, rm);
64184     }
64185     if (err == MP_OKAY) {
64186         err = sp_384_to_mp(s, sm);
64187     }
64188 
64189 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64190     if (e != NULL)
64191 #endif
64192     {
64193         ForceZero(e, sizeof(sp_digit) * 7 * 2 * 6);
64194     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64195         XFREE(e, heap, DYNAMIC_TYPE_ECC);
64196     #endif
64197     }
64198 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64199     if (point != NULL)
64200 #endif
64201     {
64202         ForceZero(point, sizeof(sp_point_384));
64203     #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64204         XFREE(point, heap, DYNAMIC_TYPE_ECC);
64205     #endif
64206     }
64207 
64208     return err;
64209 }
64210 #endif /* HAVE_ECC_SIGN */
64211 
64212 #ifndef WOLFSSL_SP_SMALL
64213 /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
64214  *
64215  * r  Result of division by 2.
64216  * a  Number to divide.
64217  * m  Modulus.
64218  */
sp_384_div2_mod_6(sp_digit * r,const sp_digit * a,const sp_digit * m)64219 static void sp_384_div2_mod_6(sp_digit* r, const sp_digit* a,
64220     const sp_digit* m)
64221 {
64222     __asm__ __volatile__ (
64223         "ldr     x3, [%[a], 0]\n\t"
64224         "ldr     x4, [%[a], 8]\n\t"
64225         "ldr     x5, [%[a], 16]\n\t"
64226         "ldr     x6, [%[a], 24]\n\t"
64227         "ldr     x7, [%[a], 32]\n\t"
64228         "ldr     x8, [%[a], 40]\n\t"
64229         "ldr     x9, [%[m], 0]\n\t"
64230         "ldr     x10, [%[m], 8]\n\t"
64231         "ldr     x11, [%[m], 16]\n\t"
64232         "ldr     x12, [%[m], 24]\n\t"
64233         "ldr     x13, [%[m], 32]\n\t"
64234         "ldr     x14, [%[m], 40]\n\t"
64235         "ands      x15, x3, 1\n\t"
64236         "b.eq      1f\n\t"
64237         "adds      x3, x3, x9\n\t"
64238         "adcs    x4, x4, x10\n\t"
64239         "adcs    x5, x5, x11\n\t"
64240         "adcs    x6, x6, x12\n\t"
64241         "adcs    x7, x7, x13\n\t"
64242         "adcs    x8, x8, x14\n\t"
64243         "cset      x15, cs\n\t"
64244         "\n1:\n\t"
64245         "lsr       x3, x3, 1\n\t"
64246         "lsr     x10, x4, 1\n\t"
64247         "lsr     x11, x5, 1\n\t"
64248         "lsr     x12, x6, 1\n\t"
64249         "lsr     x13, x7, 1\n\t"
64250         "lsr     x14, x8, 1\n\t"
64251         "orr       x3, x3, x4, lsl 63\n\t"
64252         "orr     x4, x10, x5, lsl 63\n\t"
64253         "orr     x5, x11, x6, lsl 63\n\t"
64254         "orr     x6, x12, x7, lsl 63\n\t"
64255         "orr     x7, x13, x8, lsl 63\n\t"
64256         "orr       x8, x14, x15, lsl 63\n\t"
64257         "str     x3, [%[r], 0]\n\t"
64258         "str     x4, [%[r], 8]\n\t"
64259         "str     x5, [%[r], 16]\n\t"
64260         "str     x6, [%[r], 24]\n\t"
64261         "str     x7, [%[r], 32]\n\t"
64262         "str     x8, [%[r], 40]\n\t"
64263         :
64264         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
64265         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15"
64266     );
64267 }
64268 
sp_384_num_bits_64_6(sp_digit n)64269 static int sp_384_num_bits_64_6(sp_digit n)
64270 {
64271     int64_t r = -1;
64272 
64273     __asm__ __volatile__ (
64274         "mov	x1, 64\n\t"
64275         "clz	%[r], %[n]\n\t"
64276         "sub	%[r], x1, %[r]"
64277         : [r] "+r" (r)
64278         : [n] "r" (n)
64279         : "x1"
64280     );
64281 
64282     return r + 1;
64283 }
64284 
sp_384_num_bits_6(const sp_digit * a)64285 static int sp_384_num_bits_6(const sp_digit* a)
64286 {
64287     int i;
64288     int r = 0;
64289 
64290     for (i=5; i>=0; i--) {
64291         if (a[i] != 0) {
64292             r = sp_384_num_bits_64_6(a[i]);
64293             r += i * 64;
64294             break;
64295         }
64296     }
64297 
64298     return r;
64299 }
64300 
64301 /* Non-constant time modular inversion.
64302  *
64303  * @param  [out]  r   Resulting number.
64304  * @param  [in]   a   Number to invert.
64305  * @param  [in]   m   Modulus.
64306  * @return  MP_OKAY on success.
64307  */
sp_384_mod_inv_6(sp_digit * r,const sp_digit * a,const sp_digit * m)64308 static int sp_384_mod_inv_6(sp_digit* r, const sp_digit* a, const sp_digit* m)
64309 {
64310     sp_digit u[6];
64311     sp_digit v[6];
64312     sp_digit b[6];
64313     sp_digit d[6];
64314     int ut, vt;
64315     sp_digit o;
64316 
64317     XMEMCPY(u, m, sizeof(u));
64318     XMEMCPY(v, a, sizeof(v));
64319 
64320     ut = sp_384_num_bits_6(u);
64321     vt = sp_384_num_bits_6(v);
64322 
64323     XMEMSET(b, 0, sizeof(b));
64324     if ((v[0] & 1) == 0) {
64325         sp_384_rshift1_6(v, v);
64326         XMEMCPY(d, m, sizeof(u));
64327         d[0] += 1;
64328         sp_384_rshift1_6(d, d);
64329         vt--;
64330 
64331         while ((v[0] & 1) == 0) {
64332             sp_384_rshift1_6(v, v);
64333             sp_384_div2_mod_6(d, d, m);
64334             vt--;
64335         }
64336     }
64337     else {
64338         XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
64339         d[0] = 1;
64340     }
64341 
64342     while (ut > 1 && vt > 1) {
64343         if (ut > vt || (ut == vt && sp_384_cmp_6(u, v) >= 0)) {
64344             sp_384_sub_6(u, u, v);
64345             o = sp_384_sub_6(b, b, d);
64346             if (o != 0)
64347                 sp_384_add_6(b, b, m);
64348             ut = sp_384_num_bits_6(u);
64349 
64350             do {
64351                 sp_384_rshift1_6(u, u);
64352                 sp_384_div2_mod_6(b, b, m);
64353                 ut--;
64354             }
64355             while (ut > 0 && (u[0] & 1) == 0);
64356         }
64357         else {
64358             sp_384_sub_6(v, v, u);
64359             o = sp_384_sub_6(d, d, b);
64360             if (o != 0)
64361                 sp_384_add_6(d, d, m);
64362             vt = sp_384_num_bits_6(v);
64363 
64364             do {
64365                 sp_384_rshift1_6(v, v);
64366                 sp_384_div2_mod_6(d, d, m);
64367                 vt--;
64368             }
64369             while (vt > 0 && (v[0] & 1) == 0);
64370         }
64371     }
64372 
64373     if (ut == 1)
64374         XMEMCPY(r, b, sizeof(b));
64375     else
64376         XMEMCPY(r, d, sizeof(d));
64377 
64378     return MP_OKAY;
64379 }
64380 
64381 #endif /* WOLFSSL_SP_SMALL */
64382 
64383 /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
64384  *
64385  * p1   First point to add and holds result.
64386  * p2   Second point to add.
64387  * tmp  Temporary storage for intermediate numbers.
64388  */
sp_384_add_points_6(sp_point_384 * p1,const sp_point_384 * p2,sp_digit * tmp)64389 static void sp_384_add_points_6(sp_point_384* p1, const sp_point_384* p2,
64390     sp_digit* tmp)
64391 {
64392 
64393         sp_384_proj_point_add_6(p1, p1, p2, tmp);
64394     if (sp_384_iszero_6(p1->z)) {
64395         if (sp_384_iszero_6(p1->x) && sp_384_iszero_6(p1->y)) {
64396                 sp_384_proj_point_dbl_6(p1, p2, tmp);
64397         }
64398         else {
64399             /* Y ordinate is not used from here - don't set. */
64400             p1->x[0] = 0;
64401             p1->x[1] = 0;
64402             p1->x[2] = 0;
64403             p1->x[3] = 0;
64404             p1->x[4] = 0;
64405             p1->x[5] = 0;
64406             XMEMCPY(p1->z, p384_norm_mod, sizeof(p384_norm_mod));
64407         }
64408     }
64409 }
64410 
64411 /* Calculate the verification point: [e/s]G + [r/s]Q
64412  *
64413  * p1    Calculated point.
64414  * p2    Public point and temporary.
64415  * s     Second part of signature as a number.
64416  * u1    Temporary number.
64417  * u2    Temproray number.
64418  * heap  Heap to use for allocation.
64419  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
64420  */
sp_384_calc_vfy_point_6(sp_point_384 * p1,sp_point_384 * p2,sp_digit * s,sp_digit * u1,sp_digit * u2,sp_digit * tmp,void * heap)64421 static int sp_384_calc_vfy_point_6(sp_point_384* p1, sp_point_384* p2,
64422     sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
64423 {
64424     int err;
64425 
64426 #ifndef WOLFSSL_SP_SMALL
64427     err = sp_384_mod_inv_6(s, s, p384_order);
64428     if (err == MP_OKAY)
64429 #endif /* !WOLFSSL_SP_SMALL */
64430     {
64431         sp_384_mul_6(s, s, p384_norm_order);
64432         err = sp_384_mod_6(s, s, p384_order);
64433     }
64434     if (err == MP_OKAY) {
64435         sp_384_norm_6(s);
64436 #ifdef WOLFSSL_SP_SMALL
64437         {
64438             sp_384_mont_inv_order_6(s, s, tmp);
64439             sp_384_mont_mul_order_6(u1, u1, s);
64440             sp_384_mont_mul_order_6(u2, u2, s);
64441         }
64442 #else
64443         {
64444             sp_384_mont_mul_order_6(u1, u1, s);
64445             sp_384_mont_mul_order_6(u2, u2, s);
64446         }
64447 #endif /* WOLFSSL_SP_SMALL */
64448         {
64449             err = sp_384_ecc_mulmod_base_6(p1, u1, 0, 0, heap);
64450         }
64451     }
64452     if ((err == MP_OKAY) && sp_384_iszero_6(p1->z)) {
64453         p1->infinity = 1;
64454     }
64455     if (err == MP_OKAY) {
64456             err = sp_384_ecc_mulmod_6(p2, p2, u2, 0, 0, heap);
64457     }
64458     if ((err == MP_OKAY) && sp_384_iszero_6(p2->z)) {
64459         p2->infinity = 1;
64460     }
64461 
64462     if (err == MP_OKAY) {
64463         sp_384_add_points_6(p1, p2, tmp);
64464     }
64465 
64466     return err;
64467 }
64468 
64469 #ifdef HAVE_ECC_VERIFY
64470 /* Verify the signature values with the hash and public key.
64471  *   e = Truncate(hash, 384)
64472  *   u1 = e/s mod order
64473  *   u2 = r/s mod order
64474  *   r == (u1.G + u2.Q)->x mod order
64475  * Optimization: Leave point in projective form.
64476  *   (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
64477  *   (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
64478  * The hash is truncated to the first 384 bits.
64479  *
64480  * hash     Hash to sign.
64481  * hashLen  Length of the hash data.
64482  * rng      Random number generator.
64483  * priv     Private part of key - scalar.
64484  * rm       First part of result as an mp_int.
64485  * sm       Sirst part of result as an mp_int.
64486  * heap     Heap to use for allocation.
64487  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
64488  */
64489 #ifdef WOLFSSL_SP_NONBLOCK
64490 typedef struct sp_ecc_verify_384_ctx {
64491     int state;
64492     union {
64493         sp_384_ecc_mulmod_6_ctx mulmod_ctx;
64494         sp_384_mont_inv_order_6_ctx mont_inv_order_ctx;
64495         sp_384_proj_point_dbl_6_ctx dbl_ctx;
64496         sp_384_proj_point_add_6_ctx add_ctx;
64497     };
64498     sp_digit u1[2*6];
64499     sp_digit u2[2*6];
64500     sp_digit s[2*6];
64501     sp_digit tmp[2*6 * 5];
64502     sp_point_384 p1;
64503     sp_point_384 p2;
64504 } sp_ecc_verify_384_ctx;
64505 
sp_ecc_verify_384_nb(sp_ecc_ctx_t * sp_ctx,const byte * hash,word32 hashLen,const mp_int * pX,const mp_int * pY,const mp_int * pZ,const mp_int * rm,const mp_int * sm,int * res,void * heap)64506 int sp_ecc_verify_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
64507     word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
64508     const mp_int* rm, const mp_int* sm, int* res, void* heap)
64509 {
64510     int err = FP_WOULDBLOCK;
64511     sp_ecc_verify_384_ctx* ctx = (sp_ecc_verify_384_ctx*)sp_ctx->data;
64512 
64513     typedef char ctx_size_test[sizeof(sp_ecc_verify_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
64514     (void)sizeof(ctx_size_test);
64515 
64516     switch (ctx->state) {
64517     case 0: /* INIT */
64518         if (hashLen > 48U) {
64519             hashLen = 48U;
64520         }
64521 
64522         sp_384_from_bin(ctx->u1, 6, hash, (int)hashLen);
64523         sp_384_from_mp(ctx->u2, 6, rm);
64524         sp_384_from_mp(ctx->s, 6, sm);
64525         sp_384_from_mp(ctx->p2.x, 6, pX);
64526         sp_384_from_mp(ctx->p2.y, 6, pY);
64527         sp_384_from_mp(ctx->p2.z, 6, pZ);
64528         ctx->state = 1;
64529         break;
64530     case 1: /* NORMS0 */
64531         sp_384_mul_6(ctx->s, ctx->s, p384_norm_order);
64532         err = sp_384_mod_6(ctx->s, ctx->s, p384_order);
64533         if (err == MP_OKAY)
64534             ctx->state = 2;
64535         break;
64536     case 2: /* NORMS1 */
64537         sp_384_norm_6(ctx->s);
64538         XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
64539         ctx->state = 3;
64540         break;
64541     case 3: /* NORMS2 */
64542         err = sp_384_mont_inv_order_6_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
64543         if (err == MP_OKAY) {
64544             ctx->state = 4;
64545         }
64546         break;
64547     case 4: /* NORMS3 */
64548         sp_384_mont_mul_order_6(ctx->u1, ctx->u1, ctx->s);
64549         ctx->state = 5;
64550         break;
64551     case 5: /* NORMS4 */
64552         sp_384_mont_mul_order_6(ctx->u2, ctx->u2, ctx->s);
64553         XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
64554         ctx->state = 6;
64555         break;
64556     case 6: /* MULBASE */
64557         err = sp_384_ecc_mulmod_6_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p384_base, ctx->u1, 0, 0, heap);
64558         if (err == MP_OKAY) {
64559             if (sp_384_iszero_6(ctx->p1.z)) {
64560                 ctx->p1.infinity = 1;
64561             }
64562             XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
64563             ctx->state = 7;
64564         }
64565         break;
64566     case 7: /* MULMOD */
64567         err = sp_384_ecc_mulmod_6_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
64568         if (err == MP_OKAY) {
64569             if (sp_384_iszero_6(ctx->p2.z)) {
64570                 ctx->p2.infinity = 1;
64571             }
64572             XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
64573             ctx->state = 8;
64574         }
64575         break;
64576     case 8: /* ADD */
64577         err = sp_384_proj_point_add_6_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
64578         if (err == MP_OKAY)
64579             ctx->state = 9;
64580         break;
64581     case 9: /* MONT */
64582         /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
64583         /* Reload r and convert to Montgomery form. */
64584         sp_384_from_mp(ctx->u2, 6, rm);
64585         err = sp_384_mod_mul_norm_6(ctx->u2, ctx->u2, p384_mod);
64586         if (err == MP_OKAY)
64587             ctx->state = 10;
64588         break;
64589     case 10: /* SQR */
64590         /* u1 = r.z'.z' mod prime */
64591         sp_384_mont_sqr_6(ctx->p1.z, ctx->p1.z, p384_mod, p384_mp_mod);
64592         ctx->state = 11;
64593         break;
64594     case 11: /* MUL */
64595         sp_384_mont_mul_6(ctx->u1, ctx->u2, ctx->p1.z, p384_mod, p384_mp_mod);
64596         ctx->state = 12;
64597         break;
64598     case 12: /* RES */
64599     {
64600         sp_int64 c = 0;
64601         err = MP_OKAY; /* math okay, now check result */
64602         *res = (int)(sp_384_cmp_6(ctx->p1.x, ctx->u1) == 0);
64603         if (*res == 0) {
64604             sp_digit carry;
64605 
64606             /* Reload r and add order. */
64607             sp_384_from_mp(ctx->u2, 6, rm);
64608             carry = sp_384_add_6(ctx->u2, ctx->u2, p384_order);
64609             /* Carry means result is greater than mod and is not valid. */
64610             if (carry == 0) {
64611                 sp_384_norm_6(ctx->u2);
64612 
64613                 /* Compare with mod and if greater or equal then not valid. */
64614                 c = sp_384_cmp_6(ctx->u2, p384_mod);
64615             }
64616         }
64617         if ((*res == 0) && (c < 0)) {
64618             /* Convert to Montogomery form */
64619             err = sp_384_mod_mul_norm_6(ctx->u2, ctx->u2, p384_mod);
64620             if (err == MP_OKAY) {
64621                 /* u1 = (r + 1*order).z'.z' mod prime */
64622                 sp_384_mont_mul_6(ctx->u1, ctx->u2, ctx->p1.z, p384_mod,
64623                                                             p384_mp_mod);
64624                 *res = (int)(sp_384_cmp_6(ctx->p1.x, ctx->u1) == 0);
64625             }
64626         }
64627         break;
64628     }
64629     } /* switch */
64630 
64631     if (err == MP_OKAY && ctx->state != 12) {
64632         err = FP_WOULDBLOCK;
64633     }
64634 
64635     return err;
64636 }
64637 #endif /* WOLFSSL_SP_NONBLOCK */
64638 
sp_ecc_verify_384(const byte * hash,word32 hashLen,const mp_int * pX,const mp_int * pY,const mp_int * pZ,const mp_int * rm,const mp_int * sm,int * res,void * heap)64639 int sp_ecc_verify_384(const byte* hash, word32 hashLen, const mp_int* pX,
64640     const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
64641     int* res, void* heap)
64642 {
64643 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64644     sp_digit* u1 = NULL;
64645     sp_point_384* p1 = NULL;
64646 #else
64647     sp_digit  u1[16 * 6];
64648     sp_point_384 p1[2];
64649 #endif
64650     sp_digit* u2 = NULL;
64651     sp_digit* s = NULL;
64652     sp_digit* tmp = NULL;
64653     sp_point_384* p2 = NULL;
64654     sp_digit carry;
64655     sp_int64 c = 0;
64656     int err = MP_OKAY;
64657 
64658 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64659     if (err == MP_OKAY) {
64660         p1 = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
64661                                              DYNAMIC_TYPE_ECC);
64662         if (p1 == NULL)
64663             err = MEMORY_E;
64664     }
64665     if (err == MP_OKAY) {
64666         u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 6, heap,
64667                                                               DYNAMIC_TYPE_ECC);
64668         if (u1 == NULL)
64669             err = MEMORY_E;
64670     }
64671 #endif
64672 
64673     if (err == MP_OKAY) {
64674         u2  = u1 + 2 * 6;
64675         s   = u1 + 4 * 6;
64676         tmp = u1 + 6 * 6;
64677         p2 = p1 + 1;
64678 
64679         if (hashLen > 48U) {
64680             hashLen = 48U;
64681         }
64682 
64683         sp_384_from_bin(u1, 6, hash, (int)hashLen);
64684         sp_384_from_mp(u2, 6, rm);
64685         sp_384_from_mp(s, 6, sm);
64686         sp_384_from_mp(p2->x, 6, pX);
64687         sp_384_from_mp(p2->y, 6, pY);
64688         sp_384_from_mp(p2->z, 6, pZ);
64689 
64690         err = sp_384_calc_vfy_point_6(p1, p2, s, u1, u2, tmp, heap);
64691     }
64692     if (err == MP_OKAY) {
64693         /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
64694         /* Reload r and convert to Montgomery form. */
64695         sp_384_from_mp(u2, 6, rm);
64696         err = sp_384_mod_mul_norm_6(u2, u2, p384_mod);
64697     }
64698 
64699     if (err == MP_OKAY) {
64700         /* u1 = r.z'.z' mod prime */
64701         sp_384_mont_sqr_6(p1->z, p1->z, p384_mod, p384_mp_mod);
64702         sp_384_mont_mul_6(u1, u2, p1->z, p384_mod, p384_mp_mod);
64703         *res = (int)(sp_384_cmp_6(p1->x, u1) == 0);
64704         if (*res == 0) {
64705             /* Reload r and add order. */
64706             sp_384_from_mp(u2, 6, rm);
64707             carry = sp_384_add_6(u2, u2, p384_order);
64708             /* Carry means result is greater than mod and is not valid. */
64709             if (carry == 0) {
64710                 sp_384_norm_6(u2);
64711 
64712                 /* Compare with mod and if greater or equal then not valid. */
64713                 c = sp_384_cmp_6(u2, p384_mod);
64714             }
64715         }
64716         if ((*res == 0) && (c < 0)) {
64717             /* Convert to Montogomery form */
64718             err = sp_384_mod_mul_norm_6(u2, u2, p384_mod);
64719             if (err == MP_OKAY) {
64720                 /* u1 = (r + 1*order).z'.z' mod prime */
64721                 sp_384_mont_mul_6(u1, u2, p1->z, p384_mod,
64722                     p384_mp_mod);
64723                 *res = (sp_384_cmp_6(p1->x, u1) == 0);
64724             }
64725         }
64726     }
64727 
64728 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64729     if (u1 != NULL)
64730         XFREE(u1, heap, DYNAMIC_TYPE_ECC);
64731     if (p1 != NULL)
64732         XFREE(p1, heap, DYNAMIC_TYPE_ECC);
64733 #endif
64734 
64735     return err;
64736 }
64737 #endif /* HAVE_ECC_VERIFY */
64738 
64739 #ifdef HAVE_ECC_CHECK_KEY
64740 /* Check that the x and y oridinates are a valid point on the curve.
64741  *
64742  * point  EC point.
64743  * heap   Heap to use if dynamically allocating.
64744  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
64745  * not on the curve and MP_OKAY otherwise.
64746  */
sp_384_ecc_is_point_6(const sp_point_384 * point,void * heap)64747 static int sp_384_ecc_is_point_6(const sp_point_384* point,
64748     void* heap)
64749 {
64750 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64751     sp_digit* t1 = NULL;
64752 #else
64753     sp_digit t1[6 * 4];
64754 #endif
64755     sp_digit* t2 = NULL;
64756     int err = MP_OKAY;
64757 
64758 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64759     t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 4, heap, DYNAMIC_TYPE_ECC);
64760     if (t1 == NULL)
64761         err = MEMORY_E;
64762 #endif
64763     (void)heap;
64764 
64765     if (err == MP_OKAY) {
64766         t2 = t1 + 2 * 6;
64767 
64768         sp_384_sqr_6(t1, point->y);
64769         (void)sp_384_mod_6(t1, t1, p384_mod);
64770         sp_384_sqr_6(t2, point->x);
64771         (void)sp_384_mod_6(t2, t2, p384_mod);
64772         sp_384_mul_6(t2, t2, point->x);
64773         (void)sp_384_mod_6(t2, t2, p384_mod);
64774         (void)sp_384_sub_6(t2, p384_mod, t2);
64775         sp_384_mont_add_6(t1, t1, t2, p384_mod);
64776 
64777         sp_384_mont_add_6(t1, t1, point->x, p384_mod);
64778         sp_384_mont_add_6(t1, t1, point->x, p384_mod);
64779         sp_384_mont_add_6(t1, t1, point->x, p384_mod);
64780 
64781         if (sp_384_cmp_6(t1, p384_b) != 0) {
64782             err = MP_VAL;
64783         }
64784     }
64785 
64786 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64787     if (t1 != NULL)
64788         XFREE(t1, heap, DYNAMIC_TYPE_ECC);
64789 #endif
64790 
64791     return err;
64792 }
64793 
64794 /* Check that the x and y oridinates are a valid point on the curve.
64795  *
64796  * pX  X ordinate of EC point.
64797  * pY  Y ordinate of EC point.
64798  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
64799  * not on the curve and MP_OKAY otherwise.
64800  */
sp_ecc_is_point_384(const mp_int * pX,const mp_int * pY)64801 int sp_ecc_is_point_384(const mp_int* pX, const mp_int* pY)
64802 {
64803 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64804     sp_point_384* pub = NULL;
64805 #else
64806     sp_point_384 pub[1];
64807 #endif
64808     const byte one[1] = { 1 };
64809     int err = MP_OKAY;
64810 
64811 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64812     pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
64813                                        DYNAMIC_TYPE_ECC);
64814     if (pub == NULL)
64815         err = MEMORY_E;
64816 #endif
64817 
64818     if (err == MP_OKAY) {
64819         sp_384_from_mp(pub->x, 6, pX);
64820         sp_384_from_mp(pub->y, 6, pY);
64821         sp_384_from_bin(pub->z, 6, one, (int)sizeof(one));
64822 
64823         err = sp_384_ecc_is_point_6(pub, NULL);
64824     }
64825 
64826 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64827     if (pub != NULL)
64828         XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
64829 #endif
64830 
64831     return err;
64832 }
64833 
64834 /* Check that the private scalar generates the EC point (px, py), the point is
64835  * on the curve and the point has the correct order.
64836  *
64837  * pX     X ordinate of EC point.
64838  * pY     Y ordinate of EC point.
64839  * privm  Private scalar that generates EC point.
64840  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
64841  * not on the curve, ECC_INF_E if the point does not have the correct order,
64842  * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
64843  * MP_OKAY otherwise.
64844  */
sp_ecc_check_key_384(const mp_int * pX,const mp_int * pY,const mp_int * privm,void * heap)64845 int sp_ecc_check_key_384(const mp_int* pX, const mp_int* pY,
64846     const mp_int* privm, void* heap)
64847 {
64848 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64849     sp_digit* priv = NULL;
64850     sp_point_384* pub = NULL;
64851 #else
64852     sp_digit priv[6];
64853     sp_point_384 pub[2];
64854 #endif
64855     sp_point_384* p = NULL;
64856     const byte one[1] = { 1 };
64857     int err = MP_OKAY;
64858 
64859 
64860     /* Quick check the lengs of public key ordinates and private key are in
64861      * range. Proper check later.
64862      */
64863     if (((mp_count_bits(pX) > 384) ||
64864         (mp_count_bits(pY) > 384) ||
64865         ((privm != NULL) && (mp_count_bits(privm) > 384)))) {
64866         err = ECC_OUT_OF_RANGE_E;
64867     }
64868 
64869 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64870     if (err == MP_OKAY) {
64871         pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
64872                                            DYNAMIC_TYPE_ECC);
64873         if (pub == NULL)
64874             err = MEMORY_E;
64875     }
64876     if (err == MP_OKAY && privm) {
64877         priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6, heap,
64878                                   DYNAMIC_TYPE_ECC);
64879         if (priv == NULL)
64880             err = MEMORY_E;
64881     }
64882 #endif
64883 
64884     if (err == MP_OKAY) {
64885         p = pub + 1;
64886 
64887         sp_384_from_mp(pub->x, 6, pX);
64888         sp_384_from_mp(pub->y, 6, pY);
64889         sp_384_from_bin(pub->z, 6, one, (int)sizeof(one));
64890         if (privm)
64891             sp_384_from_mp(priv, 6, privm);
64892 
64893         /* Check point at infinitiy. */
64894         if ((sp_384_iszero_6(pub->x) != 0) &&
64895             (sp_384_iszero_6(pub->y) != 0)) {
64896             err = ECC_INF_E;
64897         }
64898     }
64899 
64900     /* Check range of X and Y */
64901     if ((err == MP_OKAY) &&
64902             ((sp_384_cmp_6(pub->x, p384_mod) >= 0) ||
64903              (sp_384_cmp_6(pub->y, p384_mod) >= 0))) {
64904         err = ECC_OUT_OF_RANGE_E;
64905     }
64906 
64907     if (err == MP_OKAY) {
64908         /* Check point is on curve */
64909         err = sp_384_ecc_is_point_6(pub, heap);
64910     }
64911 
64912     if (err == MP_OKAY) {
64913         /* Point * order = infinity */
64914             err = sp_384_ecc_mulmod_6(p, pub, p384_order, 1, 1, heap);
64915     }
64916     /* Check result is infinity */
64917     if ((err == MP_OKAY) && ((sp_384_iszero_6(p->x) == 0) ||
64918                              (sp_384_iszero_6(p->y) == 0))) {
64919         err = ECC_INF_E;
64920     }
64921 
64922     if (privm) {
64923         if (err == MP_OKAY) {
64924             /* Base * private = point */
64925                 err = sp_384_ecc_mulmod_base_6(p, priv, 1, 1, heap);
64926         }
64927         /* Check result is public key */
64928         if ((err == MP_OKAY) &&
64929                 ((sp_384_cmp_6(p->x, pub->x) != 0) ||
64930                  (sp_384_cmp_6(p->y, pub->y) != 0))) {
64931             err = ECC_PRIV_KEY_E;
64932         }
64933     }
64934 
64935 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64936     if (pub != NULL)
64937         XFREE(pub, heap, DYNAMIC_TYPE_ECC);
64938     if (priv != NULL)
64939         XFREE(priv, heap, DYNAMIC_TYPE_ECC);
64940 #endif
64941 
64942     return err;
64943 }
64944 #endif
64945 #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
64946 /* Add two projective EC points together.
64947  * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
64948  *
64949  * pX   First EC point's X ordinate.
64950  * pY   First EC point's Y ordinate.
64951  * pZ   First EC point's Z ordinate.
64952  * qX   Second EC point's X ordinate.
64953  * qY   Second EC point's Y ordinate.
64954  * qZ   Second EC point's Z ordinate.
64955  * rX   Resultant EC point's X ordinate.
64956  * rY   Resultant EC point's Y ordinate.
64957  * rZ   Resultant EC point's Z ordinate.
64958  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
64959  */
sp_ecc_proj_add_point_384(mp_int * pX,mp_int * pY,mp_int * pZ,mp_int * qX,mp_int * qY,mp_int * qZ,mp_int * rX,mp_int * rY,mp_int * rZ)64960 int sp_ecc_proj_add_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
64961                               mp_int* qX, mp_int* qY, mp_int* qZ,
64962                               mp_int* rX, mp_int* rY, mp_int* rZ)
64963 {
64964 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64965     sp_digit* tmp = NULL;
64966     sp_point_384* p = NULL;
64967 #else
64968     sp_digit tmp[2 * 6 * 5];
64969     sp_point_384 p[2];
64970 #endif
64971     sp_point_384* q = NULL;
64972     int err = MP_OKAY;
64973 
64974 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
64975     if (err == MP_OKAY) {
64976         p = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, NULL,
64977                                          DYNAMIC_TYPE_ECC);
64978         if (p == NULL)
64979             err = MEMORY_E;
64980     }
64981     if (err == MP_OKAY) {
64982         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 6 * 5, NULL,
64983                                  DYNAMIC_TYPE_ECC);
64984         if (tmp == NULL) {
64985             err = MEMORY_E;
64986         }
64987     }
64988 #endif
64989 
64990     if (err == MP_OKAY) {
64991         q = p + 1;
64992 
64993         sp_384_from_mp(p->x, 6, pX);
64994         sp_384_from_mp(p->y, 6, pY);
64995         sp_384_from_mp(p->z, 6, pZ);
64996         sp_384_from_mp(q->x, 6, qX);
64997         sp_384_from_mp(q->y, 6, qY);
64998         sp_384_from_mp(q->z, 6, qZ);
64999         p->infinity = sp_384_iszero_6(p->x) &
65000                       sp_384_iszero_6(p->y);
65001         q->infinity = sp_384_iszero_6(q->x) &
65002                       sp_384_iszero_6(q->y);
65003 
65004             sp_384_proj_point_add_6(p, p, q, tmp);
65005     }
65006 
65007     if (err == MP_OKAY) {
65008         err = sp_384_to_mp(p->x, rX);
65009     }
65010     if (err == MP_OKAY) {
65011         err = sp_384_to_mp(p->y, rY);
65012     }
65013     if (err == MP_OKAY) {
65014         err = sp_384_to_mp(p->z, rZ);
65015     }
65016 
65017 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65018     if (tmp != NULL)
65019         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
65020     if (p != NULL)
65021         XFREE(p, NULL, DYNAMIC_TYPE_ECC);
65022 #endif
65023 
65024     return err;
65025 }
65026 
65027 /* Double a projective EC point.
65028  * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
65029  *
65030  * pX   EC point's X ordinate.
65031  * pY   EC point's Y ordinate.
65032  * pZ   EC point's Z ordinate.
65033  * rX   Resultant EC point's X ordinate.
65034  * rY   Resultant EC point's Y ordinate.
65035  * rZ   Resultant EC point's Z ordinate.
65036  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
65037  */
sp_ecc_proj_dbl_point_384(mp_int * pX,mp_int * pY,mp_int * pZ,mp_int * rX,mp_int * rY,mp_int * rZ)65038 int sp_ecc_proj_dbl_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
65039                               mp_int* rX, mp_int* rY, mp_int* rZ)
65040 {
65041 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65042     sp_digit* tmp = NULL;
65043     sp_point_384* p = NULL;
65044 #else
65045     sp_digit tmp[2 * 6 * 2];
65046     sp_point_384 p[1];
65047 #endif
65048     int err = MP_OKAY;
65049 
65050 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65051     if (err == MP_OKAY) {
65052         p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
65053                                          DYNAMIC_TYPE_ECC);
65054         if (p == NULL)
65055             err = MEMORY_E;
65056     }
65057     if (err == MP_OKAY) {
65058         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 6 * 2, NULL,
65059                                  DYNAMIC_TYPE_ECC);
65060         if (tmp == NULL)
65061             err = MEMORY_E;
65062     }
65063 #endif
65064 
65065     if (err == MP_OKAY) {
65066         sp_384_from_mp(p->x, 6, pX);
65067         sp_384_from_mp(p->y, 6, pY);
65068         sp_384_from_mp(p->z, 6, pZ);
65069         p->infinity = sp_384_iszero_6(p->x) &
65070                       sp_384_iszero_6(p->y);
65071 
65072             sp_384_proj_point_dbl_6(p, p, tmp);
65073     }
65074 
65075     if (err == MP_OKAY) {
65076         err = sp_384_to_mp(p->x, rX);
65077     }
65078     if (err == MP_OKAY) {
65079         err = sp_384_to_mp(p->y, rY);
65080     }
65081     if (err == MP_OKAY) {
65082         err = sp_384_to_mp(p->z, rZ);
65083     }
65084 
65085 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65086     if (tmp != NULL)
65087         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
65088     if (p != NULL)
65089         XFREE(p, NULL, DYNAMIC_TYPE_ECC);
65090 #endif
65091 
65092     return err;
65093 }
65094 
65095 /* Map a projective EC point to affine in place.
65096  * pZ will be one.
65097  *
65098  * pX   EC point's X ordinate.
65099  * pY   EC point's Y ordinate.
65100  * pZ   EC point's Z ordinate.
65101  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
65102  */
sp_ecc_map_384(mp_int * pX,mp_int * pY,mp_int * pZ)65103 int sp_ecc_map_384(mp_int* pX, mp_int* pY, mp_int* pZ)
65104 {
65105 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65106     sp_digit* tmp = NULL;
65107     sp_point_384* p = NULL;
65108 #else
65109     sp_digit tmp[2 * 6 * 6];
65110     sp_point_384 p[1];
65111 #endif
65112     int err = MP_OKAY;
65113 
65114 
65115 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65116     if (err == MP_OKAY) {
65117         p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
65118                                          DYNAMIC_TYPE_ECC);
65119         if (p == NULL)
65120             err = MEMORY_E;
65121     }
65122     if (err == MP_OKAY) {
65123         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 6 * 6, NULL,
65124                                  DYNAMIC_TYPE_ECC);
65125         if (tmp == NULL)
65126             err = MEMORY_E;
65127     }
65128 #endif
65129     if (err == MP_OKAY) {
65130         sp_384_from_mp(p->x, 6, pX);
65131         sp_384_from_mp(p->y, 6, pY);
65132         sp_384_from_mp(p->z, 6, pZ);
65133         p->infinity = sp_384_iszero_6(p->x) &
65134                       sp_384_iszero_6(p->y);
65135 
65136             sp_384_map_6(p, p, tmp);
65137     }
65138 
65139     if (err == MP_OKAY) {
65140         err = sp_384_to_mp(p->x, pX);
65141     }
65142     if (err == MP_OKAY) {
65143         err = sp_384_to_mp(p->y, pY);
65144     }
65145     if (err == MP_OKAY) {
65146         err = sp_384_to_mp(p->z, pZ);
65147     }
65148 
65149 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65150     if (tmp != NULL)
65151         XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
65152     if (p != NULL)
65153         XFREE(p, NULL, DYNAMIC_TYPE_ECC);
65154 #endif
65155 
65156     return err;
65157 }
65158 #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
65159 #ifdef HAVE_COMP_KEY
65160 /* Find the square root of a number mod the prime of the curve.
65161  *
65162  * y  The number to operate on and the result.
65163  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
65164  */
sp_384_mont_sqrt_6(sp_digit * y)65165 static int sp_384_mont_sqrt_6(sp_digit* y)
65166 {
65167 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65168     sp_digit* t1 = NULL;
65169 #else
65170     sp_digit t1[5 * 2 * 6];
65171 #endif
65172     sp_digit* t2 = NULL;
65173     sp_digit* t3 = NULL;
65174     sp_digit* t4 = NULL;
65175     sp_digit* t5 = NULL;
65176     int err = MP_OKAY;
65177 
65178 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65179     t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 6, NULL, DYNAMIC_TYPE_ECC);
65180     if (t1 == NULL)
65181         err = MEMORY_E;
65182 #endif
65183 
65184     if (err == MP_OKAY) {
65185         t2 = t1 + 2 * 6;
65186         t3 = t1 + 4 * 6;
65187         t4 = t1 + 6 * 6;
65188         t5 = t1 + 8 * 6;
65189 
65190         {
65191             /* t2 = y ^ 0x2 */
65192             sp_384_mont_sqr_6(t2, y, p384_mod, p384_mp_mod);
65193             /* t1 = y ^ 0x3 */
65194             sp_384_mont_mul_6(t1, t2, y, p384_mod, p384_mp_mod);
65195             /* t5 = y ^ 0xc */
65196             sp_384_mont_sqr_n_6(t5, t1, 2, p384_mod, p384_mp_mod);
65197             /* t1 = y ^ 0xf */
65198             sp_384_mont_mul_6(t1, t1, t5, p384_mod, p384_mp_mod);
65199             /* t2 = y ^ 0x1e */
65200             sp_384_mont_sqr_6(t2, t1, p384_mod, p384_mp_mod);
65201             /* t3 = y ^ 0x1f */
65202             sp_384_mont_mul_6(t3, t2, y, p384_mod, p384_mp_mod);
65203             /* t2 = y ^ 0x3e0 */
65204             sp_384_mont_sqr_n_6(t2, t3, 5, p384_mod, p384_mp_mod);
65205             /* t1 = y ^ 0x3ff */
65206             sp_384_mont_mul_6(t1, t3, t2, p384_mod, p384_mp_mod);
65207             /* t2 = y ^ 0x7fe0 */
65208             sp_384_mont_sqr_n_6(t2, t1, 5, p384_mod, p384_mp_mod);
65209             /* t3 = y ^ 0x7fff */
65210             sp_384_mont_mul_6(t3, t3, t2, p384_mod, p384_mp_mod);
65211             /* t2 = y ^ 0x3fff800 */
65212             sp_384_mont_sqr_n_6(t2, t3, 15, p384_mod, p384_mp_mod);
65213             /* t4 = y ^ 0x3ffffff */
65214             sp_384_mont_mul_6(t4, t3, t2, p384_mod, p384_mp_mod);
65215             /* t2 = y ^ 0xffffffc000000 */
65216             sp_384_mont_sqr_n_6(t2, t4, 30, p384_mod, p384_mp_mod);
65217             /* t1 = y ^ 0xfffffffffffff */
65218             sp_384_mont_mul_6(t1, t4, t2, p384_mod, p384_mp_mod);
65219             /* t2 = y ^ 0xfffffffffffffff000000000000000 */
65220             sp_384_mont_sqr_n_6(t2, t1, 60, p384_mod, p384_mp_mod);
65221             /* t1 = y ^ 0xffffffffffffffffffffffffffffff */
65222             sp_384_mont_mul_6(t1, t1, t2, p384_mod, p384_mp_mod);
65223             /* t2 = y ^ 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
65224             sp_384_mont_sqr_n_6(t2, t1, 120, p384_mod, p384_mp_mod);
65225             /* t1 = y ^ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
65226             sp_384_mont_mul_6(t1, t1, t2, p384_mod, p384_mp_mod);
65227             /* t2 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
65228             sp_384_mont_sqr_n_6(t2, t1, 15, p384_mod, p384_mp_mod);
65229             /* t1 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
65230             sp_384_mont_mul_6(t1, t3, t2, p384_mod, p384_mp_mod);
65231             /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 */
65232             sp_384_mont_sqr_n_6(t2, t1, 31, p384_mod, p384_mp_mod);
65233             /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff */
65234             sp_384_mont_mul_6(t1, t4, t2, p384_mod, p384_mp_mod);
65235             /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff0 */
65236             sp_384_mont_sqr_n_6(t2, t1, 4, p384_mod, p384_mp_mod);
65237             /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc */
65238             sp_384_mont_mul_6(t1, t5, t2, p384_mod, p384_mp_mod);
65239             /* t2 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000 */
65240             sp_384_mont_sqr_n_6(t2, t1, 62, p384_mod, p384_mp_mod);
65241             /* t1 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001 */
65242             sp_384_mont_mul_6(t1, y, t2, p384_mod, p384_mp_mod);
65243             /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 */
65244             sp_384_mont_sqr_n_6(y, t1, 30, p384_mod, p384_mp_mod);
65245         }
65246     }
65247 
65248 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65249     if (t1 != NULL)
65250         XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
65251 #endif
65252 
65253     return err;
65254 }
65255 
65256 
65257 /* Uncompress the point given the X ordinate.
65258  *
65259  * xm    X ordinate.
65260  * odd   Whether the Y ordinate is odd.
65261  * ym    Calculated Y ordinate.
65262  * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
65263  */
sp_ecc_uncompress_384(mp_int * xm,int odd,mp_int * ym)65264 int sp_ecc_uncompress_384(mp_int* xm, int odd, mp_int* ym)
65265 {
65266 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65267     sp_digit* x = NULL;
65268 #else
65269     sp_digit x[4 * 6];
65270 #endif
65271     sp_digit* y = NULL;
65272     int err = MP_OKAY;
65273 
65274 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65275     x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 6, NULL, DYNAMIC_TYPE_ECC);
65276     if (x == NULL)
65277         err = MEMORY_E;
65278 #endif
65279 
65280     if (err == MP_OKAY) {
65281         y = x + 2 * 6;
65282 
65283         sp_384_from_mp(x, 6, xm);
65284         err = sp_384_mod_mul_norm_6(x, x, p384_mod);
65285     }
65286     if (err == MP_OKAY) {
65287         /* y = x^3 */
65288         {
65289             sp_384_mont_sqr_6(y, x, p384_mod, p384_mp_mod);
65290             sp_384_mont_mul_6(y, y, x, p384_mod, p384_mp_mod);
65291         }
65292         /* y = x^3 - 3x */
65293         sp_384_mont_sub_6(y, y, x, p384_mod);
65294         sp_384_mont_sub_6(y, y, x, p384_mod);
65295         sp_384_mont_sub_6(y, y, x, p384_mod);
65296         /* y = x^3 - 3x + b */
65297         err = sp_384_mod_mul_norm_6(x, p384_b, p384_mod);
65298     }
65299     if (err == MP_OKAY) {
65300         sp_384_mont_add_6(y, y, x, p384_mod);
65301         /* y = sqrt(x^3 - 3x + b) */
65302         err = sp_384_mont_sqrt_6(y);
65303     }
65304     if (err == MP_OKAY) {
65305         XMEMSET(y + 6, 0, 6U * sizeof(sp_digit));
65306         sp_384_mont_reduce_6(y, p384_mod, p384_mp_mod);
65307         if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
65308             sp_384_mont_sub_6(y, p384_mod, y, p384_mod);
65309         }
65310 
65311         err = sp_384_to_mp(y, ym);
65312     }
65313 
65314 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
65315     if (x != NULL)
65316         XFREE(x, NULL, DYNAMIC_TYPE_ECC);
65317 #endif
65318 
65319     return err;
65320 }
65321 #endif
65322 #endif /* WOLFSSL_SP_384 */
65323 #ifdef WOLFSSL_SP_1024
65324 
65325 /* Point structure to use. */
65326 typedef struct sp_point_1024 {
65327     /* X ordinate of point. */
65328     sp_digit x[2 * 16];
65329     /* Y ordinate of point. */
65330     sp_digit y[2 * 16];
65331     /* Z ordinate of point. */
65332     sp_digit z[2 * 16];
65333     /* Indicates point is at infinity. */
65334     int infinity;
65335 } sp_point_1024;
65336 
65337 #ifndef WOLFSSL_SP_SMALL
65338 /* Multiply a and b into r. (r = a * b)
65339  *
65340  * r  A single precision integer.
65341  * a  A single precision integer.
65342  * b  A single precision integer.
65343  */
sp_1024_mul_8(sp_digit * r,const sp_digit * a,const sp_digit * b)65344 static void sp_1024_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
65345 {
65346     __asm__ __volatile__ (
65347         "ldp	x8, x9, [%[a], 0]\n\t"
65348         "ldp	x10, x11, [%[a], 16]\n\t"
65349         "ldp	x12, x13, [%[a], 32]\n\t"
65350         "ldp	x14, x15, [%[a], 48]\n\t"
65351         "ldp	x16, x17, [%[b], 0]\n\t"
65352         "ldp	x19, x20, [%[b], 16]\n\t"
65353         "ldp	x21, x22, [%[b], 32]\n\t"
65354         "ldp	x23, x24, [%[b], 48]\n\t"
65355         "#  A[0] * B[0]\n\t"
65356         "mul	x3, x8, x16\n\t"
65357         "umulh	x4, x8, x16\n\t"
65358         "str	x3, [%[r]]\n\t"
65359         "#  A[0] * B[1]\n\t"
65360         "mul	x6, x8, x17\n\t"
65361         "umulh	x7, x8, x17\n\t"
65362         "adds	x4, x4, x6\n\t"
65363         "#  A[1] * B[0]\n\t"
65364         "mul	x6, x9, x16\n\t"
65365         "adc	x5, xzr, x7\n\t"
65366         "umulh	x7, x9, x16\n\t"
65367         "adds	x4, x4, x6\n\t"
65368         "adcs	x5, x5, x7\n\t"
65369         "str	x4, [%[r], 8]\n\t"
65370         "adc	x3, xzr, xzr\n\t"
65371         "#  A[0] * B[2]\n\t"
65372         "mul	x6, x8, x19\n\t"
65373         "umulh	x7, x8, x19\n\t"
65374         "adds	x5, x5, x6\n\t"
65375         "#  A[1] * B[1]\n\t"
65376         "mul	x6, x9, x17\n\t"
65377         "adcs	x3, x3, x7\n\t"
65378         "umulh	x7, x9, x17\n\t"
65379         "adc	x4, xzr, xzr\n\t"
65380         "adds	x5, x5, x6\n\t"
65381         "#  A[2] * B[0]\n\t"
65382         "mul	x6, x10, x16\n\t"
65383         "adcs	x3, x3, x7\n\t"
65384         "umulh	x7, x10, x16\n\t"
65385         "adc	x4, x4, xzr\n\t"
65386         "adds	x5, x5, x6\n\t"
65387         "adcs	x3, x3, x7\n\t"
65388         "str	x5, [%[r], 16]\n\t"
65389         "adc	x4, x4, xzr\n\t"
65390         "#  A[0] * B[3]\n\t"
65391         "mul	x6, x8, x20\n\t"
65392         "umulh	x7, x8, x20\n\t"
65393         "adds	x3, x3, x6\n\t"
65394         "#  A[1] * B[2]\n\t"
65395         "mul	x6, x9, x19\n\t"
65396         "adcs	x4, x4, x7\n\t"
65397         "umulh	x7, x9, x19\n\t"
65398         "adc	x5, xzr, xzr\n\t"
65399         "adds	x3, x3, x6\n\t"
65400         "#  A[2] * B[1]\n\t"
65401         "mul	x6, x10, x17\n\t"
65402         "adcs	x4, x4, x7\n\t"
65403         "umulh	x7, x10, x17\n\t"
65404         "adc	x5, x5, xzr\n\t"
65405         "adds	x3, x3, x6\n\t"
65406         "#  A[3] * B[0]\n\t"
65407         "mul	x6, x11, x16\n\t"
65408         "adcs	x4, x4, x7\n\t"
65409         "umulh	x7, x11, x16\n\t"
65410         "adc	x5, x5, xzr\n\t"
65411         "adds	x3, x3, x6\n\t"
65412         "adcs	x4, x4, x7\n\t"
65413         "str	x3, [%[r], 24]\n\t"
65414         "adc	x5, x5, xzr\n\t"
65415         "#  A[0] * B[4]\n\t"
65416         "mul	x6, x8, x21\n\t"
65417         "umulh	x7, x8, x21\n\t"
65418         "adds	x4, x4, x6\n\t"
65419         "#  A[1] * B[3]\n\t"
65420         "mul	x6, x9, x20\n\t"
65421         "adcs	x5, x5, x7\n\t"
65422         "umulh	x7, x9, x20\n\t"
65423         "adc	x3, xzr, xzr\n\t"
65424         "adds	x4, x4, x6\n\t"
65425         "#  A[2] * B[2]\n\t"
65426         "mul	x6, x10, x19\n\t"
65427         "adcs	x5, x5, x7\n\t"
65428         "umulh	x7, x10, x19\n\t"
65429         "adc	x3, x3, xzr\n\t"
65430         "adds	x4, x4, x6\n\t"
65431         "#  A[3] * B[1]\n\t"
65432         "mul	x6, x11, x17\n\t"
65433         "adcs	x5, x5, x7\n\t"
65434         "umulh	x7, x11, x17\n\t"
65435         "adc	x3, x3, xzr\n\t"
65436         "adds	x4, x4, x6\n\t"
65437         "#  A[4] * B[0]\n\t"
65438         "mul	x6, x12, x16\n\t"
65439         "adcs	x5, x5, x7\n\t"
65440         "umulh	x7, x12, x16\n\t"
65441         "adc	x3, x3, xzr\n\t"
65442         "adds	x4, x4, x6\n\t"
65443         "adcs	x5, x5, x7\n\t"
65444         "str	x4, [%[r], 32]\n\t"
65445         "adc	x3, x3, xzr\n\t"
65446         "#  A[0] * B[5]\n\t"
65447         "mul	x6, x8, x22\n\t"
65448         "umulh	x7, x8, x22\n\t"
65449         "adds	x5, x5, x6\n\t"
65450         "#  A[1] * B[4]\n\t"
65451         "mul	x6, x9, x21\n\t"
65452         "adcs	x3, x3, x7\n\t"
65453         "umulh	x7, x9, x21\n\t"
65454         "adc	x4, xzr, xzr\n\t"
65455         "adds	x5, x5, x6\n\t"
65456         "#  A[2] * B[3]\n\t"
65457         "mul	x6, x10, x20\n\t"
65458         "adcs	x3, x3, x7\n\t"
65459         "umulh	x7, x10, x20\n\t"
65460         "adc	x4, x4, xzr\n\t"
65461         "adds	x5, x5, x6\n\t"
65462         "#  A[3] * B[2]\n\t"
65463         "mul	x6, x11, x19\n\t"
65464         "adcs	x3, x3, x7\n\t"
65465         "umulh	x7, x11, x19\n\t"
65466         "adc	x4, x4, xzr\n\t"
65467         "adds	x5, x5, x6\n\t"
65468         "#  A[4] * B[1]\n\t"
65469         "mul	x6, x12, x17\n\t"
65470         "adcs	x3, x3, x7\n\t"
65471         "umulh	x7, x12, x17\n\t"
65472         "adc	x4, x4, xzr\n\t"
65473         "adds	x5, x5, x6\n\t"
65474         "#  A[5] * B[0]\n\t"
65475         "mul	x6, x13, x16\n\t"
65476         "adcs	x3, x3, x7\n\t"
65477         "umulh	x7, x13, x16\n\t"
65478         "adc	x4, x4, xzr\n\t"
65479         "adds	x5, x5, x6\n\t"
65480         "adcs	x3, x3, x7\n\t"
65481         "str	x5, [%[r], 40]\n\t"
65482         "adc	x4, x4, xzr\n\t"
65483         "#  A[0] * B[6]\n\t"
65484         "mul	x6, x8, x23\n\t"
65485         "umulh	x7, x8, x23\n\t"
65486         "adds	x3, x3, x6\n\t"
65487         "#  A[1] * B[5]\n\t"
65488         "mul	x6, x9, x22\n\t"
65489         "adcs	x4, x4, x7\n\t"
65490         "umulh	x7, x9, x22\n\t"
65491         "adc	x5, xzr, xzr\n\t"
65492         "adds	x3, x3, x6\n\t"
65493         "#  A[2] * B[4]\n\t"
65494         "mul	x6, x10, x21\n\t"
65495         "adcs	x4, x4, x7\n\t"
65496         "umulh	x7, x10, x21\n\t"
65497         "adc	x5, x5, xzr\n\t"
65498         "adds	x3, x3, x6\n\t"
65499         "#  A[3] * B[3]\n\t"
65500         "mul	x6, x11, x20\n\t"
65501         "adcs	x4, x4, x7\n\t"
65502         "umulh	x7, x11, x20\n\t"
65503         "adc	x5, x5, xzr\n\t"
65504         "adds	x3, x3, x6\n\t"
65505         "#  A[4] * B[2]\n\t"
65506         "mul	x6, x12, x19\n\t"
65507         "adcs	x4, x4, x7\n\t"
65508         "umulh	x7, x12, x19\n\t"
65509         "adc	x5, x5, xzr\n\t"
65510         "adds	x3, x3, x6\n\t"
65511         "#  A[5] * B[1]\n\t"
65512         "mul	x6, x13, x17\n\t"
65513         "adcs	x4, x4, x7\n\t"
65514         "umulh	x7, x13, x17\n\t"
65515         "adc	x5, x5, xzr\n\t"
65516         "adds	x3, x3, x6\n\t"
65517         "#  A[6] * B[0]\n\t"
65518         "mul	x6, x14, x16\n\t"
65519         "adcs	x4, x4, x7\n\t"
65520         "umulh	x7, x14, x16\n\t"
65521         "adc	x5, x5, xzr\n\t"
65522         "adds	x3, x3, x6\n\t"
65523         "adcs	x4, x4, x7\n\t"
65524         "str	x3, [%[r], 48]\n\t"
65525         "adc	x5, x5, xzr\n\t"
65526         "#  A[0] * B[7]\n\t"
65527         "mul	x6, x8, x24\n\t"
65528         "umulh	x7, x8, x24\n\t"
65529         "adds	x4, x4, x6\n\t"
65530         "#  A[1] * B[6]\n\t"
65531         "mul	x6, x9, x23\n\t"
65532         "adcs	x5, x5, x7\n\t"
65533         "umulh	x7, x9, x23\n\t"
65534         "adc	x3, xzr, xzr\n\t"
65535         "adds	x4, x4, x6\n\t"
65536         "#  A[2] * B[5]\n\t"
65537         "mul	x6, x10, x22\n\t"
65538         "adcs	x5, x5, x7\n\t"
65539         "umulh	x7, x10, x22\n\t"
65540         "adc	x3, x3, xzr\n\t"
65541         "adds	x4, x4, x6\n\t"
65542         "#  A[3] * B[4]\n\t"
65543         "mul	x6, x11, x21\n\t"
65544         "adcs	x5, x5, x7\n\t"
65545         "umulh	x7, x11, x21\n\t"
65546         "adc	x3, x3, xzr\n\t"
65547         "adds	x4, x4, x6\n\t"
65548         "#  A[4] * B[3]\n\t"
65549         "mul	x6, x12, x20\n\t"
65550         "adcs	x5, x5, x7\n\t"
65551         "umulh	x7, x12, x20\n\t"
65552         "adc	x3, x3, xzr\n\t"
65553         "adds	x4, x4, x6\n\t"
65554         "#  A[5] * B[2]\n\t"
65555         "mul	x6, x13, x19\n\t"
65556         "adcs	x5, x5, x7\n\t"
65557         "umulh	x7, x13, x19\n\t"
65558         "adc	x3, x3, xzr\n\t"
65559         "adds	x4, x4, x6\n\t"
65560         "#  A[6] * B[1]\n\t"
65561         "mul	x6, x14, x17\n\t"
65562         "adcs	x5, x5, x7\n\t"
65563         "umulh	x7, x14, x17\n\t"
65564         "adc	x3, x3, xzr\n\t"
65565         "adds	x4, x4, x6\n\t"
65566         "#  A[7] * B[0]\n\t"
65567         "mul	x6, x15, x16\n\t"
65568         "adcs	x5, x5, x7\n\t"
65569         "umulh	x7, x15, x16\n\t"
65570         "adc	x3, x3, xzr\n\t"
65571         "adds	x4, x4, x6\n\t"
65572         "adcs	x5, x5, x7\n\t"
65573         "str	x4, [%[r], 56]\n\t"
65574         "adc	x3, x3, xzr\n\t"
65575         "#  A[1] * B[7]\n\t"
65576         "mul	x6, x9, x24\n\t"
65577         "umulh	x7, x9, x24\n\t"
65578         "adds	x5, x5, x6\n\t"
65579         "#  A[2] * B[6]\n\t"
65580         "mul	x6, x10, x23\n\t"
65581         "adcs	x3, x3, x7\n\t"
65582         "umulh	x7, x10, x23\n\t"
65583         "adc	x4, xzr, xzr\n\t"
65584         "adds	x5, x5, x6\n\t"
65585         "#  A[3] * B[5]\n\t"
65586         "mul	x6, x11, x22\n\t"
65587         "adcs	x3, x3, x7\n\t"
65588         "umulh	x7, x11, x22\n\t"
65589         "adc	x4, x4, xzr\n\t"
65590         "adds	x5, x5, x6\n\t"
65591         "#  A[4] * B[4]\n\t"
65592         "mul	x6, x12, x21\n\t"
65593         "adcs	x3, x3, x7\n\t"
65594         "umulh	x7, x12, x21\n\t"
65595         "adc	x4, x4, xzr\n\t"
65596         "adds	x5, x5, x6\n\t"
65597         "#  A[5] * B[3]\n\t"
65598         "mul	x6, x13, x20\n\t"
65599         "adcs	x3, x3, x7\n\t"
65600         "umulh	x7, x13, x20\n\t"
65601         "adc	x4, x4, xzr\n\t"
65602         "adds	x5, x5, x6\n\t"
65603         "#  A[6] * B[2]\n\t"
65604         "mul	x6, x14, x19\n\t"
65605         "adcs	x3, x3, x7\n\t"
65606         "umulh	x7, x14, x19\n\t"
65607         "adc	x4, x4, xzr\n\t"
65608         "adds	x5, x5, x6\n\t"
65609         "#  A[7] * B[1]\n\t"
65610         "mul	x6, x15, x17\n\t"
65611         "adcs	x3, x3, x7\n\t"
65612         "umulh	x7, x15, x17\n\t"
65613         "adc	x4, x4, xzr\n\t"
65614         "adds	x5, x5, x6\n\t"
65615         "adcs	x3, x3, x7\n\t"
65616         "str	x5, [%[r], 64]\n\t"
65617         "adc	x4, x4, xzr\n\t"
65618         "#  A[2] * B[7]\n\t"
65619         "mul	x6, x10, x24\n\t"
65620         "umulh	x7, x10, x24\n\t"
65621         "adds	x3, x3, x6\n\t"
65622         "#  A[3] * B[6]\n\t"
65623         "mul	x6, x11, x23\n\t"
65624         "adcs	x4, x4, x7\n\t"
65625         "umulh	x7, x11, x23\n\t"
65626         "adc	x5, xzr, xzr\n\t"
65627         "adds	x3, x3, x6\n\t"
65628         "#  A[4] * B[5]\n\t"
65629         "mul	x6, x12, x22\n\t"
65630         "adcs	x4, x4, x7\n\t"
65631         "umulh	x7, x12, x22\n\t"
65632         "adc	x5, x5, xzr\n\t"
65633         "adds	x3, x3, x6\n\t"
65634         "#  A[5] * B[4]\n\t"
65635         "mul	x6, x13, x21\n\t"
65636         "adcs	x4, x4, x7\n\t"
65637         "umulh	x7, x13, x21\n\t"
65638         "adc	x5, x5, xzr\n\t"
65639         "adds	x3, x3, x6\n\t"
65640         "#  A[6] * B[3]\n\t"
65641         "mul	x6, x14, x20\n\t"
65642         "adcs	x4, x4, x7\n\t"
65643         "umulh	x7, x14, x20\n\t"
65644         "adc	x5, x5, xzr\n\t"
65645         "adds	x3, x3, x6\n\t"
65646         "#  A[7] * B[2]\n\t"
65647         "mul	x6, x15, x19\n\t"
65648         "adcs	x4, x4, x7\n\t"
65649         "umulh	x7, x15, x19\n\t"
65650         "adc	x5, x5, xzr\n\t"
65651         "adds	x3, x3, x6\n\t"
65652         "adcs	x4, x4, x7\n\t"
65653         "str	x3, [%[r], 72]\n\t"
65654         "adc	x5, x5, xzr\n\t"
65655         "#  A[3] * B[7]\n\t"
65656         "mul	x6, x11, x24\n\t"
65657         "umulh	x7, x11, x24\n\t"
65658         "adds	x4, x4, x6\n\t"
65659         "#  A[4] * B[6]\n\t"
65660         "mul	x6, x12, x23\n\t"
65661         "adcs	x5, x5, x7\n\t"
65662         "umulh	x7, x12, x23\n\t"
65663         "adc	x3, xzr, xzr\n\t"
65664         "adds	x4, x4, x6\n\t"
65665         "#  A[5] * B[5]\n\t"
65666         "mul	x6, x13, x22\n\t"
65667         "adcs	x5, x5, x7\n\t"
65668         "umulh	x7, x13, x22\n\t"
65669         "adc	x3, x3, xzr\n\t"
65670         "adds	x4, x4, x6\n\t"
65671         "#  A[6] * B[4]\n\t"
65672         "mul	x6, x14, x21\n\t"
65673         "adcs	x5, x5, x7\n\t"
65674         "umulh	x7, x14, x21\n\t"
65675         "adc	x3, x3, xzr\n\t"
65676         "adds	x4, x4, x6\n\t"
65677         "#  A[7] * B[3]\n\t"
65678         "mul	x6, x15, x20\n\t"
65679         "adcs	x5, x5, x7\n\t"
65680         "umulh	x7, x15, x20\n\t"
65681         "adc	x3, x3, xzr\n\t"
65682         "adds	x4, x4, x6\n\t"
65683         "adcs	x5, x5, x7\n\t"
65684         "str	x4, [%[r], 80]\n\t"
65685         "adc	x3, x3, xzr\n\t"
65686         "#  A[4] * B[7]\n\t"
65687         "mul	x6, x12, x24\n\t"
65688         "umulh	x7, x12, x24\n\t"
65689         "adds	x5, x5, x6\n\t"
65690         "#  A[5] * B[6]\n\t"
65691         "mul	x6, x13, x23\n\t"
65692         "adcs	x3, x3, x7\n\t"
65693         "umulh	x7, x13, x23\n\t"
65694         "adc	x4, xzr, xzr\n\t"
65695         "adds	x5, x5, x6\n\t"
65696         "#  A[6] * B[5]\n\t"
65697         "mul	x6, x14, x22\n\t"
65698         "adcs	x3, x3, x7\n\t"
65699         "umulh	x7, x14, x22\n\t"
65700         "adc	x4, x4, xzr\n\t"
65701         "adds	x5, x5, x6\n\t"
65702         "#  A[7] * B[4]\n\t"
65703         "mul	x6, x15, x21\n\t"
65704         "adcs	x3, x3, x7\n\t"
65705         "umulh	x7, x15, x21\n\t"
65706         "adc	x4, x4, xzr\n\t"
65707         "adds	x5, x5, x6\n\t"
65708         "adcs	x3, x3, x7\n\t"
65709         "str	x5, [%[r], 88]\n\t"
65710         "adc	x4, x4, xzr\n\t"
65711         "#  A[5] * B[7]\n\t"
65712         "mul	x6, x13, x24\n\t"
65713         "umulh	x7, x13, x24\n\t"
65714         "adds	x3, x3, x6\n\t"
65715         "#  A[6] * B[6]\n\t"
65716         "mul	x6, x14, x23\n\t"
65717         "adcs	x4, x4, x7\n\t"
65718         "umulh	x7, x14, x23\n\t"
65719         "adc	x5, xzr, xzr\n\t"
65720         "adds	x3, x3, x6\n\t"
65721         "#  A[7] * B[5]\n\t"
65722         "mul	x6, x15, x22\n\t"
65723         "adcs	x4, x4, x7\n\t"
65724         "umulh	x7, x15, x22\n\t"
65725         "adc	x5, x5, xzr\n\t"
65726         "adds	x3, x3, x6\n\t"
65727         "adcs	x4, x4, x7\n\t"
65728         "str	x3, [%[r], 96]\n\t"
65729         "adc	x5, x5, xzr\n\t"
65730         "#  A[6] * B[7]\n\t"
65731         "mul	x6, x14, x24\n\t"
65732         "umulh	x7, x14, x24\n\t"
65733         "adds	x4, x4, x6\n\t"
65734         "#  A[7] * B[6]\n\t"
65735         "mul	x6, x15, x23\n\t"
65736         "adcs	x5, x5, x7\n\t"
65737         "umulh	x7, x15, x23\n\t"
65738         "adc	x3, xzr, xzr\n\t"
65739         "adds	x4, x4, x6\n\t"
65740         "adcs	x5, x5, x7\n\t"
65741         "str	x4, [%[r], 104]\n\t"
65742         "adc	x3, x3, xzr\n\t"
65743         "#  A[7] * B[7]\n\t"
65744         "mul	x6, x15, x24\n\t"
65745         "umulh	x7, x15, x24\n\t"
65746         "adds	x5, x5, x6\n\t"
65747         "adc	x3, x3, x7\n\t"
65748         "stp	x5, x3, [%[r], 112]\n\t"
65749         :
65750         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
65751         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24"
65752     );
65753 }
65754 
65755 /* Square a and put result in r. (r = a * a)
65756  *
65757  * All registers version.
65758  *
65759  * r  A single precision integer.
65760  * a  A single precision integer.
65761  */
sp_1024_sqr_8(sp_digit * r,const sp_digit * a)65762 static void sp_1024_sqr_8(sp_digit* r, const sp_digit* a)
65763 {
65764     __asm__ __volatile__ (
65765         "ldp       x21, x22, [%[a], 0]\n\t"
65766         "ldp       x23, x24, [%[a], 16]\n\t"
65767         "ldp       x25, x26, [%[a], 32]\n\t"
65768         "ldp       x27, x28, [%[a], 48]\n\t"
65769         "#  A[0] * A[1]\n\t"
65770         "mul	x6, x21, x22\n\t"
65771         "umulh	x7, x21, x22\n\t"
65772         "#  A[0] * A[2]\n\t"
65773         "mul	x4, x21, x23\n\t"
65774         "umulh	x5, x21, x23\n\t"
65775         "adds	x7, x7, x4\n\t"
65776         "#  A[0] * A[3]\n\t"
65777         "mul	x4, x21, x24\n\t"
65778         "adc	x8, xzr, x5\n\t"
65779         "umulh	x5, x21, x24\n\t"
65780         "adds	x8, x8, x4\n\t"
65781         "#  A[1] * A[2]\n\t"
65782         "mul	x4, x22, x23\n\t"
65783         "adc	x9, xzr, x5\n\t"
65784         "umulh	x5, x22, x23\n\t"
65785         "adds	x8, x8, x4\n\t"
65786         "#  A[0] * A[4]\n\t"
65787         "mul	x4, x21, x25\n\t"
65788         "adcs	x9, x9, x5\n\t"
65789         "umulh	x5, x21, x25\n\t"
65790         "adc	x10, xzr, xzr\n\t"
65791         "adds	x9, x9, x4\n\t"
65792         "#  A[1] * A[3]\n\t"
65793         "mul	x4, x22, x24\n\t"
65794         "adc	x10, x10, x5\n\t"
65795         "umulh	x5, x22, x24\n\t"
65796         "adds	x9, x9, x4\n\t"
65797         "#  A[0] * A[5]\n\t"
65798         "mul	x4, x21, x26\n\t"
65799         "adcs	x10, x10, x5\n\t"
65800         "umulh	x5, x21, x26\n\t"
65801         "adc	x11, xzr, xzr\n\t"
65802         "adds	x10, x10, x4\n\t"
65803         "#  A[1] * A[4]\n\t"
65804         "mul	x4, x22, x25\n\t"
65805         "adc	x11, x11, x5\n\t"
65806         "umulh	x5, x22, x25\n\t"
65807         "adds	x10, x10, x4\n\t"
65808         "#  A[2] * A[3]\n\t"
65809         "mul	x4, x23, x24\n\t"
65810         "adcs	x11, x11, x5\n\t"
65811         "umulh	x5, x23, x24\n\t"
65812         "adc	x12, xzr, xzr\n\t"
65813         "adds	x10, x10, x4\n\t"
65814         "#  A[0] * A[6]\n\t"
65815         "mul	x4, x21, x27\n\t"
65816         "adcs	x11, x11, x5\n\t"
65817         "umulh	x5, x21, x27\n\t"
65818         "adc	x12, x12, xzr\n\t"
65819         "adds	x11, x11, x4\n\t"
65820         "#  A[1] * A[5]\n\t"
65821         "mul	x4, x22, x26\n\t"
65822         "adcs	x12, x12, x5\n\t"
65823         "umulh	x5, x22, x26\n\t"
65824         "adc	x13, xzr, xzr\n\t"
65825         "adds	x11, x11, x4\n\t"
65826         "#  A[2] * A[4]\n\t"
65827         "mul	x4, x23, x25\n\t"
65828         "adcs	x12, x12, x5\n\t"
65829         "umulh	x5, x23, x25\n\t"
65830         "adc	x13, x13, xzr\n\t"
65831         "adds	x11, x11, x4\n\t"
65832         "#  A[0] * A[7]\n\t"
65833         "mul	x4, x21, x28\n\t"
65834         "adcs	x12, x12, x5\n\t"
65835         "umulh	x5, x21, x28\n\t"
65836         "adc	x13, x13, xzr\n\t"
65837         "adds	x12, x12, x4\n\t"
65838         "#  A[1] * A[6]\n\t"
65839         "mul	x4, x22, x27\n\t"
65840         "adcs	x13, x13, x5\n\t"
65841         "umulh	x5, x22, x27\n\t"
65842         "adc	x14, xzr, xzr\n\t"
65843         "adds	x12, x12, x4\n\t"
65844         "#  A[2] * A[5]\n\t"
65845         "mul	x4, x23, x26\n\t"
65846         "adcs	x13, x13, x5\n\t"
65847         "umulh	x5, x23, x26\n\t"
65848         "adc	x14, x14, xzr\n\t"
65849         "adds	x12, x12, x4\n\t"
65850         "#  A[3] * A[4]\n\t"
65851         "mul	x4, x24, x25\n\t"
65852         "adcs	x13, x13, x5\n\t"
65853         "umulh	x5, x24, x25\n\t"
65854         "adc	x14, x14, xzr\n\t"
65855         "adds	x12, x12, x4\n\t"
65856         "#  A[1] * A[7]\n\t"
65857         "mul	x4, x22, x28\n\t"
65858         "adcs	x13, x13, x5\n\t"
65859         "umulh	x5, x22, x28\n\t"
65860         "adc	x14, x14, xzr\n\t"
65861         "adds	x13, x13, x4\n\t"
65862         "#  A[2] * A[6]\n\t"
65863         "mul	x4, x23, x27\n\t"
65864         "adcs	x14, x14, x5\n\t"
65865         "umulh	x5, x23, x27\n\t"
65866         "adc	x15, xzr, xzr\n\t"
65867         "adds	x13, x13, x4\n\t"
65868         "#  A[3] * A[5]\n\t"
65869         "mul	x4, x24, x26\n\t"
65870         "adcs	x14, x14, x5\n\t"
65871         "umulh	x5, x24, x26\n\t"
65872         "adc	x15, x15, xzr\n\t"
65873         "adds	x13, x13, x4\n\t"
65874         "#  A[2] * A[7]\n\t"
65875         "mul	x4, x23, x28\n\t"
65876         "adcs	x14, x14, x5\n\t"
65877         "umulh	x5, x23, x28\n\t"
65878         "adc	x15, x15, xzr\n\t"
65879         "adds	x14, x14, x4\n\t"
65880         "#  A[3] * A[6]\n\t"
65881         "mul	x4, x24, x27\n\t"
65882         "adcs	x15, x15, x5\n\t"
65883         "umulh	x5, x24, x27\n\t"
65884         "adc	x16, xzr, xzr\n\t"
65885         "adds	x14, x14, x4\n\t"
65886         "#  A[4] * A[5]\n\t"
65887         "mul	x4, x25, x26\n\t"
65888         "adcs	x15, x15, x5\n\t"
65889         "umulh	x5, x25, x26\n\t"
65890         "adc	x16, x16, xzr\n\t"
65891         "adds	x14, x14, x4\n\t"
65892         "#  A[3] * A[7]\n\t"
65893         "mul	x4, x24, x28\n\t"
65894         "adcs	x15, x15, x5\n\t"
65895         "umulh	x5, x24, x28\n\t"
65896         "adc	x16, x16, xzr\n\t"
65897         "adds	x15, x15, x4\n\t"
65898         "#  A[4] * A[6]\n\t"
65899         "mul	x4, x25, x27\n\t"
65900         "adcs	x16, x16, x5\n\t"
65901         "umulh	x5, x25, x27\n\t"
65902         "adc	x17, xzr, xzr\n\t"
65903         "adds	x15, x15, x4\n\t"
65904         "#  A[4] * A[7]\n\t"
65905         "mul	x4, x25, x28\n\t"
65906         "adcs	x16, x16, x5\n\t"
65907         "umulh	x5, x25, x28\n\t"
65908         "adc	x17, x17, xzr\n\t"
65909         "adds	x16, x16, x4\n\t"
65910         "#  A[5] * A[6]\n\t"
65911         "mul	x4, x26, x27\n\t"
65912         "adcs	x17, x17, x5\n\t"
65913         "umulh	x5, x26, x27\n\t"
65914         "adc	x19, xzr, xzr\n\t"
65915         "adds	x16, x16, x4\n\t"
65916         "#  A[5] * A[7]\n\t"
65917         "mul	x4, x26, x28\n\t"
65918         "adcs	x17, x17, x5\n\t"
65919         "umulh	x5, x26, x28\n\t"
65920         "adc	x19, x19, xzr\n\t"
65921         "adds	x17, x17, x4\n\t"
65922         "#  A[6] * A[7]\n\t"
65923         "mul	x4, x27, x28\n\t"
65924         "adcs	x19, x19, x5\n\t"
65925         "umulh	x5, x27, x28\n\t"
65926         "adc	x20, xzr, xzr\n\t"
65927         "adds	x19, x19, x4\n\t"
65928         "adc	x20, x20, x5\n\t"
65929         "# Double\n\t"
65930         "adds	x6, x6, x6\n\t"
65931         "adcs	x7, x7, x7\n\t"
65932         "adcs	x8, x8, x8\n\t"
65933         "adcs	x9, x9, x9\n\t"
65934         "adcs	x10, x10, x10\n\t"
65935         "adcs	x11, x11, x11\n\t"
65936         "adcs	x12, x12, x12\n\t"
65937         "adcs	x13, x13, x13\n\t"
65938         "adcs	x14, x14, x14\n\t"
65939         "adcs	x15, x15, x15\n\t"
65940         "adcs	x16, x16, x16\n\t"
65941         "adcs	x17, x17, x17\n\t"
65942         "adcs	x19, x19, x19\n\t"
65943         "#  A[0] * A[0]\n\t"
65944         "mul	x5, x21, x21\n\t"
65945         "adcs	x20, x20, x20\n\t"
65946         "umulh	x2, x21, x21\n\t"
65947         "cset  x21, cs\n\t"
65948         "#  A[1] * A[1]\n\t"
65949         "mul	x3, x22, x22\n\t"
65950         "adds	x6, x6, x2\n\t"
65951         "umulh	x4, x22, x22\n\t"
65952         "adcs	x7, x7, x3\n\t"
65953         "#  A[2] * A[2]\n\t"
65954         "mul	x2, x23, x23\n\t"
65955         "adcs	x8, x8, x4\n\t"
65956         "umulh	x3, x23, x23\n\t"
65957         "adcs	x9, x9, x2\n\t"
65958         "#  A[3] * A[3]\n\t"
65959         "mul	x4, x24, x24\n\t"
65960         "adcs	x10, x10, x3\n\t"
65961         "umulh	x2, x24, x24\n\t"
65962         "adcs	x11, x11, x4\n\t"
65963         "#  A[4] * A[4]\n\t"
65964         "mul	x3, x25, x25\n\t"
65965         "adcs	x12, x12, x2\n\t"
65966         "umulh	x4, x25, x25\n\t"
65967         "adcs	x13, x13, x3\n\t"
65968         "#  A[5] * A[5]\n\t"
65969         "mul	x2, x26, x26\n\t"
65970         "adcs	x14, x14, x4\n\t"
65971         "umulh	x3, x26, x26\n\t"
65972         "adcs	x15, x15, x2\n\t"
65973         "#  A[6] * A[6]\n\t"
65974         "mul	x4, x27, x27\n\t"
65975         "adcs	x16, x16, x3\n\t"
65976         "umulh	x2, x27, x27\n\t"
65977         "adcs	x17, x17, x4\n\t"
65978         "#  A[7] * A[7]\n\t"
65979         "mul	x3, x28, x28\n\t"
65980         "adcs	x19, x19, x2\n\t"
65981         "umulh	x4, x28, x28\n\t"
65982         "adcs	x20, x20, x3\n\t"
65983         "stp	x5, x6, [%[r], 0]\n\t"
65984         "adc	x21, x21, x4\n\t"
65985         "stp	x7, x8, [%[r], 16]\n\t"
65986         "stp	x9, x10, [%[r], 32]\n\t"
65987         "stp	x11, x12, [%[r], 48]\n\t"
65988         "stp	x13, x14, [%[r], 64]\n\t"
65989         "stp	x15, x16, [%[r], 80]\n\t"
65990         "stp	x17, x19, [%[r], 96]\n\t"
65991         "stp	x20, x21, [%[r], 112]\n\t"
65992         :
65993         : [r] "r" (r), [a] "r" (a)
65994         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
65995     );
65996 }
65997 
65998 /* Add b to a into r. (r = a + b)
65999  *
66000  * r  A single precision integer.
66001  * a  A single precision integer.
66002  * b  A single precision integer.
66003  */
sp_1024_add_8(sp_digit * r,const sp_digit * a,const sp_digit * b)66004 static sp_digit sp_1024_add_8(sp_digit* r, const sp_digit* a,
66005         const sp_digit* b)
66006 {
66007     __asm__ __volatile__ (
66008         "ldp	x3, x4, [%[a], 0]\n\t"
66009         "ldp	x7, x8, [%[b], 0]\n\t"
66010         "adds	x3, x3, x7\n\t"
66011         "ldp	x5, x6, [%[a], 16]\n\t"
66012         "adcs	x4, x4, x8\n\t"
66013         "ldp	x9, x10, [%[b], 16]\n\t"
66014         "adcs	x5, x5, x9\n\t"
66015         "stp	x3, x4, [%[r], 0]\n\t"
66016         "adcs	x6, x6, x10\n\t"
66017         "stp	x5, x6, [%[r], 16]\n\t"
66018         "ldp	x3, x4, [%[a], 32]\n\t"
66019         "ldp	x7, x8, [%[b], 32]\n\t"
66020         "adcs	x3, x3, x7\n\t"
66021         "ldp	x5, x6, [%[a], 48]\n\t"
66022         "adcs	x4, x4, x8\n\t"
66023         "ldp	x9, x10, [%[b], 48]\n\t"
66024         "adcs	x5, x5, x9\n\t"
66025         "stp	x3, x4, [%[r], 32]\n\t"
66026         "adcs	x6, x6, x10\n\t"
66027         "stp	x5, x6, [%[r], 48]\n\t"
66028         "cset	%[r], cs\n\t"
66029         : [r] "+r" (r)
66030         : [a] "r" (a), [b] "r" (b)
66031         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
66032     );
66033 
66034     return (sp_digit)r;
66035 }
66036 
66037 /* Sub b from a into a. (a -= b)
66038  *
66039  * a  A single precision integer and result.
66040  * b  A single precision integer.
66041  */
sp_1024_sub_in_place_16(sp_digit * a,const sp_digit * b)66042 static sp_digit sp_1024_sub_in_place_16(sp_digit* a, const sp_digit* b)
66043 {
66044     __asm__ __volatile__ (
66045         "ldp	x2, x3, [%[a], 0]\n\t"
66046         "ldp	x6, x7, [%[b], 0]\n\t"
66047         "subs	x2, x2, x6\n\t"
66048         "ldp	x4, x5, [%[a], 16]\n\t"
66049         "sbcs	x3, x3, x7\n\t"
66050         "ldp	x8, x9, [%[b], 16]\n\t"
66051         "sbcs	x4, x4, x8\n\t"
66052         "stp	x2, x3, [%[a], 0]\n\t"
66053         "sbcs	x5, x5, x9\n\t"
66054         "stp	x4, x5, [%[a], 16]\n\t"
66055         "ldp	x2, x3, [%[a], 32]\n\t"
66056         "ldp	x6, x7, [%[b], 32]\n\t"
66057         "sbcs	x2, x2, x6\n\t"
66058         "ldp	x4, x5, [%[a], 48]\n\t"
66059         "sbcs	x3, x3, x7\n\t"
66060         "ldp	x8, x9, [%[b], 48]\n\t"
66061         "sbcs	x4, x4, x8\n\t"
66062         "stp	x2, x3, [%[a], 32]\n\t"
66063         "sbcs	x5, x5, x9\n\t"
66064         "stp	x4, x5, [%[a], 48]\n\t"
66065         "ldp	x2, x3, [%[a], 64]\n\t"
66066         "ldp	x6, x7, [%[b], 64]\n\t"
66067         "sbcs	x2, x2, x6\n\t"
66068         "ldp	x4, x5, [%[a], 80]\n\t"
66069         "sbcs	x3, x3, x7\n\t"
66070         "ldp	x8, x9, [%[b], 80]\n\t"
66071         "sbcs	x4, x4, x8\n\t"
66072         "stp	x2, x3, [%[a], 64]\n\t"
66073         "sbcs	x5, x5, x9\n\t"
66074         "stp	x4, x5, [%[a], 80]\n\t"
66075         "ldp	x2, x3, [%[a], 96]\n\t"
66076         "ldp	x6, x7, [%[b], 96]\n\t"
66077         "sbcs	x2, x2, x6\n\t"
66078         "ldp	x4, x5, [%[a], 112]\n\t"
66079         "sbcs	x3, x3, x7\n\t"
66080         "ldp	x8, x9, [%[b], 112]\n\t"
66081         "sbcs	x4, x4, x8\n\t"
66082         "stp	x2, x3, [%[a], 96]\n\t"
66083         "sbcs	x5, x5, x9\n\t"
66084         "stp	x4, x5, [%[a], 112]\n\t"
66085         "csetm	%[a], cc\n\t"
66086         : [a] "+r" (a)
66087         : [b] "r" (b)
66088         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
66089     );
66090 
66091     return (sp_digit)a;
66092 }
66093 
66094 /* Add b to a into r. (r = a + b)
66095  *
66096  * r  A single precision integer.
66097  * a  A single precision integer.
66098  * b  A single precision integer.
66099  */
sp_1024_add_16(sp_digit * r,const sp_digit * a,const sp_digit * b)66100 static sp_digit sp_1024_add_16(sp_digit* r, const sp_digit* a,
66101         const sp_digit* b)
66102 {
66103     __asm__ __volatile__ (
66104         "ldp	x3, x4, [%[a], 0]\n\t"
66105         "ldp	x7, x8, [%[b], 0]\n\t"
66106         "adds	x3, x3, x7\n\t"
66107         "ldp	x5, x6, [%[a], 16]\n\t"
66108         "adcs	x4, x4, x8\n\t"
66109         "ldp	x9, x10, [%[b], 16]\n\t"
66110         "adcs	x5, x5, x9\n\t"
66111         "stp	x3, x4, [%[r], 0]\n\t"
66112         "adcs	x6, x6, x10\n\t"
66113         "stp	x5, x6, [%[r], 16]\n\t"
66114         "ldp	x3, x4, [%[a], 32]\n\t"
66115         "ldp	x7, x8, [%[b], 32]\n\t"
66116         "adcs	x3, x3, x7\n\t"
66117         "ldp	x5, x6, [%[a], 48]\n\t"
66118         "adcs	x4, x4, x8\n\t"
66119         "ldp	x9, x10, [%[b], 48]\n\t"
66120         "adcs	x5, x5, x9\n\t"
66121         "stp	x3, x4, [%[r], 32]\n\t"
66122         "adcs	x6, x6, x10\n\t"
66123         "stp	x5, x6, [%[r], 48]\n\t"
66124         "ldp	x3, x4, [%[a], 64]\n\t"
66125         "ldp	x7, x8, [%[b], 64]\n\t"
66126         "adcs	x3, x3, x7\n\t"
66127         "ldp	x5, x6, [%[a], 80]\n\t"
66128         "adcs	x4, x4, x8\n\t"
66129         "ldp	x9, x10, [%[b], 80]\n\t"
66130         "adcs	x5, x5, x9\n\t"
66131         "stp	x3, x4, [%[r], 64]\n\t"
66132         "adcs	x6, x6, x10\n\t"
66133         "stp	x5, x6, [%[r], 80]\n\t"
66134         "ldp	x3, x4, [%[a], 96]\n\t"
66135         "ldp	x7, x8, [%[b], 96]\n\t"
66136         "adcs	x3, x3, x7\n\t"
66137         "ldp	x5, x6, [%[a], 112]\n\t"
66138         "adcs	x4, x4, x8\n\t"
66139         "ldp	x9, x10, [%[b], 112]\n\t"
66140         "adcs	x5, x5, x9\n\t"
66141         "stp	x3, x4, [%[r], 96]\n\t"
66142         "adcs	x6, x6, x10\n\t"
66143         "stp	x5, x6, [%[r], 112]\n\t"
66144         "cset	%[r], cs\n\t"
66145         : [r] "+r" (r)
66146         : [a] "r" (a), [b] "r" (b)
66147         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
66148     );
66149 
66150     return (sp_digit)r;
66151 }
66152 
66153 /* AND m into each word of a and store in r.
66154  *
66155  * r  A single precision integer.
66156  * a  A single precision integer.
66157  * m  Mask to AND against each digit.
66158  */
sp_1024_mask_8(sp_digit * r,const sp_digit * a,sp_digit m)66159 static void sp_1024_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
66160 {
66161 #ifdef WOLFSSL_SP_SMALL
66162     int i;
66163 
66164     for (i=0; i<8; i++) {
66165         r[i] = a[i] & m;
66166     }
66167 #else
66168     r[0] = a[0] & m;
66169     r[1] = a[1] & m;
66170     r[2] = a[2] & m;
66171     r[3] = a[3] & m;
66172     r[4] = a[4] & m;
66173     r[5] = a[5] & m;
66174     r[6] = a[6] & m;
66175     r[7] = a[7] & m;
66176 #endif
66177 }
66178 
66179 /* Add digit to a into r. (r = a + b)
66180  *
66181  * r  A single precision integer.
66182  * a  A single precision integer.
66183  * b  A single precision integer.
66184  */
sp_1024_add_zero_8(sp_digit * r,const sp_digit * a,const sp_digit d)66185 static void sp_1024_add_zero_8(sp_digit* r, const sp_digit* a,
66186         const sp_digit d)
66187 {
66188     __asm__ __volatile__ (
66189         "ldp	x3, x4, [%[a], 0]\n\t"
66190         "ldp	x5, x6, [%[a], 16]\n\t"
66191         "adds	x3, x3, %[d]\n\t"
66192         "adcs	x4, x4, xzr\n\t"
66193         "adcs	x5, x5, xzr\n\t"
66194         "stp	x3, x4, [%[r], 0]\n\t"
66195         "adcs	x6, x6, xzr\n\t"
66196         "stp	x5, x6, [%[r], 16]\n\t"
66197         "ldp	x3, x4, [%[a], 32]\n\t"
66198         "ldp	x5, x6, [%[a], 48]\n\t"
66199         "adcs	x3, x3, xzr\n\t"
66200         "adcs	x4, x4, xzr\n\t"
66201         "adcs	x5, x5, xzr\n\t"
66202         "stp	x3, x4, [%[r], 32]\n\t"
66203         "adcs	x6, x6, xzr\n\t"
66204         "stp	x5, x6, [%[r], 48]\n\t"
66205         :
66206         : [r] "r" (r), [a] "r" (a), [d] "r" (d)
66207         : "memory", "x3", "x4", "x5", "x6"
66208     );
66209 }
66210 
66211 /* Multiply a and b into r. (r = a * b)
66212  *
66213  * r  A single precision integer.
66214  * a  A single precision integer.
66215  * b  A single precision integer.
66216  */
sp_1024_mul_16(sp_digit * r,const sp_digit * a,const sp_digit * b)66217 SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
66218         const sp_digit* b)
66219 {
66220     sp_digit* z0 = r;
66221     sp_digit z1[16];
66222     sp_digit a1[8];
66223     sp_digit b1[8];
66224     sp_digit z2[16];
66225     sp_digit u, ca, cb;
66226 
66227     ca = sp_1024_add_8(a1, a, &a[8]);
66228     cb = sp_1024_add_8(b1, b, &b[8]);
66229     u  = ca & cb;
66230     sp_1024_mul_8(z1, a1, b1);
66231     sp_1024_mul_8(z2, &a[8], &b[8]);
66232     sp_1024_mul_8(z0, a, b);
66233     sp_1024_mask_8(r + 16, a1, 0 - cb);
66234     sp_1024_mask_8(b1, b1, 0 - ca);
66235     u += sp_1024_add_8(r + 16, r + 16, b1);
66236     u += sp_1024_sub_in_place_16(z1, z2);
66237     u += sp_1024_sub_in_place_16(z1, z0);
66238     u += sp_1024_add_16(r + 8, r + 8, z1);
66239     u += sp_1024_add_8(r + 16, r + 16, z2);
66240     sp_1024_add_zero_8(r + 24, z2 + 8, u);
66241 }
66242 
66243 #ifdef WOLFSSL_SP_SMALL
66244 /* Double a into r. (r = a + a)
66245  *
66246  * r  A single precision integer.
66247  * a  A single precision integer.
66248  */
sp_1024_dbl_8(sp_digit * r,const sp_digit * a)66249 static sp_digit sp_1024_dbl_8(sp_digit* r, const sp_digit* a)
66250 {
66251     sp_digit c = 0;
66252 
66253     __asm__ __volatile__ (
66254         "add	x11, %[a], 64\n\t"
66255         "\n1:\n\t"
66256         "adds	%[c], %[c], #-1\n\t"
66257         "ldp	x3, x4, [%[a]], #16\n\t"
66258         "ldp	x5, x6, [%[a]], #16\n\t"
66259         "adcs	x3, x3, x3\n\t"
66260         "adcs	x4, x4, x4\n\t"
66261         "adcs	x5, x5, x5\n\t"
66262         "stp	x3, x4, [%[r]], #16\n\t"
66263         "adcs	x6, x6, x6\n\t"
66264         "stp	x5, x6, [%[r]], #16\n\t"
66265         "cset	%[c], cs\n\t"
66266         "cmp	%[a], x11\n\t"
66267         "b.ne	1b\n\t"
66268         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a)
66269         :
66270         : "memory", "x3", "x4", "x5", "x6", "x11"
66271     );
66272 
66273     return c;
66274 }
66275 
66276 #else
66277 /* Double a into r. (r = a + a)
66278  *
66279  * r  A single precision integer.
66280  * a  A single precision integer.
66281  */
sp_1024_dbl_8(sp_digit * r,const sp_digit * a)66282 static sp_digit sp_1024_dbl_8(sp_digit* r, const sp_digit* a)
66283 {
66284     __asm__ __volatile__ (
66285         "ldp	x3, x4, [%[a], 0]\n\t"
66286         "adds	x3, x3, x3\n\t"
66287         "ldr	x5, [%[a], 16]\n\t"
66288         "adcs	x4, x4, x4\n\t"
66289         "ldr	x6, [%[a], 24]\n\t"
66290         "adcs	x5, x5, x5\n\t"
66291         "stp	x3, x4, [%[r], 0]\n\t"
66292         "adcs	x6, x6, x6\n\t"
66293         "stp	x5, x6, [%[r], 16]\n\t"
66294         "ldp	x3, x4, [%[a], 32]\n\t"
66295         "adcs	x3, x3, x3\n\t"
66296         "ldr	x5, [%[a], 48]\n\t"
66297         "adcs	x4, x4, x4\n\t"
66298         "ldr	x6, [%[a], 56]\n\t"
66299         "adcs	x5, x5, x5\n\t"
66300         "stp	x3, x4, [%[r], 32]\n\t"
66301         "adcs	x6, x6, x6\n\t"
66302         "stp	x5, x6, [%[r], 48]\n\t"
66303         "cset	%[r], cs\n\t"
66304         : [r] "+r" (r)
66305         : [a] "r" (a)
66306         : "memory", "x3", "x4", "x5", "x6"
66307     );
66308 
66309     return (sp_digit)r;
66310 }
66311 
66312 #endif /* WOLFSSL_SP_SMALL */
66313 /* Square a and put result in r. (r = a * a)
66314  *
66315  * r  A single precision integer.
66316  * a  A single precision integer.
66317  */
sp_1024_sqr_16(sp_digit * r,const sp_digit * a)66318 SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
66319 {
66320     sp_digit* z0 = r;
66321     sp_digit z2[16];
66322     sp_digit z1[16];
66323     sp_digit a1[8];
66324     sp_digit u;
66325 
66326     u = sp_1024_add_8(a1, a, &a[8]);
66327     sp_1024_sqr_8(z1, a1);
66328     sp_1024_sqr_8(z2, &a[8]);
66329     sp_1024_sqr_8(z0, a);
66330     sp_1024_mask_8(r + 16, a1, 0 - u);
66331     u += sp_1024_dbl_8(r + 16, r + 16);
66332     u += sp_1024_sub_in_place_16(z1, z2);
66333     u += sp_1024_sub_in_place_16(z1, z0);
66334     u += sp_1024_add_16(r + 8, r + 8, z1);
66335     u += sp_1024_add_8(r + 16, r + 16, z2);
66336     sp_1024_add_zero_8(r + 24, z2 + 8, u);
66337 }
66338 
66339 #else
66340 /* Multiply a and b into r. (r = a * b)
66341  *
66342  * r  A single precision integer.
66343  * a  A single precision integer.
66344  * b  A single precision integer.
66345  */
sp_1024_mul_16(sp_digit * r,const sp_digit * a,const sp_digit * b)66346 static void sp_1024_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b)
66347 {
66348     sp_digit tmp[32];
66349 
66350     __asm__ __volatile__ (
66351         "mov	x5, 0\n\t"
66352         "mov	x6, 0\n\t"
66353         "mov	x7, 0\n\t"
66354         "mov	x8, 0\n\t"
66355         "\n1:\n\t"
66356         "subs	x3, x5, 120\n\t"
66357         "csel	x3, xzr, x3, cc\n\t"
66358         "sub	x4, x5, x3\n\t"
66359         "\n2:\n\t"
66360         "ldr	x10, [%[a], x3]\n\t"
66361         "ldr	x11, [%[b], x4]\n\t"
66362         "mul	x9, x10, x11\n\t"
66363         "umulh	x10, x10, x11\n\t"
66364         "adds	x6, x6, x9\n\t"
66365         "adcs	x7, x7, x10\n\t"
66366         "adc	x8, x8, xzr\n\t"
66367         "add	x3, x3, #8\n\t"
66368         "sub	x4, x4, #8\n\t"
66369         "cmp	x3, 128\n\t"
66370         "b.eq	3f\n\t"
66371         "cmp	x3, x5\n\t"
66372         "b.le	2b\n\t"
66373         "\n3:\n\t"
66374         "str	x6, [%[r], x5]\n\t"
66375         "mov	x6, x7\n\t"
66376         "mov	x7, x8\n\t"
66377         "mov	x8, #0\n\t"
66378         "add	x5, x5, #8\n\t"
66379         "cmp	x5, 240\n\t"
66380         "b.le	1b\n\t"
66381         "str	x6, [%[r], x5]\n\t"
66382         :
66383         : [r] "r" (tmp), [a] "r" (a), [b] "r" (b)
66384         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
66385     );
66386 
66387     XMEMCPY(r, tmp, sizeof(tmp));
66388 }
66389 
66390 /* Square a and put result in r. (r = a * a)
66391  *
66392  * r  A single precision integer.
66393  * a  A single precision integer.
66394  */
sp_1024_sqr_16(sp_digit * r,const sp_digit * a)66395 static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
66396 {
66397     sp_digit tmp[32];
66398 
66399     __asm__ __volatile__ (
66400         "mov	x6, 0\n\t"
66401         "mov	x7, 0\n\t"
66402         "mov	x8, 0\n\t"
66403         "mov	x5, 0\n\t"
66404         "\n1:\n\t"
66405         "subs	x3, x5, 120\n\t"
66406         "csel	x3, xzr, x3, cc\n\t"
66407         "sub	x4, x5, x3\n\t"
66408         "\n2:\n\t"
66409         "cmp	x4, x3\n\t"
66410         "b.eq	4f\n\t"
66411         "ldr	x10, [%[a], x3]\n\t"
66412         "ldr	x11, [%[a], x4]\n\t"
66413         "mul	x9, x10, x11\n\t"
66414         "umulh	x10, x10, x11\n\t"
66415         "adds	x6, x6, x9\n\t"
66416         "adcs	x7, x7, x10\n\t"
66417         "adc	x8, x8, xzr\n\t"
66418         "adds	x6, x6, x9\n\t"
66419         "adcs	x7, x7, x10\n\t"
66420         "adc	x8, x8, xzr\n\t"
66421         "b.al	5f\n\t"
66422         "\n4:\n\t"
66423         "ldr	x10, [%[a], x3]\n\t"
66424         "mul	x9, x10, x10\n\t"
66425         "umulh	x10, x10, x10\n\t"
66426         "adds	x6, x6, x9\n\t"
66427         "adcs	x7, x7, x10\n\t"
66428         "adc	x8, x8, xzr\n\t"
66429         "\n5:\n\t"
66430         "add	x3, x3, #8\n\t"
66431         "sub	x4, x4, #8\n\t"
66432         "cmp	x3, 128\n\t"
66433         "b.eq	3f\n\t"
66434         "cmp	x3, x4\n\t"
66435         "b.gt	3f\n\t"
66436         "cmp	x3, x5\n\t"
66437         "b.le	2b\n\t"
66438         "\n3:\n\t"
66439         "str	x6, [%[r], x5]\n\t"
66440         "mov	x6, x7\n\t"
66441         "mov	x7, x8\n\t"
66442         "mov	x8, #0\n\t"
66443         "add	x5, x5, #8\n\t"
66444         "cmp	x5, 240\n\t"
66445         "b.le	1b\n\t"
66446         "str	x6, [%[r], x5]\n\t"
66447         :
66448         : [r] "r" (tmp), [a] "r" (a)
66449         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
66450     );
66451 
66452     XMEMCPY(r, tmp, sizeof(tmp));
66453 }
66454 
66455 #endif /* !WOLFSSL_SP_SMALL */
66456 /* The modulus (prime) of the curve P1024. */
66457 static const sp_digit p1024_mod[16] = {
66458     0x666d807afea85febL,0x80c5df10ac7ace87L,0xfce3e82389857db0L,
66459     0x9f94d6af56971f1fL,0xa7cf3c521c3c09aaL,0xb6aff4a831852a82L,
66460     0x512ac5cd65681ce1L,0xe26c6487326b4cd4L,0x356d27f4a666a6d0L,
66461     0xe791b39ff7c88a19L,0x228730d531a59cb0L,0xf40aab27e2fc0f1bL,
66462     0xbe9ae358b3e01a2eL,0x416c0ce19cb48261L,0x65c61198dad0657aL,
66463     0x997abb1f0a563fdaL
66464 };
66465 /* The Montgomery normalizer for modulus of the curve P1024. */
66466 static const sp_digit p1024_norm_mod[16] = {
66467     0x99927f850157a015L,0x7f3a20ef53853178L,0x031c17dc767a824fL,
66468     0x606b2950a968e0e0L,0x5830c3ade3c3f655L,0x49500b57ce7ad57dL,
66469     0xaed53a329a97e31eL,0x1d939b78cd94b32bL,0xca92d80b5999592fL,
66470     0x186e4c60083775e6L,0xdd78cf2ace5a634fL,0x0bf554d81d03f0e4L,
66471     0x41651ca74c1fe5d1L,0xbe93f31e634b7d9eL,0x9a39ee67252f9a85L,
66472     0x668544e0f5a9c025L
66473 };
66474 /* The Montgomery multiplier for modulus of the curve P1024. */
66475 static sp_digit p1024_mp_mod = 0x290420077c8f2f3d;
66476 #if defined(WOLFSSL_SP_SMALL) || defined(HAVE_ECC_CHECK_KEY)
66477 /* The order of the curve P1024. */
66478 static const sp_digit p1024_order[16] = {
66479     0xd99b601ebfaa17fbL,0x203177c42b1eb3a1L,0xff38fa08e2615f6cL,
66480     0xa7e535abd5a5c7c7L,0xa9f3cf14870f026aL,0x6dabfd2a0c614aa0L,
66481     0x144ab173595a0738L,0x389b1921cc9ad335L,0x4d5b49fd2999a9b4L,
66482     0x39e46ce7fdf22286L,0xc8a1cc354c69672cL,0xbd02aac9f8bf03c6L,
66483     0x6fa6b8d62cf8068bL,0x905b0338672d2098L,0x9971846636b4195eL,
66484     0x265eaec7c2958ff6L
66485 };
66486 #endif
66487 /* The base point of curve P1024. */
66488 static const sp_point_1024 p1024_base = {
66489     /* X ordinate */
66490     {
66491         0x880dc8abeae63895L,0x80ec46c4967e0979L,0xee9163a5b63f73ecL,
66492         0xd5cfb4cc80728d87L,0xa7c1514dba66910dL,0xa702c3397a60de74L,
66493         0x337c86548b72f2e1L,0x9760af765dd5bccbL,0x718bd9e7406ce890L,
66494         0x43d5f22cdb9dfa55L,0xab10db9030b09e10L,0xb5edb6c0f6ce2308L,
66495         0x98b2f204b6ff7cbfL,0x2b1a2fd60aec69c6L,0x0a7990053ed9b52aL,
66496         0x53fc09ee332c29adL,
66497         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66498         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66499         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66500         (sp_digit)0
66501     },
66502     /* Y ordinate */
66503     {
66504         0x75573fd71bef16d7L,0xadb9b5706a67dcdeL,0x80bdad5ad5bb4636L,
66505         0x13515ad7e9cb99a9L,0x492d979fc5a4d5f2L,0xac6f1e80164aa989L,
66506         0xcad696b5b7652fe0L,0x70dae117ad547c6cL,0x416cff0ca9e032b9L,
66507         0x6b598ccf9a140b2eL,0xe7f7f5e5f0de55f6L,0xf5ea69f4654ec2b9L,
66508         0x3d778d821e141178L,0xd3e8201602990696L,0xf9f1f0533634a135L,
66509         0x0a8249063f6009f1L,
66510         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66511         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66512         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66513         (sp_digit)0
66514     },
66515     /* Z ordinate */
66516     {
66517         0x0000000000000001L,0x0000000000000000L,0x0000000000000000L,
66518         0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,
66519         0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,
66520         0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,
66521         0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,
66522         0x0000000000000000L,
66523         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66524         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66525         (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
66526         (sp_digit)0
66527     },
66528     /* infinity */
66529     0
66530 };
66531 
66532 #ifdef WOLFSSL_SP_SMALL
66533 /* Sub b from a into a. (a -= b)
66534  *
66535  * a  A single precision integer.
66536  * b  A single precision integer.
66537  */
sp_1024_sub_in_place_16(sp_digit * a,const sp_digit * b)66538 static sp_digit sp_1024_sub_in_place_16(sp_digit* a, const sp_digit* b)
66539 {
66540     sp_digit c = 0;
66541 
66542     __asm__ __volatile__ (
66543         "add	x10, %[a], 128\n\t"
66544         "\n1:\n\t"
66545         "subs	%[c], xzr, %[c]\n\t"
66546         "ldp	x2, x3, [%[a]]\n\t"
66547         "ldp	x4, x5, [%[a], #16]\n\t"
66548         "ldp	x6, x7, [%[b]], #16\n\t"
66549         "sbcs	x2, x2, x6\n\t"
66550         "ldp	x8, x9, [%[b]], #16\n\t"
66551         "sbcs	x3, x3, x7\n\t"
66552         "sbcs	x4, x4, x8\n\t"
66553         "stp	x2, x3, [%[a]], #16\n\t"
66554         "sbcs	x5, x5, x9\n\t"
66555         "stp	x4, x5, [%[a]], #16\n\t"
66556         "csetm	%[c], cc\n\t"
66557         "cmp	%[a], x10\n\t"
66558         "b.ne	1b\n\t"
66559         : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b)
66560         :
66561         : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
66562     );
66563 
66564     return c;
66565 }
66566 
66567 #endif /* WOLFSSL_SP_SMALL */
66568 /* Conditionally subtract b from a using the mask m.
66569  * m is -1 to subtract and 0 when not copying.
66570  *
66571  * r  A single precision number representing condition subtract result.
66572  * a  A single precision number to subtract from.
66573  * b  A single precision number to subtract.
66574  * m  Mask value to apply.
66575  */
sp_1024_cond_sub_16(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)66576 static sp_digit sp_1024_cond_sub_16(sp_digit* r, const sp_digit* a, const sp_digit* b,
66577         sp_digit m)
66578 {
66579 #ifdef WOLFSSL_SP_SMALL
66580     sp_digit c = 0;
66581 
66582     __asm__ __volatile__ (
66583         "mov	x8, #0\n\t"
66584         "1:\n\t"
66585         "subs	%[c], xzr, %[c]\n\t"
66586         "ldr	x4, [%[a], x8]\n\t"
66587         "ldr	x5, [%[b], x8]\n\t"
66588         "and	x5, x5, %[m]\n\t"
66589         "sbcs	x4, x4, x5\n\t"
66590         "csetm	%[c], cc\n\t"
66591         "str	x4, [%[r], x8]\n\t"
66592         "add	x8, x8, #8\n\t"
66593         "cmp	x8, 128\n\t"
66594         "b.lt	1b\n\t"
66595         : [c] "+r" (c)
66596         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
66597         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
66598     );
66599 
66600     return c;
66601 #else
66602     __asm__ __volatile__ (
66603 
66604         "ldp	x5, x7, [%[b], 0]\n\t"
66605         "ldp	x11, x12, [%[b], 16]\n\t"
66606         "ldp	x4, x6, [%[a], 0]\n\t"
66607         "and	x5, x5, %[m]\n\t"
66608         "ldp	x9, x10, [%[a], 16]\n\t"
66609         "and	x7, x7, %[m]\n\t"
66610         "subs	x4, x4, x5\n\t"
66611         "and	x11, x11, %[m]\n\t"
66612         "sbcs	x6, x6, x7\n\t"
66613         "and	x12, x12, %[m]\n\t"
66614         "sbcs	x9, x9, x11\n\t"
66615         "stp	x4, x6, [%[r], 0]\n\t"
66616         "sbcs	x10, x10, x12\n\t"
66617         "stp	x9, x10, [%[r], 16]\n\t"
66618         "ldp	x5, x7, [%[b], 32]\n\t"
66619         "ldp	x11, x12, [%[b], 48]\n\t"
66620         "ldp	x4, x6, [%[a], 32]\n\t"
66621         "and	x5, x5, %[m]\n\t"
66622         "ldp	x9, x10, [%[a], 48]\n\t"
66623         "and	x7, x7, %[m]\n\t"
66624         "sbcs	x4, x4, x5\n\t"
66625         "and	x11, x11, %[m]\n\t"
66626         "sbcs	x6, x6, x7\n\t"
66627         "and	x12, x12, %[m]\n\t"
66628         "sbcs	x9, x9, x11\n\t"
66629         "stp	x4, x6, [%[r], 32]\n\t"
66630         "sbcs	x10, x10, x12\n\t"
66631         "stp	x9, x10, [%[r], 48]\n\t"
66632         "ldp	x5, x7, [%[b], 64]\n\t"
66633         "ldp	x11, x12, [%[b], 80]\n\t"
66634         "ldp	x4, x6, [%[a], 64]\n\t"
66635         "and	x5, x5, %[m]\n\t"
66636         "ldp	x9, x10, [%[a], 80]\n\t"
66637         "and	x7, x7, %[m]\n\t"
66638         "sbcs	x4, x4, x5\n\t"
66639         "and	x11, x11, %[m]\n\t"
66640         "sbcs	x6, x6, x7\n\t"
66641         "and	x12, x12, %[m]\n\t"
66642         "sbcs	x9, x9, x11\n\t"
66643         "stp	x4, x6, [%[r], 64]\n\t"
66644         "sbcs	x10, x10, x12\n\t"
66645         "stp	x9, x10, [%[r], 80]\n\t"
66646         "ldp	x5, x7, [%[b], 96]\n\t"
66647         "ldp	x11, x12, [%[b], 112]\n\t"
66648         "ldp	x4, x6, [%[a], 96]\n\t"
66649         "and	x5, x5, %[m]\n\t"
66650         "ldp	x9, x10, [%[a], 112]\n\t"
66651         "and	x7, x7, %[m]\n\t"
66652         "sbcs	x4, x4, x5\n\t"
66653         "and	x11, x11, %[m]\n\t"
66654         "sbcs	x6, x6, x7\n\t"
66655         "and	x12, x12, %[m]\n\t"
66656         "sbcs	x9, x9, x11\n\t"
66657         "stp	x4, x6, [%[r], 96]\n\t"
66658         "sbcs	x10, x10, x12\n\t"
66659         "stp	x9, x10, [%[r], 112]\n\t"
66660         "csetm	%[r], cc\n\t"
66661         : [r] "+r" (r)
66662         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
66663         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
66664     );
66665 
66666     return (sp_digit)r;
66667 #endif /* WOLFSSL_SP_SMALL */
66668 }
66669 
66670 #ifdef WOLFSSL_SP_SMALL
66671 /* Add b to a into r. (r = a + b)
66672  *
66673  * r  A single precision integer.
66674  * a  A single precision integer.
66675  * b  A single precision integer.
66676  */
sp_1024_add_16(sp_digit * r,const sp_digit * a,const sp_digit * b)66677 static sp_digit sp_1024_add_16(sp_digit* r, const sp_digit* a,
66678         const sp_digit* b)
66679 {
66680     sp_digit c = 0;
66681 
66682     __asm__ __volatile__ (
66683         "add	x11, %[a], 128\n\t"
66684         "\n1:\n\t"
66685         "adds	%[c], %[c], #-1\n\t"
66686         "ldp	x3, x4, [%[a]], #16\n\t"
66687         "ldp	x5, x6, [%[a]], #16\n\t"
66688         "ldp	x7, x8, [%[b]], #16\n\t"
66689         "adcs	x3, x3, x7\n\t"
66690         "ldp	x9, x10, [%[b]], #16\n\t"
66691         "adcs	x4, x4, x8\n\t"
66692         "adcs	x5, x5, x9\n\t"
66693         "stp	x3, x4, [%[r]], #16\n\t"
66694         "adcs	x6, x6, x10\n\t"
66695         "stp	x5, x6, [%[r]], #16\n\t"
66696         "cset	%[c], cs\n\t"
66697         "cmp	%[a], x11\n\t"
66698         "b.ne	1b\n\t"
66699         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
66700         :
66701         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
66702     );
66703 
66704     return c;
66705 }
66706 
66707 #endif /* WOLFSSL_SP_SMALL */
66708 /* Mul a by digit b into r. (r = a * b)
66709  *
66710  * r  A single precision integer.
66711  * a  A single precision integer.
66712  * b  A single precision digit.
66713  */
sp_1024_mul_d_16(sp_digit * r,const sp_digit * a,sp_digit b)66714 static void sp_1024_mul_d_16(sp_digit* r, const sp_digit* a,
66715         sp_digit b)
66716 {
66717 #ifdef WOLFSSL_SP_SMALL
66718     __asm__ __volatile__ (
66719         "# A[0] * B\n\t"
66720         "ldr	x8, [%[a]]\n\t"
66721         "mul	x5, %[b], x8\n\t"
66722         "umulh	x3, %[b], x8\n\t"
66723         "mov	x4, 0\n\t"
66724         "str	x5, [%[r]]\n\t"
66725         "mov	x5, 0\n\t"
66726         "mov	x9, #8\n\t"
66727         "1:\n\t"
66728         "ldr	x8, [%[a], x9]\n\t"
66729         "mul	x6, %[b], x8\n\t"
66730         "umulh	x7, %[b], x8\n\t"
66731         "adds	x3, x3, x6\n\t"
66732         "adcs	x4, x4, x7\n\t"
66733         "adc	x5, xzr, xzr\n\t"
66734         "str	x3, [%[r], x9]\n\t"
66735         "mov	x3, x4\n\t"
66736         "mov	x4, x5\n\t"
66737         "mov	x5, #0\n\t"
66738         "add	x9, x9, #8\n\t"
66739         "cmp	x9, 128\n\t"
66740         "b.lt	1b\n\t"
66741         "str	x3, [%[r], 128]\n\t"
66742         :
66743         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
66744         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
66745     );
66746 #else
66747     __asm__ __volatile__ (
66748         "# A[0] * B\n\t"
66749         "ldp	x8, x9, [%[a]]\n\t"
66750         "mul	x3, %[b], x8\n\t"
66751         "umulh	x4, %[b], x8\n\t"
66752         "mov	x5, 0\n\t"
66753         "# A[1] * B\n\t"
66754         "str	x3, [%[r]]\n\t"
66755         "mov	x3, 0\n\t"
66756         "mul	x6, %[b], x9\n\t"
66757         "umulh	x7, %[b], x9\n\t"
66758         "adds	x4, x4, x6\n\t"
66759         "# A[2] * B\n\t"
66760         "ldp	x8, x9, [%[a], 16]\n\t"
66761         "str	x4, [%[r], 8]\n\t"
66762         "mov	x4, 0\n\t"
66763         "mul	x6, %[b], x8\n\t"
66764         "adcs	x5, x5, x7\n\t"
66765         "umulh	x7, %[b], x8\n\t"
66766         "adc	x3, xzr, xzr\n\t"
66767         "adds	x5, x5, x6\n\t"
66768         "# A[3] * B\n\t"
66769         "str	x5, [%[r], 16]\n\t"
66770         "mov	x5, 0\n\t"
66771         "mul	x6, %[b], x9\n\t"
66772         "adcs	x3, x3, x7\n\t"
66773         "umulh	x7, %[b], x9\n\t"
66774         "adc	x4, xzr, xzr\n\t"
66775         "adds	x3, x3, x6\n\t"
66776         "# A[4] * B\n\t"
66777         "ldp	x8, x9, [%[a], 32]\n\t"
66778         "str	x3, [%[r], 24]\n\t"
66779         "mov	x3, 0\n\t"
66780         "mul	x6, %[b], x8\n\t"
66781         "adcs	x4, x4, x7\n\t"
66782         "umulh	x7, %[b], x8\n\t"
66783         "adc	x5, xzr, xzr\n\t"
66784         "adds	x4, x4, x6\n\t"
66785         "# A[5] * B\n\t"
66786         "str	x4, [%[r], 32]\n\t"
66787         "mov	x4, 0\n\t"
66788         "mul	x6, %[b], x9\n\t"
66789         "adcs	x5, x5, x7\n\t"
66790         "umulh	x7, %[b], x9\n\t"
66791         "adc	x3, xzr, xzr\n\t"
66792         "adds	x5, x5, x6\n\t"
66793         "# A[6] * B\n\t"
66794         "ldp	x8, x9, [%[a], 48]\n\t"
66795         "str	x5, [%[r], 40]\n\t"
66796         "mov	x5, 0\n\t"
66797         "mul	x6, %[b], x8\n\t"
66798         "adcs	x3, x3, x7\n\t"
66799         "umulh	x7, %[b], x8\n\t"
66800         "adc	x4, xzr, xzr\n\t"
66801         "adds	x3, x3, x6\n\t"
66802         "# A[7] * B\n\t"
66803         "str	x3, [%[r], 48]\n\t"
66804         "mov	x3, 0\n\t"
66805         "mul	x6, %[b], x9\n\t"
66806         "adcs	x4, x4, x7\n\t"
66807         "umulh	x7, %[b], x9\n\t"
66808         "adc	x5, xzr, xzr\n\t"
66809         "adds	x4, x4, x6\n\t"
66810         "# A[8] * B\n\t"
66811         "ldp	x8, x9, [%[a], 64]\n\t"
66812         "str	x4, [%[r], 56]\n\t"
66813         "mov	x4, 0\n\t"
66814         "mul	x6, %[b], x8\n\t"
66815         "adcs	x5, x5, x7\n\t"
66816         "umulh	x7, %[b], x8\n\t"
66817         "adc	x3, xzr, xzr\n\t"
66818         "adds	x5, x5, x6\n\t"
66819         "# A[9] * B\n\t"
66820         "str	x5, [%[r], 64]\n\t"
66821         "mov	x5, 0\n\t"
66822         "mul	x6, %[b], x9\n\t"
66823         "adcs	x3, x3, x7\n\t"
66824         "umulh	x7, %[b], x9\n\t"
66825         "adc	x4, xzr, xzr\n\t"
66826         "adds	x3, x3, x6\n\t"
66827         "# A[10] * B\n\t"
66828         "ldp	x8, x9, [%[a], 80]\n\t"
66829         "str	x3, [%[r], 72]\n\t"
66830         "mov	x3, 0\n\t"
66831         "mul	x6, %[b], x8\n\t"
66832         "adcs	x4, x4, x7\n\t"
66833         "umulh	x7, %[b], x8\n\t"
66834         "adc	x5, xzr, xzr\n\t"
66835         "adds	x4, x4, x6\n\t"
66836         "# A[11] * B\n\t"
66837         "str	x4, [%[r], 80]\n\t"
66838         "mov	x4, 0\n\t"
66839         "mul	x6, %[b], x9\n\t"
66840         "adcs	x5, x5, x7\n\t"
66841         "umulh	x7, %[b], x9\n\t"
66842         "adc	x3, xzr, xzr\n\t"
66843         "adds	x5, x5, x6\n\t"
66844         "# A[12] * B\n\t"
66845         "ldp	x8, x9, [%[a], 96]\n\t"
66846         "str	x5, [%[r], 88]\n\t"
66847         "mov	x5, 0\n\t"
66848         "mul	x6, %[b], x8\n\t"
66849         "adcs	x3, x3, x7\n\t"
66850         "umulh	x7, %[b], x8\n\t"
66851         "adc	x4, xzr, xzr\n\t"
66852         "adds	x3, x3, x6\n\t"
66853         "# A[13] * B\n\t"
66854         "str	x3, [%[r], 96]\n\t"
66855         "mov	x3, 0\n\t"
66856         "mul	x6, %[b], x9\n\t"
66857         "adcs	x4, x4, x7\n\t"
66858         "umulh	x7, %[b], x9\n\t"
66859         "adc	x5, xzr, xzr\n\t"
66860         "adds	x4, x4, x6\n\t"
66861         "# A[14] * B\n\t"
66862         "ldp	x8, x9, [%[a], 112]\n\t"
66863         "str	x4, [%[r], 104]\n\t"
66864         "mov	x4, 0\n\t"
66865         "mul	x6, %[b], x8\n\t"
66866         "adcs	x5, x5, x7\n\t"
66867         "umulh	x7, %[b], x8\n\t"
66868         "adc	x3, xzr, xzr\n\t"
66869         "adds	x5, x5, x6\n\t"
66870         "# A[15] * B\n\t"
66871         "str	x5, [%[r], 112]\n\t"
66872         "mul	x6, %[b], x9\n\t"
66873         "adcs	x3, x3, x7\n\t"
66874         "umulh	x7, %[b], x9\n\t"
66875         "adc	x4, xzr, xzr\n\t"
66876         "adds	x3, x3, x6\n\t"
66877         "adc	x4, x4, x7\n\t"
66878         "stp	x3, x4, [%[r], 120]\n\t"
66879         :
66880         : [r] "r" (r), [a] "r" (a), [b] "r" (b)
66881         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9"
66882     );
66883 #endif
66884 }
66885 
66886 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div)
66887  *
66888  * d1   The high order half of the number to divide.
66889  * d0   The low order half of the number to divide.
66890  * div  The dividend.
66891  * returns the result of the division.
66892  */
div_1024_word_16(sp_digit d1,sp_digit d0,sp_digit div)66893 static sp_digit div_1024_word_16(sp_digit d1, sp_digit d0, sp_digit div)
66894 {
66895     sp_digit r;
66896 
66897     __asm__ __volatile__ (
66898         "lsr	x5, %[div], 32\n\t"
66899         "add	x5, x5, 1\n\t"
66900 
66901         "udiv	x3, %[d1], x5\n\t"
66902         "lsl	x6, x3, 32\n\t"
66903         "mul	x4, %[div], x6\n\t"
66904         "umulh	x3, %[div], x6\n\t"
66905         "subs	%[d0], %[d0], x4\n\t"
66906         "sbc	%[d1], %[d1], x3\n\t"
66907 
66908         "udiv	x3, %[d1], x5\n\t"
66909         "lsl	x3, x3, 32\n\t"
66910         "add	x6, x6, x3\n\t"
66911         "mul	x4, %[div], x3\n\t"
66912         "umulh	x3, %[div], x3\n\t"
66913         "subs	%[d0], %[d0], x4\n\t"
66914         "sbc	%[d1], %[d1], x3\n\t"
66915 
66916         "lsr	x3, %[d0], 32\n\t"
66917         "orr	x3, x3, %[d1], lsl 32\n\t"
66918 
66919         "udiv	x3, x3, x5\n\t"
66920         "add	x6, x6, x3\n\t"
66921         "mul	x4, %[div], x3\n\t"
66922         "umulh	x3, %[div], x3\n\t"
66923         "subs	%[d0], %[d0], x4\n\t"
66924         "sbc	%[d1], %[d1], x3\n\t"
66925 
66926         "lsr	x3, %[d0], 32\n\t"
66927         "orr	x3, x3, %[d1], lsl 32\n\t"
66928 
66929         "udiv	x3, x3, x5\n\t"
66930         "add	x6, x6, x3\n\t"
66931         "mul	x4, %[div], x3\n\t"
66932         "sub	%[d0], %[d0], x4\n\t"
66933 
66934         "udiv	x3, %[d0], %[div]\n\t"
66935         "add	%[r], x6, x3\n\t"
66936 
66937         : [r] "=r" (r)
66938         : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div)
66939         : "x3", "x4", "x5", "x6"
66940     );
66941 
66942     return r;
66943 }
66944 
66945 /* AND m into each word of a and store in r.
66946  *
66947  * r  A single precision integer.
66948  * a  A single precision integer.
66949  * m  Mask to AND against each digit.
66950  */
sp_1024_mask_16(sp_digit * r,const sp_digit * a,sp_digit m)66951 static void sp_1024_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
66952 {
66953 #ifdef WOLFSSL_SP_SMALL
66954     int i;
66955 
66956     for (i=0; i<16; i++) {
66957         r[i] = a[i] & m;
66958     }
66959 #else
66960     int i;
66961 
66962     for (i = 0; i < 16; i += 8) {
66963         r[i+0] = a[i+0] & m;
66964         r[i+1] = a[i+1] & m;
66965         r[i+2] = a[i+2] & m;
66966         r[i+3] = a[i+3] & m;
66967         r[i+4] = a[i+4] & m;
66968         r[i+5] = a[i+5] & m;
66969         r[i+6] = a[i+6] & m;
66970         r[i+7] = a[i+7] & m;
66971     }
66972 #endif
66973 }
66974 
66975 /* Compare a with b in constant time.
66976  *
66977  * a  A single precision integer.
66978  * b  A single precision integer.
66979  * return -ve, 0 or +ve if a is less than, equal to or greater than b
66980  * respectively.
66981  */
sp_1024_cmp_16(const sp_digit * a,const sp_digit * b)66982 static sp_int64 sp_1024_cmp_16(const sp_digit* a, const sp_digit* b)
66983 {
66984 #ifdef WOLFSSL_SP_SMALL
66985     __asm__ __volatile__ (
66986         "mov	x2, -1\n\t"
66987         "mov	x3, 1\n\t"
66988         "mov	x4, -1\n\t"
66989         "mov	x5, 120\n\t"
66990         "1:\n\t"
66991         "ldr	x6, [%[a], x5]\n\t"
66992         "ldr	x7, [%[b], x5]\n\t"
66993         "and	x6, x6, x4\n\t"
66994         "and	x7, x7, x4\n\t"
66995         "subs	x6, x6, x7\n\t"
66996         "csel	x2, x3, x2, hi\n\t"
66997         "csel	x2, x4, x2, lo\n\t"
66998         "csel	x4, x4, xzr, eq\n\t"
66999         "subs	x5, x5, #8\n\t"
67000         "b.cs	1b\n\t"
67001         "eor	%[a], x2, x4\n\t"
67002         : [a] "+r" (a)
67003         : [b] "r" (b)
67004         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
67005     );
67006 #else
67007     __asm__ __volatile__ (
67008         "mov	x2, -1\n\t"
67009         "mov	x3, 1\n\t"
67010         "mov  x4, -1\n\t"
67011         "ldp	x5, x6, [%[a], 112]\n\t"
67012         "ldp	x7, x8, [%[b], 112]\n\t"
67013         "and	x6, x6, x4\n\t"
67014         "and	x8, x8, x4\n\t"
67015         "subs	x6, x6, x8\n\t"
67016         "csel	x2, x4, x2, lo\n\t"
67017         "csel	x4, x4, xzr, eq\n\t"
67018         "csel	x2, x3, x2, hi\n\t"
67019         "and	x5, x5, x4\n\t"
67020         "and	x7, x7, x4\n\t"
67021         "subs	x5, x5, x7\n\t"
67022         "csel	x2, x4, x2, lo\n\t"
67023         "csel	x4, x4, xzr, eq\n\t"
67024         "csel	x2, x3, x2, hi\n\t"
67025         "ldp	x5, x6, [%[a], 96]\n\t"
67026         "ldp	x7, x8, [%[b], 96]\n\t"
67027         "and	x6, x6, x4\n\t"
67028         "and	x8, x8, x4\n\t"
67029         "subs	x6, x6, x8\n\t"
67030         "csel	x2, x4, x2, lo\n\t"
67031         "csel	x4, x4, xzr, eq\n\t"
67032         "csel	x2, x3, x2, hi\n\t"
67033         "and	x5, x5, x4\n\t"
67034         "and	x7, x7, x4\n\t"
67035         "subs	x5, x5, x7\n\t"
67036         "csel	x2, x4, x2, lo\n\t"
67037         "csel	x4, x4, xzr, eq\n\t"
67038         "csel	x2, x3, x2, hi\n\t"
67039         "ldp	x5, x6, [%[a], 80]\n\t"
67040         "ldp	x7, x8, [%[b], 80]\n\t"
67041         "and	x6, x6, x4\n\t"
67042         "and	x8, x8, x4\n\t"
67043         "subs	x6, x6, x8\n\t"
67044         "csel	x2, x4, x2, lo\n\t"
67045         "csel	x4, x4, xzr, eq\n\t"
67046         "csel	x2, x3, x2, hi\n\t"
67047         "and	x5, x5, x4\n\t"
67048         "and	x7, x7, x4\n\t"
67049         "subs	x5, x5, x7\n\t"
67050         "csel	x2, x4, x2, lo\n\t"
67051         "csel	x4, x4, xzr, eq\n\t"
67052         "csel	x2, x3, x2, hi\n\t"
67053         "ldp	x5, x6, [%[a], 64]\n\t"
67054         "ldp	x7, x8, [%[b], 64]\n\t"
67055         "and	x6, x6, x4\n\t"
67056         "and	x8, x8, x4\n\t"
67057         "subs	x6, x6, x8\n\t"
67058         "csel	x2, x4, x2, lo\n\t"
67059         "csel	x4, x4, xzr, eq\n\t"
67060         "csel	x2, x3, x2, hi\n\t"
67061         "and	x5, x5, x4\n\t"
67062         "and	x7, x7, x4\n\t"
67063         "subs	x5, x5, x7\n\t"
67064         "csel	x2, x4, x2, lo\n\t"
67065         "csel	x4, x4, xzr, eq\n\t"
67066         "csel	x2, x3, x2, hi\n\t"
67067         "ldp	x5, x6, [%[a], 48]\n\t"
67068         "ldp	x7, x8, [%[b], 48]\n\t"
67069         "and	x6, x6, x4\n\t"
67070         "and	x8, x8, x4\n\t"
67071         "subs	x6, x6, x8\n\t"
67072         "csel	x2, x4, x2, lo\n\t"
67073         "csel	x4, x4, xzr, eq\n\t"
67074         "csel	x2, x3, x2, hi\n\t"
67075         "and	x5, x5, x4\n\t"
67076         "and	x7, x7, x4\n\t"
67077         "subs	x5, x5, x7\n\t"
67078         "csel	x2, x4, x2, lo\n\t"
67079         "csel	x4, x4, xzr, eq\n\t"
67080         "csel	x2, x3, x2, hi\n\t"
67081         "ldp	x5, x6, [%[a], 32]\n\t"
67082         "ldp	x7, x8, [%[b], 32]\n\t"
67083         "and	x6, x6, x4\n\t"
67084         "and	x8, x8, x4\n\t"
67085         "subs	x6, x6, x8\n\t"
67086         "csel	x2, x4, x2, lo\n\t"
67087         "csel	x4, x4, xzr, eq\n\t"
67088         "csel	x2, x3, x2, hi\n\t"
67089         "and	x5, x5, x4\n\t"
67090         "and	x7, x7, x4\n\t"
67091         "subs	x5, x5, x7\n\t"
67092         "csel	x2, x4, x2, lo\n\t"
67093         "csel	x4, x4, xzr, eq\n\t"
67094         "csel	x2, x3, x2, hi\n\t"
67095         "ldp	x5, x6, [%[a], 16]\n\t"
67096         "ldp	x7, x8, [%[b], 16]\n\t"
67097         "and	x6, x6, x4\n\t"
67098         "and	x8, x8, x4\n\t"
67099         "subs	x6, x6, x8\n\t"
67100         "csel	x2, x4, x2, lo\n\t"
67101         "csel	x4, x4, xzr, eq\n\t"
67102         "csel	x2, x3, x2, hi\n\t"
67103         "and	x5, x5, x4\n\t"
67104         "and	x7, x7, x4\n\t"
67105         "subs	x5, x5, x7\n\t"
67106         "csel	x2, x4, x2, lo\n\t"
67107         "csel	x4, x4, xzr, eq\n\t"
67108         "csel	x2, x3, x2, hi\n\t"
67109         "ldp	x5, x6, [%[a], 0]\n\t"
67110         "ldp	x7, x8, [%[b], 0]\n\t"
67111         "and	x6, x6, x4\n\t"
67112         "and	x8, x8, x4\n\t"
67113         "subs	x6, x6, x8\n\t"
67114         "csel	x2, x4, x2, lo\n\t"
67115         "csel	x4, x4, xzr, eq\n\t"
67116         "csel	x2, x3, x2, hi\n\t"
67117         "and	x5, x5, x4\n\t"
67118         "and	x7, x7, x4\n\t"
67119         "subs	x5, x5, x7\n\t"
67120         "csel	x2, x4, x2, lo\n\t"
67121         "csel	x4, x4, xzr, eq\n\t"
67122         "csel	x2, x3, x2, hi\n\t"
67123         "eor	%[a], x2, x4\n\t"
67124         : [a] "+r" (a)
67125         : [b] "r" (b)
67126         : "x2", "x3", "x4", "x5", "x6", "x7", "x8"
67127     );
67128 #endif
67129 
67130     return (sp_int64)a;
67131 }
67132 
67133 /* Divide d in a and put remainder into r (m*d + r = a)
67134  * m is not calculated as it is not needed at this time.
67135  *
67136  * a  Number to be divided.
67137  * d  Number to divide with.
67138  * m  Multiplier result.
67139  * r  Remainder from the division.
67140  * returns MP_OKAY indicating success.
67141  */
sp_1024_div_16(const sp_digit * a,const sp_digit * d,sp_digit * m,sp_digit * r)67142 static WC_INLINE int sp_1024_div_16(const sp_digit* a, const sp_digit* d, sp_digit* m,
67143         sp_digit* r)
67144 {
67145     sp_digit t1[32], t2[17];
67146     sp_digit div, r1;
67147     int i;
67148 
67149     (void)m;
67150 
67151     div = d[15];
67152     XMEMCPY(t1, a, sizeof(*t1) * 2 * 16);
67153     for (i=15; i>=0; i--) {
67154         sp_digit hi = t1[16 + i] - (t1[16 + i] == div);
67155         r1 = div_1024_word_16(hi, t1[16 + i - 1], div);
67156 
67157         sp_1024_mul_d_16(t2, d, r1);
67158         t1[16 + i] += sp_1024_sub_in_place_16(&t1[i], t2);
67159         t1[16 + i] -= t2[16];
67160         sp_1024_mask_16(t2, d, t1[16 + i]);
67161         t1[16 + i] += sp_1024_add_16(&t1[i], &t1[i], t2);
67162         sp_1024_mask_16(t2, d, t1[16 + i]);
67163         t1[16 + i] += sp_1024_add_16(&t1[i], &t1[i], t2);
67164     }
67165 
67166     r1 = sp_1024_cmp_16(t1, d) >= 0;
67167     sp_1024_cond_sub_16(r, t1, d, (sp_digit)0 - r1);
67168 
67169     return MP_OKAY;
67170 }
67171 
67172 /* Reduce a modulo m into r. (r = a mod m)
67173  *
67174  * r  A single precision number that is the reduced result.
67175  * a  A single precision number that is to be reduced.
67176  * m  A single precision number that is the modulus to reduce with.
67177  * returns MP_OKAY indicating success.
67178  */
sp_1024_mod_16(sp_digit * r,const sp_digit * a,const sp_digit * m)67179 static WC_INLINE int sp_1024_mod_16(sp_digit* r, const sp_digit* a, const sp_digit* m)
67180 {
67181     return sp_1024_div_16(a, m, NULL, r);
67182 }
67183 
67184 /* Multiply a number by Montgomery normalizer mod modulus (prime).
67185  *
67186  * r  The resulting Montgomery form number.
67187  * a  The number to convert.
67188  * m  The modulus (prime).
67189  * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
67190  */
sp_1024_mod_mul_norm_16(sp_digit * r,const sp_digit * a,const sp_digit * m)67191 static int sp_1024_mod_mul_norm_16(sp_digit* r, const sp_digit* a,
67192         const sp_digit* m)
67193 {
67194     sp_1024_mul_16(r, a, p1024_norm_mod);
67195     return sp_1024_mod_16(r, r, m);
67196 }
67197 
67198 
67199 #ifdef WOLFCRYPT_HAVE_SAKKE
67200 /* Create a new point.
67201  *
67202  * heap  [in]   Buffer to allocate dynamic memory from.
67203  * sp    [in]   Data for point - only if not allocating.
67204  * p     [out]  New point.
67205  * returns MEMORY_E when dynamic memory allocation fails and 0 otherwise.
67206  */
sp_1024_point_new_ex_16(void * heap,sp_point_1024 * sp,sp_point_1024 ** p)67207 static int sp_1024_point_new_ex_16(void* heap, sp_point_1024* sp,
67208     sp_point_1024** p)
67209 {
67210     int ret = MP_OKAY;
67211     (void)heap;
67212 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
67213     (void)sp;
67214     *p = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap, DYNAMIC_TYPE_ECC);
67215 #else
67216     *p = sp;
67217 #endif
67218     if (*p == NULL) {
67219         ret = MEMORY_E;
67220     }
67221     return ret;
67222 }
67223 
67224 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
67225 /* Allocate memory for point and return error. */
67226 #define sp_1024_point_new_16(heap, sp, p) sp_1024_point_new_ex_16((heap), NULL, &(p))
67227 #else
67228 /* Set pointer to data and return no error. */
67229 #define sp_1024_point_new_16(heap, sp, p) sp_1024_point_new_ex_16((heap), &(sp), &(p))
67230 #endif
67231 #endif /* WOLFCRYPT_HAVE_SAKKE */
67232 #ifdef WOLFCRYPT_HAVE_SAKKE
67233 /* Free the point.
67234  *
67235  * p      [in,out]  Point to free.
67236  * clear  [in]      Indicates whether to zeroize point.
67237  * heap   [in]      Buffer from which dynamic memory was allocate from.
67238  */
sp_1024_point_free_16(sp_point_1024 * p,int clear,void * heap)67239 static void sp_1024_point_free_16(sp_point_1024* p, int clear, void* heap)
67240 {
67241 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
67242 /* If valid pointer then clear point data if requested and free data. */
67243     if (p != NULL) {
67244         if (clear != 0) {
67245             XMEMSET(p, 0, sizeof(*p));
67246         }
67247         XFREE(p, heap, DYNAMIC_TYPE_ECC);
67248     }
67249 #else
67250 /* Clear point data if requested. */
67251     if ((p != NULL) && (clear != 0)) {
67252         XMEMSET(p, 0, sizeof(*p));
67253     }
67254 #endif
67255     (void)heap;
67256 }
67257 #endif /* WOLFCRYPT_HAVE_SAKKE */
67258 
67259 /* Convert an mp_int to an array of sp_digit.
67260  *
67261  * r  A single precision integer.
67262  * size  Maximum number of bytes to convert
67263  * a  A multi-precision integer.
67264  */
sp_1024_from_mp(sp_digit * r,int size,const mp_int * a)67265 static void sp_1024_from_mp(sp_digit* r, int size, const mp_int* a)
67266 {
67267 #if DIGIT_BIT == 64
67268     int j;
67269 
67270     XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
67271 
67272     for (j = a->used; j < size; j++) {
67273         r[j] = 0;
67274     }
67275 #elif DIGIT_BIT > 64
67276     int i;
67277     int j = 0;
67278     word32 s = 0;
67279 
67280     r[0] = 0;
67281     for (i = 0; i < a->used && j < size; i++) {
67282         r[j] |= ((sp_digit)a->dp[i] << s);
67283         r[j] &= 0xffffffffffffffffl;
67284         s = 64U - s;
67285         if (j + 1 >= size) {
67286             break;
67287         }
67288         /* lint allow cast of mismatch word32 and mp_digit */
67289         r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
67290         while ((s + 64U) <= (word32)DIGIT_BIT) {
67291             s += 64U;
67292             r[j] &= 0xffffffffffffffffl;
67293             if (j + 1 >= size) {
67294                 break;
67295             }
67296             if (s < (word32)DIGIT_BIT) {
67297                 /* lint allow cast of mismatch word32 and mp_digit */
67298                 r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
67299             }
67300             else {
67301                 r[++j] = (sp_digit)0;
67302             }
67303         }
67304         s = (word32)DIGIT_BIT - s;
67305     }
67306 
67307     for (j++; j < size; j++) {
67308         r[j] = 0;
67309     }
67310 #else
67311     int i;
67312     int j = 0;
67313     int s = 0;
67314 
67315     r[0] = 0;
67316     for (i = 0; i < a->used && j < size; i++) {
67317         r[j] |= ((sp_digit)a->dp[i]) << s;
67318         if (s + DIGIT_BIT >= 64) {
67319             r[j] &= 0xffffffffffffffffl;
67320             if (j + 1 >= size) {
67321                 break;
67322             }
67323             s = 64 - s;
67324             if (s == DIGIT_BIT) {
67325                 r[++j] = 0;
67326                 s = 0;
67327             }
67328             else {
67329                 r[++j] = a->dp[i] >> s;
67330                 s = DIGIT_BIT - s;
67331             }
67332         }
67333         else {
67334             s += DIGIT_BIT;
67335         }
67336     }
67337 
67338     for (j++; j < size; j++) {
67339         r[j] = 0;
67340     }
67341 #endif
67342 }
67343 
67344 /* Convert a point of type ecc_point to type sp_point_1024.
67345  *
67346  * p   Point of type sp_point_1024 (result).
67347  * pm  Point of type ecc_point.
67348  */
sp_1024_point_from_ecc_point_16(sp_point_1024 * p,const ecc_point * pm)67349 static void sp_1024_point_from_ecc_point_16(sp_point_1024* p,
67350         const ecc_point* pm)
67351 {
67352     XMEMSET(p->x, 0, sizeof(p->x));
67353     XMEMSET(p->y, 0, sizeof(p->y));
67354     XMEMSET(p->z, 0, sizeof(p->z));
67355     sp_1024_from_mp(p->x, 16, pm->x);
67356     sp_1024_from_mp(p->y, 16, pm->y);
67357     sp_1024_from_mp(p->z, 16, pm->z);
67358     p->infinity = 0;
67359 }
67360 
67361 /* Convert an array of sp_digit to an mp_int.
67362  *
67363  * a  A single precision integer.
67364  * r  A multi-precision integer.
67365  */
sp_1024_to_mp(const sp_digit * a,mp_int * r)67366 static int sp_1024_to_mp(const sp_digit* a, mp_int* r)
67367 {
67368     int err;
67369 
67370     err = mp_grow(r, (1024 + DIGIT_BIT - 1) / DIGIT_BIT);
67371     if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
67372 #if DIGIT_BIT == 64
67373         XMEMCPY(r->dp, a, sizeof(sp_digit) * 16);
67374         r->used = 16;
67375         mp_clamp(r);
67376 #elif DIGIT_BIT < 64
67377         int i;
67378         int j = 0;
67379         int s = 0;
67380 
67381         r->dp[0] = 0;
67382         for (i = 0; i < 16; i++) {
67383             r->dp[j] |= (mp_digit)(a[i] << s);
67384             r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
67385             s = DIGIT_BIT - s;
67386             r->dp[++j] = (mp_digit)(a[i] >> s);
67387             while (s + DIGIT_BIT <= 64) {
67388                 s += DIGIT_BIT;
67389                 r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
67390                 if (s == SP_WORD_SIZE) {
67391                     r->dp[j] = 0;
67392                 }
67393                 else {
67394                     r->dp[j] = (mp_digit)(a[i] >> s);
67395                 }
67396             }
67397             s = 64 - s;
67398         }
67399         r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
67400         mp_clamp(r);
67401 #else
67402         int i;
67403         int j = 0;
67404         int s = 0;
67405 
67406         r->dp[0] = 0;
67407         for (i = 0; i < 16; i++) {
67408             r->dp[j] |= ((mp_digit)a[i]) << s;
67409             if (s + 64 >= DIGIT_BIT) {
67410     #if DIGIT_BIT != 32 && DIGIT_BIT != 64
67411                 r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
67412     #endif
67413                 s = DIGIT_BIT - s;
67414                 r->dp[++j] = a[i] >> s;
67415                 s = 64 - s;
67416             }
67417             else {
67418                 s += 64;
67419             }
67420         }
67421         r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
67422         mp_clamp(r);
67423 #endif
67424     }
67425 
67426     return err;
67427 }
67428 
67429 /* Convert a point of type sp_point_1024 to type ecc_point.
67430  *
67431  * p   Point of type sp_point_1024.
67432  * pm  Point of type ecc_point (result).
67433  * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
67434  * MP_OKAY.
67435  */
sp_1024_point_to_ecc_point_16(const sp_point_1024 * p,ecc_point * pm)67436 static int sp_1024_point_to_ecc_point_16(const sp_point_1024* p, ecc_point* pm)
67437 {
67438     int err;
67439 
67440     err = sp_1024_to_mp(p->x, pm->x);
67441     if (err == MP_OKAY) {
67442         err = sp_1024_to_mp(p->y, pm->y);
67443     }
67444     if (err == MP_OKAY) {
67445         err = sp_1024_to_mp(p->z, pm->z);
67446     }
67447 
67448     return err;
67449 }
67450 
67451 /* Conditionally copy a into r using the mask m.
67452  * m is -1 to copy and 0 when not.
67453  *
67454  * r  A single precision number to copy over.
67455  * a  A single precision number to copy.
67456  * m  Mask value to apply.
67457  */
sp_1024_cond_copy_16(sp_digit * r,const sp_digit * a,sp_digit m)67458 static void sp_1024_cond_copy_16(sp_digit* r, const sp_digit* a, sp_digit m)
67459 {
67460     __asm__ __volatile__ (
67461         "ldp	x3, x4, [%[r], 0]\n\t"
67462         "ldp	x5, x6, [%[a], 0]\n\t"
67463         "eor	x5, x5, x3\n\t"
67464         "eor	x6, x6, x4\n\t"
67465         "and	x5, x5, %[m]\n\t"
67466         "and	x6, x6, %[m]\n\t"
67467         "eor	x3, x3, x5\n\t"
67468         "eor	x4, x4, x6\n\t"
67469         "stp	x3, x4, [%[r], 0]\n\t"
67470         "ldp	x3, x4, [%[r], 16]\n\t"
67471         "ldp	x5, x6, [%[a], 16]\n\t"
67472         "eor	x5, x5, x3\n\t"
67473         "eor	x6, x6, x4\n\t"
67474         "and	x5, x5, %[m]\n\t"
67475         "and	x6, x6, %[m]\n\t"
67476         "eor	x3, x3, x5\n\t"
67477         "eor	x4, x4, x6\n\t"
67478         "stp	x3, x4, [%[r], 16]\n\t"
67479         "ldp	x3, x4, [%[r], 32]\n\t"
67480         "ldp	x5, x6, [%[a], 32]\n\t"
67481         "eor	x5, x5, x3\n\t"
67482         "eor	x6, x6, x4\n\t"
67483         "and	x5, x5, %[m]\n\t"
67484         "and	x6, x6, %[m]\n\t"
67485         "eor	x3, x3, x5\n\t"
67486         "eor	x4, x4, x6\n\t"
67487         "stp	x3, x4, [%[r], 32]\n\t"
67488         "ldp	x3, x4, [%[r], 48]\n\t"
67489         "ldp	x5, x6, [%[a], 48]\n\t"
67490         "eor	x5, x5, x3\n\t"
67491         "eor	x6, x6, x4\n\t"
67492         "and	x5, x5, %[m]\n\t"
67493         "and	x6, x6, %[m]\n\t"
67494         "eor	x3, x3, x5\n\t"
67495         "eor	x4, x4, x6\n\t"
67496         "stp	x3, x4, [%[r], 48]\n\t"
67497         "ldp	x3, x4, [%[r], 64]\n\t"
67498         "ldp	x5, x6, [%[a], 64]\n\t"
67499         "eor	x5, x5, x3\n\t"
67500         "eor	x6, x6, x4\n\t"
67501         "and	x5, x5, %[m]\n\t"
67502         "and	x6, x6, %[m]\n\t"
67503         "eor	x3, x3, x5\n\t"
67504         "eor	x4, x4, x6\n\t"
67505         "stp	x3, x4, [%[r], 64]\n\t"
67506         "ldp	x3, x4, [%[r], 80]\n\t"
67507         "ldp	x5, x6, [%[a], 80]\n\t"
67508         "eor	x5, x5, x3\n\t"
67509         "eor	x6, x6, x4\n\t"
67510         "and	x5, x5, %[m]\n\t"
67511         "and	x6, x6, %[m]\n\t"
67512         "eor	x3, x3, x5\n\t"
67513         "eor	x4, x4, x6\n\t"
67514         "stp	x3, x4, [%[r], 80]\n\t"
67515         "ldp	x3, x4, [%[r], 96]\n\t"
67516         "ldp	x5, x6, [%[a], 96]\n\t"
67517         "eor	x5, x5, x3\n\t"
67518         "eor	x6, x6, x4\n\t"
67519         "and	x5, x5, %[m]\n\t"
67520         "and	x6, x6, %[m]\n\t"
67521         "eor	x3, x3, x5\n\t"
67522         "eor	x4, x4, x6\n\t"
67523         "stp	x3, x4, [%[r], 96]\n\t"
67524         "ldp	x3, x4, [%[r], 112]\n\t"
67525         "ldp	x5, x6, [%[a], 112]\n\t"
67526         "eor	x5, x5, x3\n\t"
67527         "eor	x6, x6, x4\n\t"
67528         "and	x5, x5, %[m]\n\t"
67529         "and	x6, x6, %[m]\n\t"
67530         "eor	x3, x3, x5\n\t"
67531         "eor	x4, x4, x6\n\t"
67532         "stp	x3, x4, [%[r], 112]\n\t"
67533         :
67534         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
67535         : "memory", "x3", "x4", "x5", "x6"
67536     );
67537 }
67538 
67539 /* Reduce the number back to 1024 bits using Montgomery reduction.
67540  *
67541  * a   A single precision number to reduce in place.
67542  * m   The single precision number representing the modulus.
67543  * mp  The digit representing the negative inverse of m mod 2^n.
67544  */
sp_1024_mont_reduce_16(sp_digit * a,const sp_digit * m,sp_digit mp)67545 SP_NOINLINE static void sp_1024_mont_reduce_16(sp_digit* a, const sp_digit* m,
67546         sp_digit mp)
67547 {
67548 
67549     __asm__ __volatile__ (
67550         "ldp	x14, x15, [%[m], 0]\n\t"
67551         "ldp	x16, x17, [%[m], 16]\n\t"
67552         "ldp	x19, x20, [%[m], 32]\n\t"
67553         "ldp	x21, x22, [%[m], 48]\n\t"
67554         "ldp	x23, x24, [%[m], 64]\n\t"
67555         "ldp	x25, x26, [%[m], 80]\n\t"
67556         "ldp	x27, x28, [%[m], 96]\n\t"
67557         "mov	x3, xzr\n\t"
67558         "# i = 16\n\t"
67559         "mov	x4, 16\n\t"
67560         "ldp	x12, x13, [%[a], 0]\n\t"
67561         "\n1:\n\t"
67562         "# mu = a[i] * mp\n\t"
67563         "mul	x9, %[mp], x12\n\t"
67564         "# a[i+0] += m[0] * mu\n\t"
67565         "mul	x7, x14, x9\n\t"
67566         "umulh	x8, x14, x9\n\t"
67567         "adds	x12, x12, x7\n\t"
67568         "# a[i+1] += m[1] * mu\n\t"
67569         "mul	x7, x15, x9\n\t"
67570         "adc	x6, x8, xzr\n\t"
67571         "umulh	x8, x15, x9\n\t"
67572         "adds	x12, x13, x7\n\t"
67573         "# a[i+2] += m[2] * mu\n\t"
67574         "ldr	x13, [%[a], 16]\n\t"
67575         "adc	x5, x8, xzr\n\t"
67576         "mul	x7, x16, x9\n\t"
67577         "adds	x12, x12, x6\n\t"
67578         "umulh	x8, x16, x9\n\t"
67579         "adc	x5, x5, xzr\n\t"
67580         "adds	x13, x13, x7\n\t"
67581         "# a[i+3] += m[3] * mu\n\t"
67582         "ldr	x10, [%[a], 24]\n\t"
67583         "adc	x6, x8, xzr\n\t"
67584         "mul	x7, x17, x9\n\t"
67585         "adds	x13, x13, x5\n\t"
67586         "umulh	x8, x17, x9\n\t"
67587         "adc	x6, x6, xzr\n\t"
67588         "adds	x10, x10, x7\n\t"
67589         "# a[i+4] += m[4] * mu\n\t"
67590         "ldr	x11, [%[a], 32]\n\t"
67591         "adc	x5, x8, xzr\n\t"
67592         "adds	x10, x10, x6\n\t"
67593         "mul	x7, x19, x9\n\t"
67594         "adc	x5, x5, xzr\n\t"
67595         "umulh	x8, x19, x9\n\t"
67596         "str	x10, [%[a], 24]\n\t"
67597         "adds	x11, x11, x7\n\t"
67598         "# a[i+5] += m[5] * mu\n\t"
67599         "ldr	x10, [%[a], 40]\n\t"
67600         "adc	x6, x8, xzr\n\t"
67601         "adds	x11, x11, x5\n\t"
67602         "mul	x7, x20, x9\n\t"
67603         "adc	x6, x6, xzr\n\t"
67604         "umulh	x8, x20, x9\n\t"
67605         "str	x11, [%[a], 32]\n\t"
67606         "adds	x10, x10, x7\n\t"
67607         "# a[i+6] += m[6] * mu\n\t"
67608         "ldr	x11, [%[a], 48]\n\t"
67609         "adc	x5, x8, xzr\n\t"
67610         "adds	x10, x10, x6\n\t"
67611         "mul	x7, x21, x9\n\t"
67612         "adc	x5, x5, xzr\n\t"
67613         "umulh	x8, x21, x9\n\t"
67614         "str	x10, [%[a], 40]\n\t"
67615         "adds	x11, x11, x7\n\t"
67616         "# a[i+7] += m[7] * mu\n\t"
67617         "ldr	x10, [%[a], 56]\n\t"
67618         "adc	x6, x8, xzr\n\t"
67619         "adds	x11, x11, x5\n\t"
67620         "mul	x7, x22, x9\n\t"
67621         "adc	x6, x6, xzr\n\t"
67622         "umulh	x8, x22, x9\n\t"
67623         "str	x11, [%[a], 48]\n\t"
67624         "adds	x10, x10, x7\n\t"
67625         "# a[i+8] += m[8] * mu\n\t"
67626         "ldr	x11, [%[a], 64]\n\t"
67627         "adc	x5, x8, xzr\n\t"
67628         "adds	x10, x10, x6\n\t"
67629         "mul	x7, x23, x9\n\t"
67630         "adc	x5, x5, xzr\n\t"
67631         "umulh	x8, x23, x9\n\t"
67632         "str	x10, [%[a], 56]\n\t"
67633         "adds	x11, x11, x7\n\t"
67634         "# a[i+9] += m[9] * mu\n\t"
67635         "ldr	x10, [%[a], 72]\n\t"
67636         "adc	x6, x8, xzr\n\t"
67637         "adds	x11, x11, x5\n\t"
67638         "mul	x7, x24, x9\n\t"
67639         "adc	x6, x6, xzr\n\t"
67640         "umulh	x8, x24, x9\n\t"
67641         "str	x11, [%[a], 64]\n\t"
67642         "adds	x10, x10, x7\n\t"
67643         "# a[i+10] += m[10] * mu\n\t"
67644         "ldr	x11, [%[a], 80]\n\t"
67645         "adc	x5, x8, xzr\n\t"
67646         "adds	x10, x10, x6\n\t"
67647         "mul	x7, x25, x9\n\t"
67648         "adc	x5, x5, xzr\n\t"
67649         "umulh	x8, x25, x9\n\t"
67650         "str	x10, [%[a], 72]\n\t"
67651         "adds	x11, x11, x7\n\t"
67652         "# a[i+11] += m[11] * mu\n\t"
67653         "ldr	x10, [%[a], 88]\n\t"
67654         "adc	x6, x8, xzr\n\t"
67655         "adds	x11, x11, x5\n\t"
67656         "mul	x7, x26, x9\n\t"
67657         "adc	x6, x6, xzr\n\t"
67658         "umulh	x8, x26, x9\n\t"
67659         "str	x11, [%[a], 80]\n\t"
67660         "adds	x10, x10, x7\n\t"
67661         "# a[i+12] += m[12] * mu\n\t"
67662         "ldr	x11, [%[a], 96]\n\t"
67663         "adc	x5, x8, xzr\n\t"
67664         "adds	x10, x10, x6\n\t"
67665         "mul	x7, x27, x9\n\t"
67666         "adc	x5, x5, xzr\n\t"
67667         "umulh	x8, x27, x9\n\t"
67668         "str	x10, [%[a], 88]\n\t"
67669         "adds	x11, x11, x7\n\t"
67670         "# a[i+13] += m[13] * mu\n\t"
67671         "ldr	x10, [%[a], 104]\n\t"
67672         "adc	x6, x8, xzr\n\t"
67673         "adds	x11, x11, x5\n\t"
67674         "mul	x7, x28, x9\n\t"
67675         "adc	x6, x6, xzr\n\t"
67676         "umulh	x8, x28, x9\n\t"
67677         "str	x11, [%[a], 96]\n\t"
67678         "adds	x10, x10, x7\n\t"
67679         "# a[i+14] += m[14] * mu\n\t"
67680         "ldr	x11, [%[a], 112]\n\t"
67681         "adc	x5, x8, xzr\n\t"
67682         "ldr	x8, [%[m], 112]\n\t"
67683         "adds	x10, x10, x6\n\t"
67684         "mul	x7, x8, x9\n\t"
67685         "adc	x5, x5, xzr\n\t"
67686         "umulh	x8, x8, x9\n\t"
67687         "str	x10, [%[a], 104]\n\t"
67688         "adds	x11, x11, x7\n\t"
67689         "# a[i+15] += m[15] * mu\n\t"
67690         "ldr	x10, [%[a], 120]\n\t"
67691         "adc	x6, x8, xzr\n\t"
67692         "ldr	x8, [%[m], 120]\n\t"
67693         "adds	x11, x11, x5\n\t"
67694         "mul	x7, x8, x9\n\t"
67695         "adc	x6, x6, xzr\n\t"
67696         "umulh	x8, x8, x9\n\t"
67697         "adds	x6, x6, x7\n\t"
67698         "adcs	x8, x8, x3\n\t"
67699         "str	x11, [%[a], 112]\n\t"
67700         "cset  x3, cs\n\t"
67701         "adds	x10, x10, x6\n\t"
67702         "ldr	x11, [%[a], 128]\n\t"
67703         "str	x10, [%[a], 120]\n\t"
67704         "adcs	x11, x11, x8\n\t"
67705         "str	x11, [%[a], 128]\n\t"
67706         "adc	x3, x3, xzr\n\t"
67707         "subs	x4, x4, 1\n\t"
67708         "add	%[a], %[a], 8\n\t"
67709         "bne	1b\n\t"
67710         "# x12 and x13 hold a[0] and a[1]\n\t"
67711         "# Create mask\n\t"
67712         "ldr       x9, [%[m], 120]\n\t"
67713         "subs      x11, x9, x11\n\t"
67714         "neg       x3, x3\n\t"
67715         "sbc       x11, x11, x11\n\t"
67716         "orr       x3, x3, x11\n\t"
67717         "mov   x9, %[a]\n\t"
67718         "sub   %[a], %[a], 128\n\t"
67719         "# Subtract masked modulus\n\t"
67720         "# x12 and x13 hold a[0] and a[1]\n\t"
67721         "and       x14, x14, x3\n\t"
67722         "ldp       x11, x10, [x9, 16]\n\t"
67723         "and       x15, x15, x3\n\t"
67724         "subs      x12, x12, x14\n\t"
67725         "and       x16, x16, x3\n\t"
67726         "sbcs      x13, x13, x15\n\t"
67727         "and       x17, x17, x3\n\t"
67728         "sbcs      x11, x11, x16\n\t"
67729         "stp       x12, x13, [%[a], 0]\n\t"
67730         "sbcs      x10, x10, x17\n\t"
67731         "stp       x11, x10, [%[a], 16]\n\t"
67732         "ldp       x12, x13, [x9, 32]\n\t"
67733         "and       x19, x19, x3\n\t"
67734         "ldp       x11, x10, [x9, 48]\n\t"
67735         "and       x20, x20, x3\n\t"
67736         "sbcs      x12, x12, x19\n\t"
67737         "and       x21, x21, x3\n\t"
67738         "sbcs      x13, x13, x20\n\t"
67739         "and       x22, x22, x3\n\t"
67740         "sbcs      x11, x11, x21\n\t"
67741         "stp       x12, x13, [%[a], 32]\n\t"
67742         "sbcs      x10, x10, x22\n\t"
67743         "stp       x11, x10, [%[a], 48]\n\t"
67744         "ldp       x12, x13, [x9, 64]\n\t"
67745         "and       x23, x23, x3\n\t"
67746         "ldp       x11, x10, [x9, 80]\n\t"
67747         "and       x24, x24, x3\n\t"
67748         "sbcs      x12, x12, x23\n\t"
67749         "and       x25, x25, x3\n\t"
67750         "sbcs      x13, x13, x24\n\t"
67751         "and       x26, x26, x3\n\t"
67752         "sbcs      x11, x11, x25\n\t"
67753         "stp       x12, x13, [%[a], 64]\n\t"
67754         "sbcs      x10, x10, x26\n\t"
67755         "stp       x11, x10, [%[a], 80]\n\t"
67756         "ldp       x7, x8, [%[m], 112]\n\t"
67757         "ldp       x12, x13, [x9, 96]\n\t"
67758         "and       x27, x27, x3\n\t"
67759         "ldp       x11, x10, [x9, 112]\n\t"
67760         "and       x28, x28, x3\n\t"
67761         "sbcs      x12, x12, x27\n\t"
67762         "and       x7, x7, x3\n\t"
67763         "sbcs      x13, x13, x28\n\t"
67764         "and       x8, x8, x3\n\t"
67765         "sbcs      x11, x11, x7\n\t"
67766         "stp       x12, x13, [%[a], 96]\n\t"
67767         "sbcs      x10, x10, x8\n\t"
67768         "stp       x11, x10, [%[a], 112]\n\t"
67769         : [a] "+r" (a)
67770         : [m] "r" (m), [mp] "r" (mp)
67771         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
67772     );
67773 
67774 }
67775 
67776 /* Multiply two Montgomery form numbers mod the modulus (prime).
67777  * (r = a * b mod m)
67778  *
67779  * r   Result of multiplication.
67780  * a   First number to multiply in Montgomery form.
67781  * b   Second number to multiply in Montgomery form.
67782  * m   Modulus (prime).
67783  * mp  Montgomery mulitplier.
67784  */
sp_1024_mont_mul_16(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m,sp_digit mp)67785 static void sp_1024_mont_mul_16(sp_digit* r, const sp_digit* a,
67786         const sp_digit* b, const sp_digit* m, sp_digit mp)
67787 {
67788     sp_1024_mul_16(r, a, b);
67789     sp_1024_mont_reduce_16(r, m, mp);
67790 }
67791 
67792 /* Square the Montgomery form number. (r = a * a mod m)
67793  *
67794  * r   Result of squaring.
67795  * a   Number to square in Montgomery form.
67796  * m   Modulus (prime).
67797  * mp  Montgomery mulitplier.
67798  */
sp_1024_mont_sqr_16(sp_digit * r,const sp_digit * a,const sp_digit * m,sp_digit mp)67799 static void sp_1024_mont_sqr_16(sp_digit* r, const sp_digit* a,
67800         const sp_digit* m, sp_digit mp)
67801 {
67802     sp_1024_sqr_16(r, a);
67803     sp_1024_mont_reduce_16(r, m, mp);
67804 }
67805 
67806 /* Mod-2 for the P1024 curve. */
67807 static const uint8_t p1024_mod_minus_2[] = {
67808      6,0x06,  7,0x0f,  7,0x0b,  6,0x0c,  7,0x1e,  9,0x09,  7,0x0c,  7,0x1f,
67809      6,0x16,  6,0x06,  7,0x0e,  8,0x10,  6,0x03,  8,0x11,  6,0x0d,  7,0x14,
67810      9,0x12,  6,0x0f,  7,0x04,  9,0x0d,  6,0x00,  7,0x13,  6,0x01,  6,0x07,
67811      8,0x0d,  8,0x00,  6,0x06,  9,0x17,  6,0x14,  6,0x15,  6,0x11,  6,0x0b,
67812      9,0x0c,  6,0x1e, 13,0x14,  7,0x0e,  6,0x1d, 12,0x0a,  6,0x0b,  8,0x07,
67813      6,0x18,  6,0x0f,  6,0x10,  8,0x1c,  7,0x16,  7,0x02,  6,0x01,  6,0x13,
67814     10,0x15,  7,0x06,  8,0x14,  6,0x0c,  6,0x19,  7,0x10,  6,0x19,  6,0x19,
67815      9,0x16,  7,0x19,  6,0x1f,  6,0x17,  6,0x12,  8,0x02,  6,0x01,  6,0x04,
67816      6,0x15,  7,0x16,  6,0x04,  6,0x1f,  6,0x09,  7,0x06,  7,0x13,  7,0x09,
67817      6,0x0d, 10,0x18,  6,0x06,  6,0x11,  6,0x04,  6,0x01,  6,0x13,  8,0x06,
67818      6,0x0d,  8,0x13,  7,0x08,  6,0x08,  6,0x05,  7,0x0c,  7,0x0e,  7,0x15,
67819      6,0x05,  7,0x14, 10,0x19,  6,0x10,  6,0x16,  6,0x15,  7,0x1f,  6,0x14,
67820      6,0x0a, 10,0x11,  6,0x01,  7,0x05,  7,0x08,  8,0x0a,  7,0x1e,  7,0x1c,
67821      6,0x1c,  7,0x09, 10,0x18,  7,0x1c, 10,0x06,  6,0x0a,  6,0x07,  6,0x19,
67822      7,0x06,  6,0x0d,  7,0x0f,  7,0x0b,  7,0x05,  6,0x11,  6,0x1c,  7,0x1f,
67823      6,0x1e,  7,0x18,  6,0x1e,  6,0x00,  6,0x03,  6,0x02,  7,0x10,  6,0x0b,
67824      6,0x1b,  7,0x10,  6,0x00,  8,0x11,  7,0x1b,  6,0x18,  6,0x01,  7,0x0c,
67825      7,0x1d,  7,0x13,  6,0x08,  7,0x1b,  8,0x13,  7,0x16, 13,0x1d,  7,0x1f,
67826      6,0x0a,  6,0x01,  7,0x1f,  6,0x14,  1,0x01
67827 };
67828 
67829 /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
67830  * P1024 curve. (r = 1 / a mod m)
67831  *
67832  * r   Inverse result.
67833  * a   Number to invert.
67834  * td  Temporary data.
67835  */
sp_1024_mont_inv_16(sp_digit * r,const sp_digit * a,sp_digit * td)67836 static void sp_1024_mont_inv_16(sp_digit* r, const sp_digit* a,
67837         sp_digit* td)
67838 {
67839     sp_digit* t = td;
67840     int i;
67841     int j;
67842     sp_digit table[32][2 * 16];
67843 
67844     XMEMCPY(table[0], a, sizeof(sp_digit) * 16);
67845     for (i = 1; i < 6; i++) {
67846         sp_1024_mont_sqr_16(table[0], table[0], p1024_mod, p1024_mp_mod);
67847     }
67848     for (i = 1; i < 32; i++) {
67849         sp_1024_mont_mul_16(table[i], table[i-1], a, p1024_mod, p1024_mp_mod);
67850     }
67851 
67852     XMEMCPY(t, table[p1024_mod_minus_2[1]], sizeof(sp_digit) * 16);
67853     for (i = 2; i < (int)sizeof(p1024_mod_minus_2) - 2; i += 2) {
67854         for (j = 0; j < p1024_mod_minus_2[i]; j++) {
67855             sp_1024_mont_sqr_16(t, t, p1024_mod, p1024_mp_mod);
67856         }
67857         sp_1024_mont_mul_16(t, t, table[p1024_mod_minus_2[i+1]], p1024_mod,
67858             p1024_mp_mod);
67859     }
67860     sp_1024_mont_sqr_16(t, t, p1024_mod, p1024_mp_mod);
67861     sp_1024_mont_mul_16(r, t, a, p1024_mod, p1024_mp_mod);
67862 }
67863 
67864 /* Normalize the values in each word to 64.
67865  *
67866  * a  Array of sp_digit to normalize.
67867  */
67868 #define sp_1024_norm_16(a)
67869 
67870 /* Map the Montgomery form projective coordinate point to an affine point.
67871  *
67872  * r  Resulting affine coordinate point.
67873  * p  Montgomery form projective coordinate point.
67874  * t  Temporary ordinate data.
67875  */
sp_1024_map_16(sp_point_1024 * r,const sp_point_1024 * p,sp_digit * t)67876 static void sp_1024_map_16(sp_point_1024* r, const sp_point_1024* p,
67877     sp_digit* t)
67878 {
67879     sp_digit* t1 = t;
67880     sp_digit* t2 = t + 2*16;
67881     sp_int64 n;
67882 
67883     sp_1024_mont_inv_16(t1, p->z, t + 2*16);
67884 
67885     sp_1024_mont_sqr_16(t2, t1, p1024_mod, p1024_mp_mod);
67886     sp_1024_mont_mul_16(t1, t2, t1, p1024_mod, p1024_mp_mod);
67887 
67888     /* x /= z^2 */
67889     sp_1024_mont_mul_16(r->x, p->x, t2, p1024_mod, p1024_mp_mod);
67890     XMEMSET(r->x + 16, 0, sizeof(r->x) / 2U);
67891     sp_1024_mont_reduce_16(r->x, p1024_mod, p1024_mp_mod);
67892     /* Reduce x to less than modulus */
67893     n = sp_1024_cmp_16(r->x, p1024_mod);
67894     sp_1024_cond_sub_16(r->x, r->x, p1024_mod, 0 - ((n >= 0) ?
67895                 (sp_digit)1 : (sp_digit)0));
67896     sp_1024_norm_16(r->x);
67897 
67898     /* y /= z^3 */
67899     sp_1024_mont_mul_16(r->y, p->y, t1, p1024_mod, p1024_mp_mod);
67900     XMEMSET(r->y + 16, 0, sizeof(r->y) / 2U);
67901     sp_1024_mont_reduce_16(r->y, p1024_mod, p1024_mp_mod);
67902     /* Reduce y to less than modulus */
67903     n = sp_1024_cmp_16(r->y, p1024_mod);
67904     sp_1024_cond_sub_16(r->y, r->y, p1024_mod, 0 - ((n >= 0) ?
67905                 (sp_digit)1 : (sp_digit)0));
67906     sp_1024_norm_16(r->y);
67907 
67908     XMEMSET(r->z, 0, sizeof(r->z));
67909     r->z[0] = 1;
67910 
67911 }
67912 
67913 /* Add two Montgomery form numbers (r = a + b % m).
67914  *
67915  * r   Result of addition.
67916  * a   First number to add in Montgomery form.
67917  * b   Second number to add in Montgomery form.
67918  * m   Modulus (prime).
67919  */
sp_1024_mont_add_16(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m)67920 static void sp_1024_mont_add_16(sp_digit* r, const sp_digit* a, const sp_digit* b,
67921         const sp_digit* m)
67922 {
67923     __asm__ __volatile__ (
67924         "ldp       x4, x5, [%[a], 0]\n\t"
67925         "ldp       x6, x7, [%[a], 16]\n\t"
67926         "ldp       x8, x9, [%[a], 32]\n\t"
67927         "ldp       x10, x11, [%[a], 48]\n\t"
67928         "ldp       x12, x13, [%[a], 64]\n\t"
67929         "ldp       x14, x15, [%[a], 80]\n\t"
67930         "ldp       x16, x17, [%[a], 96]\n\t"
67931         "ldp       x19, x20, [%[a], 112]\n\t"
67932         "ldp       x21, x22, [%[b], 0]\n\t"
67933         "ldp       x23, x24, [%[b], 16]\n\t"
67934         "adds      x4, x4, x21\n\t"
67935         "adcs      x5, x5, x22\n\t"
67936         "adcs      x6, x6, x23\n\t"
67937         "adcs      x7, x7, x24\n\t"
67938         "ldp       x21, x22, [%[b], 32]\n\t"
67939         "ldp       x23, x24, [%[b], 48]\n\t"
67940         "adcs      x8, x8, x21\n\t"
67941         "adcs      x9, x9, x22\n\t"
67942         "adcs      x10, x10, x23\n\t"
67943         "adcs      x11, x11, x24\n\t"
67944         "ldp       x21, x22, [%[b], 64]\n\t"
67945         "ldp       x23, x24, [%[b], 80]\n\t"
67946         "adcs      x12, x12, x21\n\t"
67947         "adcs      x13, x13, x22\n\t"
67948         "adcs      x14, x14, x23\n\t"
67949         "adcs      x15, x15, x24\n\t"
67950         "ldp       x21, x22, [%[b], 96]\n\t"
67951         "ldp       x23, x24, [%[b], 112]\n\t"
67952         "adcs      x16, x16, x21\n\t"
67953         "adcs      x17, x17, x22\n\t"
67954         "adcs      x19, x19, x23\n\t"
67955         "adcs      x20, x20, x24\n\t"
67956         "csetm x25, cs\n\t"
67957         "ldr   x21, [%[m], 120]\n\t"
67958         "subs  x21, x21, x20\n\t"
67959         "csetm x21, cc\n\t"
67960         "orr   x25, x25, x21\n\t"
67961         "ldp     x21, x22, [%[m], 0]\n\t"
67962         "ldp     x23, x24, [%[m], 16]\n\t"
67963         "and     x21, x21, x25\n\t"
67964         "and     x22, x22, x25\n\t"
67965         "and     x23, x23, x25\n\t"
67966         "and     x24, x24, x25\n\t"
67967         "subs    x4, x4, x21\n\t"
67968         "sbcs    x5, x5, x22\n\t"
67969         "sbcs    x6, x6, x23\n\t"
67970         "sbcs    x7, x7, x24\n\t"
67971         "ldp     x21, x22, [%[m], 32]\n\t"
67972         "ldp     x23, x24, [%[m], 48]\n\t"
67973         "and     x21, x21, x25\n\t"
67974         "and     x22, x22, x25\n\t"
67975         "and     x23, x23, x25\n\t"
67976         "and     x24, x24, x25\n\t"
67977         "sbcs    x8, x8, x21\n\t"
67978         "sbcs    x9, x9, x22\n\t"
67979         "sbcs    x10, x10, x23\n\t"
67980         "sbcs    x11, x11, x24\n\t"
67981         "ldp     x21, x22, [%[m], 64]\n\t"
67982         "ldp     x23, x24, [%[m], 80]\n\t"
67983         "and     x21, x21, x25\n\t"
67984         "and     x22, x22, x25\n\t"
67985         "and     x23, x23, x25\n\t"
67986         "and     x24, x24, x25\n\t"
67987         "sbcs    x12, x12, x21\n\t"
67988         "sbcs    x13, x13, x22\n\t"
67989         "sbcs    x14, x14, x23\n\t"
67990         "sbcs    x15, x15, x24\n\t"
67991         "ldp     x21, x22, [%[m], 96]\n\t"
67992         "ldp     x23, x24, [%[m], 112]\n\t"
67993         "and     x21, x21, x25\n\t"
67994         "and     x22, x22, x25\n\t"
67995         "and     x23, x23, x25\n\t"
67996         "and     x24, x24, x25\n\t"
67997         "sbcs    x16, x16, x21\n\t"
67998         "sbcs    x17, x17, x22\n\t"
67999         "sbcs    x19, x19, x23\n\t"
68000         "sbc     x20, x20, x24\n\t"
68001         "stp       x4, x5, [%[r], 0]\n\t"
68002         "stp       x6, x7, [%[r], 16]\n\t"
68003         "stp       x8, x9, [%[r], 32]\n\t"
68004         "stp       x10, x11, [%[r], 48]\n\t"
68005         "stp       x12, x13, [%[r], 64]\n\t"
68006         "stp       x14, x15, [%[r], 80]\n\t"
68007         "stp       x16, x17, [%[r], 96]\n\t"
68008         "stp       x19, x20, [%[r], 112]\n\t"
68009         :
68010         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
68011         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25"
68012     );
68013 }
68014 
68015 /* Double a Montgomery form number (r = a + a % m).
68016  *
68017  * r   Result of doubling.
68018  * a   Number to double in Montgomery form.
68019  * m   Modulus (prime).
68020  */
sp_1024_mont_dbl_16(sp_digit * r,const sp_digit * a,const sp_digit * m)68021 static void sp_1024_mont_dbl_16(sp_digit* r, const sp_digit* a, const sp_digit* m)
68022 {
68023     __asm__ __volatile__ (
68024         "ldp       x4, x5, [%[a], 0]\n\t"
68025         "ldp       x6, x7, [%[a], 16]\n\t"
68026         "ldp       x8, x9, [%[a], 32]\n\t"
68027         "ldp       x10, x11, [%[a], 48]\n\t"
68028         "ldp       x12, x13, [%[a], 64]\n\t"
68029         "ldp       x14, x15, [%[a], 80]\n\t"
68030         "ldp       x16, x17, [%[a], 96]\n\t"
68031         "ldp       x19, x20, [%[a], 112]\n\t"
68032         "adds        x4, x4, x4\n\t"
68033         "adcs        x5, x5, x5\n\t"
68034         "adcs        x6, x6, x6\n\t"
68035         "adcs        x7, x7, x7\n\t"
68036         "adcs        x8, x8, x8\n\t"
68037         "adcs        x9, x9, x9\n\t"
68038         "adcs        x10, x10, x10\n\t"
68039         "adcs        x11, x11, x11\n\t"
68040         "adcs        x12, x12, x12\n\t"
68041         "adcs        x13, x13, x13\n\t"
68042         "adcs        x14, x14, x14\n\t"
68043         "adcs        x15, x15, x15\n\t"
68044         "adcs        x16, x16, x16\n\t"
68045         "adcs        x17, x17, x17\n\t"
68046         "adcs        x19, x19, x19\n\t"
68047         "adcs        x20, x20, x20\n\t"
68048         "csetm x25, cs\n\t"
68049         "ldr   x21, [%[m], 120]\n\t"
68050         "subs  x21, x21, x20\n\t"
68051         "csetm x21, cc\n\t"
68052         "orr   x25, x25, x21\n\t"
68053         "ldp     x21, x22, [%[m], 0]\n\t"
68054         "ldp     x23, x24, [%[m], 16]\n\t"
68055         "and     x21, x21, x25\n\t"
68056         "and     x22, x22, x25\n\t"
68057         "and     x23, x23, x25\n\t"
68058         "and     x24, x24, x25\n\t"
68059         "subs    x4, x4, x21\n\t"
68060         "sbcs    x5, x5, x22\n\t"
68061         "sbcs    x6, x6, x23\n\t"
68062         "sbcs    x7, x7, x24\n\t"
68063         "ldp     x21, x22, [%[m], 32]\n\t"
68064         "ldp     x23, x24, [%[m], 48]\n\t"
68065         "and     x21, x21, x25\n\t"
68066         "and     x22, x22, x25\n\t"
68067         "and     x23, x23, x25\n\t"
68068         "and     x24, x24, x25\n\t"
68069         "sbcs    x8, x8, x21\n\t"
68070         "sbcs    x9, x9, x22\n\t"
68071         "sbcs    x10, x10, x23\n\t"
68072         "sbcs    x11, x11, x24\n\t"
68073         "ldp     x21, x22, [%[m], 64]\n\t"
68074         "ldp     x23, x24, [%[m], 80]\n\t"
68075         "and     x21, x21, x25\n\t"
68076         "and     x22, x22, x25\n\t"
68077         "and     x23, x23, x25\n\t"
68078         "and     x24, x24, x25\n\t"
68079         "sbcs    x12, x12, x21\n\t"
68080         "sbcs    x13, x13, x22\n\t"
68081         "sbcs    x14, x14, x23\n\t"
68082         "sbcs    x15, x15, x24\n\t"
68083         "ldp     x21, x22, [%[m], 96]\n\t"
68084         "ldp     x23, x24, [%[m], 112]\n\t"
68085         "and     x21, x21, x25\n\t"
68086         "and     x22, x22, x25\n\t"
68087         "and     x23, x23, x25\n\t"
68088         "and     x24, x24, x25\n\t"
68089         "sbcs    x16, x16, x21\n\t"
68090         "sbcs    x17, x17, x22\n\t"
68091         "sbcs    x19, x19, x23\n\t"
68092         "sbc     x20, x20, x24\n\t"
68093         "stp       x4, x5, [%[r], 0]\n\t"
68094         "stp       x6, x7, [%[r], 16]\n\t"
68095         "stp       x8, x9, [%[r], 32]\n\t"
68096         "stp       x10, x11, [%[r], 48]\n\t"
68097         "stp       x12, x13, [%[r], 64]\n\t"
68098         "stp       x14, x15, [%[r], 80]\n\t"
68099         "stp       x16, x17, [%[r], 96]\n\t"
68100         "stp       x19, x20, [%[r], 112]\n\t"
68101         :
68102         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
68103         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25"
68104     );
68105 }
68106 
68107 /* Triple a Montgomery form number (r = a + a + a % m).
68108  *
68109  * r   Result of Tripling.
68110  * a   Number to triple in Montgomery form.
68111  * m   Modulus (prime).
68112  */
sp_1024_mont_tpl_16(sp_digit * r,const sp_digit * a,const sp_digit * m)68113 static void sp_1024_mont_tpl_16(sp_digit* r, const sp_digit* a, const sp_digit* m)
68114 {
68115     __asm__ __volatile__ (
68116         "ldp       x4, x5, [%[a], 0]\n\t"
68117         "ldp       x6, x7, [%[a], 16]\n\t"
68118         "ldp       x8, x9, [%[a], 32]\n\t"
68119         "ldp       x10, x11, [%[a], 48]\n\t"
68120         "ldp       x12, x13, [%[a], 64]\n\t"
68121         "ldp       x14, x15, [%[a], 80]\n\t"
68122         "ldp       x16, x17, [%[a], 96]\n\t"
68123         "ldp       x19, x20, [%[a], 112]\n\t"
68124         "adds        x4, x4, x4\n\t"
68125         "adcs        x5, x5, x5\n\t"
68126         "adcs        x6, x6, x6\n\t"
68127         "adcs        x7, x7, x7\n\t"
68128         "adcs        x8, x8, x8\n\t"
68129         "adcs        x9, x9, x9\n\t"
68130         "adcs        x10, x10, x10\n\t"
68131         "adcs        x11, x11, x11\n\t"
68132         "adcs        x12, x12, x12\n\t"
68133         "adcs        x13, x13, x13\n\t"
68134         "adcs        x14, x14, x14\n\t"
68135         "adcs        x15, x15, x15\n\t"
68136         "adcs        x16, x16, x16\n\t"
68137         "adcs        x17, x17, x17\n\t"
68138         "adcs        x19, x19, x19\n\t"
68139         "adcs        x20, x20, x20\n\t"
68140         "csetm x25, cs\n\t"
68141         "ldr   x21, [%[m], 120]\n\t"
68142         "subs  x21, x21, x20\n\t"
68143         "csetm x21, cc\n\t"
68144         "orr   x25, x25, x21\n\t"
68145         "ldp     x21, x22, [%[m], 0]\n\t"
68146         "ldp     x23, x24, [%[m], 16]\n\t"
68147         "and     x21, x21, x25\n\t"
68148         "and     x22, x22, x25\n\t"
68149         "and     x23, x23, x25\n\t"
68150         "and     x24, x24, x25\n\t"
68151         "subs    x4, x4, x21\n\t"
68152         "sbcs    x5, x5, x22\n\t"
68153         "sbcs    x6, x6, x23\n\t"
68154         "sbcs    x7, x7, x24\n\t"
68155         "ldp     x21, x22, [%[m], 32]\n\t"
68156         "ldp     x23, x24, [%[m], 48]\n\t"
68157         "and     x21, x21, x25\n\t"
68158         "and     x22, x22, x25\n\t"
68159         "and     x23, x23, x25\n\t"
68160         "and     x24, x24, x25\n\t"
68161         "sbcs    x8, x8, x21\n\t"
68162         "sbcs    x9, x9, x22\n\t"
68163         "sbcs    x10, x10, x23\n\t"
68164         "sbcs    x11, x11, x24\n\t"
68165         "ldp     x21, x22, [%[m], 64]\n\t"
68166         "ldp     x23, x24, [%[m], 80]\n\t"
68167         "and     x21, x21, x25\n\t"
68168         "and     x22, x22, x25\n\t"
68169         "and     x23, x23, x25\n\t"
68170         "and     x24, x24, x25\n\t"
68171         "sbcs    x12, x12, x21\n\t"
68172         "sbcs    x13, x13, x22\n\t"
68173         "sbcs    x14, x14, x23\n\t"
68174         "sbcs    x15, x15, x24\n\t"
68175         "ldp     x21, x22, [%[m], 96]\n\t"
68176         "ldp     x23, x24, [%[m], 112]\n\t"
68177         "and     x21, x21, x25\n\t"
68178         "and     x22, x22, x25\n\t"
68179         "and     x23, x23, x25\n\t"
68180         "and     x24, x24, x25\n\t"
68181         "sbcs    x16, x16, x21\n\t"
68182         "sbcs    x17, x17, x22\n\t"
68183         "sbcs    x19, x19, x23\n\t"
68184         "sbc     x20, x20, x24\n\t"
68185         "ldp       x21, x22, [%[a], 0]\n\t"
68186         "ldp       x23, x24, [%[a], 16]\n\t"
68187         "adds      x4, x4, x21\n\t"
68188         "adcs      x5, x5, x22\n\t"
68189         "adcs      x6, x6, x23\n\t"
68190         "adcs      x7, x7, x24\n\t"
68191         "ldp       x21, x22, [%[a], 32]\n\t"
68192         "ldp       x23, x24, [%[a], 48]\n\t"
68193         "adcs      x8, x8, x21\n\t"
68194         "adcs      x9, x9, x22\n\t"
68195         "adcs      x10, x10, x23\n\t"
68196         "adcs      x11, x11, x24\n\t"
68197         "ldp       x21, x22, [%[a], 64]\n\t"
68198         "ldp       x23, x24, [%[a], 80]\n\t"
68199         "adcs      x12, x12, x21\n\t"
68200         "adcs      x13, x13, x22\n\t"
68201         "adcs      x14, x14, x23\n\t"
68202         "adcs      x15, x15, x24\n\t"
68203         "ldp       x21, x22, [%[a], 96]\n\t"
68204         "ldp       x23, x24, [%[a], 112]\n\t"
68205         "adcs      x16, x16, x21\n\t"
68206         "adcs      x17, x17, x22\n\t"
68207         "adcs      x19, x19, x23\n\t"
68208         "adcs      x20, x20, x24\n\t"
68209         "csetm x25, cs\n\t"
68210         "ldr   x21, [%[m], 120]\n\t"
68211         "subs  x21, x21, x20\n\t"
68212         "csetm x21, cc\n\t"
68213         "orr   x25, x25, x21\n\t"
68214         "ldp     x21, x22, [%[m], 0]\n\t"
68215         "ldp     x23, x24, [%[m], 16]\n\t"
68216         "and     x21, x21, x25\n\t"
68217         "and     x22, x22, x25\n\t"
68218         "and     x23, x23, x25\n\t"
68219         "and     x24, x24, x25\n\t"
68220         "subs    x4, x4, x21\n\t"
68221         "sbcs    x5, x5, x22\n\t"
68222         "sbcs    x6, x6, x23\n\t"
68223         "sbcs    x7, x7, x24\n\t"
68224         "ldp     x21, x22, [%[m], 32]\n\t"
68225         "ldp     x23, x24, [%[m], 48]\n\t"
68226         "and     x21, x21, x25\n\t"
68227         "and     x22, x22, x25\n\t"
68228         "and     x23, x23, x25\n\t"
68229         "and     x24, x24, x25\n\t"
68230         "sbcs    x8, x8, x21\n\t"
68231         "sbcs    x9, x9, x22\n\t"
68232         "sbcs    x10, x10, x23\n\t"
68233         "sbcs    x11, x11, x24\n\t"
68234         "ldp     x21, x22, [%[m], 64]\n\t"
68235         "ldp     x23, x24, [%[m], 80]\n\t"
68236         "and     x21, x21, x25\n\t"
68237         "and     x22, x22, x25\n\t"
68238         "and     x23, x23, x25\n\t"
68239         "and     x24, x24, x25\n\t"
68240         "sbcs    x12, x12, x21\n\t"
68241         "sbcs    x13, x13, x22\n\t"
68242         "sbcs    x14, x14, x23\n\t"
68243         "sbcs    x15, x15, x24\n\t"
68244         "ldp     x21, x22, [%[m], 96]\n\t"
68245         "ldp     x23, x24, [%[m], 112]\n\t"
68246         "and     x21, x21, x25\n\t"
68247         "and     x22, x22, x25\n\t"
68248         "and     x23, x23, x25\n\t"
68249         "and     x24, x24, x25\n\t"
68250         "sbcs    x16, x16, x21\n\t"
68251         "sbcs    x17, x17, x22\n\t"
68252         "sbcs    x19, x19, x23\n\t"
68253         "sbc     x20, x20, x24\n\t"
68254         "stp       x4, x5, [%[r], 0]\n\t"
68255         "stp       x6, x7, [%[r], 16]\n\t"
68256         "stp       x8, x9, [%[r], 32]\n\t"
68257         "stp       x10, x11, [%[r], 48]\n\t"
68258         "stp       x12, x13, [%[r], 64]\n\t"
68259         "stp       x14, x15, [%[r], 80]\n\t"
68260         "stp       x16, x17, [%[r], 96]\n\t"
68261         "stp       x19, x20, [%[r], 112]\n\t"
68262         :
68263         : [r] "r" (r), [a] "r" (a), [m] "r" (m)
68264         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25"
68265     );
68266 }
68267 
68268 /* Subtract two Montgomery form numbers (r = a - b % m).
68269  *
68270  * r   Result of subtration.
68271  * a   Number to subtract from in Montgomery form.
68272  * b   Number to subtract with in Montgomery form.
68273  * m   Modulus (prime).
68274  */
sp_1024_mont_sub_16(sp_digit * r,const sp_digit * a,const sp_digit * b,const sp_digit * m)68275 static void sp_1024_mont_sub_16(sp_digit* r, const sp_digit* a, const sp_digit* b,
68276         const sp_digit* m)
68277 {
68278     __asm__ __volatile__ (
68279         "ldp       x4, x5, [%[a], 0]\n\t"
68280         "ldp       x6, x7, [%[a], 16]\n\t"
68281         "ldp       x8, x9, [%[a], 32]\n\t"
68282         "ldp       x10, x11, [%[a], 48]\n\t"
68283         "ldp       x12, x13, [%[a], 64]\n\t"
68284         "ldp       x14, x15, [%[a], 80]\n\t"
68285         "ldp       x16, x17, [%[a], 96]\n\t"
68286         "ldp       x19, x20, [%[a], 112]\n\t"
68287         "ldp       x21, x22, [%[b], 0]\n\t"
68288         "ldp       x23, x24, [%[b], 16]\n\t"
68289         "subs      x4, x4, x21\n\t"
68290         "sbcs      x5, x5, x22\n\t"
68291         "sbcs      x6, x6, x23\n\t"
68292         "sbcs      x7, x7, x24\n\t"
68293         "ldp       x21, x22, [%[b], 32]\n\t"
68294         "ldp       x23, x24, [%[b], 48]\n\t"
68295         "sbcs      x8, x8, x21\n\t"
68296         "sbcs      x9, x9, x22\n\t"
68297         "sbcs      x10, x10, x23\n\t"
68298         "sbcs      x11, x11, x24\n\t"
68299         "ldp       x21, x22, [%[b], 64]\n\t"
68300         "ldp       x23, x24, [%[b], 80]\n\t"
68301         "sbcs      x12, x12, x21\n\t"
68302         "sbcs      x13, x13, x22\n\t"
68303         "sbcs      x14, x14, x23\n\t"
68304         "sbcs      x15, x15, x24\n\t"
68305         "ldp       x21, x22, [%[b], 96]\n\t"
68306         "ldp       x23, x24, [%[b], 112]\n\t"
68307         "sbcs      x16, x16, x21\n\t"
68308         "sbcs      x17, x17, x22\n\t"
68309         "sbcs      x19, x19, x23\n\t"
68310         "sbcs      x20, x20, x24\n\t"
68311         "csetm x25, cc\n\t"
68312         "ldp     x21, x22, [%[m], 0]\n\t"
68313         "ldp     x23, x24, [%[m], 16]\n\t"
68314         "and     x21, x21, x25\n\t"
68315         "and     x22, x22, x25\n\t"
68316         "and     x23, x23, x25\n\t"
68317         "and     x24, x24, x25\n\t"
68318         "adds    x4, x4, x21\n\t"
68319         "adcs    x5, x5, x22\n\t"
68320         "adcs    x6, x6, x23\n\t"
68321         "adcs    x7, x7, x24\n\t"
68322         "ldp     x21, x22, [%[m], 32]\n\t"
68323         "ldp     x23, x24, [%[m], 48]\n\t"
68324         "and     x21, x21, x25\n\t"
68325         "and     x22, x22, x25\n\t"
68326         "and     x23, x23, x25\n\t"
68327         "and     x24, x24, x25\n\t"
68328         "adcs    x8, x8, x21\n\t"
68329         "adcs    x9, x9, x22\n\t"
68330         "adcs    x10, x10, x23\n\t"
68331         "adcs    x11, x11, x24\n\t"
68332         "ldp     x21, x22, [%[m], 64]\n\t"
68333         "ldp     x23, x24, [%[m], 80]\n\t"
68334         "and     x21, x21, x25\n\t"
68335         "and     x22, x22, x25\n\t"
68336         "and     x23, x23, x25\n\t"
68337         "and     x24, x24, x25\n\t"
68338         "adcs    x12, x12, x21\n\t"
68339         "adcs    x13, x13, x22\n\t"
68340         "adcs    x14, x14, x23\n\t"
68341         "adcs    x15, x15, x24\n\t"
68342         "ldp     x21, x22, [%[m], 96]\n\t"
68343         "ldp     x23, x24, [%[m], 112]\n\t"
68344         "and     x21, x21, x25\n\t"
68345         "and     x22, x22, x25\n\t"
68346         "and     x23, x23, x25\n\t"
68347         "and     x24, x24, x25\n\t"
68348         "adcs    x16, x16, x21\n\t"
68349         "adcs    x17, x17, x22\n\t"
68350         "adcs    x19, x19, x23\n\t"
68351         "adc     x20, x20, x24\n\t"
68352         "stp       x4, x5, [%[r], 0]\n\t"
68353         "stp       x6, x7, [%[r], 16]\n\t"
68354         "stp       x8, x9, [%[r], 32]\n\t"
68355         "stp       x10, x11, [%[r], 48]\n\t"
68356         "stp       x12, x13, [%[r], 64]\n\t"
68357         "stp       x14, x15, [%[r], 80]\n\t"
68358         "stp       x16, x17, [%[r], 96]\n\t"
68359         "stp       x19, x20, [%[r], 112]\n\t"
68360         :
68361         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
68362         : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25"
68363     );
68364 }
68365 
68366 /* Conditionally add a and b using the mask m.
68367  * m is -1 to add and 0 when not.
68368  *
68369  * r  A single precision number representing conditional add result.
68370  * a  A single precision number to add with.
68371  * b  A single precision number to add.
68372  * m  Mask value to apply.
68373  */
sp_1024_cond_add_16(sp_digit * r,const sp_digit * a,const sp_digit * b,sp_digit m)68374 static sp_digit sp_1024_cond_add_16(sp_digit* r, const sp_digit* a, const sp_digit* b,
68375         sp_digit m)
68376 {
68377 #ifdef WOLFSSL_SP_SMALL
68378     sp_digit c = 0;
68379 
68380     __asm__ __volatile__ (
68381         "mov	x8, #0\n\t"
68382         "1:\n\t"
68383         "adds	%[c], %[c], #-1\n\t"
68384         "ldr	x4, [%[a], x8]\n\t"
68385         "ldr	x5, [%[b], x8]\n\t"
68386         "and	x5, x5, %[m]\n\t"
68387         "adcs	x4, x4, x5\n\t"
68388         "cset	%[c], cs\n\t"
68389         "str	x4, [%[r], x8]\n\t"
68390         "add	x8, x8, #8\n\t"
68391         "cmp	x8, 128\n\t"
68392         "b.lt	1b\n\t"
68393         : [c] "+r" (c)
68394         : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m)
68395         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
68396     );
68397 
68398     return c;
68399 #else
68400     __asm__ __volatile__ (
68401 
68402         "ldp	x5, x7, [%[b], 0]\n\t"
68403         "ldp	x11, x12, [%[b], 16]\n\t"
68404         "ldp	x4, x6, [%[a], 0]\n\t"
68405         "and	x5, x5, %[m]\n\t"
68406         "ldp	x9, x10, [%[a], 16]\n\t"
68407         "and	x7, x7, %[m]\n\t"
68408         "adds	x4, x4, x5\n\t"
68409         "and	x11, x11, %[m]\n\t"
68410         "adcs	x6, x6, x7\n\t"
68411         "and	x12, x12, %[m]\n\t"
68412         "adcs	x9, x9, x11\n\t"
68413         "stp	x4, x6, [%[r], 0]\n\t"
68414         "adcs	x10, x10, x12\n\t"
68415         "stp	x9, x10, [%[r], 16]\n\t"
68416         "ldp	x5, x7, [%[b], 32]\n\t"
68417         "ldp	x11, x12, [%[b], 48]\n\t"
68418         "ldp	x4, x6, [%[a], 32]\n\t"
68419         "and	x5, x5, %[m]\n\t"
68420         "ldp	x9, x10, [%[a], 48]\n\t"
68421         "and	x7, x7, %[m]\n\t"
68422         "adcs	x4, x4, x5\n\t"
68423         "and	x11, x11, %[m]\n\t"
68424         "adcs	x6, x6, x7\n\t"
68425         "and	x12, x12, %[m]\n\t"
68426         "adcs	x9, x9, x11\n\t"
68427         "stp	x4, x6, [%[r], 32]\n\t"
68428         "adcs	x10, x10, x12\n\t"
68429         "stp	x9, x10, [%[r], 48]\n\t"
68430         "ldp	x5, x7, [%[b], 64]\n\t"
68431         "ldp	x11, x12, [%[b], 80]\n\t"
68432         "ldp	x4, x6, [%[a], 64]\n\t"
68433         "and	x5, x5, %[m]\n\t"
68434         "ldp	x9, x10, [%[a], 80]\n\t"
68435         "and	x7, x7, %[m]\n\t"
68436         "adcs	x4, x4, x5\n\t"
68437         "and	x11, x11, %[m]\n\t"
68438         "adcs	x6, x6, x7\n\t"
68439         "and	x12, x12, %[m]\n\t"
68440         "adcs	x9, x9, x11\n\t"
68441         "stp	x4, x6, [%[r], 64]\n\t"
68442         "adcs	x10, x10, x12\n\t"
68443         "stp	x9, x10, [%[r], 80]\n\t"
68444         "ldp	x5, x7, [%[b], 96]\n\t"
68445         "ldp	x11, x12, [%[b], 112]\n\t"
68446         "ldp	x4, x6, [%[a], 96]\n\t"
68447         "and	x5, x5, %[m]\n\t"
68448         "ldp	x9, x10, [%[a], 112]\n\t"
68449         "and	x7, x7, %[m]\n\t"
68450         "adcs	x4, x4, x5\n\t"
68451         "and	x11, x11, %[m]\n\t"
68452         "adcs	x6, x6, x7\n\t"
68453         "and	x12, x12, %[m]\n\t"
68454         "adcs	x9, x9, x11\n\t"
68455         "stp	x4, x6, [%[r], 96]\n\t"
68456         "adcs	x10, x10, x12\n\t"
68457         "stp	x9, x10, [%[r], 112]\n\t"
68458         "cset	%[r], cs\n\t"
68459         : [r] "+r" (r)
68460         : [a] "r" (a), [b] "r" (b), [m] "r" (m)
68461         : "memory", "x4", "x6", "x5", "x7", "x8", "x9", "x10", "x11", "x12"
68462     );
68463 
68464     return (sp_digit)r;
68465 #endif /* WOLFSSL_SP_SMALL */
68466 }
68467 
sp_1024_rshift1_16(sp_digit * r,sp_digit * a)68468 static void sp_1024_rshift1_16(sp_digit* r, sp_digit* a)
68469 {
68470     __asm__ __volatile__ (
68471         "ldr	x2, [%[a]]\n\t"
68472         "ldr	x3, [%[a], 8]\n\t"
68473         "lsr	x2, x2, 1\n\t"
68474         "orr	x2, x2, x3, lsl 63\n\t"
68475         "lsr	x3, x3, 1\n\t"
68476         "ldr	x4, [%[a], 16]\n\t"
68477         "str	x2, [%[r], 0]\n\t"
68478         "orr	x3, x3, x4, lsl 63\n\t"
68479         "lsr	x4, x4, 1\n\t"
68480         "ldr	x2, [%[a], 24]\n\t"
68481         "str	x3, [%[r], 8]\n\t"
68482         "orr	x4, x4, x2, lsl 63\n\t"
68483         "lsr	x2, x2, 1\n\t"
68484         "ldr	x3, [%[a], 32]\n\t"
68485         "str	x4, [%[r], 16]\n\t"
68486         "orr	x2, x2, x3, lsl 63\n\t"
68487         "lsr	x3, x3, 1\n\t"
68488         "ldr	x4, [%[a], 40]\n\t"
68489         "str	x2, [%[r], 24]\n\t"
68490         "orr	x3, x3, x4, lsl 63\n\t"
68491         "lsr	x4, x4, 1\n\t"
68492         "ldr	x2, [%[a], 48]\n\t"
68493         "str	x3, [%[r], 32]\n\t"
68494         "orr	x4, x4, x2, lsl 63\n\t"
68495         "lsr	x2, x2, 1\n\t"
68496         "ldr	x3, [%[a], 56]\n\t"
68497         "str	x4, [%[r], 40]\n\t"
68498         "orr	x2, x2, x3, lsl 63\n\t"
68499         "lsr	x3, x3, 1\n\t"
68500         "ldr	x4, [%[a], 64]\n\t"
68501         "str	x2, [%[r], 48]\n\t"
68502         "orr	x3, x3, x4, lsl 63\n\t"
68503         "lsr	x4, x4, 1\n\t"
68504         "ldr	x2, [%[a], 72]\n\t"
68505         "str	x3, [%[r], 56]\n\t"
68506         "orr	x4, x4, x2, lsl 63\n\t"
68507         "lsr	x2, x2, 1\n\t"
68508         "ldr	x3, [%[a], 80]\n\t"
68509         "str	x4, [%[r], 64]\n\t"
68510         "orr	x2, x2, x3, lsl 63\n\t"
68511         "lsr	x3, x3, 1\n\t"
68512         "ldr	x4, [%[a], 88]\n\t"
68513         "str	x2, [%[r], 72]\n\t"
68514         "orr	x3, x3, x4, lsl 63\n\t"
68515         "lsr	x4, x4, 1\n\t"
68516         "ldr	x2, [%[a], 96]\n\t"
68517         "str	x3, [%[r], 80]\n\t"
68518         "orr	x4, x4, x2, lsl 63\n\t"
68519         "lsr	x2, x2, 1\n\t"
68520         "ldr	x3, [%[a], 104]\n\t"
68521         "str	x4, [%[r], 88]\n\t"
68522         "orr	x2, x2, x3, lsl 63\n\t"
68523         "lsr	x3, x3, 1\n\t"
68524         "ldr	x4, [%[a], 112]\n\t"
68525         "str	x2, [%[r], 96]\n\t"
68526         "orr	x3, x3, x4, lsl 63\n\t"
68527         "lsr	x4, x4, 1\n\t"
68528         "ldr	x2, [%[a], 120]\n\t"
68529         "str	x3, [%[r], 104]\n\t"
68530         "orr	x4, x4, x2, lsl 63\n\t"
68531         "lsr	x2, x2, 1\n\t"
68532         "str	x4, [%[r], 112]\n\t"
68533         "str	x2, [%[r], 120]\n\t"
68534         :
68535         : [r] "r" (r), [a] "r" (a)
68536         : "memory", "x2", "x3", "x4"
68537     );
68538 }
68539 
68540 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
68541  *
68542  * r  Result of division by 2.
68543  * a  Number to divide.
68544  * m  Modulus (prime).
68545  */
sp_1024_div2_16(sp_digit * r,const sp_digit * a,const sp_digit * m)68546 static void sp_1024_div2_16(sp_digit* r, const sp_digit* a, const sp_digit* m)
68547 {
68548     sp_digit o;
68549 
68550     o = sp_1024_cond_add_16(r, a, m, 0 - (a[0] & 1));
68551     sp_1024_rshift1_16(r, r);
68552     r[15] |= o << 63;
68553 }
68554 
68555 /* Double the Montgomery form projective point p.
68556  *
68557  * r  Result of doubling point.
68558  * p  Point to double.
68559  * t  Temporary ordinate data.
68560  */
68561 #ifdef WOLFSSL_SP_NONBLOCK
68562 typedef struct sp_1024_proj_point_dbl_16_ctx {
68563     int state;
68564     sp_digit* t1;
68565     sp_digit* t2;
68566     sp_digit* x;
68567     sp_digit* y;
68568     sp_digit* z;
68569 } sp_1024_proj_point_dbl_16_ctx;
68570 
sp_1024_proj_point_dbl_16_nb(sp_ecc_ctx_t * sp_ctx,sp_point_1024 * r,const sp_point_1024 * p,sp_digit * t)68571 static int sp_1024_proj_point_dbl_16_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t)
68572 {
68573     int err = FP_WOULDBLOCK;
68574     sp_1024_proj_point_dbl_16_ctx* ctx = (sp_1024_proj_point_dbl_16_ctx*)sp_ctx->data;
68575 
68576     typedef char ctx_size_test[sizeof(sp_1024_proj_point_dbl_16_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
68577     (void)sizeof(ctx_size_test);
68578 
68579     switch (ctx->state) {
68580     case 0:
68581         ctx->t1 = t;
68582         ctx->t2 = t + 2*16;
68583         ctx->x = r->x;
68584         ctx->y = r->y;
68585         ctx->z = r->z;
68586 
68587         /* Put infinity into result. */
68588         if (r != p) {
68589             r->infinity = p->infinity;
68590         }
68591         ctx->state = 1;
68592         break;
68593     case 1:
68594         /* T1 = Z * Z */
68595         sp_1024_mont_sqr_16(ctx->t1, p->z, p1024_mod, p1024_mp_mod);
68596         ctx->state = 2;
68597         break;
68598     case 2:
68599         /* Z = Y * Z */
68600         sp_1024_mont_mul_16(ctx->z, p->y, p->z, p1024_mod, p1024_mp_mod);
68601         ctx->state = 3;
68602         break;
68603     case 3:
68604         /* Z = 2Z */
68605         sp_1024_mont_dbl_16(ctx->z, ctx->z, p1024_mod);
68606         ctx->state = 4;
68607         break;
68608     case 4:
68609         /* T2 = X - T1 */
68610         sp_1024_mont_sub_16(ctx->t2, p->x, ctx->t1, p1024_mod);
68611         ctx->state = 5;
68612         break;
68613     case 5:
68614         /* T1 = X + T1 */
68615         sp_1024_mont_add_16(ctx->t1, p->x, ctx->t1, p1024_mod);
68616         ctx->state = 6;
68617         break;
68618     case 6:
68619         /* T2 = T1 * T2 */
68620         sp_1024_mont_mul_16(ctx->t2, ctx->t1, ctx->t2, p1024_mod, p1024_mp_mod);
68621         ctx->state = 7;
68622         break;
68623     case 7:
68624         /* T1 = 3T2 */
68625         sp_1024_mont_tpl_16(ctx->t1, ctx->t2, p1024_mod);
68626         ctx->state = 8;
68627         break;
68628     case 8:
68629         /* Y = 2Y */
68630         sp_1024_mont_dbl_16(ctx->y, p->y, p1024_mod);
68631         ctx->state = 9;
68632         break;
68633     case 9:
68634         /* Y = Y * Y */
68635         sp_1024_mont_sqr_16(ctx->y, ctx->y, p1024_mod, p1024_mp_mod);
68636         ctx->state = 10;
68637         break;
68638     case 10:
68639         /* T2 = Y * Y */
68640         sp_1024_mont_sqr_16(ctx->t2, ctx->y, p1024_mod, p1024_mp_mod);
68641         ctx->state = 11;
68642         break;
68643     case 11:
68644         /* T2 = T2/2 */
68645         sp_1024_div2_16(ctx->t2, ctx->t2, p1024_mod);
68646         ctx->state = 12;
68647         break;
68648     case 12:
68649         /* Y = Y * X */
68650         sp_1024_mont_mul_16(ctx->y, ctx->y, p->x, p1024_mod, p1024_mp_mod);
68651         ctx->state = 13;
68652         break;
68653     case 13:
68654         /* X = T1 * T1 */
68655         sp_1024_mont_sqr_16(ctx->x, ctx->t1, p1024_mod, p1024_mp_mod);
68656         ctx->state = 14;
68657         break;
68658     case 14:
68659         /* X = X - Y */
68660         sp_1024_mont_sub_16(ctx->x, ctx->x, ctx->y, p1024_mod);
68661         ctx->state = 15;
68662         break;
68663     case 15:
68664         /* X = X - Y */
68665         sp_1024_mont_sub_16(ctx->x, ctx->x, ctx->y, p1024_mod);
68666         ctx->state = 16;
68667         break;
68668     case 16:
68669         /* Y = Y - X */
68670         sp_1024_mont_sub_16(ctx->y, ctx->y, ctx->x, p1024_mod);
68671         ctx->state = 17;
68672         break;
68673     case 17:
68674         /* Y = Y * T1 */
68675         sp_1024_mont_mul_16(ctx->y, ctx->y, ctx->t1, p1024_mod, p1024_mp_mod);
68676         ctx->state = 18;
68677         break;
68678     case 18:
68679         /* Y = Y - T2 */
68680         sp_1024_mont_sub_16(ctx->y, ctx->y, ctx->t2, p1024_mod);
68681         ctx->state = 19;
68682         /* fall-through */
68683     case 19:
68684         err = MP_OKAY;
68685         break;
68686     }
68687 
68688     if (err == MP_OKAY && ctx->state != 19) {
68689         err = FP_WOULDBLOCK;
68690     }
68691 
68692     return err;
68693 }
68694 #endif /* WOLFSSL_SP_NONBLOCK */
68695 
sp_1024_proj_point_dbl_16(sp_point_1024 * r,const sp_point_1024 * p,sp_digit * t)68696 static void sp_1024_proj_point_dbl_16(sp_point_1024* r, const sp_point_1024* p, sp_digit* t)
68697 {
68698     sp_digit* t1 = t;
68699     sp_digit* t2 = t + 2*16;
68700     sp_digit* x;
68701     sp_digit* y;
68702     sp_digit* z;
68703 
68704     x = r->x;
68705     y = r->y;
68706     z = r->z;
68707     /* Put infinity into result. */
68708     if (r != p) {
68709         r->infinity = p->infinity;
68710     }
68711 
68712     /* T1 = Z * Z */
68713     sp_1024_mont_sqr_16(t1, p->z, p1024_mod, p1024_mp_mod);
68714     /* Z = Y * Z */
68715     sp_1024_mont_mul_16(z, p->y, p->z, p1024_mod, p1024_mp_mod);
68716     /* Z = 2Z */
68717     sp_1024_mont_dbl_16(z, z, p1024_mod);
68718     /* T2 = X - T1 */
68719     sp_1024_mont_sub_16(t2, p->x, t1, p1024_mod);
68720     /* T1 = X + T1 */
68721     sp_1024_mont_add_16(t1, p->x, t1, p1024_mod);
68722     /* T2 = T1 * T2 */
68723     sp_1024_mont_mul_16(t2, t1, t2, p1024_mod, p1024_mp_mod);
68724     /* T1 = 3T2 */
68725     sp_1024_mont_tpl_16(t1, t2, p1024_mod);
68726     /* Y = 2Y */
68727     sp_1024_mont_dbl_16(y, p->y, p1024_mod);
68728     /* Y = Y * Y */
68729     sp_1024_mont_sqr_16(y, y, p1024_mod, p1024_mp_mod);
68730     /* T2 = Y * Y */
68731     sp_1024_mont_sqr_16(t2, y, p1024_mod, p1024_mp_mod);
68732     /* T2 = T2/2 */
68733     sp_1024_div2_16(t2, t2, p1024_mod);
68734     /* Y = Y * X */
68735     sp_1024_mont_mul_16(y, y, p->x, p1024_mod, p1024_mp_mod);
68736     /* X = T1 * T1 */
68737     sp_1024_mont_sqr_16(x, t1, p1024_mod, p1024_mp_mod);
68738     /* X = X - Y */
68739     sp_1024_mont_sub_16(x, x, y, p1024_mod);
68740     /* X = X - Y */
68741     sp_1024_mont_sub_16(x, x, y, p1024_mod);
68742     /* Y = Y - X */
68743     sp_1024_mont_sub_16(y, y, x, p1024_mod);
68744     /* Y = Y * T1 */
68745     sp_1024_mont_mul_16(y, y, t1, p1024_mod, p1024_mp_mod);
68746     /* Y = Y - T2 */
68747     sp_1024_mont_sub_16(y, y, t2, p1024_mod);
68748 }
68749 
68750 /* Double the Montgomery form projective point p a number of times.
68751  *
68752  * r  Result of repeated doubling of point.
68753  * p  Point to double.
68754  * n  Number of times to double
68755  * t  Temporary ordinate data.
68756  */
sp_1024_proj_point_dbl_n_16(sp_point_1024 * p,int n,sp_digit * t)68757 static void sp_1024_proj_point_dbl_n_16(sp_point_1024* p, int n,
68758     sp_digit* t)
68759 {
68760     sp_digit* w = t;
68761     sp_digit* a = t + 2*16;
68762     sp_digit* b = t + 4*16;
68763     sp_digit* t1 = t + 6*16;
68764     sp_digit* t2 = t + 8*16;
68765     sp_digit* x;
68766     sp_digit* y;
68767     sp_digit* z;
68768 
68769     x = p->x;
68770     y = p->y;
68771     z = p->z;
68772 
68773     /* Y = 2*Y */
68774     sp_1024_mont_dbl_16(y, y, p1024_mod);
68775     /* W = Z^4 */
68776     sp_1024_mont_sqr_16(w, z, p1024_mod, p1024_mp_mod);
68777     sp_1024_mont_sqr_16(w, w, p1024_mod, p1024_mp_mod);
68778 
68779 #ifndef WOLFSSL_SP_SMALL
68780     while (--n > 0)
68781 #else
68782     while (--n >= 0)
68783 #endif
68784     {
68785         /* A = 3*(X^2 - W) */
68786         sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod);
68787         sp_1024_mont_sub_16(t1, t1, w, p1024_mod);
68788         sp_1024_mont_tpl_16(a, t1, p1024_mod);
68789         /* B = X*Y^2 */
68790         sp_1024_mont_sqr_16(t1, y, p1024_mod, p1024_mp_mod);
68791         sp_1024_mont_mul_16(b, t1, x, p1024_mod, p1024_mp_mod);
68792         /* X = A^2 - 2B */
68793         sp_1024_mont_sqr_16(x, a, p1024_mod, p1024_mp_mod);
68794         sp_1024_mont_dbl_16(t2, b, p1024_mod);
68795         sp_1024_mont_sub_16(x, x, t2, p1024_mod);
68796         /* Z = Z*Y */
68797         sp_1024_mont_mul_16(z, z, y, p1024_mod, p1024_mp_mod);
68798         /* t2 = Y^4 */
68799         sp_1024_mont_sqr_16(t1, t1, p1024_mod, p1024_mp_mod);
68800 #ifdef WOLFSSL_SP_SMALL
68801         if (n != 0)
68802 #endif
68803         {
68804             /* W = W*Y^4 */
68805             sp_1024_mont_mul_16(w, w, t1, p1024_mod, p1024_mp_mod);
68806         }
68807         /* y = 2*A*(B - X) - Y^4 */
68808         sp_1024_mont_sub_16(y, b, x, p1024_mod);
68809         sp_1024_mont_mul_16(y, y, a, p1024_mod, p1024_mp_mod);
68810         sp_1024_mont_dbl_16(y, y, p1024_mod);
68811         sp_1024_mont_sub_16(y, y, t1, p1024_mod);
68812     }
68813 #ifndef WOLFSSL_SP_SMALL
68814     /* A = 3*(X^2 - W) */
68815     sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod);
68816     sp_1024_mont_sub_16(t1, t1, w, p1024_mod);
68817     sp_1024_mont_tpl_16(a, t1, p1024_mod);
68818     /* B = X*Y^2 */
68819     sp_1024_mont_sqr_16(t1, y, p1024_mod, p1024_mp_mod);
68820     sp_1024_mont_mul_16(b, t1, x, p1024_mod, p1024_mp_mod);
68821     /* X = A^2 - 2B */
68822     sp_1024_mont_sqr_16(x, a, p1024_mod, p1024_mp_mod);
68823     sp_1024_mont_dbl_16(t2, b, p1024_mod);
68824     sp_1024_mont_sub_16(x, x, t2, p1024_mod);
68825     /* Z = Z*Y */
68826     sp_1024_mont_mul_16(z, z, y, p1024_mod, p1024_mp_mod);
68827     /* t2 = Y^4 */
68828     sp_1024_mont_sqr_16(t1, t1, p1024_mod, p1024_mp_mod);
68829     /* y = 2*A*(B - X) - Y^4 */
68830     sp_1024_mont_sub_16(y, b, x, p1024_mod);
68831     sp_1024_mont_mul_16(y, y, a, p1024_mod, p1024_mp_mod);
68832     sp_1024_mont_dbl_16(y, y, p1024_mod);
68833     sp_1024_mont_sub_16(y, y, t1, p1024_mod);
68834 #endif
68835     /* Y = Y/2 */
68836     sp_1024_div2_16(y, y, p1024_mod);
68837 }
68838 
68839 #ifdef WOLFSSL_SP_SMALL
68840 /* Sub b from a into r. (r = a - b)
68841  *
68842  * r  A single precision integer.
68843  * a  A single precision integer.
68844  * b  A single precision integer.
68845  */
sp_1024_sub_16(sp_digit * r,const sp_digit * a,const sp_digit * b)68846 static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a,
68847         const sp_digit* b)
68848 {
68849     sp_digit c = 0;
68850 
68851     __asm__ __volatile__ (
68852         "add	x11, %[a], 128\n\t"
68853         "\n1:\n\t"
68854         "subs	%[c], xzr, %[c]\n\t"
68855         "ldp	x3, x4, [%[a]], #16\n\t"
68856         "ldp	x5, x6, [%[a]], #16\n\t"
68857         "ldp	x7, x8, [%[b]], #16\n\t"
68858         "sbcs	x3, x3, x7\n\t"
68859         "ldp	x9, x10, [%[b]], #16\n\t"
68860         "sbcs	x4, x4, x8\n\t"
68861         "sbcs	x5, x5, x9\n\t"
68862         "stp	x3, x4, [%[r]], #16\n\t"
68863         "sbcs	x6, x6, x10\n\t"
68864         "stp	x5, x6, [%[r]], #16\n\t"
68865         "csetm	%[c], cc\n\t"
68866         "cmp	%[a], x11\n\t"
68867         "b.ne	1b\n\t"
68868         : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b)
68869         :
68870         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11"
68871     );
68872 
68873     return c;
68874 }
68875 
68876 #else
68877 /* Sub b from a into r. (r = a - b)
68878  *
68879  * r  A single precision integer.
68880  * a  A single precision integer.
68881  * b  A single precision integer.
68882  */
sp_1024_sub_16(sp_digit * r,const sp_digit * a,const sp_digit * b)68883 static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a,
68884         const sp_digit* b)
68885 {
68886     __asm__ __volatile__ (
68887         "ldp	x3, x4, [%[a], 0]\n\t"
68888         "ldp	x7, x8, [%[b], 0]\n\t"
68889         "subs	x3, x3, x7\n\t"
68890         "ldp	x5, x6, [%[a], 16]\n\t"
68891         "sbcs	x4, x4, x8\n\t"
68892         "ldp	x9, x10, [%[b], 16]\n\t"
68893         "sbcs	x5, x5, x9\n\t"
68894         "stp	x3, x4, [%[r], 0]\n\t"
68895         "sbcs	x6, x6, x10\n\t"
68896         "stp	x5, x6, [%[r], 16]\n\t"
68897         "ldp	x3, x4, [%[a], 32]\n\t"
68898         "ldp	x7, x8, [%[b], 32]\n\t"
68899         "sbcs	x3, x3, x7\n\t"
68900         "ldp	x5, x6, [%[a], 48]\n\t"
68901         "sbcs	x4, x4, x8\n\t"
68902         "ldp	x9, x10, [%[b], 48]\n\t"
68903         "sbcs	x5, x5, x9\n\t"
68904         "stp	x3, x4, [%[r], 32]\n\t"
68905         "sbcs	x6, x6, x10\n\t"
68906         "stp	x5, x6, [%[r], 48]\n\t"
68907         "ldp	x3, x4, [%[a], 64]\n\t"
68908         "ldp	x7, x8, [%[b], 64]\n\t"
68909         "sbcs	x3, x3, x7\n\t"
68910         "ldp	x5, x6, [%[a], 80]\n\t"
68911         "sbcs	x4, x4, x8\n\t"
68912         "ldp	x9, x10, [%[b], 80]\n\t"
68913         "sbcs	x5, x5, x9\n\t"
68914         "stp	x3, x4, [%[r], 64]\n\t"
68915         "sbcs	x6, x6, x10\n\t"
68916         "stp	x5, x6, [%[r], 80]\n\t"
68917         "ldp	x3, x4, [%[a], 96]\n\t"
68918         "ldp	x7, x8, [%[b], 96]\n\t"
68919         "sbcs	x3, x3, x7\n\t"
68920         "ldp	x5, x6, [%[a], 112]\n\t"
68921         "sbcs	x4, x4, x8\n\t"
68922         "ldp	x9, x10, [%[b], 112]\n\t"
68923         "sbcs	x5, x5, x9\n\t"
68924         "stp	x3, x4, [%[r], 96]\n\t"
68925         "sbcs	x6, x6, x10\n\t"
68926         "stp	x5, x6, [%[r], 112]\n\t"
68927         "csetm	%[r], cc\n\t"
68928         : [r] "+r" (r)
68929         : [a] "r" (a), [b] "r" (b)
68930         : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"
68931     );
68932 
68933     return (sp_digit)r;
68934 }
68935 
68936 #endif /* WOLFSSL_SP_SMALL */
68937 /* Compare two numbers to determine if they are equal.
68938  * Constant time implementation.
68939  *
68940  * a  First number to compare.
68941  * b  Second number to compare.
68942  * returns 1 when equal and 0 otherwise.
68943  */
sp_1024_cmp_equal_16(const sp_digit * a,const sp_digit * b)68944 static int sp_1024_cmp_equal_16(const sp_digit* a, const sp_digit* b)
68945 {
68946     return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
68947             (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
68948             (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
68949             (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
68950             (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
68951             (a[15] ^ b[15])) == 0;
68952 }
68953 
68954 /* Add two Montgomery form projective points.
68955  *
68956  * r  Result of addition.
68957  * p  First point to add.
68958  * q  Second point to add.
68959  * t  Temporary ordinate data.
68960  */
68961 
68962 #ifdef WOLFSSL_SP_NONBLOCK
68963 typedef struct sp_1024_proj_point_add_16_ctx {
68964     int state;
68965     sp_1024_proj_point_dbl_16_ctx dbl_ctx;
68966     const sp_point_1024* ap[2];
68967     sp_point_1024* rp[2];
68968     sp_digit* t1;
68969     sp_digit* t2;
68970     sp_digit* t3;
68971     sp_digit* t4;
68972     sp_digit* t5;
68973     sp_digit* x;
68974     sp_digit* y;
68975     sp_digit* z;
68976 } sp_1024_proj_point_add_16_ctx;
68977 
sp_1024_proj_point_add_16_nb(sp_ecc_ctx_t * sp_ctx,sp_point_1024 * r,const sp_point_1024 * p,const sp_point_1024 * q,sp_digit * t)68978 static int sp_1024_proj_point_add_16_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
68979     const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
68980 {
68981     int err = FP_WOULDBLOCK;
68982     sp_1024_proj_point_add_16_ctx* ctx = (sp_1024_proj_point_add_16_ctx*)sp_ctx->data;
68983 
68984     /* Ensure only the first point is the same as the result. */
68985     if (q == r) {
68986         const sp_point_1024* a = p;
68987         p = q;
68988         q = a;
68989     }
68990 
68991     typedef char ctx_size_test[sizeof(sp_1024_proj_point_add_16_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
68992     (void)sizeof(ctx_size_test);
68993 
68994     switch (ctx->state) {
68995     case 0: /* INIT */
68996         ctx->t1 = t;
68997         ctx->t2 = t + 2*16;
68998         ctx->t3 = t + 4*16;
68999         ctx->t4 = t + 6*16;
69000         ctx->t5 = t + 8*16;
69001 
69002         ctx->state = 1;
69003         break;
69004     case 1:
69005         /* Check double */
69006         (void)sp_1024_sub_16(ctx->t1, p1024_mod, q->y);
69007         sp_1024_norm_16(ctx->t1);
69008         if ((sp_1024_cmp_equal_16(p->x, q->x) & sp_1024_cmp_equal_16(p->z, q->z) &
69009             (sp_1024_cmp_equal_16(p->y, q->y) | sp_1024_cmp_equal_16(p->y, ctx->t1))) != 0)
69010         {
69011             XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
69012             ctx->state = 2;
69013         }
69014         else {
69015             ctx->state = 3;
69016         }
69017         break;
69018     case 2:
69019         err = sp_1024_proj_point_dbl_16_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
69020         if (err == MP_OKAY)
69021             ctx->state = 27; /* done */
69022         break;
69023     case 3:
69024     {
69025         int i;
69026         ctx->rp[0] = r;
69027 
69028         /*lint allow cast to different type of pointer*/
69029         ctx->rp[1] = (sp_point_1024*)t; /*lint !e9087 !e740*/
69030         XMEMSET(ctx->rp[1], 0, sizeof(sp_point_1024));
69031         ctx->x = ctx->rp[p->infinity | q->infinity]->x;
69032         ctx->y = ctx->rp[p->infinity | q->infinity]->y;
69033         ctx->z = ctx->rp[p->infinity | q->infinity]->z;
69034 
69035         ctx->ap[0] = p;
69036         ctx->ap[1] = q;
69037         for (i=0; i<16; i++) {
69038             r->x[i] = ctx->ap[p->infinity]->x[i];
69039         }
69040         for (i=0; i<16; i++) {
69041             r->y[i] = ctx->ap[p->infinity]->y[i];
69042         }
69043         for (i=0; i<16; i++) {
69044             r->z[i] = ctx->ap[p->infinity]->z[i];
69045         }
69046         r->infinity = ctx->ap[p->infinity]->infinity;
69047 
69048         ctx->state = 4;
69049         break;
69050     }
69051     case 4:
69052         /* U1 = X1*Z2^2 */
69053         sp_1024_mont_sqr_16(ctx->t1, q->z, p1024_mod, p1024_mp_mod);
69054         ctx->state = 5;
69055         break;
69056     case 5:
69057         sp_1024_mont_mul_16(ctx->t3, ctx->t1, q->z, p1024_mod, p1024_mp_mod);
69058         ctx->state = 6;
69059         break;
69060     case 6:
69061         sp_1024_mont_mul_16(ctx->t1, ctx->t1, ctx->x, p1024_mod, p1024_mp_mod);
69062         ctx->state = 7;
69063         break;
69064     case 7:
69065         /* U2 = X2*Z1^2 */
69066         sp_1024_mont_sqr_16(ctx->t2, ctx->z, p1024_mod, p1024_mp_mod);
69067         ctx->state = 8;
69068         break;
69069     case 8:
69070         sp_1024_mont_mul_16(ctx->t4, ctx->t2, ctx->z, p1024_mod, p1024_mp_mod);
69071         ctx->state = 9;
69072         break;
69073     case 9:
69074         sp_1024_mont_mul_16(ctx->t2, ctx->t2, q->x, p1024_mod, p1024_mp_mod);
69075         ctx->state = 10;
69076         break;
69077     case 10:
69078         /* S1 = Y1*Z2^3 */
69079         sp_1024_mont_mul_16(ctx->t3, ctx->t3, ctx->y, p1024_mod, p1024_mp_mod);
69080         ctx->state = 11;
69081         break;
69082     case 11:
69083         /* S2 = Y2*Z1^3 */
69084         sp_1024_mont_mul_16(ctx->t4, ctx->t4, q->y, p1024_mod, p1024_mp_mod);
69085         ctx->state = 12;
69086         break;
69087     case 12:
69088         /* H = U2 - U1 */
69089         sp_1024_mont_sub_16(ctx->t2, ctx->t2, ctx->t1, p1024_mod);
69090         ctx->state = 13;
69091         break;
69092     case 13:
69093         /* R = S2 - S1 */
69094         sp_1024_mont_sub_16(ctx->t4, ctx->t4, ctx->t3, p1024_mod);
69095         ctx->state = 14;
69096         break;
69097     case 14:
69098         /* Z3 = H*Z1*Z2 */
69099         sp_1024_mont_mul_16(ctx->z, ctx->z, q->z, p1024_mod, p1024_mp_mod);
69100         ctx->state = 15;
69101         break;
69102     case 15:
69103         sp_1024_mont_mul_16(ctx->z, ctx->z, ctx->t2, p1024_mod, p1024_mp_mod);
69104         ctx->state = 16;
69105         break;
69106     case 16:
69107         /* X3 = R^2 - H^3 - 2*U1*H^2 */
69108         sp_1024_mont_sqr_16(ctx->x, ctx->t4, p1024_mod, p1024_mp_mod);
69109         ctx->state = 17;
69110         break;
69111     case 17:
69112         sp_1024_mont_sqr_16(ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
69113         ctx->state = 18;
69114         break;
69115     case 18:
69116         sp_1024_mont_mul_16(ctx->y, ctx->t1, ctx->t5, p1024_mod, p1024_mp_mod);
69117         ctx->state = 19;
69118         break;
69119     case 19:
69120         sp_1024_mont_mul_16(ctx->t5, ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
69121         ctx->state = 20;
69122         break;
69123     case 20:
69124         sp_1024_mont_sub_16(ctx->x, ctx->x, ctx->t5, p1024_mod);
69125         ctx->state = 21;
69126         break;
69127     case 21:
69128         sp_1024_mont_dbl_16(ctx->t1, ctx->y, p1024_mod);
69129         ctx->state = 22;
69130         break;
69131     case 22:
69132         sp_1024_mont_sub_16(ctx->x, ctx->x, ctx->t1, p1024_mod);
69133         ctx->state = 23;
69134         break;
69135     case 23:
69136         /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
69137         sp_1024_mont_sub_16(ctx->y, ctx->y, ctx->x, p1024_mod);
69138         ctx->state = 24;
69139         break;
69140     case 24:
69141         sp_1024_mont_mul_16(ctx->y, ctx->y, ctx->t4, p1024_mod, p1024_mp_mod);
69142         ctx->state = 25;
69143         break;
69144     case 25:
69145         sp_1024_mont_mul_16(ctx->t5, ctx->t5, ctx->t3, p1024_mod, p1024_mp_mod);
69146         ctx->state = 26;
69147         break;
69148     case 26:
69149         sp_1024_mont_sub_16(ctx->y, ctx->y, ctx->t5, p1024_mod);
69150         ctx->state = 27;
69151         /* fall-through */
69152     case 27:
69153         err = MP_OKAY;
69154         break;
69155     }
69156 
69157     if (err == MP_OKAY && ctx->state != 27) {
69158         err = FP_WOULDBLOCK;
69159     }
69160     return err;
69161 }
69162 #endif /* WOLFSSL_SP_NONBLOCK */
69163 
sp_1024_proj_point_add_16(sp_point_1024 * r,const sp_point_1024 * p,const sp_point_1024 * q,sp_digit * t)69164 static void sp_1024_proj_point_add_16(sp_point_1024* r,
69165         const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
69166 {
69167     const sp_point_1024* ap[2];
69168     sp_point_1024* rp[2];
69169     sp_digit* t1 = t;
69170     sp_digit* t2 = t + 2*16;
69171     sp_digit* t3 = t + 4*16;
69172     sp_digit* t4 = t + 6*16;
69173     sp_digit* t5 = t + 8*16;
69174     sp_digit* x;
69175     sp_digit* y;
69176     sp_digit* z;
69177     int i;
69178 
69179     /* Ensure only the first point is the same as the result. */
69180     if (q == r) {
69181         const sp_point_1024* a = p;
69182         p = q;
69183         q = a;
69184     }
69185 
69186     /* Check double */
69187     (void)sp_1024_mont_sub_16(t1, p1024_mod, q->y, p1024_mod);
69188     sp_1024_norm_16(t1);
69189     if ((sp_1024_cmp_equal_16(p->x, q->x) & sp_1024_cmp_equal_16(p->z, q->z) &
69190         (sp_1024_cmp_equal_16(p->y, q->y) | sp_1024_cmp_equal_16(p->y, t1))) != 0) {
69191         sp_1024_proj_point_dbl_16(r, p, t);
69192     }
69193     else {
69194         rp[0] = r;
69195 
69196         /*lint allow cast to different type of pointer*/
69197         rp[1] = (sp_point_1024*)t; /*lint !e9087 !e740*/
69198         XMEMSET(rp[1], 0, sizeof(sp_point_1024));
69199         x = rp[p->infinity | q->infinity]->x;
69200         y = rp[p->infinity | q->infinity]->y;
69201         z = rp[p->infinity | q->infinity]->z;
69202 
69203         ap[0] = p;
69204         ap[1] = q;
69205         for (i=0; i<16; i++) {
69206             r->x[i] = ap[p->infinity]->x[i];
69207         }
69208         for (i=0; i<16; i++) {
69209             r->y[i] = ap[p->infinity]->y[i];
69210         }
69211         for (i=0; i<16; i++) {
69212             r->z[i] = ap[p->infinity]->z[i];
69213         }
69214         r->infinity = ap[p->infinity]->infinity;
69215 
69216         /* U1 = X1*Z2^2 */
69217         sp_1024_mont_sqr_16(t1, q->z, p1024_mod, p1024_mp_mod);
69218         sp_1024_mont_mul_16(t3, t1, q->z, p1024_mod, p1024_mp_mod);
69219         sp_1024_mont_mul_16(t1, t1, x, p1024_mod, p1024_mp_mod);
69220         /* U2 = X2*Z1^2 */
69221         sp_1024_mont_sqr_16(t2, z, p1024_mod, p1024_mp_mod);
69222         sp_1024_mont_mul_16(t4, t2, z, p1024_mod, p1024_mp_mod);
69223         sp_1024_mont_mul_16(t2, t2, q->x, p1024_mod, p1024_mp_mod);
69224         /* S1 = Y1*Z2^3 */
69225         sp_1024_mont_mul_16(t3, t3, y, p1024_mod, p1024_mp_mod);
69226         /* S2 = Y2*Z1^3 */
69227         sp_1024_mont_mul_16(t4, t4, q->y, p1024_mod, p1024_mp_mod);
69228         /* H = U2 - U1 */
69229         sp_1024_mont_sub_16(t2, t2, t1, p1024_mod);
69230         /* R = S2 - S1 */
69231         sp_1024_mont_sub_16(t4, t4, t3, p1024_mod);
69232         /* Z3 = H*Z1*Z2 */
69233         sp_1024_mont_mul_16(z, z, q->z, p1024_mod, p1024_mp_mod);
69234         sp_1024_mont_mul_16(z, z, t2, p1024_mod, p1024_mp_mod);
69235         /* X3 = R^2 - H^3 - 2*U1*H^2 */
69236         sp_1024_mont_sqr_16(x, t4, p1024_mod, p1024_mp_mod);
69237         sp_1024_mont_sqr_16(t5, t2, p1024_mod, p1024_mp_mod);
69238         sp_1024_mont_mul_16(y, t1, t5, p1024_mod, p1024_mp_mod);
69239         sp_1024_mont_mul_16(t5, t5, t2, p1024_mod, p1024_mp_mod);
69240         sp_1024_mont_sub_16(x, x, t5, p1024_mod);
69241         sp_1024_mont_dbl_16(t1, y, p1024_mod);
69242         sp_1024_mont_sub_16(x, x, t1, p1024_mod);
69243         /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
69244         sp_1024_mont_sub_16(y, y, x, p1024_mod);
69245         sp_1024_mont_mul_16(y, y, t4, p1024_mod, p1024_mp_mod);
69246         sp_1024_mont_mul_16(t5, t5, t3, p1024_mod, p1024_mp_mod);
69247         sp_1024_mont_sub_16(y, y, t5, p1024_mod);
69248     }
69249 }
69250 
69251 /* Double the Montgomery form projective point p a number of times.
69252  *
69253  * r  Result of repeated doubling of point.
69254  * p  Point to double.
69255  * n  Number of times to double
69256  * t  Temporary ordinate data.
69257  */
sp_1024_proj_point_dbl_n_store_16(sp_point_1024 * r,const sp_point_1024 * p,int n,int m,sp_digit * t)69258 static void sp_1024_proj_point_dbl_n_store_16(sp_point_1024* r,
69259         const sp_point_1024* p, int n, int m, sp_digit* t)
69260 {
69261     sp_digit* w = t;
69262     sp_digit* a = t + 2*16;
69263     sp_digit* b = t + 4*16;
69264     sp_digit* t1 = t + 6*16;
69265     sp_digit* t2 = t + 8*16;
69266     sp_digit* x = r[2*m].x;
69267     sp_digit* y = r[(1<<n)*m].y;
69268     sp_digit* z = r[2*m].z;
69269     int i;
69270     int j;
69271 
69272     for (i=0; i<16; i++) {
69273         x[i] = p->x[i];
69274     }
69275     for (i=0; i<16; i++) {
69276         y[i] = p->y[i];
69277     }
69278     for (i=0; i<16; i++) {
69279         z[i] = p->z[i];
69280     }
69281 
69282     /* Y = 2*Y */
69283     sp_1024_mont_dbl_16(y, y, p1024_mod);
69284     /* W = Z^4 */
69285     sp_1024_mont_sqr_16(w, z, p1024_mod, p1024_mp_mod);
69286     sp_1024_mont_sqr_16(w, w, p1024_mod, p1024_mp_mod);
69287     j = m;
69288     for (i=1; i<=n; i++) {
69289         j *= 2;
69290 
69291         /* A = 3*(X^2 - W) */
69292         sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod);
69293         sp_1024_mont_sub_16(t1, t1, w, p1024_mod);
69294         sp_1024_mont_tpl_16(a, t1, p1024_mod);
69295         /* B = X*Y^2 */
69296         sp_1024_mont_sqr_16(t2, y, p1024_mod, p1024_mp_mod);
69297         sp_1024_mont_mul_16(b, t2, x, p1024_mod, p1024_mp_mod);
69298         x = r[j].x;
69299         /* X = A^2 - 2B */
69300         sp_1024_mont_sqr_16(x, a, p1024_mod, p1024_mp_mod);
69301         sp_1024_mont_dbl_16(t1, b, p1024_mod);
69302         sp_1024_mont_sub_16(x, x, t1, p1024_mod);
69303         /* Z = Z*Y */
69304         sp_1024_mont_mul_16(r[j].z, z, y, p1024_mod, p1024_mp_mod);
69305         z = r[j].z;
69306         /* t2 = Y^4 */
69307         sp_1024_mont_sqr_16(t2, t2, p1024_mod, p1024_mp_mod);
69308         if (i != n) {
69309             /* W = W*Y^4 */
69310             sp_1024_mont_mul_16(w, w, t2, p1024_mod, p1024_mp_mod);
69311         }
69312         /* y = 2*A*(B - X) - Y^4 */
69313         sp_1024_mont_sub_16(y, b, x, p1024_mod);
69314         sp_1024_mont_mul_16(y, y, a, p1024_mod, p1024_mp_mod);
69315         sp_1024_mont_dbl_16(y, y, p1024_mod);
69316         sp_1024_mont_sub_16(y, y, t2, p1024_mod);
69317 
69318         /* Y = Y/2 */
69319         sp_1024_div2_16(r[j].y, y, p1024_mod);
69320         r[j].infinity = 0;
69321     }
69322 }
69323 
69324 /* Add two Montgomery form projective points.
69325  *
69326  * ra  Result of addition.
69327  * rs  Result of subtraction.
69328  * p   First point to add.
69329  * q   Second point to add.
69330  * t   Temporary ordinate data.
69331  */
sp_1024_proj_point_add_sub_16(sp_point_1024 * ra,sp_point_1024 * rs,const sp_point_1024 * p,const sp_point_1024 * q,sp_digit * t)69332 static void sp_1024_proj_point_add_sub_16(sp_point_1024* ra,
69333         sp_point_1024* rs, const sp_point_1024* p, const sp_point_1024* q,
69334         sp_digit* t)
69335 {
69336     sp_digit* t1 = t;
69337     sp_digit* t2 = t + 2*16;
69338     sp_digit* t3 = t + 4*16;
69339     sp_digit* t4 = t + 6*16;
69340     sp_digit* t5 = t + 8*16;
69341     sp_digit* t6 = t + 10*16;
69342     sp_digit* x = ra->x;
69343     sp_digit* y = ra->y;
69344     sp_digit* z = ra->z;
69345     sp_digit* xs = rs->x;
69346     sp_digit* ys = rs->y;
69347     sp_digit* zs = rs->z;
69348 
69349 
69350     XMEMCPY(x, p->x, sizeof(p->x) / 2);
69351     XMEMCPY(y, p->y, sizeof(p->y) / 2);
69352     XMEMCPY(z, p->z, sizeof(p->z) / 2);
69353     ra->infinity = 0;
69354     rs->infinity = 0;
69355 
69356     /* U1 = X1*Z2^2 */
69357     sp_1024_mont_sqr_16(t1, q->z, p1024_mod, p1024_mp_mod);
69358     sp_1024_mont_mul_16(t3, t1, q->z, p1024_mod, p1024_mp_mod);
69359     sp_1024_mont_mul_16(t1, t1, x, p1024_mod, p1024_mp_mod);
69360     /* U2 = X2*Z1^2 */
69361     sp_1024_mont_sqr_16(t2, z, p1024_mod, p1024_mp_mod);
69362     sp_1024_mont_mul_16(t4, t2, z, p1024_mod, p1024_mp_mod);
69363     sp_1024_mont_mul_16(t2, t2, q->x, p1024_mod, p1024_mp_mod);
69364     /* S1 = Y1*Z2^3 */
69365     sp_1024_mont_mul_16(t3, t3, y, p1024_mod, p1024_mp_mod);
69366     /* S2 = Y2*Z1^3 */
69367     sp_1024_mont_mul_16(t4, t4, q->y, p1024_mod, p1024_mp_mod);
69368     /* H = U2 - U1 */
69369     sp_1024_mont_sub_16(t2, t2, t1, p1024_mod);
69370     /* RS = S2 + S1 */
69371     sp_1024_mont_add_16(t6, t4, t3, p1024_mod);
69372     /* R = S2 - S1 */
69373     sp_1024_mont_sub_16(t4, t4, t3, p1024_mod);
69374     /* Z3 = H*Z1*Z2 */
69375     /* ZS = H*Z1*Z2 */
69376     sp_1024_mont_mul_16(z, z, q->z, p1024_mod, p1024_mp_mod);
69377     sp_1024_mont_mul_16(z, z, t2, p1024_mod, p1024_mp_mod);
69378     XMEMCPY(zs, z, sizeof(p->z)/2);
69379     /* X3 = R^2 - H^3 - 2*U1*H^2 */
69380     /* XS = RS^2 - H^3 - 2*U1*H^2 */
69381     sp_1024_mont_sqr_16(x, t4, p1024_mod, p1024_mp_mod);
69382     sp_1024_mont_sqr_16(xs, t6, p1024_mod, p1024_mp_mod);
69383     sp_1024_mont_sqr_16(t5, t2, p1024_mod, p1024_mp_mod);
69384     sp_1024_mont_mul_16(y, t1, t5, p1024_mod, p1024_mp_mod);
69385     sp_1024_mont_mul_16(t5, t5, t2, p1024_mod, p1024_mp_mod);
69386     sp_1024_mont_sub_16(x, x, t5, p1024_mod);
69387     sp_1024_mont_sub_16(xs, xs, t5, p1024_mod);
69388     sp_1024_mont_dbl_16(t1, y, p1024_mod);
69389     sp_1024_mont_sub_16(x, x, t1, p1024_mod);
69390     sp_1024_mont_sub_16(xs, xs, t1, p1024_mod);
69391     /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
69392     /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */
69393     sp_1024_mont_sub_16(ys, y, xs, p1024_mod);
69394     sp_1024_mont_sub_16(y, y, x, p1024_mod);
69395     sp_1024_mont_mul_16(y, y, t4, p1024_mod, p1024_mp_mod);
69396     sp_1024_mont_sub_16(t6, p1024_mod, t6, p1024_mod);
69397     sp_1024_mont_mul_16(ys, ys, t6, p1024_mod, p1024_mp_mod);
69398     sp_1024_mont_mul_16(t5, t5, t3, p1024_mod, p1024_mp_mod);
69399     sp_1024_mont_sub_16(y, y, t5, p1024_mod);
69400     sp_1024_mont_sub_16(ys, ys, t5, p1024_mod);
69401 }
69402 
69403 /* Structure used to describe recoding of scalar multiplication. */
69404 typedef struct ecc_recode_1024 {
69405     /* Index into pre-computation table. */
69406     uint8_t i;
69407     /* Use the negative of the point. */
69408     uint8_t neg;
69409 } ecc_recode_1024;
69410 
69411 /* The index into pre-computation table to use. */
69412 static const uint8_t recode_index_16_7[130] = {
69413      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
69414     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
69415     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
69416     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
69417     64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49,
69418     48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33,
69419     32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
69420     16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
69421      0,  1,
69422 };
69423 
69424 /* Whether to negate y-ordinate. */
69425 static const uint8_t recode_neg_16_7[130] = {
69426      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
69427      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
69428      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
69429      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
69430      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
69431      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
69432      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
69433      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
69434      0,  0,
69435 };
69436 
69437 /* Recode the scalar for multiplication using pre-computed values and
69438  * subtraction.
69439  *
69440  * k  Scalar to multiply by.
69441  * v  Vector of operations to perform.
69442  */
sp_1024_ecc_recode_7_16(const sp_digit * k,ecc_recode_1024 * v)69443 static void sp_1024_ecc_recode_7_16(const sp_digit* k, ecc_recode_1024* v)
69444 {
69445     int i;
69446     int j;
69447     uint8_t y;
69448     int carry = 0;
69449     int o;
69450     sp_digit n;
69451 
69452     j = 0;
69453     n = k[j];
69454     o = 0;
69455     for (i=0; i<147; i++) {
69456         y = (int8_t)n;
69457         if (o + 7 < 64) {
69458             y &= 0x7f;
69459             n >>= 7;
69460             o += 7;
69461         }
69462         else if (o + 7 == 64) {
69463             n >>= 7;
69464             if (++j < 16)
69465                 n = k[j];
69466             o = 0;
69467         }
69468         else if (++j < 16) {
69469             n = k[j];
69470             y |= (uint8_t)((n << (64 - o)) & 0x7f);
69471             o -= 57;
69472             n >>= o;
69473         }
69474 
69475         y += (uint8_t)carry;
69476         v[i].i = recode_index_16_7[y];
69477         v[i].neg = recode_neg_16_7[y];
69478         carry = (y >> 7) + v[i].neg;
69479     }
69480 }
69481 
69482 /* Multiply the point by the scalar and return the result.
69483  * If map is true then convert result to affine coordinates.
69484  *
69485  * Window technique of 7 bits. (Add-Sub variation.)
69486  * Calculate 0..64 times the point. Use function that adds and
69487  * subtracts the same two points.
69488  * Recode to add or subtract one of the computed points.
69489  * Double to push up.
69490  * NOT a sliding window.
69491  *
69492  * r     Resulting point.
69493  * g     Point to multiply.
69494  * k     Scalar to multiply by.
69495  * map   Indicates whether to convert result to affine.
69496  * ct    Constant time required.
69497  * heap  Heap to use for allocation.
69498  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
69499  */
sp_1024_ecc_mulmod_win_add_sub_16(sp_point_1024 * r,const sp_point_1024 * g,const sp_digit * k,int map,int ct,void * heap)69500 static int sp_1024_ecc_mulmod_win_add_sub_16(sp_point_1024* r, const sp_point_1024* g,
69501         const sp_digit* k, int map, int ct, void* heap)
69502 {
69503 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69504     sp_point_1024* t = NULL;
69505     sp_digit* tmp = NULL;
69506 #else
69507     sp_point_1024 t[65+2];
69508     sp_digit tmp[2 * 16 * 6];
69509 #endif
69510     sp_point_1024* rt = NULL;
69511     sp_point_1024* p = NULL;
69512     sp_digit* negy;
69513     int i;
69514     ecc_recode_1024 v[147];
69515     int err = MP_OKAY;
69516 
69517     /* Constant time used for cache attack resistance implementation. */
69518     (void)ct;
69519     (void)heap;
69520 
69521 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69522     t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) *
69523         (65+2), heap, DYNAMIC_TYPE_ECC);
69524     if (t == NULL)
69525         err = MEMORY_E;
69526     if (err == MP_OKAY) {
69527         tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 16 * 6,
69528                                  heap, DYNAMIC_TYPE_ECC);
69529         if (tmp == NULL)
69530             err = MEMORY_E;
69531     }
69532 #endif
69533 
69534     if (err == MP_OKAY) {
69535         rt = t + 65;
69536         p  = t + 65+1;
69537 
69538         /* t[0] = {0, 0, 1} * norm */
69539         XMEMSET(&t[0], 0, sizeof(t[0]));
69540         t[0].infinity = 1;
69541         /* t[1] = {g->x, g->y, g->z} * norm */
69542         err = sp_1024_mod_mul_norm_16(t[1].x, g->x, p1024_mod);
69543     }
69544     if (err == MP_OKAY) {
69545         err = sp_1024_mod_mul_norm_16(t[1].y, g->y, p1024_mod);
69546     }
69547     if (err == MP_OKAY) {
69548         err = sp_1024_mod_mul_norm_16(t[1].z, g->z, p1024_mod);
69549     }
69550 
69551     if (err == MP_OKAY) {
69552         t[1].infinity = 0;
69553         /* t[2] ... t[64]  */
69554         sp_1024_proj_point_dbl_n_store_16(t, &t[ 1], 6, 1, tmp);
69555         sp_1024_proj_point_add_16(&t[ 3], &t[ 2], &t[ 1], tmp);
69556         sp_1024_proj_point_dbl_16(&t[ 6], &t[ 3], tmp);
69557         sp_1024_proj_point_add_sub_16(&t[ 7], &t[ 5], &t[ 6], &t[ 1], tmp);
69558         sp_1024_proj_point_dbl_16(&t[10], &t[ 5], tmp);
69559         sp_1024_proj_point_add_sub_16(&t[11], &t[ 9], &t[10], &t[ 1], tmp);
69560         sp_1024_proj_point_dbl_16(&t[12], &t[ 6], tmp);
69561         sp_1024_proj_point_dbl_16(&t[14], &t[ 7], tmp);
69562         sp_1024_proj_point_add_sub_16(&t[15], &t[13], &t[14], &t[ 1], tmp);
69563         sp_1024_proj_point_dbl_16(&t[18], &t[ 9], tmp);
69564         sp_1024_proj_point_add_sub_16(&t[19], &t[17], &t[18], &t[ 1], tmp);
69565         sp_1024_proj_point_dbl_16(&t[20], &t[10], tmp);
69566         sp_1024_proj_point_dbl_16(&t[22], &t[11], tmp);
69567         sp_1024_proj_point_add_sub_16(&t[23], &t[21], &t[22], &t[ 1], tmp);
69568         sp_1024_proj_point_dbl_16(&t[24], &t[12], tmp);
69569         sp_1024_proj_point_dbl_16(&t[26], &t[13], tmp);
69570         sp_1024_proj_point_add_sub_16(&t[27], &t[25], &t[26], &t[ 1], tmp);
69571         sp_1024_proj_point_dbl_16(&t[28], &t[14], tmp);
69572         sp_1024_proj_point_dbl_16(&t[30], &t[15], tmp);
69573         sp_1024_proj_point_add_sub_16(&t[31], &t[29], &t[30], &t[ 1], tmp);
69574         sp_1024_proj_point_dbl_16(&t[34], &t[17], tmp);
69575         sp_1024_proj_point_add_sub_16(&t[35], &t[33], &t[34], &t[ 1], tmp);
69576         sp_1024_proj_point_dbl_16(&t[36], &t[18], tmp);
69577         sp_1024_proj_point_dbl_16(&t[38], &t[19], tmp);
69578         sp_1024_proj_point_add_sub_16(&t[39], &t[37], &t[38], &t[ 1], tmp);
69579         sp_1024_proj_point_dbl_16(&t[40], &t[20], tmp);
69580         sp_1024_proj_point_dbl_16(&t[42], &t[21], tmp);
69581         sp_1024_proj_point_add_sub_16(&t[43], &t[41], &t[42], &t[ 1], tmp);
69582         sp_1024_proj_point_dbl_16(&t[44], &t[22], tmp);
69583         sp_1024_proj_point_dbl_16(&t[46], &t[23], tmp);
69584         sp_1024_proj_point_add_sub_16(&t[47], &t[45], &t[46], &t[ 1], tmp);
69585         sp_1024_proj_point_dbl_16(&t[48], &t[24], tmp);
69586         sp_1024_proj_point_dbl_16(&t[50], &t[25], tmp);
69587         sp_1024_proj_point_add_sub_16(&t[51], &t[49], &t[50], &t[ 1], tmp);
69588         sp_1024_proj_point_dbl_16(&t[52], &t[26], tmp);
69589         sp_1024_proj_point_dbl_16(&t[54], &t[27], tmp);
69590         sp_1024_proj_point_add_sub_16(&t[55], &t[53], &t[54], &t[ 1], tmp);
69591         sp_1024_proj_point_dbl_16(&t[56], &t[28], tmp);
69592         sp_1024_proj_point_dbl_16(&t[58], &t[29], tmp);
69593         sp_1024_proj_point_add_sub_16(&t[59], &t[57], &t[58], &t[ 1], tmp);
69594         sp_1024_proj_point_dbl_16(&t[60], &t[30], tmp);
69595         sp_1024_proj_point_dbl_16(&t[62], &t[31], tmp);
69596         sp_1024_proj_point_add_sub_16(&t[63], &t[61], &t[62], &t[ 1], tmp);
69597 
69598         negy = t[0].y;
69599 
69600         sp_1024_ecc_recode_7_16(k, v);
69601 
69602         i = 146;
69603         XMEMCPY(rt, &t[v[i].i], sizeof(sp_point_1024));
69604         for (--i; i>=0; i--) {
69605             sp_1024_proj_point_dbl_n_16(rt, 7, tmp);
69606             XMEMCPY(p, &t[v[i].i], sizeof(sp_point_1024));
69607             sp_1024_mont_sub_16(negy, p1024_mod, p->y, p1024_mod);
69608             sp_1024_norm_16(negy);
69609             sp_1024_cond_copy_16(p->y, negy, (sp_digit)0 - v[i].neg);
69610             sp_1024_proj_point_add_16(rt, rt, p, tmp);
69611         }
69612 
69613         if (map != 0) {
69614             sp_1024_map_16(r, rt, tmp);
69615         }
69616         else {
69617             XMEMCPY(r, rt, sizeof(sp_point_1024));
69618         }
69619     }
69620 
69621 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69622     if (t != NULL)
69623         XFREE(t, heap, DYNAMIC_TYPE_ECC);
69624     if (tmp != NULL)
69625         XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
69626 #endif
69627 
69628     return err;
69629 }
69630 
69631 /* A table entry for pre-computed points. */
69632 typedef struct sp_table_entry_1024 {
69633     sp_digit x[16];
69634     sp_digit y[16];
69635 } sp_table_entry_1024;
69636 
69637 #ifdef FP_ECC
69638 #endif /* FP_ECC */
69639 /* Add two Montgomery form projective points. The second point has a q value of
69640  * one.
69641  * Only the first point can be the same pointer as the result point.
69642  *
69643  * r  Result of addition.
69644  * p  First point to add.
69645  * q  Second point to add.
69646  * t  Temporary ordinate data.
69647  */
sp_1024_proj_point_add_qz1_16(sp_point_1024 * r,const sp_point_1024 * p,const sp_point_1024 * q,sp_digit * t)69648 static void sp_1024_proj_point_add_qz1_16(sp_point_1024* r, const sp_point_1024* p,
69649         const sp_point_1024* q, sp_digit* t)
69650 {
69651     const sp_point_1024* ap[2];
69652     sp_point_1024* rp[2];
69653     sp_digit* t1 = t;
69654     sp_digit* t2 = t + 2*16;
69655     sp_digit* t3 = t + 4*16;
69656     sp_digit* t4 = t + 6*16;
69657     sp_digit* t5 = t + 8*16;
69658     sp_digit* x;
69659     sp_digit* y;
69660     sp_digit* z;
69661     int i;
69662 
69663     /* Check double */
69664     (void)sp_1024_mont_sub_16(t1, p1024_mod, q->y, p1024_mod);
69665     sp_1024_norm_16(t1);
69666     if ((sp_1024_cmp_equal_16(p->x, q->x) & sp_1024_cmp_equal_16(p->z, q->z) &
69667         (sp_1024_cmp_equal_16(p->y, q->y) | sp_1024_cmp_equal_16(p->y, t1))) != 0) {
69668         sp_1024_proj_point_dbl_16(r, p, t);
69669     }
69670     else {
69671         rp[0] = r;
69672 
69673         /*lint allow cast to different type of pointer*/
69674         rp[1] = (sp_point_1024*)t; /*lint !e9087 !e740*/
69675         XMEMSET(rp[1], 0, sizeof(sp_point_1024));
69676         x = rp[p->infinity | q->infinity]->x;
69677         y = rp[p->infinity | q->infinity]->y;
69678         z = rp[p->infinity | q->infinity]->z;
69679 
69680         ap[0] = p;
69681         ap[1] = q;
69682         for (i=0; i<16; i++) {
69683             r->x[i] = ap[p->infinity]->x[i];
69684         }
69685         for (i=0; i<16; i++) {
69686             r->y[i] = ap[p->infinity]->y[i];
69687         }
69688         for (i=0; i<16; i++) {
69689             r->z[i] = ap[p->infinity]->z[i];
69690         }
69691         r->infinity = ap[p->infinity]->infinity;
69692 
69693         /* U2 = X2*Z1^2 */
69694         sp_1024_mont_sqr_16(t2, z, p1024_mod, p1024_mp_mod);
69695         sp_1024_mont_mul_16(t4, t2, z, p1024_mod, p1024_mp_mod);
69696         sp_1024_mont_mul_16(t2, t2, q->x, p1024_mod, p1024_mp_mod);
69697         /* S2 = Y2*Z1^3 */
69698         sp_1024_mont_mul_16(t4, t4, q->y, p1024_mod, p1024_mp_mod);
69699         /* H = U2 - X1 */
69700         sp_1024_mont_sub_16(t2, t2, x, p1024_mod);
69701         /* R = S2 - Y1 */
69702         sp_1024_mont_sub_16(t4, t4, y, p1024_mod);
69703         /* Z3 = H*Z1 */
69704         sp_1024_mont_mul_16(z, z, t2, p1024_mod, p1024_mp_mod);
69705         /* X3 = R^2 - H^3 - 2*X1*H^2 */
69706         sp_1024_mont_sqr_16(t1, t4, p1024_mod, p1024_mp_mod);
69707         sp_1024_mont_sqr_16(t5, t2, p1024_mod, p1024_mp_mod);
69708         sp_1024_mont_mul_16(t3, x, t5, p1024_mod, p1024_mp_mod);
69709         sp_1024_mont_mul_16(t5, t5, t2, p1024_mod, p1024_mp_mod);
69710         sp_1024_mont_sub_16(x, t1, t5, p1024_mod);
69711         sp_1024_mont_dbl_16(t1, t3, p1024_mod);
69712         sp_1024_mont_sub_16(x, x, t1, p1024_mod);
69713         /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
69714         sp_1024_mont_sub_16(t3, t3, x, p1024_mod);
69715         sp_1024_mont_mul_16(t3, t3, t4, p1024_mod, p1024_mp_mod);
69716         sp_1024_mont_mul_16(t5, t5, y, p1024_mod, p1024_mp_mod);
69717         sp_1024_mont_sub_16(y, t3, t5, p1024_mod);
69718     }
69719 }
69720 
69721 #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
69722 /* Convert the projective point to affine.
69723  * Ordinates are in Montgomery form.
69724  *
69725  * a  Point to convert.
69726  * t  Temporary data.
69727  */
sp_1024_proj_to_affine_16(sp_point_1024 * a,sp_digit * t)69728 static void sp_1024_proj_to_affine_16(sp_point_1024* a, sp_digit* t)
69729 {
69730     sp_digit* t1 = t;
69731     sp_digit* t2 = t + 2 * 16;
69732     sp_digit* tmp = t + 4 * 16;
69733 
69734     sp_1024_mont_inv_16(t1, a->z, tmp);
69735 
69736     sp_1024_mont_sqr_16(t2, t1, p1024_mod, p1024_mp_mod);
69737     sp_1024_mont_mul_16(t1, t2, t1, p1024_mod, p1024_mp_mod);
69738 
69739     sp_1024_mont_mul_16(a->x, a->x, t2, p1024_mod, p1024_mp_mod);
69740     sp_1024_mont_mul_16(a->y, a->y, t1, p1024_mod, p1024_mp_mod);
69741     XMEMCPY(a->z, p1024_norm_mod, sizeof(p1024_norm_mod));
69742 }
69743 
69744 /* Generate the pre-computed table of points for the base point.
69745  *
69746  * width = 8
69747  * 256 entries
69748  * 128 bits between
69749  *
69750  * a      The base point.
69751  * table  Place to store generated point data.
69752  * tmp    Temporary data.
69753  * heap  Heap to use for allocation.
69754  */
sp_1024_gen_stripe_table_16(const sp_point_1024 * a,sp_table_entry_1024 * table,sp_digit * tmp,void * heap)69755 static int sp_1024_gen_stripe_table_16(const sp_point_1024* a,
69756         sp_table_entry_1024* table, sp_digit* tmp, void* heap)
69757 {
69758 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69759     sp_point_1024* t = NULL;
69760 #else
69761     sp_point_1024 t[3];
69762 #endif
69763     sp_point_1024* s1 = NULL;
69764     sp_point_1024* s2 = NULL;
69765     int i;
69766     int j;
69767     int err = MP_OKAY;
69768 
69769     (void)heap;
69770 
69771 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69772     t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
69773                                      DYNAMIC_TYPE_ECC);
69774     if (t == NULL)
69775         err = MEMORY_E;
69776 #endif
69777 
69778     if (err == MP_OKAY) {
69779         s1 = t + 1;
69780         s2 = t + 2;
69781 
69782         err = sp_1024_mod_mul_norm_16(t->x, a->x, p1024_mod);
69783     }
69784     if (err == MP_OKAY) {
69785         err = sp_1024_mod_mul_norm_16(t->y, a->y, p1024_mod);
69786     }
69787     if (err == MP_OKAY) {
69788         err = sp_1024_mod_mul_norm_16(t->z, a->z, p1024_mod);
69789     }
69790     if (err == MP_OKAY) {
69791         t->infinity = 0;
69792         sp_1024_proj_to_affine_16(t, tmp);
69793 
69794         XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
69795         s1->infinity = 0;
69796         XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
69797         s2->infinity = 0;
69798 
69799         /* table[0] = {0, 0, infinity} */
69800         XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
69801         /* table[1] = Affine version of 'a' in Montgomery form */
69802         XMEMCPY(table[1].x, t->x, sizeof(table->x));
69803         XMEMCPY(table[1].y, t->y, sizeof(table->y));
69804 
69805         for (i=1; i<8; i++) {
69806             sp_1024_proj_point_dbl_n_16(t, 128, tmp);
69807             sp_1024_proj_to_affine_16(t, tmp);
69808             XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
69809             XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
69810         }
69811 
69812         for (i=1; i<8; i++) {
69813             XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
69814             XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
69815             for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
69816                 XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
69817                 XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
69818                 sp_1024_proj_point_add_qz1_16(t, s1, s2, tmp);
69819                 sp_1024_proj_to_affine_16(t, tmp);
69820                 XMEMCPY(table[j].x, t->x, sizeof(table->x));
69821                 XMEMCPY(table[j].y, t->y, sizeof(table->y));
69822             }
69823         }
69824     }
69825 
69826 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69827     if (t != NULL)
69828         XFREE(t, heap, DYNAMIC_TYPE_ECC);
69829 #endif
69830 
69831     return err;
69832 }
69833 
69834 #endif /* FP_ECC | !WOLFSSL_SP_SMALL */
69835 /* Multiply the point by the scalar and return the result.
69836  * If map is true then convert result to affine coordinates.
69837  *
69838  * Stripe implementation.
69839  * Pre-generated: 2^0, 2^128, ...
69840  * Pre-generated: products of all combinations of above.
69841  * 8 doubles and adds (with qz=1)
69842  *
69843  * r      Resulting point.
69844  * k      Scalar to multiply by.
69845  * table  Pre-computed table.
69846  * map    Indicates whether to convert result to affine.
69847  * ct     Constant time required.
69848  * heap   Heap to use for allocation.
69849  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
69850  */
sp_1024_ecc_mulmod_stripe_16(sp_point_1024 * r,const sp_point_1024 * g,const sp_table_entry_1024 * table,const sp_digit * k,int map,int ct,void * heap)69851 static int sp_1024_ecc_mulmod_stripe_16(sp_point_1024* r, const sp_point_1024* g,
69852         const sp_table_entry_1024* table, const sp_digit* k, int map,
69853         int ct, void* heap)
69854 {
69855 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69856     sp_point_1024* rt = NULL;
69857     sp_digit* t = NULL;
69858 #else
69859     sp_point_1024 rt[2];
69860     sp_digit t[2 * 16 * 5];
69861 #endif
69862     sp_point_1024* p = NULL;
69863     int i;
69864     int j;
69865     int y;
69866     int x;
69867     int err = MP_OKAY;
69868 
69869     (void)g;
69870     /* Constant time used for cache attack resistance implementation. */
69871     (void)ct;
69872     (void)heap;
69873 
69874 
69875 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69876     rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
69877                                       DYNAMIC_TYPE_ECC);
69878     if (rt == NULL)
69879         err = MEMORY_E;
69880     if (err == MP_OKAY) {
69881         t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 16 * 5, heap,
69882                                DYNAMIC_TYPE_ECC);
69883         if (t == NULL)
69884             err = MEMORY_E;
69885     }
69886 #endif
69887 
69888     if (err == MP_OKAY) {
69889         p = rt + 1;
69890 
69891         XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
69892         XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
69893 
69894         y = 0;
69895         x = 127;
69896         for (j=0; j<8; j++) {
69897             y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
69898             x += 128;
69899         }
69900         XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
69901         XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
69902         rt->infinity = !y;
69903         for (i=126; i>=0; i--) {
69904             y = 0;
69905             x = i;
69906             for (j=0; j<8; j++) {
69907                 y |= (int)(((k[x / 64] >> (x % 64)) & 1) << j);
69908                 x += 128;
69909             }
69910 
69911             sp_1024_proj_point_dbl_16(rt, rt, t);
69912             XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
69913             XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
69914             p->infinity = !y;
69915             sp_1024_proj_point_add_qz1_16(rt, rt, p, t);
69916         }
69917 
69918         if (map != 0) {
69919             sp_1024_map_16(r, rt, t);
69920         }
69921         else {
69922             XMEMCPY(r, rt, sizeof(sp_point_1024));
69923         }
69924     }
69925 
69926 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
69927     if (t != NULL)
69928         XFREE(t, heap, DYNAMIC_TYPE_ECC);
69929     if (rt != NULL)
69930         XFREE(rt, heap, DYNAMIC_TYPE_ECC);
69931 #endif
69932 
69933     return err;
69934 }
69935 
69936 #ifdef FP_ECC
69937 #ifndef FP_ENTRIES
69938     #define FP_ENTRIES 16
69939 #endif
69940 
69941 /* Cache entry - holds precomputation tables for a point. */
69942 typedef struct sp_cache_1024_t {
69943     /* X ordinate of point that table was generated from. */
69944     sp_digit x[16];
69945     /* Y ordinate of point that table was generated from. */
69946     sp_digit y[16];
69947     /* Precomputation table for point. */
69948     sp_table_entry_1024 table[256];
69949     /* Count of entries in table. */
69950     uint32_t cnt;
69951     /* Point and table set in entry. */
69952     int set;
69953 } sp_cache_1024_t;
69954 
69955 /* Cache of tables. */
69956 static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
69957 /* Index of last entry in cache. */
69958 static THREAD_LS_T int sp_cache_1024_last = -1;
69959 /* Cache has been initialized. */
69960 static THREAD_LS_T int sp_cache_1024_inited = 0;
69961 
69962 #ifndef HAVE_THREAD_LS
69963     static volatile int initCacheMutex_1024 = 0;
69964     static wolfSSL_Mutex sp_cache_1024_lock;
69965 #endif
69966 
69967 /* Get the cache entry for the point.
69968  *
69969  * g      [in]   Point scalar multipling.
69970  * cache  [out]  Cache table to use.
69971  */
sp_ecc_get_cache_1024(const sp_point_1024 * g,sp_cache_1024_t ** cache)69972 static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
69973 {
69974     int i;
69975     int j;
69976     uint32_t least;
69977 
69978     if (sp_cache_1024_inited == 0) {
69979         for (i=0; i<FP_ENTRIES; i++) {
69980             sp_cache_1024[i].set = 0;
69981         }
69982         sp_cache_1024_inited = 1;
69983     }
69984 
69985     /* Compare point with those in cache. */
69986     for (i=0; i<FP_ENTRIES; i++) {
69987         if (!sp_cache_1024[i].set)
69988             continue;
69989 
69990         if (sp_1024_cmp_equal_16(g->x, sp_cache_1024[i].x) &
69991                            sp_1024_cmp_equal_16(g->y, sp_cache_1024[i].y)) {
69992             sp_cache_1024[i].cnt++;
69993             break;
69994         }
69995     }
69996 
69997     /* No match. */
69998     if (i == FP_ENTRIES) {
69999         /* Find empty entry. */
70000         i = (sp_cache_1024_last + 1) % FP_ENTRIES;
70001         for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
70002             if (!sp_cache_1024[i].set) {
70003                 break;
70004             }
70005         }
70006 
70007         /* Evict least used. */
70008         if (i == sp_cache_1024_last) {
70009             least = sp_cache_1024[0].cnt;
70010             for (j=1; j<FP_ENTRIES; j++) {
70011                 if (sp_cache_1024[j].cnt < least) {
70012                     i = j;
70013                     least = sp_cache_1024[i].cnt;
70014                 }
70015             }
70016         }
70017 
70018         XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
70019         XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
70020         sp_cache_1024[i].set = 1;
70021         sp_cache_1024[i].cnt = 1;
70022     }
70023 
70024     *cache = &sp_cache_1024[i];
70025     sp_cache_1024_last = i;
70026 }
70027 #endif /* FP_ECC */
70028 
70029 /* Multiply the base point of P1024 by the scalar and return the result.
70030  * If map is true then convert result to affine coordinates.
70031  *
70032  * r     Resulting point.
70033  * g     Point to multiply.
70034  * k     Scalar to multiply by.
70035  * map   Indicates whether to convert result to affine.
70036  * ct    Constant time required.
70037  * heap  Heap to use for allocation.
70038  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
70039  */
sp_1024_ecc_mulmod_16(sp_point_1024 * r,const sp_point_1024 * g,const sp_digit * k,int map,int ct,void * heap)70040 static int sp_1024_ecc_mulmod_16(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
70041         int map, int ct, void* heap)
70042 {
70043 #ifndef FP_ECC
70044     return sp_1024_ecc_mulmod_win_add_sub_16(r, g, k, map, ct, heap);
70045 #else
70046     sp_digit tmp[2 * 16 * 5];
70047     sp_cache_1024_t* cache;
70048     int err = MP_OKAY;
70049 
70050 #ifndef HAVE_THREAD_LS
70051     if (initCacheMutex_1024 == 0) {
70052          wc_InitMutex(&sp_cache_1024_lock);
70053          initCacheMutex_1024 = 1;
70054     }
70055     if (wc_LockMutex(&sp_cache_1024_lock) != 0)
70056        err = BAD_MUTEX_E;
70057 #endif /* HAVE_THREAD_LS */
70058 
70059     if (err == MP_OKAY) {
70060         sp_ecc_get_cache_1024(g, &cache);
70061         if (cache->cnt == 2)
70062             sp_1024_gen_stripe_table_16(g, cache->table, tmp, heap);
70063 
70064 #ifndef HAVE_THREAD_LS
70065         wc_UnLockMutex(&sp_cache_1024_lock);
70066 #endif /* HAVE_THREAD_LS */
70067 
70068         if (cache->cnt < 2) {
70069             err = sp_1024_ecc_mulmod_win_add_sub_16(r, g, k, map, ct, heap);
70070         }
70071         else {
70072             err = sp_1024_ecc_mulmod_stripe_16(r, g, cache->table, k,
70073                     map, ct, heap);
70074         }
70075     }
70076 
70077     return err;
70078 #endif
70079 }
70080 
70081 /* Multiply the point by the scalar and return the result.
70082  * If map is true then convert result to affine coordinates.
70083  *
70084  * km    Scalar to multiply by.
70085  * p     Point to multiply.
70086  * r     Resulting point.
70087  * map   Indicates whether to convert result to affine.
70088  * heap  Heap to use for allocation.
70089  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
70090  */
sp_ecc_mulmod_1024(const mp_int * km,const ecc_point * gm,ecc_point * r,int map,void * heap)70091 int sp_ecc_mulmod_1024(const mp_int* km, const ecc_point* gm, ecc_point* r,
70092         int map, void* heap)
70093 {
70094 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
70095     sp_point_1024* point = NULL;
70096     sp_digit* k = NULL;
70097 #else
70098     sp_point_1024 point[1];
70099     sp_digit k[16];
70100 #endif
70101     int err = MP_OKAY;
70102 
70103 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
70104     point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
70105                                          DYNAMIC_TYPE_ECC);
70106     if (point == NULL)
70107         err = MEMORY_E;
70108     if (err == MP_OKAY) {
70109         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16, heap,
70110                                DYNAMIC_TYPE_ECC);
70111         if (k == NULL)
70112             err = MEMORY_E;
70113     }
70114 #endif
70115 
70116     if (err == MP_OKAY) {
70117         sp_1024_from_mp(k, 16, km);
70118         sp_1024_point_from_ecc_point_16(point, gm);
70119 
70120             err = sp_1024_ecc_mulmod_16(point, point, k, map, 1, heap);
70121     }
70122     if (err == MP_OKAY) {
70123         err = sp_1024_point_to_ecc_point_16(point, r);
70124     }
70125 
70126 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
70127     if (k != NULL)
70128         XFREE(k, heap, DYNAMIC_TYPE_ECC);
70129     if (point != NULL)
70130         XFREE(point, heap, DYNAMIC_TYPE_ECC);
70131 #endif
70132 
70133     return err;
70134 }
70135 
70136 /* Striping precomputation table.
70137  * 8 points combined into a table of 256 points.
70138  * Distance of 128 between points.
70139  */
70140 static const sp_table_entry_1024 p1024_table[256] = {
70141     /* 0 */
70142     { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70143         0x00, 0x00, 0x00, 0x00 },
70144       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70145         0x00, 0x00, 0x00, 0x00 } },
70146     /* 1 */
70147     { { 0xbf9c7ec6e0162bc2L,0xddecc6e310a89289L,0x5d599df09e499d81L,
70148         0x9a96ea286d358218L,0x01aec7d370c5f8dbL,0xe72e49958cf5d066L,
70149         0xc2e7297d3e91d7f8L,0x8621db92da9f2f5aL,0x4b26c8675a5679edL,
70150         0x233385df2c56aac1L,0xb88e74d4c6a13f99L,0x1214b173ffa8ec11L,
70151         0xa0386a271f3f9fefL,0xbd9b1b4ec0e7b44eL,0xafe528dceecd3496L,
70152         0x8dfff96a1c49f80bL },
70153       { 0xb4a4753ac03c0c83L,0x68e69d18abcdcd75L,0xe3839b88f775b649L,
70154         0x803f949abf58f352L,0x5f702679bd0bc15cL,0x85bf5d168ff298c2L,
70155         0x3f6ebd98c6c7976eL,0x20618af445e3e1b4L,0x67d5598e54e64093L,
70156         0xb047283b504fed9eL,0x450cabfd70d87517L,0x47d628bf3f5addbeL,
70157         0x0037ef3078cb4ccaL,0x4e148d3c6b1c4908L,0xe256d3294fcfd837L,
70158         0x2aa1207bde3c01f3L } },
70159     /* 2 */
70160     { { 0xa95b6dae01900955L,0xa5dc9cc1ceb4656dL,0x50c78907e72fe95bL,
70161         0xa1ae5447a040c334L,0x911913707952ea6eL,0x54ff73436d097305L,
70162         0xa4db0074bda4d10fL,0xfd5306f191644070L,0x14b9fe738b24522cL,
70163         0x1468dad67849f762L,0x87b29a18b0dcd2e4L,0xadd7f1a15e1ad492L,
70164         0x9ac63a81dbba2a1aL,0x01379c5b81223379L,0xf402b2f0b0e53bc8L,
70165         0x8c3eb27f0bf13b61L },
70166       { 0x9a4ad3e1e513696fL,0x0350ba5c18c81ffaL,0x1e2fc1363c033d13L,
70167         0x53da6e7117a531bcL,0x42ec64901aed610dL,0xd33e8df7e99ff567L,
70168         0xe4aad73e3deed12aL,0xd983b465180f4debL,0x99365269502f30b4L,
70169         0x7e2799aba8918d7fL,0x0ffe84b6700fc79aL,0x7b4400d640bfd8c2L,
70170         0xc3a21d215d2641bdL,0x79839442c32621cbL,0xace6500bb1401e83L,
70171         0x7bf4163e251c4310L } },
70172     /* 3 */
70173     { { 0x1c174f88e3fd589eL,0xdb501790df974a03L,0xd09623e33e70549fL,
70174         0x8d091eff15924f34L,0xeef79cadf9b65ac5L,0xd2cc42623f69c2cfL,
70175         0x817d903252cd82bcL,0xacf4f4d9a5f1ddddL,0xd06126355011b6bdL,
70176         0x9f74490d2ed140c9L,0x64092e8c4db686d2L,0x225eef16776b0fccL,
70177         0x0e8c01e9df16aeb6L,0x6283674184bbd82aL,0x757574e28956e337L,
70178         0x9871edc6705a7f07L },
70179       { 0xbd0b76d5776535f7L,0x5214d6022635b3b8L,0xc0c25ad99d216f64L,
70180         0xfd4df3a75515bf75L,0x24a625bc5e9f1675L,0x3c35efb7406873e7L,
70181         0xef5c9a33bb2e5c4aL,0xa971b35e806b198aL,0x9f5c0ca5a3c690edL,
70182         0xa8d5dd898e1e2341L,0x4cecbcce955ad9e4L,0x2ecf4407248d3416L,
70183         0x1abb381145c0af6eL,0x3f4bee821c780fffL,0xd14df768c272ed57L,
70184         0x397ed10a371637adL } },
70185     /* 4 */
70186     { { 0xcf3e0bb2755c2a27L,0xd38e42f959585c44L,0x46b13e0f19285e60L,
70187         0xc3ecd0c076273d0fL,0x7800f085193c569aL,0xf04e74ab4351818aL,
70188         0x9258aa388496363bL,0x8456617cb8c894feL,0x8bc62aaa2af969a0L,
70189         0x66c2280b5a4668d9L,0xbc9df58ea992f4faL,0x5db0b7d93f401e99L,
70190         0xe0614fe1c4c38c0eL,0xd531151c2ccdf6b3L,0x1c7575ece143b618L,
70191         0x40247985df9398a4L },
70192       { 0xfba251788f055746L,0xc5ba00400ab1e6e0L,0xe1b194fbac292697L,
70193         0x771521195b4f4740L,0x250091d09bb7ba54L,0x7a674861b9a139a4L,
70194         0xba8413b3f353aa7eL,0xafe771922443ceeeL,0x14468d363847bbd0L,
70195         0x61f79ff63da4942dL,0x1563a1c1d425b456L,0x3c270fcd75ff4630L,
70196         0x42072090eb2802c9L,0x68f0cdcbc85c7004L,0xca4372fbfa032e74L,
70197         0x1a6fd1e6c8b79d80L } },
70198     /* 5 */
70199     { { 0x967a901a8d5116a3L,0x0b844394b2f5f47fL,0xe39ad45260ebaf3bL,
70200         0x1e1be61760ccfc0cL,0xac07e3d2cc3f53f2L,0xdd838e0e1ed11bb6L,
70201         0x454753071c15b0c2L,0x70dd4748920fe5b8L,0x1a20be2de471896dL,
70202         0x3c3fad8a59276c7cL,0x026a1cc3c886ee07L,0x9fdb6f376e831ac4L,
70203         0x26a35d1aac501d65L,0x0ae9890540da8574L,0x65dde0a4abd734e5L,
70204         0x29b7d4dc15614750L },
70205       { 0x44b3c2cbcbf4e20bL,0x1c3f548f58cc44c5L,0x39809b545b0cac1fL,
70206         0x0c0f02b500f80621L,0xe612b890066905e0L,0x8f158ed78350188cL,
70207         0xc01dc4583f5576b2L,0x29803272a45492e0L,0x77a5623a0ff92443L,
70208         0xd12a2b0029d0dc41L,0xb41254592780e87aL,0x1ebcf9030d53f272L,
70209         0xbae6ea4024301e8dL,0x1e5f3f2fa37d0798L,0x9342c31022b4126cL,
70210         0x5d0928025382497eL } },
70211     /* 6 */
70212     { { 0x583a2b7eff2f780dL,0x34d26820d7d76b1dL,0xe3c3284786f74aecL,
70213         0x0fd4221210823febL,0x227e417efb5e7bf4L,0x510d49b6a568f8cdL,
70214         0x53bce7d61781bbecL,0x9cfe3f222f3718b7L,0x7f44e89fd9de6c1fL,
70215         0xf1cc553f3fac9b55L,0x9d2d0846e6f300bcL,0x976c82a29f0ae6b1L,
70216         0xe63dbf5e24b8bbe0L,0x4cac7f45973a5aa7L,0xc6eb623784dd33c7L,
70217         0x0a26e434142fee5dL },
70218       { 0x8081339facaa9a08L,0x40f311055246ece1L,0x892c817061393747L,
70219         0x8d8d4103242f02e1L,0x482bfd203b5de98aL,0x89ef946b5abbe952L,
70220         0xb8d218b937698249L,0xd5268e8966617c7aL,0x962e75518b7d2b91L,
70221         0x2c5c7973fe8d67c3L,0x42e3150a2b017c51L,0x6f4e5ebcc1a29469L,
70222         0xa39910ce531c7083L,0xaf4f6eb4b77b9e50L,0x68cbb175da120ad0L,
70223         0x19497c61b92636ecL } },
70224     /* 7 */
70225     { { 0x6920b0c6417659a8L,0xc77ab9c792cb28ffL,0x55b67180b687797fL,
70226         0x4caf58c1e7759363L,0x5155bdb65561b186L,0x2e64e355780f4946L,
70227         0xeb0ac9b7229a8b20L,0x88594d782571bd60L,0x5dcc0939e3fa78f9L,
70228         0x7b8b48302ac2d379L,0x505fbf60b90f1444L,0xac610e813ce4b3c1L,
70229         0x39a4f27ad59b5c18L,0x5fa339737cea0222L,0xe578730b8dff1c7bL,
70230         0x96b91b8b517bf7a6L },
70231       { 0xc1a991f49aac087cL,0xce62f74e6cfdb28dL,0x08d6ff9a5f7600d6L,
70232         0xd781cd04f917f9c9L,0x7796f5f63de52dbfL,0xe7db64e02ed72180L,
70233         0x0f0876f66fa4137dL,0x3271ee643ca1f716L,0xcb9b20587c4ab8a3L,
70234         0xcba1710739481047L,0xdf9a190d598c5c37L,0x0cb6e72a6f20e125L,
70235         0xa3142204f4f2902dL,0x42d28cb97ce2dcfbL,0xdf261b8aa3d3c351L,
70236         0x73f3d315cffc249dL } },
70237     /* 8 */
70238     { { 0x5d86855be6fd3673L,0x309b70af9d214b7bL,0x8d332f90dcc46cd3L,
70239         0xe553c015595510deL,0x5746a09638c1251cL,0xcd7cea5b85cc1bc9L,
70240         0x4ffa1468002eba8fL,0x10a3cb7022fcd77cL,0xb6999dfbc4ea05e3L,
70241         0x3375a0d04efa756eL,0x4d90279edced5fd8L,0x48192403251fd56eL,
70242         0xe87633a482a4c5f1L,0x3170d1301b34105bL,0x93998b0f7247e578L,
70243         0x88934f64436ba1faL },
70244       { 0xf09f43b04713eabcL,0x4ca7dd91accdc517L,0x27daa63bef13ca7cL,
70245         0x8b2e5a7a2588184bL,0x0a8cb612d95dc269L,0x346975a2e1f2f14cL,
70246         0x1f29b8ede172935cL,0xc3cbfd6ed40bc1e3L,0xd3f46b3f132623daL,
70247         0xc115be6dfb0b7681L,0x5e31c34556da4344L,0xa7c63f18a8e43d98L,
70248         0x55cb20834bddb4eaL,0xb16a0c384a54f58cL,0x74eacca246fd69d9L,
70249         0x0d1898bb153548e1L } },
70250     /* 9 */
70251     { { 0x4ea73461e35ef043L,0x107b67d93496b564L,0xd62c173bd0f83a3cL,
70252         0xfad4b03851d29c35L,0x3f42882a71b1c1a4L,0x5d2bcf6654b43b9eL,
70253         0xc77b15aa2abdf543L,0x5cb38a80dabe3dc1L,0x15fda0aea481673bL,
70254         0x86996b4de7b90ebeL,0x84f87e252bc8f3d8L,0xaded03d637c4e424L,
70255         0xe5ede666d7a7afd8L,0x80dd95a2a1ccb93aL,0xa55cfd2546fba391L,
70256         0x2bdab1dc46f82e60L },
70257       { 0x7a4de22bfa6fed61L,0xca458aa5cc8dd94eL,0x3e372df1071222f5L,
70258         0x06a4b44fe5aff377L,0xbc2d0ba74a738e6dL,0x1a470e1d5f31f136L,
70259         0x77ff933ae102a911L,0x8b380a50310c7885L,0x9f3c0228783fc5acL,
70260         0xec66892544725d06L,0x878f0e165ac84221L,0x9a3af1afcfda6e8aL,
70261         0x0183ed3778cd2abaL,0x32cdbd60826d0eaeL,0xb3234661cbee6415L,
70262         0x353eb892b9c10120L } },
70263     /* 10 */
70264     { { 0xc8fdcad610b5521eL,0x1a11b44052e702f0L,0x6302680d8ffda49cL,
70265         0xcdb9654acbf36badL,0x7b58ce114c10a2d7L,0x1e5d1f7de630e7e0L,
70266         0x8cbe3d7d6760a813L,0xeb35866b6480d77fL,0x58728cf37f036219L,
70267         0xdd5865ed42a8a757L,0x283f1f1d906a2870L,0x79e23fa4a51f906bL,
70268         0xf2ac6e83543b20a8L,0x4f0b6379b81e7754L,0x57fbc0d4840016eeL,
70269         0x8da20771e621b67dL },
70270       { 0x3c855004ecce65ecL,0x76d10d1fb748185eL,0x64be7bca78797ad2L,
70271         0x43444db077e54aadL,0x17b6b0c9be0df0ffL,0x8fc4256c055086a4L,
70272         0xf952c43bfd74d5a3L,0x501e005a01c4edb8L,0xd5172dfc4a57e328L,
70273         0xdb40ce4e535d6ee3L,0xbaef1e5c0c650918L,0xe85145e7857561fcL,
70274         0xe468536a34a224c6L,0x69a8e2270ec0e0a2L,0xb3f52247242b03fcL,
70275         0x862f55e2c3bebd5fL } },
70276     /* 11 */
70277     { { 0x2d6a390f226049feL,0xcc92a578dcbbc9fbL,0xa52feca497634fb7L,
70278         0x2b340cb63dea5893L,0xa39f338a2a49e916L,0x26b2df3d949e41f3L,
70279         0xc71c7cdb065a7e40L,0x4a9b84a0468281a2L,0x63eeb503731eeecaL,
70280         0xe6d0913476cbb725L,0x0cf979a9b94a678cL,0xb44d8c3b808fd9f1L,
70281         0xe60da613e0afc5b9L,0x52dce7de3ea5be69L,0x3a5d6864dc1ee74fL,
70282         0x71ab28913bc80790L },
70283       { 0xcf618fc43b5b60adL,0x0afb5e304a0c3184L,0xd22381ccbc403302L,
70284         0x33cf8953db1c0c66L,0x9c994e4da6112a8dL,0xd7aae2c3d1967a86L,
70285         0xc28d54935b7acd29L,0x8075bd136c9a57fbL,0xc9c0373e9c8427f9L,
70286         0x2cbca18d193225f5L,0x73777d13442c018cL,0xebe5ed47fbb3a727L,
70287         0x70437d491962dc18L,0xf39c1e092dc08806L,0x03e9c6f715fff35cL,
70288         0x8d087bb65e360a65L } },
70289     /* 12 */
70290     { { 0xbe2123023fdc1844L,0x6eca27ef105eac56L,0x2183a606f168a348L,
70291         0x295f807de1d7a4cbL,0x7246a6327ef5d43eL,0xae143205c77025c7L,
70292         0x4bdfc7caf3484e3eL,0xec939895df52c075L,0x82e655f6d7a9cac0L,
70293         0x985dfe208baeddb0L,0x79c817e4527de731L,0x30ce0fbc313de1eaL,
70294         0x9df95b89cc4f6cbbL,0xf2aedf1ef5bb20cdL,0xfc1e0a891a8cfb01L,
70295         0x225ed34a63edb7ecL },
70296       { 0x3e13154dbabb1a85L,0xd3d8dae71e6a565aL,0xd3217d56ab4b100fL,
70297         0xd44d934eebc78e1aL,0x0215321b48e73d37L,0xbbc90bfa201e43cbL,
70298         0x3c23f1d027500905L,0x2a2e5000c86691a1L,0x08b2bad26065841cL,
70299         0x15d41caf30026b60L,0x1712c2f45276ce61L,0x01c4c3e715932ffbL,
70300         0x7894e13d6a74caf2L,0x02d6f5df0c0537a4L,0xa8fb7602c2b1c97eL,
70301         0x612b60e5d0887c7bL } },
70302     /* 13 */
70303     { { 0xefd495cfba245d6bL,0x5cf0cbb7a2ce3ff6L,0x24da2ac0dff5feeeL,
70304         0x90c914f8cf28c6a3L,0x72fdb50d4308a56bL,0x03dbf77913d72034L,
70305         0xcfa5ec91822ac9e9L,0x0dde73c83aea3e81L,0x545ba96266289139L,
70306         0xa52f648bca6acbd3L,0xff6f276e98a0683aL,0x2536d3aca378ed52L,
70307         0x353c2c54885ac1d9L,0xcaff52da00bc84a7L,0x3971f81c37684167L,
70308         0x0f7334e1d2d7986eL },
70309       { 0xafbb5c836596067eL,0x33e54e1938c19806L,0x8285d96739cb0dccL,
70310         0x2b53f43d424035f9L,0x38c531f8dfef9095L,0x90fbe8e4db0f571aL,
70311         0x9a0c1ed2a39ca787L,0x2fecc1d6606f2620L,0x9dc890b172b7cb4aL,
70312         0xc33ca6fbccbb7868L,0xd1b11082fe73ee49L,0x590b7d17fcb66c48L,
70313         0x9356b0a686e14573L,0x75d682c4053ead85L,0xb2ae55fac54d30fbL,
70314         0x67636a72f8aee949L } },
70315     /* 14 */
70316     { { 0x638063bcb91d6beaL,0xae263a2e923ecb96L,0x9d7b0992c627aca6L,
70317         0xc6ed001a77af9e7eL,0x9214accf24aafebbL,0xa3564b9678055a90L,
70318         0x00999b1ce027499dL,0xe413a4e1e46a06a5L,0xa05d13f62e51efe7L,
70319         0x35e87d349ba843beL,0x0a6338253183159eL,0x6023e8ba54601923L,
70320         0x9b107721b7fd1cf2L,0x46b5542bfdf2fd53L,0xb314f4f81c18af38L,
70321         0x086f987660ac8965L },
70322       { 0x767019548cbb9850L,0x6210b730a20d2c8cL,0x4084d0575335670cL,
70323         0x3ecdc5950324baeaL,0x607fc5f2c76ee9b4L,0xf393d00f440ffa64L,
70324         0xe01117962dc1463cL,0xf00b82519c7725e7L,0x35e607365bd1d186L,
70325         0xf3d8554c2cf72aacL,0xb4dd0fdeefa3497dL,0xd712268cf646ad11L,
70326         0x07c20afb9f7b8eadL,0x630969d4fc06dfe5L,0x76b7df1c7245549aL,
70327         0x681f9403e61ae810L } },
70328     /* 15 */
70329     { { 0x7cad5163c9a0623bL,0xdbf8295767fab8d4L,0x2ccab0ec81af7c7cL,
70330         0x469e38c8e966d5c2L,0x34430d52f0d4e41cL,0x426075a2a52b359cL,
70331         0x242dd3e333bd0127L,0xcda3f6359fed2341L,0x4df33730d7d52ffaL,
70332         0x5fff56f07640c3efL,0x4783c21c1bbde57cL,0xd8784a2aeb8bb336L,
70333         0x1ec7c533ead08405L,0x4b7f1423f9b62bd4L,0x5543145c7075d4afL,
70334         0x0c9de94aba60590aL },
70335       { 0x8ed7273595d5682bL,0x711c42832ec276edL,0xd1f4aed58b36a0d2L,
70336         0x62ab40c48498a88fL,0x58c8fc624480f451L,0x8bc8ca4bb79cffe2L,
70337         0x90ab583c701a359dL,0xaee31a733fd5d15dL,0x02a5597bc912333cL,
70338         0x1019cae4b6c3e3c2L,0xe513042c29938088L,0x0e00283df47c8199L,
70339         0x90d68e58f2a00e92L,0x69e2df41a775ae3bL,0xb8d2eca5871c30b2L,
70340         0x733dca0ebb1de396L } },
70341     /* 16 */
70342     { { 0xf5b495d04b59213aL,0xca6720398d70200eL,0x4bcb09a62b6771c1L,
70343         0x26adeed42b9eb0cbL,0xeb5447548cdba212L,0x0e1abfcdf08890d1L,
70344         0x52509963698e46b4L,0xe1bff0b082e9c138L,0xa189e4cd51099a71L,
70345         0x2360c9bcc9b91cc7L,0x9bd4d7dc137ec4beL,0xd0356521d1519f6eL,
70346         0xbf5f6d78cf832503L,0xe43010318deea2b4L,0xc3132494ef4c319cL,
70347         0x2ab3bd470f1fa7d7L },
70348       { 0x5753b680922c9fbbL,0x869e7dc80f16c6d1L,0x83445135bac16efcL,
70349         0x4326a3b4846d1d9bL,0xb517fee3b2d62c21L,0x6905afa20b292ad5L,
70350         0x2a57131a2cadac13L,0xcd904d8febdbca8dL,0xdfeda86f3f365fb2L,
70351         0x7097b208dc7eaa1cL,0x89a35a84a45e77c0L,0x417a062ccf5d118eL,
70352         0x3c0c04a81f6e99e8L,0xc44704b0ba7a087dL,0x6f8a27d13ea22ad2L,
70353         0x93a4b4164c27d229L } },
70354     /* 17 */
70355     { { 0xd4271bc11f1efb7aL,0xae4e68e633fccc0dL,0x9d9bc8f1b11f50a8L,
70356         0x5430398faf076089L,0x45e242fb443d0e03L,0x73ec2519f6e3d4c1L,
70357         0xab70f790ba9bad09L,0xde612ad5f9add10fL,0xb837e54e14e942b4L,
70358         0x175a56d3ddb8b68aL,0xe85b233c1ac2a408L,0xf8ff6c30f0c80f94L,
70359         0x4b7f3fb7898db4f9L,0xa2c6044f45a7dcddL,0xf3abb2f6fe3d3895L,
70360         0x342ce0d732ee7763L },
70361       { 0xeb261394cf491b1fL,0xdcaaeed71909e395L,0xdcc4055a9fe4dbeaL,
70362         0x17a6611d493d604dL,0xba445a3a1ce5ebefL,0xe82e2858e3989cb5L,
70363         0xb96f428283f58406L,0x99877b99a156cf55L,0xaf906a664e166a0eL,
70364         0xcea1d353b2976d13L,0xefc16f2736c61a01L,0xdb04c433b0f55d86L,
70365         0x3cb4b2698eb34c01L,0x38d07f782ae60280L,0x43ac3bcb43be3ec5L,
70366         0x455f4af3e156fd20L } },
70367     /* 18 */
70368     { { 0xc057f262754ec21cL,0x3eacd4c9e3a1ba38L,0x3a0210d1116c1fe9L,
70369         0xe4ea4e94eacc8ab6L,0x31c00c9aea6f32caL,0x5cb6239d86b975ceL,
70370         0x654d5d8ca14ea1e9L,0x230d31f45067fc8bL,0x48bb90cb6355fecbL,
70371         0x78f81ecedc172e8eL,0x288380a8cb006737L,0x19b02e01e162d012L,
70372         0x0e087a06c5af145cL,0xf04dc8b7b72dc354L,0xf70ef2148de3c066L,
70373         0x4f14824313009fb7L },
70374       { 0x5e004fce6e2055e2L,0x89e247ea86c32067L,0x4ebcbd955f9daaa2L,
70375         0xd15f212fceb7f63bL,0x5ecc5c1f863784a0L,0x53b3800b75760251L,
70376         0xeb9301c38a6a2954L,0x0f16ba18a13cdd19L,0x8313d251887c2d24L,
70377         0xf99235859a9413f6L,0x423405e6fe3fd7c5L,0x678aeb3416e0ee05L,
70378         0x1f3be7bb3fadaab0L,0x7901fa2c82884471L,0xc950db304d662ff6L,
70379         0x74d5d2d43c01170bL } },
70380     /* 19 */
70381     { { 0xa3002dc02b5bfe11L,0x0733410d52d321e7L,0x15920f659679ba89L,
70382         0x0e248c14685b236eL,0x8cfab594346f6040L,0x9f57afb740c717f0L,
70383         0x0dbab28c66044576L,0x0fa099689cdc3247L,0x41e02ae2c230ed05L,
70384         0x0d961554e45bef74L,0x9688a982ce4d7b6fL,0xfadefac75e62d22eL,
70385         0xaf1512a6bd2cba28L,0x78868e62be7c749fL,0x88048d81ae9f5a6bL,
70386         0x6b1a5442c5857a29L },
70387       { 0x9f5ab9ad43242066L,0x0afef1b52ccca2aeL,0xb1b43ec7988edc4eL,
70388         0x0d0c00f10341b0d5L,0x4d68b8f7b50aab37L,0x9a8e4e6ff3a64a99L,
70389         0x198338fb7f1a684eL,0x8bc0e748351a0f5cL,0x2cacf2cddac44515L,
70390         0xc14d39995e9ff76bL,0x54a01b3f16393055L,0x6ac3eea5888d8376L,
70391         0xb84d9a9a723277b1L,0x99132691e11dbbbfL,0x597717aeabb67178L,
70392         0x4c2135268bb14ac8L } },
70393     /* 20 */
70394     { { 0x2e6fe0a695532833L,0xabca228ed626d067L,0x22aef3d9649e73bdL,
70395         0x2083a87af03c4c0cL,0xe954e75d35169b45L,0x577509ee74506a89L,
70396         0x49cb276e2aeacf90L,0x08275d77fa409f91L,0x61eb6f3df0bbd6b9L,
70397         0x948202cbe4132704L,0x35f3fc21b1c498b1L,0x76c68ba8361fee59L,
70398         0xa18cbbd950e051f3L,0x2384a879318e7042L,0x292abead80dd1e8bL,
70399         0x65713c295c37c334L },
70400       { 0xdccca8e9ceb77b9aL,0x2f97e72723b69469L,0xc76abee6a01d6b28L,
70401         0x3925203d5abecdfeL,0x8944808229290d70L,0xf9931424b0314438L,
70402         0x04209df17cd447c3L,0x7c6f2059c855c827L,0xd97d786256c0e069L,
70403         0x5a9db6fe412d94c4L,0x19a64591994c41ddL,0x12348aa1c89e21a3L,
70404         0xd6904b50c6a03f0eL,0x55c15156a616feacL,0x4e36d1b57cc7693bL,
70405         0x6b0e996c3bae3c38L } },
70406     /* 21 */
70407     { { 0x32789fabcceced00L,0x3237e71ae5b7aa66L,0x87b2e2692ddebcdfL,
70408         0xb7245120b61dad8fL,0xe11e5e48d35f803cL,0xfb4df5d798e50f0dL,
70409         0x60ee68b4bcd2ab92L,0x98ab2f5c1ce3363dL,0x15ba39da7cd42647L,
70410         0x1a6572eb83f4fb3fL,0x0f77de88e56f08dbL,0x1743761e172562c2L,
70411         0xbe349ff88a58f0f4L,0xe04da71b84d1d6e2L,0x368f03429e9ff3b4L,
70412         0x4022a205678223f8L },
70413       { 0x527bbd0583847375L,0x3ae56b623f451af0L,0x6198f24d4b2c7f18L,
70414         0xee323f5b4525b98dL,0xa9d8d39a0e0884b5L,0xd005d7f6fb12c776L,
70415         0xd71c483e708bc154L,0x8ca6fd28742541bcL,0x0af3dccdf8397ddbL,
70416         0xb80d31253eccf243L,0xc743a10858d81b8dL,0x3f48eb2171391f68L,
70417         0x493aff8833bb657fL,0x1d15ed6607e47e31L,0x10159b11e08279f6L,
70418         0x312179cb24a6a956L } },
70419     /* 22 */
70420     { { 0xa94cc3ca07615ac2L,0x85865e64121ad581L,0xae47616fa7986b79L,
70421         0x395a40eb9d5e0f1dL,0xa91432643d9457eaL,0x8de6d6a3fa2865d9L,
70422         0x0771db961014ae8cL,0x77a7cce6976a87cbL,0xa7de42e1143a0f60L,
70423         0xe203cc09d993d934L,0x9201869398ec4c3dL,0xd77546d83a25df4bL,
70424         0x0ad9eb4762b02d6bL,0xfaaaf208d05a7189L,0x5238181f431221bbL,
70425         0x417d6c78733511eaL },
70426       { 0x3cbd81b70e91e9a8L,0x73340418c370d6b3L,0x825db10a8eaa2373L,
70427         0x8f2b09e46c7d6756L,0xe288ee9b94c33dedL,0xcd8426bb1695e3fbL,
70428         0xa6176c86dce9e888L,0x3f4c89226165e362L,0x514e411f6063fb09L,
70429         0x6907ac20c8f9e04cL,0xcef7469cdfd2ad61L,0xba30bae48452199aL,
70430         0x3068129312ac3462L,0x011be873c92d482dL,0xff4cbf89e8330995L,
70431         0x02189d52d1470a0aL } },
70432     /* 23 */
70433     { { 0x73e419dd92599c69L,0x5b94221b7fec32caL,0xb2bf9bd209bbfbfdL,
70434         0x61ea97a463ed895bL,0x6609146b3f486f79L,0xbd1c7a05fd141a39L,
70435         0xc79ec8cf83d64135L,0x7f8fd42f9883507bL,0xafcb53b717b3d027L,
70436         0x86658dcd67ca5a21L,0xa6a6c0accd149786L,0x16f3d70e34b95067L,
70437         0x371208e3df44958cL,0xd2dd64e6ec280212L,0x33b2c4ab30782c71L,
70438         0x7bbf8abd521176faL },
70439       { 0xbe9e4aafa78b981aL,0x788b4e36304ec828L,0x0c45cf393959dea3L,
70440         0x70a9bdd3240b39c7L,0x499cd7dd28383b7dL,0x30690b2e307a1026L,
70441         0x2262d598ee92f1b3L,0xc62d77deb4725a48L,0xa16f25bc7bc3aa0eL,
70442         0x62dd8b65d15ef7faL,0xd979221d0b96d68fL,0xb92885c3a00f1906L,
70443         0xfa476b9beb74c740L,0x217ddbb5c7576222L,0xc2782c305788504fL,
70444         0x860d096cf812716bL } },
70445     /* 24 */
70446     { { 0xfebc337d4d79bbf9L,0x5d53eab869f74f80L,0xff36a09533104d53L,
70447         0x2ab820da196f8b97L,0x961d3d1f75ce6909L,0xb197ec0404683754L,
70448         0xa68ce1bf93a6cb9bL,0x503456ffc5f021a3L,0xb50a2db18940ffdbL,
70449         0x77c50f8fef004209L,0xd635d17704965875L,0x725766d98bb8770aL,
70450         0x8e19b028a078e53eL,0x364d4ccaf9fc8378L,0x1a3df411f0dd39a0L,
70451         0x7e80e44203adf920L },
70452       { 0x4b5f8a57539a1ddfL,0xd248e7aeee486562L,0x1c7b491d816021e1L,
70453         0x2e7b871bfd36d2c4L,0xda38b5040aec00d9L,0xf28276126193f1b3L,
70454         0x69c3fe86fb1f78d6L,0x56c8b786e827ac33L,0x1687f6c73487c8f7L,
70455         0xab8f221719dee5bcL,0x04e8473fff399418L,0xf384c014a9027c80L,
70456         0x9967be9aaa1d2e28L,0x869686d3e065eef1L,0x737c6b08c7bd837cL,
70457         0x5dcab5d19e8bd863L } },
70458     /* 25 */
70459     { { 0x0784283a9a7d772bL,0x6b49e525e540959bL,0x546bb00886414ab5L,
70460         0xd44481629d74b2a9L,0x267890ad203b0b1bL,0x1e7a82bcc8d3f86bL,
70461         0x1352bfb5d85a83c7L,0xf29f16e3fad07ccfL,0xc02a63b841e0c43fL,
70462         0x904f22c56b379fefL,0x19d8a653b1244f26L,0x6635b6df3a28bdeaL,
70463         0x18b68851f6d455ceL,0x74ac28189cff3735L,0xad40f9df8b2cbdabL,
70464         0x08cc2d9eadc9d498L },
70465       { 0x2e6a6866c170c84bL,0xbb989e8b5a49a484L,0x7b0e00e0d04c8992L,
70466         0x55ad347861b3a423L,0x3c952450b0d01899L,0xe3922155e3100cb3L,
70467         0x19265b6ef03276d0L,0x0fe8595a76d42b53L,0x0a96dee0fc6353b6L,
70468         0x761e0dc8246f893eL,0x4ec902bef0a74cbaL,0x610086843fdfad9bL,
70469         0x5d6a60e44fdb6975L,0x3f53aac87ef7590aL,0xd29e6be012870a37L,
70470         0x991fadc155aa55b0L } },
70471     /* 26 */
70472     { { 0x82bc4b0fb4844ffeL,0x7392271460f8b871L,0x8ac000e24ce3f1f3L,
70473         0xf0d548b4163519ecL,0x7aaf842b88288b5fL,0x9e8b0c4c2bdc9a70L,
70474         0xa06d51524ba5fd67L,0xd0b1afa0f93cdec3L,0x280955badf89f8f0L,
70475         0x86cbe92deea32c92L,0x0cae3f993fe05be4L,0xf2607095fa6919aaL,
70476         0x0f54741e6e0f1b8bL,0x2aed1f7430ecf988L,0x9296f76b734991d7L,
70477         0x66cf8d28259f0fe9L },
70478       { 0x9b01905b226f5868L,0xc102e88c16909e9eL,0x2bd089164a37eb54L,
70479         0xf72253e8c9816323L,0x37f84e9d86bac53cL,0x2e352454afeaaaf7L,
70480         0x67c86f772ca0046eL,0x86bce50e6663372eL,0xf6a3a960b6950a04L,
70481         0x61f994d7fc1aba93L,0x1957c12bc1326e6eL,0x9b658fe42e56b005L,
70482         0x9cd297fc8592740cL,0x7654ce9b177f26a5L,0xaaa699dba79d2ebbL,
70483         0x5fca0c5a0ecb6448L } },
70484     /* 27 */
70485     { { 0xe26e25f3569a6663L,0x09597ee7e6aa4ca7L,0x25a4cda68d18b80cL,
70486         0x450602b522926730L,0x9af5f65007387209L,0xfeeedb3426733a53L,
70487         0x0f5ce76886572951L,0x872a360b8398ae9aL,0x60347a802b30f6c3L,
70488         0xd2113b231a162158L,0x6fd9cf92ee6c6decL,0x85f0a5a85cbcf9e6L,
70489         0xd7a5a6e42ba3fe84L,0xaafe672051ecd727L,0xe09c6bb2a2081a10L,
70490         0x657acbf0b973b0b4L },
70491       { 0x3130466fc274c8d4L,0x4276517630a994d1L,0x217258ca7079435fL,
70492         0x44850406eb897a06L,0xf38dfeee561ee130L,0x11f4facfaa1778bbL,
70493         0x765c6617b9abb9e9L,0xb135499bd8f10932L,0xc0eb6337a73b9159L,
70494         0xf2c1ccf16f7e8b6aL,0x5b32c03a187def53L,0x89ad1d49830b9c62L,
70495         0x1735eae32f10e538L,0xb1cbd9c29d5f55bcL,0x42428c47e539db0dL,
70496         0x3d2da412c852b3bbL } },
70497     /* 28 */
70498     { { 0x97702b6e871f2865L,0x56cb639f142920d6L,0x328522a045b58611L,
70499         0xf3943ad1f3b13812L,0xe6c2200a712206e8L,0xc2890e5aa34d59eaL,
70500         0xab52fd40f6b7f759L,0xf522c8de180bf567L,0x181e97b2accee396L,
70501         0xe0375819c4ea5cbbL,0x0d9985e8ab51d3efL,0xe26c96cabcb50fd8L,
70502         0xfb9d6b1397e1c80dL,0x582b1814f796357dL,0x89a7822107f4c7fbL,
70503         0x02aeef2dc0357e61L },
70504       { 0x2ba7926f2c7ec9beL,0x292f307e7258b201L,0x74e62a10c6fa6b4aL,
70505         0x80c08549e2bcc5abL,0xb4160db87bb8c073L,0xd5ef0529329f194dL,
70506         0x0eb8da146dda4a9cL,0x0b5d43d215ea23d1L,0x6cebef02fc34bfaeL,
70507         0xacd364d0848757a7L,0xc14013682d34cca3L,0x09ca67421d2d95e2L,
70508         0xc3fd1d6e786eaa28L,0x9eb1136da2965fecL,0x48871baac0779203L,
70509         0x6b446c014b15aeb0L } },
70510     /* 29 */
70511     { { 0xc819eb2e25e8fe80L,0x2b5f790698238a17L,0xd6f1e99681e41849L,
70512         0x58ad8ad698ea6d45L,0x5bae5ad4bfd02e40L,0x016dc327a812416dL,
70513         0x8b31a985a3347ca1L,0x0b4da61082a65391L,0x1cb91b2db48c35fbL,
70514         0x9e96817cd2aaf8c4L,0x1a630483cdfdcdc0L,0x7055936112b69254L,
70515         0x5fdcd712f8a2a097L,0x59ab623a35cc5281L,0x30c8ebe0932b6095L,
70516         0x8613424bb08e052fL },
70517       { 0x28902063b2231d8aL,0xb0f62329d9a61667L,0xaafa0fe7071a9f27L,
70518         0x6bcd8960603f047eL,0x118cca76fd92a1c3L,0x3414e62b71d483b6L,
70519         0xa123ccddba705262L,0x1a576437fd9b5c5aL,0xa5301bc24c8d0fa3L,
70520         0x96f0ad44102427cdL,0x0e6fb5e0d3aa6c02L,0xcd8c4880072a3996L,
70521         0x4dafca12840d3fadL,0x29f4ca3dde91d541L,0x0037c5988441734dL,
70522         0x86333a999ccfe57cL } },
70523     /* 30 */
70524     { { 0xd213a751ecf53b40L,0xcff2c6f22f78a542L,0x0f59f0e2f13ae56dL,
70525         0x91f8ccbf0e61748eL,0x0aadecb9d72c4145L,0x6b2ed8524c9cdcb7L,
70526         0x8e00b72c1eaffc70L,0x89b24285aa728102L,0xaa7ea7e0b679cafaL,
70527         0x5d2b8c264f0a6f6fL,0x7ed7b1730e804397L,0x5a93eb45c8573049L,
70528         0xc92bf5d40986e93eL,0x526b5a9c6a20c0afL,0x0adf47c9b99dc3afL,
70529         0x12b25fe2ba202cc9L },
70530       { 0x09b8d78a33eea395L,0xc7a93618f633fc5cL,0x7e821629270eceefL,
70531         0x524779b8c628ed0cL,0x91db5ca1a1d68939L,0x8626e18e586edc90L,
70532         0xfe023e8bfeb3f3bfL,0x6279fde10250171cL,0xe52ec7dc55e172deL,
70533         0x445e8695c6d4ca45L,0x42de3878bdbc10f1L,0x2b114de86fc3835eL,
70534         0x9faba4567e10b652L,0x4111d82a390e78feL,0x576b61c2aedf0acaL,
70535         0x216279a974accb74L } },
70536     /* 31 */
70537     { { 0xc14cdabf4047f747L,0x03ca233dc1315a1eL,0x59e7cbd340e5d0a7L,
70538         0x1fd0c4e9bb413869L,0x189d08b10f01fbd8L,0x50449c42a76b823dL,
70539         0x81c224a1398b00a1L,0x08084e4f8e8179e4L,0xfd8af994698e41e9L,
70540         0x1e30e37c5610bf2eL,0x4e6a043fa7d2790fL,0x9d96e60cb3195388L,
70541         0xe75f986d03799dfdL,0x3b4a8f11f8ff902fL,0xfa9453787588416eL,
70542         0x20683e3f9827535eL },
70543       { 0xcb582e26d0378878L,0x9e214c23a7945787L,0x13d000bf8f6688b3L,
70544         0x7548d4f540515270L,0x7113c15d40111f5dL,0x3bf5a526a8bff902L,
70545         0xbda6b0109b4945ccL,0x83dcc74ebc2f3a05L,0x2aef628443efdfa1L,
70546         0xd2e60ee9565c5bf4L,0x4f0fa10d592f243aL,0x6ae58b321bc3bf51L,
70547         0x813b086860576a74L,0x0bc023f84d73081aL,0x9fd03aa032dcee59L,
70548         0x5e416bf527d6c795L } },
70549     /* 32 */
70550     { { 0x24313760026cc23cL,0xf819aaeeb5b29058L,0xa92272f8c5d2ee17L,
70551         0x8048e7cbee5cc402L,0xdbc7d6ee77def07dL,0x61d69244f6af821eL,
70552         0x5f7966ed996cbb89L,0xf81b17ea96a155a4L,0xb2d9ef7003f3ed56L,
70553         0x5e6e5906e882a5b2L,0x86fa1072ae947180L,0x34d9fc51658c76f4L,
70554         0x9f603dc0cb035aa0L,0xb7b39feb75be6481L,0xca87554acf04a9efL,
70555         0x4ff682ec87b4fde3L },
70556       { 0x3125627fd0a10ad5L,0x7fd45c72968e6f45L,0x2981bd6b806a1163L,
70557         0xb92de1cdde5033e3L,0x3b44b45ebf4f8988L,0xca1b9896dae7e1dcL,
70558         0x52166e5a0778d878L,0x82d472bea5116847L,0xfbdd382af2895445L,
70559         0x22ed16025d6ec4c9L,0x3614eb1cb6552b02L,0x63c5df73a1e6210fL,
70560         0xe9160285021a74a7L,0xa44ca400c65cbd4dL,0x48cb187e0f15e299L,
70561         0x51eb818e3402507cL } },
70562     /* 33 */
70563     { { 0x1fc1d178b92100abL,0xdf2e3d609605b839L,0x12a7c255b71e59d0L,
70564         0x3f8b667514fcbe04L,0x0e8a393559fd06afL,0x5632650212020d07L,
70565         0x6696fcd1528e7be5L,0x6588514b0c7b7654L,0x0cd80f8c5912a5b5L,
70566         0x8bafef04f324cb7fL,0x6b53eecfc6da3d75L,0xedef48d831d1df2fL,
70567         0xf336b96573812b6dL,0xc82eae4aee626031L,0x300abd32d244f09bL,
70568         0x8b0af95531d9647fL },
70569       { 0xb770180a2e603544L,0x2b573ac3221acd9eL,0x3a17f66562407032L,
70570         0xad3e74adb89abc3dL,0x8a3d2e3ad793225aL,0x457bba04ef02564bL,
70571         0x8875652ffc2dd2b5L,0xd2905d15e67143e8L,0x6d884b4202e48d70L,
70572         0x06f99219c7636a57L,0xa8dc342135e378dfL,0x95c1d73d10c64a02L,
70573         0xcd6a4ececc157a66L,0xbadcc1c88e24a354L,0x8024f1b29839329dL,
70574         0x5363e5494da48ad0L } },
70575     /* 34 */
70576     { { 0x1f5523b7e23fc641L,0xfe54e72f86667063L,0x294a15f58e009d2fL,
70577         0xf203997f8c57f5e1L,0xa229724cb16d64dcL,0x697be4fd4baa2ffbL,
70578         0x3f507e460a6e8ed6L,0x0afe3a5d78508536L,0xeeef6cdd95408208L,
70579         0x701fd889f2c4237cL,0x496d883a5c385253L,0xe25c67ed72a212f1L,
70580         0x4b4167831ff78fcdL,0xe9967004c16f4146L,0xfa45c3a1c45b0697L,
70581         0x633340183fbd30c3L },
70582       { 0x39c9a0cca2fbbbceL,0x876f6e5caa0cb744L,0x9ce6010e3438ece3L,
70583         0x0aad148e13802d82L,0x9c3e5c609cd45a1bL,0x875cb8597bcfc1e0L,
70584         0xb19ff790d8584dd0L,0x2598b81ed81c2a2bL,0x118bdf2f02be07e3L,
70585         0x074fc8eeb9765ce9L,0x125e9d88b24f95aeL,0x3bb12cdc0c98f09dL,
70586         0x4a6aee07a0b74b27L,0x4723d2f9c08077ceL,0x959447d6bea8026fL,
70587         0x93a7075c16280b73L } },
70588     /* 35 */
70589     { { 0x26bbefe2715b27f9L,0xa935a5e22a280923L,0x5ddf23affd58a26aL,
70590         0x54c83e167c138694L,0x44799bc9892a2153L,0x4e6e47109b8d09f5L,
70591         0xc63af616d588ea68L,0x5e896706883ab1b6L,0x3c1393a03d209336L,
70592         0xd02f292192c23ddaL,0xab70cb7adcf6ea43L,0x12434ea8791559e1L,
70593         0x040680db6d70ff0bL,0x1a10fe522832ba45L,0xd69f9c08e5f0cb8fL,
70594         0x1a7422ac44b141fdL },
70595       { 0xc3a9dd2e9f40b675L,0x2a7c6603fcc71f39L,0x18939a611948e342L,
70596         0x8f3b6158ed0ab484L,0xa3aa7d97ee31ca6bL,0xbc1e865ef7a8db63L,
70597         0x315f8c092c7c62e4L,0xa260788f9f5c6d0fL,0xb18331294b6f3ec5L,
70598         0x73adbcd636b4d849L,0x66e14890bc699a9bL,0xbf3790d82a1175e7L,
70599         0x7f43605afc53ca4fL,0x577f6c4787ff6091L,0x827c7552600c82b6L,
70600         0x0944d6309d25599cL } },
70601     /* 36 */
70602     { { 0xcfdeb63ee6ab9620L,0xdff4fa6d786cd808L,0x145edd82456320b3L,
70603         0x2ae5f862c4943915L,0x9508e813b73b3f87L,0x3bd805f3e52f97a9L,
70604         0xf71b5c28c9829b62L,0xb394c70e86e0cefcL,0x534fb1a923bdb36eL,
70605         0xd64f5862dbe27e5aL,0xbae23df383ab6169L,0xdd6df1b127c828cbL,
70606         0x1901899f3a307a8aL,0x36cc8659811ddf66L,0xa3cb777479943b77L,
70607         0x7d89f3836fd86576L },
70608       { 0xf8564242c9f92b2bL,0x700c6a75c46e32bdL,0x93e768b77f99a5c5L,
70609         0xb6efe85803149568L,0xbbfe8a19c2ce6709L,0x721a3b1bee6ec493L,
70610         0x26eeeea9c371c28dL,0xd798115e15177e1dL,0xd7bf3bceb068a5a5L,
70611         0xdf8da22046d2b4b2L,0x3df0995b59be9dfcL,0xc96897bc77640b79L,
70612         0xce0cf4c25a2bd3c5L,0x16f45d6e89afe744L,0xb53f3acb3a8509bbL,
70613         0x449af81f63f2a6e6L } },
70614     /* 37 */
70615     { { 0xc2fcf132a16d9377L,0x9ab377b37e1a2f9eL,0x72e1a12e86d19ae5L,
70616         0xd2b12e66d013bbb1L,0x0972e055cb5f66baL,0xd11de1c0399eab50L,
70617         0xc1f314fdc65f5ec2L,0xfc3118418a9ff593L,0xdf73c1ece05246e6L,
70618         0xc28d13631625056dL,0x30a9dbd76fb25e19L,0x049ed244845cd2d7L,
70619         0xc779b83fd36e852dL,0x85a35fc7f68c8a83L,0x299bf1e1c95e8033L,
70620         0x0e8617c320891af5L },
70621       { 0x5372060267c81b5cL,0x2fa89dcde737873cL,0x2a7430b0a8144fd0L,
70622         0x3006c5a726208c83L,0x4e066660d8ea40f5L,0x9dd025f9896413a4L,
70623         0xbdf380cc46b9149fL,0x801566190a125cc2L,0x04d6a3b752793c37L,
70624         0xb60013746b7a62f2L,0xa9cfe268585d5978L,0xdcad0cb88395fe66L,
70625         0xbab468fc46b261f6L,0xca0ef5ef9d9d9218L,0xc507d4a85e452402L,
70626         0x6f4404f1326cf687L } },
70627     /* 38 */
70628     { { 0xa3e1920b4febd3ffL,0xca6234d8fdfd2bbaL,0xb7d1af2ae19a9829L,
70629         0x23de1610c6f5bc20L,0xe204dbf3daa39ca9L,0x2a2de9b86d8c70abL,
70630         0x272e0c377c9d370bL,0x80914c06e565510eL,0xb611e7a857cbb6b0L,
70631         0x076fc6efd8266a6eL,0xdfac34ee3095801cL,0x69ff40a2b9e24063L,
70632         0xa7ba31a9787aa5c5L,0x0e4d1fdf33c70cd2L,0x903e31326895f074L,
70633         0x905771f87fb671e2L },
70634       { 0x5199ba0da4062beeL,0x18e7238c94d7d9f9L,0xf53f29bc1e0922c0L,
70635         0xde9b2a81b12d855fL,0x649f3eed6d68ca29L,0x64adfc34c50c097fL,
70636         0x81964ab99db398a0L,0x00d59c477a587224L,0x09fea39674c5903aL,
70637         0x6aafd8ee15043dd0L,0xc5721a6e5f1ecc20L,0xb6d6a4830db9b7b4L,
70638         0x06ffc61766c8d52aL,0x3de241d6acc82a27L,0x0605f05227f2f7a8L,
70639         0x6a22953b6404deccL } },
70640     /* 39 */
70641     { { 0x92452d8f74fce389L,0x059634c02afa5564L,0x9377ccbbf0ed7825L,
70642         0x89f4045b37718e0dL,0x11074e7d9fa69a4dL,0x5d70bb077295b0baL,
70643         0xb22d54adf107ede6L,0x5c39a3d8a1a29c7bL,0x37236c02d795e3abL,
70644         0xf7282d002b589951L,0x5e2265be5790bee2L,0x91e0ea11a8e65ea2L,
70645         0x0e71a7086001cebdL,0x16900f5a2c1c5402L,0xc3b2d5c0357f6981L,
70646         0x528c9ea0619e3427L },
70647       { 0x1edc86b45f26c577L,0xf80747089438bd45L,0x2dfe1013792582a7L,
70648         0xe08eaca0de1e569fL,0x5f952efa9a55a356L,0xa4d80b53e4976216L,
70649         0xd2b65855cd5d71f2L,0x246704bf66cea3f0L,0x193f641f492323caL,
70650         0xa681855c9adb1325L,0x86d522ce2d19d652L,0x53609f105b82ed7bL,
70651         0x3b0f00948e150d29L,0x23ad8bfb0b13e891L,0xcbb1556cf794b449L,
70652         0x200f9093738bcf57L } },
70653     /* 40 */
70654     { { 0xf9b22fc58388387fL,0xcf26f17028e883c5L,0x447cab90d1b7973cL,
70655         0x8d5d4ea2f6ec9171L,0x2e16f498c30cdbc0L,0xdc92910c48623c2bL,
70656         0xeb1491b030dbc545L,0x631deb2e14de21b0L,0x04a210662fe830f4L,
70657         0xa4c6979c379c1f3fL,0x8a732b68fb06a795L,0x3a44327a1619dfa9L,
70658         0x91a307d38dbe2c9bL,0x939bc8d203989feaL,0x3daabaf20f4a331fL,
70659         0x5c307e98dd0f55dcL },
70660       { 0xbbc4e0c435b233daL,0xe3d2908522f6f985L,0x99dd2d21a8b02468L,
70661         0x978f40e9a96916e7L,0x0327d86c614bccedL,0x95e95502b290762cL,
70662         0x0ffd2197a879f2edL,0xc436513750e0bd33L,0x26c3148a0827c4c4L,
70663         0xc79812a83fcfc0b2L,0xc3d8d17e31928589L,0x8b572cfe8830f42dL,
70664         0x7cd9ff924b07f83fL,0x331ca9500a51148fL,0xd0c539684c59f9acL,
70665         0x1df16dfac1434785L } },
70666     /* 41 */
70667     { { 0xcc7bb4ac68bcacc3L,0x06ded34f430f58cfL,0xc59f9f4fd461855aL,
70668         0xf549199445c9f0bcL,0xdc5f7ec64375c892L,0x1b8708f13c85983aL,
70669         0xb32a5cc482fcd087L,0xefdcdc352d6b4c0fL,0x4bb24f048ac6fb2dL,
70670         0x5982d4f533906471L,0x162eb52fb83a3ac4L,0x7130df282337a223L,
70671         0xdce7b802cbc3dbd3L,0x8b3959592467ac0eL,0x21d3d2e81b56717eL,
70672         0x729a7f5046512617L },
70673       { 0x874ed1aa8420f90aL,0x6368e19e0fe4c855L,0xb62d4aaab0be74afL,
70674         0x76fcc4808ca60ca9L,0xf310b5a57645a867L,0x131bac9bddb1b24cL,
70675         0xef77d71d2dea5b44L,0x4706d21072fcc64eL,0x29b92691673d77f0L,
70676         0x22e00bf3e89e0663L,0x472d0cd374077d40L,0x3e21040d829232e2L,
70677         0x2f916dfb38dc8533L,0x48bbb59b14b8f667L,0x19de9f4ad44be19dL,
70678         0x7f6d3649232d9d5cL } },
70679     /* 42 */
70680     { { 0x3bd064de6e794819L,0x5a6b694ef82ebda1L,0x1f017fe0b91e2804L,
70681         0x190d31f307a43cd2L,0x6c26f226630433e9L,0xba488aa70abfdcb4L,
70682         0x418d9085a46411c0L,0x1b934fe6bffb5880L,0x75d1e237e200f849L,
70683         0xdf04d63fa55413dbL,0xe216ed75e23b3f77L,0xa05866cb0f91bd30L,
70684         0x84c395d97729c509L,0xec97e188452ab2d7L,0x8cb7c1f90093d686L,
70685         0x2d032395628f086cL },
70686       { 0xa81c94074a44b4c5L,0xb9846879cc702c98L,0xcb502287ceb0dc97L,
70687         0x303011266e3aa321L,0xc0ac8763e4c256c2L,0x65034d20e55b4845L,
70688         0xaa96a040f240f35bL,0x046d26d37cf7eedcL,0x62a5a8e13b810656L,
70689         0x86044b9783d70c2bL,0x2fbaff8859e4da8fL,0x929d901a5457f5d1L,
70690         0xd29e1eb2b531b757L,0x214dabdc9e4e9739L,0x5bd724fc4eaa9bd9L,
70691         0x734c12b31ef9bb9bL } },
70692     /* 43 */
70693     { { 0x98fe3c2e92f9b086L,0x4641b93eb3fd4544L,0x47ce208b5c02c65cL,
70694         0x8a52dca1c4f03242L,0xb5ec17d9679d29f6L,0x11d2fed09406f5f4L,
70695         0x260f63dc0d9ba811L,0xde2b056f15472a3fL,0x1b170d9f007290e6L,
70696         0xa2e23e8db6b5c8f9L,0x345a2839cf34c3eeL,0x9bdc54611b973ee2L,
70697         0x65bda6c2bb24d1c5L,0x97d52ba33c6141a1L,0x47bb16129d2eb201L,
70698         0x7c558a8721fbe49fL },
70699       { 0xb9485a523f350fecL,0x016678c56a38d4c0L,0x8ef346a20d5aa64dL,
70700         0xb85daa02d96da2e4L,0x845ec4ea4f647b3cL,0xc0d1a6ca0d5e946cL,
70701         0x41d8d1c14fa9f4abL,0x43972cc59c8b1303L,0x67e1f48d434ffbfbL,
70702         0x350ce93a819d2318L,0x49f530906ddef23fL,0x3c2e6cf9200cf12cL,
70703         0x42691cc1640432fcL,0xbfff74b472496b52L,0x44527c9f020a97beL,
70704         0x34cd7dca7b3c4348L } },
70705     /* 44 */
70706     { { 0xf031761a59e7fe87L,0xb1eae31a0047cd72L,0x27902e68fae30f62L,
70707         0xa666f48db71db143L,0x75ee66780e0038f4L,0x3b45ac6702bdd76dL,
70708         0x0d2fb828a0d6cd5cL,0x27ce7f1d9d8c5b11L,0x141fe0e4120b5e96L,
70709         0x95a1b984b9267c37L,0x5206e589d60312cdL,0x1867342eda549356L,
70710         0x374520b9070c74acL,0x2703cbb59557b0b3L,0xf621f59ca6ed8c14L,
70711         0x7ceb1cc2abf7b887L },
70712       { 0x0647a5bbdb7fd65bL,0xd8d45cc036c9457cL,0xc6da99db9e12718aL,
70713         0xed1dbbf4e93a7fb1L,0x4512c95cbd1566a1L,0x4861ba00dbc0c919L,
70714         0x3c6cc2989e7f5269L,0x671961500941aaaeL,0xbfcf5d0fc8c538e3L,
70715         0xad6e9929a25a551fL,0x9071098517ca0f26L,0x743b78eafa89ef7eL,
70716         0x39d5ea3171ab4549L,0x7442f3f3e6d1c36dL,0x25a683e0059d568dL,
70717         0x1f629a99227ced5cL } },
70718     /* 45 */
70719     { { 0x8925ddace45a1c3eL,0x72d2936541f7545fL,0x45622fcb37e7f828L,
70720         0x882345133e4c79d2L,0x5dffaf849c2645d6L,0x3078f4dd994802b9L,
70721         0x566927f09d339fa0L,0x9a500a1e9fd91dccL,0xce0081800ab0abd7L,
70722         0xd97135a38194e5dfL,0x9e87630798adf088L,0x3baf01b89a45a2a7L,
70723         0x6fed6154788b4399L,0x980e5722e77a997dL,0xaac90ffa2a378eedL,
70724         0x4a75fda28bd805a2L },
70725       { 0xd09a8fbb55e74cbcL,0x737738cefab18f25L,0x0fc23ad69764ec3aL,
70726         0xc5a7d35be7e0ad31L,0xe75e068ee481cc9bL,0xf0c2ea993d4aec34L,
70727         0xf1324fe80d4a63c4L,0x5dbb7c1699b0592cL,0x442d674da7e0f46bL,
70728         0x5a5d66c7a300faeaL,0xe83dc8213333ac83L,0x70ef812e8c408496L,
70729         0x96e1dcb699ef5fc1L,0x6e2b771b1734e862L,0x04629cdc583507d8L,
70730         0x5819f9ae23d8179aL } },
70731     /* 46 */
70732     { { 0xd99691216aa78811L,0xf64ee8f42103e7c3L,0xddf0107022b9e698L,
70733         0xe6001f9e4f582cdeL,0x24a608af2ecfac1aL,0x6ef4c78406393009L,
70734         0x5262eae6ebf72911L,0xddbd0af58c4ee5a0L,0x875aff90ecd87bc7L,
70735         0x2fddb34c6f24f114L,0x48104281e865f172L,0x95692426886c1b9aL,
70736         0x6f5f32089ef4231fL,0xaf587acfd0a7e82eL,0xd65719179ac395c8L,
70737         0x7459603c1364a750L },
70738       { 0x1c2475bff41ae519L,0x34401fb14af8f251L,0x70ddfcd2aefb2c3dL,
70739         0x9b2d385b51cdaf08L,0x8531c2568208bb19L,0x16c89df64c33f3f6L,
70740         0xc23cfa9924571769L,0x2339b51e86d010baL,0x08db0e8d22638313L,
70741         0xf769e17900fedeb7L,0x3fd96dcba3687ef1L,0xcd046b2391476475L,
70742         0xf3ff20640c45c8ddL,0xefd167bdb8343d78L,0x493ccb6d4b77ee90L,
70743         0x33025513b3cf7b45L } },
70744     /* 47 */
70745     { { 0x36f0046935eaaca1L,0x0c384b7589119102L,0xcb375665e6d2954cL,
70746         0xcb9199b9b1e9d6d7L,0x75852349c29c2757L,0x89cbd1bab8e738d0L,
70747         0x9b8dbe905923a427L,0xa237793e18fe1889L,0xa4271757a742e083L,
70748         0x8c4979d24eebd613L,0x40325054d4f2cf77L,0xa3b8a091958705deL,
70749         0x1b191bd933d999baL,0xbafefba43b0fee1eL,0xb3bad1843facdf14L,
70750         0x9328adb04387561cL },
70751       { 0xabe84e80f906b872L,0x705523a078262665L,0xd89c6a7e3398ccf7L,
70752         0x2fab551df55b5323L,0xa0578eca0554dea8L,0xef26523d375589cdL,
70753         0xd8fd6242864ad750L,0x93f27fc5178fe1feL,0x7b3e6f309df87422L,
70754         0x2862e49e3750d054L,0x7d90c6b25dc038a1L,0xc1a1ae2284db682bL,
70755         0x47f3dab79881930aL,0x30e6bd52baf3e0a4L,0x0680025bf62d25c5L,
70756         0x0aa1f3cfadd0d5e7L } },
70757     /* 48 */
70758     { { 0xa982219022a10453L,0xdd1eb91c2a03a10bL,0xafbb5d9596646f3bL,
70759         0xa58de344f38b6fc6L,0xce47c3e5b8cfca1dL,0xfcd8e16d0f70da04L,
70760         0xac44349bda262ed6L,0x9320d87bc56e2f8eL,0x9ce3ea0819138e58L,
70761         0xa5862dffa2b236c0L,0x6b0f9a5c8e7efb0dL,0x4b53432b16ac78ebL,
70762         0x6ff43105709b51afL,0x08e236f88f519628L,0x1f93f176eed403adL,
70763         0x559337e09636545eL },
70764       { 0x30ddf738d8fd807aL,0xf4e0ec9dab131222L,0x14a2f4db625afbc3L,
70765         0xd5b706049f12f895L,0xb46f3c23ac3044fdL,0x1b232d1ff540148fL,
70766         0x61b458f539b4e554L,0xf694b24a0dd70b75L,0x0fc64299289581d9L,
70767         0xc05d49beee5fe22dL,0x7af3447f6a18bf63L,0xe96a1dc27f1929d6L,
70768         0x6afe6028c1551e8cL,0x27dacaf32b5d4fa2L,0x4a1631bc545c2cb4L,
70769         0x930070f9b0c914d3L } },
70770     /* 49 */
70771     { { 0xd2f32c5e69a9bc05L,0x0a5c19c6589c4b73L,0x095c9e5e94665f9cL,
70772         0x8ab0f293bcfb4c39L,0xb90708771ddb7c31L,0x894e965866b38048L,
70773         0xf19a90cf606bd9bdL,0xcc1d58dfb6fd2d69L,0x886dcc4e461d8a69L,
70774         0xc455c277f9ce4831L,0x749a5996765f8a82L,0x2ffc668cc3badc8dL,
70775         0x380183969112cdabL,0xa98795c3b243c7cbL,0x8775f310010a2224L,
70776         0x043a2141587b5e14L },
70777       { 0x7bbe9dbc3a873752L,0xee1493f42f442feeL,0x981ca2c8c18c2181L,
70778         0x00ce3090e29769e7L,0xb4626ac8de768c5fL,0x33e9ce4634d7677eL,
70779         0xf89c2cade0fa94e6L,0x04f5cc1141f5b5bfL,0x2565f7362228c12cL,
70780         0xf1bf706a0c05cce5L,0x5d07ffffbe487c4fL,0x3ec43c09a499f1a4L,
70781         0x4f4e79bb98d94800L,0x8a335a16073f12f8L,0x4bb5eaf70f970d6dL,
70782         0x18d0747bf24d0ae8L } },
70783     /* 50 */
70784     { { 0x58d3c77c84601fafL,0xc9465be2af1c1f72L,0xff626798d116d806L,
70785         0x3996c0c6d5b0d93cL,0x2fa1ad755ec6723aL,0x966a814403ba5349L,
70786         0xdc4c94222ac34d8aL,0xddf471deed675865L,0xd8aca597953d528fL,
70787         0xb2e463b524ebf67dL,0x258248717e25b4d3L,0x23c5adba43159daaL,
70788         0x5458f9c683357540L,0xcf685da7f938b1a6L,0x981a4fdacefed231L,
70789         0x711093ed08bb5e59L },
70790       { 0x12aa3fc6401f161aL,0xf7358560974c5e87L,0x4aa252fb17b5df82L,
70791         0xb0b82b07a48e6299L,0x0023415729dd847dL,0xf1e54d004529c5a6L,
70792         0xcc1c539e6d98f538L,0x36162b5328d3abcbL,0x75a379382a84f0cdL,
70793         0xf717a81b4dee7484L,0x16cf35fb4c23bf1bL,0x7fd1c29f787e8b3eL,
70794         0xb7da7e6859b79ab0L,0x072100a085f6c60bL,0x31840159e7ed48b5L,
70795         0x17898bda4d9c97d4L } },
70796     /* 51 */
70797     { { 0xcd8483d8ae1b8cf8L,0x323d4b42e9a28856L,0x7633584f204a4bc2L,
70798         0x4e0b2228ca7a69faL,0x8afbda8bf757bab2L,0x85b240886cc5f9caL,
70799         0x47fb4813d41a95c3L,0x3f1bc53cc2aabe6bL,0xf22cda3f1ad1599dL,
70800         0x1b2ec081c31ea9b1L,0x048f304b01614ac1L,0xce31cee9c6afa7abL,
70801         0x55af76334140dc3dL,0x84b7ab37dce8abbaL,0x50de7648c7cf3efeL,
70802         0x73a88dcf15356ab2L },
70803       { 0x3f86828806e83b39L,0x477a44139f44037dL,0xf9058b0f17dbc841L,
70804         0x2db64f4f54d17549L,0xa23cea6af2307ffeL,0x393efd554f126261L,
70805         0x2f4e658a10f37f26L,0xa4437ce3f4ee1e35L,0x64ef42a7a93cde8bL,
70806         0x1debc9f4939aa901L,0x44223d6a3d7b5cd4L,0x789a6a11f88a3accL,
70807         0x56fb9df82c608a2dL,0xe79db8e3bbf56c06L,0x73c56af2668fa300L,
70808         0x52f32b17ae396a1eL } },
70809     /* 52 */
70810     { { 0x56f524c1e714f71aL,0xc1be12629add8519L,0xad9189d865cadbe3L,
70811         0xd88bf5c85a0fb649L,0x9efa6a9221d192d9L,0xe3fe83896f724b6fL,
70812         0xec3fae24b250119cL,0x4b6af9f62ae0d3c0L,0x8fceba0bd619624dL,
70813         0x7dc3092b2fdb6e3aL,0xc91da3763263cd29L,0x30c0761ef95c43bdL,
70814         0x89136400cdeb44d9L,0xfd7dce8443c0d31dL,0x78fec3b19871899fL,
70815         0x79e14d28efdf58c1L },
70816       { 0xe38222359bb40c55L,0x0a27202d0ed07a42L,0x48e6c1a94838c1f4L,
70817         0x2b5f24a7d864a78eL,0x7e7f140a0c6c55c9L,0xe62c104ace12d508L,
70818         0x9b0a1a7ec11b1e10L,0xfd8a275fafbb3dd5L,0xdff354fe9a3b6b30L,
70819         0x5a105d9e46602a01L,0x3d371b4d93bb65f7L,0xda5cbf0b0f82fdebL,
70820         0x4601229bde468545L,0x505e10b9c73d517eL,0x77cfa541672ff492L,
70821         0x0d8ec28a99566ce2L } },
70822     /* 53 */
70823     { { 0x014cf73ecbeee995L,0xb2eb88bcd491e80cL,0x615a6cadd9aba5d4L,
70824         0x2f7d46339304c84dL,0xba0501d28ab03c9aL,0xc8f723de91babb94L,
70825         0xc885f97750405772L,0xb5e1d2b3c7fcb094L,0x61ee7995df96c71aL,
70826         0xb8c8daab3464499eL,0xdb425ddd5f607932L,0x70251ca1b1243587L,
70827         0x26d7d3be9fc74340L,0x8c179310c902ac89L,0x72522c154559a74fL,
70828         0x86001e27c3734afcL },
70829       { 0x13b00ba5e7693947L,0x6478641e012c062bL,0xe1a438e0e85490a8L,
70830         0x5173dbbfd9574d5eL,0x9532eb8c9bd3ba61L,0x1f41bcb85f3ea075L,
70831         0xac1cc2478cbb92b9L,0x0f34648e1ef901b4L,0xdd929d1ed2b3b2eeL,
70832         0x470f1eabc3d75bfcL,0x5cdbc6f7139cf4d2L,0xcd86454df0424953L,
70833         0x1e07981247fcb383L,0xb9f209b417df930cL,0x4225fc31114ebc00L,
70834         0x020591cb347946c1L } },
70835     /* 54 */
70836     { { 0xe3003721275e0af4L,0x721141efe78a4a4bL,0x666cfcf6d1757485L,
70837         0x5fa1d737168e659eL,0x263e3e540e2842eeL,0xadecc3d4948bd5f6L,
70838         0x019de03d246b104aL,0xf8a9e903f343d818L,0xcb57ba4a5b0c0d31L,
70839         0x8246c50651e2765fL,0x80c5751f6519bf67L,0x5f05c200f2119a01L,
70840         0x7e6487b87821d4f4L,0x262f94aa261c3a06L,0x56cfe48972146052L,
70841         0x5119985fa1df05efL },
70842       { 0x5819497db18586c0L,0x004415d6c6eeaa62L,0x7c6a46b697cda28bL,
70843         0x9a149b287c194594L,0xb56369fa4ed3a506L,0x7092aa6643c94cb4L,
70844         0x55bce73aa9e9eee2L,0x34bb287077893509L,0x8af95fb006eb5326L,
70845         0x87cd03239638f485L,0x293762685ba75bf8L,0xf32d6f3d9d42d581L,
70846         0xa4cad57465c6d64dL,0x985f50fbb2cded41L,0xcf34ce0e9006a067L,
70847         0x59eaf26558a57f9aL } },
70848     /* 55 */
70849     { { 0x7b407efb6ec3876fL,0x780c6123f0f48648L,0x2abb56ffbf893039L,
70850         0x9592eaa045a91ab0L,0xce5b84d778811b82L,0x86a71a341f9f3fc9L,
70851         0xc17fdd86f0e7e13bL,0x88ed8297655a0880L,0x75d6dc7481d5e666L,
70852         0xeffc9df61d171797L,0x36ad4c8de3f79e1fL,0xdb15317d2046192eL,
70853         0x78c9fa7a274fda62L,0x04ec924f82dd9914L,0x059d1e383a64971cL,
70854         0x3b4450ea2620bbfbL },
70855       { 0x3db7a955c776dcdbL,0x35c4a57c81c8ba47L,0xae285003505760fbL,
70856         0xe3e80691b3aec353L,0x380335be47117be5L,0xe1c47e3a056ccf61L,
70857         0x253cfdeb33977916L,0x3decdfbaf5cb7ee1L,0xf3c9794f7cf4b704L,
70858         0x2401680c9ff81462L,0x4e440e11be3daa9fL,0xc5d0437769f91d8aL,
70859         0x4106c7a8cb5e9c5dL,0x191909a133b7d24dL,0xe893c8383764b4a2L,
70860         0x4a7fe30cc429b614L } },
70861     /* 56 */
70862     { { 0xe78f3a702455c7c5L,0x5b7636e870157754L,0xf32c45247623262cL,
70863         0x2c98b11e1bc780c7L,0xd48eaeac915ed877L,0xbb04d3c0199265f4L,
70864         0x6b52b19bcfa5200fL,0xc46a098193ea3fe8L,0xd82c733dba758059L,
70865         0xd324bbd61896aaccL,0xac09a2fcce8ecd51L,0x529918fd02fc44b3L,
70866         0xf0c45e4aaaa1784bL,0x35626340fe22085cL,0x53cbb676c50c7d61L,
70867         0x83fa1ea365126b23L },
70868       { 0x60ac86da10ccc646L,0x2ce0637f7b0451e9L,0xbbbcf6308a088610L,
70869         0x23c1901920349982L,0x707fc39cfc0bcda0L,0x7f4d1f151bd4fd7dL,
70870         0xd6a64e7444713bbbL,0x57bdc676c5ac9e60L,0x456c530337b61169L,
70871         0xd3451396dcf40a1dL,0xf3edec254997d2c7L,0x534ae9a4c2c4a739L,
70872         0x1401397e6a6ad2e2L,0x20769d4d23e95f81L,0xcee007c6de98fabfL,
70873         0x61409779931c51e0L } },
70874     /* 57 */
70875     { { 0x3ddb32db15156623L,0x68137fbcab7a67c2L,0x26011f506f19e3c2L,
70876         0x34218b0289924c61L,0x492a0b0fc6804c1cL,0xd65be706afaae6a7L,
70877         0x3b13d23e0d01be61L,0x44545b47f87f4c69L,0xd42236e204dc1aa3L,
70878         0x6135261d3c5161ecL,0x1eb46a63bd88bc07L,0x78c6d8361599d720L,
70879         0xf6955fe169baf0f3L,0x467eebd617072820L,0x2f1b8a2a3e3a340aL,
70880         0x636dac762d0b5f88L },
70881       { 0x94280db9b4c80af3L,0x9a189cd14e3892abL,0x26e702e0d1477ddcL,
70882         0xe91aee3868f9f14fL,0x2864f63a80baa0b2L,0xacd81f738b714a29L,
70883         0x30e1b870c5fe7cb6L,0x883ea1c3b10837fdL,0x2da279536b20489fL,
70884         0x3aeb2a6858a2da5fL,0xe2330bf203a8fa14L,0xb5c488b5dc70b1c4L,
70885         0x0a78c4d9299678f4L,0x233bd09825df675cL,0x37b5c0767b67d368L,
70886         0x2f6dbdfe4d0bef3fL } },
70887     /* 58 */
70888     { { 0x2f8472fd2e4da7c7L,0x708cfc91ae677932L,0x364af08a3dc268e2L,
70889         0x0f10dfe0799a2424L,0xef912d5871d58bffL,0x6bf35dfc988962e6L,
70890         0x28b96fa95f47ea0aL,0x734a79eaaad308c1L,0x957303379f437bbaL,
70891         0x002cbd8e6cf54f75L,0x47606dcfe7632eecL,0x404b5ecb53193104L,
70892         0x0ae0897c0acf729dL,0x89628b863bddf1deL,0xeced154ef87d7448L,
70893         0x5cb6e197458d5d4eL },
70894       { 0x98cef197008c75edL,0x7cf49d3ef6eeaaf8L,0x1d6f9e021875e96dL,
70895         0xfcec2cfedd9b0d8aL,0x38a61cfeb9576daaL,0x10003f3936a7dbb8L,
70896         0xb37c386823b814f4L,0x9fb66dcbb80e3153L,0x9e7e2eba059847a8L,
70897         0xa4ec63fd35a72770L,0x311f3d91fc9e0ed0L,0x3c1dc094d515baa4L,
70898         0x75a06ebca08cd4e3L,0xab6172382ed5eeaaL,0x2e82bbb0e1f52c1fL,
70899         0x2149d6305175d6e5L } },
70900     /* 59 */
70901     { { 0xee1a8e6f5f9311f6L,0xc97e3c9fbabc1f85L,0x4fa7c52eb494209aL,
70902         0x04c2f51c19774fe1L,0x5cefd1228555844fL,0xb53862a3b5873ab3L,
70903         0x768efdd6cbed19fcL,0xcdc12479ee58469aL,0x11237e313d80c09cL,
70904         0xdd74a290c044c28cL,0x9ee6517abd47e287L,0xc2421228ad0ffeefL,
70905         0x4273088f818d281fL,0xebc744bc43ec0de1L,0x5b26eccfb415bd73L,
70906         0x14e2f350cb07c26cL },
70907       { 0x548d2a104216946bL,0x6e801f077a4bd92dL,0x5996d0a343695160L,
70908         0x0f1b5c2f63a197c9L,0x79da3c4f061f77c9L,0x1c1cd63493ff7b22L,
70909         0x5e61b650a234123fL,0x826b34c5f284033cL,0x718b90e8c2f34214L,
70910         0xa5f35620ae806ec5L,0xa2fae345e324a9b4L,0x8c0bb95e8b53cb51L,
70911         0xc94f6ac2f9965778L,0x07ec607d6b9def32L,0x63bf1dbad0ed8f27L,
70912         0x58537e02dcb61e4fL } },
70913     /* 60 */
70914     { { 0x1f64b06464f80ba2L,0xe8e055e70559a45bL,0xc3262b34f1f4b634L,
70915         0xef4f7d5fde8c8482L,0x9d55dea0c30c780aL,0x1740afb9cfa1e693L,
70916         0x2cfe6a667460c34bL,0xf66959411187c1eeL,0x1382f2775f974d94L,
70917         0x1ca0ace4004549ebL,0xf8244b3fbabded02L,0xc36f4d064e3653eaL,
70918         0xeab9f0dcc55c5f83L,0xd93b9cefacebce90L,0x16658e7219061425L,
70919         0x4857835f82d7970dL },
70920       { 0xdcd525bcd2576210L,0x9f378aa7d51b5443L,0xfe97bf171bd83994L,
70921         0x930d0f63f38ac621L,0xaf8f2c17818408ccL,0x2692c87e260f53f6L,
70922         0x0ee45407db0a75e4L,0x0ec47ae5ffdb1b37L,0x769129dc7aa6a44bL,
70923         0xb6f932b22e40b75dL,0xe06764d095ef3b77L,0x28fd47f568bc63e8L,
70924         0xd18104949c0014c0L,0x90e2d3fdd7995d8eL,0xeb39a05d6c2a85afL,
70925         0x6c0277bda21f3128L } },
70926     /* 61 */
70927     { { 0xe41b7086b509e7efL,0x8842ec7b3d7f9f91L,0xcd285f945526b88bL,
70928         0x6e44e064051dd0abL,0x90198c10774f1cebL,0x6ecabe98123e661bL,
70929         0x4481113632f647d9L,0x1dd82b4526c52aeeL,0xd650907f939dc9d5L,
70930         0xbd5eeef2fcd455bfL,0x7815a4dd8d2e5d7cL,0x5ad4ec9288bc9f2aL,
70931         0xc6f10d0b57a3b322L,0xe8d0c1e720b9cbdbL,0x5a0b071a9b774ee8L,
70932         0x3067bc9af22fcf8fL },
70933       { 0xe0e589f2b7ca9326L,0x17a106fdb1224f63L,0xb2354521747a57bdL,
70934         0x2614982d62b0882eL,0x7f3af5444391ffcfL,0x1aaa337ba84e440dL,
70935         0x28ea37b0941bb071L,0xa957dcb42e4a7f54L,0xe7ab662c1a6ad5fbL,
70936         0xd135e381f7c36a20L,0x42e7980c9baa0b6bL,0x4237030c94e4671fL,
70937         0x24cc63ff8b0922e3L,0xd10d5279445a589fL,0xbb99d316a870ff6cL,
70938         0x390c83caa996c195L } },
70939     /* 62 */
70940     { { 0x50d3fa82ffc4a73fL,0x2665d6353bd53303L,0x80a06f8a264bb77dL,
70941         0x81c04a6e22d73d84L,0x2409cff50323b8aaL,0x31dce2178c4c4d5aL,
70942         0x374aa80e0c0f9c19L,0x0b25a38700186bb8L,0xd0b77a10aaf1487fL,
70943         0x15f39ad5ab498de1L,0x92e32da61aa0c116L,0x228e3dbd96e25ce8L,
70944         0xb57c88dc5e8646d1L,0x672b1164267b1c68L,0x5d0d807f600bdec5L,
70945         0x3ea4007d223e573aL },
70946       { 0xd76debd0a595d0a3L,0xa6bd76cbaff0b3b4L,0xbf2c154f9b1bdb97L,
70947         0x62b19ab44c714c71L,0xc9bf33b9221af663L,0x23d87c498c941ef6L,
70948         0x255804c3d79f0f6dL,0x6f1a10052a7acbc1L,0x5dab79d9550528afL,
70949         0xfd77a6f0c8d16213L,0x40508b6dde5e1029L,0xd95ac0f2f95da12bL,
70950         0x8860af71758a8ba1L,0x0b194c837160c8fbL,0xa40e6c80ce004d34L,
70951         0x09f82a176b14aaa0L } },
70952     /* 63 */
70953     { { 0x60abe588c21366dcL,0x729c0a4faf75daf9L,0x70501fd9acb93ed4L,
70954         0xb97e744e87a16d70L,0xa42e0a7a98e7361bL,0x1acdaff228b54cf3L,
70955         0xf087ccbbb7bd9078L,0xda6f3983663250e7L,0x66d693eebaf07c09L,
70956         0x79baf4c38cbaf157L,0x5a984e07dfca99d0L,0xab4d3247f26d8dabL,
70957         0x4d0be7017eba36f9L,0x37bb9e650e8dd216L,0x72aa4e24531c4f03L,
70958         0x77d1e984b753d85aL },
70959       { 0xd9373239d8e62367L,0x3361848bb9820cf1L,0x00c7e3445a9c97c4L,
70960         0x9a0ec9ae14f960fcL,0xcf41f0cf740474b5L,0xa5eede8fece065d5L,
70961         0xb1de5a4e9e808610L,0x17c44ae4ae0cf75dL,0x2fa563236b148d0bL,
70962         0x64fa740fd29ff2dcL,0xc605eb8a88cb212eL,0xf2c771ad6a863016L,
70963         0x6d6112e7607b4c17L,0xfe90ec0740d49785L,0x599be18be256e0e5L,
70964         0x4e6eabecca54adb0L } },
70965     /* 64 */
70966     { { 0x950323d3fb99cfe6L,0x7b09bc26c9334178L,0x64111e417cbdfb6fL,
70967         0x9114174489a75760L,0x4c633df910919cb0L,0x715fc7c7396bfd2fL,
70968         0x8ca195128cab62dbL,0x306724734db81aacL,0xe67a246bb4c4c54aL,
70969         0xd77ea0fabf229646L,0x5bed15f1fa5b5d70L,0xa5686da5c2f192f3L,
70970         0xdecac72a7f6690adL,0x0c4af2a2caa50b7dL,0xf44631c16049ad2fL,
70971         0x325d279604ecf056L },
70972       { 0xee11fb554848c144L,0x4e062925b6a7af32L,0x125b68e1369e0f9aL,
70973         0xad9bdae6ca53b21eL,0xf50d605c2e98ea1bL,0xbdb9e1539f2fa395L,
70974         0x4570e32de91532f5L,0x810698ae46a250d7L,0x7fd9546cad9d9145L,
70975         0xabf6772111e97a5eL,0xca29f7d5249f82e9L,0xa9c539a99851df63L,
70976         0xfd84d54b71d0e3e5L,0xd1e0459c041d2b56L,0xceb3eb6efd80096aL,
70977         0x19d48546e32a79d3L } },
70978     /* 65 */
70979     { { 0xfe19ee8fb540f5e5L,0x86d2a52f04e68d17L,0xd2320db0adbdc871L,
70980         0xa83ad5a8d03a7fc8L,0x54bf83c708bcb916L,0x092133ea2e51e840L,
70981         0xbce38424cb52dddfL,0xd5c7be4031063583L,0xc1ebb9df458e3176L,
70982         0xafb19639bc4dabbfL,0x36350fe4c05725a8L,0xac4a063484e1cd24L,
70983         0xadf73154c145b8deL,0x0aa6dd9eb3483237L,0xa3345c3dcbff2720L,
70984         0x1b3ace6cb4e453b0L },
70985       { 0x0343e5e990a8bdc5L,0xa203bf9d6306a089L,0x98489a358e48520eL,
70986         0xbd17debede7d1d06L,0x8fafa6d75f795d3fL,0xa4ceb630387b0a3fL,
70987         0xe0166b32ffddeafaL,0xa2fe20547e764e02L,0x55ab9824e871f304L,
70988         0xa2bd36bb952ec45eL,0x7b4c1484a90d20caL,0x5319f38775bcfb53L,
70989         0x34238a4a6982c4e5L,0xa2bb61c7a102921dL,0x1e061b64db3ab17eL,
70990         0x538ec33e192f0a14L } },
70991     /* 66 */
70992     { { 0x193496fea19b56cfL,0x663d77f47bb99acdL,0x8f04afa857d0a881L,
70993         0xcced3da2082835fdL,0x7e21faed5d82cec7L,0x6e175b99f8009c85L,
70994         0xd9c6e31b2d05a307L,0x96948d4a81487d82L,0x86ebd3f2d46f6655L,
70995         0x86851aa8773ccc49L,0x3e220f228b1640a6L,0x9f06e3a841a20b75L,
70996         0x2cfffe5e90ac0a6fL,0xf5a9b1da8ebeb3fbL,0x2587d9976e08e2c9L,
70997         0x6fd6029803e9f401L },
70998       { 0x54709f8d8eb7516aL,0x83058a74bdc598abL,0xd234dd9887e801ceL,
70999         0xfd0f9d90d17b8a96L,0xaa1e549f6e90f6abL,0x2496ff805a7ed55bL,
71000         0x0d9f657a6c254c19L,0x3cdea49cb8962575L,0xb685a3f02dff27deL,
71001         0x3c50e7fddb8bc04bL,0x904ff0ff987236b0L,0x494298fdbb0d5055L,
71002         0x34b3386de14be8d0L,0x7ad34e9c7c3d30d6L,0x1f2b32bde159fdd9L,
71003         0x84cfa23cc761e5c0L } },
71004     /* 67 */
71005     { { 0x13bc11eb8b99b964L,0x8e280c0a58e2fc47L,0x870fbc49d4c9a54bL,
71006         0x37a334a2bf6e20faL,0xee583d0dd7c88cfaL,0x05e029a8ef4af1daL,
71007         0x6d55e2340c2ef8a6L,0x61b6fdfe209e9b62L,0x3b1dad26bb8e080fL,
71008         0x5adbc1629392fc1aL,0x02ac0fe60aae3f4eL,0x8d99801ac2bf4d5bL,
71009         0x2333f93fc282fed2L,0x16dcb10cb52db33fL,0x09f90f84c55752e7L,
71010         0x287d4c51c84a0d8eL },
71011       { 0x5fa582010e9867daL,0x614589b31a874cdaL,0x005e27c5fbdee22eL,
71012         0xe357fef5e612bda8L,0x4e0dbedf2d3635f9L,0x62be70e46f125a86L,
71013         0xa09b98840d94a2e5L,0x7eb99a1528b5e5d1L,0x21b9416e751028b5L,
71014         0x1b137fd7e06d2cc4L,0x6fa1f517fea09845L,0x3ba1e966ffcecbd7L,
71015         0xd4c89a4a832f453eL,0x07b1e2afeca68fa1L,0xd0fb44534bd395a3L,
71016         0x0132a3dcd8ef9e13L } },
71017     /* 68 */
71018     { { 0xe53c7785576374c2L,0xe60526d184727040L,0x8a066dc8228ca044L,
71019         0x1fe1c1b2f1ce1313L,0x2aeec832cdeb0c5dL,0xa75966999cbf826fL,
71020         0xcd188e81de77a589L,0xe5ce0fe0118d1254L,0xa142a9840790b86aL,
71021         0xe28f043f39ac28ceL,0x4eef829087de5804L,0x83c31b32f639a8c5L,
71022         0xd70454a75887794fL,0xca635d5018b1b391L,0xcefea07631d9c795L,
71023         0x13cbee76b6f8aa25L },
71024       { 0x79cabe0f8d3f34f3L,0xbda9c31ca3617fe3L,0xb26dee23dd9426a1L,
71025         0xe9dd9627f29c9104L,0x033eb169e2c6cd3bL,0x8a73f492fcba2196L,
71026         0x92e37e0bb858c83cL,0xe4f2aca623b3fbb7L,0x8101fb1e64be00a2L,
71027         0x91a7826a948f6448L,0x414067b4907260e7L,0xf774aa50e30bb835L,
71028         0xf922ca80c999c06eL,0x6b8635b90ba08511L,0xbf936b5c25fa04f0L,
71029         0x4e0a1adae02e8967L } },
71030     /* 69 */
71031     { { 0x00ca66708ba29c4dL,0xc08240ce22988094L,0x21c5ca6716dda752L,
71032         0x689c0e45abbbfa34L,0x1d7545fd3ed28b72L,0x5f221198d7c56ab4L,
71033         0x4b3d8f7438759d65L,0x93490dfb8fe50b89L,0xb641f5d7e80eba16L,
71034         0x7b0da5eb79acb537L,0xab6b14970c1d5e5eL,0x2338e68da5da429aL,
71035         0xe010c4372f6d2f25L,0x226f16d26530f3a7L,0xefb0f7b6cbef08bcL,
71036         0x733e30d99f99c999L },
71037       { 0xecfe1582a42a38f9L,0xaec2d58e4730b500L,0x2ee2f2a7de976b2cL,
71038         0xf0539db5a969c1bbL,0x31954168fcecdb4aL,0xf2f7348ae7a8e902L,
71039         0x1d58d7cc3121541fL,0x5d25b75c2202ae52L,0xdea9965af40835a7L,
71040         0x3feb6a41529b4e46L,0x5c97fb6fbd27ad9bL,0xd87554c0261f900bL,
71041         0xb43031d904d5b19eL,0x33d5e9b8cb219b9cL,0x7a43d4923ee00bcfL,
71042         0x56facb39b79a5c0cL } },
71043     /* 70 */
71044     { { 0x019165a2a3018bfaL,0x100c6b249ffad984L,0xbbf1b1f655341a9bL,
71045         0xe6bd1d9725dc4cc9L,0x52850ed52bfffe60L,0x24e992cc7e5509abL,
71046         0xff6c502e4ceb59f1L,0x2f0b35731aa7d148L,0xe90c1ddde7e3aa46L,
71047         0xbaec9f45d1142880L,0x475cfd2665be5dd5L,0x83abb14e1febce13L,
71048         0x6aba482980942d30L,0x1e1b235d297e82c8L,0xb771cdbe50d8218dL,
71049         0x88599266d94d6cbbL },
71050       { 0x08847290155ccaf2L,0x8679ebc77c5b773eL,0xa88b2dd1b2dd08edL,
71051         0x960a180e87d475dbL,0x80fdb6b76694d02aL,0x3e8758c93f3f9e96L,
71052         0xbda3f6fa4ad836c4L,0x9400c58132fb387dL,0x25a785422550200fL,
71053         0x2a97c351776ecf18L,0x03ebf46e566db59aL,0x4743a28026545edaL,
71054         0xed169d84cf74ab44L,0xbaab931d88cb3f69L,0x70ae932cd8257196L,
71055         0x797224a6a0c09719L } },
71056     /* 71 */
71057     { { 0x632923f8441f3567L,0xc11c31682e24bf1dL,0x4b97726bb7671fffL,
71058         0x601746a77a5e1a22L,0x53dddea03addb417L,0x57867a3c7f59b846L,
71059         0xb012a98756cd7ff7L,0x1bd5fec9f19ba9a8L,0x750379a2f8306748L,
71060         0x7763445dab8c05d1L,0x5d7f441b7903f42aL,0xc011674da903e46dL,
71061         0x1b1d3c4dadd126c1L,0xa2752aac61455b40L,0x4da42a68555c356eL,
71062         0x3ff09c15d820852cL },
71063       { 0x4c0a1bcef9cb7784L,0xaec539bc2422f305L,0x5f40f9fd0c414aa7L,
71064         0xd3aa316cffd42bc4L,0x42f5a4c32f358e15L,0x00bdcd9ed6e27682L,
71065         0x069f789ff8a5eceeL,0x8078018e05e14f5dL,0x2bb3e4938b40c741L,
71066         0x5dbc8c1d7917f72dL,0xe0eea664cc57150cL,0xa25ecc5ac3fa8920L,
71067         0x3c21b0f51c797164L,0x8f09a2f2634ad16bL,0x8e730fc558391d9aL,
71068         0x47ef18054fdfae4cL } },
71069     /* 72 */
71070     { { 0x9965f3d13da285e4L,0xba7d4dba3a01e3f4L,0x4738413a61214ad0L,
71071         0xd3b7d53522397549L,0xa53dbdcf5a730b92L,0x3130d92b332d165dL,
71072         0x44a2854182f97ef4L,0xbf62221c44dce1b6L,0xbba138587e2a0ec9L,
71073         0x33f32c8dcbfad998L,0x409e5f3fb5fed44bL,0x5c328c65c66217bbL,
71074         0xb00db69ffcdf71a9L,0xa23c2a21b8920788L,0xf8ab28e63ae6464bL,
71075         0x1a6b6e9cb8de0861L },
71076       { 0xaf6ec2b606af77aaL,0x2e60f5cda887f065L,0x87d214009f498c56L,
71077         0xdb595b59fcbaaf4bL,0x0fb592a1271ab855L,0xa0ce10e5d4349b0cL,
71078         0x9d6187d8887d8c9cL,0x03ee95f9154bd6dbL,0x8fe532135d06c999L,
71079         0xf4a7bc30fb6a64d0L,0x3d22af0d66a4cb60L,0x16952cef5d37367cL,
71080         0x6f0ea734997d8e55L,0xb447c70f731732d0L,0x00ab3034a9cb3942L,
71081         0x79dd018028510fd0L } },
71082     /* 73 */
71083     { { 0x04e0033a3ac7424eL,0xdb06b68860fda4d0L,0x236a9766bcb772fbL,
71084         0x294a8e2bf297cda4L,0x4b0aab85db013c6eL,0x3d2aec988723a3adL,
71085         0x0cae32cd13c84a6bL,0x21888f5e70ec169eL,0x739633bd42a88262L,
71086         0x68ac792e7b60d9b8L,0x89f2b72210769fe1L,0x8f3fcfe6d24bed34L,
71087         0xd35efb88a3eb24aaL,0xddecfa3f484c706bL,0x7cc119a9929ece0dL,
71088         0x87e5ad458d405436L },
71089       { 0xba99aa9d7d1000a7L,0x8b94affcae823833L,0xc8229628dfb83dc5L,
71090         0x2f59fe11845a418dL,0xa8b970f85d417054L,0x8918c26572b71581L,
71091         0xe4ef477dc0d1dd17L,0xb50b4cf33afad7c0L,0x21baea7901870a5bL,
71092         0xc77087f9bb3a2868L,0x7857531e124a59cdL,0xed74c26f57f43239L,
71093         0xd5f5ae250164c94aL,0x6608b7e2f094bf74L,0xf4cdb5bafdceea32L,
71094         0x0b712519990cc045L } },
71095     /* 74 */
71096     { { 0x5a290ca188d5c64dL,0x0596d749a7492534L,0xa04b0d3d2a00e925L,
71097         0x082cd02ccaf7b66bL,0x912b50c2ecdded83L,0x813ce9deff31646eL,
71098         0x62ae70c7c75fff95L,0x6f6852e07e2a4615L,0x320fd7d003804fd1L,
71099         0xb1a2a4dd8218e8d9L,0x4918a6fbafc645d7L,0xfb080fa1e8d9fdbeL,
71100         0x33d4d08a4470b6eeL,0xd2ba20776d974ef7L,0x8ecb95a769dae5d2L,
71101         0x7a3f423a7d69596dL },
71102       { 0x362d2ca69a929387L,0xabdb7581cb1c1fffL,0xd892ec9f7e51b6cbL,
71103         0xee8d86323a4e131fL,0x4680e3f15bd87561L,0xe3a597e1d4e7e732L,
71104         0x3cc72b7c5581fefeL,0xf3e77f8aca8cae0bL,0xfcc7d7dc5e2fd4afL,
71105         0xdd3a455221355b79L,0x546b24f2a2c07177L,0x415b532d0689621fL,
71106         0x2be9af513f78163eL,0x27d63b9b33d7ed21L,0xab019ef296802943L,
71107         0x2da5fc551623faf4L } },
71108     /* 75 */
71109     { { 0x62429cf3c8a5c600L,0xa7a80c223fe33e7cL,0x9ffda7400a57ddcbL,
71110         0xd1ae156d925b0c74L,0x097a43f96b100eb0L,0x169e945cef943c81L,
71111         0xa1f734e51128cf24L,0x04387c4a419f0133L,0xc007868b01044024L,
71112         0xe5416abf90359cf2L,0xf9c76fee478d54e3L,0x66219da642a2173eL,
71113         0x61e031569fe30141L,0xa0ff5ce393ef247eL,0x811792ba072b6592L,
71114         0x855f021970c854d3L },
71115       { 0x61fbfb6c847314c4L,0x97906155eb45b96aL,0x7102e1466ba2afacL,
71116         0xed51f975ab949781L,0x9d2f5b17c110c4feL,0x7ac8ce70aff57667L,
71117         0xe7366a216eb244e7L,0xdd1bbcec551c65c7L,0xb525060ae1a859deL,
71118         0x7a0481748ba7d2e7L,0xe1a2c541ab8ea8c4L,0x6e7824c36fdff078L,
71119         0x79b49fc714874b04L,0x22ae337f06b1f733L,0x1c3521926f8fe6cfL,
71120         0x292236cf525d0797L } },
71121     /* 76 */
71122     { { 0xcdb8d80a7d8b29dcL,0xd17a202408ea648aL,0x7db12c5eae92be91L,
71123         0x1f347d18fda72fbcL,0x11374b409e760c6fL,0x7361e8f1d8e38d91L,
71124         0x7714be9d739ac1f4L,0xc1f9701cb4df5c4eL,0xd9138ed86f72cae1L,
71125         0x1c7fe1f76ad180c4L,0xf8c185be9e2dbf9cL,0x835db2697c70c44dL,
71126         0xf997cfeab0d15b5fL,0x5101445a61e6545eL,0x16b0688425184e5eL,
71127         0x7cfac3597521e7aaL },
71128       { 0x811821673c0bc53aL,0x84b5ede37e751367L,0x3ca255fda3657a18L,
71129         0x096abbf4ba1fdd98L,0x9ce8369fc5da77d8L,0xf27b9ae7aab342c5L,
71130         0x06c91bd6972059f1L,0xee0dab30914ecfe9L,0xbb647fbb93f53f12L,
71131         0x30c38a7affa57e0eL,0x517d06ef9f2ad607L,0x49728d87bb99dcc9L,
71132         0xb0034af1446080a1L,0xcc810c3f12b9c17dL,0x7225f14f772a22a0L,
71133         0x6ce3dc7f1ddf82bdL } },
71134     /* 77 */
71135     { { 0xc07cd835a4397830L,0x4dd9290cf4733306L,0xdd35d3a829989e8cL,
71136         0x79902559563d8152L,0xf278d911e87de61bL,0x9c7340c71024e35cL,
71137         0x2d4444614a0d0e59L,0x63e7608ff32626a1L,0x627a37e9c4c9baa9L,
71138         0x0c56dc5176fffd25L,0xcb6defc8cef2a1cdL,0xcbcc0d56efc559d9L,
71139         0xe45f3fc5041cb692L,0xcd05c239e5161e09L,0x2a731ee95c3b559cL,
71140         0x85151122a3d0a16dL },
71141       { 0x782d033586ff19e2L,0xc2c60daa1da28603L,0xb2e78cfe557c7eedL,
71142         0xa8f6f9841bc4e8b0L,0xcc1f9b4b3df35c67L,0x96e136034764462aL,
71143         0xbf910b977c7ae0b0L,0x27c7f30551435956L,0xc14db15cf631eae5L,
71144         0xa51d61427e69b34cL,0xdec828515fc12ff2L,0xfcceae13fb887162L,
71145         0xda332ac1de1488bdL,0xa20374e22ee3e74cL,0x597ea1a1f0ae069cL,
71146         0x8b1159f277bdec04L } },
71147     /* 78 */
71148     { { 0x4af71a442f961d30L,0xbdf968a87ac7248fL,0xd32df87cb1a906cdL,
71149         0x00c10e2604abf925L,0xb8711759b9f04d4cL,0x00d54e60939705daL,
71150         0xf7587433c9f80849L,0x2e9abade6a7a2375L,0x5676d47894ac17acL,
71151         0x4ca0525bc202d99cL,0x95b8bcadabfae73dL,0x2371ed383405991bL,
71152         0x2b69e47a458a99c3L,0x7cac0b182b78c866L,0x6ceaa79be0232c7cL,
71153         0x0bd86433588f7459L },
71154       { 0xdea1a8b47e734189L,0x52c5ac88cfe5fa17L,0x444a4d4e11437664L,
71155         0xc2522308af9e9750L,0x78b1d0c3d30c6b3bL,0x2edae5f04c6df477L,
71156         0x53131d9a2ee88dd7L,0xc4e380eeacc93e34L,0xd499b1aca8db0e8eL,
71157         0x77348c167f5d49d7L,0xc96632571556ccd7L,0x65ce0e8c2611d13dL,
71158         0x2c95fe66b5a2fdccL,0x266988328658faa1L,0xda87d1f431c32c98L,
71159         0x46650598fcd91907L } },
71160     /* 79 */
71161     { { 0x4c6c13cc6b4a5efaL,0xc481989b1d07b265L,0x10b966ce8bdc69c0L,
71162         0xf54cfaa22c2531d4L,0xcb5f1808cad0a100L,0xbeb52538ee5da449L,
71163         0xa6240085bedd83ccL,0xe792dacfd6255c78L,0x883719062062058fL,
71164         0x96615e83ed1658c1L,0x4b549b277d28d542L,0xeaf127db83b75df3L,
71165         0x4f60df6d17fbb942L,0xd08631dbf6f7c930L,0x17c38f986018789fL,
71166         0x0c43574ab9a9280cL },
71167       { 0x76eb324c1d20cad0L,0x90decb098c61108aL,0xa6e9d39c6f06d36dL,
71168         0x6cd978babc0da197L,0x5948b1c0507ac5ceL,0x2bd47164c5497eb5L,
71169         0x2a9c4c0f4d5914e3L,0x772c5046a759f03cL,0xe7d7328a69ac847eL,
71170         0xa8d57d0c3048b330L,0xe60034e040f7baceL,0x823d9193a85f1790L,
71171         0xa6e9b66c5c859736L,0x22ca2c7a679e1022L,0x00e7a19c09023fa4L,
71172         0x324999f12726d5b9L } },
71173     /* 80 */
71174     { { 0x667eaed67c834915L,0x9f77aa6abc5eb64dL,0x729ebcb625d62011L,
71175         0x0aee24f2699fd9c2L,0xe1eb58742b8d4f6cL,0x7f12710c14c976d6L,
71176         0x91390335f6d9ea65L,0x668b704906b50064L,0x65969a0e0876ee4fL,
71177         0xf901bf3f2f9d9360L,0xfb1a8651b499e3ceL,0x80b953fbf2dbcaaaL,
71178         0x312cc566973b06b6L,0x3534d9c33af36c64L,0xe4463a5210ffd815L,
71179         0x57ea2b4bf18c2b91L },
71180       { 0x00f5e1628aa0f2f2L,0x8c7e75c50e46bcaaL,0x97ab479aa4a2c42dL,
71181         0xb4f308ea14baa202L,0xa901bd146943cc2eL,0xbb125feeeed58804L,
71182         0x6502c8f99d180f7cL,0xe53539191580c61cL,0x7e27806927101ee3L,
71183         0x7a0a40a1faa72717L,0x32edce024c75b153L,0xda23660b538f1c22L,
71184         0x4d511e98be307d2eL,0x24276e409baee0b4L,0xa78c39277ff1f307L,
71185         0x60480b46ea7935c9L } },
71186     /* 81 */
71187     { { 0x31087d663872ece3L,0x5f29be7d955b70f8L,0xb50b4fc79cf95bb8L,
71188         0xbae3b58ddbffa621L,0x0e61d280e022ba5dL,0x78ae51174181449cL,
71189         0x0b132840cf555485L,0x800ed1b6b8ce0b0eL,0x35dffdd578d5de3dL,
71190         0xf7e4237469a56b47L,0xd5e323698d910ae7L,0xb6ff52a06313c7c7L,
71191         0x5a2fe20da92de9e5L,0x41b347d3d12110bbL,0xc5905edb40c16f23L,
71192         0x0774a0d39a8f88ccL },
71193       { 0x3ae181abe3b6c106L,0x4ebe163f8de150b7L,0xcf75b82f6f354836L,
71194         0xaa0d20633ac7ac16L,0x5c680668291722afL,0x73941e6111545553L,
71195         0x17127e38bf5de3f7L,0x32cfdf031afb41daL,0xc6893c9187bc8663L,
71196         0x75046744a62c9c99L,0x96866e2d962c1947L,0x489ec8df378cdf4cL,
71197         0x3a60709b3407fa32L,0xd37d2159551290d1L,0x9623d303bab92273L,
71198         0x081519542432014bL } },
71199     /* 82 */
71200     { { 0xf9236d89fb7b2108L,0x3ecc83ccad75f9aaL,0xf7c72b15b4e1da11L,
71201         0x552aeaef0315c362L,0x11e140edf272fe3fL,0x99d79bf687843ee8L,
71202         0xce6b54fd1d9bb25bL,0xb20b0e215b1bad74L,0x54a0214f5b84c90dL,
71203         0x459bbf52fca6cec9L,0xe363c48d9e4df76fL,0x3045f84ed64cf17eL,
71204         0x8402a167f62ada48L,0x2c9e1bf36a74ca01L,0xe8cf9d41f691c42dL,
71205         0x5abf2178c2c4b874L },
71206       { 0x4777966bf3b3bccdL,0x0047e0f0be3e0caaL,0xcb8383b38c7d5043L,
71207         0xe77e3baf946fd5fcL,0x79baa785e9ec0e87L,0xd83c557cc8a18d25L,
71208         0x9b96e5af25befcfeL,0x4f05d15e98c71b61L,0x081f991a77e62da1L,
71209         0x1c6ec781cbaa3821L,0x7522f65de54d9bfbL,0xf5d0557344ed1430L,
71210         0x3035b31f95cafddaL,0x47e67f436378f5bfL,0x029f7cad5270b9d9L,
71211         0x15ad15874d916a48L } },
71212     /* 83 */
71213     { { 0x00de2eceaa588ae4L,0x552ebc58a371a232L,0xd00ea93471230444L,
71214         0xafbfa67de4b1832dL,0x29216341b689e843L,0x1f96bbbd61f4e2e8L,
71215         0x9542068404c29dc5L,0xc7fe382742317fd1L,0xe0a0aec663483162L,
71216         0xfc2b94d10700184fL,0x07219973fe1fbd85L,0x648b6ab1fb074352L,
71217         0x23bbdaadc46e5392L,0x0db8dd1f00fa56ffL,0x104815eb866725f6L,
71218         0x3f9c4cca52e81963L },
71219       { 0xff36b29732ce637eL,0x81a15f2df5d25cddL,0x1a1d052d8b02ad97L,
71220         0x2e5f3bbccfbab3e9L,0x60d2cbd7614eeb75L,0xd4491843cd5a793aL,
71221         0x2242cf75cdba2144L,0xa20705e788b99766L,0x64e12cc0ec77e132L,
71222         0xb1c14df6b61a9b05L,0x8fd97f0474825b5aL,0x956048213da31223L,
71223         0xde4867274d30c70dL,0xbcab8f151c12ee69L,0x5dc638b4668d893dL,
71224         0x6479dad6223f574bL } },
71225     /* 84 */
71226     { { 0x569044f3b05f2b26L,0xb35a294a80b9f76cL,0x8839fe284290f6aeL,
71227         0x761cfb23026a5877L,0x768926b62e5ff9c3L,0xbae6cd200b11c576L,
71228         0xdc85775672a03efeL,0x0cae074ae1bad63aL,0x3fe491a1d709d99cL,
71229         0x76c5ded66501d9c1L,0x1da6eca1c32aeff7L,0x50849d55c57683e8L,
71230         0x9e392e9cdf98d847L,0xfad7982f64d9a564L,0xf7c3bdb7a37b98b2L,
71231         0x1fe09f94f0860497L },
71232       { 0x49a7eaae7648cc63L,0x13ea251167cfa714L,0xfc8b923c653f4559L,
71233         0xd957619b81a16e86L,0x0c7e804b3c864674L,0xfc88134a1616599aL,
71234         0x366ea9690a652328L,0x415329604bc9029eL,0xef9e1994ae2aad2bL,
71235         0x9e2a8c527f10bef5L,0x73dcb586c67bf860L,0xf61a43fa844cc25dL,
71236         0xd74e7eea74eb3653L,0xf3356706dd240f02L,0xeec7694cfd83bcb4L,
71237         0x4de95786db62526aL } },
71238     /* 85 */
71239     { { 0x4867d3153deac2f7L,0xa084778ab61d9a8eL,0xf3b76f960ab7b2d5L,
71240         0x00b30056cfdf4f79L,0xd0701e1531ab8f4bL,0x07f948d59c779d01L,
71241         0x7c994ebc82675371L,0x1104d4ee48bad4c0L,0x798ce0b5bfc9d058L,
71242         0xc7ca898d309fa80bL,0x0244f225acb33eafL,0xd51e8dfc5b2f3175L,
71243         0x3e49ba6ba4d7be34L,0x1760f4c7bda02b43L,0x37e36a7e4435275aL,
71244         0x1c94418be636980cL },
71245       { 0x43a2131309dc1414L,0x060765fc43c93537L,0x6ff3207adf5f79ceL,
71246         0x6f18b1fa85d4cfcaL,0xf5c4272e63e995abL,0x121a09e4a82b3002L,
71247         0x82b65d1b97147f16L,0x4993c20c20a7fe26L,0x99c9cb98e6716726L,
71248         0x5a02d673feb440a0L,0x3f3fa9e1251b4bc5L,0x75dbc474a05338eaL,
71249         0x3cb4044b7b09f6cbL,0x6767da1880434609L,0x97851422098ceac2L,
71250         0x611bfbb2b55235baL } },
71251     /* 86 */
71252     { { 0xbdbaa55ef00ad2a1L,0x29efa85e14a290d7L,0x3b4a4768e92b1694L,
71253         0x67111bcd11ec8130L,0x0e42570288bd27b2L,0xf28cf2a3d9a03c06L,
71254         0xbb7c8d2df318884aL,0xe2ea1462e3aaeb20L,0x3353580443b85d77L,
71255         0x81ee4482554ee9bdL,0xeb2eee9ee6aa198fL,0x7a5aa804c26c5944L,
71256         0xa0ef2da582ab167cL,0x5a2ab47602fe21a5L,0x169cb3b83370298eL,
71257         0x86e6c5440eb3aa8dL },
71258       { 0xede033210b793d9bL,0xf79fade11ddb5eceL,0xf73fda9268930b64L,
71259         0x06aad97dfe4fd1b2L,0x073a5b1d92a4dc88L,0x8af8cbd8bc976d75L,
71260         0x60b4abb163ce26c0L,0x9c8300a9dcb1fb06L,0x335a594cda95b3d3L,
71261         0x1f97d7d4b37eac87L,0xa3d2eba220eefaabL,0x3258c906f3e828c8L,
71262         0xc832616f85ab7781L,0x725971928c28b617L,0xcd7196bc3233b82dL,
71263         0x83867eb919fa126dL } },
71264     /* 87 */
71265     { { 0x774fe73e22474edbL,0x2a7663941a84e1aeL,0x270329ad9c6dd6e3L,
71266         0x00c4a41514f8bf5dL,0x3ce2ea37d2267b90L,0x1275301511d24faeL,
71267         0x7c14d854263a1b78L,0x20c8401b1ae0b206L,0xf32a011b081f49fcL,
71268         0x1e8123fb959c6df8L,0xa328dc7c800e1d06L,0x5876a37824259a9aL,
71269         0x23ada8b5b7ef6c37L,0x023f6b6ea93d4c9fL,0x89f5414dffb6389fL,
71270         0x4b26bba2e628b39eL },
71271       { 0xd30b1cb45d318454L,0x123b749fd7436cb6L,0x3110c726568a7461L,
71272         0xc85de1231c84fd1eL,0xa5f8d6e608403d55L,0x395b6e139b1fabf8L,
71273         0xfe6d68c33cfedce0L,0x1d90381f94b91110L,0xf0a8ea812dcc6eb7L,
71274         0x59e804137e90ca2bL,0xbeb5fc07c8a25c5aL,0x009c253a5d84663cL,
71275         0x00b15073910b6a7cL,0x8607da4c4108f8d5L,0x02c3d9c3cb901e65L,
71276         0x4d697bc52c9615c6L } },
71277     /* 88 */
71278     { { 0xe0db1ef0efa8fb40L,0x29021c5b5ba3989cL,0xa8d6fb15809d19dfL,
71279         0x6b787b734c1219e1L,0x6417e16814ef05e2L,0x449342db8f9796e2L,
71280         0x2f878a5ebf84421bL,0xe71916d7e94a4536L,0x9818bba3ae119693L,
71281         0xec674be95768804eL,0x0a26074cf8424f8aL,0xdbc93b9d466ce6abL,
71282         0xb3f15a98c920078bL,0x9d10fd0d3870f1a3L,0xa61241d9e4e785a7L,
71283         0x76ca87a1e6c8cd80L },
71284       { 0x4357fb56e02e48b7L,0xfbd14b13cc09e9c6L,0xdb5f243524069cf0L,
71285         0xf878165c2c3b01a9L,0xe549e7c4e6956dadL,0xf2fe9538bbd60b68L,
71286         0x952f856b059dc653L,0xd3f60225b377fe9bL,0x6a0c7328bfe908c4L,
71287         0xce6aa2d3bc8f5f2dL,0xf721344324425050L,0x17e1266a3d3b3ce5L,
71288         0x75b5e43fc1677512L,0x1592706237fb894aL,0x152607532be3e375L,
71289         0x27e7f2c66da3b7beL } },
71290     /* 89 */
71291     { { 0x638f65ade6a15883L,0xd4a7e68c66afdb33L,0x6207b6abd3f12de5L,
71292         0x1c6ff95037b87810L,0xc0d44cb264acf6d3L,0x163ac601f2be78c2L,
71293         0x1c63cc5a1636980eL,0x3e92cfe895c9349bL,0x7738e0d841ec7220L,
71294         0x6169d7642d5fa961L,0x2aa776c1c3e028e9L,0x93dc5646b16d5409L,
71295         0xa0b27fb5706df4d9L,0x9e991170ce9c6b97L,0xea8e42be53c85f40L,
71296         0x02e9643783246528L },
71297       { 0x91540addae78ea1fL,0x51a1b74d7b670e96L,0xf9936441f7006826L,
71298         0x8f97d6ea7d7520c7L,0x0faa6a0269ce12e1L,0x2590aca879208342L,
71299         0x7a48386375614436L,0x07c6149ef381408fL,0x733bf584d7853406L,
71300         0x8761b0109abbb6f7L,0xe4eb249ff528a09aL,0x08781ed82e00ae3cL,
71301         0x864c1b252178effaL,0xcc1e62a29d513a7eL,0xedb8b94e1919062fL,
71302         0x739f53da4f16527dL } },
71303     /* 90 */
71304     { { 0x7a5f4a88924adc5fL,0x95646c16a818f56dL,0x0ec491297795f954L,
71305         0x2b48753dd19c5400L,0x16fa236b205912b4L,0x6b3d65f3e87a4946L,
71306         0xa7174a01045fd066L,0xb635031312a5e140L,0xa79c4b44a96b8623L,
71307         0x7a339d659ab003d5L,0xc72f30c63826f31aL,0xb4e7390c6f7090cdL,
71308         0x59ac6c36906ebe24L,0x39a7f06dbba4505aL,0x839991e1c58c413aL,
71309         0x020c23ffa20e0e84L },
71310       { 0x120e4adaafc74661L,0x37bbcf63277fc065L,0x41049cf6b6dce799L,
71311         0x5b8d6b537b161ba1L,0x22218431a9610fb2L,0xde9ec9d1dfdde769L,
71312         0xd32bfa4d42d80630L,0x3885702a6244df4bL,0xcdedd1ed45592dfbL,
71313         0x0e1df45bfb4e01b8L,0x8f4bded286e215b0L,0x809354876a937e6aL,
71314         0x415278ba8130f723L,0xc6dc469238a821f8L,0x2207b119fd8b4f8aL,
71315         0x76e7bf53f9269cefL } },
71316     /* 91 */
71317     { { 0x5f12842827ebd187L,0x8d3320abb65aadbbL,0xb042765a72258695L,
71318         0xda3f33f98f0986abL,0x411807a7aebff503L,0x25c776ca825f71a5L,
71319         0xc0de7bedff7df24bL,0xda8b0f42165f1fb4L,0x5f3ff737731f3ae3L,
71320         0x4cd1d7e7193e0a52L,0x8df84aa3b6b3ba46L,0xba84b897aa1f3782L,
71321         0x6e7960cce7733ac7L,0x4d46d6ab50981a21L,0x1ec12c257cbb80edL,
71322         0x79e7ad272b96ef09L },
71323       { 0x3cd970dc8f30caaeL,0x85cabcf10a6ebef4L,0x63c1863ec714616dL,
71324         0x1c50db0b519e3a98L,0xf39b896364cb13d6L,0xdf67d81f22547b69L,
71325         0x7157abb9d67db0ccL,0xccca25ba889491b7L,0xf689207c7a27e0dcL,
71326         0x34ae8fbe0fd43281L,0xa5d91f735720ec09L,0xb2f61909cdfd7bedL,
71327         0x1ec102324a039e32L,0xd3c3d65edb0d8fdcL,0x32c916c84fe5005dL,
71328         0x7f8c37ac4c0bea94L } },
71329     /* 92 */
71330     { { 0x33ec1e5443ac05e5L,0xda4a4da4cd8d3825L,0x86d88c0b88bf9e2bL,
71331         0x34d71dd0b53811dcL,0x655040d2a3c3aba4L,0x2bc40949b61611beL,
71332         0x1c2d426e279a4fa0L,0x535a5aa23b065ac3L,0xdaa8a32fc52ea890L,
71333         0x5a5deca79fddad22L,0x911f05fd2ab3b26fL,0x5dace7dbf37cd81eL,
71334         0x0e0e44e790d16b8cL,0x15e68aede4f5894eL,0xafe04999fc92a74fL,
71335         0x1d7703aa970e7c2fL },
71336       { 0xa8a4c81d3f0062a9L,0xe31eb2b8d96a20baL,0x66dd98df864bd101L,
71337         0xba05f5924413b614L,0x51a67a0de9a555f8L,0xacc2f0972e4b52d1L,
71338         0xab5daaec7184ab23L,0xce08b43e7c7f691bL,0x520e530b76c427f4L,
71339         0x7d352069e423ebdcL,0x6b5e39e834df14ceL,0x3dcbf295446305acL,
71340         0x682cb2e1fe34cdc1L,0xd4ac45d1111f5afbL,0xc5ef63cd47f296f9L,
71341         0x0a2c40ec93c20871L } },
71342     /* 93 */
71343     { { 0x09bc384faf5747dbL,0x3bad6086c06ab86bL,0xa406882e9e7c1547L,
71344         0x2d5326d155977abfL,0x063a9a05da81deb0L,0x9a86e4a7524b6111L,
71345         0x1402f87a4ab2eb90L,0x7d0721d4d5c600baL,0x1a2fd9a9f289fdbfL,
71346         0xf5dce66decde6f07L,0x62171277dab9fa73L,0x6d2dc49f6c474babL,
71347         0xdc017e1f76eed033L,0xb97175c04da825d3L,0x6c297e3d54b05e43L,
71348         0x2efb454656c9c87eL },
71349       { 0xa4712b008b21c064L,0xd186fe424a70629eL,0x6435b3409b74f0afL,
71350         0x6965aa437ec9e629L,0xdda14673c4c60d08L,0x0b656670bf3057aaL,
71351         0x7f05e8403ce86f60L,0xc05073a904401a16L,0x16b1e638294e607eL,
71352         0x2078325269cf7046L,0x2941141be8ce7d3aL,0xd38ad8d37577053dL,
71353         0xdba68fb3caa6630dL,0xecbeaff1e9504350L,0x9f5166d51d2d760bL,
71354         0x337532ce462891e4L } },
71355     /* 94 */
71356     { { 0x3f1118533a00bb9bL,0x2d2ffbae45f66685L,0x9ae11a85d4aee24dL,
71357         0x18ba1e1b0341856eL,0xa9ac81782731349fL,0xc13dfd4a545715b5L,
71358         0xa5f7423c5daad2eaL,0x30a483b9535b76a7L,0x92e9ada4ff873e9bL,
71359         0x15662d84723a1055L,0xb935497b8edac4e0L,0x61b6441a39d8fa70L,
71360         0x1541d75640d1589fL,0x62994237f0a05f0aL,0xfd8b00346bb28908L,
71361         0x192a2b5dd4cd32bfL },
71362       { 0x63576628365ced07L,0x029f32fb05de1d1fL,0x6d17b9bcbf40a7aaL,
71363         0x1b1b2a089bb50a47L,0x9389abbb795a6278L,0x52cff60fb34fc19bL,
71364         0xf3ab9492387d8739L,0xa8f053e66920ccd6L,0x3ef2dd4b63a9b4f0L,
71365         0x9ab0ede151e82129L,0xafba0c0b0838bfa1L,0x2bd5a7ac9ffc11beL,
71366         0x058bfd9595cc0878L,0x686d48a3f8c2f0c6L,0xc33abaaf1d9b31baL,
71367         0x632e22893bc0c268L } },
71368     /* 95 */
71369     { { 0x1c851d2015a1cccaL,0x4efe290c7e522bc3L,0x0b741d5518eab053L,
71370         0xae656197bc85e217L,0xae13141e01cf8b29L,0x2e2cb59366948478L,
71371         0xeb57bb0fc31bd8aeL,0xdecef5d6c264e788L,0x6fa856cc9cb96d86L,
71372         0x2db16813279183daL,0xf03f3820383d796aL,0x58a456ff1d0c6fedL,
71373         0x255898058a6abd9bL,0x339f52c583f96f19L,0xcf6ded8fda7e9ea7L,
71374         0x68c3d9c15d1ccd45L },
71375       { 0x67e26265e6b392b7L,0xcec1d9bf775d9509L,0xe16abcd4d76514f7L,
71376         0xd86f59b20de72e1cL,0xa66e43cd1adfb033L,0xdb34434005e457ccL,
71377         0xb67a79165681daa2L,0xc32e7babf0114731L,0x066fe16ed3b1e961L,
71378         0x924e298ef63d26e6L,0x9bea0dd8541add6dL,0xef9500df9982f971L,
71379         0x5c876e63c5f076acL,0x55e12ae5b23d396bL,0x09efbb362ec6747aL,
71380         0x8f2055ee233286a5L } },
71381     /* 96 */
71382     { { 0x4a4ab9e3b82c1af0L,0xfc65e9e7f2cae264L,0x4feaac0a60187d46L,
71383         0x27d3f335e393b363L,0x9c9f7c00819bacceL,0x3f7418b5b8aa6611L,
71384         0xffa94557372aae95L,0x937d78048db38589L,0xd10c86df6f1fbc1cL,
71385         0x48aebd89a2f0a0ceL,0xae5d5fa2367439ebL,0x103a6a0b3f17d2d8L,
71386         0xf233f68a411d9894L,0x7fece8b3218b67a2L,0x0422540f2319bf06L,
71387         0x1292c8c9340d322eL },
71388       { 0xf5eb55870386463dL,0xd4bbc2b20371d97fL,0x1b3645710b819c5aL,
71389         0x0cbb42d6cf04ad41L,0x5d819c7666939ec1L,0x8745ac13a01847e7L,
71390         0x4f704b021c7232e4L,0x2c9e58a0acb05780L,0x9523b8b3b561e295L,
71391         0x3384df0079f9ba35L,0x78231fc21eaa9628L,0xa2eac54f8aea2b90L,
71392         0x8075ed7730d1c263L,0xacb44ed5fb339000L,0x92546ac2f011293aL,
71393         0x7c78762beb821764L } },
71394     /* 97 */
71395     { { 0xb8f7d6fb067902b6L,0xb2823a43d1735980L,0x062cfb1259741dddL,
71396         0x6e391b074033f95cL,0x3831d0a368589b8cL,0xe3474d49522290f2L,
71397         0x4dab14d6222e1f3aL,0x8f00fcde53f08d39L,0x559917ae707f28f5L,
71398         0x166aa0ba068e607cL,0x602713e7d7e1f824L,0x7c2555404d6a328fL,
71399         0x0d2e32649890cd2aL,0xf2207944eca0b20aL,0x5c98dc0752f4e09cL,
71400         0x69403504d84de81dL },
71401       { 0xf8b7b366e5407206L,0x1ecf54cf0d88fa8cL,0x6fefe548f7272e6fL,
71402         0xd653137281ab4468L,0x52cb5f0e4e474408L,0x9e426b3a6490737fL,
71403         0x2576c19b4980d071L,0x91f346280f272cafL,0x78e60a4f468f31c9L,
71404         0x8776a32990844d89L,0x8a55700cb951582bL,0xab1af36514b1adbfL,
71405         0x22ebff92fbd343efL,0x32f9fb01b7d81f34L,0xad850e06ba6b30e1L,
71406         0x6da9e027bc5f9546L } },
71407     /* 98 */
71408     { { 0x21eee4c25c9490ceL,0xa96ec4a30df68381L,0xe6c607e0a4a9368eL,
71409         0xd8b0492a4bc262f3L,0x0846a210460c34ffL,0xf7ff7a6428df33cdL,
71410         0x10c5504421827612L,0x9d25fce9149bcd01L,0x725611cdcfc613dcL,
71411         0x159f7e8897f51ce5L,0x3fa3bf314e8c08b5L,0xea15611575e7538fL,
71412         0xd1e0a95191c84020L,0x0d2268bacf02ad0aL,0xa04c6ac4058b8e5fL,
71413         0x773b40b9b3515912L },
71414       { 0x00ff2cdc3631cfd2L,0x14c4c2d3807737bcL,0xd600616a338a5270L,
71415         0xd0e3306db32cabdeL,0x336738eaa70b17caL,0xf2f4aa8d79f353eeL,
71416         0x712f6ad9576f3ad3L,0xe427985289b2bce0L,0x05d8f94dda92ca30L,
71417         0x9891d475d8492dd9L,0x3e06a5ca4d15e4bdL,0x4725d4eb254eabbdL,
71418         0x31394acec0ed513cL,0x7e0f9859bbfaae6cL,0xdc125546833fd137L,
71419         0x12b46385c56c4f75L } },
71420     /* 99 */
71421     { { 0x810dbebd932951deL,0x96959d425aa69c94L,0x5fc49c04ecb2f08dL,
71422         0xac74f0cc2250b82cL,0x96a439a53aec4e1dL,0xc33cab9a90499acdL,
71423         0x2fccde6654d9b3afL,0xf4af285c3863ae8bL,0x2373373e46febf88L,
71424         0x751d672c3c9ab7edL,0xc1c51130fe12020cL,0xad82402f52f3e56eL,
71425         0x3489ab7aa4a64a81L,0x0a1fb661d9f163f2L,0x17c69be10e553317L,
71426         0x61c1935e7d88d417L },
71427       { 0x2e722d9b3492ae43L,0x1ef89d950538f05aL,0xae77e588200aab63L,
71428         0x2872c120eba4b117L,0x5c2432c83a461cb8L,0x315b3434cb938f26L,
71429         0x05bf2ac58c4c7dc0L,0xd2e501dd596b378dL,0xa8506c9fcb890c30L,
71430         0x3d0af4617c361f0cL,0x21f7b7185a35cbaeL,0xbd1035f1f3fc0138L,
71431         0x74628af58b248edfL,0x8d6421d048c9cae0L,0x75e3da392ca18773L,
71432         0x27ad0df271d3db94L } },
71433     /* 100 */
71434     { { 0x9e3bda79305b5aedL,0x2c67d4a45998d6a7L,0xc855e1d30f7eb700L,
71435         0xc18a7e9e147d1c44L,0x3ea99618c89540edL,0xa53be20a7e6bfd20L,
71436         0xc9487e64ecc14437L,0x7297920734ef85c6L,0xfa0d4e71d5e1ebd5L,
71437         0xfda2b1e64d48d6b6L,0x782a1e0566e200d4L,0x2a3c70da5a5366a1L,
71438         0xfe3fbd2b1a473738L,0xd7ef8c067fe020e8L,0xec686fdeeacfb665L,
71439         0x5d9b5e276dd1542fL },
71440       { 0x3637c5a5cb3e472eL,0x2153d92730a1405eL,0x009992e5b4498558L,
71441         0x18f00ccdf39a0851L,0x26237c11b5c6c560L,0x418ed4081343540eL,
71442         0xfef7cbf07e7f3184L,0xecd92366bf48576bL,0x1b75be1abc94c91aL,
71443         0x8e1778de4a162276L,0xc52e57d3c5c6bcb8L,0x5cc382c75ab71858L,
71444         0xe12c2c283f6e39f9L,0x4c7e0ef2d62735fcL,0xe071deb1835a5996L,
71445         0x24f891cdcbb8c766L } },
71446     /* 101 */
71447     { { 0x24ef60bf6778c1e2L,0xff49c03d00d5be5cL,0xec11986e2f01a09fL,
71448         0x59a728a4ae096e58L,0xaabbcedb7077984cL,0xfb473bd2870ca5a5L,
71449         0x8c928c614de30e3dL,0x3fae7f9a4f67abcaL,0x83c2b2ebec21a9cfL,
71450         0xafa70d629cd9b5deL,0xadeaea59c60b18dfL,0xd5fef7be4049b54cL,
71451         0xfceebc766dd310e3L,0x7748efe38f6321ccL,0xfe9c32b118ee8af5L,
71452         0x863ac3cfd42df612L },
71453       { 0x0a36fca7b85a2fe2L,0xf3e70d08ee429dc6L,0x8c9ba209141c3944L,
71454         0x306a810667272a0aL,0xe69a1555f968bd06L,0xb86f7e47153c603dL,
71455         0x9706614aef56e4faL,0xc0dc36b898780b4cL,0x43657fe23a1d3263L,
71456         0x01f97a86435522c9L,0xd91897f6edfef679L,0xebbe31d46daa17a0L,
71457         0x6f17910085accfbdL,0xe0da6e328f9fc1deL,0x1c9d53dbe1e7142cL,
71458         0x3e3f1b1e8b86725aL } },
71459     /* 102 */
71460     { { 0xb7ea15c07b7fbf05L,0x992f11b61f1a3882L,0xc9ddd95ad1dcd1bcL,
71461         0x31f5b7faad0f7e8bL,0x2936e5ebfca7ab79L,0x30f417dc19a55be6L,
71462         0x1f6f4e4343cde554L,0x971f5e6582f044bfL,0x73c3b8e44288c408L,
71463         0x61aac59fb807f575L,0xa64ee2dd818b58f0L,0x6f7a0a6097a3b0d3L,
71464         0x8b85ecc80394b058L,0x9a059474bfb3517dL,0x89ad5977a79c3f06L,
71465         0x81208ed8700a8025L },
71466       { 0x1093509914c4ce37L,0xf34bb843a1aa48a6L,0x86007024580d58e8L,
71467         0x6db42c49b375b8baL,0xac365524ed3bde83L,0x5521e1b4649233b6L,
71468         0xbc7cc5d564dd946fL,0x9c14b035bfb5b6aeL,0x7f22ba180146c1a3L,
71469         0x0b62fbbc872214f5L,0x3acfd7f7b4921764L,0x5ff10da1cb4d6df1L,
71470         0x660e262062600a91L,0x7ac7da9d81d9167fL,0x6e8e260cb6e7a199L,
71471         0x44383fb880deb3c2L } },
71472     /* 103 */
71473     { { 0xe107f01de44f9af6L,0x36381a4d8cb1fa1cL,0xe65be3ecfb7dd493L,
71474         0xd0b8435a26a8839fL,0xee60f9153ec789d8L,0xe25fea502bcc5e1fL,
71475         0x0477c0c57e44a81cL,0x349e9f83230ba5b8L,0xdd42f32fde180dd9L,
71476         0x8b039eaf64a3d11cL,0x80ef884ebeb7083aL,0x288e60c4f12742cbL,
71477         0x44156cc5720a0262L,0xcd547de67253b77fL,0x9829a6eca6013a59L,
71478         0x8aee708f0d548445L },
71479       { 0x18f22d9c32c54409L,0xa9ebfa4675ebaac4L,0x90e2e92886284981L,
71480         0xd0201f6f6b3a8e0cL,0xc973016cbd77641eL,0xf926f2f070170575L,
71481         0x4984048ffec0ce01L,0xbf696211f319d304L,0x74b5c844c91a88c4L,
71482         0x4c40fbcee0030a82L,0xbed67525e4f6d521L,0xaf7e47cc29d67d1eL,
71483         0xfa307db8c21d3536L,0x56b6c46abbb29405L,0xf059a7e3033e805fL,
71484         0x970f61fe6096a5a0L } },
71485     /* 104 */
71486     { { 0x1bc53d231bec8e4aL,0x8809ac1435a6034cL,0x4ee081da509e464dL,
71487         0x496ae1fd8a488235L,0xa1ae9863325864b6L,0xbaca13e974cd069fL,
71488         0x3738cc58b1d8a6b4L,0x5fa71f58e76b9da4L,0xc919be88c7eb16fbL,
71489         0xf5c8f13fad4e429dL,0x4583b6712499f9edL,0xbce20115a10d8bd7L,
71490         0xf66d76055790bb7eL,0x9316aede482b78ddL,0xe0d8fb2d75f855faL,
71491         0x404b5b945a7dcca7L },
71492       { 0xf9ee682a517a15c7L,0xaae4cfbcef880202L,0xcee2c1395106a354L,
71493         0x5de60192170febe7L,0x589e39fd73d0c54bL,0x195c71358c9092b7L,
71494         0xcb7ed53f0a7bfe5fL,0x2bd9242af61cc979L,0x8d2ef16c5395f7d9L,
71495         0x0d4ac1ca70b32f09L,0xa587526d52d185c1L,0x2932b04a942d6195L,
71496         0xfe25a979a500b0acL,0x5fa1f4ae562fd230L,0x60f55af220da253cL,
71497         0x7faa11b583146002L } },
71498     /* 105 */
71499     { { 0xb0ba4f0c6e402149L,0x3584cc1d963cc119L,0x7740dc1aa6527476L,
71500         0x3f77ff75c95715f2L,0xb2f234ad3f89fb0eL,0x55159032ef9be3ffL,
71501         0xfc9fb21d04237e82L,0xeb2eff38a153ed93L,0x89d53ae010041d13L,
71502         0xcf2e545b7f1bd828L,0xdd4a27ce43953ea5L,0x00d2e5d4d85e75c8L,
71503         0xeb93ed62241be1c3L,0x1e53f25f0242032dL,0xb9957636c3a4e701L,
71504         0x14b63a52ed98febfL },
71505       { 0x7610b55371c43336L,0x19dfd4a623a4824bL,0x7b97a2e00286051bL,
71506         0x86abbb9c8f5f1edbL,0x67a57d779b67daadL,0x8ace506dcd5ffafbL,
71507         0x85da9f9589ac3c63L,0x081cbaa875a3d150L,0x03353d8fe9346ed2L,
71508         0xb2ab61f1a1f9a02dL,0xb0cb09373a659c71L,0xb7e0e30b4f5df8a1L,
71509         0x77c4c741eb7d5a1dL,0x8f046c9c728e5cf0L,0x32dd0bc7f7c171acL,
71510         0x02485873836d2655L } },
71511     /* 106 */
71512     { { 0xcd40dd2375a4cd8dL,0x132ca43397bcba78L,0x30c5cd84258d61f5L,
71513         0x0a7ec059da1e8e68L,0x07a8f1711d65d40aL,0x869e655ef4350d76L,
71514         0xb98ce6f05983ae42L,0x7b61391d9d8bebd0L,0x3a529e25b1ba5d49L,
71515         0x46f732e91f6b2cf6L,0xbd66ec6a3fa3b629L,0x397950ecc3ef0ed2L,
71516         0xee9008cb5f08b476L,0xfd6be425965a0e2eL,0x78ed513c1177bc87L,
71517         0x6798cedffe512daeL },
71518       { 0x49e3f8fd1b97c5c6L,0x39fbab3e78c3b33fL,0x4427441240f595baL,
71519         0x174225b95d7d4376L,0x880b3fcc79c44777L,0xdc3aca833296b245L,
71520         0x55913df71734e184L,0xa4db23d39c934472L,0xcebb3733d1420a11L,
71521         0xb9d20cf9f3608bdcL,0xa618acf630cfe13fL,0x75f06b315f30874cL,
71522         0x506efe7f9f0005a5L,0x8aaea78c01bfc9dbL,0xf9179255f78e7c41L,
71523         0x3ea7aed252e96395L } },
71524     /* 107 */
71525     { { 0x98617e045b06ae25L,0xbcac148dcb5750efL,0x91ea2f0e604c2ba2L,
71526         0x00c19f6b76b78975L,0x79b9b6d0651da181L,0xf3225bebc945705bL,
71527         0x30b435f35c005bf1L,0x440b4482bc24d86dL,0x2b8f0996d6373777L,
71528         0x65fd6c561c44b4dcL,0xe9405ee630906999L,0x19ff092408aa1ec1L,
71529         0xeef3246a3d2f2895L,0x016c3765bc746797L,0x62d2569fd0705f7eL,
71530         0x6a8ad39c05250044L },
71531       { 0xe45f020d46be7282L,0x9405afed21380f12L,0x4cdca5bdd5da6ad0L,
71532         0xc2d6f1847f8be61eL,0x20132953596b8178L,0x8d3b1e7b7a8df954L,
71533         0x757c61bb39572b4dL,0xd749b57b80cc3b56L,0x9590ff9337b3ffecL,
71534         0x39bbb653145dc94dL,0x70c1c6062335e573L,0x9c2e72d7f763febaL,
71535         0x4768e424cc61b732L,0x777d2fa6aa73f2caL,0xdee4dbaac5cb58cdL,
71536         0x1a1811799cfae1aaL } },
71537     /* 108 */
71538     { { 0x6f6ff62f77575ed0L,0x18f14fa97d1da99bL,0x2e72aefb69efd7f6L,
71539         0xc45ab4cbddc28633L,0xb0e20d48586c5834L,0xd397011a39775dd8L,
71540         0x0130c808f4134498L,0x2d408ebaf5115ed8L,0xc506a05c0260ded9L,
71541         0x9e5b736219cab911L,0x4cf508c6e8693a86L,0x4e71245fcc773617L,
71542         0x2f71aa1f95d89ca3L,0x4bba7c6a607bbc98L,0xf3a515e7212b7fd2L,
71543         0x7d2ddc759230f5a8L },
71544       { 0x3d05816d4ed2cae8L,0x4cf6bc7db9c00377L,0xc23e98e6646b08d4L,
71545         0xf9ee6c614b9c0180L,0xe11c9a13ef9179c1L,0xa5b6147e8ed9688aL,
71546         0x7afeb648d06670a7L,0xd670333c17685275L,0xa89dd96975f9e8f2L,
71547         0xbb57228d37a68adeL,0x21a05d5e454cb186L,0x4810158f063dd550L,
71548         0x92dd4f084cb6caf3L,0x70c4d8527854abe7L,0x845969dc6e729d76L,
71549         0x5a52f87ab1bf40baL } },
71550     /* 109 */
71551     { { 0xed019e9109ecacbdL,0x6544023d7b89bdeaL,0x7cc51f0b5707371eL,
71552         0x14832b0416c8e217L,0xb1aa668281259ab5L,0x6e100f9223e361d4L,
71553         0xe593eee9e3a95c2aL,0x699b6bbd16c10e26L,0xad4878739473a13fL,
71554         0xf1c14dc5b274987cL,0x57dc00752559e2e9L,0x8449849dc3d47ad2L,
71555         0x83df278add527793L,0x770e3ec8eefd5b99L,0x2ae5844676bd02a0L,
71556         0x17f027643e705ffeL },
71557       { 0xdda4010d29abea1fL,0x636b96952407ac4cL,0x96a601290433218bL,
71558         0xf221fc3b163d534aL,0x05ba15beccc20565L,0x1238e54d96285577L,
71559         0x1b144257878804d3L,0x96fbf304a89a9fe4L,0xc8a7f06c4be642b1L,
71560         0xdd1a20e86e2b085eL,0x8f7f27c2ff4a591dL,0xc17b0753a4a343b8L,
71561         0x684b1e88bb173d4dL,0x3accea443dc07bbeL,0xdb15c88d4c441d77L,
71562         0x0ef0309a53e5957eL } },
71563     /* 110 */
71564     { { 0x4fc25721fa8e5b60L,0x646938ad691c0bb2L,0xe46d4b760b0a2248L,
71565         0x863f9ac27de16877L,0x503bb6ef2721c630L,0xf8c199df0b67fb02L,
71566         0x78c1ed72e07abd39L,0xcf9deb7bb32f0ddaL,0xaff726f06c3c89f3L,
71567         0xb7008b2d1972225aL,0x8f5a61174f145f5cL,0x4e0e6f8c457c4f37L,
71568         0x8bbdaa441c453c64L,0x57be326da6e92c80L,0xa9bc3fd95d773561L,
71569         0x3d3b6cc6bb37b72aL },
71570       { 0x6e6f12cc9722c880L,0x3a1b6ae7286b6889L,0xba1cc09bad2fafecL,
71571         0xad64ad7a43bb8befL,0xa5af6a0097c3f4c3L,0x2afcb0d9c353a91bL,
71572         0xca13fcab69ccbf6bL,0x699a1391f2abc190L,0x2dbd554223a247e5L,
71573         0xe206180f95488d9aL,0xba9e7bff1244cc3cL,0x29297abe87d3a365L,
71574         0x4054fa38fa4ca5e2L,0xb390623d67be1b6cL,0x1fa67c5778f41a44L,
71575         0x2e946e43c7b544e7L } },
71576     /* 111 */
71577     { { 0x2980fddfc60934aeL,0x2c3e7eff164206d1L,0xf75e7f96416ed75aL,
71578         0xfac60cf35cd0b2dcL,0xddc4bece1faad87bL,0x753fa87c9849e5ddL,
71579         0xc5d516a32c1bf1aeL,0x565dbea814732b4bL,0x007ebe3ace48696bL,
71580         0x40ca74d6cdb97694L,0x3f5cd27065e4e7beL,0x74847c013aac4ebcL,
71581         0x6762e03443d6c3a1L,0x690d8c95467a076aL,0x768d78d61eda677dL,
71582         0x0997ce550181d8c2L },
71583       { 0x9297746c965a0b81L,0x48b58be6e5e12dfaL,0x5573b3c4715f437fL,
71584         0xe425e907b565c459L,0x4f43f5121582797cL,0xe5dafa6f8ea5474fL,
71585         0x2aeb8fbe13de04acL,0xed7f95f0e8a07c83L,0x3e012a6e662c09feL,
71586         0xbf96e9b8c742cf17L,0x8ea5759ae28a1c45L,0x475941b45cf4e2f3L,
71587         0x7dd3c02df901a019L,0xe7a4deea70916b2eL,0x50b272b52fa9b988L,
71588         0x96f9f09fd0917fe6L } },
71589     /* 112 */
71590     { { 0x78e8aac42c310a96L,0x32a98303f7a2a734L,0xc46ca83d23962207L,
71591         0xad131e6ed9541280L,0x5791fc5e2cabe911L,0x50cb77eb841b6c68L,
71592         0xaff93dea3d3c8878L,0x06541f1df1007bceL,0x4ee729c255cdf1fdL,
71593         0xe0f71317323e3972L,0xa2de7a41ad4d08c1L,0xa9912abfa35e22bfL,
71594         0xa050122b89b03325L,0x8b9e51f406514d4eL,0x423c7aad79d3e0abL,
71595         0x71998e2640b8fea5L },
71596       { 0x40140fcdceb6ed78L,0x653cf37718534516L,0x0450b65ae8d60dccL,
71597         0xce6c1a769dac55f8L,0x8a96a92dae05686cL,0x2fe4476212712562L,
71598         0x747bcb50a4f39425L,0xf0ec6ff2fc531fc2L,0xc97c344710fe9ff0L,
71599         0xfb4887839c792cffL,0x552c5248026fb019L,0x4001a29cd804c290L,
71600         0x742b5ad835c8ca73L,0xc3781f176ee5dfa0L,0xca6b85f03dfa4ab1L,
71601         0x8389941a0b0d32acL } },
71602     /* 113 */
71603     { { 0xc0f062a2de067dffL,0xd4f32690bcb80162L,0x98cd990d0707a2bdL,
71604         0x5afc63b8fae4a391L,0x684f1b7bb32ad814L,0xb0a2dce2f199dfb1L,
71605         0x2260e17f48f25848L,0x7393db00c2d5e862L,0x9e88f854338cf171L,
71606         0x0067942902acf522L,0x19157cb86835af3dL,0x2faa6f92b8a2614cL,
71607         0x04ff95f5134ec46cL,0xcf00626efb7a8135L,0x454b3d05b37a4704L,
71608         0x1fbfda312694ec25L },
71609       { 0xfdebb657c8f69c77L,0x92a8278ba3df88faL,0x463b5571c1fb78b4L,
71610         0xd2066a1a11c71a33L,0x10c88143089958b0L,0xb975c7e0cf9d67a6L,
71611         0xdaa5d20873037b8fL,0x5ee5005d40bf5861L,0x300e6ce77dba69a9L,
71612         0x893c3cb3c962cc74L,0x0ac986294cf84055L,0x0a7ef63a225c9d70L,
71613         0xfe184869b91e47e8L,0x1b9d7deb8c2f84beL,0x67788915c0e278bfL,
71614         0x4f9488cac426f19eL } },
71615     /* 114 */
71616     { { 0x610dfcd4dd51b8ceL,0x0857927836230e80L,0xedc7ff1c36599562L,
71617         0x905ead4be2cae877L,0xa1c325d9e7967608L,0x3e39edddbd38926cL,
71618         0xda92c8685f6f0a4eL,0xe16f800af47a0fa4L,0x50b4db5be5f60aabL,
71619         0x3665412f983853d3L,0x64b622509b79789cL,0xea5600584e0e72b2L,
71620         0xabbd4901e555c2bbL,0x378419a717292e11L,0x6e0b5aaae174218fL,
71621         0x688e06848f796b92L },
71622       { 0xcdfef641313b8f64L,0xaef11b7b942c7462L,0x067cfb775c0d8abdL,
71623         0x608ea5f0af4041a9L,0x23d5bd826935210fL,0x5ab904fc27917a08L,
71624         0x85dbb1fe45d22d21L,0xc3d5e5094d36159fL,0xaebb528e1d39b8f2L,
71625         0xdd5ca828f44acef0L,0x24209adf20c57a54L,0x5742b43378f95f44L,
71626         0xd11fa7d9a9337d37L,0xd66a0c09c64cfdb7L,0x56e55b8f9bb817ecL,
71627         0x1723c7e3e4c41265L } },
71628     /* 115 */
71629     { { 0x9a6486d8dc8b43f3L,0xfc3e0e6126409e68L,0x1889c437d9b46003L,
71630         0x3a8503356284ec7bL,0x5a3665c46a9dbaeaL,0x7bf6941de978933cL,
71631         0x1ed5a51069341490L,0x664a7b7a8cb8002dL,0x603f76e460ed0a59L,
71632         0xc3e06ba31f4ebf27L,0x296ced41f2c38a7fL,0x2ac18f79cf1db08aL,
71633         0xc919e882cde7a3b6L,0x15e77d29dbf68b06L,0x21978baa4e947cb5L,
71634         0x84bf542b7630993aL },
71635       { 0xc1decda9e364f21eL,0x0d6cf345012e557eL,0xba246848588f90e1L,
71636         0x9f6dda4be3b104b8L,0x6bf7a346e3aef57aL,0x210299fee8327ea9L,
71637         0xaa99f487da95e6c7L,0x24ff813ed2cdf645L,0xd1dbb2d28bd414b8L,
71638         0x065101afcafa1a61L,0x7d9f4b9a9cdebda4L,0xaf41b395e41039e4L,
71639         0xe3e9e6bac50adf42L,0x4f2133ae341e9e49L,0x4968c0f3cb157f23L,
71640         0x383f827bda068153L } },
71641     /* 116 */
71642     { { 0x2ec46a216583ff4cL,0x4e645a294ad709e7L,0xdc66e9cfc04ca12aL,
71643         0x82f128f49160a7e5L,0xbfb227b1569c762eL,0xf80c7963c2edb8e7L,
71644         0xa7dafe0649a0f688L,0xb7e417542d14b8ccL,0x3a0c5c5386de40beL,
71645         0xf0d052861db79331L,0xb902ce69fbfe071bL,0x61e46956210e9903L,
71646         0xfaef874ef703ebb8L,0xf668947edd5f78b6L,0x6fe865475af5ea3aL,
71647         0x3b121f1543f94625L },
71648       { 0x5b26e847659275e9L,0x47581cfd6d0fce50L,0x55f5cbfd8aa3f1efL,
71649         0x1e7be315e484e60eL,0xd8f1a20ffe9698e4L,0x25d46da97ab04784L,
71650         0xa526db75834cdb3eL,0x1fd408d98d08a009L,0xfc004b205b5ca816L,
71651         0x5b3e3bb365e4bbe8L,0xf50cc125759bb6efL,0xf05fa817c2fac737L,
71652         0x9ee102d2d273951aL,0x2a8e540bfecb3367L,0x673446fb2a6a515fL,
71653         0x5505e1d137290c83L } },
71654     /* 117 */
71655     { { 0x0c3014a1d15e68a6L,0x6f9f0b2664dd35e5L,0x18c3742d03ad67f9L,
71656         0x74818c0ed2c14484L,0xc51811690d41a3cbL,0x65c8c83fc49f3e9eL,
71657         0x9b260c612c279386L,0xf6086faeced04e9cL,0xa7b2ccebfd7c4758L,
71658         0x4b3c313390297fd8L,0xca8264e809701ac8L,0x9f976a87508b3762L,
71659         0x5d582714983a8dfeL,0x350d2669d9d598e9L,0x85cb89cb0f6fd348L,
71660         0x617d80d4a574317cL },
71661       { 0x4cef267e70022b67L,0x80536bb53768b94aL,0x3153a566d2784462L,
71662         0x49054d4438243919L,0x8d11e1725df78c4aL,0x9b252a71d5a1e35aL,
71663         0x07866c808171e31dL,0x0a8501db1b38a00eL,0x2ed932b8ce770236L,
71664         0xa2d776098edaf7d0L,0x3aee5dabb93006e9L,0xfaffc8c4bbfeb036L,
71665         0x077b96784e21b38bL,0x491fc59fdca8e069L,0x3f624f550e938471L,
71666         0x5156f5087cd1780bL } },
71667     /* 118 */
71668     { { 0x58234e220206e8d0L,0xf5f6f5d47f15af32L,0xafab7289d638950fL,
71669         0x66ec4d097d4495f4L,0xad890c5d68da80a9L,0xe4aa092064f8a36bL,
71670         0x799e257e0f4d5c5fL,0x44c677ae24495e31L,0x720387b3a5b8e352L,
71671         0x703790f475a287b9L,0x54895cc5c3c1f2f7L,0xb8680f9b41a7fa41L,
71672         0xfcd47458b00b008bL,0x149cc838ba6473cbL,0x78ed5f7aac9be19aL,
71673         0x5254599cb33765baL },
71674       { 0x08739679a21b54c4L,0x029ece2ab6497d9dL,0xf14f1a92c8488640L,
71675         0xae48dcffe9fa79d9L,0x14b911c246c208dbL,0x5ab0fbf2dae3f69eL,
71676         0x180ac87ed1edb838L,0x146fd718188586bbL,0x210eb6545467cbd0L,
71677         0xaa2394081667cfeeL,0xdb125c1ab73d1a60L,0xde685300881c1cbeL,
71678         0xfe34c71337c30232L,0xc6c6070e6f3c8d18L,0x07e365bab4af4e83L,
71679         0x22f0a7eddcf82b45L } },
71680     /* 119 */
71681     { { 0xe262791fea7f1b7fL,0x9c3d8c5ddcff09d4L,0x86c2a9c339c7dc58L,
71682         0x4dad40174276e8c0L,0x0a918f59e9fe1d56L,0xb8d796702aa810c9L,
71683         0xeb7a88364aa5cdc4L,0xfc4c23bbe7afa72eL,0x4dbb5c9e4ac86908L,
71684         0x37e390136a0c7e6fL,0x855d700149c218d2L,0xe475bc6794b324a2L,
71685         0xc98a8dc66287a071L,0x395a299b5fb4323cL,0xe186c3ee0c0389e9L,
71686         0x79f81e6f16734c46L },
71687       { 0x83f2c1f3364f3c4eL,0x536b2ac51367e14bL,0x44a6dcfc5933e43dL,
71688         0x34e5947510d961feL,0x08234ece7e3f2aaeL,0xcb92e00abdea7f25L,
71689         0x1efba4f0a791a124L,0xc2086fd21192d53aL,0xfec0d0fcb51c8af6L,
71690         0x48d1b2cadc0f1b5fL,0xb07a388f812dbe19L,0x40873a6adedbdd45L,
71691         0xbc2a1268d702589aL,0xbbf6e3a817e27b64L,0x73ee56636d386e85L,
71692         0x442ecd379de7c000L } },
71693     /* 120 */
71694     { { 0xb4cd1ae68a2f90a6L,0xf277d41d6f5ad0ccL,0x6a3828c4401d4b8eL,
71695         0xe817a134d8376631L,0x142b758df5e1124bL,0x25fbc69dfd6b95e4L,
71696         0xa30c9f5fd74a9e3eL,0x5ac0f163d89663ceL,0x32a9eef70ce6386dL,
71697         0x7a690ea5d8ed5544L,0x5de23ff09889427aL,0x75ad36a5eaaced58L,
71698         0x3514a6c1d3e18465L,0x3d9162c37f093910L,0x5c10add9e33d56e8L,
71699         0x85176b7306aa691eL },
71700       { 0xa32110fa28a21e38L,0x97b6379d5773d538L,0xd3697bbf2d020dc4L,
71701         0x59177593961833cdL,0x6d7045fae5fa8516L,0x3390f29a786ab5d2L,
71702         0xac0bda30dc4f5b70L,0xcca0240adcc615c6L,0x8e1f1702c5146d91L,
71703         0xceb472d0a72cef87L,0x848407080b669ba1L,0x79b08f9d7e61aa0aL,
71704         0x388160be4669560bL,0x23935c2d948eb71eL,0xd7fd83c09431590cL,
71705         0x8ab154bb6e5768b3L } },
71706     /* 121 */
71707     { { 0x28686003353c4a96L,0x4e5c60e8905cd835L,0xbd5913648f66f8ccL,
71708         0xb6b80b989faccf9eL,0xbc1c1faee32639e5L,0x2f6396d2278aadebL,
71709         0x00a796d01898202dL,0x18ab548f3a474835L,0xacd056c3b31b0e3eL,
71710         0x15ba68dd0164512dL,0x203836d94b03f3bcL,0xd64eca6bd8f206c5L,
71711         0x931a361e9f1779b6L,0xd82690fc52ab34a8L,0x342bb8e092922e22L,
71712         0x1bfcdd84e00b02a9L },
71713       { 0x310b9a4375a365d9L,0xd4ade15e08d8fb03L,0x9c9753d7d742df83L,
71714         0xcf7309d4de318742L,0x1228e2123360ace0L,0x1043d238f7669643L,
71715         0xfc2adbedf90f5a53L,0x41d64cb77b5f9397L,0x5200b30ac446d010L,
71716         0xc3c8642d231720feL,0xfcc0122db9aa2075L,0x856e3b12041eae47L,
71717         0x4586445568c876a4L,0x1a1c7842233606b1L,0x9b766d1f227757bfL,
71718         0x25b78a3bf7b9d4f1L } },
71719     /* 122 */
71720     { { 0x90835718156707ceL,0x9bdc23984314f90aL,0x017c885a8be57dbdL,
71721         0xd4bba225ad63a4b8L,0x5ce71b8615aacffdL,0x5f26647572954722L,
71722         0x0a80f1f74f0ad3ddL,0x010538a3fc352ed7L,0xf8a640454203c6caL,
71723         0x2b2c7a88330c73b4L,0xb3433ee602dcac1bL,0x2e0499cfed2b17c7L,
71724         0x9f8681a4bd6329c7L,0x3897994636fadc37L,0xdc5650c892b7895bL,
71725         0x70ab957065a51cf0L },
71726       { 0x46778ec47b585d93L,0xca6d3610a633fe4eL,0x21da154e4ea0311aL,
71727         0xaf22190bbd64002fL,0x9e633ac7d91cb7a9L,0xed13c31fee6837d7L,
71728         0xda4a07d71616ee8aL,0xd78a27323afcd616L,0xc06696e5ba14d694L,
71729         0x733754d74df58420L,0xe85e504e2778e3c9L,0x3055aa0c55b5a5c2L,
71730         0x313df5388a3acb5cL,0x5896acb52a088edaL,0xfc8842a084c85ddeL,
71731         0x5fec9f7951dde6beL } },
71732     /* 123 */
71733     { { 0x5ebc2c7cfe519f99L,0xe396bd80e5410353L,0xaded94028a3988f3L,
71734         0x1c03b735d601bda1L,0xfd30203614ce64acL,0x5837ebe901240290L,
71735         0xcaaea1a3a554097dL,0xdce73d25b0b88139L,0x35ed412becb090b9L,
71736         0x99029ff7d63dab3cL,0x555437d9062db071L,0x277d2f5642a4c11dL,
71737         0x477fa64524fc9109L,0x7b12e9b72799254dL,0x7ad2ae22d84c618cL,
71738         0x0a8d5663ce8ed195L },
71739       { 0x43ac51630a21fde1L,0xcfcf5dd66903d849L,0x6d2499ee5fdd6281L,
71740         0x4dedc6f077a49a34L,0x46bda2c02875c06fL,0xd0e0e0f6347b8046L,
71741         0x1058169b5e67836fL,0xc961912ade8a8042L,0xdf3fea0aa93b3d32L,
71742         0x9f138edb0c576bc5L,0x7971ad6ed8d37e47L,0xeab85739cce5e7cbL,
71743         0x88a4b4341d202b40L,0x5d842557e3a1fd26L,0x872fabd5b3a86f91L,
71744         0x95b934936aa4629fL } },
71745     /* 124 */
71746     { { 0x9998a70199f951deL,0x8fade596f058db45L,0x4d479c1ef3d03dd3L,
71747         0x6e928d5d33b141d3L,0x9a465800acfe8a40L,0xd108ad2fc1cefa3dL,
71748         0x64b96921e013726eL,0xb9b6a6b68e83bb9fL,0x29f1e6dc1242e544L,
71749         0xd3f8f6762f65966bL,0xa34dd0965e105b41L,0xd4e9139a16011e1cL,
71750         0xeea4dc682515541bL,0x6f8030acc822166dL,0xbdc7ae1d31d16124L,
71751         0x2e25ef51621afa7dL },
71752       { 0x2533cf8fdd8e7357L,0x333ba218eaceddb8L,0x68e3e31d0784d2acL,
71753         0x1c927f36f2804ae2L,0x01433d2277e7ad7eL,0x0b401cf0587f78a0L,
71754         0x9dfcf036aa0027aeL,0xc9e46c8b1d9a46b5L,0xaa6de4861f288d32L,
71755         0xdd56da2f1b8a043dL,0x346230e5f2d0bb56L,0x19f0b6e419defb56L,
71756         0x55ec37cd21d2c874L,0x3dbf0397b70e45b3L,0xf0862a8dac7ce852L,
71757         0x87979ea7e141f3d6L } },
71758     /* 125 */
71759     { { 0x9b7e7b3f7f1c747fL,0x151a4c1dc6e63369L,0x4273ff70b372dba0L,
71760         0xca6d2234d3ee54feL,0x12fc8e0cd33cae0fL,0x273285385dd6f10cL,
71761         0xc86f3fbdf01a9cf9L,0x5322677fe36cae91L,0x39a700332fefea44L,
71762         0x2c9ca328ce8af217L,0xc0256776f6a731f4L,0xc687b3df66a96813L,
71763         0x194aab128db2eda8L,0xde30dc5aeec4febdL,0xc052236a979241b2L,
71764         0x3ec98802c23d4c16L },
71765       { 0x0f9e760c4072f74dL,0xe78eb0deab594059L,0xdb3dea40c9b009c2L,
71766         0x47e875f038b59ae5L,0xf40eb4362b4daa06L,0x9a6a4f92090f3788L,
71767         0xefebe9afedbfaf8bL,0xf87f96a59867e256L,0x1e6fed2375ab6aebL,
71768         0x17f2782a3fdb13cbL,0x5102c71e70fa2621L,0x5d2b06ecfd4c0dbeL,
71769         0x537cc26830347297L,0x8dbf5e2b2b67e780L,0x2f633f3aba25da32L,
71770         0x3e9315e8efaec914L } },
71771     /* 126 */
71772     { { 0x9255cfa5239a9ea9L,0x20f3c6900be33a62L,0x759eeb4b9cb642bdL,
71773         0x3316c54600bae718L,0x874a76d5f3410f84L,0x123b502e90f129b6L,
71774         0xadc8f9a812851f1cL,0xf57b764a1b62408cL,0x116ec01f1a80777bL,
71775         0x746ecef21f0ddc5cL,0x3c49d47ce5a6a5a7L,0x1e15dbe706e955baL,
71776         0x629c0c79b45d79b0L,0x11278308778d1087L,0x22585dc78c6a22d7L,
71777         0x2ed02a0d0a682791L },
71778       { 0x530434164daa2682L,0x0e26d32b01359625L,0x449c834abd867097L,
71779         0x11a19d2bee77ae2eL,0x39bd529a3af6c169L,0x36cca5c05cd61054L,
71780         0x6370a59bdc6c0fe1L,0xca420d27b93d5135L,0xd8730d45554c451aL,
71781         0xebd258c996cdebf2L,0x0cb1b990a50f9a05L,0x69a8c97a7b0f0151L,
71782         0x2cc36d3411d217e1L,0xf117688a752f75e8L,0x1db01394a09b2a61L,
71783         0x14627844a9efd7ddL } },
71784     /* 127 */
71785     { { 0x6bca3aed232803cfL,0xc1e4398b9a96ff34L,0xcaf6757f74ab788bL,
71786         0xc3a53e007e68c04dL,0x5f969c195cb7cd20L,0xf28b65a6dc068bcaL,
71787         0xe3ca01d31d863032L,0x9b733b8187808e14L,0xb5d704d9efe618beL,
71788         0x276f3542b01b946dL,0xe057e19efbedddbfL,0x7d182f2b903275ceL,
71789         0x3cdc5f77880f7bc6L,0xd6f03d3f78476c14L,0x035f5557a9ba5072L,
71790         0x7acb57b6b4029628L },
71791       { 0xd241356944e6b07cL,0x451c4cc9e1c7345dL,0x407444d8e273b9fbL,
71792         0xfe496079b88e34fcL,0x77d184cff152776dL,0x6d1033b9c742299cL,
71793         0x29a0a68477bf2897L,0x59ffdf10ee8f0420L,0x4e17146c44bb56d6L,
71794         0x831d06c2fb9ae855L,0xb2cb82dbd93e7cd5L,0x83381c463c96b607L,
71795         0x06aed2517549e2a8L,0xef97891c774a21d4L,0xae9807c78675fbddL,
71796         0x6a5a05b96363516cL } },
71797     /* 128 */
71798     { { 0x92e71ea66a8f4f33L,0xf2fc6fc64dea8f4aL,0xd356252cfee88461L,
71799         0x59b0a83e08954d08L,0x5bd68c23468ab766L,0x40281357900f8d04L,
71800         0x181c19c052b867aeL,0x986a516918764c41L,0xcb01dfae13575d24L,
71801         0x17269ae5593677b7L,0xf6d1702546dc9b19L,0x8de68499c40097c8L,
71802         0x76df0032259c407bL,0x4091aad917d29d8bL,0xa7f46d214a7ab5f6L,
71803         0x688054b470ece48cL },
71804       { 0xf0d168aa51a5b86cL,0x2437e4d895777247L,0xae844076f1720329L,
71805         0x0a7ac87d9647a54eL,0x1e597a4b0405622cL,0xedefe5c6f0a79f2fL,
71806         0xaf3ef0c24d55156dL,0x917fb04eef047cf6L,0x3792799f54b62137L,
71807         0x875ea32f314be0b8L,0xe157c65b0c466b0cL,0xd28c90ce7e218978L,
71808         0xb90fc3bacde587afL,0xdd32d71c8b877bedL,0x3b432200ca8e10cdL,
71809         0x0021f419d94f6e53L } },
71810     /* 129 */
71811     { { 0x2191122c43519d26L,0xbdafac1d40a51845L,0xcc6f71e9548bb89fL,
71812         0x9ef3375c16844bf9L,0xe7789f79178e8d55L,0x04f599b61f8be1c5L,
71813         0x8088c99a2cbbde40L,0x8939a260893206c9L,0xa1ae4bfffcd30851L,
71814         0x664cb3fee08feafeL,0x61f38099ff14aabcL,0x0d8394cc2a841ef9L,
71815         0x75fad8ad17f01db6L,0x6fc345766debb773L,0x1e716b05a4252512L,
71816         0x7985588029e1ed9fL },
71817       { 0xa2cb3aaa95106473L,0x95fafa415a61da04L,0xfd3c9362539563c0L,
71818         0xbaa4809195312b87L,0x6c7e7582bf885c76L,0x70f6dab6230c78d5L,
71819         0x8ce3051c7747440dL,0x6dbebd14ffdb6186L,0xb0e041fa190e4096L,
71820         0xba10c4666ee62e2aL,0x93d57e2a74f333d6L,0x006aadc4fe7b9b66L,
71821         0xfaf72f6c06d2837dL,0x318cc5e6910741eaL,0x9c50260965692477L,
71822         0x95d823c31d0fb08dL } },
71823     /* 130 */
71824     { { 0x6aeebd86140528a5L,0xf268c2ba53979bc8L,0xb1bc9b8a4ec144abL,
71825         0x1efabb0d82a7d7edL,0xf12c70d14e0118d8L,0x31607168a1c1558eL,
71826         0x33e428b7e4b7e73eL,0x6317663783aec9ddL,0x5172ffbee12ac35cL,
71827         0x37df0bfbbc17b2a4L,0x4212f870741f812aL,0x3dcecbdbe2888f9cL,
71828         0xa9dc15aa756ca55dL,0xf31918ecb9028e41L,0x7ede02856aeadb03L,
71829         0x0e2708d578654f54L },
71830       { 0x2270cc53cde20f88L,0x9338272c5f5b1039L,0x5042e19e5dcb1dbfL,
71831         0x4b3de219b72d74c1L,0x16c49a8b2aaaaa55L,0x008443e5bba86ba6L,
71832         0xee6bcd7220cf1695L,0x59ffac6ba89abd11L,0x2831217bf115639dL,
71833         0xe4d28af2f34cba52L,0xf27f03e70727a906L,0x6842c79f69017766L,
71834         0xcb3469bd7a81123eL,0x48c0f346a42973b8L,0xfc5784a623990dbdL,
71835         0x0d3dab3bfb299678L } },
71836     /* 131 */
71837     { { 0x8f8376e6ce29c3ccL,0xcb0507ecf016cbc6L,0xdebff9965e394ce1L,
71838         0x24fc526f73c50d41L,0x4edd5a542d16ce3dL,0xbb37bdd991c13141L,
71839         0xe3442ef2e33a8606L,0x2ae90337c0629da8L,0x57faec64592ab331L,
71840         0x1a938997d82b857bL,0xad6c8cb9a3373176L,0x82595de29086751fL,
71841         0xa81e97fb18c17196L,0xe4f48a13bf697357L,0xa1387c2e5cb89f69L,
71842         0x530b4eeb5874b426L },
71843       { 0xe9f275a1bab7b5aeL,0xbb69dc4d03a57bf4L,0xc974dc4aa45c505bL,
71844         0x726369f3416ac402L,0x735e4e78aed985dcL,0x0548d879cdd446a1L,
71845         0x84ceb0699e16b02aL,0xf73f6fa4789b11a6L,0x6aa0c41fb2a4e784L,
71846         0xb1f7690293a9b697L,0x814cce00f03a8ab2L,0x64cb255b844d66c1L,
71847         0xb794e7d630952201L,0xe052d4e43da32271L,0x5278b2e708b6a4d9L,
71848         0x9094255280c6577fL } },
71849     /* 132 */
71850     { { 0xd269a14d0d5b4c2fL,0x2b8fc59b5c8a649cL,0x95becb3ab0e37d4aL,
71851         0xfda1a7689111037eL,0x5810e05a94e35322L,0xa24dcc12a178fafcL,
71852         0x5c2c63b28e3dce62L,0x995c3f179452c444L,0x35330ec342d45161L,
71853         0xa025a60ab4ef8129L,0x854932528bae9c13L,0x25d1a606e2e3caf8L,
71854         0xd44091ab3649bf47L,0xc7d0afbf704ec5f1L,0x27bd1d62bd8b3333L,
71855         0x50570111cfe616f5L },
71856       { 0xd0084acef534356bL,0x9df1de054b4b0fbcL,0x021afe05cee04dc1L,
71857         0x64bde688361b78e1L,0xa324fcc7ef78d38bL,0xfeb372ceeb0a5e4eL,
71858         0xef04fcb365811996L,0x7dce5d505eb0ab4eL,0x1e29b588238c586eL,
71859         0xde5e3197bcd80037L,0x8bf5e4514806b9cfL,0x4330968bd18e67abL,
71860         0x26a7d04ef9f63fadL,0xa1c7f123b5c18bb4L,0x485b848225dce22cL,
71861         0x8ff0b36fd540e79fL } },
71862     /* 133 */
71863     { { 0x99f2e2f43ff42cffL,0xa3c19f9d1c35317cL,0xdb749392aba1b545L,
71864         0x84232b054afa9a32L,0x0b855d46d7dcd436L,0x8ac35e2045cf9915L,
71865         0xd7cf22c7f001a218L,0x057d35aeed408305L,0x25a4a519553ccfcdL,
71866         0x5e56579393e2b939L,0xa20332b03422ec27L,0x9b09005e3ac53958L,
71867         0x628051a379e9b163L,0xb4a0dc09fc6618d6L,0x9e0e857f6748e7afL,
71868         0x71b28eeec577d63eL },
71869       { 0x4942b0cd99726bf8L,0x1290a3b91c208f3cL,0xfd7290e7b0598eaaL,
71870         0xc6a7791fa25a9128L,0x2d33db24c037d7daL,0xc21efeb070e2837bL,
71871         0xbf70d96ee3dae2a0L,0x43ed819185076027L,0x4aeb0aa84d4ad7e3L,
71872         0xbc75101fe8c5b74cL,0xdbfb2a6ead26ebddL,0xba8120686b78aa4eL,
71873         0xc94aa8f2e1159848L,0x0d10d9db3eba5c4eL,0xce7fec476318295aL,
71874         0x7294711a330d925aL } },
71875     /* 134 */
71876     { { 0xfce4590432bbd495L,0x330f4dd1be54973fL,0x006bee1d5d9c3f4eL,
71877         0x40ee607859ba7204L,0xc194fd3f42c2c768L,0xa0e76b12e9fe88beL,
71878         0x17cddddbec2b0210L,0x689d436b00811ec7L,0xa6a6ba37284be9e4L,
71879         0xabc395b2007d4114L,0xf8cdf9f30f11e744L,0xc5febec8e9396402L,
71880         0x8a751743eeb46285L,0x99bf8782c6e0d137L,0x3965e170beb292e3L,
71881         0x001c39d85801fd5fL },
71882       { 0xf4805cb9da4a0912L,0xd27cb76a4410bca4L,0xef3dcb8eec71d65bL,
71883         0x780fbb2b4816849aL,0xef6a7026a8b24635L,0x15625c8812c44e68L,
71884         0x624c232c4d7a74a8L,0x81a770374b1631e4L,0x04e4f7f1db917c2eL,
71885         0x1d0465fd1f61ed95L,0xb1048049cbde6e3dL,0x637ce0c1d7131fcfL,
71886         0x22e4dbc28ada4715L,0xf7530c5cace99726L,0xa0160dccee287450L,
71887         0x9132e670bb91af13L } },
71888     /* 135 */
71889     { { 0x8057efe27996099dL,0xb72344dba06e608cL,0xeb4a8740d0958588L,
71890         0xe53daf0679e5aee9L,0xc9560a9a908a2fadL,0x7f4be131107e706aL,
71891         0x6d5f3d9b2830246aL,0xa5f8e8da27cca3e6L,0xeb51dca64c28f292L,
71892         0x4cfa310ef31dfd78L,0x92e0c7c22ca073e5L,0x102f1694a40da683L,
71893         0x16bb07cc750d38fcL,0x703e83e2badae035L,0xea93c066b4d3c9ddL,
71894         0x7d0b03e579940ed1L },
71895       { 0x5fe7ea304dd94c63L,0x57ef01c5738b0b3aL,0x9534a78ca14e6b4bL,
71896         0x07622cdea5353276L,0xaf696a077c22d006L,0x733c18867d46b209L,
71897         0x9654ccbb626c2b4aL,0xa098d3a1a84f3c4cL,0x3596f9ed2d734b74L,
71898         0xdfd3021a5d551c90L,0xe2ba7d2f1ec5123fL,0xf9726925b2c1aa39L,
71899         0xd2e75d0ef8eb2927L,0xfaba712e19192a6fL,0xa606b43a9b83e50eL,
71900         0x31b1782fdab5de60L } },
71901     /* 136 */
71902     { { 0x878dba454034db92L,0xa39779018f34dc4dL,0x8d004f2edf754c33L,
71903         0xeaa5954acd563a88L,0xa29d6c89bb5ffad1L,0xa8adf655b0d8bdb8L,
71904         0xf7fb842d8cdbdb47L,0xb72e3a0380d3205bL,0xc335b0b27cac7ca9L,
71905         0xffc60bcbd8a5475dL,0x736f7719eba4d25fL,0x3d901c380c50fca6L,
71906         0x1fdacf7b80c01900L,0x75cf658f5681f84dL,0x57a7e6345cefbbc1L,
71907         0x6fc0fbe53e07ed1fL },
71908       { 0x496d116bb81b0e5fL,0xd82dd2a52ac853b8L,0x357e22d4327387f0L,
71909         0x3e332a84ba912c59L,0x8b71c64349d5dcc1L,0x0c982ee9438d85d3L,
71910         0x90b9553cbf7fcd4eL,0x2cb39bbc38fed5e3L,0xa2c67c9c5ac42903L,
71911         0xebf21217bf07da55L,0x55ac05ada0b9e4eeL,0x10bb12c28ee9e0c6L,
71912         0x5cf3aee548bb6e3fL,0x4ae7269c8b046e91L,0xcb266012aa0e553fL,
71913         0x701935a1a94c8fc8L } },
71914     /* 137 */
71915     { { 0xde58d41da4626deaL,0x25ef66ca15b9039fL,0x99a810a43164e65bL,
71916         0x9fe6daad748cfccfL,0x7ab9a6bd2f142fa9L,0xa4cba1685d471796L,
71917         0x12d30b366bc3a39bL,0x1f46a5dc8bf45076L,0xb868e5291421ac0eL,
71918         0x7a68620659bba1c4L,0x2b4b552eda698b90L,0x5039dcd4e5453707L,
71919         0x42a07a9e9e90165fL,0xa838fff3d7d45dfcL,0x41991e5a3b5ceb30L,
71920         0x6c961ec8969ca600L },
71921       { 0x703bdc1bc4e7eb46L,0xd6bac557596c7b48L,0x4f9917cd66afd74dL,
71922         0x56355105656ce6f3L,0x3d1fb50c32497175L,0xfda6783e63effb2dL,
71923         0xbd79f1f3eefaa2bdL,0xa4efbe5417af9ef7L,0x6cef64625a55b7a4L,
71924         0x116f32381a713304L,0xdb2a2a7fb95625a3L,0x6a0aa43a0b027e96L,
71925         0x458fe5d24832b3bcL,0x523418df5adfaac0L,0xc05a89cbc49e7f9aL,
71926         0x830883d869e24b53L } },
71927     /* 138 */
71928     { { 0x959b1c6202557389L,0x5fe5ce97adefc0bcL,0x893bbe7f8330f383L,
71929         0x27e0c6af16cfb81eL,0x6f64e65bd04428fdL,0x53de9245b79e6182L,
71930         0x08a313c1487e11caL,0x65cec3b9445bce93L,0x33bc0314d67ed49eL,
71931         0x69f36b2430782352L,0xd78e5daf93ad31d2L,0xf2682b70c780890cL,
71932         0x7015c34f9e45efe9L,0x135d4ba4e6cbafeaL,0x43a378a47e3fcc6cL,
71933         0x2376f97f96638f8cL },
71934       { 0x0a6e1ec0ae575b99L,0x7e14cb4f81b970dcL,0xf00a3824d3a73947L,
71935         0x0b4b9c81fb235a9dL,0x8d15115f5bf62944L,0xcfd35b431e165d7aL,
71936         0x5d12fea2b2ee3e3bL,0x629984a6f5182e7bL,0x4e43e2f3c365d08eL,
71937         0x9932709130f36e72L,0x698b4a00fd345401L,0x23c4fd0ebaf96dceL,
71938         0xa60ba0ae23675554L,0x51bdac2db0325784L,0x8ab4190a215464a1L,
71939         0x8c4616616bf10296L } },
71940     /* 139 */
71941     { { 0xeffca2582d1f36a5L,0x0eded2b2894c5f2dL,0x35a5cdb843ced84fL,
71942         0x290f8982db0e3b9bL,0xcce0eaf00719a112L,0xd0e657e439a362d6L,
71943         0x5516a55d62697e47L,0x269e1f778e636514L,0x5e3dedcbd50269bcL,
71944         0xecec2300441c57c5L,0xdb83f31cc705578dL,0x1bdefb731e489eabL,
71945         0x20b678cf395fcdb4L,0x908cf91cff9db001L,0xcbebc6f455f52cc8L,
71946         0x155ea622b4c61162L },
71947       { 0x94be2f1f876fa42eL,0xab5e87497fadeee7L,0x692e70f538c865afL,
71948         0x16e99b84df8059b0L,0x0ceb606e8b5a7ac9L,0xced233572d463d2bL,
71949         0x2d0f26232a9a09a0L,0x2529998c3861fbdfL,0x711888a7c1be310bL,
71950         0x9b1229c50d8aade3L,0xdbcf9b783b13533dL,0x3ca746f8ff029708L,
71951         0xa5a013a1da83ef88L,0x8e904d184ab28444L,0x2fe84b3dbcbd4abaL,
71952         0x8f570f24259058c3L } },
71953     /* 140 */
71954     { { 0xdeb66c8a2ca9c508L,0x2dc5bec269d6b780L,0x16d6126688ead600L,
71955         0x61841b9749d72614L,0x41e40e6cce472e6fL,0xada242641fa7a876L,
71956         0x45b9fd33cc3997a0L,0xb25e8fa97c15dcf4L,0x0124ceb212e9629dL,
71957         0x3a8c72c67db3d956L,0x8e2ded2b7c1a7844L,0x94ab09c66dd027ffL,
71958         0xf89a057d7e7a2bc6L,0xad8bf226cf70c763L,0x4cb268e7c8a26212L,
71959         0x3d171e87b2c44c1dL },
71960       { 0x382ac16e8ce49820L,0x24ee45e2c0c44dc9L,0x0ec6791273e858c4L,
71961         0x918cb25c46327cf9L,0x43e3876bc6159c1fL,0xb6b6e0e037545cb3L,
71962         0x64b839ab5d12347eL,0x72e09274a300d541L,0x26ab28e6881c1169L,
71963         0x4a580fffeb75a843L,0x0a5802ca359120dfL,0x7fee82d03209f4a3L,
71964         0xb518016b8e6a9380L,0xb99c6c70c2ee11caL,0x16105af1ab9d4ec7L,
71965         0x234e98f834cd9004L } },
71966     /* 141 */
71967     { { 0xff43520814db9cdaL,0x99cfdc4796adec90L,0x843aaa6faf458b6dL,
71968         0x3f1f7415743eaa31L,0x915e192e61735d81L,0x3441a22d0ac595d5L,
71969         0x704bbf67c044bc8dL,0x2f960471be23a236L,0xcc32638815d1d557L,
71970         0x9410230b76b1dd94L,0xf2e5439f0c1c8a67L,0x56b141ac833c910dL,
71971         0x467c999f865b84dfL,0x1b0251fa21f02b7bL,0xde5b526096216950L,
71972         0x6a2130e3ce3a1e93L },
71973       { 0xd21b67a04b3ca1a7L,0xaf42ed5300c0ce80L,0x22ccd368932cf07aL,
71974         0x36523a815c25c35aL,0xecdd39588dd04d06L,0x73da3502b2f93a3bL,
71975         0x4c5e0c3cd5e5b530L,0xef9f548613268777L,0xed87fefc1e742292L,
71976         0x6d9ac29ea24e5edeL,0x08abc9f033849f1aL,0xb09b229240f23905L,
71977         0x6791072c7f934353L,0x102a6381e6aeb550L,0x3ee0740996feb870L,
71978         0x34f06faa9c4d2830L } },
71979     /* 142 */
71980     { { 0x869dc79f2348f005L,0x9b5c5d71df4920b1L,0xfd1b57ca6dee64a4L,
71981         0x21b7f734e82a4fb4L,0x637cb834b9578366L,0xc934101b7d287d96L,
71982         0x1590f8ac0392ecabL,0x280dc3737f75f4e3L,0x8b36f50f6a61ac62L,
71983         0x74f58304a65568daL,0x80d792a9d930870aL,0x6d17b192fc8895ccL,
71984         0x498392fa4914939fL,0xaf36027dd41d5b9eL,0x452d79e25caa82b5L,
71985         0x764d47b1f4115d1aL },
71986       { 0x5df22303a2ee8b9cL,0x1b9f72d385dfcd48L,0x6b42b98310813a37L,
71987         0xe28c523b3de741f5L,0x0857625af303bb5bL,0x926f299aac9bf9afL,
71988         0x21beac080d445b34L,0x6a523a02d6ba2c0eL,0xe302a1b17fce2864L,
71989         0x4516a235e300c1eaL,0x4543736a7b4a9311L,0xd3c0b9e8c0cc89f7L,
71990         0x0481904f40ed88deL,0x4f269b563cb7fc70L,0x09a1d53a321b9738L,
71991         0x1c0dd9c3230a3810L } },
71992     /* 143 */
71993     { { 0xffaa1f67c46a7d9aL,0x64743334bedf91ccL,0x45833a7447a42f2eL,
71994         0x67980051241ffaa9L,0x70979a84335efe6bL,0x5f0613f5f08b2403L,
71995         0x6bb22fcd64f211dcL,0xe1b8b2a3a0572cfcL,0x19e0eb417950a14aL,
71996         0xe634bb293eb6cd4cL,0x31a04b25470a25ffL,0xa41f7ac9a3d15a0aL,
71997         0xefed85ecbf2fede9L,0x1f581f5f81b94a00L,0xaa3996b09ef4a15cL,
71998         0x52d8be39b06041bcL },
71999       { 0xbd1536f6fd631a2fL,0x91fae7f0b351a8dcL,0xd1a590c79b126212L,
72000         0x52d4875f2bd0f435L,0x9aedb6d392b0ea70L,0x0bd0abdcb83ab89eL,
72001         0x827a106289fe192cL,0x6566a960102a0bdaL,0xda083037ce036814L,
72002         0x30bed79f58639405L,0x972019b6dbca8df9L,0x89201286efdaa3f5L,
72003         0xb337b9965236b892L,0x11d3e38e28fc2e73L,0x70787f41880e8da3L,
72004         0x6cff6367dae4a45dL } },
72005     /* 144 */
72006     { { 0xbd3d0433f89a8bb4L,0x42144c3393b98f71L,0x82b616c803470a2dL,
72007         0x98fcc757e5da089eL,0x542354ef7bf5fda6L,0x1885c2539ebd34ccL,
72008         0x2e20b285bec5dd0dL,0xe71bbbe1782a1bcaL,0x959ded309b854ef0L,
72009         0x172499798997fa6aL,0x50cf8fa8d81f3c45L,0xa9a3b51760c11152L,
72010         0xc9b0ef7decf845eaL,0xc9339e23b9fed11bL,0xc93e9c5c28256080L,
72011         0x1d2c8217613ec1e7L },
72012       { 0x7381347d987cfc93L,0x047603bbf187f810L,0x3fa6bc9d1250ca31L,
72013         0x480091e0bb055bf3L,0xbdf95f1a3a3af87cL,0xe2687770140540abL,
72014         0x998df730d7fe045bL,0xb398135fb723bc2dL,0xac230f8c15ebec46L,
72015         0xe08e18305f5561c0L,0x7c0fbf4cda60a47fL,0x06e95c24e16d4bfcL,
72016         0x7416349574617e92L,0x397198694ae0c20eL,0xfe2693122131e2b6L,
72017         0x25486e360a537722L } },
72018     /* 145 */
72019     { { 0x618795ca53572806L,0xb2c89449656968e1L,0x149c2c973fb323aeL,
72020         0xfb15de26409bc7d6L,0xa90cda72c79121b3L,0x6d2fa14e204cabbbL,
72021         0xcbcda6f791604125L,0x25086261b435f947L,0xdb686c38c282eb10L,
72022         0x51016d62f1a791cbL,0x6b1c7ed161a2266cL,0x26780666271d74a6L,
72023         0xb5ffeda1824287a4L,0xcbe503ffbbe4f0f3L,0xd7f7f0beb9482a74L,
72024         0x751b2358088493f1L },
72025       { 0xd597b9d6e9c9be68L,0x1794b5c467d10c6cL,0xa88cdc3d7762b2f4L,
72026         0x6d94a63aa1b44e11L,0xfb0bbbb9aaa8eca8L,0xf4b0f2d0c963d87fL,
72027         0xb753062c5dc7075dL,0xfed726ac49933989L,0x5da6063857f9ccdeL,
72028         0x221c392a75f8c766L,0xcd264d955dc672caL,0x7004ff22b66ecc8dL,
72029         0xfb1aa9ae18a458baL,0xea9644df8babd653L,0xa9378e802ba0de7cL,
72030         0x144cc12dca2c6c75L } },
72031     /* 146 */
72032     { { 0x593a0a1d2989aa3aL,0xd83f228359e6e64dL,0xe938b0cbd32e732eL,
72033         0xf4c464c53c3cb249L,0x9750a5f8f89ea6acL,0x467e5bbf346cfc32L,
72034         0xc9bfab9d37b2b809L,0xf8eb74533b339c6dL,0x3fe01fbe3b766deeL,
72035         0xb3154254ef6aea27L,0x555c3df27be61b10L,0x70fb6d81dd818488L,
72036         0xda1af3a4bbe714f9L,0x575f20179d18f693L,0xdc08fc6b2465b839L,
72037         0x874ecf336b84a951L },
72038       { 0x624af83ebbb3f6beL,0xf578fbb908bb423dL,0x5623b0bad7873527L,
72039         0xc3659bd8a62e0442L,0x2903b167fe236f79L,0x55a430c6e53f26a6L,
72040         0x222547ae3ad712cfL,0xb73890d776eb272bL,0x95b4f70b3d628df9L,
72041         0x9f0e13b053eae4acL,0x5b4f5138e7f2174eL,0x75482cf998dbae17L,
72042         0x2b69bbde44518480L,0x4f279652cafef15cL,0xa0a3ef2bb6bcaf19L,
72043         0x31fb8581ce4c634fL } },
72044     /* 147 */
72045     { { 0x398306d1615cd607L,0x680c9faaaa32c3a6L,0xe87a705b7779131dL,
72046         0x1031013a36708b00L,0x814fa0e19445297fL,0x70c5583aa6a79b56L,
72047         0x03039cbf4b16bed4L,0x18a7ca8daaaaf8d3L,0xf33159e75cdb68a5L,
72048         0xdea0e738d23814faL,0xeb3527188d0f4f9fL,0xb0b76609dcdff032L,
72049         0x65ba8ea93d48338bL,0x18044d8255dd507aL,0x844a223e4a4a50b4L,
72050         0x9832300018e19e54L },
72051       { 0x28a2102757f3d5a6L,0xffce56486e8cadcdL,0x9590381b02551f3bL,
72052         0xb26cc64f935ebdf1L,0x60611291c083aa6eL,0xcd988a6688e4cf41L,
72053         0x581c3f73dd53b1b5L,0x78c804a977fc621dL,0x31874330fadca2faL,
72054         0xf7008da4c83ccf02L,0xc4122a1da79a4707L,0x9a8e0d3f4a915eb5L,
72055         0xa2de157dd0123660L,0x45ef43b265ead2a0L,0xd0a22ade188db285L,
72056         0x8abbe39e922e0caaL } },
72057     /* 148 */
72058     { { 0xb44469053a2d2f01L,0xd27c31935dc6685cL,0x6a908bbf1d74a027L,
72059         0x01da350f5b50ec1dL,0x1d3dd45e3f3c2e26L,0xf66e11d0b836ee92L,
72060         0x7e03908f474b979cL,0x19e7c5b998b87834L,0xa741d3febd3d1de9L,
72061         0x63c68e8d1ef6059bL,0x9b9ff9393674e247L,0x1d7d53e73e7e67f6L,
72062         0x698dc326aee9e248L,0x52f23edab3bd984cL,0xf95e31b06f8fe8a7L,
72063         0x0f15b4d0c3d0ba95L },
72064       { 0x8f2f6635790a8d85L,0x51bffbaee2595af1L,0xd15b7ec624b51287L,
72065         0x7639b6ab3234715dL,0x0cdd52992bc5441dL,0x54800ea4f6d05833L,
72066         0x21efd752f6d6e360L,0xc0b7ffe519290613L,0xb68a5825eea898cdL,
72067         0xecedba9222982266L,0x678a91b0bbd06bb2L,0xb2436dc04bb6b0cbL,
72068         0xcf7a99e7caf8ea98L,0xb92d0e6e71aa05bbL,0xbf8d0471f5993eb1L,
72069         0x515db37820385ddbL } },
72070     /* 149 */
72071     { { 0xee43eaaa6f5bef22L,0x952d269820348712L,0x1e4c484e7a3af6c6L,
72072         0x18d434c69a8c9403L,0x63e5d7415001899aL,0x5238dbbcfe8ea40cL,
72073         0xca6cc8d296798721L,0x73db6aee04acbde8L,0xbf69328db7f993ceL,
72074         0xa3f79bbfad45e334L,0x8c51ec937c1f1630L,0x4907325f9b00a6deL,
72075         0x49e6acb412d82bc3L,0x5901b36d0ec59fc9L,0xcb09b7109cf34e3bL,
72076         0x2de0487e1abf4c02L },
72077       { 0x18b722f38dd9d484L,0x833493937c77baccL,0x58dbb8f193d92b8aL,
72078         0x80d78d508e3fac25L,0xf0500981745f4a7dL,0xd072bfed877cc29dL,
72079         0x67abf8f2c30a89f8L,0x92c567ea9a0820d7L,0x425ab12e8a3a5738L,
72080         0xc162faebf055521bL,0xee1c4f26b94ea5e9L,0x1e4149943d71e546L,
72081         0x258183b843e8be1dL,0x44917c82ef9eae0bL,0x6813a45773874a30L,
72082         0x6f6ac071cc42f86eL } },
72083     /* 150 */
72084     { { 0xd38822ad4dd6e3b1L,0xfc78e1ccad620869L,0xe78438452cacde80L,
72085         0x121cc14aa8469fe3L,0x8e8f3da7e67e8ef2L,0xdb83d16e4d347448L,
72086         0x3ba1dd98798631f4L,0xdfab59770a4c4c17L,0x1f0a13063edc701fL,
72087         0x4649d6016cd8ff28L,0x2267230bbcc55bc9L,0x02a19c605760412aL,
72088         0xc719d5f1328faef6L,0x27cb969ef67eaad9L,0xf342530e719bafb5L,
72089         0x6e2c24ccff5a82cbL },
72090       { 0x6313024badaf8793L,0x944bccf1035c948eL,0xe9a066b7953500bfL,
72091         0x7991a9461d116765L,0x95addb2e9fd93c78L,0x05d2c037e92e5495L,
72092         0xcb145b189f03e5cfL,0x81ae48ca95aa1f72L,0x203f2702135a6e4fL,
72093         0x2bcef5a249b2a7d5L,0x0687a90002d7f2a3L,0x2f7d32286c6745b0L,
72094         0x3da8a87586507305L,0xbe38b8842e8dc58fL,0x6b48bf34dbf11185L,
72095         0x5af7fd0d97c08f91L } },
72096     /* 151 */
72097     { { 0x55f9b950f4a224a5L,0x41904574cc50273aL,0x34f81330643f1fd5L,
72098         0x996801bb0e50f783L,0x866d740389581712L,0xdb9a405da4091d36L,
72099         0xf1e379df16a46fe7L,0x8d04a93f83bf9168L,0xae4c833532b20bcaL,
72100         0x99d334b1f72a1c10L,0x8fbc9977d8195db4L,0xcaeb3dfffba14b5dL,
72101         0x60fef02276daf476L,0x4b948dfedb5b72f4L,0x5185c925b6dfb062L,
72102         0x27a9c3819609d4aeL },
72103       { 0x73c37346f12a93afL,0x028b707c5536634dL,0x8efa58d5498193d1L,
72104         0x4f83a5ccef21b69dL,0x05cbb0a3a788a0e2L,0x0103178165b13c98L,
72105         0xfea20e582b73784cL,0xdf9713a0e50361f2L,0x31449a0fd0cc22d9L,
72106         0x183752e77c5e2e1bL,0x6e44d6bdb67044cfL,0x012dde95733e177aL,
72107         0x68b4966908ee2c23L,0xd9bb05411f5f1949L,0x95182c716acd886fL,
72108         0x1c690694fbde9244L } },
72109     /* 152 */
72110     { { 0x5db67d173a880026L,0x89c4f0a0125d95f2L,0x290505513f6cb7a4L,
72111         0x3eb231d15cbbdca5L,0xf8cffc99972bcbd3L,0xcb4ef4d4ad55a03aL,
72112         0x944d47ca22867c2fL,0x96d885480ead1aa5L,0x76a57cf8cbc8b045L,
72113         0xdfe5844b005e55a0L,0x5e9e7e191d18a097L,0x957a26e852923c74L,
72114         0xd0867b797f5db339L,0x2553408e63bed0c8L,0x1596e5d5689ad23cL,
72115         0x7b8c13d6a504c339L },
72116       { 0x2fc43aad52fb6901L,0x1c0313f916ca253bL,0x1475830a515aadc6L,
72117         0xc93d19267f577dc2L,0x26e52e8ef723c0ddL,0x2f1e0eb83eb9f6daL,
72118         0x9979de82f180376dL,0x43e28ecbb0834939L,0x9a2d51dca39c38e7L,
72119         0x6e6063a9a8e3f6b5L,0x4cf1da3a4b9b3270L,0x6e5348a2d2f8915dL,
72120         0x5e75e3e050507912L,0xaeffce5720d383faL,0x1d6d53cc8fd2fb29L,
72121         0x0e3c3ef6696f4cd0L } },
72122     /* 153 */
72123     { { 0x3bc337c121ee1d83L,0x97e08f6d787b7788L,0xbf709fcc138fa4ceL,
72124         0xbaf77647a0348e58L,0x04f8babca55e672dL,0x0ed2919d7d5ec5ddL,
72125         0x8ce64bff33e99218L,0xac09fc5724b059afL,0x506831f9dc5e32baL,
72126         0x26a22677465af6a9L,0x3c5efe66c97f1ff8L,0x1515e0d6bc6087fdL,
72127         0xb1a39c5eaa8edc6bL,0x3dd816bb0e79ed29L,0x6cc13769bc3788b8L,
72128         0x463098e3c092a51cL },
72129       { 0x3a6408c7c8bd0fa7L,0xd1764311ce6bde49L,0xe315e108283ef7beL,
72130         0x8213cc7799b5d938L,0xaf7f158145a49a6bL,0xd00fdb0fe529e4d1L,
72131         0x55d38f77ce66c9d6L,0xb4f7ccc01bd4b952L,0x8d975b49af71f986L,
72132         0x12b59fcbcd64d00aL,0x1860e504a5a3bad7L,0x6d9760442b5c89f1L,
72133         0xfed0c6597a3e231fL,0x58114c33178cba92L,0xe2e74c066698e11eL,
72134         0x7f8fd093a348b85aL } },
72135     /* 154 */
72136     { { 0xf24592cac19428afL,0x192a1c813a308665L,0x42589812e30bbd7fL,
72137         0x10db0723836c6bb9L,0x9c7a41e9598e4987L,0x8aff179e6ead6f4bL,
72138         0x70f8f9b975862c44L,0x6b3b02376f21983eL,0x25d83e9b98e65152L,
72139         0x3b2d26a8d751218aL,0x9508281a9d6f1da6L,0x8df78d05a5a81f74L,
72140         0xd79ee559e4687471L,0x2060ca576787d8ccL,0x427a84ffa8476c95L,
72141         0x87b64c51e6435131L },
72142       { 0x87f46f654b30d3c4L,0xcdec4c5c23b4ef14L,0xb3b7476663ca4d68L,
72143         0x1df34269cf3fb56dL,0xd4f139c40fd7d46aL,0xa3b7c7c76a69a8bdL,
72144         0xee56b4c9cbadd7d2L,0xb28ff342ac942334L,0x0046fdfa786f1da3L,
72145         0xce5d149cb700c82eL,0xca30ef8150966597L,0x44a20609fcff4bddL,
72146         0x0f2f65e744925268L,0xe5b6552cd4021f38L,0x77ea9c2a042dbbd0L,
72147         0x8c95267cd9c062f5L } },
72148     /* 155 */
72149     { { 0x6655032e5fc1abb1L,0x2215af5412fe4743L,0xfd65756029f05ef5L,
72150         0xb0e73325dc191be9L,0x7ab3c65ec08639b0L,0x67507f511c3e6673L,
72151         0x638befc3c8615555L,0x5d0188cf42f0c4adL,0x843a301cd896186dL,
72152         0x045603f7b2c6741eL,0xf7545c0cfa3cd1d0L,0xf612affd4a40672eL,
72153         0x56197c9f45b9e8ddL,0xb453237d87922d74L,0xbf132e3a4b2d59bfL,
72154         0x8afa1b73b84a6a16L },
72155       { 0x6b3596eae793ac70L,0x4c94ef8eeef6dd10L,0x926b4fa270422e40L,
72156         0xc8c71dcee9e5d763L,0x352fcb70f512aadfL,0x1b7ba138a883975fL,
72157         0x57991390058c3b13L,0x9692092a97740fd1L,0x19ad945b160b0697L,
72158         0xbc63438810837ab2L,0x76ee11c4f174bb71L,0x6111bfc1ab1b80ebL,
72159         0xbc82bac870ec458aL,0xeee60127312d3325L,0xb4118b1ab240adc8L,
72160         0x672111912b5a093cL } },
72161     /* 156 */
72162     { { 0x91e99306f55cf9bfL,0x9b045308a46b96d9L,0xae3c1e1d9e7a65dfL,
72163         0x453cb151c731bcbbL,0x14be5227a4d58a61L,0x39dac92297c74cc2L,
72164         0x4d0f7a45822e00d6L,0xafeb1d51c62b03dfL,0xbb1dc3a4baa18b2dL,
72165         0x7f3c7178df2b74f0L,0xfcd328a6896b6a33L,0xe95ed4541dce055fL,
72166         0x97fbc76b6a4e2b87L,0xe5ec67f1fa59dce9L,0x052368accc0367c1L,
72167         0x7c86391654e4a3feL },
72168       { 0x55e94b5eca7388cfL,0x17cc0a60c0335d38L,0x9b69b78b616f85baL,
72169         0x705d02ef10122980L,0x565a6e801cfd0a79L,0xeb74a96d7d1ee352L,
72170         0x5c8832ed427b9dadL,0x96ea8528e6d5330fL,0x30d8862b18d24ee8L,
72171         0x9cd38ed59ff939f7L,0x690fc9a201060252L,0xc62d88b82303b3ffL,
72172         0xfc42d7a4dd52b469L,0x06f8dfa28cad2d93L,0x5023609060920438L,
72173         0x32582758fce855adL } },
72174     /* 157 */
72175     { { 0xeb20e45f359e8c60L,0xc71bb8a5364ca186L,0x02b15071dff8e110L,
72176         0x074e91d34c93e578L,0xc0326e00b829d0d8L,0x3c192258626a83faL,
72177         0x387a64d5fb29a09eL,0xcaaa3d34e5ac5c82L,0x8ed685e5ada2da29L,
72178         0x92720267eb29650eL,0xf7184b19763802f3L,0x23f5dd0edf6b1aeaL,
72179         0xbe1fa34725e6125dL,0xd6287f9d0c872a1aL,0x49aa93d2ac57c3afL,
72180         0x1a4e6a715bda7656L },
72181       { 0x1a126ede554d1267L,0x37f945331cd02b48L,0xd70af04cce31fb1dL,
72182         0xcf410b0b097dc012L,0x930e1d1736c7b6c5L,0x902fee41c6891085L,
72183         0x349ba4a779fb638fL,0xa16c5821acd6f8dfL,0xfb3b83c12e076aceL,
72184         0x6b8d033be501d14dL,0x0593d45220f2d2daL,0x3752526d99df1880L,
72185         0xca32351c9feb33a6L,0xd91343bc1f6ef456L,0xc74857db35b9dc8aL,
72186         0x856a7c9385b4e832L } },
72187     /* 158 */
72188     { { 0xa007d0020d0a5583L,0x2f1301ddeda4658aL,0x91c0796434d939beL,
72189         0xa0cb6780a70c0836L,0xc0b4df95be81e540L,0x6cbbcd345d4ac8b8L,
72190         0x57c52ed054756239L,0xcac2dca41805ceb6L,0x915ee6ab79344255L,
72191         0x366def3124c9a2a6L,0xbd3b962f8c12c674L,0xaab64f1b7dbb7c3bL,
72192         0x3c0e4553e22bb95bL,0x2408febac4c63b74L,0x3ca773122a4da631L,
72193         0x62889084c636da40L },
72194       { 0xa457fd538cb8d208L,0x7a8f8009543f06d4L,0xb66de154f2eff2abL,
72195         0xfddb28ebf72517e7L,0x0149fe66f9389d2cL,0x79e8773fd85b88ceL,
72196         0x452e090b0ba543f7L,0xdeb9b5cfb0b03fc0L,0x3113448a6c5ed77bL,
72197         0x3609f3cf8ffc0372L,0x2bc9c46d5c1b4c4aL,0xe66f3bf38fa59be9L,
72198         0x1396bf5fcdb02691L,0xf1ec59d4009f88f9L,0xc29034562ad9dfe3L,
72199         0x79d8122c5ada4d58L } },
72200     /* 159 */
72201     { { 0x14d4e4ceaa529507L,0x056a081474655d00L,0xc0d30a384f0fc474L,
72202         0x8a8203ea3443cb8eL,0x33c62fb097f1728dL,0x8a38dcfdb520ef52L,
72203         0xa0f90d5d7cac9d3eL,0x28a7b0bf873cea50L,0xd115ae3a6c6c41cbL,
72204         0xa35171daa13812c1L,0x25d4bba5624d507eL,0x91dad2897e98f42fL,
72205         0xffd6b1e996a41371L,0xd46c2125b69e5b77L,0xc7d2b42420c4f707L,
72206         0x2ab3af958142557aL },
72207       { 0x86ca074c6a5372a6L,0x728fb83e56292ba7L,0x745596dc77741cf5L,
72208         0x70b4cea1520ef49dL,0x1472fe3461e46472L,0xf4d6bd663fb8ac5dL,
72209         0x46e52cc9c10bc071L,0x28794efe371a3461L,0xa4850718276fe877L,
72210         0xedad57739bef5ab4L,0x24c2d9ff3f15c815L,0x188950e58f8395c3L,
72211         0xbae4099680b6a855L,0x4f53e22c8a8803e1L,0xaf233f61039d25eeL,
72212         0x07db2c35250409caL } },
72213     /* 160 */
72214     { { 0xc7f3b8db037d4703L,0xe83708dfc5f488b9L,0x1fba830f8471d402L,
72215         0xa55ee8d25a2faae9L,0xc2e5bf105404fc1eL,0x647d5027aa2d5651L,
72216         0x37a53c0c7ebaf5f9L,0x7adf0bb295b30abfL,0x5a62e1fed64c93baL,
72217         0x7ffc18c0e2ef4a78L,0x139dd9d94d2cd04fL,0x253fbab75ea0af02L,
72218         0x7c8100ea0fef9acfL,0x74c5384dc8615aa7L,0xcb28682d9fe52069L,
72219         0x08b6ca8fcf7dd759L },
72220       { 0xe04e5bea036c3b5aL,0x387261027f9f2b4bL,0xa9fca57029797c0fL,
72221         0x1656180b82879ea3L,0x153389bb607f0ddfL,0x99a1223c67b0e087L,
72222         0x0d1808ec9d897fc7L,0x9470711a916edf19L,0xf8f52f2b07217118L,
72223         0x5d8b29ffd18888b6L,0xef1e22c54cc6f900L,0xc4036165eb24877fL,
72224         0xfda9523335479525L,0xd622a4216861468aL,0x5d043b0774faba08L,
72225         0x2c337b020d31a7d2L } },
72226     /* 161 */
72227     { { 0x7b2305bcea22fa65L,0xbe183ef4d159f63aL,0x3473d87d3f35923fL,
72228         0xb27fb306c11d7753L,0x702e7e6b2a054cffL,0x3ce9f97caf185619L,
72229         0x835502434e7d51c5L,0xa63e3d82f356ac5bL,0x867b7caad7645131L,
72230         0xee85e6afa671fc9dL,0x3b985ede2b07cd77L,0x07d598b0ffda5193L,
72231         0xb10eca39a942dc36L,0x17f3dcee506218a9L,0x3d94e8d106b7d5caL,
72232         0x509b2634ed8831c9L },
72233       { 0xb1b9414e48caed54L,0x77a78c6ccbf51e97L,0xa4688c8d4de9b258L,
72234         0x0024137c91ee3d78L,0xa68f9234e30ee64cL,0x573255bc88190d78L,
72235         0x41e8e05fba80690bL,0x50038d84ec354f4cL,0xb18f02d6dfa52816L,
72236         0xc47f9007ccb63fdaL,0x29d480fbe98ae455L,0x4ac45d225d0e319dL,
72237         0xd06f3575026db719L,0x733b9e202c3587b9L,0x224839922c317727L,
72238         0x1592d5a754bb8752L } },
72239     /* 162 */
72240     { { 0x5778d9a2cf7453f0L,0xaffb899aed83c1f0L,0xae6506d3e0a82ba7L,
72241         0x32c84e1aea3d5081L,0x9ad528c0810aa38bL,0xb1fdb020bd37d041L,
72242         0x78d6cbe1d06ce41fL,0xd287f0f02e74b7f6L,0xf5cd2575c43bb022L,
72243         0x6d28f2f3f81a71b3L,0xe65bb1f5c633e7f4L,0x32e5fc1cc4fc580eL,
72244         0xcd55539fbb7b07a5L,0xb5a94471c3caaf3aL,0xb958bdf44cc22d2dL,
72245         0x1614bdbd77a2777cL },
72246       { 0x4c1f0230ed0ab04dL,0xae347b006e2082eaL,0x9f10bc63c42c5b5fL,
72247         0xb0539e6fde019935L,0xd89bd4e765dd0825L,0x92260fefbbceda16L,
72248         0x8aaa755ce62aca32L,0xed762fa95ec82c5fL,0x99e64c0118650768L,
72249         0x57dd6245c92e348cL,0x0db88a7731ea6d68L,0xef0012ab07b44736L,
72250         0xb9356b94171d70feL,0xe68b062803f891b0L,0x3a54a53ab79c20a2L,
72251         0x489656c7b00b0728L } },
72252     /* 163 */
72253     { { 0xe43649ba71353c25L,0x517f27a113f67e24L,0x10bd333a1c1eb9e3L,
72254         0x94e1c05c78e29bf9L,0x84fe7d974743f15dL,0x9c87490890da2df0L,
72255         0x82403fa753673be1L,0x7ebf5db41baea1b1L,0xcfe0ae3524180eadL,
72256         0x1d15873fc2f50c3fL,0x16851ad670661cd9L,0x802968d9a51e8c2cL,
72257         0xe7d1a9cde0161099L,0x2b153c89a8a7ea56L,0x6d41b78906e3c498L,
72258         0x082bb2e9d6769dcbL },
72259       { 0x6180ef46c4d6615fL,0xfc629dc101b9829cL,0xde222ec00fb264caL,
72260         0xc5457e0610ecc2c4L,0x95ce599f1eea2c4dL,0x0433fa728f9c5b2cL,
72261         0xee035462cd6310f9L,0x84c57c3bce2e2253L,0x6c8ec31a96d87e44L,
72262         0x30bfe393a452c5a7L,0xc592b140a047b235L,0x7bd8be18c018545eL,
72263         0x794e01075c178c46L,0x484719462e23005bL,0x2665e237622a54f3L,
72264         0x36451a46901c9042L } },
72265     /* 164 */
72266     { { 0x17802d1819893e71L,0xa1765d8b539a2082L,0xfc6aea012302ecfcL,
72267         0x8d4cf51b365bf59dL,0x87741d720d232a80L,0xac343eb318e80427L,
72268         0x553ecb2fe74739ecL,0xaeca79a81a8b07caL,0x089ff32256f4ab3aL,
72269         0x5e95d7293fa1d1f7L,0x260569aef62a9a16L,0x5e776232aa08ddc2L,
72270         0x93fabec31b7bb54aL,0x48a20956743d56e7L,0x749cdb12eb0ebeffL,
72271         0x705307a469b8fcf1L },
72272       { 0x7a8e4c04e488310bL,0x12726e325325cd7bL,0x5d0fd8b04983efacL,
72273         0x796e552c02ddb913L,0x0eeca3f777b9685cL,0x9b766e89b15f24a3L,
72274         0x7c2736d648efc979L,0x3d619685a8021c6cL,0xfe33e278a0b2f1eaL,
72275         0x95c69879b676d6b0L,0xa07473191af4e0beL,0xa2fab5f136c4ee55L,
72276         0x6938b8ff59e5f3b9L,0x1e114da439cafe6eL,0xc9595ec36a6ad120L,
72277         0x80f79bd057e62aecL } },
72278     /* 165 */
72279     { { 0x3cef42a760af09b3L,0x3c016ebd933dfe14L,0x720cf1e0ed85eaa8L,
72280         0xd4f5e99fceaa3bc9L,0x7216b9d2b7106f97L,0x65f34c36c9668ad2L,
72281         0xa8fb82bc5b0c651fL,0x20f42f1cf2fda4deL,0xeb31ab2cd21f659eL,
72282         0xb7a776c7a13d1618L,0xec44102238662be5L,0xc825da70cad08e0bL,
72283         0x99299079022c0180L,0x7623bda02aef9ffdL,0xde84f4f3f5c58b50L,
72284         0x5f5a5da4d824ff19L },
72285       { 0x5737257e7e8311dcL,0xdef94f51466cf136L,0xa73e1645b05ca21aL,
72286         0x38ea9b3c02e4ab37L,0x7760eac98579165bL,0xdffdd047c24b01a4L,
72287         0x188d4fd13fb95584L,0xfaac38b825548bdaL,0x1a79a6f059e9dcacL,
72288         0x983f720f09a2700fL,0x8cbba554fb8a7e48L,0x38a1996847a1fad5L,
72289         0x118565475abd6b5eL,0x75113d31f3716ec2L,0x1391e7814212907bL,
72290         0x5319c8010dc15889L } },
72291     /* 166 */
72292     { { 0x2320136e6b61c3afL,0x1d40f2de07b4bb68L,0x651dee7f380c97f0L,
72293         0xa978ba706a8c313aL,0x22c587d62011ca10L,0x48bba218ab1f445bL,
72294         0x8c5eaf07e50444e6L,0x5549f02a442fccf9L,0x2564746f3d80493dL,
72295         0x42d24f6179c04591L,0x1600fa18abdc8887L,0x5cb8600aded38f8fL,
72296         0xa4bf9b90923aeb46L,0xd63fee351e1c578aL,0xf3c9c5acebb9ea14L,
72297         0x3d13314df11a4ff0L },
72298       { 0xe5cc662db4513d1eL,0xde78a8c5d55952bdL,0xe8a37a3fe7f86d0aL,
72299         0xca2d12a47a04f0c5L,0x4c6696e42e25d06cL,0x52614698b2136071L,
72300         0xf4d2701b89f6e1cbL,0xaafd617780efd95eL,0xe6d73ac4c5bb6907L,
72301         0x49e874ac420db35aL,0x11631de4f2751fa0L,0xb29f7336a1fa2eddL,
72302         0x4c406864b7fd794dL,0x73cb21d3e22f92a6L,0xeae904e62043cc76L,
72303         0x67f28a9fb322c6adL } },
72304     /* 167 */
72305     { { 0x7c17b258ca148ab5L,0xb9a1976fb3c60051L,0xea260698c8f28df9L,
72306         0x87b2cc74e8d45017L,0x372573290578a422L,0x81d5ee2517bec732L,
72307         0xd7411fcf1d48bbc4L,0x46217e6b487f5cfeL,0xcb007ac541eb8e1bL,
72308         0xc41c57a6e05a00c8L,0x1f954d2bd2f9fa99L,0x370bd5db40941cadL,
72309         0xe487879c3829509dL,0x4c1375525ceca5eeL,0xe8ef7fa4fd3efb9eL,
72310         0x5ff091741bd1bdb2L },
72311       { 0x791912a4579c6632L,0xbb19a44fb8a20815L,0xf4f97b84535639d3L,
72312         0xe57e2bcbbc3c9bceL,0x122b3f2bf19e6410L,0x1f0189da1357d9adL,
72313         0x675573bb79e5ff66L,0x444e5c98ef2f3c4cL,0xd6f61e2004d10731L,
72314         0x0dfa366fac75d635L,0x9fc47c862c854f23L,0xc04ae43e0ad0850bL,
72315         0x5ce94f642f720c32L,0x67efae65a753bc9dL,0xc27d30d3b0373a63L,
72316         0x6681013a29721646L } },
72317     /* 168 */
72318     { { 0x1385d913e84509dfL,0xe978beddcf339376L,0x2df425d33423a148L,
72319         0x43fa0ae3ee8cb579L,0xf015369d31c4553cL,0x05cf08bbdfbf1d48L,
72320         0xadff4be69444244aL,0x01635f81a35dda33L,0x085c8949e76fab7cL,
72321         0x4bd7fcde16737783L,0xfd8cb52ca254f8d2L,0x62168a66413ec985L,
72322         0xf2db97417a9026ccL,0x3962ee5650e1e1b7L,0xbee0a346d3beffdeL,
72323         0x3b35b72f0bdfab1fL },
72324       { 0xbff8de9f535c3749L,0x23c1f20f8add9c48L,0xa975b37bc8f8f663L,
72325         0x2529e475e8f3ae49L,0xc32f10d51d5e2628L,0x5ac0d29767862f1dL,
72326         0x13c79338854cbe36L,0x48f004ef4b67e462L,0xfa37a150e5d10ee1L,
72327         0x4974778dd28288a0L,0x96830a66cfb73f4dL,0x9f44401307804952L,
72328         0x8233c7099760b694L,0x8340cca525b75c99L,0x3f62e40bc771f99cL,
72329         0x47d0a1ebcd95c685L } },
72330     /* 169 */
72331     { { 0x266f4fff652811f1L,0xeaacaa9362ef3002L,0x6c387a5550cba0caL,
72332         0xa350142a007f5467L,0xc7fd102a202f2673L,0x5daee57033dc6e65L,
72333         0x60682ec3064a63d9L,0x46cf0bb0462b251eL,0x0e030ca55da936e7L,
72334         0xc87a60f2434265b5L,0x9637b2bb69b4e8f5L,0x601fb58c7ad7770aL,
72335         0x1f2147f6ed3a15a6L,0x05b47d5e2995e961L,0xcb0ca9b383213a16L,
72336         0x8f4b614a4995a85cL },
72337       { 0x5aa8ec194b4eb3c1L,0x8c549ac420323a70L,0x00d493224f6cc6aaL,
72338         0x0e53b9bb45f9a5a3L,0xe46ef1100897abbbL,0xfe873e57d7acd7d0L,
72339         0x7cfccfe50f7cb588L,0x0ea53d65c85557d1L,0xfdd9eb447288f2e2L,
72340         0xab2dedfac0eb68a8L,0x5822147008603a0cL,0x6946468900feb06cL,
72341         0x804cf5bf25e5caacL,0xd85598589fc91ae9L,0xed9378b173c45eaeL,
72342         0x8f942d02524c9801L } },
72343     /* 170 */
72344     { { 0x1f1ec3028e845808L,0xc302bffab77abfc5L,0x26afd4b9f8d97dc7L,
72345         0x3d3a83c43aac594bL,0xe3b74bd1674d94dcL,0x4464b737caa5911cL,
72346         0x62925773871c2cd2L,0x419f24853b4440feL,0xdda6a0f3e052ad7dL,
72347         0x645280d6846c86c0L,0xa25689faf8324f42L,0xc74ad1e807cf117aL,
72348         0x5626dea08ddc9db7L,0x52620373966fc85dL,0xe0ad57c3f3b1eb53L,
72349         0x38300252949c1acbL },
72350       { 0xa0ef5a405e744723L,0xdb5bcf751ae08481L,0xabfad8ccfec1f76fL,
72351         0xfba5d831fab37fc6L,0xbe39e248c8fedb78L,0xa5cfad5fad93f310L,
72352         0x747fdb1e913d5c24L,0x052a47c94518b7f5L,0x9e208d6c7cfb4327L,
72353         0xb135cb9c70e538beL,0x363527595bb17916L,0xa2c078805b3106c7L,
72354         0xd2d42a06c209bb06L,0xb525b471d3c504adL,0xc9f4b368822ce034L,
72355         0x15f18796eb4185a5L } },
72356     /* 171 */
72357     { { 0x094dea060aee4684L,0x42b21f067cdbdbc8L,0xa439e149b1931319L,
72358         0xea4bdd4181a7dba6L,0xc62137063c2ae80fL,0xb58b096712823dc2L,
72359         0x7443d515832611b1L,0x2e16f83113c20384L,0x0ce204d62bd992d2L,
72360         0x499dbcd6f419388bL,0x492ded1d1d3778c7L,0x9d5bd74fc5ddae73L,
72361         0xd4813d52994b6259L,0x191d9cf60e86ca68L,0x562179eaf3e9c2acL,
72362         0x6146f1f39fee1238L },
72363       { 0xbd06d33e078e2aa6L,0x693af7f79dee9265L,0xd56e0f81daa40e84L,
72364         0x05fbbb889b9a407eL,0xdcf44adcede99519L,0x7f71f8d3092dba39L,
72365         0x675b5da54231774bL,0x7456a251a5f605ebL,0x9031d4af87a39a9eL,
72366         0xdb43000605b474bdL,0xbda5dbf2b665aa91L,0x5d1a3df56631eeb4L,
72367         0x028149ef62377c58L,0x2e1af4e9685d0bffL,0xe0ea087582a465deL,
72368         0x95543f9e06bd0050L } },
72369     /* 172 */
72370     { { 0xf7cbc6f485d7c6efL,0xcad8084d63b1bc24L,0xdf90ce88bf8cba62L,
72371         0x98e4b686b455c192L,0x6146b8d5774fc6edL,0x70e2389e7ae20077L,
72372         0x5241c47961c22529L,0x7d2215103884e5f5L,0xd6d20ce217e28273L,
72373         0xe3119f514f2674f8L,0x8545905570c011dbL,0xdfab75d9fcfb760eL,
72374         0x9546362a9e8c2a19L,0x4b6d3f8a4a7d4b27L,0xa5c87104ee5d698cL,
72375         0x6db434782ba296ffL },
72376       { 0x064864935c3f0d95L,0x8917db824e748895L,0xf73fdf626b2f3e44L,
72377         0xc60edc542b7f574bL,0xbe1c09a2af732723L,0x7d34669d7cad114cL,
72378         0x9646600a321aaff9L,0xb94e2bbaed0cd61cL,0x866e1a41dec4750eL,
72379         0xa1be990db1a89f58L,0xc39e4d6cf2759693L,0x11cfb780c0e0dddfL,
72380         0xf0afcd7fd99c8a41L,0xcebffadb6e1c3050L,0x4f3981b096d2c6e4L,
72381         0x07a791e72ae27a94L } },
72382     /* 173 */
72383     { { 0xe70e90471e9f0300L,0xe0253ad9bccdf904L,0x51c0289dff053078L,
72384         0xf1ef092eae893462L,0x2c90a91aa4846845L,0x1946eda0f1dad4b4L,
72385         0xf07650f333df67b2L,0xc6e988db0b15a014L,0x72e0c66eb542f0f9L,
72386         0x5d4b6311e0c0378fL,0x548badaaae86950dL,0x6801638db35f1c8fL,
72387         0x129e3216944d1ad4L,0x9951bac840471d32L,0x03cc29f385e94ddeL,
72388         0x6d6acc2e4543ecacL },
72389       { 0xeb999e9557b2d299L,0x3a2bcd9be3d721cdL,0x2e60384fbb4cb444L,
72390         0xae177709dc060faaL,0x74f0e6d38c987cdeL,0x9a237cf81076fbedL,
72391         0x69af15137983fbffL,0x6c3f7a1d323f9584L,0x3e21cacf6db64398L,
72392         0x7cd8134f96703d92L,0x0755898fb8393f76L,0x1b5b28bc2e825222L,
72393         0xb78799c17924aa7cL,0x1db378f281427a8aL,0xd5a451b1ff289492L,
72394         0x79d182123d3c46eeL } },
72395     /* 174 */
72396     { { 0x1a3edff9109d5589L,0xded52eb4029b4499L,0x13eb9d30b4b54adfL,
72397         0x4f9214c1a27bff67L,0x4c817ee767f0f460L,0xbadf8d83c3a50e28L,
72398         0xc5dc03c994026237L,0x5f29581b966647c1L,0x10b6a0898a0687f3L,
72399         0xae787cec31634517L,0x2001dba562e75188L,0x55d4e1a745e2c3fbL,
72400         0xbfcacdebb67d3395L,0xa1a0af9cbc6842eeL,0x50590a2b3e88580bL,
72401         0x73104491a784cdc8L },
72402       { 0x44ca2cdf2648d676L,0x9a85eca54f1b12b1L,0x1b9dac942980e1ebL,
72403         0xf30d37091ac8aa89L,0x73072ab7c719e195L,0xba518c822f703797L,
72404         0xac090e14ac0067f6L,0x0e6cfc708dcd2927L,0x4f5889e221e7da63L,
72405         0xb4aaa40b8371c7c6L,0x1f9dabe28f7878c9L,0xf78aed6bd84caf3fL,
72406         0x3c39dd079e0e1d92L,0x680be5fb122424dcL,0xf41b214d0bdc0099L,
72407         0x6a8f8fc95180c54fL } },
72408     /* 175 */
72409     { { 0x62a1ed6353235132L,0x1db233f159dba88bL,0x85625452291efdd8L,
72410         0xc7505297b25111aeL,0xb5921af91d701bd8L,0xb4d05d729774f45dL,
72411         0x6e3d4c5ef18e73ffL,0x897d985f899b3038L,0x8a9c30fbc89b1558L,
72412         0x3c92d1a34d13181cL,0x292e86ba2223320eL,0xcf2454c201ceed02L,
72413         0x27a45f74583f309fL,0x75a6102cad0fd1a3L,0xdb4f45d2cb9c7538L,
72414         0x4752d8c1db283fd7L },
72415       { 0x514d6cead5dff4d5L,0x74cd5fdb45a827f4L,0x1070a60c4fc7135eL,
72416         0xdec0bb781be5778eL,0x271e12cd58dc6b08L,0xb765089b54bc2496L,
72417         0x6ddf2c63619098acL,0xfd6ebac667528832L,0xeaa2d025c2508af1L,
72418         0x13c2cda84dcfc1f0L,0x1c7836a845510be0L,0x3904688d1a886801L,
72419         0x643132aaafaf2545L,0x496855772830a88dL,0x569491ca8744b470L,
72420         0x3a6518f375fb8552L } },
72421     /* 176 */
72422     { { 0xaaa8ed50224042a0L,0x6cb4e3b02452f1e6L,0xedca5f4c768211d8L,
72423         0x4e0fe3f9ef4d5d3fL,0x33a8e2a4522d46e5L,0x5998e21ff1446775L,
72424         0x1496c50ef592d01bL,0x69104c2f83a67739L,0x28670bcb472bbf00L,
72425         0x8ea883b2503177bdL,0xc5d8bc057d2712a2L,0x41ef9317b439c994L,
72426         0x9801d3a8dcda1affL,0xd686eeb57038f6fbL,0xe80c5cd0fbfbf820L,
72427         0x540ac363edc25817L },
72428       { 0xa71969a9fe7f43dfL,0xe66538082c1b9e4cL,0xad9677d8859c2917L,
72429         0xbaca954596aa4404L,0x0e9d855fff1297daL,0x1f61897b22aea7deL,
72430         0x96edccfd36f13f8eL,0x627d307016e200dfL,0x729f0736c98988a4L,
72431         0x95e25e6097f231d2L,0xaf7f221bf6048752L,0xd66826094019b299L,
72432         0x1d99de0926b4b1d9L,0xec47cf661acdd7a3L,0x4de9f2b36ebe15e9L,
72433         0x17db32ecfa16974fL } },
72434     /* 177 */
72435     { { 0x75ef69196cf40599L,0x7ea10dfb00c020eaL,0x3da5ae7bfcaaf679L,
72436         0x0d663ca388ddd678L,0x5a21f8fe255bcfcdL,0xe9c3f538e344bc7eL,
72437         0x35f62b1d548e0632L,0x654f242543c6e64dL,0xc755a7a626993627L,
72438         0xa3b7c5f7b0f41324L,0x05697f793a2180f3L,0x6cf85fb11e81675bL,
72439         0x6d3cdb35e53428f5L,0xe3aa159152d28b02L,0xa8470255f7a3fb78L,
72440         0x460bd01ba194445dL },
72441       { 0xbc34dc23c24d8077L,0x82f4b5804c720d2cL,0xa29da9116f5d1ffeL,
72442         0x578af52092783ce2L,0xe29f51abb5904af3L,0x46c570d7f7aa1190L,
72443         0x4a522fba571bddf0L,0xbf4e2a06ae89bb51L,0x799b35cc59f3444dL,
72444         0xc302836726cc2557L,0x94a4e985afcec177L,0xadaf7dcb7c36cbd0L,
72445         0xed31b78775d39077L,0x52d6904f2d3e24bcL,0xc5ca26691f95421bL,
72446         0x7d342c3c1734878dL } },
72447     /* 178 */
72448     { { 0xe5cf2c0a11fd127fL,0x66d36bb8119e4c5eL,0x621ab2526ef56ac3L,
72449         0x30cfeaeee5430675L,0x2ede27d2ac3e9619L,0x6413513af8fce671L,
72450         0x6159c61b075f4c3dL,0xd447efe959069d98L,0xaf8d6f68ea76aea9L,
72451         0xac5dc61b0f5bd164L,0xdbab446e1e88bb98L,0x618b8b161ba92320L,
72452         0xa0eafb3c78989865L,0x0c7abcc2c08b7e82L,0x10f09b6e20d160bbL,
72453         0x5be0afa68e4c63a7L },
72454       { 0x82ab6d381bbbf49cL,0x3e09ce498c0703feL,0xeca58b5de10f4263L,
72455         0xd9cc6581da5a4532L,0x07e18876f618f7b7L,0x0419a5e3250f7fe7L,
72456         0xbb1a9e90de6b86beL,0x584a7deb37359169L,0x38eb34895149db2cL,
72457         0x14546a33b0ebabb8L,0x0067f0b0c2f88a92L,0xbde0dfe70a2db019L,
72458         0xba51b06cc63e6f3eL,0xa19127b9e9206fadL,0xe4eb5e87fe80dc0aL,
72459         0x1e6fccf5d4de30aeL } },
72460     /* 179 */
72461     { { 0xb57dff66aa8ac924L,0x06e9ad31c298b3e8L,0xd140e32965fb080cL,
72462         0x7dab211d1d95c93fL,0x6d68d8428a180caaL,0x1a929408a20ded69L,
72463         0xa815175338df461fL,0xff5604ae60eae932L,0x901b9e497dae4c0bL,
72464         0x4573a97fde262e89L,0xed69d9a4f1084983L,0x8ffa022f64724f1dL,
72465         0xd5f1c2e4ea85a15fL,0x4c626ce901453794L,0x80440cd6bf0907ddL,
72466         0x4522d4615ddaa837L },
72467       { 0x8895f079ebfbe7c5L,0x30ea1ded84ef3446L,0x716a9eb6d4a1ab96L,
72468         0x1a4a5d2250a30c68L,0x5a16631c0043bbaaL,0xbd1075025010e5f5L,
72469         0xbffe3e9d3d8c0556L,0x31b30b1807772419L,0x90ff7ef084b82297L,
72470         0x00c37d75f21a18c3L,0x18d0a635565bb8f8L,0xbac1da2a45e3bcebL,
72471         0x1c38e90c23f0b08dL,0xf1ba1aa25fbc5ac5L,0x09d5256bdda71fc6L,
72472         0x346501a96d7e40baL } },
72473     /* 180 */
72474     { { 0x86be448ccc2b0f1dL,0xe3eb45c9ac4c3703L,0x5387f65d9fc96bbfL,
72475         0xcef3c4e95ae27fdaL,0xa008f7761bc18089L,0xf374a08422ca18a1L,
72476         0xee88284253b73371L,0xcb6fc6d87cc09354L,0x8489ec1b61496d6bL,
72477         0xa92c29b949e325c4L,0x15c6ca527bdec166L,0x95444eeedcea2813L,
72478         0x34683eb33a21154fL,0x8fb26f98d39061cfL,0xc3b08aa806c940bbL,
72479         0x7c1d42cfe554c96dL },
72480       { 0x766e703fdc110aa7L,0xab7b79d7f362e378L,0xd259c75d5aadca3cL,
72481         0x2a6eca7960be3373L,0xf4744a4b06c4e8ffL,0xb2842ccef3b705bfL,
72482         0x1a3af5aaae304b53L,0x7bbfa2011b2d31b8L,0xc4ba6eba4bee88d9L,
72483         0x2d3565ce565cb839L,0x24808696daf7ece8L,0x2c7ccce7e6959745L,
72484         0xefd6eb3ce94f9837L,0x0a33b4cf3811a326L,0x14203f43fffa93a6L,
72485         0x031e982873c31d90L } },
72486     /* 181 */
72487     { { 0x4fefecfc765a17ffL,0xa09f3888d1290a65L,0xbf265c46938da038L,
72488         0x4bb6145da169ad46L,0x33cf821423a62fe8L,0x562df571abc860a5L,
72489         0xbf2a90fa815c38c4L,0x45ba1d6e17eda875L,0x799d881a946fa5e1L,
72490         0x6c1be784b90f5a3bL,0x0910a37cb10ff52aL,0xc38c1fe4a4f4fd36L,
72491         0xc3180fc58e2d3ba0L,0x3e2ff050b17a6187L,0x3a00059b943a35c2L,
72492         0x494d3645a28cc51cL },
72493       { 0x398426b64ba021f8L,0xd14c9083796deb6cL,0x6d2e53957e36c762L,
72494         0x8f556eca751cf216L,0xdaca1e0019b24a19L,0x47887da44b20c2aeL,
72495         0x93ed4ccdff41a733L,0x8d717c445c7c0cd7L,0xcc48634a91bf7009L,
72496         0xa1f146f93b59bbafL,0xdd38bb39e5624f15L,0x96d41aad303f8443L,
72497         0x6b670f034bf104fcL,0x0503f9ed29706582L,0x768e1f47b34200f5L,
72498         0x3cfdcc5ebbd4c6f3L } },
72499     /* 182 */
72500     { { 0x536c2a86b523e13dL,0x1014a4582920d0a0L,0x3d52b478e7571296L,
72501         0x057460667eb51beaL,0x709f786187b0e919L,0x028aed88686888e8L,
72502         0x79a809d7d94afcd4L,0x50c6032fe2129af3L,0x75e4be72983c4082L,
72503         0x98331bbb7ab3be8eL,0xd31a032cb618c728L,0x36dd85a13f59c4a4L,
72504         0xdbece345ed4f61e2L,0xba7aaccd1e571715L,0x138c58da64a1ebd7L,
72505         0x89296d0f3d1aeea1L },
72506       { 0xb165288fcca82c97L,0x26c6c12d1427e8dcL,0x66a94f074c3edda9L,
72507         0x94600e1eeaa01ebeL,0x14abce7c30f5e86dL,0x741d7020cb456a31L,
72508         0xab05aa13279f42c2L,0x70b60fafd4238468L,0xa18efec1318d39e6L,
72509         0xeb07f1ac8920b318L,0x01e3cba8d8399e03L,0x65f8932e3c81a301L,
72510         0xae8bca7dccc667d8L,0xcee1ae79a268607cL,0x3182e64ccac0a12cL,
72511         0x9233a2f72b1a4c54L } },
72512     /* 183 */
72513     { { 0x717e8df60acbee17L,0x0f0959c25c24fcdcL,0x46f09887e54ffcb0L,
72514         0xb993decad285116bL,0x0bfaa4f8bba1fa51L,0x9c9249efd0f2183eL,
72515         0xf93cb35896847779L,0x284bfb7f2322d421L,0x40cc709ad42af009L,
72516         0xc69f22749bb1d615L,0x76f50b3a717c3c6aL,0x8b21e985bb9c5eebL,
72517         0x58fb19aea4783b5fL,0x04c86b9b52e1c3e7L,0xaca59092f2971ac8L,
72518         0x2bb26a6921ed8291L },
72519       { 0x98a3443515f81416L,0x086e72e7aaff5bb4L,0x3d1f64de0317261cL,
72520         0x31c0786c5c0a1cfeL,0x542ea4d8b3683401L,0x2f77273a1a39b4cdL,
72521         0x14fe7ee1cbef27f1L,0xee7fc09e16bb27dcL,0xc0dccc17410e5dc7L,
72522         0xa34667421943b3ddL,0x92934b603f31c1b7L,0x0186ded9c22c1070L,
72523         0xa37ee8ba799f966bL,0x0f3bfcb4249b0893L,0xbae614472e92d4deL,
72524         0x937cb3f8e196eb08L } },
72525     /* 184 */
72526     { { 0x57c0e77c16fbfdceL,0xea034cc9c98d4cc0L,0xe7606d7242572d20L,
72527         0x9861b55c0019a83cL,0x80ba2803f1597162L,0x0f4141dd05a0fd7bL,
72528         0x8865913b4b0daaa2L,0xe6685746aa3848ecL,0x16d15a5a3e0485d2L,
72529         0x81c0c7743b6905ddL,0xcec31b7d818af2baL,0x80d8f194d2b74b78L,
72530         0xca659db2543e2f28L,0x31b83a7d9fb07c1cL,0x86537fdc1f1048c0L,
72531         0x4d57bb0778586a11L },
72532       { 0xbc4b768a53b396b6L,0xbc8b24c493b51dacL,0x33e511eba30ae1b3L,
72533         0x893bbd95945147c5L,0x6cc86031179fe3ceL,0x34b0a1673f920bd4L,
72534         0xb32912eb6b256160L,0xbc69a2a49d168d83L,0xb4949e7aef0dd128L,
72535         0x2613419a872699e1L,0x06c58477bf21376bL,0xe55b1909a4f97147L,
72536         0x63d6eb757b9b745fL,0xb5365b2908df3c85L,0x0e257e4355fcfae3L,
72537         0x1067c118979f2aa8L } },
72538     /* 185 */
72539     { { 0xc845508432bf8883L,0x4755286a6fd06667L,0xd70b0f8f77c2335dL,
72540         0x678e60da2f4a2c94L,0xa468d8acd118acf5L,0xce93830bbf5b90d9L,
72541         0xea4b1c74ed4e9104L,0xac67316d27776ea4L,0xb98ad75c361bab12L,
72542         0xc323d48299122451L,0x26440220530a43aeL,0x3a44532e3292d5a5L,
72543         0xdb48694b5fecf1bcL,0xe4e0516ec667b8b8L,0xb3aa595fa4306adeL,
72544         0x7e4f7091f34e9725L },
72545       { 0x3f3816e9b7f70919L,0x765216ed16b003f5L,0x46c6cff4778c99e5L,
72546         0xe6a5abe830a51810L,0xef6f49e645e728dbL,0x6fdd73eacaccefd6L,
72547         0xec394e6f8c37f3f7L,0x73320802b6407fc3L,0x988e8f7a96625cbdL,
72548         0x832923637cabfb00L,0x258ba9df407f359aL,0xff01aee5ccbfae50L,
72549         0xfbeaeacefe251813L,0x9c69f16183f1cba1L,0x512c58ad9eadcdb5L,
72550         0x2ae49cd46ccce8bdL } },
72551     /* 186 */
72552     { { 0x1239b0e3c40849f2L,0x5136a4cda441098cL,0x61535a99e547f649L,
72553         0x92e4bdc47a9bbac6L,0x195a164653547af6L,0x85ecb3198b47a74aL,
72554         0x278553fc9de6a2b2L,0x471c038a0e2ba52dL,0x12ba1b8835bcba93L,
72555         0xd4bf50da6f31eca2L,0xd146e3f6802b32c6L,0x0c9c01313c64c8c4L,
72556         0xad30f12deed21297L,0x9b75bffb9c68530fL,0x23c0ad3e8918de51L,
72557         0x180e9d52a73771b7L },
72558       { 0xc316542f29ab77b0L,0xdd411d9cf7aee628L,0x044c0685353c2f40L,
72559         0x638dc7e44b0ae4cfL,0xa092418595fc266fL,0x639da671fd2feb7dL,
72560         0x56858ed55ea39798L,0x7a694f3158f3832aL,0xa94233c6d316d831L,
72561         0x2fcacb2630a35a7bL,0xfef8f7ddf1ff713bL,0x8b9b452559eee2f3L,
72562         0xd1b4f91b156d064aL,0x177866c22f5cfcfcL,0x12bc25663777eb41L,
72563         0x21ca6f3cd8ab85b4L } },
72564     /* 187 */
72565     { { 0x0e162b13a3e66635L,0x1ef20a2b2a9f76afL,0xab473a3046db3356L,
72566         0x0840bd777802bb8dL,0x5b6baf5ea699b44cL,0xc6e119001b2207f1L,
72567         0xe5de16a9790b0105L,0x22b12f15db67f004L,0x185fad458a025d25L,
72568         0xbccf6953df0a1142L,0x4c42129bf45034c0L,0x0f7404001c277bffL,
72569         0x6e440b4c280a9e18L,0x767de8f5842aa2b4L,0x3de20ab805e8d94fL,
72570         0x5aff585920227635L },
72571       { 0x805acd20a8458e40L,0x5a5557d8149732bdL,0xc70741315f1ca72dL,
72572         0x7f2e269c952b5323L,0x5c5925566494fadfL,0x153b7acd1a7d2666L,
72573         0xa6df063d86fe2865L,0x1e91db1357d53b6bL,0x9195bb89e93ead01L,
72574         0x3d71e1af2963bfe6L,0xfab2b9c288278886L,0x778366923b859b6fL,
72575         0x6e695174f7029dd1L,0xc79878767b984561L,0x64fb4f1d5907d849L,
72576         0x3eab7e1c88d8a977L } },
72577     /* 188 */
72578     { { 0xc73a94b652e5718bL,0xe3aefa54f4cee1e9L,0x654e9e63553eedeaL,
72579         0xf2541e1b5f3aca1aL,0xd71294890d083316L,0x7965af63fb7f950eL,
72580         0xd8fc9e0dc74e3e4aL,0xb4ee48d2eaf79ebcL,0xa458a86a8b7787e6L,
72581         0xd8c7621ff7cceaf0L,0x8228eeffdf67980dL,0x210d4742f9106727L,
72582         0x91f63501b07e3629L,0x441761c67971e29dL,0xc0ccc65f03a3b8a5L,
72583         0x3491da4f38e09544L },
72584       { 0x6706d046cb062eaeL,0xee7db7355d08776dL,0x80de8052292315d2L,
72585         0x40785662c402bbdbL,0x5f93525c26ed3337L,0x6cea14d67d568ed3L,
72586         0x916a118966888b1eL,0x0fbd52055dc71675L,0x833d1077e4575df2L,
72587         0x4e93100aec092335L,0x2f9e1d016cd85389L,0xeebd372543226368L,
72588         0x401d172b1ba4cfd7L,0x377dab9d574c5838L,0xaeaa695880d517deL,
72589         0x0c843dfd6ad15a18L } },
72590     /* 189 */
72591     { { 0x455811ffc9373300L,0x1c39332a99fdc300L,0xe19bb81c353cb655L,
72592         0x774b924a96a83d27L,0xcbfc8fcbb2ee3f1aL,0xaf278ec4010d56c7L,
72593         0x6fde682fe0abaf79L,0x7566d0727339aebfL,0xbd35ad5d71205db6L,
72594         0xb5bbe6947051c9d0L,0x577db480d3a3067cL,0x2c70ff54572d7530L,
72595         0xe8615aece06d853dL,0x71999ccb05abfb5dL,0xeeefc96bea0a8ed7L,
72596         0x2dcc469d35f6df69L },
72597       { 0xcca6cd06c65f0e77L,0xddcc7980bd71b14aL,0xb6221f8b3c93cc00L,
72598         0xddfcd5b3ae8cbf57L,0xbc92973f76f8e63fL,0xe9848a3406e132b7L,
72599         0x4cc59a03d51ec9e2L,0x9c9d32bb3a33081aL,0x0012105280e8466bL,
72600         0xc2b0032a1bbe7295L,0xdbfc657224938448L,0xe972a0ceb6bba0ffL,
72601         0xf60c0a4fc0a94802L,0xf62c41cc599d8bc7L,0x820c96ee312da0b8L,
72602         0x5a1a65dbcdbdf9fcL } },
72603     /* 190 */
72604     { { 0xbfba691a42485684L,0x613116b929c470c9L,0xb4b01971e62a0519L,
72605         0xf3245aa65ff499daL,0xc2ef87f4a5238effL,0xc16dc6bacc9d5515L,
72606         0x5a7f227e2dbdacacL,0x8dedaac4a9bbaecbL,0xff308a6d2e7c9885L,
72607         0x4c6f2fc2e6895593L,0x3655f285177e0611L,0xa63e8d06300b1beeL,
72608         0xbed0ce7913c17b54L,0xca4abe35c4974262L,0xf4b44a17bc4e4037L,
72609         0x5ae95099efe5fbd9L },
72610       { 0x122e5ee7804f7455L,0x341a499722066682L,0x97d24c317795e333L,
72611         0x12f4123ce48efcedL,0xe8738d9219fbc21cL,0xbb3bdc610663a3aeL,
72612         0x3603d8c28593a6dbL,0x926227f2e3c1ac75L,0xfea92ac05eaae519L,
72613         0x5b596f0bfd6812acL,0x3ce7e844fc2a82dcL,0x3840481a63522b27L,
72614         0x836088b152867895L,0x21ffb7cc26588688L,0x0ca331612f4a7cacL,
72615         0x4110667ea3edd298L } },
72616     /* 191 */
72617     { { 0x81830357c2d04b63L,0x3fc5a34df4929a18L,0xc73bf6da22d195dfL,
72618         0x14df2f89cb432473L,0x345afe5ce997f138L,0xd8e3f5f98b9604f4L,
72619         0xad7942e950c10ae5L,0xcefd5447eed25ff3L,0xbf68e51e0e73c0ccL,
72620         0x5b1ad591ab54fa4cL,0x8bbc110512b61c8cL,0xbb932913b5abf760L,
72621         0xdb1231be01e79649L,0xd0a83e91040ccbe7L,0x3dde426f90a96db9L,
72622         0x1cceb64534df11eaL },
72623       { 0x2d210c4f0c6d0f55L,0x6cadf61b9c673c9dL,0xdd7f9919a9ce3fbbL,
72624         0x135f494c93b063e4L,0x580bdb3c145a93beL,0x4d8723320f52ef7cL,
72625         0x74d876e88814bb6aL,0x4f6f723ac7a97deeL,0x7de2b8f03e3cd833L,
72626         0x6162f082ae720270L,0xe88ec2d4ddfa486eL,0xd965c8598d3a17c6L,
72627         0x62e59e543980171aL,0x0ab6285dbbef6b22L,0x3cf451954d48b203L,
72628         0x1f1752334ea25ea3L } },
72629     /* 192 */
72630     { { 0x808a765b3467ea91L,0x3f4632eefd2d9c45L,0x7b75dc6d9cf2bc6fL,
72631         0xefc8d240359813aeL,0x23ecb209e44cbd8dL,0x59ba10e321525622L,
72632         0xfa14d9343f1ee19aL,0xdf97c21bfb0c48f7L,0xc4e62890ea30d437L,
72633         0xb286e2a4651475c2L,0x291f01e4126672a5L,0x9c6fda5c31aab3b8L,
72634         0xb7277a5ae17d22ecL,0xbd88ed83914f0badL,0xd0b05d1b6a2392e1L,
72635         0x4cb8af9065893c2bL },
72636       { 0xa2b02057bb4b1953L,0x4ce08b44f597f6eeL,0x854f5d9b5e6412c8L,
72637         0x1913262db3cd4919L,0x902762e46e42bb5dL,0x8355c8e6d78e7f60L,
72638         0x8efaa82438b6c16cL,0xd0173790e550f618L,0x118af462e57d778eL,
72639         0xa16ad5e8715b4714L,0x900596c341dea4f9L,0x2a957c32280ca610L,
72640         0x2faee800374c65a1L,0xdb10512750080414L,0x8c1db931ff080fa1L,
72641         0x486a5c25d79878fcL } },
72642     /* 193 */
72643     { { 0x0521e213941b4f36L,0xbaacfb14f803b4f9L,0xfdf1e22e52a54ba8L,
72644         0xacfabbba8fe4796cL,0xae0788db58dbacb6L,0xdf98d736c19dfa51L,
72645         0x155c286a35a716eeL,0xbe7d46769c86461bL,0x50b6380f63a64a5eL,
72646         0x14b419149f609262L,0x0919a7d0a2dfc5b3L,0xc454da55cef466acL,
72647         0x93fa4a246986aaecL,0x5090b17171a49cedL,0x602f1d6cc1fa75adL,
72648         0x5d269f8978e4c054L },
72649       { 0x3a74030c14920419L,0x0845d86890968739L,0x81b994c4eeb70fa6L,
72650         0xabcaa06dd9fc5bcbL,0x06539427f58f8f2dL,0x35c85f67b1dc52aaL,
72651         0x5a7d8d722c911baaL,0x4041005caec2d834L,0xb5868a447a8e5347L,
72652         0x04ee180b8de512c3L,0x4daa66e5211168ebL,0xc0bd5dab2317cd8aL,
72653         0xa1d4185d61164df6L,0xacedca261dbad7c9L,0x0fe4b5ac09b02683L,
72654         0x8ac9995a26d9550fL } },
72655     /* 194 */
72656     { { 0xb2c8dc9b2640a39dL,0x21ff0b38ede0c9f9L,0x74f469bda1ecba0aL,
72657         0x8a902ccd080d0417L,0xe956fa32f4994604L,0x348f85cf9776ab15L,
72658         0xc21fc6ee0066f492L,0x35b1ebfefeeef367L,0x7804581c4613e5edL,
72659         0xcbdfe8e6ea6ba071L,0xddfcaa32950d73edL,0xc97479361da48889L,
72660         0xce867c8cdbaffbd1L,0xd267431f1cbaeae7L,0x68255045897912c8L,
72661         0x0c7c1ddcd7ea1e4dL },
72662       { 0x53aa30cc1ce963a7L,0x7352f64cc4c5fadeL,0x2b9aa2f82828afbfL,
72663         0x64273c56ca212107L,0xaadd765485a576dcL,0x6196ac3e90b5c77cL,
72664         0x20d43e9fd1aaf39bL,0xfc392062cd05cbc4L,0x141638724c0ff2fdL,
72665         0xcf32b8d82ae821e6L,0x5f58f9433fa7a3f0L,0xaebf1d2df644ca92L,
72666         0x0c0615631918a75fL,0x7989b5ed6b876118L,0xbf342445ad412441L,
72667         0x24ffc9ae1df633abL } },
72668     /* 195 */
72669     { { 0x89fcdc0593c7cb2bL,0xc1243b95590053fbL,0x601debcf6182343cL,
72670         0x364546ef66c18a63L,0xa5290701ec913287L,0xc35b8026f9788c31L,
72671         0x852b862a92d1f7d7L,0x1809cb050aa79728L,0x897d467ca3cb2005L,
72672         0xf20c77c09ef5b946L,0xc3372c42f2241984L,0xda053e0df35bb206L,
72673         0xbc26c6d0a9c140b5L,0x61cfcc0ccb56fb33L,0x1c3cf9ef299b3968L,
72674         0x89e4d3d140621ba4L },
72675       { 0xd35e80e7a45a9be3L,0xc4daa57807356fbdL,0x0186d62eb967bc2fL,
72676         0xa702679e47cd16e3L,0xca2f1c025f30ce9bL,0xf1205b461f864f50L,
72677         0x7fd6d79785061d66L,0x47edc4f68a08809eL,0x5dac04499a4d3ae2L,
72678         0xf844664a6d1f9da8L,0x9f30ce84d7a83a71L,0xe9382baceaac33f1L,
72679         0x1f033831948622abL,0xb037a4baf7681eb2L,0xd156a90899a1b5c7L,
72680         0x675d3e6fe6f1d0fbL } },
72681     /* 196 */
72682     { { 0xd9767ffd707193e5L,0xe478aa91810358e5L,0x5634f9ff328d8ef7L,
72683         0x913a0ee86dbbd9a7L,0x379b29687e215686L,0x903f410a89d9da38L,
72684         0xd9f8d7b91b1334d2L,0x9fe74229bd82efb5L,0xdb568b623803c778L,
72685         0x93e9a350d3d25344L,0x559c35b0724497e8L,0xc472d436a169e23bL,
72686         0x09864632cc5b4c69L,0x9f6d759d83c7f531L,0xa91cf1db1e497888L,
72687         0x5f7f92fe60af1a4bL },
72688       { 0xf18a1cc60545167eL,0x55ee2e02affa88e0L,0x24cdff51432a7bcfL,
72689         0x7382da42a7510866L,0xe894c11f40511af7L,0xaa4e4e312aaf1423L,
72690         0x8c3d36f0f63dd2aeL,0xfc5c9550d7660635L,0x0125373137ea7eabL,
72691         0x2a5cd59839b950f6L,0x95a0f60140e63442L,0x905e238ef2ac7045L,
72692         0x44bacc0e446b0f73L,0x4cd4206ec448578aL,0x367b1aaaa5bd7803L,
72693         0x25beced90a2b458dL } },
72694     /* 197 */
72695     { { 0x079a73820c33a8fbL,0xcfbf6cd10f25dc1dL,0x4ffc73f8c6d482b6L,
72696         0x3e51f18c07bf844aL,0xa7651236599162f0L,0xac59a74e14013811L,
72697         0x957a6865e55018a0L,0xe1ec51bde3ca09b1L,0xbc0c7eb3a960253fL,
72698         0xe83bfd147de03f84L,0xc0540ed152fbdb09L,0x6ba52eddcea15ec1L,
72699         0xf3d30ed54b261307L,0x9bd7bae8e8397206L,0xf20d8692096373aaL,
72700         0x0a616a4bc3b0bf63L },
72701       { 0x2075f3ed6e1339c9L,0x7afaa072bf8b00a6L,0xdfafec82bccd9b47L,
72702         0x4713158f00ca54c7L,0x449102f138bc31aeL,0xaf98f158310dfc8aL,
72703         0xc9ef207559e954d4L,0xe8021af9c527a0c4L,0x6e8012777a192023L,
72704         0x635f538c7fb02377L,0x5df1974fe8c9e951L,0x0287faed15cc9097L,
72705         0xfa0728f0f7a5115cL,0x90dbfbe60fac623dL,0xa8d40fd40311ba09L,
72706         0x876d154e07c6464cL } },
72707     /* 198 */
72708     { { 0xd3a4d6d2c2d3ea8aL,0x36be681ba842600eL,0xc53f100de4070672L,
72709         0xe3e5b6fe6a7d7a7bL,0x6e6994f95d5e1a83L,0x07cacd2276097c2aL,
72710         0x12d98dbaa6791011L,0xddfc4461102e0e24L,0x4815dbc2d493272aL,
72711         0x7e38e64ba9436696L,0x4960eb1a32b2bf90L,0xda457525d928e28bL,
72712         0x72f75b392a077c9eL,0x27760cbb7fd61d00L,0xaf235d1b0f4b1456L,
72713         0x3040c23be76d1700L },
72714       { 0xb10dc55b4efa9a70L,0xd4de414f53e86610L,0x3d95c11309f8a27fL,
72715         0x505109a506661d3cL,0xcaa2994a60eb513eL,0x3ee415371e7d338bL,
72716         0x4fd145fc4651e71fL,0x51bbf838cbc313b4L,0xb039e0781eb92150L,
72717         0xe8696b4414bf5ac7L,0x2d6671888be0d48cL,0xbe93b2f5dd8f2b6fL,
72718         0xc1dfd1e7eb8a7f8aL,0x862b3dd990f751c5L,0x1eb1ad58a32a74beL,
72719         0x5486d79a1ebbc9a2L } },
72720     /* 199 */
72721     { { 0xcb2e34ffa1359e13L,0x202d8dbf28196051L,0xe95e023d23564b5eL,
72722         0xfb1340b642f6ac12L,0x543ba852b653725dL,0x81aedcd68d2466adL,
72723         0xbf780224547c728bL,0x559f8a119569fb65L,0x505b7a62dfb22ec9L,
72724         0x071075409eed5e52L,0x9c899288299f6f11L,0xa7d692613db6f8c7L,
72725         0x30eb7fb3b3ca79a9L,0xcab99bb8fb2160b0L,0xd2012568d28b409aL,
72726         0x380f1b0f5ac45f8bL },
72727       { 0xc0b99e6be6a0068fL,0x4b67cf2ac8a73753L,0xa6c9a548b2faeb7cL,
72728         0x7f417f99340260c3L,0x8ee56855cc0f739eL,0xf08b510f780949daL,
72729         0xb1770fc28d5c6effL,0xb4f5abeefd96a7bbL,0xa07b1136f2665a2aL,
72730         0x2fb380a4b601dcf9L,0xcc803614162becc6L,0x3498fb96ee6b83b3L,
72731         0xea9b0fd6a8c17eebL,0x5834b5baa177efc2L,0x929044f55b110b3eL,
72732         0x4abeddedebd7285eL } },
72733     /* 200 */
72734     { { 0x3355e1b9700ef376L,0xd56e5d9a66cdabffL,0xb3dc257547e87646L,
72735         0x28f44b8a00f79369L,0x08c32b1ea0c52e29L,0x5a78de123729b392L,
72736         0x4184519ab26d239dL,0x23f6b4b7e0ce4a6bL,0x235f6f8aacb2a9f9L,
72737         0xbb8bc454e2064a59L,0x37efd0341bf3062eL,0x6bac683b94dff6f9L,
72738         0xc3364b1e8aa7fa06L,0x0616772ace0b3745L,0x46f08d08d1e3fb0fL,
72739         0x6a20abb318e132d3L },
72740       { 0xea8310166a85cbc7L,0xd0990946934f9aa7L,0xc2211088e778f1b3L,
72741         0x7ea4ff8f2247b799L,0xb3171d71454484ceL,0x294039494f98c364L,
72742         0x5da911f397df1458L,0xa6b5809309439116L,0x75f9509a174238bcL,
72743         0xfeb518218209758dL,0xae0c6021a47925d0L,0x0e946694af8a315eL,
72744         0xae7af8a36bad04b7L,0x44c15e7ff072447dL,0x5184668aa5456ffeL,
72745         0x45e353a7bf36b977L } },
72746     /* 201 */
72747     { { 0x7605676493092f71L,0xeb66b6c2f5b92d71L,0x9db3149be2c8b6c5L,
72748         0xf62f583a20c0363eL,0x688acd3303cd7097L,0x85d0c0f8ebb916acL,
72749         0x1bf7462c84c19b0eL,0xc76ed5f97c4a6ad1L,0xec8b88bad119f369L,
72750         0x59b8371bebe50b83L,0x0cc69508866706a6L,0x531c75a3f8373d2cL,
72751         0x4e1cd3a32a5a02fbL,0xe8274778da39a1d0L,0xedfc5bbb75da333eL,
72752         0x15941f24ca79bd36L },
72753       { 0x42e8c0f8a77dd512L,0xa91b59a71dc365f6L,0xe80d14cd08753862L,
72754         0x1624230dd272facaL,0xeea3ec164027cb5aL,0xc1700b59c1ef9f03L,
72755         0xd411c1270da3148dL,0x801ee448c4181af1L,0xedf285599e3a900bL,
72756         0x5d67b0bd0d09affdL,0xd839df968b370024L,0x3b6307e0e6f836b8L,
72757         0x5382e588bd3201c9L,0x636d8a6b7a1d02bbL,0x70b7db76968641e9L,
72758         0x6d17c34a118fad03L } },
72759     /* 202 */
72760     { { 0xcf608841c181c99bL,0xb65dc901c87bdcafL,0xb460b4473720dabeL,
72761         0x4c79c3965377515bL,0xd447f22e0a96c277L,0x0d9521302ac0f440L,
72762         0x8330b26bc90583adL,0xe25e977a928904a0L,0x1deaffd985c50b18L,
72763         0xcf4dbcb7a5ad5f6aL,0xcbcd0019c8a37ed5L,0x7846dd901e9850b6L,
72764         0x1ac8194ab0b8e605L,0xb972857134132f90L,0x4ce9f149f56ee28bL,
72765         0x1ab9b5a43e9e1d4eL },
72766       { 0x206dab92314fa7a3L,0xcc4af0f0478ff963L,0x4cce1713904d9fdbL,
72767         0xac20a2eb12c045feL,0x44fc5478fd8f6d7dL,0x886e72c5ca7b6ffaL,
72768         0x7fa4529b6fd6f758L,0x4df1d1b192a820d5L,0x3d812f9f2789f149L,
72769         0x9842f083aabb53d2L,0x2648539b2a03ab32L,0x631ce090b1512502L,
72770         0xe1294d15731f6bd5L,0xb229361d9436e634L,0x8c4281c43ca966afL,
72771         0x24b34956c21ab3edL } },
72772     /* 203 */
72773     { { 0x49bdcb86659824e2L,0x6dc4ce484e13e74cL,0xa4c01a266bbe1eeaL,
72774         0x47b2b8e71e3ec457L,0x7e8b15e02f5a8e4bL,0xe81eb6e6e333530dL,
72775         0xacba369e17a45202L,0x81241431d70e4c9fL,0xc190af4b3e12beb8L,
72776         0x5327052311f486fdL,0x9f6c41e129fb2bceL,0xbe6287ebb70f6c08L,
72777         0x1479850a3feb4477L,0xfcfdfb119bcf18bbL,0x925c292fda80d040L,
72778         0x212d65e57e3c5bf9L },
72779       { 0x23adb386ca15cf08L,0x4dfa4ac481e172ebL,0x9d1dbf934d42d0c0L,
72780         0xd9cf607374404dc7L,0x60508441e932bfcdL,0x9ae910ca1c682a98L,
72781         0x9528fc1841ac1cc0L,0xe6a120aedbbed630L,0x94e0e1ec30ccf250L,
72782         0xfe84ba54e58bbf2fL,0xc66d0b4f9faa4415L,0x0c58f1e7ecee7ce5L,
72783         0x7a1d43eb6fa6873aL,0x96c6c5a0399f1348L,0xe6ef9aaae6727ab7L,
72784         0x66afa5549a5c2447L } },
72785     /* 204 */
72786     { { 0xda5aaba8c980e91dL,0xa93cf5096ac98efaL,0xb0990e0a8da32662L,
72787         0x01d215300081453eL,0x2bb0d33e3d71de84L,0x465f6d803e19a012L,
72788         0x5902ff4c78a838e7L,0x74e2afb71931348cL,0xa49327579cfb057bL,
72789         0x761ea6423ad03f8fL,0xb7d4c24558ffa40aL,0xb5e9c0d977a87e30L,
72790         0xd1c5edbac9c84d26L,0xeca8839a3d1963a0L,0xbc6f2f35ebf6bf0dL,
72791         0x01ef06310d58abdfL },
72792       { 0x2bf903163ecdcbb0L,0x19e2d72827c1c955L,0x9e5270309575c930L,
72793         0x0dc1c5a996983930L,0xef9f80ff7cd082dfL,0xcd915075df97e051L,
72794         0xf286fffe9cc61b55L,0x352db38f80f24cc4L,0xed9b99ec36523ae3L,
72795         0x109a8ca810b104a9L,0xc2700fe7305203adL,0x2a2ee24e769400f5L,
72796         0xd595d399ee0c452cL,0x0ab75d6af7f02a41L,0x341080990db730b7L,
72797         0x0e4f5ffd5e8d1202L } },
72798     /* 205 */
72799     { { 0xbd1c64440ff14c38L,0x9a5b59faaece11f2L,0xaa4605a722af6330L,
72800         0xddc9f65a82af24eeL,0xf4ee4bfeeb9a1159L,0x2463d07674e84eafL,
72801         0x88cbe1e00e0baaceL,0x7ca568ead5fabdcbL,0xbd80d524c57eb99dL,
72802         0x9c46572ce9be9873L,0x918a1dcd7300b85eL,0x4922131240f54176L,
72803         0xf7e324ffb5b14236L,0x40dda5012434f16aL,0x08833421a133d97cL,
72804         0x33d411610876f020L },
72805       { 0x7531a36b9878e5ecL,0x5de3e32146918232L,0xd15f9a33d0a30464L,
72806         0x734c1b87aa173659L,0xac2094a2f925d4feL,0x43c965a1c262b0f4L,
72807         0x759c903e447d5cbcL,0x92af215e05239300L,0xfffb6d5f1f593f34L,
72808         0x65943b4bc3cddb5fL,0x9d03a29cbfdd5408L,0x8f7cda6b198d76c0L,
72809         0xc0790a22c0f27b59L,0xba557a848cb58ccfL,0x5922052d76c54fdcL,
72810         0x2d3de7aa47b6b466L } },
72811     /* 206 */
72812     { { 0xaade746265add3b7L,0xe5888f35abf24c2aL,0xd41549cae1a57d93L,
72813         0x0e22e18e2c76f7bfL,0x67f288eabe3202b3L,0xb79a66ba1d1d0f0aL,
72814         0x0e0ab7492881ad18L,0x7d424086c7adb0e9L,0x870c32c52842132fL,
72815         0x858477f158f9a09eL,0x422a9372ec025589L,0xbe428c5ca5098777L,
72816         0x45b7956457660058L,0x6c7fc631957f37cfL,0x8b7023ddd6316289L,
72817         0x47003bb65b1c12a6L },
72818       { 0xd99401c1c91c1c96L,0xaa5dcdf927a12970L,0x3ab92e17c3c29107L,
72819         0x26fce8f7a3fe4710L,0xb0d09d5e4ee998eeL,0xafa622048e3a41f8L,
72820         0xb1c012a5a26ca506L,0x2c6f734c99b57252L,0x1093d79f512f7fe1L,
72821         0x2f30906eacee19a6L,0x6bff8381056d1ea6L,0x61c75856eff35f21L,
72822         0x6e07e978c1ad2224L,0x2cca6ca16b20fde8L,0xab4d6d2d633fe81bL,
72823         0x73dff504b06a2ce6L } },
72824     /* 207 */
72825     { { 0x8b615805d8e20fb8L,0x7c6873e482b533f0L,0x5205f00156a854caL,
72826         0x87fec6accb369211L,0x1fa3c0ecc7f092b7L,0x5b36647ee845fe4cL,
72827         0xd4781e85f8b1f112L,0xc65268398b0f1a6fL,0xceeb8c6cdcb8eb92L,
72828         0x133f0ead8e5f6d52L,0x31883e23c8d934dcL,0x214ed5bd428ac45aL,
72829         0xf77ca492dbbfca85L,0xdf4113fe07e5ae13L,0x63e4a0d272ab05fbL,
72830         0x7544d0b77148f535L },
72831       { 0x4fe8d13480797aceL,0x216d6aa0af86d97eL,0xdbf0a688ef5a68fcL,
72832         0x18b26f459f9b2684L,0x52fefcfa8999d2fcL,0xd5af8d8262423955L,
72833         0x8f123469f63a3780L,0x2933454fdcd4feafL,0xba8018b7a73b5d09L,
72834         0x9af1f276e5552c18L,0xc5d4773dff26bb1cL,0x9ef4941006dd4f44L,
72835         0xad8f12f95f39ba49L,0x5767f6dcf66ca4f2L,0xba8773f17922f59aL,
72836         0x220081eac1e42d49L } },
72837     /* 208 */
72838     { { 0x3043d573ba37a0baL,0x05a431bcdd176df6L,0x03322cfcc42070f7L,
72839         0x5cabd30e67c2d109L,0x362c95decbf8bcfaL,0xd767d2777787b10bL,
72840         0x612c915e6ec05e64L,0x9e669631ce69c30eL,0x27c9dd8f682e2635L,
72841         0x79021f1295ffcc38L,0x06a8ee798a2adca2L,0x8e00e7844b5d500aL,
72842         0x87746fc78d80d6c5L,0x246053be915f10ccL,0x844e328b219f6fd8L,
72843         0x620541ac11bd3733L },
72844       { 0x0f7fd382509e5a29L,0x8748d7d0b432531eL,0x8f749354cd3883b9L,
72845         0xc6b8ac748bfbb17aL,0xa4616a6605f2d2c5L,0xb3d966251bcb1b83L,
72846         0xcf7531042fee265aL,0xc70d73fbdb225058L,0x1211d434f0c2d556L,
72847         0x862061d854b259b3L,0xffe4606dc42b3f7dL,0x4c5c8585e86a4949L,
72848         0x04ddcc8b160eedacL,0x1804ce67568e2420L,0x91f3855a42141656L,
72849         0x7f378198f932be97L } },
72850     /* 209 */
72851     { { 0x9a374bdadfa6639aL,0x0cbd48d402ab7391L,0x5c5ef23647031e2dL,
72852         0xb49ee2bcd0599d1fL,0xd285eb60e0d38443L,0xdbbea92f269392e8L,
72853         0x91455fbfb8bc538fL,0xae259ff1e469b768L,0xc1cecb1f41de5682L,
72854         0xc876f0719952d1aeL,0x1ce25181e7bf7446L,0xcb93ad86282ad2f1L,
72855         0x8fa3cd316ba4ef67L,0xfce68a04e507aa3eL,0xced74170a61bb608L,
72856         0x6de716b3f6ac10d0L },
72857       { 0xd4e58d04172d6dc5L,0xbed2cde66397c65cL,0x7ae77e180c9eb4e8L,
72858         0x5627546875fa2edbL,0x4b30324ea91e6738L,0x6023a856235c8b2eL,
72859         0x9df6d6c2a8f92887L,0xec2c185ff6f5e8b5L,0x7892e12b3ad5748aL,
72860         0x7aebb4f2d54aefbcL,0x14915448ee868821L,0xa26c5f71b1d9bd5bL,
72861         0xe5ccd1662ff00df7L,0xebc99f17b95b1deeL,0x909836163fe1f774L,
72862         0x51f90830bb3d25b0L } },
72863     /* 210 */
72864     { { 0x49376fa1f2922461L,0xdbb1b1c31650d0d1L,0x92b91c330dd8608dL,
72865         0x3e612c4b36b89906L,0xe1977b0bdf560052L,0xf8afff70636a2545L,
72866         0xcda7d27811723d8eL,0x0b0bc4bb81bde7baL,0x3cb080b2ed2a578eL,
72867         0x5bda0d0d171b2e02L,0xf6df38cf941bb9aeL,0x85dd81dbc14a65c5L,
72868         0x7f98c82dc19dd98eL,0xc613747f52206f93L,0x9e13a2c25f5bbe78L,
72869         0x5eed218e0aa34be7L },
72870       { 0xe156575401d4dc0bL,0xa1ae5f27f566bb07L,0xe985ebebb82225d5L,
72871         0x5f3ad21c1189ec6bL,0x17da518cecce4d9dL,0xc84a2d3ed6b65b59L,
72872         0x7f9881758ffa771cL,0x50d6ae122ac69a7aL,0xcb7f30b1c6e6846dL,
72873         0x8c023a605bd0bb13L,0x9a10fecdd73f2407L,0x8c5158cce5f0a996L,
72874         0xd26bf615bd8f5806L,0xaf32ea87915a46e1L,0xeaf74e810287d308L,
72875         0x8c14ba06a6264254L } },
72876     /* 211 */
72877     { { 0x0c877895b17ee201L,0xc05aa47188e57a77L,0x19c3e76397822456L,
72878         0x0be6f8c0c9c3ba1dL,0xfe85f4ffb4389ebeL,0x538bccce0ce7fbb6L,
72879         0x876eab2a65266c64L,0x5c9ac690cf9a3842L,0x9f5cf3b1ccc8f981L,
72880         0xfa17be6a9cf687deL,0xfcfc10fc83835c15L,0x086b0fdb150ef2ebL,
72881         0x9f97ecd9884a52e6L,0x416e6fa2b0cd1eb8L,0xe2bd15993ecc03baL,
72882         0x645c0a5deabb165eL },
72883       { 0xd94c420550aa7e31L,0xaec8df0c2f851da5L,0x996469093c726e6aL,
72884         0x72dbdc362619bf9aL,0x1b4260e0e253fbd5L,0x97c259fb8c709e06L,
72885         0xfabf7cbbcddaec5bL,0xb4d5e8b1e4b703e9L,0x1b06e56e0734efddL,
72886         0x02d4a4f91f55f8a5L,0x7f8608ba3f565c8dL,0x822f47d2816d1d94L,
72887         0x0cc361565ce7b136L,0xe46ee5ef31d04242L,0xb2a65f70683567f6L,
72888         0x27e9ff40d2fa6c91L } },
72889     /* 212 */
72890     { { 0x75251893d7e952e7L,0x15b30583c735bf18L,0x732b599296fe0491L,
72891         0x27451858806d2fcaL,0x71ab76a01b885ed9L,0xbdce9d976d9f55ecL,
72892         0x3da60b2048f2ba9cL,0x6977c086592b132bL,0xb6dca9cb099051d7L,
72893         0xd9c2ab23d188ae25L,0x9f469f3fe20aaf3dL,0xdbd1f7cf5aad74d0L,
72894         0x3d5efe5c22a9eb3bL,0x8c5edfa2137010c4L,0xada2217b57870260L,
72895         0x4feee5673dac9776L },
72896       { 0x30e18d52b5d3d780L,0x4dadb5d307166744L,0x320d386e5a742156L,
72897         0x5d8c290e8d6bbb86L,0x981a43232d263dd1L,0x33d0e7ca98984636L,
72898         0x5138784da519acb1L,0x832e3fabdddc81ffL,0xfc2785943199a43aL,
72899         0x5b4cabcf32743163L,0x9fa010bd74f94fa7L,0xc28a743d5694a627L,
72900         0xc1d2a888cb657a24L,0x7eef2503e86a25eaL,0xed11a5d304c561ffL,
72901         0x4fe818e79c9ede0eL } },
72902     /* 213 */
72903     { { 0x00252c9d7fc1c7ffL,0xa9bd419d9fa89ad1L,0xc93a124a4064e9ccL,
72904         0x384cbcb843942eccL,0x004c21fd8749695bL,0x69c81d9f421165bfL,
72905         0xe2325628dde01102L,0xec9374575a9b004dL,0xfb3346bff6dcfc21L,
72906         0xac4da64b4d372c7dL,0xcecb7ad3f20494e2L,0x562c41b5e867c150L,
72907         0x299395cec2b723d8L,0xc91adfc57ee53231L,0xe06f1161f10b6597L,
72908         0x81915529b74d3ffcL },
72909       { 0x8ec124316ed9d4eeL,0x3dffa154689aff01L,0x4aba349f2a89a3f4L,
72910         0x2db1e8e2d467efb2L,0x18dea354039102e2L,0x422ab853e52f082bL,
72911         0x7130a2c1ed36dd47L,0xca60e86d0295d1eeL,0xe6ac68087c7f5ad3L,
72912         0x0f83cecfde864658L,0x72e66c21461d1265L,0xfeef4150bd385099L,
72913         0x0f183f3aa6632289L,0x275454be792dc795L,0x2744c11b11367702L,
72914         0x7d06bcc7e8ea6ef3L } },
72915     /* 214 */
72916     { { 0x892859427090212fL,0x691b7d4c5521e844L,0x4c038422be2dbb92L,
72917         0x317721edbd81f880L,0xc136cbeeac89bc36L,0x4f71b60b7b8f004dL,
72918         0x269132d04e218ab8L,0xb0e2496ee6cc814dL,0x0b2ce31775fadc15L,
72919         0x82e3c08466d223c5L,0x9721caa64c612f8bL,0x59a751eba4b65355L,
72920         0x3433aad5c7d3d9d1L,0x1e61b9d2e80d4246L,0x149f655ffc673caaL,
72921         0x48b52b99d0f9cb92L },
72922       { 0xa3915399efdc05beL,0xde70db1813e095e9L,0x447862e9cddb3fdaL,
72923         0xa2b031621a009451L,0x4b27980c23920ea3L,0xac5394f1a23b8febL,
72924         0x163f72563e5616d4L,0xaa0ff93fb714219aL,0xd26f96d293d62474L,
72925         0xdd212ea87dcfe276L,0xab27bf2f47038d15L,0xe58c8325f418168eL,
72926         0xe3704222b32a989aL,0xa3694390bfc9f13bL,0xf16e26060d0684adL,
72927         0x17c0de879d8c76ecL } },
72928     /* 215 */
72929     { { 0xbca5f453dcc01958L,0x7d9459541ce88393L,0x5e6350a1561f5b6dL,
72930         0x291c3c867e2d36bcL,0xf6c7ed84a5ac3a6cL,0x7913c40bd98006cdL,
72931         0xf78bb0875671ec3bL,0x1c928f6eb43e89a9L,0xfdf28df3ae1ea1edL,
72932         0x62bba5b1b924b2b5L,0x491d27051a116e05L,0x08ec02b7167ed3e3L,
72933         0xe291cf7b5bc0b046L,0x30e501698c5d7f59L,0x0c7c350df5c799b7L,
72934         0x6862b9e20ac6e1d7L },
72935       { 0x56c6f4e79ffa1f64L,0xfed6a91aa1e24349L,0xe9a0ee0ccdb75232L,
72936         0xbfc90b370322d607L,0x29480ad2462fef87L,0xfc214969c2bfcf34L,
72937         0x6e5211e0a539e38fL,0x2a59ec2612a5149cL,0x195fe212d706b532L,
72938         0xf77fb108e99c8429L,0x74ceaea35dc80482L,0xa5a6030bbd92d298L,
72939         0xad42dca5aaea15eeL,0xd6ac3bc74987109cL,0xc64e1c40290af649L,
72940         0x5093fa2d51f8de6cL } },
72941     /* 216 */
72942     { { 0xc4cf32804c2d553bL,0xdc1abe223b966c29L,0x556a549c2296914aL,
72943         0xd8c9f8b5999976c9L,0xc22c57bd776e83f3L,0x4f2942ab7c85ec57L,
72944         0xef3407e56e2c61f5L,0xf005e8caf213db48L,0x470c853df32698c7L,
72945         0xe6f488d7cac0a54bL,0xb6bd6bed60b7501eL,0xf0103106714a4bd9L,
72946         0x5285bc3b6e098894L,0xec06741af5f92a00L,0x32f16426ef7ef24aL,
72947         0x12f9c44d6c77a438L },
72948       { 0x1951e96483313a1cL,0x98edd3da33c58b37L,0x4edbbf52c7ac4044L,
72949         0x866ca6f70dcb5ee8L,0xec0ae8f56dd422f8L,0x1077bc540661ec2eL,
72950         0x6d39913ad422523cL,0xd105e1e858e7cb3eL,0x47c9397fc979bb45L,
72951         0x3221d4a90997b592L,0x0ef628a3e8952fe7L,0xd08d58274e946241L,
72952         0x64cbed0f59780f40L,0x13d7c22708e110ecL,0xd186d8667679b1a3L,
72953         0x02f75e4e26ae1d18L } },
72954     /* 217 */
72955     { { 0x1b637ebf47f307d7L,0x6b644a6ad0141477L,0x82a33d652e05a80cL,
72956         0xc8f1a0f3fed07b31L,0xc09ee7f93696e597L,0xcdaa7ec3c7ffc01eL,
72957         0x549f88fef8f373b9L,0xc88d1961c3bb8989L,0xd92a4fe9dfcaa7b7L,
72958         0x12ff9ee23ae4ab20L,0xf5aea641f5ecb1a5L,0xe769237fe32fb47dL,
72959         0x96a5c42025d085c0L,0xdc91255826c755a2L,0x580b985f9bce9723L,
72960         0x72b1b56663961941L },
72961       { 0x9d708a08790e5558L,0x985360410689af80L,0xe85e7b8a42313b5fL,
72962         0xe6ba129255a49d1aL,0x5e76c4b0ac371b0bL,0x58504f39938e6e19L,
72963         0x8dd4142260ae9a21L,0xd8b04e9b968485ceL,0xf94c4ba5887efe43L,
72964         0x11268e67f11c5e73L,0x92623e28cf6b99c4L,0xf2d0aaa87a0a9662L,
72965         0xb266772a4ca02ed3L,0x68ee8e4e2d63b551L,0xcdebb2992e78b5b5L,
72966         0x5df19216e17225adL } },
72967     /* 218 */
72968     { { 0x20027e1e8df2e7e3L,0xb183cc68d8da07deL,0xce35ba694b4ae694L,
72969         0x896d97df3ca62e88L,0x3de4713b52efed2cL,0xd006c40e26bd084fL,
72970         0x1e9b71bbfc81923bL,0x9991c7b61aacc6b0L,0x650c93648f656840L,
72971         0x138561d187f47524L,0x610f2b11bffd3ca2L,0x96915faffa191418L,
72972         0x8f1236de955e5309L,0x613cbeeaa1872d79L,0x7f7b44ea66a2a48bL,
72973         0x452265c2e0a89c32L },
72974       { 0x4ad5ec7925430010L,0xcac786ffebd090c0L,0xa5f9f4ff20a9d3f5L,
72975         0xfcbf4112a3edc65fL,0x8824839c0cf3eb11L,0xb8dd6d4e8aa5b700L,
72976         0xe2271dfdb7568ab8L,0xe43ec373b744560eL,0x78eaf9261cf75296L,
72977         0x1809ae0e3fa96d9bL,0x0b312d2ddc25dfd5L,0x6b8f78b46bab7711L,
72978         0x069efc8db5ecf1e4L,0xc1952bae609fecaaL,0x43e302ed5f4dbde1L,
72979         0x14b02bf91e078555L } },
72980     /* 219 */
72981     { { 0x2c71c768b87e5b57L,0x0bcc78f7f531a557L,0x4ff93f8bf7597dc8L,
72982         0xb28e026d139e175fL,0x6b83b727cb94ca6cL,0x2eafe3b20079f7fcL,
72983         0x2aca54decf3bd170L,0x17c4133c6af0dc6cL,0xbea1e665ccf5e35eL,
72984         0xa6691a48345505c6L,0x2633abd0e6100b89L,0x966c6706c17d0388L,
72985         0x7aefffbe1a0cf90cL,0x4d847be7d0add64cL,0xd49bcdfbaea2aa46L,
72986         0x85e07e742cc7d0a5L },
72987       { 0x23aae0a60bc25bcaL,0x6e8e55f1e44f64ecL,0xe1e696d8b607b773L,
72988         0xaa90a746d3005909L,0x072b1ccd2cbc4990L,0x0d0fe6c6c68e2f5dL,
72989         0x920ec5f053e28ec9L,0x79b21fb4f0040cc1L,0xa7375bd3fcc4a2c7L,
72990         0xf5f5def9e1bac7ddL,0xdc315d7935c0f8d3L,0x7117c1702cacd318L,
72991         0x6f2823c4e926f71cL,0x38db58bbed02f39aL,0xe5b492317db69323L,
72992         0x0964039f8d49f430L } },
72993     /* 220 */
72994     { { 0x21774f1656999ebaL,0x3d8ee287b1de6305L,0xd81af726de0b2669L,
72995         0x374469393f8942a1L,0xbcf6b615ea03e13cL,0xd30c0c3594e273cfL,
72996         0x4fd33a56c6725c56L,0xa57534ada8be97a2L,0x799242a67c22a251L,
72997         0x4e51bdb59d0c5c49L,0xd7cd76ccc6a42768L,0x914097acd426bf59L,
72998         0x59404a2c66e9beb2L,0x4738fe985c96e3e9L,0xbcbb3e0eaad666d0L,
72999         0x626b0fd263bc5e56L },
73000       { 0x47217dbae1a1ec42L,0xaa6ae7dbab5acc50L,0xb7e1ab1e865331d1L,
73001         0xb84530703d30126fL,0x280649e0dee61851L,0x8806f4a3ea689544L,
73002         0x4bbe43adcb56f632L,0x036b9bdabcaff94fL,0x0d941e65bd0637beL,
73003         0x82179d44686f3abbL,0x1486912caad6afd6L,0x9a3b891eff7e1534L,
73004         0x88c426ceeb86fd96L,0xb56e6a81117928c3L,0x933e713596399e00L,
73005         0x09bbddd9a17b6ac1L } },
73006     /* 221 */
73007     { { 0x75e39c1de4fd3673L,0xf880d9d1a65c8e07L,0x4725c1dc7289c7feL,
73008         0x5b6735ee3529d200L,0xc1f8f2ed3c747af3L,0x5cf3998f912efdf5L,
73009         0xed72261849859c39L,0x23793a2f0e69795dL,0x8a6ab8d686b1d2a7L,
73010         0x00c815de22a882e4L,0xbe77d6fcf9db8d7eL,0x0886fb3202267547L,
73011         0xb62687d449c10edcL,0x9f1c3e177c83ed4cL,0xe6d5d7f05af366eaL,
73012         0x2eaa01b8d1efad24L },
73013       { 0x5e47fb701f357c74L,0x93085c4aa9e3b794L,0x4f0987336e85a905L,
73014         0xf53808ffbe0244c9L,0x91dddf93a3b5660dL,0x8b76377bf3b95ed6L,
73015         0x91b911b7bb3920d4L,0x7ccf08bf86a13cf3L,0x53ed8f97ea018e58L,
73016         0xb1ea434378c55194L,0x8e6adde9e0d2d5a6L,0xfc2b248f9b96259aL,
73017         0x96ebceaeeef17dddL,0xf694b443557f9c85L,0x48cd150f07d5bba8L,
73018         0x02d31de9b4c1986bL } },
73019     /* 222 */
73020     { { 0xa6bb9e1ede79499dL,0xf6ca8ff8fd0fc2adL,0xbec0f8e81a7d9356L,
73021         0xbc3d1c9fe8f06327L,0x805c72173b300bebL,0x00420a08413c181bL,
73022         0x9e9a167ef0ca9d01L,0x076c909d1aeeddd6L,0x64a1997f8e3a8a72L,
73023         0x3ce7f7a7a77b429eL,0xaac0fbf45c94d3e9L,0xf37694a7e6d48407L,
73024         0xf56679e2a91921e7L,0xf23fe0f3ee1dbbd6L,0xc7917566cbf9fa99L,
73025         0x965860f2e0f4d765L },
73026       { 0xe734702b7fa5f79cL,0x930bd4265af2d26dL,0x45bd8b986c73e0ceL,
73027         0x7dbe7bed4ee44a2dL,0xc129e024956c8a1aL,0x6fdc05ac77cdf80eL,
73028         0x70a6ba2b589ca59bL,0xfc484021999825afL,0x1d284b547a23f0b6L,
73029         0xb1da10a428a0a8afL,0xb1eb1b312b2af6d8L,0xf051443a33935ee3L,
73030         0x7a07eb268effa6ecL,0x16ee4086d662654cL,0x7a7bc5014549ee4cL,
73031         0x650810321fa98a52L } },
73032     /* 223 */
73033     { { 0x49f0e460b67ed9b2L,0x0cda0fd0c36d93d2L,0xbb5963e988c75e1cL,
73034         0x757bbe93614bc0c9L,0x9a9b88019a768605L,0xa8b7e2af48edc544L,
73035         0x9e77ed9eb51a5985L,0xdd025274ebbf024cL,0x598b62881545c636L,
73036         0x39bdaed04800dba0L,0x7fc2013981e2a23aL,0xdc66fd5c550cb4f2L,
73037         0xad27032fb52068c7L,0xc9a0bcae8169fa15L,0x60606f213a7ca8a2L,
73038         0x982950469862652fL },
73039       { 0x3e3746002e11c128L,0x80dfae5d0e6dca7eL,0xe44016e2d9552264L,
73040         0xf65f88f2880b7143L,0xca3d28d4526b881cL,0xf9c59dd1dfb86afeL,
73041         0x548860c24c74f958L,0xd06ea43c9cb69f4fL,0x5343c9ae7334ececL,
73042         0x5cc2ccd635329713L,0xa95ff4035f3a6c0cL,0x2e01a1ccb372653bL,
73043         0x31510fdfa250523dL,0xeee538e2a6227eb2L,0xeadfc8a0ca23cd10L,
73044         0x4b7e6e1b3e78f54bL } },
73045     /* 224 */
73046     { { 0x79c9076fdb5f928bL,0xe6250bb6b7347cecL,0x54b67798ac00ec41L,
73047         0x900d20ba9d9619c7L,0xed42c0d059e4343fL,0x3df39e85451935d7L,
73048         0x2639118264f701ceL,0xce8f2554e1f87aacL,0xfddd678965f91aaaL,
73049         0x96cd163fa324539fL,0x5c815f2c4bace995L,0xd78c8c2aa94f9ea5L,
73050         0x7ab2aff4ef24e455L,0xf0ed64091cddc26aL,0x954a420b00ca2822L,
73051         0x0611c4c5d3297658L },
73052       { 0xf192001ca9e81829L,0xded3332008a282ccL,0x0bfd7de18f9ded9bL,
73053         0x6793ac0db7889003L,0xbb00d91d3577a5ddL,0xe17a23a7802d3c2bL,
73054         0xff95f88cfb549014L,0x7cd1bf4bc71b6e07L,0x2e3b24a023588c8bL,
73055         0x9b5335b8a4112076L,0x2481c05ec4056d30L,0x55c7410ce916a1b5L,
73056         0xbbe03271850179f4L,0x15e6c177b3cd1208L,0x509a24c090cbfe50L,
73057         0x820795291c108566L } },
73058     /* 225 */
73059     { { 0x5d2d3cff1c7d353eL,0xd5e7eccd7de0ce3bL,0xb4b1075f6ca87635L,
73060         0xda8404e025f9ad3eL,0x6b963e89205cb5aeL,0x9e5ee0d809f221a1L,
73061         0xd64c85d9ea41aca4L,0x6a46c4e934442a34L,0xac6ff97e3cf655a4L,
73062         0x76565c1ee5417d7cL,0x681009a9eebf9c4cL,0x95b61d3988da6388L,
73063         0x6402b46af6b472c6L,0x1fde51650b7f1171L,0x94f8f273be0c05e3L,
73064         0x7487b036a88344a7L },
73065       { 0xa860e5759c3e2370L,0x19d58193f8048719L,0x3a0dbf3ca6e2f9aaL,
73066         0xb6c7e9596144719bL,0xa9049c74deffec21L,0x8ba064b23f50cebfL,
73067         0xb12822c049a1de15L,0xb654b7d9b1d527f2L,0xc470859d0ffd0430L,
73068         0x37c74a674f05446bL,0xe553251ba3add995L,0x4a3ed6cbe33533b5L,
73069         0x2f2f44d027e419ceL,0x2d84ee82a5d1b979L,0xcc76b123db6fa69fL,
73070         0x834f85c521fa3bddL } },
73071     /* 226 */
73072     { { 0x329347c12ce9b31aL,0x1d88522afe3fb3b7L,0x4bcefb4d52ff90fdL,
73073         0x53b173862b1a081dL,0x538c11ba2a411f08L,0x7895b93c141b603aL,
73074         0x2993b9aab10bd741L,0xccbbd04609912986L,0x669fafb0eea0aba5L,
73075         0xd484462235661897L,0x4a63b89c367ffa54L,0xcbad5d1d1c3478daL,
73076         0xc5339227aa6034f7L,0x0e6d705fe61b1391L,0xdd14b660f74ff515L,
73077         0x639d8b0a5332b54cL },
73078       { 0xfa423162162217cdL,0x2e0e4a2a811c28e6L,0x68d9ce1821766dc0L,
73079         0x51263739046a06efL,0x44eea231dde92101L,0x0607c8f2114298d3L,
73080         0x27f272ba63d957e9L,0xe7ce80cca5e8cae1L,0x5816ebe224f7a63fL,
73081         0x4dece5a789673e34L,0x13756a22536babd4L,0x644d61aee3bf77afL,
73082         0x60b2bf6e2bcf98bcL,0x3b0b59f329fa962cL,0xb0769a1aabb50023L,
73083         0x409031360c75402cL } },
73084     /* 227 */
73085     { { 0x84d2873a1670433fL,0xc9394df625493dfcL,0xeb05a19a80fcf89eL,
73086         0xe39e4310db297616L,0x50742dc9d9e63046L,0xf31ad8c81de9ca9eL,
73087         0x86aabf94fb7b1d0dL,0x36cda27a1b3c82d1L,0xfb1a2ef439702d84L,
73088         0x280bfddc46081299L,0xe4b2b48dd2396238L,0x2db2c2f37b3c9353L,
73089         0xd5b5b31712fb8a69L,0xf9b87a3b08180474L,0xd85909861e952578L,
73090         0x80668eedf37a2bc8L },
73091       { 0xe2edcd35b39a0249L,0xaf230cd4b2f8aeaeL,0x295b15e47223df05L,
73092         0xbb66982ae0e937f4L,0x019d2b728cbc9162L,0x5c512ae9cf49dca1L,
73093         0x11b491a7630f07b4L,0x48d4f34ca03874e9L,0xc1fd0ea644cb7433L,
73094         0x13f79ae1f95b30c3L,0x40362d4ded8b60acL,0x9e8314ff61ead81cL,
73095         0xed600dd4498c3d28L,0x5fcb1c19c2521702L,0x592329fc3a9c1f33L,
73096         0x046775481bde6ce9L } },
73097     /* 228 */
73098     { { 0xee3de56e39233c96L,0x868c409c80737eafL,0xacae11bd201abc68L,
73099         0x0f2cea9b2b486205L,0xe32387e16f19056cL,0xea75365aa5dc2a41L,
73100         0x76c29acc12b4be86L,0xa01fcab78d63294dL,0x81dbe88b0cab9f24L,
73101         0x76646e5bf414c054L,0xfe111893cb96b7aaL,0xb649f5b17664e097L,
73102         0xa196422e53fcf5a9L,0x5978c9bd0b7ff634L,0xb5feb38e3c229895L,
73103         0x038a49fb0833c456L },
73104       { 0x35e3818c13e93257L,0x14cebc9da612741bL,0x4f6e92497caac06bL,
73105         0x82278e333daa1116L,0xe7cc565e4de2034aL,0xbb7dc95f0a1ba630L,
73106         0x81dd9f2366956fbdL,0xc63e6319bb132dd6L,0x6e22b022fc241337L,
73107         0x238481937e8beb1cL,0x83b1994dd8c938acL,0xb54cfacaa6bb5644L,
73108         0x1a7cd44e06f91807L,0x1dd439bba8f8d9f3L,0x660c2a787f74a8e6L,
73109         0x4bb76e22121b5660L } },
73110     /* 229 */
73111     { { 0x7a151e8ae6354817L,0x33d494eaf038b438L,0x4c86c68885958986L,
73112         0x721538271dcbac12L,0xf487af8cc0edad06L,0xad33051fe500e5d6L,
73113         0x0a711b1bd6e47f55L,0xa68709a78c746ad5L,0x27f172626402f35eL,
73114         0xc6d08efafb30c130L,0x9ef1c041c06c7497L,0xd0c74ecedcc3e2daL,
73115         0x30c5f96e092e1073L,0x0f1393cf2aa12b74L,0x245840162107eb02L,
73116         0x8843d25f7b76f98bL },
73117       { 0x4e1501dcedb2a83eL,0xbcfe8fb02bb8d724L,0x09020659d925df62L,
73118         0x3c715dcf42ab6fc3L,0x73c05055a0f09dfdL,0x126745d8e3590aeaL,
73119         0x5382f4d876ff749eL,0xfc69feefa920c663L,0xde1602119fd711caL,
73120         0x4219c3bd9075c4d5L,0x3800cbd13ded6bf2L,0x8c7ea0eb6263a116L,
73121         0x35bd79587d264c37L,0x56e22e457159c98cL,0x71bf2a2dfa7373b5L,
73122         0x0503f9398935c949L } },
73123     /* 230 */
73124     { { 0x65addc6671dad4f6L,0x238e4889024bea1bL,0xfb76c8e2f605d3ddL,
73125         0x13d5f5deb0d96b89L,0xe0b5ba356601b2cbL,0xe37d491d83e3d254L,
73126         0xe8860423240c8ea7L,0x374182f3e91c99baL,0x26c2caf9a87ad919L,
73127         0x4b13040af574f295L,0x5b9bced1944000a3L,0x4ccc57be06df42e7L,
73128         0x22e8ec504bd1089dL,0x0c53177adddbb500L,0x690d31d29ecfeadbL,
73129         0x735778fe176668f9L },
73130       { 0x0f86ee3e843c1137L,0x3c1c42fa3f0b73cdL,0x0e75679d8ab20e3aL,
73131         0x6f95f1f416242faeL,0x7b88e11c39b092e4L,0x1629403e4c236ac0L,
73132         0x66105f412dac02e6L,0x74dc28a7862e0632L,0x2118ffb2f3b23c8dL,
73133         0x1182417c0745ffbfL,0x49b55a044c05711eL,0x2c665b74cefbe4deL,
73134         0x1cc4c01d97bf7107L,0xb2ca06dac54f0676L,0xfc599daa7450d0f8L,
73135         0x52e637a61a3182a1L } },
73136     /* 231 */
73137     { { 0x481700f16bebc6dbL,0x4a6b45dbf9503d92L,0xc715cd3c5d153919L,
73138         0x942a1c05e5ad2abcL,0x36a82433ab7b466fL,0xba413bedba13918bL,
73139         0x698a562490f4e6ceL,0xbb720da6f3f1f3caL,0x2116d41d63471ab3L,
73140         0xe00d2227303d3609L,0x7fd4cc00463ba69eL,0xac609e4d62845fd1L,
73141         0x63603b2c80adc9c7L,0xbf16fc9a45fafbcaL,0x41007f7fc4bc94abL,
73142         0x7c916b4fa74b1698L },
73143       { 0xc1026f9178bac2d4L,0x8a2e80982601a875L,0xad2f276e0073d640L,
73144         0x443610c4fcc1fb88L,0x5727b822ca6b291fL,0x0645532c88ec60fcL,
73145         0x51e48899ed9ad48bL,0x841b48b5f543f103L,0xa6ccb1bed591ceebL,
73146         0xfc4adf0f9dcf5a8bL,0x3a7ca020b347ddb4L,0xaa1accc2cb44c521L,
73147         0x773b68280527c0c4L,0xaa374c107023cf50L,0x733d10006b74c926L,
73148         0x1ff3916f77a8d07cL } },
73149     /* 232 */
73150     { { 0xaa218fe4f997939dL,0x3d4dfbbb791583b3L,0xb3a7b5da87f7560bL,
73151         0xa9c028015da92c98L,0xe1eb4aad46666f4aL,0x2eb17a5114ce9dd7L,
73152         0xf46a66a4ef8f3076L,0x900b45c6810e546eL,0xf7af22584baf04ddL,
73153         0x3cc1c8725c84d42fL,0x3093f2258e4c83deL,0x62fade41170d88b2L,
73154         0xe19612e4ac076e44L,0xf48d734632dd141bL,0xc1b1f759925e34daL,
73155         0x19ed1a56072b90c9L },
73156       { 0x9cf7fcde6c735473L,0xaab88e676003bc3eL,0x12187cbcfb199bb8L,
73157         0xbb7304419accccbdL,0x214aff3cb0f65459L,0x6aec81a36f926282L,
73158         0xaa82cb329f9d20b8L,0x82f3f90f5773cc90L,0x4af60e6bf62257e1L,
73159         0xf18b44bfbd4762dfL,0x3948b129db970753L,0xc6e920e97c22c18eL,
73160         0x393d620857be97adL,0xe8d7382c46b637f9L,0xf6625ccbf1fed1d5L,
73161         0x6f31e0f968681599L } },
73162     /* 233 */
73163     { { 0xc45afe5582b8f204L,0xac0441b6d358b54aL,0x7213e7bfacd5f5edL,
73164         0x1914c70b139bcd93L,0x714b458196dbcbb0L,0xe9297d351ed35d21L,
73165         0x8f6408376a3e1f20L,0x150a8a9d2f3cd705L,0xfb36e801dcdd9f6dL,
73166         0x5a54eb655cf56d82L,0x7610500c92aa5a21L,0xd10d0ae23b089f03L,
73167         0x491b2079c42b66e8L,0x4af1ae3d0eee8d48L,0x137e4c2841556f45L,
73168         0x875e330863d8a7e6L },
73169       { 0xdc80fddcaf6c0accL,0xd5ad1e66bb1e7c08L,0xdc717ae1828585adL,
73170         0xbdc54340275c7da6L,0xf4b4c852d26b9e15L,0x5f0a1fbf6a05fa50L,
73171         0xc6f81e47817bcb32L,0x2cbd432870ff2e1dL,0x8a24901667c7f7fcL,
73172         0xd045acb7b585a6c4L,0x2e972ad44666c057L,0xc74d87cfe6d7d63dL,
73173         0xf7067d870e274144L,0xb2ca157a8b2584aeL,0x495c5bfb75f0fdebL,
73174         0x5abb0581f386e009L } },
73175     /* 234 */
73176     { { 0x8be62d2bf0c97f57L,0x0fe04871962f28c7L,0xc548a46747b50abbL,
73177         0xf6b26e0344fa09edL,0xfd44c6e3ab05a96eL,0xedb0032c70e6ae82L,
73178         0x28bd402bd7e4899dL,0x43f2e9639b7c11c2L,0x0ec3fc0ece913716L,
73179         0x769b8bc902fd0f8cL,0x9d9cb3aa7cabc3acL,0xe88a889206924cc9L,
73180         0xa51461aa42609014L,0xc7f4aa8b962e79e0L,0x4ef0210a8b1b3e80L,
73181         0x705446801bfee4bcL },
73182       { 0xfab3d713121901c1L,0xe90a2627fead54aaL,0x64f6d285bc08ba23L,
73183         0x8d99301536ec227eL,0x99a16ab906c191abL,0x86b1cf5bf649ce2cL,
73184         0x5920675966be3a80L,0x18836279ccba2cf0L,0x2c157b87eff53486L,
73185         0xbfac98964b223af2L,0xcd0fd4f00aae7a57L,0xdaddb94063218a80L,
73186         0x3844bb79df88f14eL,0xc1b3e3d4b71ed9fdL,0x6c634a13d6205036L,
73187         0x6f56aecfb8680a6bL } },
73188     /* 235 */
73189     { { 0xb01dc803d9205c5dL,0x68955f7d67123929L,0x3debbffd9d9b6565L,
73190         0xb844395ed3b1acfeL,0x04328b216094eeffL,0x6631ffa822991febL,
73191         0x0dde66e6190dd075L,0x75b03c55e8577c05L,0x6c91ce5f91722407L,
73192         0x9a288a408ebb3a3fL,0x1d376f8a058a1396L,0xf3a594579a6e0676L,
73193         0x103029c57b71d288L,0x0843f428b44c30c0L,0xd8e6aff8730e0b9cL,
73194         0x7b6be8114ed644adL },
73195       { 0x3ec38e4a3d3aa54eL,0x10233943d83d509aL,0xf84aa621243955e2L,
73196         0x29104717f51d3d44L,0x62d2442c7eca4e37L,0x8c5a523d85fa55deL,
73197         0xc6f5ccda851da1b5L,0x044bcaa820001468L,0xf7501e68e01702e0L,
73198         0xf0819359e6a0acecL,0x33dda6adac0ef0b2L,0x97aeedc8fd964f01L,
73199         0x48dacd0e530b90d8L,0x4c5fad6fb84122ebL,0x2284ec1ed700a1deL,
73200         0x86f9a835dbca5474L } },
73201     /* 236 */
73202     { { 0x0e1d9055450cc69fL,0x50eb14bcc9edf98fL,0x1bb94e77ee7eba01L,
73203         0x5f7a6737998f8e53L,0x588384e31b16eef0L,0xbb928723d85c5e15L,
73204         0xfe51e345cbd952aaL,0xc5d0ee287e241674L,0xfdc146ef100182f0L,
73205         0x0f739e92e7f5be2cL,0x501ab3afb656bd3eL,0xb1552dde5168e289L,
73206         0x940dfe31b8ee104aL,0x42923603c4304475L,0x9306f114c460a913L,
73207         0x5bfa9faf03b51f86L },
73208       { 0x2a23f52c107b258eL,0x989e82bbd66341dcL,0x54a3ced8823cff1aL,
73209         0xf45b7794719b491fL,0x898c22182433dfb8L,0x0f9dd91cc49250eeL,
73210         0x50c2a2ae4fa17655L,0xf7aa1ce42c327f45L,0x13a15ad6583b1e41L,
73211         0x9aa0d5a5a1bfad9eL,0x9b1caa288e1fbdcdL,0xaf9283b6915f7f87L,
73212         0xc10e4e0c87e81a1eL,0x04fdca561080d296L,0x6acc961612755bd8L,
73213         0x1b1266aa828feedaL } },
73214     /* 237 */
73215     { { 0x4ebc0a00774ee49cL,0x776f6852cb6237d7L,0xfc0544ac5df938a3L,
73216         0xc3388ec8b6fbfbbdL,0x84ac8bcd745f2eaeL,0xa9c56609b1ece937L,
73217         0x656fb6ac7de8fa13L,0x5f8ded74a532b871L,0xab0d428baa889f09L,
73218         0x43b27f2810b7aec2L,0x26426e1efeecb34cL,0x44431b6b9e89c2dbL,
73219         0xaac4bc5d39211090L,0x926f73684fd81058L,0x452fa691471ef60eL,
73220         0x33517fdb218d7a23L },
73221       { 0xa9c33f46593c4a36L,0xac69d71836b1a9eeL,0x55a20c1d4277beecL,
73222         0x3e8ca24e7e4f179cL,0x57373369d46d88a2L,0x71ceb1cc730702f8L,
73223         0x8b184d9735eed574L,0x7f4517a20704cec2L,0x7f129d18d7062a53L,
73224         0x07a4571bb1d77e1cL,0x774ac3098350d8b2L,0x27b2919f61fab8efL,
73225         0xa7c4cc13b5dd801bL,0xe7e6255b1434591fL,0x349937b85a3592b3L,
73226         0x31fac63d30c77549L } },
73227     /* 238 */
73228     { { 0x2ee8cf1b04913fb6L,0x7e4013501769a6b3L,0x790ebb71783e61f0L,
73229         0x1e5107f9e27f2ffeL,0x124ba67fedaf89bfL,0x189200e1e58de68dL,
73230         0x962732a36df5abeeL,0x72cc37cfacbeb4aaL,0xb0c5fa96e93c5a76L,
73231         0x4c2a317cde63393bL,0x97f65e67830b2d6cL,0x4afc35041be5b96aL,
73232         0x0bf40a60730ce66dL,0x96a1ba799340d84fL,0x3ee1825407626b08L,
73233         0x01db35db7ab0cbf5L },
73234       { 0x6e0fbc2dac0efee2L,0x8406ebcdd71dbb45L,0xe72bde3e19b69abeL,
73235         0x49cb7e6137e01822L,0xcbb8c01c11458b4cL,0x420b4847687c5d63L,
73236         0x1847dfa1454c6776L,0xbede911dd1839d18L,0x1b9dc9c9278df046L,
73237         0x294bd62b881a336cL,0x7f09687993e77adcL,0x7ac9066543ce3ba7L,
73238         0x148695fd7764eefcL,0xe0c20f0b9ac465cfL,0x636e8d28a6e2cdb1L,
73239         0x7b6ba98cd755341dL } },
73240     /* 239 */
73241     { { 0xcb1d9e03c1881ab4L,0x19c25d55b3168c88L,0xa82d3d47282364ceL,
73242         0x95994390f161aa24L,0x7838bc00e1ebb2c9L,0x8fd5dfccbdec7a75L,
73243         0x4dd203c24ff7220aL,0x5ec173b30efeff48L,0x99f1d2b316428b35L,
73244         0xc06bd9e5056e813fL,0x929172bac0b319f1L,0x6ae0e384fd223b15L,
73245         0xbd01059e98d091edL,0x6b3168e4a654648eL,0x2211447f3375e798L,
73246         0x47e8101971eb4508L },
73247       { 0x7045d45abc8c290dL,0xa33d1355810fb33aL,0x2baf009246fbbf2fL,
73248         0xacff3f1b385c7cd9L,0xc5b150ece161985cL,0xc6ee0a7f2a888748L,
73249         0x9d888c8e5e88dcc8L,0x4dd735f2ccb86443L,0xcc1e13b73c40f6f2L,
73250         0xfc3a25fff3fed691L,0x4cb43b17257ee5c7L,0xaa654f93f32db135L,
73251         0x44f58d0a02dff2d3L,0x78e3f188a8ca6394L,0x39646ccef3e86697L,
73252         0x785b1902e0dce87bL } },
73253     /* 240 */
73254     { { 0xfcce2361a92f9a20L,0xb7bdca879d64540eL,0xd4739a851d00d7c5L,
73255         0x067ac8dc2e97c926L,0x2aea3ffe78da6a8bL,0x6828bf5463c51b69L,
73256         0x76f1c4797155141aL,0xf4bcbef63977d810L,0x75bc4949541bce7aL,
73257         0xe01f4066d17041a5L,0xd282d5bd87755eafL,0x6e2107dd59e7ae80L,
73258         0xaa56e166382ab36fL,0x65ee8ef6b9d1d634L,0x99a2160ace4ed844L,
73259         0x6557c367b7712c27L },
73260       { 0x561b0268d75b6e52L,0xb0813640118d0e89L,0xcff533306a2eb1aeL,
73261         0x4e4622266d090894L,0xbb351227b5fc1d48L,0x9365ea0757a3062dL,
73262         0x4caca37bd66e2dc5L,0x220d7d23b9095887L,0x9c0fd3938c4473bfL,
73263         0xadff370a6787da4fL,0xef0aebccd057f4b8L,0x205e744c1173f33aL,
73264         0xb8d1f0a5925a26b4L,0xa9364f49722fbbfdL,0xc891ae778227d284L,
73265         0x15c40d04a0e08ab4L } },
73266     /* 241 */
73267     { { 0x9baf169a2a0e18d1L,0x9971c0174c0327c2L,0xd81a323f7bc262ceL,
73268         0x2099db8d818ff379L,0x663f663d4cd3c330L,0xef5325c3011a0553L,
73269         0x9cd70bdcf980a470L,0xe64452d11c9ed070L,0xafbf43f4ac676e13L,
73270         0x97bec0a6ae85c2a5L,0x2faae550470490c4L,0x0ab97a87491e6ba9L,
73271         0x4055f537aafa9914L,0xfc95adbb36726557L,0x646343b9d119d6bfL,
73272         0x788e94a09d341e37L },
73273       { 0x053a6fe59c53461aL,0x75ec897e08e3b6edL,0xa8f5d2f30768d939L,
73274         0x9bd6bff6cc213d4fL,0x590c7b4105b0147cL,0x20a3628b7c7b8169L,
73275         0xc66a086e5bce78e9L,0x3dd4d2824dec1d8fL,0x890acf44c19dcce9L,
73276         0x6632d875d8435a7eL,0x590167c1ea6381b2L,0xb2259797f0dcc128L,
73277         0x91a612b446f8d463L,0x42185d78c15efa39L,0xdf55ec37119f6788L,
73278         0x91b19cc6780dea93L } },
73279     /* 242 */
73280     { { 0xebf2709dcb5d8b80L,0x03b96182fc35660eL,0xb873d991055ef969L,
73281         0xd1ea4b4de47c4342L,0xcc4b9244d54f8867L,0x93b1a2cafd8d77efL,
73282         0x068d24e7e8c1f563L,0x5f5fabb649973056L,0x83248c500542374fL,
73283         0xc36de2b53f38e913L,0xed07e8eb7bb680beL,0x964813d7d8f313b5L,
73284         0x7bb6a069afd2d392L,0xc06d848e0848a31aL,0x6867fb2fe4f0c325L,
73285         0x3c2ba834067343afL },
73286       { 0xab62d7759d3ad63bL,0x3f9cab9759e0eb1fL,0x70332a633885e117L,
73287         0xf22cafcee20b2f9eL,0xb529ba7e49eca947L,0x249542166228d88dL,
73288         0x80ea23ec39239561L,0x1b8907e7d4370644L,0x4b7fa455563e4e44L,
73289         0xcca9829eb2a4b0faL,0xd0a720a448060792L,0x8ccdda0c246991ceL,
73290         0x37a2325b348d086bL,0x566ed509f60aee13L,0x3d30e091147f253fL,
73291         0x1fa627a5c1073bd8L } },
73292     /* 243 */
73293     { { 0xa11222a242478fd4L,0xacf4c6f1670b2000L,0xf71bb04f8359c6deL,
73294         0x618e28297b93cdbcL,0x96e1bae3230db60bL,0xf17fd3b4965b3b29L,
73295         0xa58639c6bc7055ddL,0xc3ea92ed4b817d7fL,0x9082b2a6d23b08a4L,
73296         0x8471228adc17010eL,0x753b9e4620e89d97L,0xcf7e4f9703ff77c9L,
73297         0x6c3f82452bbe60e5L,0x9e432cbcb80e017dL,0x150a5acdc0a45edbL,
73298         0x67b8bd054798743eL },
73299       { 0xe66079b4f4797cf7L,0xe31c998ad03fde02L,0x5aa3763a54caaef1L,
73300         0x64d9a1fef7649711L,0x7ce0dc73af29b1a7L,0x6661b083fb66ca93L,
73301         0xbf4d74fe32fb6a78L,0x25f6ef09df00a561L,0x2bc4383f831d1159L,
73302         0x6d5cc10c536bde37L,0xd4945f9f882cc65bL,0x81f48f13451a99b8L,
73303         0x140161cd6bac11a4L,0x9d94d4edf18a4a0aL,0x65363165a467a824L,
73304         0x74297aa9a4c9aedfL } },
73305     /* 244 */
73306     { { 0xc49758a4e21124baL,0x99bd8198a87ffbd2L,0x45fbcdd13d6638a8L,
73307         0x94645ff815f7bf76L,0x5fa6736fc4e6d57eL,0x1eae647592e61db9L,
73308         0x79575c0ccbdf944aL,0xa3d1304725b31d74L,0x7881df224cab5ae6L,
73309         0x8dbfd2991a2887f2L,0x23d07590a26ac459L,0x2e589852d8661d4aL,
73310         0x37b5c13b8a0140f7L,0x0f94199e3fb3782aL,0x722aa0591bc14e90L,
73311         0x89aab7bad55bbb12L },
73312       { 0x8b345a96d656bdc7L,0x43bdc8afe176cd3bL,0xd69518b632d64c43L,
73313         0xfcf364a779b82b41L,0x907b344effb0cf82L,0xf3d0c83c5101287bL,
73314         0xe9f26a5934cd90efL,0xe5f5aaf207082b5cL,0x4eb72c75ece7c165L,
73315         0xe9590a81be986cd6L,0xfeef498fff1536aaL,0x04560243a8263d5eL,
73316         0x940be14f54ae872bL,0xbee7bcc9e3207686L,0xd496a27dc1bc4d7aL,
73317         0x002dc2975940ab46L } },
73318     /* 245 */
73319     { { 0xee533937b69d60c3L,0x260be552fe972755L,0xb11fb78dc0c725a6L,
73320         0x6982c27ecab2e7c2L,0x4bceedd9ee2322cbL,0x952b19ed122704f7L,
73321         0x2df4c285854a6165L,0xba40b5bf7b192485L,0xfcbca9500119f52aL,
73322         0x7467d1cbe5add86fL,0x9bf536fbd9d0f2c1L,0x3c296e34b8d4ebc9L,
73323         0x0495f8f405a81317L,0x8c59e8d673335f76L,0x0b53d324e0542122L,
73324         0x4d5645353c3bda73L },
73325       { 0x7322f8007e5c0877L,0x481b43e60ca9a764L,0x231f4f4ba2c12716L,
73326         0x09596857ed3136c2L,0xae82632238db30deL,0x652fad4099908ebcL,
73327         0x0b8d1814af0d231eL,0x2680c54b09cbc349L,0xfd4562f34bf3bf8eL,
73328         0x2985090b092b595fL,0xe6f39ca45e15fc34L,0x70175191bc378168L,
73329         0x906944b3845a4a87L,0xacc6d74a82a1541aL,0xadc9bab3b155c8b4L,
73330         0x1f2f89ce77306c62L } },
73331     /* 246 */
73332     { { 0x8253ef419affefdfL,0x05d7ece54cf9256bL,0x377002f2b444e483L,
73333         0xb189755fcba5471fL,0xc88483cbd5cbe015L,0x254f7c696a0b8429L,
73334         0x18850bd461f3f61dL,0x7ba210890a247157L,0x35abbc2ed92eeb0dL,
73335         0xfb56cabe965dec89L,0x9da23724bc55684aL,0xd8ba396f6a7a7492L,
73336         0xfcb90db72ef4ba46L,0xdd234fe09909b27aL,0xbdf3c16476f4366eL,
73337         0x09c8097f17e50d47L },
73338       { 0x6a04b14060050c07L,0xc29e831843a8e37eL,0xcb9429b2bb55e41fL,
73339         0xed2fea5a2ce60e3aL,0xdc7b1ff3db9d82f4L,0x48ebecc3687d37faL,
73340         0x79153e32ecb07539L,0x6a60054f57075692L,0x3871cd0c800759baL,
73341         0x17a7386f30922df1L,0x4e9fc59e83357b7cL,0x1d26b3a939415186L,
73342         0x912a0222d34db889L,0x6672fcf459fcdb71L,0x5a3f268d44ff3036L,
73343         0x6f113ed36911e16cL } },
73344     /* 247 */
73345     { { 0x52a9df591836f1c9L,0xfa6519f54232307dL,0x8406c7015ded285aL,
73346         0x0a1545caaf627f75L,0xae1111eeace0417dL,0xfb28bdf6a6113443L,
73347         0xde9ef0ab52dbcbcbL,0xe9dc181b7813e658L,0x0b1dabdb99127225L,
73348         0x5f0598e322814c59L,0x5c3b966ed934ee7eL,0x4eb84edab99ba4bfL,
73349         0xb2919a343c1b55e7L,0xa9addb4994aa860fL,0x1b7220dff6811ff6L,
73350         0x6636a23bd1a183e2L },
73351       { 0xdf5d5a2d20587283L,0x0b3822c9ef07fc5dL,0x1786bd550ef6de38L,
73352         0x163cf90725d1671dL,0x74bf971f1cdb1defL,0x5749e8300842fc4aL,
73353         0x0e2edbc727f854f7L,0xbb27bbdabce24acbL,0xc1b19cec05bed08dL,
73354         0xaada123ef7c904bcL,0x02429f1bd89982dbL,0x49d3616e65f6e632L,
73355         0xa3789fa8ee59fd32L,0x160ba3bafe9f29f5L,0x0f2d3b61af5378a0L,
73356         0x7aeecc7673c2a6f8L } },
73357     /* 248 */
73358     { { 0xf3a4757cdc43b0dbL,0x3d8a4e8598119cadL,0xf8095bf64616c156L,
73359         0x3e2a07bc4f533e97L,0xa982436739cfc5adL,0x18a6ba3acd68052cL,
73360         0xbd60e5908a1cec66L,0xae3841a502b1b695L,0x986dff12190a195bL,
73361         0x2df2beacad31fd9bL,0x7d893224cc728f7bL,0xc38ea7380cf0a992L,
73362         0xa8439a80586a44eaL,0xede7f7f01615f03cL,0x4824990827a1f885L,
73363         0x28ec4006b78a7645L },
73364       { 0xe1820c2ea2fe0009L,0xe11ba5d2f13874e9L,0x97522454c524db52L,
73365         0x4d4774267fede529L,0x01d3419a9b2500d4L,0xce08a4921869244bL,
73366         0xba169023dd1be1b9L,0x242c3e5432a301e0L,0x9b56f7ba70906788L,
73367         0xf0ad2a09c74a8cc4L,0x99cd1841d76f9439L,0xeddafe0b621fb60eL,
73368         0x056bee54bc397634L,0x4653f860ff7f0a84L,0x6bd4876f2011c0afL,
73369         0x134f4cc70c9525c3L } },
73370     /* 249 */
73371     { { 0x9621a3ece938dff4L,0x7d101a7b486a79a3L,0xf2c4ef97de950537L,
73372         0xf3184099e65d87dbL,0xb89c7ffb373b8cfaL,0x68baa505e842916eL,
73373         0xa790fd094ebea764L,0x679df6d4e592892bL,0x2023331cfcfed741L,
73374         0x0bf4efd29880ff21L,0x7ca78dddd0344501L,0x2cb09ecb342858c8L,
73375         0x9e5eb6dc2575487aL,0x50675a15ebcb0491L,0x09d2e74f7381d471L,
73376         0x6ea3782983d3d6f4L },
73377       { 0xc65c094b4e5cc40aL,0x7a2e3f6a1af37dfbL,0xef677e9df9026e44L,
73378         0xb7878c9593880f53L,0x4aa30b077f644aa9L,0xa0c516832f208c3cL,
73379         0x7c0277ae658d663bL,0xef0b3c38ae1d9130L,0x302f37a7695c3ea4L,
73380         0xe004c1c56a0c5e0dL,0x9fd495c420cbcf9fL,0x706d5b9d568a0e7cL,
73381         0x8b225dff59286454L,0x527d44658d9a709cL,0x47c558da87c08d68L,
73382         0x606ee6e6bb4ef07dL } },
73383     /* 250 */
73384     { { 0x02d99fc757c621f6L,0x292e40c17fe83d48L,0x1bdfc7a19ef199b0L,
73385         0x78a04102e62c7666L,0x16cda370e6738753L,0xbc81974d1e3a65afL,
73386         0x19742048f78fe209L,0xc83a058abf5981c6L,0xf26b24349c89702dL,
73387         0x988b2f1e9d1a678aL,0x472bf9b0ff29ae29L,0xa143e3981d7cf5ecL,
73388         0x9c9d7e45b268ddd8L,0x166cda555fc4ff76L,0x6044cdf0a4aa7673L,
73389         0x49dba6f7e9148707L },
73390       { 0x20e47fb2a758e37aL,0xaf6b31d72d8eaf66L,0x352ad5f96f9c2210L,
73391         0x0093f72790efc32bL,0x435c99dc41e4b264L,0xbfa878e005b15795L,
73392         0x99c520a40e673575L,0xca68259487eea759L,0x029f7b81f12a348bL,
73393         0xa547cc182aa2ce35L,0xa11d874bead5e2c5L,0x9af0349b55682cdfL,
73394         0xf86ebfea8bbe8e66L,0x3dab8782f55394abL,0x458bf797ebc8eb8fL,
73395         0x4890a7a49b7de78cL } },
73396     /* 251 */
73397     { { 0xd72996898da995f6L,0xd39eaae7ec6156efL,0x6959040c356a82d5L,
73398         0xb2046b21c135bcfeL,0xea720b640f595c78L,0x02824efae7c5fb40L,
73399         0x97d8fd4c0edb3bfcL,0x12f0290579f24ebeL,0x16fc47cf187ea6b9L,
73400         0xc219fd27789d5c23L,0x233a6b6c89263eccL,0x823634b28b6d30a6L,
73401         0xca352e25c9b33680L,0x9388d6ca40c77456L,0xf8e55b0b3c92065bL,
73402         0x5c17474b02439a76L },
73403       { 0xd888e7c28aaccab5L,0x18027836aaced05bL,0x185b877dccec0f65L,
73404         0x93cadc1c125c2882L,0x45df540a67fdc54cL,0x4f3c86e2c2788a33L,
73405         0x3e874469e3a0fa2cL,0xc59daa47273983cfL,0x3063c48b4a96d8a5L,
73406         0xc38d2bcfc2e58915L,0x90e78b8784e428c3L,0x900a292cf0c4fd53L,
73407         0xb7f92db7941e6005L,0x956792416ca53a1cL,0x35f6f31db1ab0fa7L,
73408         0x5d675eb47b58408cL } },
73409     /* 252 */
73410     { { 0xaeee1a77870c6025L,0xfc4a23b791a2dfcaL,0x7b0e60c4386b64c4L,
73411         0xd5d5b17de5ae72b1L,0x6dfc88ac9eefa212L,0x4feaefbed4038b96L,
73412         0x099ac3568e2d2eccL,0x548ea612012af207L,0x4ffed9db89c31218L,
73413         0x1c1e91c4e0e67331L,0x009bb64faf8300e0L,0x8780501c6773c3beL,
73414         0xe0cd6edec08219faL,0x7c055e07f81b06ffL,0x82b63f9ce080b36fL,
73415         0x02fccbaf0a9feca3L },
73416       { 0x9991d4d1b47cac61L,0x2e9d1687ab86e12cL,0x8c6855ec2b94f042L,
73417         0xca40051948e648e5L,0x9ba91fb2ef89ac57L,0x4f4192061be792cdL,
73418         0x82d221cbbd0f1e15L,0x062eb13bfc444019L,0xf3a97c3299790fdcL,
73419         0x4e796d946067a64bL,0xc46dd3006d23775aL,0x8672c4d5ed7f0f23L,
73420         0x821851dc3b4f63d7L,0x50a3ae0cd26273f2L,0x800e58fceac60f6fL,
73421         0x56f1e45613845545L } },
73422     /* 253 */
73423     { { 0x01ccb3f632c24f3bL,0x99eb1c7f06d817e6L,0x8dc640bb6aa26776L,
73424         0x7838affe0845d5e0L,0xf34fecb1f81a79a8L,0x6a2e282d3e6819b0L,
73425         0xc4b977ce8237a4b8L,0x0f46b3db87636439L,0xa465f54097970497L,
73426         0xd7e087628791be43L,0x00220b6c34198ec6L,0x57b38637093d94bbL,
73427         0x84012e1629d690b2L,0x02ec9db520aad1a4L,0xafee2fc685dc34e3L,
73428         0x911d193625500cf8L },
73429       { 0x13b1bd58f5e5af5bL,0xa7ca263b7b6a22a7L,0xab6bec4df3af2adcL,
73430         0x16651e59a04420bdL,0x3b448b3b4ba36c11L,0x3c62bfcdff424310L,
73431         0xde15c4a5f1a96cbbL,0xbe0ad8a1e4d1f980L,0x812bd14e36673a3aL,
73432         0x40303af69212acddL,0x8f6dab9c576095ceL,0x7df1882a107f5ca5L,
73433         0xb903e63c8896a3b0L,0xf5048544d863b3f0L,0x5e5019b9c09887deL,
73434         0x2be744fea0f53865L } },
73435     /* 254 */
73436     { { 0x054cd05f5b50f324L,0xb9b1eb241ea3c7a2L,0x4a858a5c7ff8e6b7L,
73437         0xd83902feec040882L,0x72b26494d0cba9bdL,0xd0176f90b29c9e1eL,
73438         0x05d4eb02cebadb81L,0x874405b1372b8bfcL,0x5c41288179ead190L,
73439         0xd44a3dd3ec2b48cdL,0x84499a773f4d5033L,0xb37b38cd564c3a09L,
73440         0x80e99497f42e803bL,0xc07b47a0b8f518b2L,0xc710e3c53568fde4L,
73441         0x735f542fcead0e7aL },
73442       { 0xcaa9a17138380039L,0xadfafe17f74d19c8L,0x92d4393eccbc1a8bL,
73443         0x3c5dbf39fe029705L,0x4552b5ab930e9b36L,0x7ee630322afd494aL,
73444         0x826a9ad73f02ac43L,0x98c5356299356298L,0x0c869f877342bb39L,
73445         0xd7510020e4f9b79aL,0x6361d1a4d34789a9L,0xf0ded5bacfa85637L,
73446         0x407ee73f88ac07e4L,0xfac7d03f09ef1cbdL,0x25d697cb4d475badL,
73447         0x1e984c9d14bd399eL } },
73448     /* 255 */
73449     { { 0xc76d05614850c817L,0xb08a5b193489812dL,0x7273d1545e58cbbeL,
73450         0x8900b5fa4be61e5aL,0xaa088691d7aeb8e1L,0xe66666afd35a3d4bL,
73451         0x38a2c19957ec7d3dL,0xa0648e8f668d6f5cL,0x1f9fc92c7adc1746L,
73452         0x23a116c0843065c3L,0x36370a2061e6ae69L,0x626c37362aa47e73L,
73453         0x540c25f2deff6d84L,0x9804824ccdbed2d4L,0x4b5bfce0039a9492L,
73454         0x6c474a5676942e01L },
73455       { 0x3aeb9a417d88e3a1L,0x105d3c88c484742aL,0xe59de8d13fe61131L,
73456         0x148f5b6b1a869e8bL,0x7a8abc59aa75d90aL,0x2f0c9bc762146013L,
73457         0x43faa747c3824cd9L,0x81763a186a5d0b92L,0xbbc341bc9bcbaebcL,
73458         0xe1813160f745d1ddL,0xa53ce52db75ce5f4L,0x15eae66cd50de4c2L,
73459         0x5ed8996c75d7656dL,0xe4ff5711c4ca552aL,0x215e985a3c5305b4L,
73460         0x6b258954fa1ba2ceL } },
73461 };
73462 
73463 /* Multiply the base point of P1024 by the scalar and return the result.
73464  * If map is true then convert result to affine coordinates.
73465  *
73466  * Stripe implementation.
73467  * Pre-generated: 2^0, 2^128, ...
73468  * Pre-generated: products of all combinations of above.
73469  * 8 doubles and adds (with qz=1)
73470  *
73471  * r     Resulting point.
73472  * k     Scalar to multiply by.
73473  * map   Indicates whether to convert result to affine.
73474  * ct    Constant time required.
73475  * heap  Heap to use for allocation.
73476  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
73477  */
sp_1024_ecc_mulmod_base_16(sp_point_1024 * r,const sp_digit * k,int map,int ct,void * heap)73478 static int sp_1024_ecc_mulmod_base_16(sp_point_1024* r, const sp_digit* k,
73479         int map, int ct, void* heap)
73480 {
73481     return sp_1024_ecc_mulmod_stripe_16(r, &p1024_base, p1024_table,
73482                                       k, map, ct, heap);
73483 }
73484 
73485 /* Multiply the base point of P1024 by the scalar and return the result.
73486  * If map is true then convert result to affine coordinates.
73487  *
73488  * km    Scalar to multiply by.
73489  * r     Resulting point.
73490  * map   Indicates whether to convert result to affine.
73491  * heap  Heap to use for allocation.
73492  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
73493  */
sp_ecc_mulmod_base_1024(const mp_int * km,ecc_point * r,int map,void * heap)73494 int sp_ecc_mulmod_base_1024(const mp_int* km, ecc_point* r, int map, void* heap)
73495 {
73496 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73497     sp_point_1024* point = NULL;
73498     sp_digit* k = NULL;
73499 #else
73500     sp_point_1024  point[1];
73501     sp_digit k[16];
73502 #endif
73503     int err = MP_OKAY;
73504 
73505 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73506     point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
73507                                          DYNAMIC_TYPE_ECC);
73508     if (point == NULL)
73509         err = MEMORY_E;
73510     if (err == MP_OKAY) {
73511         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16, heap,
73512                                DYNAMIC_TYPE_ECC);
73513         if (k == NULL)
73514             err = MEMORY_E;
73515     }
73516 #endif
73517 
73518     if (err == MP_OKAY) {
73519         sp_1024_from_mp(k, 16, km);
73520 
73521             err = sp_1024_ecc_mulmod_base_16(point, k, map, 1, heap);
73522     }
73523     if (err == MP_OKAY) {
73524         err = sp_1024_point_to_ecc_point_16(point, r);
73525     }
73526 
73527 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73528     if (k != NULL)
73529         XFREE(k, heap, DYNAMIC_TYPE_ECC);
73530     if (point != NULL)
73531         XFREE(point, heap, DYNAMIC_TYPE_ECC);
73532 #endif
73533 
73534     return err;
73535 }
73536 
73537 /* Multiply the base point of P1024 by the scalar, add point a and return
73538  * the result. If map is true then convert result to affine coordinates.
73539  *
73540  * km      Scalar to multiply by.
73541  * am      Point to add to scalar mulitply result.
73542  * inMont  Point to add is in montgomery form.
73543  * r       Resulting point.
73544  * map     Indicates whether to convert result to affine.
73545  * heap    Heap to use for allocation.
73546  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
73547  */
sp_ecc_mulmod_base_add_1024(const mp_int * km,const ecc_point * am,int inMont,ecc_point * r,int map,void * heap)73548 int sp_ecc_mulmod_base_add_1024(const mp_int* km, const ecc_point* am,
73549         int inMont, ecc_point* r, int map, void* heap)
73550 {
73551 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73552     sp_point_1024* point = NULL;
73553     sp_digit* k = NULL;
73554 #else
73555     sp_point_1024 point[2];
73556     sp_digit k[16 + 16 * 2 * 5];
73557 #endif
73558     sp_point_1024* addP = NULL;
73559     sp_digit* tmp = NULL;
73560     int err = MP_OKAY;
73561 
73562 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73563     point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
73564                                          DYNAMIC_TYPE_ECC);
73565     if (point == NULL)
73566         err = MEMORY_E;
73567     if (err == MP_OKAY) {
73568         k = (sp_digit*)XMALLOC(
73569             sizeof(sp_digit) * (16 + 16 * 2 * 5),
73570             heap, DYNAMIC_TYPE_ECC);
73571         if (k == NULL)
73572             err = MEMORY_E;
73573     }
73574 #endif
73575 
73576     if (err == MP_OKAY) {
73577         addP = point + 1;
73578         tmp = k + 16;
73579 
73580         sp_1024_from_mp(k, 16, km);
73581         sp_1024_point_from_ecc_point_16(addP, am);
73582     }
73583     if ((err == MP_OKAY) && (!inMont)) {
73584         err = sp_1024_mod_mul_norm_16(addP->x, addP->x, p1024_mod);
73585     }
73586     if ((err == MP_OKAY) && (!inMont)) {
73587         err = sp_1024_mod_mul_norm_16(addP->y, addP->y, p1024_mod);
73588     }
73589     if ((err == MP_OKAY) && (!inMont)) {
73590         err = sp_1024_mod_mul_norm_16(addP->z, addP->z, p1024_mod);
73591     }
73592     if (err == MP_OKAY) {
73593             err = sp_1024_ecc_mulmod_base_16(point, k, 0, 0, heap);
73594     }
73595     if (err == MP_OKAY) {
73596             sp_1024_proj_point_add_16(point, point, addP, tmp);
73597 
73598         if (map) {
73599                 sp_1024_map_16(point, point, tmp);
73600         }
73601 
73602         err = sp_1024_point_to_ecc_point_16(point, r);
73603     }
73604 
73605 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73606     if (k != NULL)
73607         XFREE(k, heap, DYNAMIC_TYPE_ECC);
73608     if (point)
73609         XFREE(point, heap, DYNAMIC_TYPE_ECC);
73610 #endif
73611 
73612     return err;
73613 }
73614 
73615 #ifndef WOLFSSL_SP_SMALL
73616 /* Generate a pre-computation table for the point.
73617  *
73618  * gm     Point to generate table for.
73619  * table  Buffer to hold pre-computed points table.
73620  * len    Length of table.
73621  * heap   Heap to use for allocation.
73622  * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
73623  * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
73624  */
sp_ecc_gen_table_1024(const ecc_point * gm,byte * table,word32 * len,void * heap)73625 int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
73626     void* heap)
73627 {
73628 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73629     sp_point_1024* point = NULL;
73630     sp_digit* t = NULL;
73631 #else
73632     sp_point_1024 point[1];
73633     sp_digit t[5 * 2 * 16];
73634 #endif
73635     int err = MP_OKAY;
73636 
73637     if ((gm == NULL) || (len == NULL)) {
73638         err = BAD_FUNC_ARG;
73639     }
73640 
73641     if ((err == MP_OKAY) && (table == NULL)) {
73642         *len = sizeof(sp_table_entry_1024) * 256;
73643         err = LENGTH_ONLY_E;
73644     }
73645     if ((err == MP_OKAY) && (*len < (int)(sizeof(sp_table_entry_1024) * 256))) {
73646         err = BUFFER_E;
73647     }
73648 
73649 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73650     if (err == MP_OKAY) {
73651         point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
73652             DYNAMIC_TYPE_ECC);
73653         if (point == NULL)
73654             err = MEMORY_E;
73655     }
73656     if (err == MP_OKAY) {
73657         t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 16, heap,
73658             DYNAMIC_TYPE_ECC);
73659         if (t == NULL)
73660             err = MEMORY_E;
73661     }
73662 #endif
73663 
73664     if (err == MP_OKAY) {
73665         sp_1024_point_from_ecc_point_16(point, gm);
73666             err = sp_1024_gen_stripe_table_16(point,
73667                 (sp_table_entry_1024*)table, t, heap);
73668     }
73669     if (err == 0) {
73670         *len = sizeof(sp_table_entry_1024) * 256;
73671     }
73672 
73673 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73674     if (t != NULL)
73675         XFREE(t, heap, DYNAMIC_TYPE_ECC);
73676     if (point != NULL)
73677         XFREE(point, heap, DYNAMIC_TYPE_ECC);
73678 #endif
73679 
73680     return err;
73681 }
73682 #else
73683 /* Generate a pre-computation table for the point.
73684  *
73685  * gm     Point to generate table for.
73686  * table  Buffer to hold pre-computed points table.
73687  * len    Length of table.
73688  * heap   Heap to use for allocation.
73689  * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
73690  * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
73691  */
sp_ecc_gen_table_1024(const ecc_point * gm,byte * table,word32 * len,void * heap)73692 int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
73693     void* heap)
73694 {
73695     int err = 0;
73696 
73697     if ((gm == NULL) || (len == NULL)) {
73698         err = BAD_FUNC_ARG;
73699     }
73700 
73701     if ((err == 0) && (table == NULL)) {
73702         *len = 0;
73703         err = LENGTH_ONLY_E;
73704     }
73705     if ((err == 0) && (*len != 0)) {
73706         err = BUFFER_E;
73707     }
73708     if (err == 0) {
73709         *len = 0;
73710     }
73711 
73712     (void)heap;
73713 
73714     return err;
73715 }
73716 #endif
73717 /* Multiply the point by the scalar and return the result.
73718  * If map is true then convert result to affine coordinates.
73719  *
73720  * km     Scalar to multiply by.
73721  * gm     Point to multiply.
73722  * table  Pre-computed points.
73723  * r      Resulting point.
73724  * map    Indicates whether to convert result to affine.
73725  * heap   Heap to use for allocation.
73726  * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
73727  */
sp_ecc_mulmod_table_1024(const mp_int * km,const ecc_point * gm,byte * table,ecc_point * r,int map,void * heap)73728 int sp_ecc_mulmod_table_1024(const mp_int* km, const ecc_point* gm, byte* table,
73729         ecc_point* r, int map, void* heap)
73730 {
73731 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73732     sp_point_1024* point = NULL;
73733     sp_digit* k = NULL;
73734 #else
73735     sp_point_1024 point[1];
73736     sp_digit k[16];
73737 #endif
73738     int err = MP_OKAY;
73739 
73740 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73741     point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
73742         DYNAMIC_TYPE_ECC);
73743     if (point == NULL) {
73744         err = MEMORY_E;
73745     }
73746     if (err == MP_OKAY) {
73747         k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16, heap, DYNAMIC_TYPE_ECC);
73748         if (k == NULL)
73749             err = MEMORY_E;
73750     }
73751 #endif
73752 
73753     if (err == MP_OKAY) {
73754         sp_1024_from_mp(k, 16, km);
73755         sp_1024_point_from_ecc_point_16(point, gm);
73756 
73757 #ifndef WOLFSSL_SP_SMALL
73758             err = sp_1024_ecc_mulmod_stripe_16(point, point,
73759                 (const sp_table_entry_1024*)table, k, map, 0, heap);
73760 #else
73761         (void)table;
73762         err = sp_1024_ecc_mulmod_16(point, point, k, map, 0, heap);
73763 #endif
73764     }
73765     if (err == MP_OKAY) {
73766         err = sp_1024_point_to_ecc_point_16(point, r);
73767     }
73768 
73769 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
73770     if (k != NULL)
73771         XFREE(k, heap, DYNAMIC_TYPE_ECC);
73772     if (point != NULL)
73773         XFREE(point, heap, DYNAMIC_TYPE_ECC);
73774 #endif
73775 
73776     return err;
73777 }
73778 
73779 /* Multiply p* in projective co-ordinates by q*.
73780  *
73781  * r.x = p.x - (p.y * q.y)
73782  * r.y = (p.x * q.y) + p.y
73783  *
73784  * px  [in,out]  A single precision integer - X ordinate of number to multiply.
73785  * py  [in,out]  A single precision integer - Y ordinate of number to multiply.
73786  * q   [in]      A single precision integer - multiplier.
73787  * t   [in]      Two single precision integers - temps.
73788  */
sp_1024_proj_mul_qx1_16(sp_digit * px,sp_digit * py,const sp_digit * q,sp_digit * t)73789 static void sp_1024_proj_mul_qx1_16(sp_digit* px, sp_digit* py,
73790         const sp_digit* q, sp_digit* t)
73791 {
73792     sp_digit* t1 = t;
73793     sp_digit* t2 = t + 2 * 16;
73794 
73795     /* t1 = p.x * q.y */
73796     sp_1024_mont_mul_16(t1, px, q, p1024_mod, p1024_mp_mod);
73797     /* t2 = p.y * q.y */
73798     sp_1024_mont_mul_16(t2, py, q, p1024_mod, p1024_mp_mod);
73799     /* r.x = p.x - (p.y * q.y) */
73800     sp_1024_mont_sub_16(px, px, t2, p1024_mod);
73801     /* r.y = (p.x * q.y) + p.y */
73802     sp_1024_mont_add_16(py, t1, py, p1024_mod);
73803 }
73804 
73805 /* Square p* in projective co-ordinates.
73806  *
73807  *   px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2
73808  *   py' = 2 * p.x * p.y
73809  *
73810  * px  [in,out]  A single precision integer - X ordinate of number to square.
73811  * py  [in,out]  A single precision integer - Y ordinate of number to square.
73812  * t   [in]      Two single precision integers - temps.
73813  */
sp_1024_proj_sqr_16(sp_digit * px,sp_digit * py,sp_digit * t)73814 static void sp_1024_proj_sqr_16(sp_digit* px, sp_digit* py, sp_digit* t)
73815 {
73816     sp_digit* t1 = t;
73817     sp_digit* t2 = t + 2 * 16;
73818 
73819     /* t1 = p.x + p.y */
73820     sp_1024_mont_add_16(t1, px, py, p1024_mod);
73821     /* t2 = p.x - p.y */
73822     sp_1024_mont_sub_16(t2, px, py, p1024_mod);
73823     /* r.y = p.x * p.y */
73824     sp_1024_mont_mul_16(py, px, py, p1024_mod, p1024_mp_mod);
73825     /* r.x = (p.x + p.y) * (p.x - p.y) */
73826     sp_1024_mont_mul_16(px, t1, t2, p1024_mod, p1024_mp_mod);
73827     /* r.y = (p.x * p.y) * 2 */
73828     sp_1024_mont_dbl_16(py, py, p1024_mod);
73829 }
73830 
73831 #ifdef WOLFSSL_SP_SMALL
73832 /* Perform the modular exponentiation in Fp* for SAKKE.
73833  *
73834  * Simple square and multiply when expontent bit is one algorithm.
73835  * Square and multiply performed in Fp*.
73836  *
73837  * base  [in]   Base. MP integer.
73838  * exp   [in]   Exponent. MP integer.
73839  * res   [out]  Result. MP integer.
73840  * returns 0 on success and MEMORY_E if memory allocation fails.
73841  */
sp_ModExp_Fp_star_1024(const mp_int * base,mp_int * exp,mp_int * res)73842 int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
73843 {
73844 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
73845     !defined(WOLFSSL_SP_NO_MALLOC)
73846     sp_digit* td;
73847     sp_digit* t;
73848     sp_digit* tx;
73849     sp_digit* ty;
73850     sp_digit* b;
73851     sp_digit* e;
73852 #else
73853     sp_digit t[4 * 2 * 16];
73854     sp_digit tx[2 * 16];
73855     sp_digit ty[2 * 16];
73856     sp_digit b[2 * 16];
73857     sp_digit e[2 * 16];
73858 #endif
73859     sp_digit* r;
73860     int err = MP_OKAY;
73861     int bits;
73862     int i;
73863 
73864 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
73865     !defined(WOLFSSL_SP_NO_MALLOC)
73866     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 16 * 2, NULL,
73867                             DYNAMIC_TYPE_TMP_BUFFER);
73868     if (td == NULL) {
73869         err = MEMORY_E;
73870     }
73871 #endif
73872 
73873     if (err == MP_OKAY) {
73874 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
73875     !defined(WOLFSSL_SP_NO_MALLOC)
73876         t  = td;
73877         tx = td + 4 * 16 * 2;
73878         ty = td + 5 * 16 * 2;
73879         b  = td + 6 * 16 * 2;
73880         e  = td + 7 * 16 * 2;
73881 #endif
73882         r = ty;
73883 
73884         bits = mp_count_bits(exp);
73885         sp_1024_from_mp(b, 16, base);
73886         sp_1024_from_mp(e, 16, exp);
73887 
73888         XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 16);
73889         sp_1024_mul_16(b, b, p1024_norm_mod);
73890         err = sp_1024_mod_16(b, b, p1024_mod);
73891     }
73892     if (err == MP_OKAY) {
73893         XMEMCPY(ty, b, sizeof(sp_digit) * 16);
73894 
73895         for (i = bits - 2; i >= 0; i--) {
73896             sp_1024_proj_sqr_16(tx, ty, t);
73897             if ((e[i / 64] >> (i % 64)) & 1) {
73898                 sp_1024_proj_mul_qx1_16(tx, ty, b, t);
73899             }
73900         }
73901     }
73902 
73903     if (err == MP_OKAY) {
73904         sp_1024_mont_inv_16(tx, tx, t);
73905 
73906         XMEMSET(tx + 16, 0, sizeof(sp_digit) * 16);
73907         sp_1024_mont_reduce_16(tx, p1024_mod, p1024_mp_mod);
73908         XMEMSET(ty + 16, 0, sizeof(sp_digit) * 16);
73909         sp_1024_mont_reduce_16(ty, p1024_mod, p1024_mp_mod);
73910 
73911         sp_1024_mul_16(r, tx, ty);
73912         err = sp_1024_mod_16(r, r, p1024_mod);
73913     }
73914     if (err == MP_OKAY) {
73915         err = sp_1024_to_mp(r, res);
73916     }
73917 
73918 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
73919     !defined(WOLFSSL_SP_NO_MALLOC)
73920     if (td != NULL) {
73921         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
73922     }
73923 #endif
73924     return err;
73925 }
73926 
73927 #else
73928 /* Pre-computed table for exponentiating g.
73929  * Striping: 8 points at a distance of (128 combined for
73930  * a total of 256 points.
73931  */
73932 static const sp_digit sp_1024_g_table[256][16] = {
73933     { 0x0000000000000000L, 0x0000000000000000L, 0x0000000000000000L,
73934       0x0000000000000000L, 0x0000000000000000L, 0x0000000000000000L,
73935       0x0000000000000000L, 0x0000000000000000L, 0x0000000000000000L,
73936       0x0000000000000000L, 0x0000000000000000L, 0x0000000000000000L,
73937       0x0000000000000000L, 0x0000000000000000L, 0x0000000000000000L,
73938       0x0000000000000000L },
73939     { 0x170a46d2335c1685L, 0xeac9e971e1007a58L, 0x40e8f3df43ca4a73L,
73940       0x2646f81582642475L, 0x3af49bb4b36576d1L, 0xd89e2d1472bf1afbL,
73941       0x27be882c2fd151e6L, 0xaddedc858f88717cL, 0xd6d859bf16ac6c6fL,
73942       0x0e741a1b2d8eae58L, 0x6faf7a0061c1f30dL, 0x66dbd09a9b67e096L,
73943       0x21f11c067d3b4f7dL, 0x6152ba02c727c98eL, 0xafd58891e86cb221L,
73944       0x59e93c6a6bd3baf4L },
73945     { 0xe54dd36f71dd4594L, 0xbbc9cc9f00aef1e6L, 0x9ea5a44ea19f6530L,
73946       0x8588aa993f520928L, 0x9753794c8f5c1418L, 0x118bd792c11399faL,
73947       0xb9bd3afdf5cb6ab5L, 0x813d1cb22ecb9652L, 0xfd45626740389813L,
73948       0x51f7119b4ac8431cL, 0xdd9f6a910a180eb6L, 0x13946d179f7bfa2eL,
73949       0x16f1863150a9d0d9L, 0x5f19c20d6f8373d3L, 0xbe85ac6a9b6a52b9L,
73950       0x63ef187b74f62e03L },
73951     { 0x7c376b7f016f45e7L, 0x1c1bdb572bec82f8L, 0x7392f741ce429b60L,
73952       0x6fdbf0a2c7afd81dL, 0xbda41b1f7241098bL, 0x5b407474bb60f8cfL,
73953       0x933e0d41b330bc4dL, 0xae182830733fa3beL, 0xa0ed299b0f5c6cd1L,
73954       0x7ff3354e3f9860c8L, 0xb136098615559c41L, 0xab0cb63c129f85cbL,
73955       0x682ecc4947685fbeL, 0x505e8ec2eb199633L, 0x90dcc794ddac2cdaL,
73956       0x4fe6791cf192da23L },
73957     { 0x94a423d505e8733cL, 0xcc845e651d5717c1L, 0x237c7e88e961b322L,
73958       0x0c4471c6db4181ccL, 0x00c875e2713bd721L, 0x9dfde9edb2c17b09L,
73959       0x430a6de5e88ceaf6L, 0xaaa7a61a7b81cea6L, 0xea52d026233f98d5L,
73960       0xb55efdd060689a9aL, 0x30cfa7ce5cac4aabL, 0xfa4db1148e950761L,
73961       0x309570c44e9a1e52L, 0x18c21f611a040170L, 0x555d1ffebe78d9d2L,
73962       0x04482a18561db297L },
73963     { 0xe7758ac273d486d8L, 0x8169f94661cdc1e7L, 0x723c99fc2188ab4fL,
73964       0xa0e54f02f3373630L, 0x560bee25bd8c2260L, 0x28fc307c4531bc60L,
73965       0xd6f21f1a7e44feb5L, 0xc8e4499c57128d37L, 0x963b053ed7b2ea45L,
73966       0x40c27a0432a3d222L, 0x5b51854d35459668L, 0x66e1a49fd73557e9L,
73967       0x0d267fd98692077aL, 0xfa1350d3e7342702L, 0x1a9c3f2568ccdb44L,
73968       0x833a0ff8dedbf89fL },
73969     { 0xa8c419c7ab376b76L, 0x3b7294f327d0f0ccL, 0xe56bb9e2a90c514dL,
73970       0x931ba51ea62575a6L, 0x56fee07b098c0a88L, 0x04be5aeeb4c16a2aL,
73971       0xe513350be6eb260bL, 0x339edad6a1d5c270L, 0xf366ed59e9dbadd1L,
73972       0x4213be882dd06ec0L, 0x22d639c8cb1187dbL, 0x1fec95e1d8a1058aL,
73973       0x03f73ea6a2b744f1L, 0x741fd51af4f05c0cL, 0x2e2df95a85f811a0L,
73974       0x692b3ce3eb24965fL },
73975     { 0x0ce6cb72d2a127b4L, 0x66a46ea58f92816fL, 0x43ecf46347a37616L,
73976       0x163d9a01e0ab96eeL, 0xc8145c6db2edbe8cL, 0x2f426cae4de4e665L,
73977       0x174d0b4074e252f9L, 0x54c240d77d2af831L, 0x581fa3973d652936L,
73978       0x05b9491ca09d4695L, 0x8c4e85335452643cL, 0x32d64331d4128327L,
73979       0x6447903870361f25L, 0x774191b189ef09f2L, 0xc0cf0aaf81de5fe0L,
73980       0x333e430af40042d6L },
73981     { 0x5df04de4cf26d3b7L, 0x57a77306b53f79beL, 0xa4013c5f1808b664L,
73982       0xef291ea485037360L, 0x1ffc9d7d0b061037L, 0xd9d04dd965c913bbL,
73983       0x948a37aff13b8587L, 0xb5443483fe3ee755L, 0x3fc21e7404631386L,
73984       0xb3a104e5cddeb58cL, 0x94fe18626572cd52L, 0xeb9a71a115aaa408L,
73985       0x8adc6fe5459ea462L, 0xbb18d1754aeb02a3L, 0xae1276362f7791d1L,
73986       0x10e8b31dd6bbd708L },
73987     { 0xb87f03e53ed9f1afL, 0x03ad247756676166L, 0x38dcd63074ce15b8L,
73988       0x1877e2b026b1e85bL, 0xb1654d171af99c15L, 0x9782e9e49382547aL,
73989       0x6dc7fc7c26d55ef5L, 0x9038f95d2fbeb54cL, 0xfe590dfe036c0357L,
73990       0xcfcb6eae4fdc3f7fL, 0xcb1fbc54f35e1a88L, 0x3c8e1db2da0a5568L,
73991       0x9a87393f5b6f5557L, 0x38646b32e7ac0a06L, 0xfd261c832a8495abL,
73992       0x6485524c0cdcc4bcL },
73993     { 0x1abfb3e2c4a6ff2aL, 0x2aa03fba35a6428aL, 0x884227f089aff742L,
73994       0x2337883aba5dbd93L, 0x38186ae9d2a182cbL, 0xb9f0764d49a01f05L,
73995       0x92411feb917b1e7aL, 0x700b1903570cbb5bL, 0x5d5181d5b914be7cL,
73996       0x135c44371981182dL, 0x32758d24574b9997L, 0xa650a8f5632d28b2L,
73997       0x24078bacfa383f09L, 0x6546a60c00a33d80L, 0xa4061c7a2df8b449L,
73998       0x1f76f3f2f234563cL },
73999     { 0x9aa2c14344c436b0L, 0x790705561f69c87aL, 0x35f3117b5f6db2dfL,
74000       0x85761f41ed56ba82L, 0xf831464f7d0afa48L, 0xa99f29153adce71eL,
74001       0xb27bf693116b7488L, 0xa98a5a8c9bb9443aL, 0x7f8780262ee5fde8L,
74002       0x3a6f93dd1812acb7L, 0xaf92a4ccdc84bc92L, 0x3c2562aff1d4995aL,
74003       0xfd9fc33c04ed899dL, 0xc028ca944ed2a538L, 0xd0f367bb049ea726L,
74004       0x04924ffb3d108e05L },
74005     { 0x06548e3dc673562fL, 0xd3b33025e2eae48cL, 0xe61fd32b5e1c6977L,
74006       0x424e20646ebe557bL, 0x767391c041d6e18eL, 0x4b8ebb8e14d7e95bL,
74007       0x4ae8b7d420991b8cL, 0xf8a0df66e01290d3L, 0xc97e24a3925e5f4eL,
74008       0x79a7b2cb1508272aL, 0xb40b072e25072661L, 0xdad9e1829062fa49L,
74009       0x8780a784f3c53bceL, 0x58a82b769f142799L, 0x08cd849cc1468426L,
74010       0x4dfce809c380ae35L },
74011     { 0x45069cb2d527b780L, 0xd52da015977930ddL, 0x10cc600be27d0263L,
74012       0x34102c26bb2d1b2bL, 0x4c652623554adf3cL, 0xd689138245f0ff47L,
74013       0x83fa8cc5ca916e7cL, 0x1e10f139d15c8d8aL, 0xf173dc2e81dc56b3L,
74014       0x7fcecb045c4ed9baL, 0x307fd7d847d01228L, 0x24a571539f3a532fL,
74015       0x59e9e81de2153c22L, 0xc562595de428a408L, 0xdc7daff89339bd23L,
74016       0x0d075908b8a06802L },
74017     { 0x870af2a7de085f2aL, 0x88fcd24fbe99b2e5L, 0x88c0d26159ca413bL,
74018       0x1f02a2e48559f851L, 0x83b96021f622da0dL, 0x5c05c2f56dca3615L,
74019       0x0148cf1c7910c682L, 0x392f2896272695beL, 0x883d0bb5a8d64ef6L,
74020       0xef0d22441cfcbc52L, 0xf5dafcec526117e5L, 0xb68612b9f04928e9L,
74021       0x283f744d393f2e2aL, 0xfbeed7ed700c1151L, 0xf2cde215a4360dfeL,
74022       0x24fa961c2f08535aL },
74023     { 0x0767db3f616df7f6L, 0x643057d8fbd90326L, 0x174daa906e82d544L,
74024       0x2284f345689643dbL, 0x18b191dfcc89a060L, 0xbab46af4d6c27d12L,
74025       0x5a57f486c9895145L, 0xc03214e9cc942f9eL, 0x273e1c8f41950158L,
74026       0x8ceb759f39ad43abL, 0x5e1b8b7fe50ee173L, 0xf635b1fc8f4d7d4eL,
74027       0x8eff77e3755603f3L, 0x201f61d17752fa60L, 0x94d7a03d4a6fb6e1L,
74028       0x371cc23dfc4f0114L },
74029     { 0x289b115dda90c351L, 0x6d196ebf364d9c06L, 0x77a89202f650b31bL,
74030       0xcc28c1646f57642fL, 0xdc4f7e3608100127L, 0x8836cd08dc4c807bL,
74031       0x1280f156e00240f2L, 0x3f9a6d7899cb3953L, 0x40a494d33a802038L,
74032       0x45697e91e87d3474L, 0x70d97d0726dde24aL, 0x06f6a58d7640c30eL,
74033       0x03c2c0e85ba6e6c6L, 0x330f6a7af1bc13e8L, 0x3e602e4fc9f4d78fL,
74034       0x92b6bca00c80fb7fL },
74035     { 0x2e3d5c835f00822eL, 0x0e825712b8b16f12L, 0x81c329c492b0a330L,
74036       0x6b4e32ada7cc1954L, 0x0bee9cee1bb1413fL, 0xedfb7baa4a92ca27L,
74037       0xcd472afaea3b9153L, 0xe8f09e7e00f0c0f9L, 0xa4e1d8725cdebb70L,
74038       0xfe2bae084a9b63b6L, 0xf40141b83fd58f65L, 0xd7ec5edaa3b62759L,
74039       0x9aaf6e67790e3088L, 0x215ad8301f277e31L, 0xe7db4b98cf33871cL,
74040       0x71ff62c94f02f89dL },
74041     { 0xaa4c71022a4a84d9L, 0xe2ee4acd5ebc71e6L, 0x3b11a8a5f1cd6578L,
74042       0x83f5ef9ffff120a5L, 0xa4c598e109e65033L, 0xe1e9f990ca044180L,
74043       0x8b832d46f59828c1L, 0x753f28a033af536bL, 0x92edc4b1b6d4f68aL,
74044       0xedde692a72ccd1f0L, 0xd3aa0f7dd2226432L, 0x38dbb63ea3d2661cL,
74045       0xf1e19fc6fdc37ddaL, 0x6c18b35084ef6b4cL, 0xe6a83fe9df1bba69L,
74046       0x40fd47e75f958273L },
74047     { 0x5b88b746267140a4L, 0x6dbbfc1eeab6f2fbL, 0xdd9ec88e69862548L,
74048       0x69beeba12eb6efc2L, 0xcfc2214a8ac8ff88L, 0x95d5c96eb5a21950L,
74049       0x93389c054171fb69L, 0x2d85d4521b468337L, 0x14d68a084113425cL,
74050       0xe52c0139ec6c2174L, 0x20cf0b97f730084dL, 0x1ac16a261f578aa3L,
74051       0x18b9fab3f9b6ae43L, 0x68d82111d854a695L, 0x0b334d98dffbe286L,
74052       0x5b1c1157e639338cL },
74053     { 0x90edaab172b6bb8fL, 0x8dc64ed202fc92c2L, 0xf42ba3c5fe694c73L,
74054       0x316dc65fcb54dce4L, 0xcb2d66a3632420dcL, 0x16e706e7056dcf94L,
74055       0x2809c764a4f32c9dL, 0xab18d830ea6edca8L, 0x4fd1ace681c65f57L,
74056       0x1f91651c7da12c10L, 0x0ac3bd66c7791a48L, 0xb6ad1cf4785e67a3L,
74057       0xe4d3fc44da0fd591L, 0xce1648016e1c6344L, 0x84de9cb833e50ab3L,
74058       0x963ab83aa756eef4L },
74059     { 0x944b47d8df4ea5a3L, 0x965688155cfe45feL, 0xd16e7d588a3c3564L,
74060       0x84e55b3ee7c99e15L, 0x3fee204df55071bcL, 0x71006f2904057dceL,
74061       0xfe8c390dbba75570L, 0x3645bcb63319adacL, 0x8189e8b07c20bfd8L,
74062       0x8e5509697d7d9578L, 0x037d1321b99f4e3bL, 0x011b2521a60cfb6aL,
74063       0x66594aaa837382daL, 0xc89b91fd83c1dc07L, 0x6b82b899076b9884L,
74064       0x443480fcbe45c558L },
74065     { 0xf8ffffb49114221aL, 0x4aec4f2e3e857a7aL, 0x42e2d0e40fa54787L,
74066       0xef3e6b31d6f96152L, 0xb2296537fbfe9b77L, 0xc2a9d0f2fb43a86aL,
74067       0x241284ed24572ac6L, 0xa3868917e721ba7bL, 0xdbef7c00c117a78dL,
74068       0x38149071d31605acL, 0xc2dada9e065a8ee9L, 0xd5b138d8c442be82L,
74069       0x9b6c224bf6d72b58L, 0xb9d355cf8eb03e6dL, 0xab6d1eb0a1700371L,
74070       0x97118a88cffaa7ebL },
74071     { 0xbf9c59a2cdecb5d8L, 0x8083c81ba93a6866L, 0x24e0dd8104774fbfL,
74072       0xe779a3caa02070b4L, 0x9d352fbb0fbfb781L, 0xa8b0d8203ef2a1c4L,
74073       0xb858637b14b3e501L, 0x5ba70a498a882ff2L, 0xa27300833b06efa5L,
74074       0xa42c02f4102fee2aL, 0xe4e762998a0223a5L, 0xdba2ba2685c3fc72L,
74075       0x554fe763fe52eae7L, 0x30b5405a270f45f6L, 0xd56a177aa573387cL,
74076       0x17c0778d4b71fa82L },
74077     { 0x0e6dff1d2735e37bL, 0xc9884e56656ec572L, 0xa2f5ac9d9ebba978L,
74078       0x40fa4518ba09f3c4L, 0x8c3fa177f5b04377L, 0xa1a1decd967a2ecaL,
74079       0x768bca700528bd40L, 0xf224952b18691c4aL, 0x16e12c45e86d5fd5L,
74080       0x7a0d915737859a6aL, 0x723f4309a0ffce0eL, 0x5a8db79ba96cc9a3L,
74081       0x6dd12ae01ad23a38L, 0x9ffec3a1e2bf5d84L, 0xd6ce84e1a452ed66L,
74082       0x1219d5c8571fe4c6L },
74083     { 0x43eaa67f262969ebL, 0x3a3ab39d2f03e773L, 0xe6127e5157bb0909L,
74084       0x0f82b0ed8d150274L, 0xffffcad8e580bdbdL, 0x51d3d075a9743e6bL,
74085       0x1484bdb18bac11d6L, 0x95cd9990eb24c388L, 0x216a61d07fac67c6L,
74086       0x4308f762a04e6b87L, 0x2865dd61cba57cc8L, 0x3c296b0dd234a07aL,
74087       0x76f928393a0793f9L, 0x70b57e1f0be29eceL, 0x1314a82f7e626f42L,
74088       0x2c8d7ab2d657f230L },
74089     { 0x67cf58920825e4d6L, 0xdf51eaa56ef83b44L, 0x63e665d81310108dL,
74090       0x229f89f58dd0963fL, 0x8c4b14dd9df6436aL, 0x99dae469d45ebba7L,
74091       0x118aab775a4df381L, 0xda8978bd29e37febL, 0x69ced5aaaca2d7efL,
74092       0x6c98d05dc67d6a8aL, 0x7474bf0d77f84a34L, 0xd4428b2eed8cd59aL,
74093       0xb0fd1cd5d1d398fbL, 0x596013db94a20b11L, 0x96eb705a1b404c44L,
74094       0x2299d2774b09d958L },
74095     { 0x5b9cd58dc64397e6L, 0xac198f1ebf6dd31eL, 0x5866d8e13e9f1db2L,
74096       0x405ae2878fcdc68cL, 0xa4b280cde53c01fdL, 0xdc963f2d411db5f6L,
74097       0xed5d5189bec4f8a0L, 0x336fd13d916ee98bL, 0x6925b1b3042df48eL,
74098       0x0cf56291ace0074eL, 0xe8d38b4825317e95L, 0xc7ad1d2b821c446bL,
74099       0x71c44135f0b65934L, 0x971b736f52ca0d50L, 0xaf9ffa5727b46c26L,
74100       0x21ac67791936618eL },
74101     { 0xab420e3f2d7fbcd2L, 0x1272247397bdfc18L, 0x492033f84df5d4b4L,
74102       0x6fcd42363807b7d3L, 0xdfc19b09b33c3625L, 0x13d6f375a0f22814L,
74103       0x70978a59037c19b8L, 0x4f3989970ff27b9cL, 0xfc0e1a45615a4389L,
74104       0xffa3496a3e602f74L, 0xc3f1c431b261ca1cL, 0x612211dbee0164cdL,
74105       0x30463ee4e7f7be9fL, 0x015f7e7892c2e1bbL, 0x663d88d624483a56L,
74106       0x0e8ec1e70e62d9d8L },
74107     { 0xa88ccc298a0878ddL, 0x99ac175d6640071aL, 0x90344820a5173617L,
74108       0x316d023edd58a315L, 0x30785bd488d221a1L, 0xb74b3de7959c48e3L,
74109       0x42ee03824c67a771L, 0x59ef6cdde0b91453L, 0x7830ae289b237e91L,
74110       0xe1847a4c495d8325L, 0x67b1217ed0773666L, 0x58192c86a294a325L,
74111       0x76aa0f56864d8326L, 0xe2a2bd12f4b13e5bL, 0xd850c1c01b6b73fdL,
74112       0x653a795f5d103635L },
74113     { 0xcfe2898550dcb199L, 0xb35b8e5e7fa02b60L, 0xbca7d7c3c97603d0L,
74114       0xb0e5288d27f131b5L, 0x3aa704dee2b12d52L, 0xe206b1d81db725c7L,
74115       0x0b12839ac5d1b113L, 0x14f970cbdb45d763L, 0xc997f93eb2125e8eL,
74116       0xbd75739cee7daa26L, 0x46ecbd3f1fef20e9L, 0xf994a1147c6a42b1L,
74117       0xd289eb4f27fb0fd1L, 0x11186d319a40da4bL, 0x083f65a5fb9d7976L,
74118       0x30dfc47bd444675eL },
74119     { 0xbcfc5ae29eaadfe8L, 0x25027e54b4d4e812L, 0xab0702df8b533561L,
74120       0xa2b9c20456a6a214L, 0xb1a3df7a3059068eL, 0xa3514b219883110fL,
74121       0xb7be2336c4b78e1cL, 0x17073ce63e2f6984L, 0x86e114a62ddf7ac6L,
74122       0x276192bf07d7c3c8L, 0x5da69e0beb1ae289L, 0x983af17525184939L,
74123       0x9ac52a4d407a3aa0L, 0x1535c7daae0fe218L, 0xe16fe872397f2501L,
74124       0x572a591f54c212cfL },
74125     { 0x4966841909a5553aL, 0x3f054318327733bcL, 0xf9ceb4b23eefd690L,
74126       0xbd3cbf9bf22126d4L, 0x6d9671c02fed9578L, 0xbba597ceca0306d8L,
74127       0xb705ed613d674fe5L, 0xf1d3622b67f33f76L, 0x15bcf3c611cb8c31L,
74128       0xa38467dce53d1aa9L, 0x902fe929f908ab43L, 0x6e3e499d8d15767aL,
74129       0x8142db5c90afd07bL, 0x120c6fbc6c8b190eL, 0x80c8655324919a4eL,
74130       0x65c2cbe1d8c82c3cL },
74131     { 0x684cda20a660bb63L, 0x27dc3b0a86e86245L, 0x76472cf66ba0eed7L,
74132       0x79c162e5679dd158L, 0xb688427708452d44L, 0x829bc6b3413f579eL,
74133       0x92ea15ec95011770L, 0x5e34e30047738183L, 0x8c3ca34973e1d2f1L,
74134       0xa5c4f1dc229bd3deL, 0x783eff1b94ef7ed3L, 0x46db738ddfae7a1aL,
74135       0x4353d72e1a099852L, 0x2533ad58a0dcf4abL, 0xd80550160e7888b9L,
74136       0x831440d53ba77f66L },
74137     { 0xf43e2e32f611b2daL, 0x5d066e29d0fa46acL, 0xe897f3e8820b3c0dL,
74138       0xc45c28e61d3e44f0L, 0x929d7f66dfd27a66L, 0x735b860a101e8517L,
74139       0xea3fce983de078ddL, 0xc9977db5638ce11aL, 0x0488382f48536b3bL,
74140       0x7e0c7a3c64cadfc6L, 0x3cd17f7f82147b71L, 0xe95663cc1b411e3eL,
74141       0x5739ac8f985fb46dL, 0x385399cdbcf119caL, 0x4a985a70e15a2815L,
74142       0x504c3a8a6d5f4566L },
74143     { 0x00b55283b8fa53c7L, 0x985cff38509474e3L, 0x234d241c437ce25fL,
74144       0x29832430e5a129edL, 0x6ad38956aabcc674L, 0xa2dc001d7ee81ee1L,
74145       0x4c23c6b6670b2702L, 0xb35e567ea6e8a3bbL, 0xbc70b3cea69673eaL,
74146       0x85a7a9c3e6e28eacL, 0x2ae684de5537b7daL, 0x5ecac3e56de937dcL,
74147       0xbf2ea6c9f8430422L, 0x38caf7d077fdc520L, 0xc27af0b169f56addL,
74148       0x496e4699c71d21d2L },
74149     { 0xba14fc829fa93467L, 0xc2e376840eb2a614L, 0x659bcfaf4833e09bL,
74150       0xbc8597523686bdccL, 0x40bfd08081f3216aL, 0xc463bda617c081b8L,
74151       0xbd01fa86bb04793bL, 0x5a21ece62cd640c5L, 0x97bf6a542203d5c4L,
74152       0xceb40edc951167b7L, 0xd67aacaf765ba268L, 0x8ba0d9e9aeab51f9L,
74153       0xc14b215eb0d6863aL, 0x354cdcdbe5f06952L, 0x4f2b5ccfcb3744b5L,
74154       0x1338917313037fe8L },
74155     { 0xee68064045003cd1L, 0xfdac17bc44ae2ac6L, 0x4bcd419fde8e5314L,
74156       0x81e34eb9c7cea95cL, 0xbb57762d38f37e01L, 0xecc4cfb0260990c8L,
74157       0x0bc493f950a34a7bL, 0x68074172543304efL, 0xaec0fcb26bc8aa2aL,
74158       0x9e7a9b463b45fea5L, 0x4bb2952e55fbdbacL, 0x50f0c0a60485dff4L,
74159       0x02c5104d4dea4796L, 0xd2cefa09695e3a02L, 0x4c8102b46da1f345L,
74160       0x422eb573f3833fbdL },
74161     { 0xac592eb6a6ad3f47L, 0xb0861f6d9714ba0eL, 0x57c1e91907281459L,
74162       0xcf7c94e264ea5803L, 0x725376ac54b12723L, 0xf2a6ba41dafb736aL,
74163       0xc89e8920cba03cdcL, 0xf2e20cb45b0fd3adL, 0x26ea5a54d66059feL,
74164       0xee63fa8b889df8bcL, 0x40f1c7e166a3f2bfL, 0x09febc9c747312e1L,
74165       0x7d19b9c2727999ffL, 0xa9fbbb4cb7fd2b05L, 0xcfba27d7a0da2dc6L,
74166       0x368541cf2c252582L },
74167     { 0x510d3c9e22799d37L, 0x1b677de5acfa333aL, 0x4e6ae18f080f795bL,
74168       0x69b53c2aafc8dfc2L, 0x797541b60e842dc2L, 0xd5a6f2afac067fe8L,
74169       0xd0208a03bd07d877L, 0x34b473f0654be2f2L, 0xe67c102af515e23eL,
74170       0xb00dbf9d2ac1af48L, 0xe264fa41b6a13d00L, 0x1669786a97e94c11L,
74171       0x09d8cf2d86a586f4L, 0x073bf869c7f927e9L, 0xb89778802241a566L,
74172       0x59a5bf5922261334L },
74173     { 0xe9d1c91e81347191L, 0x186c1abceb969972L, 0x07888767a9d46a7fL,
74174       0xda93cfccdaa7d397L, 0x08bee9f1d91b9aa0L, 0x8267fd78f8dd3c6cL,
74175       0xf93860d094228100L, 0x6a6a71aadadb47fbL, 0x9caa06b7a6156f8aL,
74176       0xaa1b05e039848bc9L, 0x36ddc2372aaa9135L, 0x77e7e079b13f3bd1L,
74177       0x8d0b5cbe4acc5f4dL, 0x04da45f8984cfd36L, 0xf14ef618d3d3e0f8L,
74178       0x467564c143eb799cL },
74179     { 0x8d725904b6fff5d7L, 0x037f33af92dc4752L, 0x9095d5756d20b8aaL,
74180       0x32235fc143baec39L, 0xa2feb4af68a2b9b0L, 0x61c5031894d35c61L,
74181       0xac92b6a2ea877486L, 0x8eb48b15011bc6f3L, 0xa28fe128c79edcb2L,
74182       0x9f71bc0ca5d2a006L, 0xf31677322f15b850L, 0xfe8d728c7a036218L,
74183       0x068f39cb4f81e09eL, 0x1773f0167b7c50d9L, 0x0d0f7adbed6a1e03L,
74184       0x8a0dee164ee984d5L },
74185     { 0x504991bf47366e6fL, 0xb8084d9fe86c3005L, 0x14c4c751a40cce36L,
74186       0xbbb46aa63f1961e2L, 0x56a785f940445e43L, 0xdb8d1b57c91e215fL,
74187       0x6a8e453ec7ee808dL, 0xc0367ef8bbaa1e8cL, 0x310d91f1e3e18109L,
74188       0xf97cfd0e7e20a2c3L, 0xf1e80c84554cc277L, 0xe89bbc1d7b628403L,
74189       0x7778a9663fe0a17cL, 0x9e9db19fc1f00073L, 0x2ce7fe7db6f6bed2L,
74190       0x7b04b5d2ee97ce23L },
74191     { 0x5b546bc782c5faf8L, 0x1a734c5e8eb81097L, 0x3d566861e77851e0L,
74192       0x833a1013e956d51fL, 0xc7351731c3c3c37cL, 0x607738fbe0c148ecL,
74193       0x2ec6f0bbe1bbef41L, 0x0aa2ac6ecfa51857L, 0x072902d766e3adf0L,
74194       0xcd4d5089c622d6e3L, 0x3ae21b23a6dd802fL, 0xe5465a5533886372L,
74195       0xd85119a0a8d81822L, 0x4f14d0323786977aL, 0x515b081c9c7b272cL,
74196       0x1c6a95a4c99be31cL },
74197     { 0xa6b14ad5c2821363L, 0x829c18234d17de1cL, 0xaef5d2c4ccade848L,
74198       0xf412ab3982489e27L, 0x92c9c098f081d927L, 0x6f87bdf475cbad1fL,
74199       0xf4aadab81a1d9fb1L, 0x475a7923b75f3b76L, 0x99dd0ad6dbbba8feL,
74200       0x836f61644b70ab45L, 0x2a46488134bd9af1L, 0x5c91226eba9abda3L,
74201       0x4cec8709e65625fbL, 0xd4b3919e0818e4beL, 0xa5c09c8414f6879cL,
74202       0x72708a0230a864c9L },
74203     { 0x4f33c0b1f34a466cL, 0xa1bae09c7f9d45baL, 0xd70f0fee0e28785cL,
74204       0x824c714690880881L, 0xe2416c2abb043da3L, 0x733da713cec6f432L,
74205       0x2b590649c9793e1cL, 0xdb62d5b0b35c9365L, 0x355eb6e23e5c1b2aL,
74206       0xcfe8b5cebb16b515L, 0x9e081869f709691cL, 0xc865f9fb61a85bd5L,
74207       0xf169d3ccfae103f7L, 0x9525c47373467e9dL, 0x7db55c0b43695113L,
74208       0x7491c74c73265d21L },
74209     { 0x312ed5bf80d2b94dL, 0x1b8ac633ba4b260bL, 0xac86c58cd62219a1L,
74210       0x317ccf6baeb82c8eL, 0x2dfb29ee59ef9cedL, 0xdaa7d898e42bcd5aL,
74211       0x93e295c85974b201L, 0x69e75784d9fc5adcL, 0xd6c4709f012aa3baL,
74212       0x1fda9f37c85d3cb9L, 0xe5487e25d3dd4abdL, 0x00fd4b010b3ba22eL,
74213       0xcb591493c6e8dcbbL, 0xb7329fabbce68664L, 0x6829d1c268906b76L,
74214       0x8bcfd3e574176841L },
74215     { 0x06882734d3c8c314L, 0x95f0b2f111870833L, 0xb937f7c3c068ba16L,
74216       0x5365e0d877924787L, 0x15527e5e1f992227L, 0x0a06964827dffd4fL,
74217       0xd58b3df22f586389L, 0x83446b896af20eadL, 0x09d7970b50746257L,
74218       0xd9e8d2064022a691L, 0xd1e5f8af671ec379L, 0x6f542509057fe91eL,
74219       0xf14dda8152890418L, 0xbd78010e1db932adL, 0x3e18d1e4905a9378L,
74220       0x53cadcf7bd37ab49L },
74221     { 0x1bb5edf75e53d0ffL, 0xd886606c888abf67L, 0x6491b0f812206d15L,
74222       0xb3018345e22b6a33L, 0xaba6794bb173b317L, 0x8c1e58677dc9e595L,
74223       0x4e106482239624d1L, 0x61752e59da55dd53L, 0x018b4eab9e42879cL,
74224       0xcaf6784b491f2bedL, 0x3dcdb9d21e79429eL, 0x3694148510f26224L,
74225       0x106f190aa650ec5cL, 0x7542a5aeb69a9760L, 0x69bd75e9c32d1046L,
74226       0x90849964bf8c62b1L },
74227     { 0xb1390cf65a93c661L, 0x184862649db5f056L, 0x92a93a9da51a1788L,
74228       0x1b0cbb8f6772de9aL, 0x6e67febd7c71487cL, 0xf9b4382d4e62423eL,
74229       0x96fda50ebb5a42f8L, 0xc921b3376089a4f2L, 0x49d32d7b875ec516L,
74230       0xbd86d2cac410124bL, 0xf6862209c421fb7aL, 0x3e1949abf6b7de33L,
74231       0xcdee18f0e93c9268L, 0xd4edbd5e08dc4cc0L, 0xc2b75be473580d22L,
74232       0x3d7f6ffa468cd7e8L },
74233     { 0xea7b290cdffbd5d1L, 0x9d759da6970338dfL, 0x56680b0890feedc9L,
74234       0xbc690af542dce68eL, 0x8519df2bb2ae4d82L, 0x5612467f7f195b60L,
74235       0x659a342cd83c21f4L, 0x55771bf555651633L, 0x5fc68935548ba562L,
74236       0xb54192039492f23aL, 0x567528e39c9c6017L, 0x3f064ed4511e6019L,
74237       0x303f9eb91d16a555L, 0x3e18c4fd2254abeeL, 0x40994d6ffd434e7cL,
74238       0x8fb12d3f6dde74e6L },
74239     { 0x6c6381a2293cb7a4L, 0x453e09f0b87b7e4dL, 0x4f212823078ac3efL,
74240       0xe89ffad0578cae91L, 0x4a2b696a716ba4ddL, 0x14681a14f6f580a0L,
74241       0x1358f97b4c2f1307L, 0x878969962932fb89L, 0x29dd850a268a5af7L,
74242       0xaf771f6dfe239f83L, 0x5f20fd2e4f47499dL, 0x9b643e77867ca0e9L,
74243       0xe7858ecd375981ecL, 0xbe946a5919ab1c97L, 0x4f9303a206ff3453L,
74244       0x3fcc673175d237b1L },
74245     { 0x509debd5df21f920L, 0xfaf70e1fc1401b90L, 0x2429cbfd95a64aafL,
74246       0xf21208552c37a122L, 0x1d4c93f47deb926bL, 0x12f3e4c09fb3f1dcL,
74247       0x56085a595b51bc46L, 0x2a2f5d62f10fdbd2L, 0x60dd62cfdf0cb3c2L,
74248       0x154424a36b0f254bL, 0xc3a5a05d564612b7L, 0xbebe30cfa1f5249cL,
74249       0x24ec69037e62a188L, 0x75f0fbacaf429939L, 0xd41345dcb3fa8685L,
74250       0x645146fdc7151c34L },
74251     { 0xecec633aba1924f9L, 0xbba6f136006326e1L, 0x203757ac7e50fc17L,
74252       0xca531919ef3d8e00L, 0x9545a6aa51dc5a74L, 0x6e21d58fd31412b8L,
74253       0x01bc30057bb1d000L, 0xf1789c696ed1a9c3L, 0x7af2d35f9858fa48L,
74254       0x434d09b98197be85L, 0x1dc0775529aa265dL, 0xcad03be7c058fa80L,
74255       0x92d70a9f54ba14ceL, 0x6dc785056c050a74L, 0x2a7ca4a94d005ddaL,
74256       0x448d3d72abfb9f2eL },
74257     { 0xdc56f14529b33989L, 0x868351bca9ae815aL, 0xb3f456134b074414L,
74258       0x955ce42a3cd9f33bL, 0x13ade4ec5ff6e4a3L, 0xd3aac715a50eaa91L,
74259       0x0c61ec995666efdfL, 0x108a28b8f6a4470aL, 0x402ef584e54844c9L,
74260       0xb825b162d0e2f337L, 0x3dcd131fb46f7cbcL, 0x208178ec96f2fd89L,
74261       0x4d8c5d6725928c78L, 0x285a33df9963c459L, 0x72497175d92a309fL,
74262       0x76881479cb7019a5L },
74263     { 0xba43a11491767eedL, 0x5e11b9ad92bf65dbL, 0xe8a22ce003a5e21aL,
74264       0x636044212a335415L, 0xc2c563b44a9ead62L, 0x4bc06264a0b2aee5L,
74265       0x75b8d5758bf2e1d7L, 0x1cff0ee7d08a265dL, 0x17914e1db0b712a7L,
74266       0xc35925d04b18692dL, 0xde253f4c56cce815L, 0xa479241c9fff0e3aL,
74267       0x50b9d06eddabed19L, 0x6713526059fae506L, 0xf37600fb532ce180L,
74268       0x670eb01c5e5a8626L },
74269     { 0xdf73c0af73cdbb43L, 0xcf08ecc57f2431adL, 0x917805412a1a3845L,
74270       0x69a104f29224ddf1L, 0x4352f38dbeac7effL, 0xfc3b3b4e7c2d1322L,
74271       0xa69e9430b5e4b476L, 0x7d932340975a46f0L, 0x8093899e5d64eeceL,
74272       0x7b821250db2345e9L, 0x235529327f4b796bL, 0x2ee9cc154bb90b1fL,
74273       0x1fa9c8f59112f7d6L, 0x2d0f2f981cbaae32L, 0xb77f03660075166aL,
74274       0x504852e7635dff27L },
74275     { 0x2f0f3ce5a2f392faL, 0x326c076aec6c9078L, 0xad01de9284baaaf6L,
74276       0xb01b16d3cbe8e993L, 0x71305c242d950908L, 0xc66fd6173853af38L,
74277       0x7735140ed3c429a0L, 0x8a31b12a1fabf027L, 0xa0530002058b3177L,
74278       0xabffd9fca9c7deb9L, 0xd05ef69be8667d30L, 0x2f3a7308e9a9e13fL,
74279       0x3f4c9a19b91eae9cL, 0x50d0cee7618ce6c4L, 0xfb24dc405240f8b0L,
74280       0x992fe151f7e90cc4L },
74281     { 0x4454db3138f197aaL, 0xa4ded69d87872f98L, 0x97b427b044f0a828L,
74282       0x9821e1aea31e48c6L, 0xe38cb09fdd98efecL, 0x20b84fa8480cb3aeL,
74283       0xba5bb4a847475573L, 0xa9be080acd50e96bL, 0xc4451e9cef103550L,
74284       0x626ee75fc441325cL, 0x6eea5e9838a5e33dL, 0x7321beb9a2b0abd2L,
74285       0xca92e4849b6082a9L, 0x1dc8168a992bcc2aL, 0x134ecf4b9c8eb9fbL,
74286       0x5a68bfa84c5b71e0L },
74287     { 0xb4ff3b45ff0a2bfbL, 0xd105fff95502f8b0L, 0x14de58855b1c0c26L,
74288       0xed16865b0d3b9d04L, 0x2f5a2453026d3917L, 0x6a22f493f4db3c0eL,
74289       0x4871548ae2418f2eL, 0x6ab363a8509bef61L, 0x91ca1e3ab8cbbbecL,
74290       0x71e0dc984011a396L, 0xff982e0a0d5ca577L, 0xeb40b04581897bc1L,
74291       0x4bc24a46085ad5e7L, 0xd15c8fa0a6337b7cL, 0x56ce6ef7bef1628fL,
74292       0x78acfdf99f5ef439L },
74293     { 0x45bf7f15f8520189L, 0x954202a0c77f61c4L, 0x39edc6b9dfa22e1bL,
74294       0xd2d602671f4a3487L, 0xcd9339294814cc52L, 0xde76a12405e9f123L,
74295       0xe2306ea0ae36b6f7L, 0x53815218b83a58e0L, 0x9862bb76a041231aL,
74296       0xe8da253cbf31be71L, 0x2dfc533237de861fL, 0xf25c93f690ae4890L,
74297       0x66bcb8f08baa6ed2L, 0x6f10ae0f908b4a29L, 0x8cb4b48cb061c949L,
74298       0x0ad92d73d075a366L },
74299     { 0xbfb95fedc2ca548aL, 0x4778c62080cd89abL, 0xbe99154b3466c280L,
74300       0xea3be093d4be8902L, 0x847b799513e681edL, 0xf22a8f4b02f40161L,
74301       0x3ef2cb4d4aeb7fe8L, 0x9adc5151b3aed5f6L, 0xec1ccfd198c31163L,
74302       0xdc2ac17ba3d7d88fL, 0x08fa64d346421097L, 0x5ebf80b794b90bcfL,
74303       0x1b78b4ba0b50a9ebL, 0x1a4fe934279aa66bL, 0x8ef4dcaf075b3cedL,
74304       0x95bbd8a070a6e9aeL },
74305     { 0x59f92495e614bbd0L, 0x7567a887b823e363L, 0xe247c9ecfc1bd6a7L,
74306       0x2bfaaf478e835c42L, 0x314ef4e0aade066aL, 0x072baa635c16d336L,
74307       0xfa429c71e2f0e389L, 0xcac1e5d0bd07d90fL, 0x69ff35ea514f5c04L,
74308       0x893053fcc0554ec1L, 0xab1d86b72a35947fL, 0xe29fb0602aebe487L,
74309       0xa0a10d6ddfb9cf21L, 0xad147059f20dfcf5L, 0x480dc66fb8867a2aL,
74310       0x375a884fc125a919L },
74311     { 0x178cbe2e1217f7eaL, 0x1a161e2a875c6dabL, 0xf7707ec01bdb1a54L,
74312       0x678864a0e4fd73caL, 0xbaebc664d13a0d86L, 0x40325f99c8d30668L,
74313       0xb93ed9c92f1c5950L, 0xfdf36763541e0667L, 0xfd97fbb0b91a6763L,
74314       0x26aa69ea6079c9a0L, 0xc7303c801eaa8c47L, 0xdec75c81afa63c55L,
74315       0x01cdcde24fd12adbL, 0x9fe0dda71968838aL, 0x66bb093b38415379L,
74316       0x268d818b08cb84ecL },
74317     { 0x73dae35841580555L, 0x4fc32e67473d103bL, 0x240c1013beccc1abL,
74318       0xda4099f2b24ee9deL, 0x37b0cb5b9fa8e066L, 0xb5ae04e46438d7eeL,
74319       0x7f7d31642b720140L, 0x86ef4edb339e4a78L, 0xa5e77eed3a7d8375L,
74320       0x883fad37bd707c2eL, 0x816b633a0f979189L, 0xe24c028a2e7a208eL,
74321       0x1171fe3c4435516aL, 0x3eb93b334f5f2bf5L, 0x8419ed4b01b53a56L,
74322       0x8b02735c056ca44bL },
74323     { 0xb89bb464e1019195L, 0x1de4c026f3fc28c1L, 0xac120e6e2bfc3b21L,
74324       0xec71bc5a91bdf92fL, 0x485d7ab40d995bc9L, 0x97c6768ee6491ffeL,
74325       0xd9552d19afbce265L, 0xbae6c7fe8e1b76c2L, 0x167d8281d7e3ad1bL,
74326       0x3e149af95e989734L, 0xd1f0024c8a0c8182L, 0xf571ffdbc3006c0dL,
74327       0xb32ecf7e58773d4cL, 0x5822a782fd3540d8L, 0x5ab45c3f04365042L,
74328       0x400e3aa04b4d85feL },
74329     { 0x473216495e46e4a2L, 0x37a2ed6424136074L, 0x659223b1c60ec77dL,
74330       0x5e13aac3e5e0ac2eL, 0xda17c41bc5107ab7L, 0x65b22ec973c253dbL,
74331       0xff3867b8a5012296L, 0xfed660d50621a99bL, 0xa3c28506c89fc3f5L,
74332       0x3ed350b9f16451a7L, 0x27c3e03267cb586fL, 0xc807c779967185b1L,
74333       0x09c157d44a13009bL, 0x362f7647adaf1f4dL, 0x4a42b9acf3a6a198L,
74334       0x131c3da28da6e039L },
74335     { 0x4a785ff1a7da83baL, 0xf415b425d04f4436L, 0x7c0899bdec03f812L,
74336       0xc58d411a80f5f4a2L, 0x3d32d610fda251b9L, 0x99bb4504cd3b2f32L,
74337       0x198c444bf4c2083cL, 0x60c261af730e83fdL, 0x060ca4dfcb02db90L,
74338       0x0ff7838b9df1e7c8L, 0x6b79cf97c4c690c9L, 0x131514d75d75f154L,
74339       0xa7c074f11cb0e8ffL, 0xb920aac1b2c17615L, 0xde8098ad44aa0ff0L,
74340       0x71d1a46a34545ce9L },
74341     { 0x76178f76fa1b382eL, 0xa0d8ecc3772dda0dL, 0xaa5aab2ac5d4d130L,
74342       0x27d38ba48d72622cL, 0xc5410db6ca3bed06L, 0xf637a588793ceccfL,
74343       0x1f65dafd6e65e3d7L, 0xc3b44a8560a45641L, 0x0f47b3a84f78540bL,
74344       0x824fdadd5e4d60f6L, 0xd8ccf90c17d3b6d5L, 0x008eabdf325fc13aL,
74345       0x3e90d7163648fab9L, 0x3964ff3a24c52d4bL, 0xb95cc416533d0acbL,
74346       0x6cd2699f1167f521L },
74347     { 0x2d8c0b3b12f4f3acL, 0xb03dcfe299d1bdfbL, 0x540034f830f37326L,
74348       0x22dd68937c5a8c82L, 0xeb7093d0cd8f1442L, 0x892795a7585742f2L,
74349       0xe15f282c087adaddL, 0x7bbdc74916ab7b5eL, 0xd30fe40ba58acbb4L,
74350       0x0de417ebe2bac39bL, 0x4b4b19a6c61a04bcL, 0x9338c34df2735569L,
74351       0xe8f0374230ab196fL, 0xfa2efcb86c88c965L, 0x19eee274c7eeb826L,
74352       0x327c063fda345dc2L },
74353     { 0xab399eff5b47cd53L, 0xbbe9869d1943aefeL, 0xe64ecc7b1402a866L,
74354       0xc3e7c2aab1c25a16L, 0xc4216b79022de271L, 0xe58dfcc8366d6a5fL,
74355       0xd159509eda813336L, 0x370400f2130bfb7cL, 0x1be4e05993b48780L,
74356       0x0623a1fe39f3cd22L, 0x72aa22b2eecb4f87L, 0x1af4c4966c27b83bL,
74357       0x7a42a94bda5fa5bfL, 0x9afba82248b01af2L, 0xeb6b9d2a3670112cL,
74358       0x020f19d1c0df6856L },
74359     { 0x37051a86a4dbba20L, 0xb618ebc6db1de5c5L, 0x9a780a19e6525840L,
74360       0x9440302dd2bccc4dL, 0xe9ff023d10285a24L, 0x3b937ee33a486268L,
74361       0xe37ee2f24cd61147L, 0x79fbbfd3a3d057cfL, 0x5fba16d3ccddefceL,
74362       0x916058ec5b231727L, 0x47699ebe720c3adbL, 0x262743868b4f6bbaL,
74363       0x54b0092af18a0770L, 0x99d090ebacca1160L, 0xf757e1ff0c888f60L,
74364       0x79e72720b0050544L },
74365     { 0x632acf252820a239L, 0xb1a3974eaae6b310L, 0xd61fd6ba48c0a1dfL,
74366       0xd2453c395a3ee7aaL, 0x548455a0b980446dL, 0x9f29d97bde16676fL,
74367       0xf252ca0c789375a1L, 0xe961af3e7743a985L, 0x70c79c5666cdbd8dL,
74368       0x14a3854ecbc538f9L, 0x58daa73aa126851cL, 0xe9b5bb452a9f558cL,
74369       0x37af7f83fbd15e05L, 0xa448792738a1939dL, 0xe428b2b59511a056L,
74370       0x001d3ce37015846dL },
74371     { 0xd6be36b9e145b1d7L, 0xf3e3938a009c5664L, 0x2e562e7de7c0f6dbL,
74372       0x951044e6c343f539L, 0xa5ab62b8d90897b1L, 0xb1a1f70b512f797cL,
74373       0x91cdd754750f28e4L, 0xb4c80e2fffb8165dL, 0x65ed39c7594d02b3L,
74374       0xcc12a49d56833edcL, 0xe73694bcf3693a18L, 0x34cc134afcd2c404L,
74375       0x071bd5fc11d40194L, 0x05759047fc585e46L, 0xb3280360790b7a04L,
74376       0x4bb8c6fc40afc684L },
74377     { 0x3120e2ddfd0f8796L, 0x6968a40db133c9deL, 0xfea366c0a9369c6eL,
74378       0x37e5b6d66007273bL, 0x39e4ecf08cb81439L, 0x487fe9cd9febc005L,
74379       0xeb8af4440199b53cL, 0x2f124e3b293519ebL, 0x860c218ac82c9c16L,
74380       0xacd1d6f2709dc590L, 0x5696d54536d50529L, 0xc03f5df959120bfcL,
74381       0x99a3e88d10ffa690L, 0xd4f9cfa56c432827L, 0x2e8fea9e9a135d89L,
74382       0x3699a881b6a77e78L },
74383     { 0x5bca33721eb1c64dL, 0xe9cf3a2df1d28154L, 0xb7e2e9b36537106fL,
74384       0x06c171514f7cbf4dL, 0xcbde416e2058b37fL, 0x82c53a7e8834e9c5L,
74385       0x94dbdfe2e9ac3a75L, 0x795ec6cbc5e67c02L, 0x8c23c25f1426a80dL,
74386       0xee2cd20d6a8d4f9fL, 0x838daa54d3b7c235L, 0xb9e08ec03d7a4d52L,
74387       0xca9475e9781cb473L, 0x7271f39e5ec31caaL, 0x1df08e9f82535187L,
74388       0x4f3a4b03208aff8bL },
74389     { 0x0f7b81071ed095f8L, 0x23e37fa6da226d4eL, 0x8b0f9852afb36d1dL,
74390       0xb114634e07d8e311L, 0xb9634a97e3e0f16eL, 0x2454bb9c421eec37L,
74391       0xb4ecd5dbd72b21c1L, 0xf96038686df20d7cL, 0x9f5359fddf86e0a2L,
74392       0xc43d54fa5ac488aaL, 0x56d714abd1049df4L, 0x13152b3eb020607aL,
74393       0x49be1c187a02325eL, 0x44f24f4a52ae84dbL, 0x9e525c030b5a7b80L,
74394       0x6d874446a6d179fdL },
74395     { 0xd29d07aabe9a42f5L, 0x1fd5316c3781ccc8L, 0x71a75a6d9dc69ea1L,
74396       0x4e19e0df88fee91aL, 0x99c2b4dcf8d44f12L, 0x05f6df9231ae94e4L,
74397       0x27fba876cf28ccc2L, 0x6e1a0f01f57f7cebL, 0xe03f1f34f3fd3b74L,
74398       0xa0edc4a742c1d213L, 0x5caac2707deb8580L, 0x0f5d791faf0848bcL,
74399       0x17f514ad07ac759dL, 0x95a39734904fc531L, 0x95a4aca97bb70f3dL,
74400       0x3cf384c9ff9c5609L },
74401     { 0x700506bace1fc9e3L, 0x49721742676b0399L, 0x2b4a1b8de72bf7b3L,
74402       0xca8602a879b209f7L, 0x90580b90ce26a8e1L, 0x1ef339b7fe24f39aL,
74403       0xb6c5d991629362e1L, 0x51174e1a577b24f4L, 0xf380fcb505e451e9L,
74404       0xf4d97afb148321bdL, 0x099806bb747e5d2aL, 0x85525d65be99a608L,
74405       0x264828d9d455e820L, 0x8c8c5405d8560a65L, 0x3c67e73c71030770L,
74406       0x2b248850ee73df26L },
74407     { 0x2173cde68541159fL, 0x78224c184fb410b2L, 0x07a286191f2ca1c7L,
74408       0x52c207d6a8b23e40L, 0x071a0210a6b2344aL, 0xdb0e587cb5ed2945L,
74409       0x6c56b8ef810fcc6cL, 0x1248c58f62d843b9L, 0x4b90363d74c66975L,
74410       0x6348f7f2e66c66f6L, 0xb2f9d441c126bcbeL, 0xac07f2a373ce49e8L,
74411       0x52486758e81b0df0L, 0xa108b54d1d4621d1L, 0x17261ece74414a1cL,
74412       0x938b3bcc6a3ac215L },
74413     { 0xa9e4a16be4ded340L, 0x8e65fb2a80e88036L, 0x97089606dcd73acbL,
74414       0x1c3a0434aaa657a9L, 0xf304fc5849101b06L, 0xe60fb61ada0bb64cL,
74415       0x818c2aecf5542df5L, 0x7402057656f76d5fL, 0xb566b79092533d97L,
74416       0xae4655e574d6eb5fL, 0x60f7a1b5a55b44b7L, 0x7970179b93747ea5L,
74417       0x8ae7e0e8f2dace56L, 0x9847460784e83c06L, 0x24e8c9ed15307341L,
74418       0x6cff58a5d9e89d6bL },
74419     { 0x508c01b003e51f68L, 0xe1d1f2251d2fe7d6L, 0xf7998d0b09bd8805L,
74420       0x255e907a03e415b7L, 0xd148467d607d9798L, 0x055c3b1e9b453896L,
74421       0x35001013809f50f4L, 0xfbbb2fa6d0233fdcL, 0x0b680b0aff1820b8L,
74422       0xb1d404dc38d317e0L, 0x133d5444ccc8c7dfL, 0x7fa847e66ec13f84L,
74423       0xc33f83d8046e2e48L, 0x3c627fc54863b3acL, 0x5f67f8aaeb936af7L,
74424       0x5fe4ac8f31b79327L },
74425     { 0x581aa4bf8b6f401eL, 0x05db12a3ad5c7ed4L, 0x7b0187266fb07b4aL,
74426       0xfdd11f049c22bcd4L, 0x5454a7d469371c95L, 0x066c55fb99a46eafL,
74427       0x18637c7c7fef96d0L, 0xbafc1d346b83e95cL, 0x55c3859300bb42dcL,
74428       0xdd8dec2b34e7e712L, 0x69c9cfb0b184cee8L, 0x8dcc0c4249a27864L,
74429       0x290d95f22010f2e7L, 0x86e254c96977a420L, 0x20931c89eb2abdadL,
74430       0x81377164121c0548L },
74431     { 0x6266b25e9c5a8edfL, 0x6e1388c21078a7adL, 0x5f02737d4876eedfL,
74432       0x242fa7f962744617L, 0x3e2cfbd9b385382aL, 0xbadad7b102f71befL,
74433       0x562abcfa677d0a92L, 0x573ebd1751fdff34L, 0xd7f658527c250c78L,
74434       0xe0cf16eec47ca896L, 0x8ccd79b067622c9eL, 0x31fc5882f8f2c075L,
74435       0x9232b37ea6008515L, 0x4d7bb36182e8c5baL, 0xbf24735cd2f146feL,
74436       0x79c280ee9cd2db98L },
74437     { 0xbdcc8203f2b48122L, 0xa8c04916b04ac48eL, 0xacf064dc9fc4885eL,
74438       0xab83899782c1001cL, 0x7339e721676de250L, 0x17aa5aea8e1ab820L,
74439       0x24d28ca06bc14b2eL, 0x570c5bb7816b6230L, 0x6c51235ccee6b606L,
74440       0x1b2bf89f183eae42L, 0x3e3af3c69c66274bL, 0xe0b04426b51e38bcL,
74441       0x26dbc58e73e40e3bL, 0x3f9dd578b5be5be4L, 0x9fd9f79152c8f408L,
74442       0x758073a4a9e3ff4fL },
74443     { 0x7d27b0578691ca22L, 0xf206bfd613a2a1b6L, 0xe84bd385ac795413L,
74444       0xc5d18a2a75536607L, 0x2e166de7c8a0e24cL, 0x56d5750c3c474dbdL,
74445       0xdef444c11366843aL, 0x14646e53cf4b8432L, 0x4bc0d030a9fd9783L,
74446       0xbda4c824297ee203L, 0x3d0b10bffd7be6c7L, 0x2d21647608c7f3ffL,
74447       0x06e52599b4fd4c45L, 0xfbab9fa149e9e104L, 0x9342a7fa8661d32dL,
74448       0x3f3e3458faf66aa8L },
74449     { 0x51ec35af951597aaL, 0xb677d4ac49df64ebL, 0x0276cd9c9bf4eff5L,
74450       0x423eca49515a2935L, 0x8a696553fd9bb9c3L, 0xf99ee9dfede1f09cL,
74451       0xb8fa2956199e5f98L, 0xb763875835292c32L, 0x8734eddcfc40e81bL,
74452       0xd82d5e9f65457d95L, 0xc8ee323e30c78d2bL, 0xe77b2e4cc1433d67L,
74453       0x56d9f8073c8314aeL, 0x441eede22a0e2f63L, 0x1e9e17ed6c48295eL,
74454       0x640d20c434c294efL },
74455     { 0x4e9a0b8e3284d513L, 0x074c3545f315053aL, 0xb36e740745acd52aL,
74456       0xd80bdcfc1de50db7L, 0x8d9d47dc2549fc46L, 0x29b6ef13303f07a8L,
74457       0x4e461aca6d4ad4c2L, 0xca8e351dfc9f1b73L, 0x8bc4094d57460e65L,
74458       0xb6302b330f32d367L, 0x69a074b6285742e8L, 0xdfe52b11876c29c3L,
74459       0xf39e4609912bd17aL, 0x8ee40d66349aa639L, 0xb968902ac72e05c1L,
74460       0x0f9c1ca8c0d92816L },
74461     { 0x1ebbaab367433df3L, 0xb6aa534715d3628cL, 0x13a320d897f0c5ccL,
74462       0x72c918cb65e408f9L, 0x4b638854d5373451L, 0x731399a30b4dca09L,
74463       0xcf2567300a3b1326L, 0x5ea60dfa6608b388L, 0x58ad74b07b290dfdL,
74464       0x83202789d7694f9bL, 0x48593db8b6630fb1L, 0x3db47f70c65e3eafL,
74465       0x63949c913e7263f8L, 0x9b9acec6e6e6ff33L, 0x34bd9ba7098a8240L,
74466       0x7e31c12f45d36ec5L },
74467     { 0xbe281d680dfd2dd7L, 0x1efacb0024ab61d8L, 0xb9c3005f94431f97L,
74468       0x660c8dfa959cb3bcL, 0xfdd5fc30cffbb406L, 0x7a4631be7969a10dL,
74469       0x336e309ede13fd1bL, 0x76b3bfadfc947076L, 0xfa91925ddcc72223L,
74470       0x741f0d73156c4ee1L, 0x4f64ee410e2b3747L, 0x86be92d3efc4d93cL,
74471       0xc53b7e03fc4fbb2eL, 0xac196cf5337ca1bbL, 0x4de41a307e23ba60L,
74472       0x1a219c45326d5357L },
74473     { 0xfdcf7ef8aa4db0bcL, 0x2e2318067b6c9963L, 0xc26390673d8a192fL,
74474       0xc0cec2e2ffdc7771L, 0x997c8e35a2fc0edbL, 0x78e10ec182cc6043L,
74475       0xfd0de2cb2b0c8120L, 0x4d6c457f69e57f8eL, 0x953e69b25b53f1c3L,
74476       0x422a330ac4f89cb8L, 0x92ff232995566be6L, 0x73cd502d437442d1L,
74477       0xf04ce590bea69403L, 0x6ac1537ef8030662L, 0xe02bcf77b6d0bf93L,
74478       0x17aaa999bc90192fL },
74479     { 0x0d3d56438e55db2eL, 0x835dee433b946851L, 0x1a1440e55b88462fL,
74480       0xa6ff3b35ea17e27cL, 0x23f99c36dd95f7a9L, 0x7217fdd9bdd672cfL,
74481       0xf400ac1edd2045c0L, 0x94b55c874ff06b25L, 0x0a44a0e50e4a49beL,
74482       0xe8925e91b43b6813L, 0x78bedde1214f96c5L, 0x0f456a4c0f97fa97L,
74483       0xa28fd86ba5bfd267L, 0x3b4b2d8fbe7608efL, 0xfbd5ff8c226474bcL,
74484       0x6b282af0a5f3b24aL },
74485     { 0x78fc025f6341a595L, 0x591c38d6a445e28cL, 0x72bd6e3deb446842L,
74486       0x3f9466d375547833L, 0x911414d3083e16c4L, 0x145d946695a7acb4L,
74487       0x102ddf098fd2fb64L, 0x2a2b2d2d0bfd87b1L, 0x69e9be5c59455088L,
74488       0xee378bf4a80245deL, 0x80b0bd68b2306b0eL, 0x76a545c6c2be9f3dL,
74489       0x429d167b4802c245L, 0x13e644272b412dfbL, 0xb664f529ee8d9762L,
74490       0x6d4f5d2354706ebfL },
74491     { 0x35c8f2b600ba9f88L, 0xfdc807e07bb6d0bfL, 0x0a126d42b3b81e5bL,
74492       0x335ce6cea7ac781eL, 0x3e308e6ff37dcba6L, 0x028dca6263c96487L,
74493       0x72eba57e8818434dL, 0xa9e3d59f79b78a26L, 0xd2f0a7dd2f07aea3L,
74494       0xe0fe467824d05f74L, 0xb20851700116deb6L, 0x9c2a5e9258f37580L,
74495       0xe78bd7a574070bb3L, 0x551fc872b9977d90L, 0x6eda93c440db81b4L,
74496       0x4aaf0b4fd65d34adL },
74497     { 0x9bef25063514c7afL, 0xb09e7dadbc181eadL, 0xef3cae878fa3ec58L,
74498       0xd8dbfab5173b8685L, 0xb2490fc0921d32ddL, 0x4eef386b8bd9c466L,
74499       0xc1cdd52fa061dbdbL, 0x64de989a25bc04dbL, 0x06f9836b85728636L,
74500       0x11a5a8048be44aa0L, 0x16dede4e097018c7L, 0x72aec577b2c11fb1L,
74501       0x144dade1a721ecd9L, 0xf99c526bd6ebf3a9L, 0xa1d4165b1c2e14d7L,
74502       0x8b2cbd3982bc6337L },
74503     { 0x28ec1bf28a52e991L, 0x0ba202f6cf9d42ecL, 0x8307d130c634ea45L,
74504       0x3fc257b3c5762b9cL, 0xbd3298d1487c2a2dL, 0xca14f1a7a319488aL,
74505       0xc70ca93b06ba06d2L, 0x9aa3f4b3ee405e89L, 0xcc64eeb335deeae7L,
74506       0xd155f57803bf1d4cL, 0x041ec0b545616bfdL, 0x23df80e6086e33f6L,
74507       0x399a79c8f0243cf5L, 0x86c2824e874ccd58L, 0x220eeaec8fc5c831L,
74508       0x57e283047dbe3670L },
74509     { 0x6e60b698fbcdf666L, 0xbdd06a998bebb1d2L, 0x4044adba80498436L,
74510       0xd76bf75e522bc88dL, 0x655c4b9b28423b20L, 0x65c0f49253398a72L,
74511       0x76d4f2b70ca37601L, 0x469899252030fa5aL, 0x96b37e87b6054705L,
74512       0xef96f73153de1b2fL, 0x5ecbbc8cad54ef05L, 0xeb289d0aa93617b0L,
74513       0x3ac0fbd57cba217dL, 0xd0d3cb5619d4a2d7L, 0xe8bee9d4c91d6063L,
74514       0x4f12e037696ffda6L },
74515     { 0x4ccfa42215f1a610L, 0x804a5c553786519aL, 0x1246a45473838134L,
74516       0xfa15b4844b284e2aL, 0x36464c65146d1320L, 0xfb6ba88c70a8a0faL,
74517       0x74e7cee793c4804eL, 0x8c34d22cb95ae16aL, 0x9d9ed89ff9c1d4ddL,
74518       0x61a0866d32025371L, 0x45b232b29bd6444aL, 0xf888e92cf277bab1L,
74519       0x73e69c6ea9448b02L, 0x1a496ea95b521ecbL, 0xa8f78ea75858afb2L,
74520       0x83d2333eb1266f91L },
74521     { 0x1c63328867b478d7L, 0xa1ee1ae150a2fc9cL, 0x05b6ab3018d2241bL,
74522       0x69f1f288893cd696L, 0x159d6660a8117a87L, 0xe812011970e73d77L,
74523       0x528fef0093f55f0aL, 0xb3978db8d854dfb2L, 0xd6b43ef6f45d9fbbL,
74524       0x17de4bfed5bee397L, 0xa01e0f596bf76dadL, 0x28b2280e3d40754cL,
74525       0x8edb6122f8e86ef3L, 0x8226b6afb7d1e586L, 0x463532152f40a55bL,
74526       0x7362f13ec5a31621L },
74527     { 0x792eb27c73c0c430L, 0x8cc0a65fa51c3657L, 0x50a5ceced2194f1bL,
74528       0x18945688814b4947L, 0xbbf0a81a4b6fbbf4L, 0x376f4f58f0aa8608L,
74529       0xd9361d683987795eL, 0xb6510cd8e3a8d0d5L, 0x63e2fdbfb6c1a455L,
74530       0x2c91154eaec891f9L, 0x0eb1e715ff568f64L, 0xe7af9cd72f2b399eL,
74531       0x1fc39bac89f0bf0bL, 0xf0861d9290983695L, 0xd9b16f02da0a20a8L,
74532       0x2f10693fa38c0eadL },
74533     { 0x07a6ce910c06ded2L, 0xf974842f2fd9087bL, 0xe468bfd6a9f635a6L,
74534       0x04b618911ed60626L, 0x1fb2f89f369ee548L, 0x9cbd1113dc96a201L,
74535       0x6759acfe10d633acL, 0x64ba66fc8faa629eL, 0xa686ae4947f38283L,
74536       0x828c3a05d59cda99L, 0x7c7afb1408ea2f6eL, 0x2551c8e4af3953c8L,
74537       0x5b53d2799daa9e4fL, 0x1eff68d4ad6f1940L, 0x2775dbdd96437cdbL,
74538       0x985f83e44fe7a043L },
74539     { 0x89603c16eaf45294L, 0x70131160c24b5751L, 0x4c11201839d6b52dL,
74540       0x7079cf02ed943340L, 0x0c5b028b74f41b68L, 0x3dc3f0769c8ac1e1L,
74541       0x5ac5eea3f8b24f0eL, 0xee6684bae34c5c22L, 0xa5259e639abc452aL,
74542       0xb07d2cd1e9df45ccL, 0x07019c931a443cfaL, 0x68fddaa992c003b3L,
74543       0x2d9f179c0d8cbc2eL, 0xbbf15a6f1e781ca7L, 0x54d779d550dcc799L,
74544       0x0c88e5400fe962f1L },
74545     { 0x84f71a6ae8f44357L, 0xf75b4bf63a3cab6aL, 0x334c9d9e5aebc680L,
74546       0xcecaf0848a753ef2L, 0xe28014c1075e3c8eL, 0xbb9d5a38f74f8d3aL,
74547       0x75988464b80e32aeL, 0x7b328e6ff2bc3792L, 0xebbb1fafeed0e197L,
74548       0x674eac955a33065aL, 0x8c19fd8f922dbce8L, 0x8c17ae85987b907aL,
74549       0x89f336273b3a2cd7L, 0xebaea019fa87772fL, 0x4e5de4993a25ced6L,
74550       0x8e2560b8af110715L },
74551     { 0x56d3746c3141aba6L, 0x45a1079fbab2cf9eL, 0xb63828319cdd27c7L,
74552       0x222376329dfd950eL, 0x1e0b15cd3a9408ffL, 0x49a80200b1160118L,
74553       0x2719db5da383bba7L, 0x6078340a651046d5L, 0x8929d4de97523b1fL,
74554       0x4040345c8e0a28abL, 0x61275ac20adf09c7L, 0xb41ab2652331d611L,
74555       0x230cc77c5391ca50L, 0x88be0c928f922315L, 0xfef3d92b92fd9a29L,
74556       0x59005f228324f2e5L },
74557     { 0x6bb1750c3c4c1c74L, 0xbe73aac0e966fb79L, 0x85a75d9266c5973fL,
74558       0x8c97f9323a8656b6L, 0x2b7043b150446cdeL, 0x548916f73ff3897fL,
74559       0x913dd01cb18b72b2L, 0xd0a751f1488c0de6L, 0x191757148558ca58L,
74560       0x9771430144a663daL, 0x2df190acb0e08618L, 0x0080fc0cf39ead9cL,
74561       0x0085ac6e17382da1L, 0xe97918513262a338L, 0xe4495936b43bae8dL,
74562       0x57a78e26d783df6eL },
74563     { 0x161b346f40dbddd8L, 0x2b49a9279410c3acL, 0x8c5427831886cf3bL,
74564       0x72df323233b93debL, 0x9c8d59f540df579dL, 0xe5d7a67dc20ef500L,
74565       0xc46b391867f08643L, 0xecfa2445ad96adc3L, 0x658f589b0c4544d0L,
74566       0xe6ec9301e08417d7L, 0x6ca5ef6ac454e288L, 0x4191048fac0f462dL,
74567       0x852407d808d8a036L, 0xb4c533a7f6d35b7eL, 0x3251e4128f6ada87L,
74568       0x1ca370c581c472e8L },
74569     { 0x94bd5171a801b68aL, 0x7312879cfd1998b3L, 0x4905aabf41163202L,
74570       0xb5fe87f4f5b01fdbL, 0x78de523a9cda128bL, 0x0bf161a1c7bd31f7L,
74571       0xb5decfd023904c35L, 0x224b2882e188f12dL, 0x0dd2801df99dae74L,
74572       0xcad467b508cd1cd2L, 0x6c311c3dc0867e39L, 0x71a117202b425072L,
74573       0x83bf464e2efd9003L, 0x53d0448a1dbd3b03L, 0x32db52f4e6265baaL,
74574       0x2584b34c4c33ac79L },
74575     { 0x3cb863892aeec688L, 0xa5e740ba45fbe523L, 0x422e71f7fd60b5f8L,
74576       0x455d185c4874913dL, 0x04c2bb36fa17d80dL, 0x3f271854ac054524L,
74577       0x76dd3045a8b9a657L, 0x2e42c3e162ee7cc8L, 0x002667064df6c7d0L,
74578       0x5927dd51dc7cb488L, 0x6b3faabe187897e0L, 0xfe6ad22ef2d5737cL,
74579       0xafb60269ff51a9ffL, 0xe1c8354569807baaL, 0xacddb6ff951ca49aL,
74580       0x7e8113743f9ab085L },
74581     { 0xad722a8b830a88b1L, 0x91918ea8ce1117e1L, 0x3e02d0b80409b47dL,
74582       0xb53812d36c46d1d3L, 0x2fd09db0e589669cL, 0x9845cd0615b0cd5eL,
74583       0x0c1c155a2386c453L, 0xda774de5f5ff43cbL, 0xbb076b98e391c0cdL,
74584       0x97d71eff5004f286L, 0x23e0b46caeec0bfeL, 0xe453866732a1ad94L,
74585       0xfe0c9f81396da422L, 0x6376c1a263db2bfeL, 0x001c7918ba56fa91L,
74586       0x436b8c64df8485a6L },
74587     { 0x88117e9d8ab764bcL, 0xdfa61e94a077df84L, 0x5a7765d30c18eebdL,
74588       0x548916affc9451dcL, 0x01a52e33071a347aL, 0x633b95deb23b41dfL,
74589       0xdd7d68c943c8c286L, 0xe4f9d41e18d97068L, 0x79908b908c92799dL,
74590       0xe614148ed47394a3L, 0xe5018517cd51e53fL, 0x5060075e0243dcb6L,
74591       0xe5dcde6217954405L, 0x6f7c90e1537da5ffL, 0x1df7aae40768cb66L,
74592       0x5266ca9e6dbe95e1L },
74593     { 0x84ddee6d1386b3dbL, 0xf9e4af5a7c38e540L, 0xb3418440eb04f49dL,
74594       0x2138a1e8fde5a4fdL, 0x3e6e692430257cfcL, 0x3519c6e319fd70c1L,
74595       0x8f34e17486c31ff0L, 0xf1e298fd940ce1e8L, 0x6fb8cb1d14960d7cL,
74596       0x207c13472b2f3bffL, 0x899a20b4146ef8ffL, 0x7dec362b7bd3e220L,
74597       0xa975044e626bea27L, 0x0f32b4494fb4cb67L, 0xc17a09201fc6703aL,
74598       0x41f325b99cd84a2bL },
74599     { 0x312ed513ce2843a4L, 0xe748498e00728afcL, 0xa8ef28224d864ce5L,
74600       0x34064704a620083bL, 0x5905e1d94bed338dL, 0x2a578cb5063e7b38L,
74601       0x98276d96289e7bb9L, 0xdfe2dc47f17b7341L, 0x5923521f1dac8944L,
74602       0x3db6d28d23400aa7L, 0xc647705ea761ba43L, 0x8947ba6d9bfd07ddL,
74603       0x00f2e3ac242ca8fdL, 0x49ef4670eb8c3468L, 0x7db3d37bd9aa18fdL,
74604       0x56b30fb6e58cea9eL },
74605     { 0x07ecdcaacd80a428L, 0x7af922dc8732c891L, 0x20d887983ada441fL,
74606       0x3bed9a44924b008aL, 0x2123533cb2e81c3aL, 0xc34e407565f807d3L,
74607       0x0bfaefa51f2faecbL, 0x78b634a5ade8a88dL, 0xc4e0b7f894392a91L,
74608       0x3092237790bb1cd8L, 0xdea9b4faf87204aeL, 0x3edf81f585d3cd83L,
74609       0x58f88c51c6523a79L, 0xe472fb8b17c0d969L, 0x899081e5dccf7f07L,
74610       0x1353cc5758bdd146L },
74611     { 0x28a5649739bf6e18L, 0x59e8b5a2649b89c7L, 0x8d9434a0dce8b8e7L,
74612       0xd935bf512047040cL, 0x2ab3a1646a7b8e82L, 0xf1583ed627f81294L,
74613       0x8416a7e072d67297L, 0x49685d86cd39e42bL, 0x8a797fc7958ddbadL,
74614       0xa558f928155ce6deL, 0x75f4e570f8a36235L, 0xbc69cfc052877ae5L,
74615       0x8f4193a9a6b16ebdL, 0x8d1df43cbb1cc1f1L, 0x723a830e5a21e789L,
74616       0x3ec2185df451df58L },
74617     { 0xb9d4c7d71f0bc2d7L, 0x6982c6cc6e51d412L, 0x92e02d93a09f80f6L,
74618       0xb7dd2d25047ae09cL, 0x3503149f37f351f9L, 0x69d49ce1c77850beL,
74619       0x60242acb12f0d2c8L, 0xba188c567bc28b9dL, 0x8e40612106bc0550L,
74620       0xb0d84b1f8d7d4329L, 0xb4a67ae7d38951e0L, 0xb527c57b8bc97607L,
74621       0xbc93c5f35497aa72L, 0x5f1de8cc39bdd666L, 0x3087dc5ce9d447a3L,
74622       0x89b356b6a211abe5L },
74623     { 0xed6db0afdfdcc837L, 0x0fb80baaa871b7a9L, 0x413abfc91c1d4b72L,
74624       0xf5b56bf7adac9e5cL, 0x5664a2da8b8657a3L, 0x11b04f720e41d94eL,
74625       0x63e11d2637433658L, 0xee628ecef426daeaL, 0x011619c9cb162dc2L,
74626       0x9cf5817f87648643L, 0xe1bb97025584bc86L, 0x2cc27cef00bf7928L,
74627       0x4ef3a80edc60eee5L, 0x7e1202be87adc2f9L, 0x656f18e08a0d4f52L,
74628       0x39c4f10d57c5d126L },
74629     { 0xb3a9b68ce88aecd3L, 0x555b0918a518aa9dL, 0xedc1cdad4bd4ee54L,
74630       0x79b68b6702068d84L, 0x7dac80d0811ac72dL, 0x6d1e6d35a81a0a78L,
74631       0xc841e9ea3bd16283L, 0xa7bc1775894c4444L, 0xf2b63725f1aa1202L,
74632       0xbec7767ec7d4c556L, 0x2817ebb3d46ff51bL, 0xfde5be8d73f7e339L,
74633       0x44c6c9775aed24c4L, 0x0b9a1707b6e579cfL, 0xcff164789069fbccL,
74634       0x414b542d49152b00L },
74635     { 0x33c31e58606e173bL, 0x5b7f4e1b90e6713aL, 0x425fb512debb20afL,
74636       0xc788c61705120e70L, 0x3ef056029013e4ecL, 0x9f9d35ac81c6e6d7L,
74637       0xe131e88f9450690aL, 0x708f9b3244af082eL, 0xb2e4d66c1ba2aea9L,
74638       0xaf1f4a6e740db29cL, 0x74ab9248d1843007L, 0x13338ef8ed556a6cL,
74639       0xf48e623e270d17a6L, 0x3c7362fa9608f5bfL, 0x43977874444e8515L,
74640       0x52678d6ae00b8b2aL },
74641     { 0x5dff1c59df36aeb4L, 0x52d6653ca92bc0abL, 0x0e03f496927a5f81L,
74642       0x8509d4142dfd491fL, 0x258c2c52a571f89bL, 0x2bd6180493334485L,
74643       0x1a33e94f3f7d9e09L, 0xfab418d32c1bf906L, 0xf39c490e5aa5695cL,
74644       0x0e41196ef6d2d7ffL, 0x3ecd40750f7948a9L, 0x4b58f9b2d3053b4fL,
74645       0xb8ee842a5d9974c9L, 0x23a59c1dbf22f682L, 0x045ac614c8efcea6L,
74646       0x7040ba5bc10ceeddL },
74647     { 0x2c364f81515a1a96L, 0x31a63503184327e0L, 0x0a0966501ad93d4fL,
74648       0x9d7694f1273b6173L, 0x8886d876d2cda9d2L, 0x1e01a7422814c177L,
74649       0x3492276b8667696bL, 0x2fd4f0c65b25f006L, 0x6527349ffb294c4aL,
74650       0xc1fe0d8ade1d336fL, 0xaf9a23e8e7e3860eL, 0x97d2b721b774c31eL,
74651       0xfac3e5824365784aL, 0xff2dff4e70f4eaa3L, 0x3d281e1afe873248L,
74652       0x9043a6d60bd1c9c1L },
74653     { 0x1511a0fe766c7937L, 0x1b2ded5cabbc3be3L, 0x2ac160cce00888acL,
74654       0x928754bd616200f3L, 0xb801c83d34a2ea06L, 0x8ad7a03a9cbe106fL,
74655       0x996b0822cedfcd94L, 0xc3c3463ae4069880L, 0xfb12ea4df597f663L,
74656       0x2c8d383440c92af9L, 0x79bc85c64e8da154L, 0x95771fa2db4e801aL,
74657       0x7bd2c1381e3579b2L, 0xe45c75dfffaad078L, 0xb0760a3cb73eac46L,
74658       0x26362b483a125f35L },
74659     { 0x25c68d28eefc3e89L, 0x2d0ee87769e9ee71L, 0x8b07bb86af5e4b75L,
74660       0xdb709072cb86b333L, 0xfd3d20eaff552bacL, 0xa5eeb2b14c0da1e9L,
74661       0x391f688a44f97145L, 0x21fbd3101e06d485L, 0x45e4f2a5bea9cd49L,
74662       0x7b60d464a7bf21daL, 0x193f88c8054d5471L, 0x5ace53d1bee0f2e9L,
74663       0x92c26563c1439273L, 0x9c86e0b296c6b5eeL, 0x452fe23109ff59baL,
74664       0x2e952b20555c935eL },
74665     { 0x2a846bcad75f886eL, 0xe68a5dbed43dfc58L, 0x103e45b6007b1b86L,
74666       0x580e2ec9355ff2b5L, 0xbc702f26a263ecc9L, 0x2835b386181e5e33L,
74667       0x025113ec6c122076L, 0xa5c26e3a7fbd856dL, 0x8ef83fb39d6ebcb1L,
74668       0x7aaa53f2a44d2fa8L, 0x7c14ef3353b1fa97L, 0xff604a1117559a30L,
74669       0x2bcd96b0b09377e0L, 0xa5c14896db2f0273L, 0x1c0a84c9eb53ef06L,
74670       0x1236d01730378e4bL },
74671     { 0xd7481c8fc084373bL, 0x29ae4768646097aeL, 0x1300dfa0613bc34bL,
74672       0x3712714c934bc2b0L, 0x865246290e2be7e2L, 0x554fbb9fed010800L,
74673       0xf0ec0b3842314576L, 0x65baf594330a3282L, 0x3bdde1a8706ef817L,
74674       0x7d2c727dba7530e9L, 0xbb0c5d6674cc95cbL, 0xb3fcd3652438906dL,
74675       0x19881941d14658f3L, 0xe616f5556c97f0e9L, 0x353c2d854b9ec7eaL,
74676       0x02a48014620cb56eL },
74677     { 0x11d6d23d506ccd38L, 0x229a1c549059baa6L, 0x717c9c2769d011c5L,
74678       0xe87e1b46d828937dL, 0xf5d63bbb83835083L, 0xf0a7b427aadac258L,
74679       0x99ab26bd9f154d1fL, 0xdec0ffbf8ec955fdL, 0xee957c6749fcb880L,
74680       0x32395dee1e0114deL, 0x192a64b7369f46c7L, 0x4304466091eb2599L,
74681       0xbe2da887a2e8c3daL, 0xa44e2c25c3556d18L, 0x31390414b55f75f3L,
74682       0x1d8bde6f8f217fe0L },
74683     { 0x03cd39f8a2028924L, 0x6e54f19cb06ecb9fL, 0x862bbcb7d6f05846L,
74684       0xdbe067165a060776L, 0x9397c97ab10fec10L, 0xf42138266f1bb65cL,
74685       0x414deccba672ba38L, 0x594d4d43f88b05e6L, 0x7993f57aac94d4d1L,
74686       0x74fc2a6abfb17638L, 0xd8196b5bb6fc655aL, 0xdc375c84ee8d2139L,
74687       0xb9b00a02360d3a26L, 0xb36ed35cdeb93b87L, 0xf565b28bcc83209eL,
74688       0x349c6943c61013c1L },
74689     { 0xd1b394444de6c88aL, 0xd5c2c4714700207eL, 0xb6f458a221c2b780L,
74690       0x749f75640850993eL, 0x400ba579baef0c18L, 0x2d742938737c70f0L,
74691       0xc5a8e2ec21467ebfL, 0x243a666e5337f453L, 0xc991f1c7ed0bd50aL,
74692       0x3a7f3e90f4bd1f91L, 0x96089e8a5f0e129bL, 0xd0d3a17707389635L,
74693       0x9cf842d527182ac9L, 0x211952990817c5c2L, 0xa32f327e87255769L,
74694       0x056587ab89c2d8faL },
74695     { 0x008562ed1ce4733dL, 0x5faff7cb98e51444L, 0x5f03021fa9ab46b9L,
74696       0x89494c5eb61a8c13L, 0x57c9503636b35976L, 0x6be84c8f2ac2d2f6L,
74697       0x0e5b34d89bd2703eL, 0xc4ad918f7e872abbL, 0xc2a89e9fc4052ee1L,
74698       0xc2caee3f3190b51eL, 0x58fd14376fff254fL, 0x6f3c0d68883e0972L,
74699       0x63d0a0e90fb15438L, 0xc438764bf6caae00L, 0x815f15653f1d0f6cL,
74700       0x1b87f2edb86cdbdeL },
74701     { 0x35792bbb2b0b15b1L, 0xa3e4b5a7ce6ba779L, 0xfbacffd9dd8f3779L,
74702       0x005450bdc298d1efL, 0x0e3f5556c47031c6L, 0x0770f07a95d68066L,
74703       0xce3e84e02d1052c2L, 0xb050791e7aa8cc54L, 0x4d621e73ba3223a3L,
74704       0x87b9b94d39632990L, 0x8df9cb477eb8056dL, 0xe2430de8edfca0ccL,
74705       0x374bf4169712a0caL, 0xbe3f3c7788848a99L, 0xb22b87b1c4a3e59eL,
74706       0x8e0227c43e95bc23L },
74707     { 0x000e22a83210964dL, 0xdccd5df5ff056eebL, 0x02173a1fdaf1ead7L,
74708       0xd02833e067cdcae3L, 0x1cc574cb8bdcc90cL, 0x86eca7143224b4f5L,
74709       0xd00e603abb3f8298L, 0xb98ece1b0c1a8debL, 0x228a46e4378c261dL,
74710       0xc6f9dd0da6165e5dL, 0xb3ae38994b7ef0e2L, 0x3a3c16b3bda9f306L,
74711       0x5e9a26d338a084dbL, 0x528e59935394e950L, 0x848ecb114ea206bcL,
74712       0x14b15ab540545d6eL },
74713     { 0x0f6d86c9664c59a2L, 0x3dfe2be160fd7aa5L, 0x33f9b5699072cb8eL,
74714       0x5f2325d98176a7e0L, 0x79a0d4e74587080bL, 0xa4ee0def0d5d4e05L,
74715       0xc0ad9ffac87b28e1L, 0xd6f18d2f3f09b4eeL, 0xcc896ae7292e9d87L,
74716       0xca88953d6094763cL, 0xdbee97a818fbf9faL, 0xdf20e0e94b63d701L,
74717       0xcbba6e3047ea722fL, 0xce57e1ca612b571fL, 0x1e16ac76009a55f5L,
74718       0x742bbed8c4389e2eL },
74719     { 0x23ea86dcc1dc2c73L, 0x4bbbfd5bc1643abfL, 0x07f8fa1f24d8ca1fL,
74720       0xde68a6e08cb5cac7L, 0x7d54c64b54e66a7dL, 0x789dba22a9b7ad78L,
74721       0x4d88d540e364ab94L, 0xc8c2e02d1f72e011L, 0x4c82605746e2a278L,
74722       0xe6c35bb34b187c7dL, 0xed8b3dfeeb8fe0c9L, 0xb6bc34e87d11e415L,
74723       0xb3908bbfb865c7f9L, 0x717d1ce6e1ecc17cL, 0x151e3308f7cdd69bL,
74724       0x97bd5a14b5c94124L },
74725     { 0xe01c62fe81e82861L, 0x703d4b6ddd42c40eL, 0x7e52e55be65e91e5L,
74726       0xb8b493745abbbfddL, 0xb4f15f52c72a45f4L, 0xce8435a8550f29d8L,
74727       0x9df76b9b582de75fL, 0x52e84c5fa20c8b96L, 0xaf77d2d10a8a0af4L,
74728       0x0389bbd8ca6013c3L, 0xb0d9b9ba26f8305fL, 0xf053e8480cec8b9aL,
74729       0x4d63367affabda18L, 0x50f53be4a6424c2aL, 0xf892c58c864fba2eL,
74730       0x317c6d3148cc5469L },
74731     { 0x0c3525b02cb7d42bL, 0x55240bc9310facaeL, 0x8d5d2022ff20408fL,
74732       0x6b01402fe0c10ea0L, 0x7fbef68a718eb23dL, 0xa0146b5a41252a19L,
74733       0x59afce48110e0d6eL, 0xe9a1d27f022de181L, 0x6db96d16dc3f49daL,
74734       0xfc1ae3f5efbe4008L, 0xf9d70641eccbc11cL, 0x49022279525f8636L,
74735       0x3769796ac2763c30L, 0x9cc3483c1d90630bL, 0x451651f0ee3d3f17L,
74736       0x6ae597399da0b8fdL },
74737     { 0x57b13bc7bff4d2eeL, 0x2075422930b173d8L, 0xb6254bd50794936cL,
74738       0x1d5f232a5efd55beL, 0xc06f4a854e0c3389L, 0xcf2c5b598e61f944L,
74739       0xc564861ffd5f87b7L, 0xee261fb15a2afa4cL, 0xb0ff72262d97a774L,
74740       0x1a89ae22d6cf007aL, 0x28880534d346f214L, 0x8fe73bff97b6497eL,
74741       0x8a8595b2fa2afffcL, 0x9ef9cf3ef151a726L, 0xa84ee5f1e744b82bL,
74742       0x6649048dbc63fe72L },
74743     { 0x91b7bb781e8b760dL, 0xd47b0bd825aadaa0L, 0x81493d9ffab5226fL,
74744       0x4a6dd226bffc148eL, 0x5a032f8aa29be3dbL, 0x318dbc7034b0ab0bL,
74745       0xdcccbfb57d654868L, 0x8506ab379c581e46L, 0x09136a6e2830ece2L,
74746       0x48b79356cf6c80c7L, 0xfa176377ef6b1e86L, 0x2c9c1cc183f0f1c9L,
74747       0x96f0526d16abedddL, 0x3e0e98e2a93b0de4L, 0x6f2d7ada0f13873aL,
74748       0x4eb93b5cf3fa49ecL },
74749     { 0xbd89f7e5e11fae32L, 0xd13d74f5c4023f51L, 0x1b0014df491c3f6fL,
74750       0x1d849a57555279b7L, 0xbb9e889705ba0068L, 0x82222419c13ca2caL,
74751       0xafbbb685fd33676fL, 0x931c3f5275878a2aL, 0x12aeefefef3d5173L,
74752       0x189a5cc8bd8a6878L, 0x82cffdb3d99f0c16L, 0xbf565406a19d48b6L,
74753       0x5605e223e9c6c4e0L, 0x53e781de86804172L, 0xcdf5c90bc7001cc8L,
74754       0x2b582d937c043f68L },
74755     { 0xa1165c8281abc2aeL, 0xa73380f5e2b69ecaL, 0xc097b3d207fff66fL,
74756       0x5d60382654776506L, 0xdcbac9f3b57fa21cL, 0x78750db4c98dbdd5L,
74757       0x85e21103d9eff32aL, 0xceed172c2f11c41cL, 0xa8e392649e348c09L,
74758       0x71cb936b831eddfbL, 0x915c3d06f50864a3L, 0xfe8e33cde93acfcdL,
74759       0x4bee10d7b3f2f7aaL, 0xc1d8eb48eb7cee9aL, 0x4fa49ce3fa574afdL,
74760       0x78615109862db4c0L },
74761     { 0x3fe3f4807ae72c21L, 0x631aa144fd0f0da5L, 0xc76ee1e8f8c3a454L,
74762       0x379ae09451b4f1abL, 0x2a3a4397d7cdbb24L, 0x7a14cffe82bd5fcdL,
74763       0xbbe4ed12f427ef5aL, 0x9b0a43ee284d3ccfL, 0x57b78b938eec6e1eL,
74764       0x18d404e467b8e87bL, 0x0c8adc0534374c20L, 0x643736055428deb5L,
74765       0xb4d80ec0c3afa2cfL, 0x6d51f93c3aa956f9L, 0x9f9a28ab84161c68L,
74766       0x540b6bb76bc9c025L },
74767     { 0x04e1734c321d315dL, 0x4ef56612d86e05d0L, 0xeafae145bba8cd81L,
74768       0x1fb07a49acdc789aL, 0x6a21e9ad5877570fL, 0x2e4a837eb9bc53deL,
74769       0x436db2931d6298ebL, 0x43afbc78ea362f45L, 0x2a973d97aabf6585L,
74770       0xdce7dabe0c924d60L, 0xf69d98f07cadf0e9L, 0xe0b505a175020538L,
74771       0x3db7d1a34461cd29L, 0xe1c287765e20e818L, 0x2ca2586752dd50f6L,
74772       0x897cab1492e0388cL },
74773     { 0x59ed38130d8bab8aL, 0xc11d364ca438200aL, 0x0687bf2c40581415L,
74774       0x86ad0d3a7ac89674L, 0x44928105b97411a0L, 0x74984b11f383371cL,
74775       0x70d2ed840d1a831eL, 0xd883628b6c912fe0L, 0x44f8f7fb14fa88d2L,
74776       0x564f2a4dcf0ac93eL, 0x82f629aaa6c24fa6L, 0xab906ba3bf6cd949L,
74777       0x2c822e6720a5182dL, 0x2ff47dac30eb93a5L, 0xdc62c4a4fff673aaL,
74778       0x64b00763476b0ec5L },
74779     { 0x1e3f533eb3c9a404L, 0xb1db7f73b7ef9952L, 0xc7f13e296c253693L,
74780       0x7ce7f4c40738eed4L, 0xccfd3b33ce26cad0L, 0xd878493501ec5cf1L,
74781       0x3f8fc09ddc084e01L, 0x217cab32c39b5acfL, 0x42daf0bb9ef5551cL,
74782       0xfbc76f56e1217a95L, 0x80178b12c237002aL, 0x0b52c39fb070a293L,
74783       0xe3925153576ca964L, 0x2555942419d68e36L, 0x291fb82c09e50e84L,
74784       0x7dd22ea66618ed8cL },
74785     { 0x7ffe844b49cbb3bfL, 0xde0cc7045562fb25L, 0x1e6ee5379f5a845aL,
74786       0x956d7f26e51277fcL, 0x2c75d4b930635718L, 0x39a1489296957f34L,
74787       0x8cf4eb3282e5742bL, 0x6b0d3ddd83247b72L, 0x67a9f633201a4237L,
74788       0x416403c11414a485L, 0x60afd447b6f6a916L, 0x95f94930dac6f790L,
74789       0x685ff94bbd3b9d82L, 0x5c8f98fc51cadf0fL, 0x9559c88ab13b7489L,
74790       0x31377c665f18fcc8L },
74791     { 0x35c5de097dcfb35fL, 0x2dccca9f01cc36f8L, 0x7e93e85d7576cb63L,
74792       0x0c2dd48af7b4b375L, 0x9d95cd4fb09a19b5L, 0x752ed15971bfe607L,
74793       0x439880cf2596dad2L, 0xe52efb5369e90a6fL, 0x4409766303d3e60aL,
74794       0xfcf364faa95070e0L, 0xd8f993b605624dd2L, 0xb35a982400d5e467L,
74795       0xe289d0240c8f4524L, 0xef45423c648a0179L, 0x3a5fd695587edabdL,
74796       0x3dacc50ca11e5271L },
74797     { 0xcb3e4f946499ae4cL, 0xa46dcbe17053c527L, 0x807f5ce9be782e8aL,
74798       0xb6c64d28d8481e45L, 0xf35e4518aa286fd0L, 0xf7b7b9badf1cdb49L,
74799       0xf3fb6210aec23eafL, 0x0a9ba385b9bfd2fbL, 0xe51a0d538807f3a0L,
74800       0x7ab24404b17b2842L, 0x6fd57687f9dd9f0aL, 0xcd1efdb4f3e9df64L,
74801       0x5dd2df7a60df194dL, 0xbed3f2c3e069df05L, 0x469b756123248a31L,
74802       0x866949e1694744f7L },
74803     { 0x3a9a0da53f4ab07aL, 0x2cd6f333f54a6fbfL, 0x0c92e921b23cf290L,
74804       0xc9581c3e848e3d58L, 0x93af1fbdd3b218abL, 0x38598ea1066cb4d7L,
74805       0x5001394e990c03a0L, 0x3b664b1e7d0877b5L, 0xd79db1bbd74c7091L,
74806       0x852d44354e2d5dd0L, 0x0d2b841b3329db82L, 0xfa844eb07b96d480L,
74807       0x37a50569c295dc46L, 0xc2d3837394f7ec4eL, 0xdc3884ff5b083177L,
74808       0x574352b88b1fa598L },
74809     { 0xed2193f70d5d7ce9L, 0x3c19fd260b487eafL, 0x7c44ab597be65fd0L,
74810       0xdd9da86078270d56L, 0x8a84ec00baa70198L, 0x2ec27e49285985dfL,
74811       0x996ccaf0de2028d8L, 0x4e7648c761c2201dL, 0xa96335bc091c19ebL,
74812       0x253a3a69f0d6782bL, 0x3f204340d2946493L, 0x444521a1099f6873L,
74813       0x5fcbcc096996011aL, 0x3884d5d8f853a94eL, 0x2418c624d3b6a3a1L,
74814       0x3e431af206ae3c4fL },
74815     { 0xf967d93983d381f1L, 0x36501aaed0c033c3L, 0xbf3af4d054410768L,
74816       0xa86d15985093a6d3L, 0x43ae0741d92f2900L, 0xfeb2afa636f0b755L,
74817       0xd090a6a3aa456d6fL, 0x336a4fdaaefdb646L, 0xfd1bfe441a942f7dL,
74818       0x7fc2a3ed851ee41eL, 0x4f1c968611e935c5L, 0xcd57766653bbb343L,
74819       0xf26931baad896c2aL, 0x8a0fbbd186bbfa41L, 0x1c3d7d82a203cef1L,
74820       0x6dad3f15e2664d35L },
74821     { 0xd1940b7d12ec35a1L, 0x6219c5b6e7dfb128L, 0x2cc278c6f13321d5L,
74822       0x5e76904a33c58eb6L, 0x15090f55d9903c43L, 0x061bc926c3d96a19L,
74823       0x974a9f038c0acba7L, 0x7a4140217198b21bL, 0xb069599df8958c6fL,
74824       0x517f2f1dbebd0129L, 0x1109a613df3a8dc3L, 0x08e58448672375c5L,
74825       0x56590ba49383d2d3L, 0xfc3ee7c60bff837cL, 0xc87a539027d2d55fL,
74826       0x2438e9d45f517a3fL },
74827     { 0xc4a453088815af3cL, 0xe55f1a32f3c9bed5L, 0xaef1cdc997b65ddfL,
74828       0x61c61d9412e51eb5L, 0xbd0dac54e63f2490L, 0x6f14429cd0b3e231L,
74829       0xf737c3c2f1da6010L, 0x7150e04b6bbc4fb1L, 0x205b4c891be281cbL,
74830       0xf1b4633cd7701f5bL, 0x8b33ef462a513490L, 0xddb47c7368f1f7f2L,
74831       0xf4ada511bd416b67L, 0x9d2a97cdff795bb3L, 0x00a8b7b296200e67L,
74832       0x13f39011afe30e01L },
74833     { 0x3dd296ef7bd0c827L, 0x506110f34a29ff46L, 0xf87930681c9a515aL,
74834       0xde8d8045268bca77L, 0xcbb83024998045dfL, 0x3f90d71068c0e584L,
74835       0x2a838ca8263b6062L, 0x293bb5e7535c5d0bL, 0xceea99d556415110L,
74836       0xfe311ad01bbda005L, 0x2497e0bfa4d8d018L, 0x33dd77a01cf2b866L,
74837       0xbc075b73d8c4ba8bL, 0x298466d4722b7bc9L, 0x17a7ce24cbda1b0bL,
74838       0x458d4b6b680703b6L },
74839     { 0x8a26a20e4d54d8b2L, 0x05a5696e4d320a0dL, 0x698b5858f994f700L,
74840       0x7a4adc3c2f6549a8L, 0x1812e8193694d00dL, 0x46b9b000730402bdL,
74841       0xe10a1449a1b36410L, 0xeae95ea599230220L, 0x3efc2e9b1b4820c3L,
74842       0xfe5b5cb585c9eb8aL, 0x21ae031997847064L, 0x68ef0b708f27d49fL,
74843       0x3259ef182f72556bL, 0x00ae0457624db01aL, 0x628e3b065668f95cL,
74844       0x5f13f5fab6fbbf91L },
74845     { 0x7c6ed9ae3a9b0dc6L, 0xaea1bde96f883ec8L, 0xea66bf88ea8b3677L,
74846       0xdefa6abc9a66e3abL, 0xc4d3317b68217ffdL, 0xf741c8f2290df05cL,
74847       0x1f0fdf177d11674eL, 0xfdf0ece7c35989caL, 0x0eed92df6b9c482dL,
74848       0x73713e6655bf1ca7L, 0x90acb29025cec99cL, 0x37c9e3a2e803e69cL,
74849       0x7c0a3c5317713a1aL, 0x350dc5656f5a174dL, 0x11625a4405f802f6L,
74850       0x2196495da37ba4a2L },
74851     { 0x00cb2fd313142680L, 0xab9e91d765d14cf4L, 0xc6a0ceabdfe2669eL,
74852       0xbeefce580ae22bc5L, 0x3c2b7986cb6ec250L, 0x84adb1a2d738f1ffL,
74853       0x9709bc28516ec8ecL, 0xf36931298e8f7db5L, 0xc48efc6b95b197f9L,
74854       0x9ff109529aaaa404L, 0x2c3c8cbd144154b0L, 0x33ef7bc3427f3435L,
74855       0x04a17940d21897c1L, 0x5aa0c47d6ce548a0L, 0x2971cea73d56fa62L,
74856       0x93ad0eb004475f08L },
74857     { 0x7a0b6967988a9963L, 0x61e477f76515e8ddL, 0x6274e3863b6b50f2L,
74858       0x63a9b8d5d33922deL, 0x3c38d3fb687a5b3dL, 0x18f6f09c1302e323L,
74859       0x254c05c3e02fcccfL, 0xc04ed0b726e662f7L, 0x1d5646b8143fe079L,
74860       0xef8a9448c9016c8cL, 0xe5674c4bf823d797L, 0x0586f72fbccde451L,
74861       0xc5fc88d54417eadeL, 0x2b952209576e588dL, 0x4408dd425844d1f9L,
74862       0x73f8c3f0ea41c034L },
74863     { 0x89534fc85df763ddL, 0x3b1427f33ac71836L, 0x0db5be176e8f15a0L,
74864       0x1d390944cb20888eL, 0x7804c9ad857caea6L, 0xaa584428519f7bf3L,
74865       0x626eecf1293aa8cfL, 0x749e0d98ea36a015L, 0xefff6dae3321edcdL,
74866       0x963deea628b791ccL, 0xa14e05522d16e361L, 0xa2e058fcb15ae206L,
74867       0x0f268745fca325e4L, 0x7cf9d40721341a8aL, 0xdfed25d97caa51b8L,
74868       0x0108ae39adbedd75L },
74869     { 0x54d178f3a9e88f63L, 0xaa05b11eab0c7325L, 0x773a53e6e261d8a6L,
74870       0x24db7dae8d0b91c8L, 0xde10b073e9bb004dL, 0xfc8befe754e3090bL,
74871       0x16af05990cc69c89L, 0xddc838039d59511aL, 0xc3f65b9946c5dafcL,
74872       0xfbbe4be81ee0a599L, 0x88891e36fb3a9b17L, 0x0c9aad75445dad00L,
74873       0xdffc46abd5097e1fL, 0x8848089bac85a4e1L, 0x348bb42fa0c45233L,
74874       0x807c06d8eb13c1dfL },
74875     { 0x00a969ec98ee0ef6L, 0xba9d54838bb7b7afL, 0x24484c92a02f8fdbL,
74876       0x7bdb201a8b70557cL, 0xe59343e460ad1af2L, 0x53a9a942998c95fbL,
74877       0x974db3deda861d3bL, 0xce1525c9ed399c0eL, 0x89b56881f72109bdL,
74878       0x08ff7d15998211a4L, 0x5df76b3aef0f275aL, 0x93f180f7fa2f358bL,
74879       0xaac4ffcfc39b0634L, 0x2692c62617583b53L, 0xb2fdfa36b55399fcL,
74880       0x16424c6c99607a61L },
74881     { 0x5dd65c55dd2744a9L, 0x2544c1c2fe3af418L, 0x32c82e99efe8b089L,
74882       0x30b7ab25a9df691aL, 0x983845509be99674L, 0xbcecd258caf2d122L,
74883       0x88ae4098bcc77272L, 0xd43961414b8efa0cL, 0x44ff67b9ed64d12cL,
74884       0xa9e655e42e7f3404L, 0x3d16fc4545b0e9ebL, 0x474a3e14f03ded28L,
74885       0xa3c9adffacccb85cL, 0x3dfe6bc17253a51bL, 0xdddaf4b9fb5831b1L,
74886       0x5544e602a4f4478aL },
74887     { 0x897c5313baa80b4fL, 0x0122716f63bdc8efL, 0xae2742db7b42c5a8L,
74888       0xe9d9e1e90883308cL, 0x352c8c3f2d341ab1L, 0x163d0500ed945870L,
74889       0x8349dd73c290d9d8L, 0x2053c5e01f6c7d29L, 0x83107446cb42033cL,
74890       0x76c88bd209d09af1L, 0xd0f70e6eb2794681L, 0x720b59de19b1b540L,
74891       0x80b7ecdc22994b43L, 0xc1a4cdce2dec53cfL, 0xdd7d3edd1ed60f42L,
74892       0x5735995ce241d261L },
74893     { 0xdc4ba3fba0237056L, 0x6856c16433ab3388L, 0xc01eebbd271ec612L,
74894       0xabdeb033e3031becL, 0x4eee44196118a1f5L, 0xec4974215b600f33L,
74895       0x1b7185cf08868773L, 0x7b0c46cd7c1b7dfdL, 0xd143b2da4a4c5e89L,
74896       0xdb9a5984bb1ff94dL, 0xac3904e4c9cf3465L, 0xf8729bc0eace64c9L,
74897       0x5cc22821768ad99aL, 0xbbd3b0818a9540c2L, 0xe468ed5f049a6917L,
74898       0x885486df3ec45ef0L },
74899     { 0x6a942c934bdff464L, 0x3db2719f25a7b451L, 0xccb0070b325be324L,
74900       0x2055a31b19fe3339L, 0xaca69ae8241ee8ffL, 0x7607dd0855ef8defL,
74901       0x9e24960f1a1b73c6L, 0xbcb0e8a271d36810L, 0x29e11aa26885e6b9L,
74902       0x98b5d0ab185eae19L, 0x1a0b96e40f81f91cL, 0x4d0e8bcf994fc503L,
74903       0x33d81697f119d6e0L, 0x29083287aaa4ce0cL, 0xc5dd4d3ec91ff9d7L,
74904       0x31cecfe8d4ab962dL },
74905     { 0x437bfd9afc8b21e8L, 0xe5dd32b3b19436dfL, 0xfe5902d4921c36a0L,
74906       0x8e9de84da3d0fa90L, 0x9663e6ad5bb523bdL, 0x9800a23faecd6975L,
74907       0x1009c0d9b4fbb59cL, 0x839aa7bdc9d20ff1L, 0xf502f66decd6fa3dL,
74908       0x480ed4fbc5516ca9L, 0x65ffa5f66c742ac4L, 0x2b7c7945ff3252f8L,
74909       0x72fefc0575d9cb3dL, 0x11b0863bd6d6f1d2L, 0x5d8f3cf09a6a4ec3L,
74910       0x6961b46ada2547b3L },
74911     { 0xd07b587ecb35e2acL, 0x1ed5546b57af14d9L, 0xeca17a5bdb28a04cL,
74912       0xa1f91d44709d54f0L, 0xa6e719fd9c6f400eL, 0x4e4b88edfb8ce190L,
74913       0xf9781edd246e3fd2L, 0xd67120e6b655af5dL, 0xda782d1d93413ca7L,
74914       0x697e20a29707fa21L, 0x1eb51f3254e84123L, 0x2e254d9e36051f9fL,
74915       0xddaec42b73ce5be9L, 0x89a9a32ecd3f794fL, 0x1964e22f0781aad9L,
74916       0x6a63a90c53755212L },
74917     { 0x76554e003d7acbbbL, 0x2c01668ab74f6108L, 0xe4a29672388c519bL,
74918       0x016677143eb94d4fL, 0x086a3cdf0cd6d2f6L, 0xf86580217b370f7fL,
74919       0x658880c15a4d3e7cL, 0xd6ed58165ba3f4a1L, 0xabcc78135ca471ddL,
74920       0x809bf074e844a576L, 0xa53a81b36ea502eaL, 0xc20b93070e021ed3L,
74921       0x8c27f8928617f165L, 0xa54764468235cd0bL, 0xffc89ffd82552961L,
74922       0x51ed4a22d151d90eL },
74923     { 0x37d6963a449701b4L, 0xea8d91a3bb27caf2L, 0x3ef9be15b572965fL,
74924       0x75a7a055db50bf7dL, 0xfd67480ece643b9bL, 0xf2a60d2d6ceb5d5eL,
74925       0x68fc320c5ed7c897L, 0x41c53cf628ce685fL, 0x0e29711f7106615eL,
74926       0x7a87213823500eccL, 0xaf0a92606c29fe48L, 0x93df3f2ae1ef9712L,
74927       0x0d5f6fb1d2d169bfL, 0xeb7afe2674a9793cL, 0x4173d94ae9f49256L,
74928       0x2d6951bc2b8b5ce5L },
74929     { 0xdd007d9f904e222eL, 0x333f248f86f4e109L, 0xd4994e8b8f429eeeL,
74930       0x29573415cfc77518L, 0x6e7fea3a0b0f42f1L, 0xc795cb7dc2743519L,
74931       0x820a8f66711e71a0L, 0x83d95d9c2b874f55L, 0xd4b64d78e70e1627L,
74932       0x924353f58b92a742L, 0x322048b1447b5e6dL, 0x0bad730cbcf931a0L,
74933       0x75c4d089a7af2268L, 0x464904c1b83b93f9L, 0xa24eba02165b3aeeL,
74934       0x65c48e78e08cc5f0L },
74935     { 0x1a1c73cede222c22L, 0x5683d8cdfcea23b4L, 0x0301cb14b2143b06L,
74936       0x284adf8f59fcec77L, 0xfb1c581c31204cefL, 0xf54d3eee94735107L,
74937       0xdbf67f0b4d3188c0L, 0x76a3f2d110f18d12L, 0x3809fa2807d3e013L,
74938       0xf06f0a4625e7ece0L, 0xd82867edb2895d2eL, 0xe106f48908b0553aL,
74939       0xe2280fa6ef245445L, 0x402d5785a8d9a3cbL, 0xf63dd9ffd438ba2dL,
74940       0x36b5cd2c7a6b226fL },
74941     { 0x87ff4e20545679a7L, 0x64d80b414520c750L, 0x90a357fa9b459cd8L,
74942       0xa19eaf39c85af1a3L, 0x0d475d798d935a5eL, 0x74501983781a678aL,
74943       0x748397790cc2e810L, 0xc6a21d112f412244L, 0x8d0e85f936a51a37L,
74944       0xff50151eeaa74df8L, 0x14e182a793cf99c4L, 0x45593df1376a9ab6L,
74945       0x18f73caf522389ffL, 0xd27cc960f7445e8aL, 0x0692f4c539a51dc8L,
74946       0x08d7c144db39bfd8L },
74947     { 0x809c0d963ecca773L, 0x87ea9192d48c2156L, 0xf0eccd74db6bd641L,
74948       0x773123742a678cdfL, 0x7a966d8bd1587b7eL, 0xf3c1a1016130a4c6L,
74949       0x7cc6e8385fce17bdL, 0x95e95bb8a8de7aa4L, 0x3fe1e8b5898308e3L,
74950       0x0197243ee347694aL, 0xf3fe9c42bb0cd2bfL, 0xb59052640f9b2b49L,
74951       0x4c385e8bc7367d1fL, 0x1d3050aeb5ee147bL, 0x8e2c387904004ad9L,
74952       0x5f2aa8eebab70202L },
74953     { 0xe208d4641266524bL, 0xb7bf3880d0a19f66L, 0xa5aa685eda106ebfL,
74954       0x0a69e8d3e642dd46L, 0xef349c61c682e4d6L, 0x26f6ee3b0fcb534cL,
74955       0x7daba12705eb67b8L, 0x2babb27e18be05f6L, 0x959afcba8e2d85d1L,
74956       0xedcf2d1ae2d9d386L, 0x59dc52e61ea6f06eL, 0xc28278b4866e5ae8L,
74957       0xd9ff034002bcd3c7L, 0xe884ac76784be82fL, 0xa316498083c9f224L,
74958       0x62501a98b46ff949L },
74959     { 0x563f7d9aad264086L, 0xca6a33dba5e0e4bdL, 0xe82530028c8d3d67L,
74960       0xa288dac846e64b19L, 0xfa3c919720aa4536L, 0x8130c9b0ed553eacL,
74961       0x622806e02ea8abd3L, 0x52fbf54dceccfe77L, 0xbd9a8e314f0d1b70L,
74962       0x519d2133d59b1741L, 0xfd74101c9a6fea8aL, 0xd1acf7a0b5c4eb10L,
74963       0x78499b7391f9da5eL, 0xabaa4c49c0dea586L, 0xcc9c5f73a1f3531aL,
74964       0x497b15fefd3fc665L },
74965     { 0x8a56cbaaf45568e9L, 0xf491a0fec7192a6fL, 0xdbb03dd39ab2539aL,
74966       0xc86522f84ac37da9L, 0x8c8cdba202a0f5b4L, 0x8109fc75a29c539fL,
74967       0x9cd06d31ca90f02eL, 0x8f31f0443e216dbfL, 0x99aa68acba3ebd91L,
74968       0x2a80d0d242c007f4L, 0xdd8dffbf86a9b7ceL, 0x405d3e84d6308edcL,
74969       0xdafa33fe068012caL, 0xc2eebd13edea1071L, 0xb7ae7e5c2ff637e6L,
74970       0x18d46a6c9e514cb7L },
74971     { 0x868cbb22a78b7802L, 0x0745ddb2497cbaf4L, 0xc4eb2f3e42ae8addL,
74972       0xac0abcdab4ceb4e4L, 0x2e0d8325a325fd40L, 0x6cfe057113ac7345L,
74973       0x7407a788b14171b9L, 0x70eb06036da7a52bL, 0xab0b36f9d85176acL,
74974       0x14109d297c2954f3L, 0x370de9c8dcd705adL, 0x3f0db5cd7bb5e751L,
74975       0x45f93d41a06e708cL, 0x10d54f8a7e93050dL, 0x69e6f8e45a38fef9L,
74976       0x55044601d3f62e40L },
74977     { 0xd1c5c91006cb9cc9L, 0x542074d741d00014L, 0x7cd8663e11236fb8L,
74978       0x39721ffe29ad5f82L, 0x1d21fbfa2951fc83L, 0x1cde06e7400d144fL,
74979       0x9042596b91792e6bL, 0x3365c8e529ad5166L, 0xe2220e859aeefe98L,
74980       0xbcb5318970c2aee3L, 0x477ca3db9ff100bcL, 0x27074176f532973fL,
74981       0xa12118ac9a2bd01bL, 0xf34252093dd79f93L, 0x563a8ff7c6f5d7dbL,
74982       0x0da313fcd7b0ec4fL },
74983     { 0x37125a8c15aa2557L, 0xca21d70c00893e9cL, 0x4871399467b8a823L,
74984       0x0d3e9a747cb0042aL, 0x2d2bf4ffc9e2ce18L, 0xd5531a0d049aeac2L,
74985       0x4d29a616f03d0660L, 0x473d50d61f1b7f00L, 0x3af0ecbbca3de50cL,
74986       0xe2959bea09c28f27L, 0x6d7c2ea0f8704664L, 0xadfae4e1731083efL,
74987       0x50940c26941c2554L, 0x44167410a1162d03L, 0x620230d81e82290eL,
74988       0x63630be8db414accL },
74989     { 0xbf8d52228a7d2e41L, 0x49e75823eb62f879L, 0x1b4d33dd6c402d89L,
74990       0x883e04d6de2c59adL, 0xbf3f38f449b9dc38L, 0x9d997d18b4b70c4cL,
74991       0x1f69b20c13cea045L, 0xca3d702558e2606dL, 0x3d4fd977261d1b79L,
74992       0x56aeafa85a1436faL, 0x369b3e98bb443c07L, 0xfce5186ce558f6beL,
74993       0xeb0cd478f8ac8f89L, 0x68074f37d5e5aa72L, 0x295845c068544eb0L,
74994       0x306a9871f16688edL },
74995     { 0xbc451e9d634ec136L, 0x1edf27ca0e6f658fL, 0xa9be0152c0db4120L,
74996       0x87b6ef20c5bfee67L, 0x352832389a2d6023L, 0x60e564d8c7afb899L,
74997       0x4af22bc00ac9c2deL, 0x28e6f63182a9d22bL, 0xc075c701f532701bL,
74998       0xf6d418f882075f91L, 0xf9fa628d1beaa511L, 0x551e7a176e72a13dL,
74999       0x9306215b77f4c01cL, 0x71aba73193c9d588L, 0x6443ebe058e57cd4L,
75000       0x2833ac41e8103e37L },
75001     { 0x7e564b868da5ec5cL, 0xac3d9da81c08db24L, 0x9d7c1f0b8c57a728L,
75002       0x3512afe79d343dc2L, 0xb438e4cffdc60339L, 0x7d5a2700dcfa1941L,
75003       0xd5f323f827320449L, 0x1b87a58e1393c6e6L, 0xecb68bd104baa431L,
75004       0xc09c1c5a4722b4d7L, 0xf42faa97206b5faaL, 0xe1dcbcd69976327eL,
75005       0x655ba9e4087787d9L, 0xbd59c757de5c0191L, 0x673020ed0bcf3538L,
75006       0x120cd454a49d6303L },
75007     { 0xebfdb8f4cab0f9eeL, 0xbc003ef02cce58eeL, 0x9b6a68415a8d0665L,
75008       0x642ed3a69b957774L, 0x3de487f04721ab5cL, 0xef2ff38021a4f0d3L,
75009       0xbd16f55829dbddcdL, 0x2ef05b4b0e93dff2L, 0xde1faa120bc9aec1L,
75010       0x66dae2c2d467fa92L, 0x758daf645eb33e34L, 0xa67ad9f68f0103cbL,
75011       0x151f693a9be02430L, 0xd5698496eb4054bcL, 0x8ef1677e7019336eL,
75012       0x021cfd167fdeea3eL },
75013     { 0x5c73715fdf5c36f3L, 0x703bde37d64ad254L, 0x55368d10f2cf7713L,
75014       0x1e5ec7b70f3993c8L, 0xfdb16776304ae4caL, 0x0d8f717e3d3bb18bL,
75015       0x5267073f66343d5aL, 0xfaeb52ef156008b5L, 0xb97ad5f9224a470fL,
75016       0xaf86e391ed2ab51aL, 0xdc0c7e579974302cL, 0xc88fa817fd0ae28aL,
75017       0x807c22dfbf8ed59cL, 0x5dedc231eb128bb6L, 0x71edcd9ca20595a3L,
75018       0x07265b46c73cf78eL },
75019     { 0x73dd99f0bd66232fL, 0xc59aaf89c4027716L, 0xaf826dfa5b860fc4L,
75020       0x239ea8aa7a943f3bL, 0x0e0e1b1a523c428dL, 0x55ea0e3a6973b95aL,
75021       0xea399caa2557753bL, 0xf8adf72f06957b1fL, 0x0389f3413bd34302L,
75022       0x333f27d0f8a43a97L, 0xcd9c0c08adaf796fL, 0x6dcca49b49c12aa2L,
75023       0xdd88deee7a0ac6e9L, 0x8f47575d0644080eL, 0x6e9d667d0cc2f4bdL,
75024       0x36c5754b31d1496cL },
75025     { 0x9120046ef323d84bL, 0xa69911227e789c4fL, 0x4b0eaf4e921b8055L,
75026       0x6339844a8079974eL, 0xc905466a740f8c79L, 0x1c18d0f7cd6def49L,
75027       0x5297da6b4b23e4baL, 0x1c09dff3c41800c5L, 0x6c49075b37ef6777L,
75028       0xa94c3a4050513dedL, 0x3d6742e96b0b1705L, 0xc0784494c48af5aeL,
75029       0x40c01532c95822deL, 0xa2ddade5c164d94fL, 0xfc8a8ac9a2975eb5L,
75030       0x06fbf8611946944eL },
75031     { 0x2d65338e3f45aa97L, 0xd83b58c81d040febL, 0x05fef59b0fdef8b9L,
75032       0x7beb071ae4d7417cL, 0x982b61f5b30a1a23L, 0x4c5f2a2afb65bd03L,
75033       0xe40abc9d5cbf6bf3L, 0x422c326df06612a5L, 0xc921e69d9571ae28L,
75034       0x7c88b10b23d3434eL, 0x96d2e9579da07933L, 0x833d46a13619cf4dL,
75035       0xd9d19653d95eefa1L, 0x2a7d8411a03e8f0eL, 0x5e64295304bb5ab1L,
75036       0x5e9ca0fd1f0fa9eaL },
75037     { 0x5bd54571197c5dc4L, 0xe2da40bfe78a95a2L, 0x65fb9efcffdb0eb2L,
75038       0xe952dc2c0d17467cL, 0xc1fc9c7bc758c6a3L, 0xfc79562cd4034a9aL,
75039       0x26e36fbe61f64b56L, 0x6adc4b9e1e84728bL, 0x7f165fd3a8f9ac8aL,
75040       0x7bc93a4503e3e013L, 0xeacc5513656478e3L, 0xd3391717064ddc77L,
75041       0x75b318dc76936914L, 0x69b1f1c7362424a6L, 0x8cc2045b49955f34L,
75042       0x940622b3c6836af8L },
75043     { 0x4710ccb70d997973L, 0x3b29625dd3f8f115L, 0x8cf0c4d55b97abd5L,
75044       0xc6321e0a673e14a5L, 0x0541af9d3d262246L, 0xde6d87546fc83b11L,
75045       0x47e97da8f01652a4L, 0x0f82b3a6ad9802b6L, 0x69aa4075ae9c44b2L,
75046       0xaf3f5de2ced2bf77L, 0x1ef1ea8a497a40daL, 0x2e0f86083c23ba9cL,
75047       0xd8a998a4f190a2c8L, 0xe2b49c8ccfde3368L, 0xb9f49824bde6bd71L,
75048       0x80bb1664785bedb6L },
75049     { 0x05e575fefd145cb5L, 0x155ee561ac5e6883L, 0x461e70cf8793b273L,
75050       0x9f1553de133b2338L, 0x2fb9e0c3a2a7ba07L, 0xc3bfd6a83e7086faL,
75051       0xb6ba85008bb4cb93L, 0x0b66d78976f82dbdL, 0x7d5a6ff654eb49ffL,
75052       0xcd65d2371f20b322L, 0x79ea49c254e29cdcL, 0x64975963cb118ff9L,
75053       0x969598ddcc58000bL, 0x95107918110c779cL, 0xedfc154863b85a35L,
75054       0x077ba5ea41212350L },
75055     { 0x0b3a38d3cdd86f61L, 0x431214450502a0abL, 0x1912edc5806d0272L,
75056       0x01dc1f988a32f10fL, 0xbb1d31d10e80c760L, 0xd46ec7e5f464e8b3L,
75057       0xd569af369abf49eeL, 0x9d286ea72cdade77L, 0x2be7020d45ad5920L,
75058       0xabe5236e6299ae7fL, 0xc93179bdd3f55c07L, 0x8138995a52350e80L,
75059       0x0901265caff07586L, 0x5b3c81b2f4739653L, 0xbaf7581d9bc77d21L,
75060       0x6b2006df4591a2e2L },
75061     { 0xb2fe50a8965b1bc1L, 0x931f536a962bb4fdL, 0xd5718d33000e7f99L,
75062       0x84728f2553d5125eL, 0x4f8a6184d2125cafL, 0x54f1a701357f679eL,
75063       0x70a9f40c1531c05aL, 0x10d0cb976fa8b775L, 0xb476f41e9dc12ce9L,
75064       0x5c8d7a752755f894L, 0xd6c12e10625741a4L, 0x262a6fb8c917b16cL,
75065       0x24d116e638d6b0a0L, 0x849540c032c38e83L, 0x855b911c66868afcL,
75066       0x53217ea6bd26b550L },
75067     { 0xfc840473259f52b4L, 0x968da9cbe621146cL, 0x964eb85ecacbd26eL,
75068       0xab7daa2de4a54344L, 0x6dc3b848381a4ff7L, 0xa07a96b341c815efL,
75069       0xc4fae9e8c3d4b1e1L, 0x0f938d1e42ce9ea8L, 0xa727dacc35cc052fL,
75070       0xc81e01c9e9a06f07L, 0xa9e08dcb4a6d65a1L, 0xf8e2d1736044a9a6L,
75071       0x99893dd0f2bd295bL, 0xa08d3379f9781b12L, 0x64bd600161830ac2L,
75072       0x0386931ed9adbeefL },
75073     { 0xd0d7abb3d09885a5L, 0xed9d2b67e355bb07L, 0x3bc238cf536ebaedL,
75074       0x61ca2e78699ce4d6L, 0x354ff447111594cdL, 0x55cbe70903316ad2L,
75075       0x418679fd49fff5c4L, 0x75bacd750f9c6c40L, 0x677edc882972721aL,
75076       0x82596887e5ef502fL, 0x459e9367bf320e0eL, 0x81ce36ef8bbdccb2L,
75077       0x1ba097fcb766863dL, 0xcd3a21d6d58c6db8L, 0x0e4967cdb4a8748bL,
75078       0x2caaf74915041c20L },
75079     { 0x44f980066ed20424L, 0xb3e4ea2322471545L, 0x268ed1a5781a8c86L,
75080       0x48d0ab757ae5b70bL, 0x6ca8b320356d3982L, 0x9ce8e6812df31fa4L,
75081       0xb909d232d925dcf2L, 0x302c8f78f56723deL, 0x11725d69abac96f9L,
75082       0x656a47ca57d1a170L, 0x6bb5d511c18a2be7L, 0xb56e45f1ad50d9d9L,
75083       0x36e886e270b05518L, 0xc7c71f3d09d8ff91L, 0x65a1bbe29350361eL,
75084       0x86d7f53245fe3bd8L },
75085     { 0x99f16eb6b0bf719aL, 0xb69750988bc3d913L, 0xfae50e5226cd01b4L,
75086       0xd3e3ac5490898d1cL, 0x4da3b9db887ec666L, 0x58300644fbea45b8L,
75087       0x369f3bd98355b058L, 0x0fb239a8579bcc13L, 0x4f5b45396e2bd811L,
75088       0x007f3baf24198fd2L, 0x68a676db8837d51dL, 0x68eeea62eae75b16L,
75089       0x5ffe5f943db6083cL, 0x52c94d0f7d836c5aL, 0x5a4c3c6fcbc1ff85L,
75090       0x682a55e386c0b4ddL },
75091     { 0xc8f235a4587495aaL, 0x2276026c34c7245dL, 0xd6ae0cc5b75a46e3L,
75092       0x890d3965ecc3e5e7L, 0x1b13342f14296629L, 0xc89927e68a877227L,
75093       0x1543f27e2324a68bL, 0x6c44768449cdc21aL, 0x9bc7fd4f1452d0acL,
75094       0x2cc30a31ff4b045cL, 0x415d46a0852f7611L, 0xad737052c6fdd7a6L,
75095       0xdcecc3ab7b4c7c91L, 0xd2cdf01b7688d70cL, 0x054f2542e40d3905L,
75096       0x02227fa6fefe4dcdL },
75097     { 0x1805efd9b751948bL, 0x8efeed46fdfd225dL, 0xcb128e094f2c8b22L,
75098       0x9d1090bf96f7c5e5L, 0x0959d044b4cbeca0L, 0x21c955f98e08cb04L,
75099       0xbc1f279d68fa4fceL, 0xb021e14e0710ae9aL, 0x64d16e9f881167f4L,
75100       0xf5a5c22ebbc9f1a5L, 0x5f3716dfe3420eeaL, 0x971eb915d5c4e843L,
75101       0x64fc55fc28ffba81L, 0x3427e54d7dd37578L, 0x446e6a6215ebc7d0L,
75102       0x547e249a29269778L },
75103     { 0x4706868aa1ffda27L, 0xb4e6cdcc7955cf50L, 0xf65151e10a63f3d8L,
75104       0x5b4127ea9de5e70aL, 0x3d2c09baf9342823L, 0x18c99d83aa2f7d51L,
75105       0xa0c5bb1dddeec025L, 0x7ffddf8403dcf1ceL, 0xe57e4d29616fdedaL,
75106       0xd24565697932a1f0L, 0x7475e0e83191d4e3L, 0x3479bea1c220218bL,
75107       0xfceb5c908bcb2505L, 0x1c685cea3c6132e6L, 0xc42dc745bfe6c1ebL,
75108       0x45a41cc0d2b08eeaL },
75109     { 0x3ea9b2c74dbbf0e1L, 0x41ff962fa17cf70eL, 0xdc1ea7585eeb4c66L,
75110       0x4f5412d2a9beb17eL, 0x2c9e4f52a285741aL, 0x93df7da4984fd11fL,
75111       0xb2afbddc0df3184eL, 0x96323d252421e375L, 0xc87be1e449df781eL,
75112       0x145601ed3d589beaL, 0x0f0bd9bd28fff6ddL, 0x2d3259d48a0f298cL,
75113       0x362d7a77d88e6944L, 0xa84c06b6b6ac2af6L, 0xba850ac9d087da02L,
75114       0x128763c942ee40c8L },
75115     { 0x29a80f07acbac178L, 0x7cc2004434b08f6eL, 0xe9631d1470feded2L,
75116       0xb2115da386615767L, 0x7c75f5c4cb088548L, 0x5b29d2139a2e8e03L,
75117       0xfe9fda668b881752L, 0x3f1d8d88c1de7ebcL, 0xb476565e03218123L,
75118       0x07365561b1c995f3L, 0x2160cb18b13eb71bL, 0x7e8da51399b3a0ebL,
75119       0x5e8ca1f9b20fcd74L, 0x6a7e0067b4126d72L, 0x1e8204b768bb637fL,
75120       0x75e96bccfc4f74d2L },
75121     { 0x189d1fdc0d19716eL, 0xdf5850587c384525L, 0x64a846d1ea987d2aL,
75122       0x12b6bf836c07150fL, 0x91d85d464d6fd5b7L, 0xa97888364f53f55fL,
75123       0x60083bd881509129L, 0xa7672683ea876f48L, 0xe80b2e7ac15b2489L,
75124       0x985ef8d242d1d992L, 0x9c57b029cf3de492L, 0xfe02f83cb1487627L,
75125       0xaeba4fe48ae5b687L, 0x8a86f09b5d6b8196L, 0xd88f566ba16e523dL,
75126       0x309a6e9aba268949L },
75127     { 0xef27ee50bdfbe97aL, 0x1a5fe70fb8c50c4dL, 0xcc7beb017fe09f5cL,
75128       0x8fa15a85bed36cc5L, 0xc0c3acdb7550ed3aL, 0xc581ef87eb908681L,
75129       0xa15b3362c49d5ccbL, 0x0fbb17141fa264e8L, 0x267f8d8f8e1eee88L,
75130       0xd31ccfd621c2b63dL, 0x924dbe7d53be7efdL, 0xd42e877fdb2a358aL,
75131       0xcf9673c775d68ac1L, 0xe35978fd714fea55L, 0xeeb366535769b202L,
75132       0x0458258ad7593789L },
75133     { 0x5df71a74a042dbdfL, 0x2d4058575779dfa2L, 0x0e66cba70d2e6657L,
75134       0x285d6745ca2e892eL, 0xf56a8def0f0e6b5fL, 0xe0ee851da30767c3L,
75135       0x98c0565843346b9cL, 0xb35fce26d6b3c742L, 0xc0895bff39777e00L,
75136       0x83c8f6a6e7b6d886L, 0xbee148434f02904bL, 0x7f74915b2e84ec34L,
75137       0xbaaf663c96d10991L, 0x004b8757e41facc0L, 0xa2b880e56f86c029L,
75138       0x53f4a3e095b77358L },
75139     { 0x11bb08ce89fc48e7L, 0xba60c577afab5aebL, 0xf06bcbf8a0c1cb5aL,
75140       0x7d2efaea79757cb6L, 0xe26d90b176319160L, 0x42aa1ab62b77b7a9L,
75141       0x38eec0cd285df2bfL, 0xd35947f5f3a8f7f0L, 0x97c8dc0efc1cb5b5L,
75142       0xfeb8cca0c45845cfL, 0x16e8d989249e26f2L, 0x7c264e6d483ed89aL,
75143       0x13a3f14551d91073L, 0x8501562e305e99f0L, 0xaaf98d746908d563L,
75144       0x0a99e653d723d236L },
75145     { 0x23536f46abbc0559L, 0xc163067b9aa1a160L, 0x229fd2290c1681b5L,
75146       0x61254be11378e907L, 0xc60ff57aab793a2dL, 0xa6f2df8b466552dbL,
75147       0x9ad318938c170a36L, 0xc5cd9abe29b74d9aL, 0xcf747273f7848523L,
75148       0xc126a93a0d0e3063L, 0xfe2021e34248e3d8L, 0xd97343ee8323ddfaL,
75149       0x9f768775332639e7L, 0x9650fc3175325548L, 0xb595dbd13eebf7eaL,
75150       0x3a95cb45010fcbc0L },
75151     { 0x954e68cb39d7ff2eL, 0x8dd1cb4bc1d5c48fL, 0x02a92c777169438aL,
75152       0x7965c0b091cad8ceL, 0x0c5798ab32cd08d2L, 0x1a5bc3c3a6902bdaL,
75153       0x545d09255186d218L, 0xf0077cdbd27e64dbL, 0x0157caa48cd092daL,
75154       0x2a2fa3a024532ab3L, 0xa5fb639b41ccaba3L, 0x01702dc14744aee6L,
75155       0x485bb436cdba93daL, 0x93597f66329784f1L, 0x5d713c1ddad672c3L,
75156       0x366d222e030b7245L },
75157     { 0xd50b4875573ea5b2L, 0x0fce401ba90da44dL, 0x7b53fa657a1a0310L,
75158       0x722a80a5cf114460L, 0x0b8ebf05a538bf49L, 0xae141147d32acd21L,
75159       0x6692712c7b5ad07dL, 0x6dc5fee73f48ca07L, 0x98ed14992b8a78d8L,
75160       0x4e8b3145dd2f1759L, 0x43408de15f971b8eL, 0x055ea6ddadf1b368L,
75161       0x4bb76e73e5932b7eL, 0x44287153d30893fdL, 0x173dccd20661bfdaL,
75162       0x9072ba9979defd25L },
75163     { 0x474de4dd9620ea39L, 0xfbf1649fc831cee8L, 0x0b0e8bb1cd3a9c43L,
75164       0x6a38286f3f3df1d5L, 0x4ed072b38f0ec9b3L, 0xa6e4c987729c09e3L,
75165       0xea3e8ac68ad12242L, 0x6ae0e22bfbdfa5baL, 0x56171ecfb0a0f592L,
75166       0x33b2886d6b871f8dL, 0x6b19bea935e11bdaL, 0x4d815a407f0f153fL,
75167       0x7e608d977d6c02eeL, 0x7e8f23d9b6a88f46L, 0x26ac9652439d1654L,
75168       0x8d92c6bd35546c29L },
75169     { 0xb3e0d7ceabeb0ff7L, 0xfbe352543e0e42f8L, 0x57d1b226de808499L,
75170       0x9ece2e1f1cd44bc3L, 0x1245adbc435cfee1L, 0x874ee840f93f581cL,
75171       0x916a779cbda0b947L, 0xabcc815afa57ae0aL, 0x97adec2df0a621b0L,
75172       0xbe6a502b81f90bdcL, 0x54bf9de153bde63dL, 0xa88fdabf78884c25L,
75173       0x30aa52b1cbbb5470L, 0xf805396c29053ef5L, 0x8d43d8988dd827eaL,
75174       0x4e4bec175c1ae5c0L },
75175     { 0xbf8483a2fcc09676L, 0x457c4a3f19ea9a94L, 0xa6852ef3d702a5ddL,
75176       0xe7915fd2843fe7d8L, 0x644bba9816e35158L, 0x8d1b95d09ed746f0L,
75177       0x47704581b90af0b5L, 0x0bd4bc6bd4fd135eL, 0xa6dce067b4e833a5L,
75178       0x2c0e8f30ff56a9a1L, 0xa9c80800ec2c63feL, 0x449c20a598f508a8L,
75179       0x02b94cb33292813aL, 0x647e3d28ec7e81a2L, 0x72e67d1ab4877677L,
75180       0x7a4aa3f56f9ded24L },
75181     { 0x559ef1bae27a0045L, 0xdc812d4fb242cb50L, 0x23a478e439cf8d24L,
75182       0x97544fc59b3f9c54L, 0x5ac68132affa1fcfL, 0x74f8fee034a2c83bL,
75183       0x96cc640fcd3f4bb7L, 0x775dce9db0512ea6L, 0x67dca19dcdce381eL,
75184       0xc1eeb3f3a9d3fe55L, 0x38e0bf421a19274fL, 0x15992fb428d69b12L,
75185       0x48fcebde9fd09df8L, 0xdc9dfa4fb41ab5dfL, 0x0cbd7dc8c0a269c5L,
75186       0x60282a7bf7f0ade1L },
75187     { 0x7c07e538dceea2e7L, 0x38a322c83c42061dL, 0x676828f94f1f6516L,
75188       0xf21b69fbc7776a10L, 0xc63a3417b5e6b405L, 0x4c99f25891a7b642L,
75189       0x38692ca82cad1440L, 0xf1e82ffe00869bcdL, 0xc30b714e16fe466aL,
75190       0x5fb742f919019138L, 0xe90166d00fa516aeL, 0x5550f7acd8c73a43L,
75191       0x2d6a407dfbc5c372L, 0xe47a753968cc39edL, 0x3fd286d94a5fbe70L,
75192       0x5f4ae9c723c6b942L },
75193     { 0xd96a2dda53f4d561L, 0x286d45d016da1992L, 0x449a01fbfdd4b051L,
75194       0x25488a0d9f2195eaL, 0xc4151b0aa37661b3L, 0xb98c471ef9e5ee02L,
75195       0xa4bca86ea8658817L, 0xbbcadb877a68fc0aL, 0x88b346496b7366a9L,
75196       0x32ee98d415661c2dL, 0xf5b3b4c6c901420cL, 0xa23527352f2752afL,
75197       0x2f64ce73510e4d9cL, 0x939a7f26aca4aa80L, 0x9cd3e291401aa503L,
75198       0x92a01423dc46afd2L },
75199     { 0xe9f24be11c2f7dbdL, 0xda8c900fb7d527faL, 0x963e25bb8648f128L,
75200       0x9ab713e248141941L, 0xe87f7d017a6756fbL, 0x274dd85e058d90bdL,
75201       0x823fee7a82566abdL, 0x9f6230d774240195L, 0x04579f2cacb5e46eL,
75202       0x2a22626316a4c87eL, 0x9ca19a43d99b0857L, 0x86dc2ba3e488789eL,
75203       0xf960b5b99406c3bdL, 0x6f2c428b8960957eL, 0x90748706161c515bL,
75204       0x0fc8fe1eaa88cb9bL },
75205     { 0x68ae1bedfeb90f2dL, 0xf393bb3ca48b1559L, 0x2be62f9cf64e9635L,
75206       0x354c2410f8be75c2L, 0xbd7ea7035e6f7529L, 0xc264868e162cab31L,
75207       0xb1391e70c860f3ffL, 0xdf367c751d89837eL, 0xe150b6b42bf32941L,
75208       0x95e8f46e78c1318fL, 0x2b3f1daba2c4b160L, 0xc6ccf5ce701afbf3L,
75209       0x3ad275305e8874c5L, 0x39285e515dc6dcbeL, 0x3c954d86d99892ddL,
75210       0x2d0ba862dfd3789fL },
75211     { 0xeacd8ee8b472e1afL, 0xeb354eaeb76abbccL, 0x9b520bf8d0d93fbdL,
75212       0xfccd60d7fe6fc706L, 0xa9353ddea4ee2f39L, 0x5eb0925e9a81e51eL,
75213       0xee334da1d1366777L, 0xc1d28c9fd5354d69L, 0xb977175592a5ed54L,
75214       0x5d3e367fb7f70d81L, 0x7be7eecaa933ae7aL, 0x264cf1f9e23cfbb7L,
75215       0x0d129f4a89497681L, 0x705375a409b6235bL, 0xccf64c7548a376daL,
75216       0x963c87124d41dbfcL },
75217     { 0xbae290cbde36a814L, 0x9bdb0195733b12b5L, 0x0ebad867f77fe0e1L,
75218       0x0a7d19fd29720ceaL, 0x434d76519029ec72L, 0x856aff17bb51911eL,
75219       0xd0a25d9ad80a7f60L, 0xffca86aff848c106L, 0x53e8bdf943ad749cL,
75220       0xfb9e0284e3e696bbL, 0x3eb6630aeeee4215L, 0x9d8fbb9e2ecf3c63L,
75221       0x71da4ffa4e00c0c0L, 0xb296be595d57beacL, 0x1751fbada8cec7efL,
75222       0x2d03eb3cff55d7bdL },
75223     { 0xeb16925f04f2ec1dL, 0xa878f2760d147ee2L, 0x442df604aad9d9e0L,
75224       0x891df44b3f71035bL, 0xc28272b38cb95d5bL, 0x6f14efb55ee8ed23L,
75225       0xf3c4460f13b0f3e3L, 0x889f9bd76bd7335eL, 0x889ee771f755ba6eL,
75226       0x626984feed219b6cL, 0x2d44c737ec2ee411L, 0xb94385a263efcd37L,
75227       0xd909321b6637826bL, 0xc24f8a793ee6b7a7L, 0xa3ca8d24a7cf61b7L,
75228       0x842e40c1c54bacd9L },
75229     { 0x5a268ed6a661d843L, 0x02328cca4f5b30cdL, 0x16e6fed11311e177L,
75230       0x690decb4c6695967L, 0xbdac5bf657b2e280L, 0x827f82ca1efe42d0L,
75231       0xc554ec0aca5fca2fL, 0xac5276c1dde45506L, 0xb7f4cb08e3077513L,
75232       0x8caf6d9acc8797ccL, 0xd59648140d9332d2L, 0xcc6ae297285a409fL,
75233       0x7773c2a56223d093L, 0x2d5266ac5128fc09L, 0xa596b7cbbc31fe6cL,
75234       0x0e63319acac91328L },
75235     { 0xb5cd2fadf0360ac2L, 0x86b660de285e605aL, 0x82c6cf10e25b9b14L,
75236       0x9d5fa38daa9ac554L, 0x3dfcf1b8526c070eL, 0x0379a96b3fccc52dL,
75237       0xe3659c290bfcc7f5L, 0x5b1a3db569d3e6a1L, 0xb41528b59b7b42d5L,
75238       0x934defa49c22a006L, 0x90f380189b4ce3b6L, 0xb073bc04b3abaf32L,
75239       0x27a5a222ff8389e2L, 0x0b7a9d51ffa5a35bL, 0x4939ecef28e1a7c2L,
75240       0x88839da21872705aL },
75241     { 0x56b66c30701ce29aL, 0x3acaf12658981d50L, 0xd4dafc0c105f9f21L,
75242       0xfee571e6373e3d13L, 0xe7269c86fa2ee3caL, 0xf5cca64add20385aL,
75243       0x217f27573000e9acL, 0xc934db470e7273efL, 0x4294f4f7355b6776L,
75244       0x1faa36b96fc05180L, 0x8f88b1dbb052190bL, 0x35791b90e9eaef52L,
75245       0xf37fb2ebdb681b90L, 0x39d0a51d4415c369L, 0xfc59cca71d2e21c9L,
75246       0x64128cfea1f50c26L },
75247     { 0xf03678a2e8f5b0b5L, 0x5c7e249cd340f059L, 0x4144044193ca7cecL,
75248       0x075ca346bc83af98L, 0xf39f0033faa8bbb0L, 0x3d18f0edf38230f7L,
75249       0x78dff00cd448f345L, 0x849228c0d51aa475L, 0xdd4e270830c928d1L,
75250       0xc66ba6868f12cfd3L, 0x091049db88b3a206L, 0xd865d059016dae01L,
75251       0x4599e905e253e37dL, 0x322cf0c27ce9871bL, 0x014f54da174a132eL,
75252       0x93634a09bdabcbdaL },
75253     { 0x62826b27a9a2e304L, 0xc57e1866c1a4c124L, 0x913ab83222381710L,
75254       0x7e9b6b85a9847cfeL, 0x29655cf12b5f46fdL, 0x7295572b8038e66dL,
75255       0xe4cba6016fa95eabL, 0xbbc11071b9deda81L, 0x97f0009a3f1cf61eL,
75256       0x5372777b373e0cfbL, 0x302f909cd139d63bL, 0x1ed672da4f87d78eL,
75257       0x362077a3b4048763L, 0xc408c32d9dcc22b2L, 0x4b4c5bf226deeee7L,
75258       0x266cb467bc06357eL },
75259     { 0x6faa4154b56363e8L, 0x4b4fd0783c1aa4dbL, 0x14358dde2b9e6597L,
75260       0x5b34ae3efa004b84L, 0xcf44b2ecf19911a6L, 0x55caa833a536bf78L,
75261       0x606e1eb98870dc95L, 0xe3c3287d09f3511dL, 0x68b2f4eb9d5cf364L,
75262       0xc154e89263ab8c9eL, 0x1548828ec36ab611L, 0x0932bfcba1b7d120L,
75263       0x7ee7b5bc5315b8d7L, 0x782fd0d1f7473ac1L, 0xbcb029a83c8f2af3L,
75264       0x4b1d5a1b52454ee1L },
75265     { 0x12fe517463d52c0cL, 0x3735525e188c099dL, 0x5c621563360e3956L,
75266       0x88b3f1caacfa5a43L, 0x90123a0a797e8107L, 0xba31f6b5b15e080aL,
75267       0xd7de5e12fca3dadaL, 0x3287361b0df511c8L, 0x7cc800d465757d4eL,
75268       0x10810f3d5207ec91L, 0x0d4e56f130eea0e3L, 0xbbf7ee133ea5a2ecL,
75269       0x6fc07762be6abbd0L, 0xc831fdce120bf619L, 0xe07439fab622d42aL,
75270       0x8186b93f508e4b27L },
75271     { 0xc619d15409312867L, 0x7e042c05bfaf7db4L, 0xc1cf16681f5f5ddaL,
75272       0x50aa5057a4fc3d82L, 0xed30ed65ce68b8feL, 0xecb01c0bbeb4d644L,
75273       0x7b5dc444831c0497L, 0x351e6a009b7d9b1cL, 0x4bb863b9d9477c91L,
75274       0xaba6589105d4110aL, 0x30086cf443580b7aL, 0xb139c07690be357eL,
75275       0x12bfff1a27b5214eL, 0x79cfc6d722c3ab57L, 0x4743de57f34a9bfaL,
75276       0x0bf97e97c9ee2b2aL },
75277     { 0x96ec4ec8dda19e96L, 0x54ce18ea6c306e8bL, 0x7e83612b65f6918aL,
75278       0x1ac6f68b0d9a0d99L, 0x98a697a462fdcc09L, 0x65ce25f195bc3e13L,
75279       0x1896ecdab3939730L, 0x9eb81a0f32f12806L, 0xd3d7416e1d2dc7dfL,
75280       0xe22c7976ad473599L, 0x3de37a9a9f5ef439L, 0x6b7ac0ab9e69d94eL,
75281       0xe6bfa9e00a9d0bc8L, 0x576a870d5676f120L, 0x3bd91bb4feaac23fL,
75282       0x8fe5482c3e40aabbL },
75283     { 0x85ae67c2ce9a4d1eL, 0x4c3eb8034f1d2038L, 0x5c6c8f3a25d06192L,
75284       0x803de0ad308fb41cL, 0x9961f5bce71c294eL, 0xdc62078df02eb0daL,
75285       0xc87ef515b64ae8b6L, 0x69679f1e50b4d18fL, 0xc5c009a152199f43L,
75286       0xa7d484be0f640a5fL, 0x4c918bb123dab566L, 0xa67c114c64275d2cL,
75287       0x95a913b9cad2ded6L, 0x189ed18b6b4b5c8dL, 0x4aeb6206b42d3bf6L,
75288       0x3928c669bbc8bc3fL },
75289     { 0xde4bea4adacb4b64L, 0x03f62a44f26179a1L, 0xf3aac94e7a9112a4L,
75290       0x90448fbdd36f331eL, 0x426042bc407b85c4L, 0x5ad8a5962121b77bL,
75291       0x31674a4f67cee984L, 0x7fae8bbe4e3b2f0dL, 0x681df6dda7c930ebL,
75292       0xadeefa98c259d0d4L, 0x1b14d9e6bea1c1fdL, 0x3baadc8b21d405d1L,
75293       0xf01dff9373892754L, 0x81c35b3ef071cde4L, 0x1704d2e19150d0d9L,
75294       0x6ccc888f355134f6L },
75295     { 0xf8d36f0e7ad7504cL, 0xbca3265ff7959dddL, 0x0dcd1edefede67aaL,
75296       0x1276f4cebaebf32fL, 0x6825a6e6014edcfcL, 0x0b8c1a8299ad8eb7L,
75297       0x312024a909b8ce1eL, 0xcb8fd98b9cbd351aL, 0xa4841378fab1e8beL,
75298       0x17ed0f5d3973cacfL, 0xa17e1484259d5254L, 0x53d5b84374b91393L,
75299       0x8f792b211aca3ce9L, 0x035ff110c8c0f815L, 0x6afa6357ad4ed7bdL,
75300       0x2f151980b26faef9L },
75301     { 0x0c8631da29d2d439L, 0x121fbbc2bc039955L, 0x3e5a97926c05b75bL,
75302       0x6d6cf4c0b6ce47ecL, 0xbaaa17679d88c658L, 0x031db9e7f3355a17L,
75303       0x8381e3d80aef5a85L, 0xc71db29015a31bdfL, 0x638f6b749498fd7dL,
75304       0x44edf3f913beeef6L, 0xe6173271f4ab67b3L, 0x3a202c70fd22df11L,
75305       0xf7be0389205c4e92L, 0x1c219085a8eb9920L, 0x6c805ce8beb54aaaL,
75306       0x354b05b70ac58d65L },
75307     { 0x7171e2367a9170e9L, 0x01eec42d4cad50cdL, 0xffbe824f3cddccfbL,
75308       0xa73e8ce3a66cae1aL, 0xb7138a7f965c7d01L, 0x00058e3f5c3d971eL,
75309       0x52591ac32ff0a72bL, 0xa32fb5bcbbbce76fL, 0xf3241ab8a9f81a18L,
75310       0xf31d3332eca68630L, 0x847af9fc4482f13bL, 0x6196e217a4681be2L,
75311       0x9938f932e55efcf9L, 0x3e7dacb870acc705L, 0xd41be893cf09fac2L,
75312       0x48dc55c4ae3523a1L },
75313     { 0x8e623826a5092193L, 0xe46ec3626898970cL, 0x2f1356af25c9eb41L,
75314       0x4178064083c7d245L, 0x982def6797d00e38L, 0x382eb6e7a512151cL,
75315       0x154e10778af58869L, 0x187070758a51cf02L, 0xcdeba9f771313c58L,
75316       0x5d67b973ba155904L, 0x851c9f4b1d0d7b3aL, 0x19f29d718b8af2cdL,
75317       0xcb94ccff986b8d62L, 0x8725e24bb93b9c33L, 0x405ce4c566e38c68L,
75318       0x5f6a8edd0b6dc021L },
75319     { 0x83704ca58f9a8690L, 0x3f3697662f76a407L, 0xfbc12d8c69201028L,
75320       0x4cd58f16bce3a4cfL, 0x7804664a04aab26dL, 0x005cfbba4ea457a8L,
75321       0x537951b3b8a59794L, 0x4ca2b9e44fe1f739L, 0xe4428acddf325797L,
75322       0x648da3420ea243dbL, 0xcce6562bf43ce01eL, 0x840f0421f27db490L,
75323       0x156ccb708bfb7cf0L, 0x9b33480d5a8797d3L, 0x2e12e07a9eb814bbL,
75324       0x1ca65072ca7f87acL },
75325     { 0xfbb321cf2b9d25a0L, 0x66affdca40a746dbL, 0xc1c1530e59e368b5L,
75326       0x56ed1ea47d80068fL, 0x9b74d8fe5647dd68L, 0x1d96b50789b78da8L,
75327       0x39b752438bbe3391L, 0xef8d443e0d858c5fL, 0x4dd2db499646aa34L,
75328       0x7fad3bd1e667543cL, 0xd0d710c068980985L, 0x9f7aff3249facabaL,
75329       0x055dec1c14f9a192L, 0xaca663991fb307a1L, 0xac44fd9135ffff64L,
75330       0x462cafb6cbad3ceeL },
75331     { 0x1660a647de3237ddL, 0x95f735cc82b87404L, 0xf7879f59ddfa55f8L,
75332       0x15ef043e726b914aL, 0x1875393d1c93e298L, 0xa1a2be746ef18331L,
75333       0x4e7e8dfc25a9a12bL, 0xdfefc97da9c3917fL, 0xbc875d030a2ebe41L,
75334       0x0f75d235a732d1ccL, 0x06fee7fed9baa6d3L, 0xaa784fab65f48576L,
75335       0x23155e22513f83c0L, 0xd2fb77183e8f9d13L, 0x2a291503b546eafdL,
75336       0x1293c98c6cd93608L },
75337     { 0x7278125149d53b77L, 0xa6ab403d96eafac7L, 0xb7d7c7db4a36b711L,
75338       0x8238c70887e771c1L, 0x495f6abf33b37522L, 0xb0b0289c8c87530dL,
75339       0xca83cb86e77b111aL, 0xbe1c0fb8a1bd189eL, 0x58cfb2fb1ae9d7c7L,
75340       0xd05c23c54940c3e8L, 0x16e79e4174ad9107L, 0xa0a47f05064e7142L,
75341       0xc6929cd4fdfd614fL, 0xedb2584c3946988bL, 0x73e4b5f3e46f8fb1L,
75342       0x53b79aa168ea94baL },
75343     { 0x216fafce44bbb6a1L, 0xd3a5bba067821728L, 0xef1e4b30a9dd939aL,
75344       0x022eaf3df19efafeL, 0xfed5abce7b4ec014L, 0x64968ee6512c6738L,
75345       0x2311986929fe89a2L, 0x0d539d8d47397c05L, 0x6400bc54234596c4L,
75346       0xb9287f585346611dL, 0x04099903c9d5da0fL, 0xe5ef4997c83af2a8L,
75347       0xc89dc01b328151e1L, 0x150fb4a958401104L, 0x40a6f7d5f3872c9dL,
75348       0x8290d6d156c2e833L },
75349     { 0xf84637c6d8546946L, 0xda134a3969ec57faL, 0xd42359a4d789007eL,
75350       0xb42557fe0dc7b809L, 0xe62ae52d2d6784a9L, 0xa2714ca60bcadb5fL,
75351       0xcc208de633aafca5L, 0x2380ed5ced967811L, 0x6e6b55e9db321660L,
75352       0x1bead02ca675235aL, 0x51cc6ef9b33fa0e1L, 0xfd223e26f06a2a08L,
75353       0x00f332e1ec47b3cfL, 0x459f297ba0aa984eL, 0x6fa1d969ee952e14L,
75354       0x506ef1ab304fabb0L },
75355     { 0x11b4eb2735bff163L, 0x7130b96fea9fa984L, 0x66aceb3f9deb27ceL,
75356       0xa2daf1a59dd1c3d5L, 0xf5090a7ea73075aaL, 0x36a6af39e3071b58L,
75357       0xa28d633ddf73ad9cL, 0xdd354cacbdc89a16L, 0xdfea3423d4dcbc3cL,
75358       0x6eec74d2379d92d1L, 0xe14a456f8eed6765L, 0xfabe7743fa8feb1fL,
75359       0x1404ccf8b98fcbc7L, 0x6ccd2fbff71a706eL, 0xdaaf3fdb4d85c678L,
75360       0x415b7dbf15200344L },
75361     { 0x970105867d8377a7L, 0x068a3d68cb803272L, 0xfd67d289f03a4c32L,
75362       0x4bc7095d93c8f290L, 0x712fa13ce9e5a2b8L, 0xfc6ac6c60feb9f3bL,
75363       0x0cda36d96e0e54c2L, 0x4549975186320a01L, 0xf9318c9197f00f11L,
75364       0x01dc4c3fe6936508L, 0x769a2ef985f068aaL, 0x3522cef0a2b5511cL,
75365       0x006965edb4122e05L, 0xfce0fafcc175d43fL, 0x525dc9bdec831d59L,
75366       0x1ec314f1af58879dL },
75367     { 0x0663feef2c8310c2L, 0xaa7e14da457e3f74L, 0x392b10fce5346887L,
75368       0xcde4a38f637ec2c5L, 0x50773320b542f8dfL, 0x341302f9f7de1711L,
75369       0x018b1c63ae4b9bc6L, 0xf001c46edd2f9e6fL, 0xd3bb0a9726eccfa0L,
75370       0xa931b99d7746e0c7L, 0xe0c8b6f7f5875aecL, 0xbb32f17c96939c82L,
75371       0x765135d23de5a664L, 0x71936cb452abfa6bL, 0xad5cc08f2dc105deL,
75372       0x17e91d127fff5788L },
75373     { 0xbe92ced3b7e051caL, 0xc644d4fd19c776d4L, 0xc8ab4b520086784bL,
75374       0x3ea66227ce9d6b31L, 0x395249a3d289e9c7L, 0x54509e65d12a19eeL,
75375       0xa7bd46928c365aecL, 0x354997e477963e0eL, 0x0d765957b599732dL,
75376       0x99584aeb91d4a3b6L, 0x6e653ea41deb3e28L, 0xca7c98ed572571dfL,
75377       0xf301a38fb18ae1f9L, 0x1629f7c263f7b97eL, 0xdf242282afc4a0d5L,
75378       0x118f3b4b3ddd0c01L },
75379     { 0x74a0a0a87ad4762bL, 0x1aef84da8c58d175L, 0x16ff49604cf76d86L,
75380       0xc0be87867e60d98bL, 0x83637ffb3ecc1dbaL, 0xc244a6095dd6147aL,
75381       0xa3e178345b0846e5L, 0x735eb686e77a4c05L, 0x5bc18b4fdf758695L,
75382       0x15618d0b1bdfe52fL, 0x878ecc0d00715ba1L, 0x1dbdbd1ac2dd617fL,
75383       0x21d2b63121b61710L, 0x22ce8a7944f593c2L, 0x3b9b536a44f17024L,
75384       0x01d0a67c8d03e727L },
75385     { 0x7b9642361e46533cL, 0xe9477990fb88c2aeL, 0x019b5d16a42c4a18L,
75386       0x7135e81dd83c7a45L, 0x74a69bdd4cb663e3L, 0x7b67ecdbe76c0d63L,
75387       0x03d5452111e68da6L, 0x596cceb5d2e8650aL, 0xcd572dfd2af03b37L,
75388       0x52364ba1fabd5952L, 0x7f47d456b4ed8569L, 0x5ad8b572c950d5d4L,
75389       0xcadd2dfa486e2f84L, 0xdd527b43c56bb044L, 0xc9adba24997c08e6L,
75390       0x1b625b067da6320fL },
75391     { 0x44dfaa7b4fd8446dL, 0xc01b2f01af6febebL, 0xbf444388fe8838b5L,
75392       0xf33c434fbba9758bL, 0x2b971cba87156bc9L, 0x6b245e5c1f49098bL,
75393       0x87dcb5342b41c5ddL, 0xdb1f80c634d852d7L, 0x6d6e32582433da34L,
75394       0xf66820653f7df0c2L, 0xc4ca567c360cb365L, 0x321faac29826656aL,
75395       0x13f5ca6fbf069768L, 0x15397921a7076639L, 0xbdf143288400736eL,
75396       0x333eca9619fc948dL },
75397     { 0x23337948ac775d81L, 0x38c2518fd41dbbcaL, 0x623c7a4fbcfce948L,
75398       0xaad3623654703fe7L, 0x2b3a13a413fb3b5bL, 0x5db3565a7f5c01f0L,
75399       0xd72408dc52359661L, 0x5a17f8e51d616e91L, 0x90c16eebcb25b999L,
75400       0xf35e8cf13393743eL, 0x987da74ae54b64a7L, 0x557b322a65cd449dL,
75401       0x765082a537e7b15dL, 0x4d25c742f2cd134fL, 0xae9d9c074ccf0746L,
75402       0x72fc21108728d135L },
75403     { 0xa906b203f96004c8L, 0xd83f95cf458055ffL, 0xd77d586755f35909L,
75404       0x4a9ea6fbe550c8eeL, 0x91c8cca955a06081L, 0x4a1fee78bce82062L,
75405       0xeb9ade069a3df85eL, 0xfbbdcf0c7d3de666L, 0x228a391b5d336d51L,
75406       0x760f8d285c2ffc3cL, 0x1ee48de32f7b165bL, 0x03803d8456177040L,
75407       0xe573f6489deff9a0L, 0xe1a2738ea17e35a4L, 0x238ef17c8840a6c6L,
75408       0x480946f8b11ed92dL },
75409     { 0x84c747a8fd71f119L, 0x19e65c5e53eb3695L, 0x0e2f67866298587aL,
75410       0x48a48899ab18d6f4L, 0xa1a99024c630b8c0L, 0x849750962caaf892L,
75411       0xc8869abae20fd624L, 0x3b72b04d6c2b7dd4L, 0xe2775eb60992f7d0L,
75412       0x0089c06e7d06e684L, 0xcb3b4361e4bbd007L, 0xa1ae666b4ba846e4L,
75413       0xc01c2eb246464d9eL, 0xf86f2be6c1f8539fL, 0x16e8e8aecf68afc7L,
75414       0x8dab61fdc7386902L },
75415     { 0x42a5c903d54d1d45L, 0xacd4297eff4f9ba2L, 0x2d88b52034d478b4L,
75416       0x35b2ba2b08c4621aL, 0xd3d239bb34865402L, 0x1de76aed911f32e6L,
75417       0x877f8bcf3f06fdc2L, 0x802714c19ec51502L, 0xa10444eba590700dL,
75418       0x8694229f31dcc957L, 0x5ece77abb8169fedL, 0x55be8a152caf080eL,
75419       0x3eb21b14cbd7cef1L, 0x9def7ad167b97ee1L, 0xe03ca879118f690cL,
75420       0x6f77e62df99b29e7L },
75421     { 0xa271bdede40bbf59L, 0x177ba4536401aad6L, 0x1755e03573541cd1L,
75422       0x3465b4664b71b02fL, 0x22eb7113a813359fL, 0x9792a8fd6f38eac7L,
75423       0x11aa012fff3bf3b5L, 0x99aafabff85c3fbfL, 0x91e0a2ef06c0cc42L,
75424       0x314d5d57773b7b3aL, 0xae5e2e76d669840aL, 0x861360732e5a8be6L,
75425       0xee6d7578c1cf5580L, 0x2344e00f68bed102L, 0x799d78868184f0ebL,
75426       0x63819c91c3d2cf80L },
75427     { 0xca5392e17884b073L, 0x9ec3a1fceb1267eaL, 0x3d07f5f0907038a7L,
75428       0xcb2ac07ce4c47b70L, 0xf96664ee1bf96b91L, 0xebf575892aea4fbfL,
75429       0x5aabf391fade6500L, 0xc5b3376f171d1204L, 0x1ff60c51a0d3d81aL,
75430       0x10b2cfe7976a844bL, 0xe131cc9abda6125aL, 0xe0fc16d34ebd453eL,
75431       0xc0d0319a504b6bc1L, 0xe43a0be70a2f8cabL, 0xc80afeec55e49b47L,
75432       0x67d48d128265d7eeL },
75433     { 0x068d59a7ea2d56d6L, 0xd71abd0e27480a63L, 0x6bd11db0ae7366cdL,
75434       0xfbb639ca07204ebcL, 0x89a242e7f77e6293L, 0xdee7ca2b75ba8c3dL,
75435       0x472ddc3d64a2f9a8L, 0x84229df47561a010L, 0x95f62c85c5b649d4L,
75436       0xfdd56b1b4dc927cdL, 0xfe8bb1205ee60596L, 0x3efcaa50abf29401L,
75437       0xd4900d0f10d1c184L, 0x2cf113a928b01df5L, 0xa3d7ebc31f0e43f5L,
75438       0x27950e38e8384dc7L },
75439     { 0xeab21ff0e1d0fa79L, 0x4b9fd033048b5de9L, 0x4c9346892fe374cbL,
75440       0xbb4827fa4eb21f6bL, 0x46716f79a925e7e7L, 0x1442bf367dd4c531L,
75441       0x2073954cd2e96ddfL, 0x4e0141ae8502aa89L, 0x8ee00e1a8eef6cc9L,
75442       0x55ce84915880cdafL, 0xff3aba5c69628046L, 0x335cc4f85d15dfbfL,
75443       0xa7f0440c9f684f25L, 0xae80453fbb1e5bd8L, 0xa1c99813ff2225abL,
75444       0x54ff788479b25d71L },
75445     { 0x27c6ee30de40b068L, 0x9226465be6f3a51eL, 0xe24a4604fa3b21f6L,
75446       0x50a5a5adc0418115L, 0xe32854418df90d2bL, 0xbb74e58fdcb0c00fL,
75447       0xc68f1b3b4a2c08e3L, 0x339df0810ccd9ec9L, 0x915362dcb786ea9fL,
75448       0x28945e31c955aeadL, 0xd6a2c01d8b6a6c6bL, 0x069e82dc3678a427L,
75449       0x1787550028c9302cL, 0x8acda9659fa101e6L, 0x4e4e4573ee30b286L,
75450       0x8adbad853f1830feL },
75451     { 0x060ae11f0969d524L, 0xf42fdaf7f39bcc79L, 0x3cec67667cc1fcc2L,
75452       0x456b9cf2e2336d4fL, 0x6aa1f5de8e1c0f7fL, 0xcdbc2ad20984fb0eL,
75453       0x4090cfa61b464b28L, 0x40d86f301243f3efL, 0x95b16ccccd5e87e7L,
75454       0x403f168c3026cd41L, 0xdbe386cb816c0730L, 0x14eb86f358407a1dL,
75455       0xf588b4f81717e1afL, 0xb75c41a666cbc96cL, 0xf342c1aa027e71c1L,
75456       0x73930036c0945e5fL },
75457     { 0x954f757d22cdaf42L, 0x788b591df4181aabL, 0x8b986819f5514f25L,
75458       0x69642e08f18fd5bcL, 0x92b305d1022ceb91L, 0x1715903e6a4f6985L,
75459       0x4bd7d69d61179caeL, 0xdacdfd5dd29c01aaL, 0x705ddd5ad91108ccL,
75460       0x434ac7b164ac8f15L, 0x61a514e1b524632fL, 0x45b9e61b731fc447L,
75461       0xcf561348e0961b31L, 0x9c28a96773eaf223L, 0x5bd10182aa7c99d3L,
75462       0x8bc6ec4ae42965e2L },
75463     { 0xd096e5c0e7f2a32bL, 0xff54800c09388a30L, 0x06fe437c401e360cL,
75464       0x6655fc9cbb6054a6L, 0x510e18608457aa6eL, 0xa0acfca22b29b2b7L,
75465       0x732483e351b7da61L, 0xe31471ee6be6c8caL, 0xe565431c8b65c9a1L,
75466       0xfc9ac3b948d65cbbL, 0xd308fc21ae9b2aa8L, 0xd6a7df0daa60aa6aL,
75467       0x2844d96a982fc0d4L, 0xab012c2c5847a4d7L, 0x2b3c8f71dceb8955L,
75468       0x8e85437dbe9c7e15L },
75469 };
75470 
75471 /* Perform the modular exponentiation in Fp* for SAKKE.
75472  *
75473  * Base is fixed to be the g parameter - a precomputed table is used.
75474  *
75475  * Striping: 128 points at a distance of 8 combined.
75476  * Total of 256 points in table.
75477  * Square and multiply performed in Fp*.
75478  *
75479  * base  [in]   Base. MP integer.
75480  * exp   [in]   Exponent. MP integer.
75481  * res   [out]  Result. MP integer.
75482  * returns 0 on success, MP_READ_E if there are too many bytes in an array
75483  * and MEMORY_E if memory allocation fails.
75484  */
sp_ModExp_Fp_star_1024(const mp_int * base,mp_int * exp,mp_int * res)75485 int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
75486 {
75487 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
75488     !defined(WOLFSSL_SP_NO_MALLOC)
75489     sp_digit* td;
75490     sp_digit* t;
75491     sp_digit* tx;
75492     sp_digit* ty;
75493 #else
75494     sp_digit t[4 * 2 * 16];
75495     sp_digit tx[2 * 16];
75496     sp_digit ty[2 * 16];
75497 #endif
75498     sp_digit* r = NULL;
75499     unsigned char e[128];
75500     int err = MP_OKAY;
75501     int i;
75502     int y;
75503 
75504     (void)base;
75505 
75506 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
75507     !defined(WOLFSSL_SP_NO_MALLOC)
75508     td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 16 * 2, NULL,
75509                             DYNAMIC_TYPE_TMP_BUFFER);
75510     if (td == NULL) {
75511         err = MEMORY_E;
75512     }
75513 #endif
75514 
75515     if (err == MP_OKAY) {
75516 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
75517     !defined(WOLFSSL_SP_NO_MALLOC)
75518         t  = td;
75519         tx = td + 4 * 16 * 2;
75520         ty = td + 5 * 16 * 2;
75521 #endif
75522         r = ty;
75523 
75524         (void)mp_to_unsigned_bin_len(exp, e, 128);
75525 
75526         XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 16);
75527         y  =  e[112] >> 7;
75528         y |= (e[96] >> 7) << 1;
75529         y |= (e[80] >> 7) << 2;
75530         y |= (e[64] >> 7) << 3;
75531         y |= (e[48] >> 7) << 4;
75532         y |= (e[32] >> 7) << 5;
75533         y |= (e[16] >> 7) << 6;
75534         y |= (e[0] >> 7) << 7;
75535         XMEMCPY(ty, sp_1024_g_table[y], sizeof(sp_digit) * 16);
75536         for (i = 126; i >= 0; i--) {
75537             y  =  (e[127 - (i / 8)] >> (i & 0x7)) & 1;
75538             y |= ((e[111 - (i / 8)] >> (i & 0x7)) & 1) << 1;
75539             y |= ((e[95 - (i / 8)] >> (i & 0x7)) & 1) << 2;
75540             y |= ((e[79 - (i / 8)] >> (i & 0x7)) & 1) << 3;
75541             y |= ((e[63 - (i / 8)] >> (i & 0x7)) & 1) << 4;
75542             y |= ((e[47 - (i / 8)] >> (i & 0x7)) & 1) << 5;
75543             y |= ((e[31 - (i / 8)] >> (i & 0x7)) & 1) << 6;
75544             y |= ((e[15 - (i / 8)] >> (i & 0x7)) & 1) << 7;
75545 
75546             sp_1024_proj_sqr_16(tx, ty, t);
75547             sp_1024_proj_mul_qx1_16(tx, ty, sp_1024_g_table[y], t);
75548         }
75549     }
75550 
75551     if (err == MP_OKAY) {
75552         sp_1024_mont_inv_16(tx, tx, t);
75553         sp_1024_mont_mul_16(r, tx, ty, p1024_mod, p1024_mp_mod);
75554         XMEMSET(r + 16, 0, sizeof(sp_digit) * 16);
75555         sp_1024_mont_reduce_16(r, p1024_mod, p1024_mp_mod);
75556 
75557         err = sp_1024_to_mp(r, res);
75558     }
75559 
75560 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
75561     !defined(WOLFSSL_SP_NO_MALLOC)
75562     if (td != NULL) {
75563         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
75564     }
75565 #endif
75566     return err;
75567 }
75568 
75569 #endif /* WOLFSSL_SP_SMALL */
75570 /* Multiply p* by q* in projective co-ordinates.
75571  *
75572  *   p.x' = (p.x * q.x) - (p.y * q.y)
75573  *   p.y' = (p.x * q.y) + (p.y * q.x)
75574  * But applying Karatsuba:
75575  *   v0 = p.x * q.x
75576  *   v1 = p.y * q.y
75577  *   p.x' = v0 - v1
75578  *   p.y' = (px + py) * (qx + qy) - v0 - v1
75579  *
75580  * px  [in,out]  A single precision integer - X ordinate of number to multiply.
75581  * py  [in,out]  A single precision integer - Y ordinate of number to multiply.
75582  * qx  [in]      A single precision integer - X ordinate of number of
75583  *               multiplier.
75584  * qy  [in]      A single precision integer - Y ordinate of number of
75585  *               multiplier.
75586  * t   [in]      Two single precision integers - temps.
75587  */
sp_1024_proj_mul_16(sp_digit * px,sp_digit * py,const sp_digit * qx,const sp_digit * qy,sp_digit * t)75588 static void sp_1024_proj_mul_16(sp_digit* px, sp_digit* py,
75589         const sp_digit* qx, const sp_digit* qy, sp_digit* t)
75590 {
75591     sp_digit* t1 = t;
75592     sp_digit* t2 = t + 2 * 16;
75593 
75594     /* t1 = px + py */
75595     sp_1024_mont_add_16(t1, px, py, p1024_mod);
75596     /* t2 = qx + qy */
75597     sp_1024_mont_add_16(t2, qx, qy, p1024_mod);
75598     /* t2 = (px + py) * (qx + qy) */
75599     sp_1024_mont_mul_16(t2, t1, t2, p1024_mod, p1024_mp_mod);
75600     /* t1 = py * qy */
75601     sp_1024_mont_mul_16(t1, py, qy, p1024_mod, p1024_mp_mod);
75602     /* t2 = (px + py) * (qx + qy) - (py * qy) */
75603     sp_1024_mont_sub_16(t2, t2, t1, p1024_mod);
75604     /* px = px * qx */
75605     sp_1024_mont_mul_16(px, px, qx, p1024_mod, p1024_mp_mod);
75606     /* py = (px + py) * (qx + qy) - (py * qy) - (px * qx) */
75607     sp_1024_mont_sub_16(py, t2, px, p1024_mod);
75608     /* px = (px * qx) - (py * qy)*/
75609     sp_1024_mont_sub_16(px, px, t1, p1024_mod);
75610 }
75611 
75612 #ifndef WOLFSSL_SP_SMALL
75613 /*
75614  * Convert point from projective to affine but keep in Montgomery form.
75615  *
75616  * p  [in,out]  Point to convert.
75617  * t  [in]      Temporary numbers: 2.
75618  */
sp_1024_mont_map_16(sp_point_1024 * p,sp_digit * t)75619 static void sp_1024_mont_map_16(sp_point_1024* p, sp_digit* t)
75620 {
75621     sp_digit* t1 = t;
75622     sp_digit* t2 = t + 2 * 16;
75623 
75624     sp_1024_mont_inv_16(t1, p->z, t2);
75625     sp_1024_mont_sqr_16(t2, t1, p1024_mod, p1024_mp_mod);
75626     sp_1024_mont_mul_16(t1, t2, t1, p1024_mod, p1024_mp_mod);
75627     sp_1024_mont_mul_16(p->x, p->x, t2, p1024_mod, p1024_mp_mod);
75628     sp_1024_mont_mul_16(p->y, p->y, t1, p1024_mod, p1024_mp_mod);
75629     XMEMCPY(p->z, p1024_norm_mod, sizeof(sp_digit) * 16);
75630 }
75631 
75632 #endif /* WOLFSSL_SP_SMALL */
75633 /*
75634  * Calculate gradient of line through P, P and [-2]P, accumulate line and
75635  * double P.
75636  *
75637  * Calculations:
75638  *   l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
75639  *   r.x = l * (p.x + q.x * p.z^2) - 2 * p.y^2
75640  *   r.y = 2 * p.y * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
75641  *   v* = v*^2 * r*
75642  *   p'.x = l^2 - 8 * p.y^2 * p.x
75643  *   p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4
75644  *   p'.z = 2 * p.y * p.z
75645  *
75646  * @param  [in,out]  vx  X-ordinate of projective value in F*.
75647  * @param  [in,out]  vy  Y-ordinate of projective value in F*.
75648  * @param  [in,out]  p   ECC point - point on E(F_p^2) to double.
75649  * @param  [in]      q   ECC point - second point on E(F_P^2).
75650  * @param  [in]      t   SP temporaries (6 used).
75651  */
sp_1024_accumulate_line_dbl_16(sp_digit * vx,sp_digit * vy,sp_point_1024 * p,const sp_point_1024 * q,sp_digit * t)75652 static void sp_1024_accumulate_line_dbl_16(sp_digit* vx, sp_digit* vy,
75653         sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
75654 {
75655     sp_digit* t1  = t +  0 * 16;
75656     sp_digit* pz2 = t +  2 * 16;
75657     sp_digit* rx  = t +  4 * 16;
75658     sp_digit* ry  = t +  6 * 16;
75659     sp_digit* l   = t +  8 * 16;
75660     sp_digit* ty  = t + 10 * 16;
75661 
75662     /* v = v^2 */
75663     sp_1024_proj_sqr_16(vx, vy, t);
75664     /* pz2 = p.z^2 */
75665     sp_1024_mont_sqr_16(pz2, p->z, p1024_mod, p1024_mp_mod);
75666     /* t1 = p.x + p.z^2 */
75667     sp_1024_mont_add_16(ty, p->x, pz2, p1024_mod);
75668     /* l = p.x - p.z^2 */
75669     sp_1024_mont_sub_16(l, p->x, pz2, p1024_mod);
75670     /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
75671     sp_1024_mont_mul_16(t1, l, ty, p1024_mod, p1024_mp_mod);
75672     /* l = 3 * (p.x^2 - p.z^4) */
75673     sp_1024_mont_tpl_16(l, t1, p1024_mod);
75674     /* t1 = q.x * p.z^2 */
75675     sp_1024_mont_mul_16(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
75676     /* t1 = p.x + q.x * p.z^2 */
75677     sp_1024_mont_add_16(t1, p->x, t1, p1024_mod);
75678     /* r.x = l * (p.x + q.x * p.z^2) */
75679     sp_1024_mont_mul_16(rx, l, t1, p1024_mod, p1024_mp_mod);
75680     /* r.y = 2 * p.y */
75681     sp_1024_mont_dbl_16(ry, p->y, p1024_mod);
75682     /* ty = 4 * p.y ^ 2 */
75683     sp_1024_mont_sqr_16(ty, ry, p1024_mod, p1024_mp_mod);
75684     /* t1 = 2 * p.y ^ 2 */
75685     sp_1024_div2_16(t1, ty, p1024_mod);
75686     /* r.x -= 2 * (p.y ^ 2) */
75687     sp_1024_mont_sub_16(rx, rx, t1, p1024_mod);
75688     /* p'.z = p.y * 2 * p.z */
75689     sp_1024_mont_mul_16(p->z, p->z, ry, p1024_mod, p1024_mp_mod);
75690     /* r.y = p'.z * p.z^2 */
75691     sp_1024_mont_mul_16(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
75692     /* r.y = p'.z * p.z^2 * q.y */
75693     sp_1024_mont_mul_16(ry, t1, q->y, p1024_mod, p1024_mp_mod);
75694     /* v = v^2 * r */
75695     sp_1024_proj_mul_16(vx, vy, rx, ry, t);
75696 
75697     /* Double point using previously calculated values
75698      *   l = 3 * (p.x - p.z^2).(p.x + p.z^2)
75699      *   ty = 4 * p.y^2
75700      *   p'.z = 2 * p.y * p.z
75701      */
75702     /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */
75703     sp_1024_mont_sqr_16(t1, ty, p1024_mod, p1024_mp_mod);
75704     /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */
75705     sp_1024_div2_16(t1, t1, p1024_mod);
75706     /* p'.y = 4 * p.y^2 * p.x */
75707     sp_1024_mont_mul_16(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
75708     /* p'.x = l^2 */
75709     sp_1024_mont_sqr_16(p->x, l, p1024_mod, p1024_mp_mod);
75710     /* p'.x = l^2 - 4 * p.y^2 * p.x */
75711     sp_1024_mont_sub_16(p->x, p->x, p->y, p1024_mod);
75712     /* p'.x = l^2 - 8 * p.y^2 * p.x */
75713     sp_1024_mont_sub_16(p->x, p->x, p->y, p1024_mod);
75714     /* p'.y = 4 * p.y^2 * p.x - p.x' */
75715     sp_1024_mont_sub_16(ty, p->y, p->x, p1024_mod);
75716     /* p'.y = (4 * p.y^2 * p.x - p'.x) * l */
75717     sp_1024_mont_mul_16(p->y, ty, l, p1024_mod, p1024_mp_mod);
75718     /* p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4 */
75719     sp_1024_mont_sub_16(p->y, p->y, t1, p1024_mod);
75720 }
75721 
75722 #ifdef WOLFSSL_SP_SMALL
75723 /*
75724  * Calculate gradient of line through C, P and -C-P, accumulate line and
75725  * add P to C.
75726  *
75727  * Calculations:
75728  *   r.x = (q.x + p.x) * c.y - (q.x * c.z^2 + c.x) * p.y * c.z
75729  *   r.y = (c.x - p.x * c.z^2) * q.y * c.z
75730  *   v* = v* * r*
75731  *   r = p.y * c.z^3 - c.y
75732  *   c'.x = r^2 + h^3 - 2 * c.x * h^2
75733  *   c'.y = r * (c'.x - c.x * h^2) - c.y * h^3
75734  *   c'.z = (c.x - p.x * c.z^2) * c.z
75735  *
75736  * @param  [in,out]  vx     X-ordinate of projective value in F*.
75737  * @param  [in,out]  vy     Y-ordinate of projective value in F*.
75738  * @param  [in,out]  c      ECC point - current point on E(F_p^2) to be added
75739  *                          to.
75740  * @param  [in]      p      ECC point - point on E(F_p^2) to add.
75741  * @param  [in]      q      ECC point - second point on E(F_P^2).
75742  * @param  [in]      qx_px  SP that is a constant value across adds.
75743  * @param  [in]      t      SP temporaries (6 used).
75744  */
sp_1024_accumulate_line_add_one_16(sp_digit * vx,sp_digit * vy,sp_point_1024 * c,sp_point_1024 * p,sp_point_1024 * q,sp_digit * qx_px,sp_digit * t)75745 static void sp_1024_accumulate_line_add_one_16(sp_digit* vx, sp_digit* vy,
75746         sp_point_1024* c, sp_point_1024* p, sp_point_1024* q, sp_digit* qx_px,
75747         sp_digit* t)
75748 {
75749     sp_digit* t1  = t;
75750     sp_digit* t2  = t +  2 * 16;
75751     sp_digit* rx  = t +  4 * 16;
75752     sp_digit* ry  = t +  6 * 16;
75753     sp_digit* h   = t +  8 * 16;
75754     sp_digit* r   = t + 10 * 16;
75755 
75756     /* r.x = (q.x + p.x) * c.y */
75757     sp_1024_mont_mul_16(rx, qx_px, c->y, p1024_mod, p1024_mp_mod);
75758     /* t2 = c.z^2 */
75759     sp_1024_mont_sqr_16(t2, c->z, p1024_mod, p1024_mp_mod);
75760     /* t1 = q.x * c.z^2 */
75761     sp_1024_mont_mul_16(t1, q->x, t2, p1024_mod, p1024_mp_mod);
75762     /* t1 = q.x * c.z^2 + c.x */
75763     sp_1024_mont_add_16(h, t1, c->x, p1024_mod);
75764     /* r = p.y * c.z */
75765     sp_1024_mont_mul_16(ry, p->y, c->z, p1024_mod, p1024_mp_mod);
75766     /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
75767     sp_1024_mont_mul_16(t1, h, ry, p1024_mod, p1024_mp_mod);
75768     /* r = p.y * c.z * c.z^2 = p.y * c.z^3  */
75769     sp_1024_mont_mul_16(r, ry, t2, p1024_mod, p1024_mp_mod);
75770     /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
75771     sp_1024_mont_sub_16(rx, rx, t1, p1024_mod);
75772     /* t1 = p.x * c.z^2 */
75773     sp_1024_mont_mul_16(t1, p->x, t2, p1024_mod, p1024_mp_mod);
75774     /* h = c.x - p.x * c.z^2 */
75775     sp_1024_mont_sub_16(h, c->x, t1, p1024_mod);
75776     /* c'.z = (c.x - p.x * c.z^2) * c.z */
75777     sp_1024_mont_mul_16(c->z, h, c->z, p1024_mod, p1024_mp_mod);
75778     /* r.y = (c.x - p.x * c.z^2) * c.z * q.y */
75779     sp_1024_mont_mul_16(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
75780     /* v = v * r */
75781     sp_1024_proj_mul_16(vx, vy, rx, ry, t);
75782 
75783     /* Add p to c using previously calculated values.
75784      *   h = c.x - p.x * c.z^2
75785      *   r = p.y * c.z^3
75786      *   c'.z = (c.x - p.x * c.z^2) * c.z
75787      */
75788 
75789     /* r = p.y * c.z^3 - c.y */
75790     sp_1024_mont_sub_16(r, r, c->y, p1024_mod);
75791     /* t1 = r^2 */
75792     sp_1024_mont_sqr_16(t1, r, p1024_mod, p1024_mp_mod);
75793     /* t2 = h^2 */
75794     sp_1024_mont_sqr_16(rx, h, p1024_mod, p1024_mp_mod);
75795     /* ry = c.x * h^2 */
75796     sp_1024_mont_mul_16(ry, c->x, rx, p1024_mod, p1024_mp_mod);
75797     /* t2 = h^3 */
75798     sp_1024_mont_mul_16(t2, rx, h, p1024_mod, p1024_mp_mod);
75799     /* c->x = r^2 + h^3 */
75800     sp_1024_mont_add_16(c->x, t1, t2, p1024_mod);
75801     /* t1 = 2 * c.x * h^2 */
75802     sp_1024_mont_dbl_16(t1, ry, p1024_mod);
75803     /* c'.x = r^2 + h^3 - 2 * c.x * h^2 */
75804     sp_1024_mont_sub_16(c->x, c->x, t1, p1024_mod);
75805     /* ry = c'.x - c.x * h^2 */
75806     sp_1024_mont_sub_16(t1, c->x, ry, p1024_mod);
75807     /* ry = r * (c'.x - c.x * h^2) */
75808     sp_1024_mont_mul_16(ry, t1, r, p1024_mod, p1024_mp_mod);
75809     /* t2 = c.y * h^3 */
75810     sp_1024_mont_mul_16(t1, t2, c->y, p1024_mod, p1024_mp_mod);
75811     /* c'.y = r * (c'.x - c.x * h^2) - c.y * h^3 */
75812     sp_1024_mont_sub_16(c->y, ry, t1, p1024_mod);
75813 }
75814 
75815 /*
75816  * Calculate r = pairing <P, Q>.
75817  *
75818  * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
75819  *
75820  * @param  [in]  key  SAKKE key.
75821  * @param  [in]  p    First point on E(F_p)[q].
75822  * @param  [in]  q    Second point on E(F_p)[q].
75823  * @param  [in]  r    Result of calculation.
75824  * @return  0 on success.
75825  * @return  MEMORY_E when dynamic memory allocation fails.
75826  * @return  Other -ve value on internal failure.
75827  */
sp_Pairing_1024(const ecc_point * pm,const ecc_point * qm,mp_int * res)75828 int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
75829 {
75830     int err = MP_OKAY;
75831 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
75832     !defined(WOLFSSL_SP_NO_MALLOC)
75833     sp_digit* td = NULL;
75834     sp_digit* t;
75835     sp_digit* vx;
75836     sp_digit* vy;
75837     sp_digit* qx_px;
75838 #else
75839     sp_digit t[6 * 2 * 16];
75840     sp_digit vx[2 * 16];
75841     sp_digit vy[2 * 16];
75842     sp_digit qx_px[2 * 16];
75843     sp_point_1024 pd;
75844     sp_point_1024 qd;
75845     sp_point_1024 cd;
75846 #endif
75847     sp_point_1024* p = NULL;
75848     sp_point_1024* q = NULL;
75849     sp_point_1024* c = NULL;
75850     sp_digit* r = NULL;
75851     int i;
75852 
75853     err = sp_1024_point_new_16(NULL, pd, p);
75854     if (err == MP_OKAY) {
75855         err = sp_1024_point_new_16(NULL, qd, q);
75856     }
75857     if (err == MP_OKAY) {
75858         err = sp_1024_point_new_16(NULL, cd, c);
75859     }
75860 
75861 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
75862     !defined(WOLFSSL_SP_NO_MALLOC)
75863     if (err == MP_OKAY) {
75864         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 9 * 16 * 2, NULL,
75865                                 DYNAMIC_TYPE_TMP_BUFFER);
75866         if (td == NULL) {
75867             err = MEMORY_E;
75868         }
75869     }
75870 #endif
75871 
75872     if (err == MP_OKAY) {
75873 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
75874     !defined(WOLFSSL_SP_NO_MALLOC)
75875         t     = td;
75876         vx    = td + 6 * 16 * 2;
75877         vy    = td + 7 * 16 * 2;
75878         qx_px = td + 8 * 16 * 2;
75879 #endif
75880         r = vy;
75881 
75882         sp_1024_point_from_ecc_point_16(p, pm);
75883         sp_1024_point_from_ecc_point_16(q, qm);
75884 
75885         err = sp_1024_mod_mul_norm_16(p->x, p->x, p1024_mod);
75886     }
75887     if (err == MP_OKAY) {
75888         err = sp_1024_mod_mul_norm_16(p->y, p->y, p1024_mod);
75889     }
75890     if (err == MP_OKAY) {
75891         err = sp_1024_mod_mul_norm_16(p->z, p->z, p1024_mod);
75892     }
75893     if (err == MP_OKAY) {
75894         err = sp_1024_mod_mul_norm_16(q->x, q->x, p1024_mod);
75895     }
75896     if (err == MP_OKAY) {
75897         err = sp_1024_mod_mul_norm_16(q->y, q->y, p1024_mod);
75898     }
75899     if (err == MP_OKAY) {
75900         XMEMCPY(c, p, sizeof(sp_point_1024));
75901         XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 16);
75902         vx[0] = 1;
75903         XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 16);
75904 
75905         sp_1024_mont_add_16(qx_px, q->x, p->x, p1024_mod);
75906 
75907         for (i = 1020; i >= 0; i--) {
75908             /* Accumulate line into v and double point. */
75909             sp_1024_accumulate_line_dbl_16(vx, vy, c, q, t);
75910 
75911             if ((i > 0) && ((p1024_order[i / 64] >> (i % 64)) & 1)) {
75912                 /* Accumulate line into v and add P into C. */
75913                 sp_1024_accumulate_line_add_one_16(vx, vy, c, p, q, qx_px, t);
75914             }
75915         }
75916 
75917         /* Final exponentiation */
75918         sp_1024_proj_sqr_16(vx, vy, t);
75919         sp_1024_proj_sqr_16(vx, vy, t);
75920 
75921         /* Convert from PF_p[q] to F_p */
75922         sp_1024_mont_inv_16(vx, vx, t);
75923         sp_1024_mont_mul_16(r, vx, vy, p1024_mod, p1024_mp_mod);
75924         XMEMSET(r + 16, 0, sizeof(sp_digit) * 16);
75925         sp_1024_mont_reduce_16(r, p1024_mod, p1024_mp_mod);
75926 
75927         err = sp_1024_to_mp(r, res);
75928     }
75929 
75930 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
75931     !defined(WOLFSSL_SP_NO_MALLOC)
75932     if (td != NULL) {
75933         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
75934     }
75935 #endif
75936     sp_1024_point_free_16(c, 1, NULL);
75937     sp_1024_point_free_16(q, 1, NULL);
75938     sp_1024_point_free_16(p, 1, NULL);
75939     return err;
75940 }
75941 
75942 #else
75943 /*
75944  * Calculate gradient of line through C, P and -C-P, accumulate line and
75945  * add P to C.
75946  *
75947  * Both C and P have z ordinates to use in the calculation.
75948  *
75949  * Calculations:
75950  *   r.x  = (q.x * c.z^2 + c.x) * p.y * c.z - (q.x * p.z^2 + p.x) * c.y * p.z
75951  *   r.y  = (p.x * c.z^2 - c.x * p.z^2) * q.y * p.z * c.z
75952  *   v*   = v* * r*
75953  *   h    = p.x * c.z^2 - c.x * p.z^2
75954  *   r    = p.y * c.z^3 - c.y * p.z^3
75955  *   c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2
75956  *   c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3
75957  *   c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
75958  *
75959  * @param  [in,out]  vx     X-ordinate of projective value in F*.
75960  * @param  [in,out]  vy     Y-ordinate of projective value in F*.
75961  * @param  [in,out]  c      ECC point - current point on E(F_p^2) to be added
75962  *                          to.
75963  * @param  [in,out]  p      ECC point - point on E(F_p^2) to add.
75964  * @param  [in,out]  q      ECC point - second point on E(F_P^2).
75965  * @param  [in,out]  t      SP temporaries (6 used).
75966  * @param  [in,out]  neg    Indicates to use negative P.
75967  * @return  0 on success.
75968  * @return  MEMORY_E when dynamic memory allocation fails.
75969  * @return  Other -ve value on internal failure.
75970  */
sp_1024_accumulate_line_add_n_16(sp_digit * vx,sp_digit * vy,const sp_point_1024 * p,const sp_point_1024 * q,sp_point_1024 * c,sp_digit * t,int neg)75971 static void sp_1024_accumulate_line_add_n_16(sp_digit* vx, sp_digit* vy,
75972         const sp_point_1024* p, const sp_point_1024* q,
75973         sp_point_1024* c, sp_digit* t, int neg)
75974 {
75975     sp_digit* t1 = t;
75976     sp_digit* t2 = t +  2 * 16;
75977     sp_digit* rx = t +  4 * 16;
75978     sp_digit* ry = t +  6 * 16;
75979     sp_digit* h  = t +  8 * 16;
75980     sp_digit* r  = t + 10 * 16;
75981 
75982     /* h = p.z^2 */
75983     sp_1024_mont_sqr_16(h, p->z, p1024_mod, p1024_mp_mod);
75984     /* rx = q.x * p.z^2 */
75985     sp_1024_mont_mul_16(rx, q->x, h, p1024_mod, p1024_mp_mod);
75986     /* rx = q.x * p.z^2 + p.x */
75987     sp_1024_mont_add_16(t2, rx, p->x, p1024_mod);
75988     /* c.y = c.y * p.z */
75989     sp_1024_mont_mul_16(t1, c->y, p->z, p1024_mod, p1024_mp_mod);
75990     /* r.x = (q.x * p.z^2 + p.x) * c.y * p.z */
75991     sp_1024_mont_mul_16(rx, t2, t1, p1024_mod, p1024_mp_mod);
75992     /* c.y = c.y * p.z^3 */
75993     sp_1024_mont_mul_16(c->y, t1, h, p1024_mod, p1024_mp_mod);
75994     /* t2 = c.z^2 */
75995     sp_1024_mont_sqr_16(t2, c->z, p1024_mod, p1024_mp_mod);
75996     /* t1 = q.x * c.z^2 */
75997     sp_1024_mont_mul_16(t1, q->x, t2, p1024_mod, p1024_mp_mod);
75998     /* t1 = q.x * c.z^2 + c.x */
75999     sp_1024_mont_add_16(t1, t1, c->x, p1024_mod);
76000     /* c.x = c.x * p.z^2 */
76001     sp_1024_mont_mul_16(c->x, c->x, h, p1024_mod, p1024_mp_mod);
76002     /* r = p.y * c.z */
76003     sp_1024_mont_mul_16(r, p->y, c->z, p1024_mod, p1024_mp_mod);
76004     if (neg) {
76005         /* r = -p.y * c.z */
76006         sp_1024_mont_sub_16(r, p1024_mod, r, p1024_mod);
76007     }
76008     /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
76009     sp_1024_mont_mul_16(ry, t1, r, p1024_mod, p1024_mp_mod);
76010     /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
76011     sp_1024_mont_sub_16(rx, ry, rx, p1024_mod);
76012     /* t1 = p.x * c.z^2 */
76013     sp_1024_mont_mul_16(t1, p->x, t2, p1024_mod, p1024_mp_mod);
76014     /* h = p.x * c.z^2 - c.x * p.z^2 */
76015     sp_1024_mont_sub_16(h, t1, c->x, p1024_mod);
76016     /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z */
76017     sp_1024_mont_mul_16(t1, h, c->z, p1024_mod, p1024_mp_mod);
76018     /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z */
76019     sp_1024_mont_mul_16(c->z, t1, p->z, p1024_mod, p1024_mp_mod);
76020     /* r.y = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z * q.y */
76021     sp_1024_mont_mul_16(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
76022     /* r = p.y * c.z^3 */
76023     sp_1024_mont_mul_16(t1, r, t2, p1024_mod, p1024_mp_mod);
76024     /* r = p.y * c.z^3 - c.y * p.z^3 */
76025     sp_1024_mont_sub_16(r, t1, c->y, p1024_mod);
76026     /* v = v * r */
76027     sp_1024_proj_mul_16(vx, vy, rx, ry, t);
76028 
76029     /* Add p to c using previously calculated values.
76030      *   h = p.x * c.z^2 - c.x * p.z^2
76031      *   r = p.y * c.z^3 - c.y * p.z^3
76032      *   c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
76033      */
76034 
76035     /* t1 = r^2 */
76036     sp_1024_mont_sqr_16(t1, r, p1024_mod, p1024_mp_mod);
76037     /* t2 = h^2 */
76038     sp_1024_mont_sqr_16(rx, h, p1024_mod, p1024_mp_mod);
76039     /* ry = c.x * p.z^2 * h^2 */
76040     sp_1024_mont_mul_16(ry, rx, c->x, p1024_mod, p1024_mp_mod);
76041     /* t2 = h^3 */
76042     sp_1024_mont_mul_16(t2, rx, h, p1024_mod, p1024_mp_mod);
76043     /* c'.x = r^2 - h^3 */
76044     sp_1024_mont_sub_16(c->x, t1, t2, p1024_mod);
76045     /* t1 = 2 * c.x * p.z^2 * h^2 */
76046     sp_1024_mont_dbl_16(t1, ry, p1024_mod);
76047     /* c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2 */
76048     sp_1024_mont_sub_16(c->x, c->x, t1, p1024_mod);
76049     /* ry = c.x * p.z^2 * h^2 - c'.x */
76050     sp_1024_mont_sub_16(t1, ry, c->x, p1024_mod);
76051     /* ry = r * (c.x * p.z^2 * h^2 - c'.x) */
76052     sp_1024_mont_mul_16(ry, t1, r, p1024_mod, p1024_mp_mod);
76053     /* t2 = c.y * p.z^3 * h^3 */
76054     sp_1024_mont_mul_16(t1, t2, c->y, p1024_mod, p1024_mp_mod);
76055     /* c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3 */
76056     sp_1024_mont_sub_16(c->y, ry, t1, p1024_mod);
76057 }
76058 
76059 /*
76060  * Perform n accumulate doubles and doubles of P.
76061  *
76062  * py = 2 * p.y
76063  *
76064  * For each double:
76065  * Calculate gradient of line through P, P and [-2]P, accumulate line and
76066  * double P.
76067  *
76068  * Calculations:
76069  *   l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
76070  *   r.x = l * (p.x + q.x * p.z^2) - py^2 / 2
76071  *   r.y = py * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
76072  *   v* = v*^2 * r*
76073  *   p'.x = l^2 - 2 * py^2 * p.x
76074  *   py' = (py^2 * p.x - p'.x) * l - py^4 (= 2 * p'.y)
76075  *   p'.z = py * p.z
76076  *
76077  * Finally:
76078  *   p'.y = py' / 2
76079  *
76080  * @param  [in,out]  vx  X-ordinate of projective value in F*.
76081  * @param  [in,out]  vy  Y-ordinate of projective value in F*.
76082  * @param  [in,out]  p   ECC point - point on E(F_p^2) to double.
76083  * @param  [in]      q   ECC point - second point on E(F_P^2).
76084  * @param  [in]      n   Number of times to double.
76085  * @param  [in]      t   SP temporaries (6 used).
76086  */
sp_1024_accumulate_line_dbl_n_16(sp_digit * vx,sp_digit * vy,sp_point_1024 * p,const sp_point_1024 * q,int n,sp_digit * t)76087 static void sp_1024_accumulate_line_dbl_n_16(sp_digit* vx, sp_digit* vy,
76088         sp_point_1024* p, const sp_point_1024* q, int n, sp_digit* t)
76089 {
76090     sp_digit* t1  = t +  0 * 16;
76091     sp_digit* pz2 = t +  2 * 16;
76092     sp_digit* rx  = t +  4 * 16;
76093     sp_digit* ry  = t +  6 * 16;
76094     sp_digit* l   = t +  8 * 16;
76095     sp_digit* ty  = t + 10 * 16;
76096     int i;
76097 
76098     /* py = 2 * p.y */
76099     sp_1024_mont_dbl_16(p->y, p->y, p1024_mod);
76100 
76101     for (i = 0; i < n; i++) {
76102         /* v = v^2 */
76103         sp_1024_proj_sqr_16(vx, vy, t);
76104         /* pz2 = p.z^2 */
76105         sp_1024_mont_sqr_16(pz2, p->z, p1024_mod, p1024_mp_mod);
76106         /* t1 = p.x + p.z^2 */
76107         sp_1024_mont_add_16(t1, p->x, pz2, p1024_mod);
76108         /* l = p.x - p.z^2 */
76109         sp_1024_mont_sub_16(l, p->x, pz2, p1024_mod);
76110         /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
76111         sp_1024_mont_mul_16(ty, l, t1, p1024_mod, p1024_mp_mod);
76112         /* l = 3 * (p.x^2 - p.z^4) */
76113         sp_1024_mont_tpl_16(l, ty, p1024_mod);
76114         /* t1 = q.x * p.z^2 */
76115         sp_1024_mont_mul_16(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
76116         /* t1 = p.x + q.x * p.z^2 */
76117         sp_1024_mont_add_16(t1, p->x, t1, p1024_mod);
76118         /* r.x = l * (p.x + q.x * p.z^2) */
76119         sp_1024_mont_mul_16(rx, l, t1, p1024_mod, p1024_mp_mod);
76120         /* ty = py ^ 2 */
76121         sp_1024_mont_sqr_16(ty, p->y, p1024_mod, p1024_mp_mod);
76122         /* t1 = py ^ 2 / 2 */
76123         sp_1024_div2_16(t1, ty, p1024_mod);
76124         /* r.x -= py ^ 2 / 2 */
76125         sp_1024_mont_sub_16(rx, rx, t1, p1024_mod);
76126         /* p'.z = py * pz */
76127         sp_1024_mont_mul_16(p->z, p->z, p->y, p1024_mod, p1024_mp_mod);
76128         /* r.y = p'.z * p.z^2 */
76129         sp_1024_mont_mul_16(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
76130         /* r.y = p'.z * p.z^2 * q.y */
76131         sp_1024_mont_mul_16(ry, t1, q->y, p1024_mod, p1024_mp_mod);
76132         /* v = v^2 * r */
76133         sp_1024_proj_mul_16(vx, vy, rx, ry, t);
76134 
76135         /* Double point using previously calculated values
76136          *   l = 3 * (p.x - p.z^2).(p.x + p.z^2)
76137          *   ty = py^2
76138          *   p'.z = py * p.z
76139          */
76140         /* t1 = py^2 ^ 2 = py^4 */
76141         sp_1024_mont_sqr_16(t1, ty, p1024_mod, p1024_mp_mod);
76142         /* py' = py^2 * p. x */
76143         sp_1024_mont_mul_16(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
76144         /* p'.x = l^2 */
76145         sp_1024_mont_sqr_16(p->x, l, p1024_mod, p1024_mp_mod);
76146         /* p'.x = l^2 - py^2 * p.x */
76147         sp_1024_mont_sub_16(p->x, p->x, p->y, p1024_mod);
76148         /* p'.x = l^2 - 2 * p.y^2 * p.x */
76149         sp_1024_mont_sub_16(p->x, p->x, p->y, p1024_mod);
76150         /* py' = py^2 * p.x - p.x' */
76151         sp_1024_mont_sub_16(ty, p->y, p->x, p1024_mod);
76152         /* py' = (p.y^2 * p.x - p'.x) * l */
76153         sp_1024_mont_mul_16(p->y, ty, l, p1024_mod, p1024_mp_mod);
76154         /* py' = (p.y^2 * p.x - p'.x) * l * 2 */
76155         sp_1024_mont_dbl_16(p->y, p->y, p1024_mod);
76156         /* py' = (p.y^2 * p.x - p'.x) * l * 2 - p.y^4 */
76157         sp_1024_mont_sub_16(p->y, p->y, t1, p1024_mod);
76158     }
76159 
76160     /* p'.y = py' / 2 */
76161     sp_1024_div2_16(p->y, p->y, p1024_mod);
76162 }
76163 
76164 /* Operations to perform based on order - 1.
76165  * Sliding window. Start at bottom and stop when bottom bit is one.
76166  * Subtract if top bit in window is one.
76167  * Width of 6 bits.
76168  * Pairs: #dbls, add/subtract window value
76169  */
76170 static const signed char sp_1024_order_op[] = {
76171    5,   6, -13,   9, -21,   6,  -5,   8,  31,   6,   3,   6, -27,   6,  25,   9,
76172   -1,   6, -11,   6, -13,   6,  -7,   6, -15,   6, -29,   7,  25,   6,  -9,   6,
76173  -19,   7,   3,   6,  11,   9, -23,   6,   1,   6,  27,   6,   1,   7, -25,   8,
76174   13,   7, -13,   7, -23,  10,  19,   7,   7,   7,  -3,   7,  27,   6,  -7,   7,
76175  -21,   7,  11,   7,  31,   8,   1,   7, -23,   6, -17,   6,  -3,  10,  11,   6,
76176  -21,   7, -27,  11, -29,   6,  -1,  10,  15,   8,  27,   7,  17,   6,  17,   7,
76177  -13,   8,  13,   6,  21,   7, -29,   6,  19,   7, -25,   6,  11,   9,  29,   7,
76178   -7,   8,  27,   7,  29,  10,  -1,   8,  -7,   8,  17,   6,  17,   7, -27,   7,
76179  -21,   6,  -9,   6, -27,  12, -23,   6,  19,   6,  13,   6, -11,   7,  27,   6,
76180   17,   6,  -7,   6, -25,   7, -29,   6,   9,   7,   7,   6,  13,   6, -25,   6,
76181  -19,   6,  13,   6, -11,   6,   5,   8,  19,   6, -21,   8,  23,   7,  27,   6,
76182  -13,   6, -19,  11,  29,   7, -15,   6,  -9,   7, -21,  10,  -3,   7,  21,  10,
76183   25,   6, -15,   6, -23,   6,  21,   6,   1,   6,  21,   7,  -3,   6,  -3,   7,
76184   -7,   6, -23,   7,   7,   8,  15,   9,   5,   6, -11,   6,  21,  11, -27,   7,
76185   27,   6, -11,   6,  31,   6, -21,   6,  19,   6,  -7,   8,  -7,  13,  -3,   6,
76186   -7,   7,  -3,   6,   1,   6,   7,   8,  19,   8,  11,   9,  -9,   7, -31,  12,
76187   25,   6, -17,   9, -15,   7,   5,   6,  25,   7,  -5,   7, -25,   6,  17,   8,
76188  -19,   6, -13,   6,  27,   8,   1,   7,  -5,   7,  -1,   6,  21,   6,   3,  10,
76189   -3,   1,
76190 };
76191 /*
76192  * Calculate r = pairing <P, Q>.
76193  *
76194  * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
76195  *
76196  * Sliding window. Start at bottom and stop when bottom bit is one.
76197  * Subtract if top bit in window is one.
76198  * Width of 6 bits.
76199  *
76200  * @param  [in]  pm   First point on E(F_p)[q].
76201  * @param  [in]  qm   Second point on E(F_p)[q].
76202  * @param  [in]  res  Result of calculation.
76203  * @return  0 on success.
76204  * @return  MEMORY_E when dynamic memory allocation fails.
76205  */
sp_Pairing_1024(const ecc_point * pm,const ecc_point * qm,mp_int * res)76206 int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
76207 {
76208     int err;
76209 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76210     !defined(WOLFSSL_SP_NO_MALLOC)
76211     sp_digit* td = NULL;
76212     sp_digit* t;
76213     sp_digit* vx;
76214     sp_digit* vy;
76215     sp_digit (*pre_vx)[32];
76216     sp_digit (*pre_vy)[32];
76217     sp_digit (*pre_nvy)[32];
76218     sp_point_1024* pre_p;
76219 #else
76220     sp_digit t[6 * 2 * 16];
76221     sp_digit vx[2 * 16];
76222     sp_digit vy[2 * 16];
76223     sp_digit pre_vx[16][32];
76224     sp_digit pre_vy[16][32];
76225     sp_digit pre_nvy[16][32];
76226     sp_point_1024 pre_p[16];
76227     sp_point_1024 pd;
76228     sp_point_1024 qd;
76229     sp_point_1024 cd;
76230 #endif
76231     sp_point_1024* p = NULL;
76232     sp_point_1024* q = NULL;
76233     sp_point_1024* c = NULL;
76234     sp_digit* r = NULL;
76235     int i;
76236     int j;
76237 
76238     err = sp_1024_point_new_16(NULL, pd, p);
76239     if (err == MP_OKAY) {
76240         err = sp_1024_point_new_16(NULL, qd, q);
76241     }
76242     if (err == MP_OKAY) {
76243         err = sp_1024_point_new_16(NULL, cd, c);
76244     }
76245 
76246 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76247     !defined(WOLFSSL_SP_NO_MALLOC)
76248     if (err == MP_OKAY) {
76249         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 16 * 2 + 16 * sizeof(sp_point_1024), NULL,
76250                                 DYNAMIC_TYPE_TMP_BUFFER);
76251         if (td == NULL) {
76252             err = MEMORY_E;
76253         }
76254     }
76255 #endif
76256 
76257     if (err == MP_OKAY) {
76258 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76259     !defined(WOLFSSL_SP_NO_MALLOC)
76260         t       = td;
76261         vx      = td + 6 * 16 * 2;
76262         vy      = td + 7 * 16 * 2;
76263         pre_vx  = (sp_digit(*)[32])(td + 8 * 16 * 2);
76264         pre_vy  = (sp_digit(*)[32])(td + 24 * 16 * 2);
76265         pre_nvy = (sp_digit(*)[32])(td + 40 * 16 * 2);
76266         pre_p   = (sp_point_1024*)(td + 56 * 16 * 2);
76267 #endif
76268         r = vy;
76269 
76270         sp_1024_point_from_ecc_point_16(p, pm);
76271         sp_1024_point_from_ecc_point_16(q, qm);
76272 
76273         err = sp_1024_mod_mul_norm_16(p->x, p->x, p1024_mod);
76274     }
76275     if (err == MP_OKAY) {
76276         err = sp_1024_mod_mul_norm_16(p->y, p->y, p1024_mod);
76277     }
76278     if (err == MP_OKAY) {
76279         err = sp_1024_mod_mul_norm_16(p->z, p->z, p1024_mod);
76280     }
76281     if (err == MP_OKAY) {
76282         err = sp_1024_mod_mul_norm_16(q->x, q->x, p1024_mod);
76283     }
76284     if (err == MP_OKAY) {
76285         err = sp_1024_mod_mul_norm_16(q->y, q->y, p1024_mod);
76286     }
76287     if (err == MP_OKAY) {
76288         /* Generate pre-computation table: 1, 3, ... , 31 */
76289         XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
76290         XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 16);
76291         pre_vx[0][0] = 1;
76292         XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 16);
76293         sp_1024_mont_sub_16(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
76294 
76295         /* [2]P for adding */
76296         XMEMCPY(c, p, sizeof(sp_point_1024));
76297         XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 16);
76298         vx[0] = 1;
76299         XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 16);
76300         sp_1024_accumulate_line_dbl_16(vx, vy, c, q, t);
76301 
76302         /* 3, 5, ... */
76303         for (i = 1; i < 16; i++) {
76304             XMEMCPY(&pre_p[i], &pre_p[i-1], sizeof(sp_point_1024));
76305             XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 16);
76306             XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 16);
76307             sp_1024_proj_mul_16(pre_vx[i], pre_vy[i], vx, vy, t);
76308             sp_1024_accumulate_line_add_n_16(pre_vx[i], pre_vy[i], c,
76309                     q, &pre_p[i], t, 0);
76310             sp_1024_mont_sub_16(pre_nvy[i], p1024_mod, pre_vy[i], p1024_mod);
76311         }
76312 
76313         j = sp_1024_order_op[0] / 2;
76314         XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
76315         XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 16);
76316         XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 16);
76317 
76318         /* Accumulate line into v and double point n times. */
76319         sp_1024_accumulate_line_dbl_n_16(vx, vy, c, q,
76320                 sp_1024_order_op[1], t);
76321 
76322         for (i = 2; i < 290; i += 2) {
76323             j = sp_1024_order_op[i];
76324             if (j > 0) {
76325                 j /= 2;
76326                 /* Accumulate line into v and add P into C. */
76327                 sp_1024_proj_mul_16(vx, vy, pre_vx[j], pre_vy[j], t);
76328                 sp_1024_accumulate_line_add_n_16(vx, vy, &pre_p[j], q, c,
76329                     t, 0);
76330             }
76331             else {
76332                 j = -j / 2;
76333                 /* Accumulate line into v and add P into C. */
76334                 sp_1024_proj_mul_16(vx, vy, pre_vx[j], pre_nvy[j], t);
76335                 sp_1024_accumulate_line_add_n_16(vx, vy, &pre_p[j], q, c,
76336                     t, 1);
76337             }
76338 
76339             /* Accumulate line into v and double point n times. */
76340             sp_1024_accumulate_line_dbl_n_16(vx, vy, c, q,
76341                     sp_1024_order_op[i + 1], t);
76342         }
76343 
76344         /* Final exponentiation */
76345         sp_1024_proj_sqr_16(vx, vy, t);
76346         sp_1024_proj_sqr_16(vx, vy, t);
76347 
76348         /* Convert from PF_p[q] to F_p */
76349         sp_1024_mont_inv_16(vx, vx, t);
76350         sp_1024_mont_mul_16(r, vx, vy, p1024_mod, p1024_mp_mod);
76351         XMEMSET(r + 16, 0, sizeof(sp_digit) * 16);
76352         sp_1024_mont_reduce_16(r, p1024_mod, p1024_mp_mod);
76353 
76354         err = sp_1024_to_mp(r, res);
76355     }
76356 
76357 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76358     !defined(WOLFSSL_SP_NO_MALLOC)
76359     if (td != NULL) {
76360         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
76361     }
76362 #endif
76363     sp_1024_point_free_16(c, 1, NULL);
76364     sp_1024_point_free_16(q, 1, NULL);
76365     sp_1024_point_free_16(p, 1, NULL);
76366     return err;
76367 }
76368 
76369 #endif /* WOLFSSL_SP_SMALL */
76370 #ifdef WOLFSSL_SP_SMALL
76371 /*
76372  * Generate table for pairing.
76373  *
76374  * Small implementation does not use a table - returns 0 length.
76375  *
76376  * pm     [in]      Point to generate table for.
76377  * table  [in]      Generated table.
76378  * len    [in,out]  On in, the size of the buffer.
76379  *                  On out, length of table generated.
76380  * @return  0 on success.
76381  *          LENGTH_ONLY_E when table is NULL and only length returned.
76382  *          BUFFER_E when len is too small.
76383  */
sp_Pairing_gen_precomp_1024(const ecc_point * pm,byte * table,word32 * len)76384 int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
76385         word32* len)
76386 {
76387     int err = 0;
76388 
76389     if (table == NULL) {
76390         *len = 0;
76391         err = LENGTH_ONLY_E;
76392     }
76393     else if (*len != 0) {
76394         err = BUFFER_E;
76395     }
76396 
76397     (void)*pm;
76398 
76399     return err;
76400 }
76401 
76402 /*
76403  * Calculate r = pairing <P, Q>.
76404  *
76405  * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
76406  *
76407  * Small implementation does not use a table - use the normal implementation.
76408  *
76409  * @param  [in]  pm     First point on E(F_p)[q].
76410  * @param  [in]  qm     Second point on E(F_p)[q].
76411  * @param  [in]  res    Result of calculation.
76412  * @param  [in]  table  Precomputed table of values.
76413  * @param  [in]  len    Length of precomputed table of values in bytes.
76414  * @return  0 on success.
76415  * @return  MEMORY_E when dynamic memory allocation fails.
76416  */
sp_Pairing_precomp_1024(const ecc_point * pm,const ecc_point * qm,mp_int * res,const byte * table,word32 len)76417 int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
76418     mp_int* res, const byte* table, word32 len)
76419 {
76420     (void)table;
76421     (void)len;
76422     return sp_Pairing_1024(pm, qm, res);
76423 }
76424 
76425 #else
76426 /*
76427  * Calc l and c for the point when doubling p.
76428  *
76429  * l = 3 * (p.x^2 - 1) / (2 * p.y)
76430  * c = l * p.x - p.y
76431  *
76432  * @param  [out]  lr  Gradient result - table entry.
76433  * @param  [out]  cr  Constant result - table entry.
76434  * @param  [in]   px  X-ordinate of point to double.
76435  * @param  [in]   py  Y-ordinate of point to double.
76436  * @param  [in]   t   SP temporaries (3 used).
76437  */
sp_1024_accum_dbl_calc_lc_16(sp_digit * lr,sp_digit * cr,const sp_digit * px,const sp_digit * py,sp_digit * t)76438 static void sp_1024_accum_dbl_calc_lc_16(sp_digit* lr, sp_digit* cr,
76439         const sp_digit* px, const sp_digit* py, sp_digit* t)
76440 {
76441     sp_digit* t1 = t + 0 * 2 * 16;
76442     sp_digit* t2 = t + 2 * 2 * 16;
76443     sp_digit* l  = t + 4 * 2 * 16;
76444 
76445 
76446     /* l = 1 / 2 * p.y */
76447     sp_1024_mont_dbl_16(l, py, p1024_mod);
76448     sp_1024_mont_inv_16(l, l, t);
76449 
76450     /* t1 = p.x^2 */
76451     sp_1024_mont_sqr_16(t1, px, p1024_mod, p1024_mp_mod);
76452     /* t1 = p.x - 1 */
76453     sp_1024_mont_sub_16(t1, t1, p1024_norm_mod, p1024_mod);
76454     /* t1 = 3 * (p.x^2 - 1) */
76455     sp_1024_mont_dbl_16(t2, t1, p1024_mod);
76456     sp_1024_mont_add_16(t1, t1, t2, p1024_mod);
76457     /* t1 = 3 * (p.x^2 - 1) / (2 * p.y) */
76458     sp_1024_mont_mul_16(l, l, t1, p1024_mod, p1024_mp_mod);
76459     /* t2 = l * p.x */
76460     sp_1024_mont_mul_16(t2, l, px, p1024_mod, p1024_mp_mod);
76461     /* c = t2 = l * p.x - p.y */
76462     sp_1024_mont_sub_16(t2, t2, py, p1024_mod);
76463 
76464     XMEMCPY(lr, l, sizeof(sp_digit) * 16);
76465     XMEMCPY(cr, t2, sizeof(sp_digit) * 16);
76466 }
76467 
76468 /*
76469  * Calc l and c when adding p and c.
76470  *
76471  * l = (c.y - p.y) / (c.x - p.x)
76472  * c = (p.x * c.y - cx * p.y) / (cx - p.x)
76473  *
76474  * @param  [out]  lr  Gradient result - table entry.
76475  * @param  [out]  cr  Constant result - table entry.
76476  * @param  [in]   px  X-ordinate of point to add.
76477  * @param  [in]   py  Y-ordinate of point to add.
76478  * @param  [in]   cx  X-ordinate of current point.
76479  * @param  [in]   cy  Y-ordinate of current point.
76480  * @param  [in]   t   SP temporaries (3 used).
76481  */
sp_1024_accum_add_calc_lc_16(sp_digit * lr,sp_digit * cr,const sp_digit * px,const sp_digit * py,const sp_digit * cx,const sp_digit * cy,sp_digit * t)76482 static void sp_1024_accum_add_calc_lc_16(sp_digit* lr, sp_digit* cr,
76483         const sp_digit* px, const sp_digit* py, const sp_digit* cx,
76484         const sp_digit* cy, sp_digit* t)
76485 {
76486     sp_digit* t1 = t + 0 * 2 * 16;
76487     sp_digit* c  = t + 2 * 2 * 16;
76488     sp_digit* l  = t + 4 * 2 * 16;
76489 
76490 
76491     /* l = 1 / (c.x - p.x) */
76492     sp_1024_mont_sub_16(l, cx, px, p1024_mod);
76493     sp_1024_mont_inv_16(l, l, t);
76494 
76495     /* c = p.x * c.y */
76496     sp_1024_mont_mul_16(c, px, cy, p1024_mod, p1024_mp_mod);
76497     /* t1 = c.x * p.y */
76498     sp_1024_mont_mul_16(t1, cx, py, p1024_mod, p1024_mp_mod);
76499     /* c = (p.x * c.y) - (c.x * p.y) */
76500     sp_1024_mont_sub_16(c, c, t1, p1024_mod);
76501     /* c = ((p.x * c.y) - (c.x * p.y)) / (c.x - p.x) */
76502     sp_1024_mont_mul_16(c, c, l, p1024_mod, p1024_mp_mod);
76503     /* t1 = c.y - p.y */
76504     sp_1024_mont_sub_16(t1, cy, py, p1024_mod);
76505     /* l = (c.y - p.y) / (c.x - p.x) */
76506     sp_1024_mont_mul_16(l, t1, l, p1024_mod, p1024_mp_mod);
76507 
76508     XMEMCPY(lr, l, sizeof(sp_digit) * 16);
76509     XMEMCPY(cr, c, sizeof(sp_digit) * 16);
76510 }
76511 
76512 /*
76513  * Calculate vx and vy given gradient l and constant c and point q.
76514  *
76515  * l is a the gradient and is multiplied by q->x.
76516  * c is a the constant that is added to the multiplicative result.
76517  * q->y is the y-ordinate in result to multiply.
76518  *
76519  * if dbl
76520  *   v*  = v*^2
76521  * r.x = l * q.x + c
76522  * r.y = q->y
76523  * v*  = v* * r*
76524  *
76525  * @param  [in,out]  vx     X-ordinate of projective value in F*.
76526  * @param  [in,out]  vy     Y-ordinate of projective value in F*.
76527  * @param  [in]      l      Gradient to multiply with.
76528  * @param  [in]      c      Constant to add with.
76529  * @param  [in]      q      ECC point - second point on E(F_P^2).
76530  * @param  [in]      t      SP temporaries (3 used).
76531  * @param  [in]      dbl    Indicates whether this is for doubling. Otherwise
76532  *                          adding.
76533  */
sp_1024_accumulate_line_lc_16(sp_digit * vx,sp_digit * vy,const sp_digit * l,const sp_digit * c,const sp_point_1024 * q,sp_digit * t,int dbl)76534 static void sp_1024_accumulate_line_lc_16(sp_digit* vx, sp_digit* vy,
76535         const sp_digit* l, const sp_digit* c, const sp_point_1024* q,
76536         sp_digit* t, int dbl)
76537 {
76538     sp_digit* rx = t + 4 * 2 * 16;
76539 
76540     /* v = v^2 */
76541     if (dbl) {
76542         sp_1024_proj_sqr_16(vx, vy, t);
76543     }
76544     /* rx = l * q.x + c */
76545     sp_1024_mont_mul_16(rx, l, q->x, p1024_mod, p1024_mp_mod);
76546     sp_1024_mont_add_16(rx, rx, c, p1024_mod);
76547     /* v = v^2 * r */
76548     sp_1024_proj_mul_16(vx, vy, rx, q->y, t);
76549 }
76550 
76551 /* Operations to perform based on order - 1.
76552  * Sliding window. Start at bottom and stop when bottom bit is one.
76553  * Subtract if top bit in window is one.
76554  * Width of 6 bits.
76555  * Pairs: #dbls, add/subtract window value
76556  */
76557 static const signed char sp_1024_order_op_pre[] = {
76558    5,   6, -13,   9, -21,   6,  -5,   8,  31,   6,   3,   6, -27,   6,  25,   9,
76559   -1,   6, -11,   6, -13,   6,  -7,   6, -15,   6, -29,   7,  25,   6,  -9,   6,
76560  -19,   7,   3,   6,  11,   9, -23,   6,   1,   6,  27,   6,   1,   7, -25,   8,
76561   13,   7, -13,   7, -23,  10,  19,   7,   7,   7,  -3,   7,  27,   6,  -7,   7,
76562  -21,   7,  11,   7,  31,   8,   1,   7, -23,   6, -17,   6,  -3,  10,  11,   6,
76563  -21,   7, -27,  11, -29,   6,  -1,  10,  15,   8,  27,   7,  17,   6,  17,   7,
76564  -13,   8,  13,   6,  21,   7, -29,   6,  19,   7, -25,   6,  11,   9,  29,   7,
76565   -7,   8,  27,   7,  29,  10,  -1,   8,  -7,   8,  17,   6,  17,   7, -27,   7,
76566  -21,   6,  -9,   6, -27,  12, -23,   6,  19,   6,  13,   6, -11,   7,  27,   6,
76567   17,   6,  -7,   6, -25,   7, -29,   6,   9,   7,   7,   6,  13,   6, -25,   6,
76568  -19,   6,  13,   6, -11,   6,   5,   8,  19,   6, -21,   8,  23,   7,  27,   6,
76569  -13,   6, -19,  11,  29,   7, -15,   6,  -9,   7, -21,  10,  -3,   7,  21,  10,
76570   25,   6, -15,   6, -23,   6,  21,   6,   1,   6,  21,   7,  -3,   6,  -3,   7,
76571   -7,   6, -23,   7,   7,   8,  15,   9,   5,   6, -11,   6,  21,  11, -27,   7,
76572   27,   6, -11,   6,  31,   6, -21,   6,  19,   6,  -7,   8,  -7,  13,  -3,   6,
76573   -7,   7,  -3,   6,   1,   6,   7,   8,  19,   8,  11,   9,  -9,   7, -31,  12,
76574   25,   6, -17,   9, -15,   7,   5,   6,  25,   7,  -5,   7, -25,   6,  17,   8,
76575  -19,   6, -13,   6,  27,   8,   1,   7,  -5,   7,  -1,   6,  21,   6,   3,  10,
76576   -3,   1,
76577 };
76578 
76579 /*
76580  * Generate table for pairing.
76581  *
76582  * Calculate the graident (l) and constant (c) at each step of the way.
76583  * Sliding window. Start at bottom and stop when bottom bit is one.
76584  * Subtract if top bit in window is one.
76585  * Width of 6 bits.
76586  *
76587  * pm     [in]      Point to generate table for.
76588  * table  [in]      Generated table.
76589  * len    [in,out]  On in, the size of the buffer.
76590  *                  On out, length of table generated.
76591  * @return  0 on success.
76592  *          LENGTH_ONLY_E when table is NULL and only length returned.
76593  *          BUFFER_E when len is too small.
76594  *          MEMORY_E when dynamic memory allocation fauls.
76595  */
sp_Pairing_gen_precomp_1024(const ecc_point * pm,byte * table,word32 * len)76596 int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
76597         word32* len)
76598 {
76599     int err = 0;
76600 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76601     !defined(WOLFSSL_SP_NO_MALLOC)
76602     sp_digit* td = NULL;
76603     sp_digit* t;
76604     sp_point_1024* pre_p;
76605 #else
76606     sp_digit t[6 * 2 * 16];
76607     sp_point_1024 pre_p[16];
76608     sp_point_1024 pd;
76609     sp_point_1024 cd;
76610     sp_point_1024 negd;
76611 #endif
76612     sp_point_1024* p = NULL;
76613     sp_point_1024* c = NULL;
76614     sp_point_1024* neg = NULL;
76615     int i;
76616     int j;
76617     int k;
76618     sp_table_entry_1024* precomp = (sp_table_entry_1024*)table;
76619 
76620     if (table == NULL) {
76621         *len = sizeof(sp_table_entry_1024) * 1167;
76622         err = LENGTH_ONLY_E;
76623     }
76624 
76625     if ((err == MP_OKAY) &&
76626             (*len < (int)(sizeof(sp_table_entry_1024) * 1167))) {
76627         err = BUFFER_E;
76628     }
76629 
76630     if (err == MP_OKAY) {
76631         err = sp_1024_point_new_16(NULL, pd, p);
76632     }
76633     if (err == MP_OKAY) {
76634         err = sp_1024_point_new_16(NULL, cd, c);
76635     }
76636     if (err == MP_OKAY) {
76637         err = sp_1024_point_new_16(NULL, negd, neg);
76638     }
76639 
76640 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76641     !defined(WOLFSSL_SP_NO_MALLOC)
76642     if (err == MP_OKAY) {
76643         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 16 * 2 + 16 * sizeof(sp_point_1024), NULL,
76644                                 DYNAMIC_TYPE_TMP_BUFFER);
76645         if (td == NULL) {
76646             err = MEMORY_E;
76647         }
76648     }
76649 #endif
76650 
76651     if (err == MP_OKAY) {
76652 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76653     !defined(WOLFSSL_SP_NO_MALLOC)
76654         t     = td;
76655         pre_p = (sp_point_1024*)(td + 6 * 16 * 2);
76656 #endif
76657 
76658         sp_1024_point_from_ecc_point_16(p, pm);
76659 
76660         err = sp_1024_mod_mul_norm_16(p->x, p->x, p1024_mod);
76661     }
76662     if (err == MP_OKAY) {
76663         err = sp_1024_mod_mul_norm_16(p->y, p->y, p1024_mod);
76664     }
76665     if (err == MP_OKAY) {
76666         XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
76667         neg->infinity = 0;
76668         c->infinity = 0;
76669 
76670         /* Generate pre-computation table: 1, 3, ... , 31 */
76671         XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
76672         /* [2]P for adding */
76673         sp_1024_proj_point_dbl_16(c, p, t);
76674 
76675         /* 1, 3, ... */
76676         for (i = 1; i < 16; i++) {
76677             sp_1024_proj_point_add_16(&pre_p[i], &pre_p[i-1], c, t);
76678             sp_1024_mont_map_16(&pre_p[i], t);
76679         }
76680 
76681         k = 0;
76682         j = sp_1024_order_op_pre[0] / 2;
76683         XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
76684 
76685         for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
76686             sp_1024_accum_dbl_calc_lc_16(precomp[k].x, precomp[k].y, c->x, c->y, t);
76687             k++;
76688             sp_1024_proj_point_dbl_16(c, c, t);
76689             sp_1024_mont_map_16(c, t);
76690         }
76691 
76692         for (i = 2; i < 290; i += 2) {
76693             j = sp_1024_order_op_pre[i];
76694             if (j > 0) {
76695                 sp_1024_accum_add_calc_lc_16(precomp[k].x, precomp[k].y,
76696                     pre_p[j/2].x, pre_p[j/2].y, c->x, c->y, t);
76697                 k++;
76698                 sp_1024_proj_point_add_16(c, c, &pre_p[j/2], t);
76699                 sp_1024_mont_map_16(c, t);
76700             }
76701             else {
76702                 XMEMCPY(neg->x, pre_p[-j / 2].x, sizeof(pre_p->x));
76703                 sp_1024_mont_sub_16(neg->y, p1024_mod, pre_p[-j / 2].y,
76704                         p1024_mod);
76705                 XMEMCPY(neg->z, pre_p[-j / 2].z, sizeof(pre_p->z));
76706 
76707                 sp_1024_accum_add_calc_lc_16(precomp[k].x, precomp[k].y,
76708                     neg->x, neg->y, c->x, c->y, t);
76709                 k++;
76710                 sp_1024_proj_point_add_16(c, c, neg, t);
76711                 sp_1024_mont_map_16(c, t);
76712             }
76713 
76714             for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
76715                 sp_1024_accum_dbl_calc_lc_16(precomp[k].x, precomp[k].y, c->x, c->y, t);
76716                 k++;
76717                 sp_1024_proj_point_dbl_16(c, c, t);
76718                 sp_1024_mont_map_16(c, t);
76719             }
76720         }
76721 
76722         *len = sizeof(sp_table_entry_1024) * 1167;
76723     }
76724 
76725 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76726     !defined(WOLFSSL_SP_NO_MALLOC)
76727     if (td != NULL) {
76728         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
76729     }
76730 #endif
76731     sp_1024_point_free_16(neg, 1, NULL);
76732     sp_1024_point_free_16(c, 1, NULL);
76733     sp_1024_point_free_16(p, 1, NULL);
76734     return err;
76735 }
76736 
76737 /*
76738  * Calculate r = pairing <P, Q>.
76739  *
76740  * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
76741  *
76742  * Sliding window. Start at bottom and stop when bottom bit is one.
76743  * Subtract if top bit in window is one.
76744  * Width of 6 bits.
76745  * Pre-generate values in window (1, 3, ...) - only V.
76746  * Table contains all gradient l and a constant for each point on the path.
76747  *
76748  * @param  [in]  pm     First point on E(F_p)[q].
76749  * @param  [in]  qm     Second point on E(F_p)[q].
76750  * @param  [in]  res    Result of calculation.
76751  * @param  [in]  table  Precomputed table of values.
76752  * @param  [in]  len    Length of precomputed table of values in bytes.
76753  * @return  0 on success.
76754  * @return  MEMORY_E when dynamic memory allocation fails.
76755  */
sp_Pairing_precomp_1024(const ecc_point * pm,const ecc_point * qm,mp_int * res,const byte * table,word32 len)76756 int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
76757     mp_int* res, const byte* table, word32 len)
76758 {
76759     int err = 0;
76760 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76761     !defined(WOLFSSL_SP_NO_MALLOC)
76762     sp_digit* td = NULL;
76763     sp_digit* t;
76764     sp_digit* vx;
76765     sp_digit* vy;
76766     sp_digit (*pre_vx)[32];
76767     sp_digit (*pre_vy)[32];
76768     sp_digit (*pre_nvy)[32];
76769 #else
76770     sp_digit t[6 * 2 * 16];
76771     sp_digit vx[2 * 16];
76772     sp_digit vy[2 * 16];
76773     sp_digit pre_vx[16][32];
76774     sp_digit pre_vy[16][32];
76775     sp_digit pre_nvy[16][32];
76776     sp_point_1024 pd;
76777     sp_point_1024 qd;
76778     sp_point_1024 cd;
76779 #endif
76780     sp_point_1024* p = NULL;
76781     sp_point_1024* q = NULL;
76782     sp_point_1024* c = NULL;
76783     sp_digit* r = NULL;
76784     int i;
76785     int j;
76786     int k;
76787     const sp_table_entry_1024* precomp = (const sp_table_entry_1024*)table;
76788 
76789     if (len < (int)(sizeof(sp_table_entry_1024) * 1167)) {
76790         err = BUFFER_E;
76791     }
76792 
76793     if (err == MP_OKAY) {
76794         err = sp_1024_point_new_16(NULL, pd, p);
76795     }
76796     if (err == MP_OKAY) {
76797         err = sp_1024_point_new_16(NULL, qd, q);
76798     }
76799     if (err == MP_OKAY) {
76800         err = sp_1024_point_new_16(NULL, cd, c);
76801     }
76802 
76803 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76804     !defined(WOLFSSL_SP_NO_MALLOC)
76805     if (err == MP_OKAY) {
76806         td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 16 * 2, NULL,
76807                                 DYNAMIC_TYPE_TMP_BUFFER);
76808         if (td == NULL) {
76809             err = MEMORY_E;
76810         }
76811     }
76812 #endif
76813 
76814     if (err == MP_OKAY) {
76815 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76816     !defined(WOLFSSL_SP_NO_MALLOC)
76817         t       = td;
76818         vx      = td + 6 * 16 * 2;
76819         vy      = td + 7 * 16 * 2;
76820         pre_vx  = (sp_digit(*)[32])(td + 8 * 16 * 2);
76821         pre_vy  = (sp_digit(*)[32])(td + 24 * 16 * 2);
76822         pre_nvy = (sp_digit(*)[32])(td + 40 * 16 * 2);
76823 #endif
76824         r = vy;
76825 
76826         sp_1024_point_from_ecc_point_16(p, pm);
76827         sp_1024_point_from_ecc_point_16(q, qm);
76828 
76829         err = sp_1024_mod_mul_norm_16(p->x, p->x, p1024_mod);
76830     }
76831     if (err == MP_OKAY) {
76832         err = sp_1024_mod_mul_norm_16(p->y, p->y, p1024_mod);
76833     }
76834     if (err == MP_OKAY) {
76835         err = sp_1024_mod_mul_norm_16(p->z, p->z, p1024_mod);
76836     }
76837     if (err == MP_OKAY) {
76838         err = sp_1024_mod_mul_norm_16(q->x, q->x, p1024_mod);
76839     }
76840     if (err == MP_OKAY) {
76841         err = sp_1024_mod_mul_norm_16(q->y, q->y, p1024_mod);
76842     }
76843     if (err == MP_OKAY) {
76844         /* Generate pre-computation table: 1, 3, ... , 31 */
76845         XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 16);
76846         pre_vx[0][0] = 1;
76847         XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 16);
76848         sp_1024_mont_sub_16(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
76849 
76850         /* [2]P for adding */
76851         XMEMCPY(c, p, sizeof(sp_point_1024));
76852         XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 16);
76853         vx[0] = 1;
76854         XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 16);
76855         sp_1024_accumulate_line_dbl_16(vx, vy, c, q, t);
76856 
76857         /* 3, 5, ... */
76858         for (i = 1; i < 16; i++) {
76859             XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 16);
76860             XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 16);
76861             sp_1024_proj_mul_16(pre_vx[i], pre_vy[i], vx, vy, t);
76862             sp_1024_accumulate_line_add_n_16(pre_vx[i], pre_vy[i], c,
76863                 q, p, t, 0);
76864             sp_1024_mont_sub_16(pre_nvy[i], p1024_mod, pre_vy[i],
76865                 p1024_mod);
76866         }
76867 
76868         XMEMCPY(c->z, p1024_norm_mod, sizeof(sp_digit) * 16);
76869         c->infinity = 0;
76870         j = sp_1024_order_op_pre[0] / 2;
76871         XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 16);
76872         XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 16);
76873 
76874         k = 0;
76875         for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
76876             /* Accumulate line into v and double point. */
76877             sp_1024_accumulate_line_lc_16(vx, vy, precomp[k].x,
76878                 precomp[k].y, q, t, 1);
76879             k++;
76880         }
76881 
76882         for (i = 2; i < 290; i += 2) {
76883             sp_1024_accumulate_line_lc_16(vx, vy, precomp[k].x,
76884                 precomp[k].y, q, t, 0);
76885             k++;
76886 
76887             j = sp_1024_order_op_pre[i];
76888             if (j > 0) {
76889                 j /= 2;
76890                 /* Accumulate line into v. */
76891                 sp_1024_proj_mul_16(vx, vy, pre_vx[j], pre_vy[j], t);
76892             }
76893             else {
76894                 j = -j / 2;
76895                 /* Accumulate line into v. */
76896                 sp_1024_proj_mul_16(vx, vy, pre_vx[j], pre_nvy[j], t);
76897             }
76898 
76899             for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
76900                 /* Accumulate line into v and double point. */
76901                 sp_1024_accumulate_line_lc_16(vx, vy, precomp[k].x,
76902                     precomp[k].y, q, t, 1);
76903                 k++;
76904             }
76905         }
76906 
76907         /* Final exponentiation */
76908         sp_1024_proj_sqr_16(vx, vy, t);
76909         sp_1024_proj_sqr_16(vx, vy, t);
76910 
76911         /* Convert from PF_p[q] to F_p */
76912         sp_1024_mont_inv_16(vx, vx, t);
76913         sp_1024_mont_mul_16(r, vx, vy, p1024_mod, p1024_mp_mod);
76914         XMEMSET(r + 16, 0, sizeof(sp_digit) * 16);
76915         sp_1024_mont_reduce_16(r, p1024_mod, p1024_mp_mod);
76916 
76917         err = sp_1024_to_mp(r, res);
76918     }
76919 
76920 #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
76921     !defined(WOLFSSL_SP_NO_MALLOC)
76922     if (td != NULL) {
76923         XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
76924     }
76925 #endif
76926     sp_1024_point_free_16(c, 1, NULL);
76927     sp_1024_point_free_16(q, 1, NULL);
76928     sp_1024_point_free_16(p, 1, NULL);
76929     return err;
76930 }
76931 
76932 #endif /* WOLFSSL_SP_SMALL */
76933 /* Returns 1 if the number of zero.
76934  * Implementation is constant time.
76935  *
76936  * a  Number to check.
76937  * returns 1 if the number is zero and 0 otherwise.
76938  */
sp_1024_iszero_16(const sp_digit * a)76939 static int sp_1024_iszero_16(const sp_digit* a)
76940 {
76941     return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
76942             a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15]) == 0;
76943 }
76944 
76945 #ifdef HAVE_ECC_CHECK_KEY
76946 /* Read big endian unsigned byte array into r.
76947  *
76948  * r  A single precision integer.
76949  * size  Maximum number of bytes to convert
76950  * a  Byte array.
76951  * n  Number of bytes in array to read.
76952  */
sp_1024_from_bin(sp_digit * r,int size,const byte * a,int n)76953 static void sp_1024_from_bin(sp_digit* r, int size, const byte* a, int n)
76954 {
76955     int i;
76956     int j;
76957     byte* d;
76958 
76959     for (i = n - 1,j = 0; i >= 7; i -= 8) {
76960         r[j]  = ((sp_digit)a[i - 0] <<  0) |
76961                 ((sp_digit)a[i - 1] <<  8) |
76962                 ((sp_digit)a[i - 2] << 16) |
76963                 ((sp_digit)a[i - 3] << 24) |
76964                 ((sp_digit)a[i - 4] << 32) |
76965                 ((sp_digit)a[i - 5] << 40) |
76966                 ((sp_digit)a[i - 6] << 48) |
76967                 ((sp_digit)a[i - 7] << 56);
76968         j++;
76969     }
76970 
76971     if (i >= 0) {
76972         r[j] = 0;
76973 
76974         d = (byte*)r;
76975         switch (i) {
76976             case 6: d[n - 1 - 6] = a[6]; //fallthrough
76977             case 5: d[n - 1 - 5] = a[5]; //fallthrough
76978             case 4: d[n - 1 - 4] = a[4]; //fallthrough
76979             case 3: d[n - 1 - 3] = a[3]; //fallthrough
76980             case 2: d[n - 1 - 2] = a[2]; //fallthrough
76981             case 1: d[n - 1 - 1] = a[1]; //fallthrough
76982             case 0: d[n - 1 - 0] = a[0]; //fallthrough
76983         }
76984         j++;
76985     }
76986 
76987     for (; j < size; j++) {
76988         r[j] = 0;
76989     }
76990 }
76991 
76992 /* Check that the x and y oridinates are a valid point on the curve.
76993  *
76994  * point  EC point.
76995  * heap   Heap to use if dynamically allocating.
76996  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
76997  * not on the curve and MP_OKAY otherwise.
76998  */
sp_1024_ecc_is_point_16(const sp_point_1024 * point,void * heap)76999 static int sp_1024_ecc_is_point_16(const sp_point_1024* point,
77000     void* heap)
77001 {
77002 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77003     sp_digit* t1 = NULL;
77004 #else
77005     sp_digit t1[16 * 4];
77006 #endif
77007     sp_digit* t2 = NULL;
77008     sp_int64 n;
77009     int err = MP_OKAY;
77010 
77011 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77012     t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 4, heap, DYNAMIC_TYPE_ECC);
77013     if (t1 == NULL)
77014         err = MEMORY_E;
77015 #endif
77016     (void)heap;
77017 
77018     if (err == MP_OKAY) {
77019         t2 = t1 + 2 * 16;
77020 
77021         sp_1024_sqr_16(t1, point->y);
77022         (void)sp_1024_mod_16(t1, t1, p1024_mod);
77023         sp_1024_sqr_16(t2, point->x);
77024         (void)sp_1024_mod_16(t2, t2, p1024_mod);
77025         sp_1024_mul_16(t2, t2, point->x);
77026         (void)sp_1024_mod_16(t2, t2, p1024_mod);
77027         (void)sp_1024_sub_16(t2, p1024_mod, t2);
77028         sp_1024_mont_add_16(t1, t1, t2, p1024_mod);
77029 
77030         sp_1024_mont_add_16(t1, t1, point->x, p1024_mod);
77031         sp_1024_mont_add_16(t1, t1, point->x, p1024_mod);
77032         sp_1024_mont_add_16(t1, t1, point->x, p1024_mod);
77033 
77034         n = sp_1024_cmp_16(t1, p1024_mod);
77035         sp_1024_cond_sub_16(t1, t1, p1024_mod, 0 - ((n >= 0) ?
77036             (sp_digit)1 : (sp_digit)0));
77037         sp_1024_norm_16(t1);
77038         if (!sp_1024_iszero_16(t1)) {
77039             err = MP_VAL;
77040         }
77041     }
77042 
77043 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77044     if (t1 != NULL)
77045         XFREE(t1, heap, DYNAMIC_TYPE_ECC);
77046 #endif
77047 
77048     return err;
77049 }
77050 
77051 /* Check that the x and y oridinates are a valid point on the curve.
77052  *
77053  * pX  X ordinate of EC point.
77054  * pY  Y ordinate of EC point.
77055  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
77056  * not on the curve and MP_OKAY otherwise.
77057  */
sp_ecc_is_point_1024(const mp_int * pX,const mp_int * pY)77058 int sp_ecc_is_point_1024(const mp_int* pX, const mp_int* pY)
77059 {
77060 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77061     sp_point_1024* pub = NULL;
77062 #else
77063     sp_point_1024 pub[1];
77064 #endif
77065     const byte one[1] = { 1 };
77066     int err = MP_OKAY;
77067 
77068 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77069     pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), NULL,
77070                                        DYNAMIC_TYPE_ECC);
77071     if (pub == NULL)
77072         err = MEMORY_E;
77073 #endif
77074 
77075     if (err == MP_OKAY) {
77076         sp_1024_from_mp(pub->x, 16, pX);
77077         sp_1024_from_mp(pub->y, 16, pY);
77078         sp_1024_from_bin(pub->z, 16, one, (int)sizeof(one));
77079 
77080         err = sp_1024_ecc_is_point_16(pub, NULL);
77081     }
77082 
77083 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77084     if (pub != NULL)
77085         XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
77086 #endif
77087 
77088     return err;
77089 }
77090 
77091 /* Check that the private scalar generates the EC point (px, py), the point is
77092  * on the curve and the point has the correct order.
77093  *
77094  * pX     X ordinate of EC point.
77095  * pY     Y ordinate of EC point.
77096  * privm  Private scalar that generates EC point.
77097  * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
77098  * not on the curve, ECC_INF_E if the point does not have the correct order,
77099  * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
77100  * MP_OKAY otherwise.
77101  */
sp_ecc_check_key_1024(const mp_int * pX,const mp_int * pY,const mp_int * privm,void * heap)77102 int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY,
77103     const mp_int* privm, void* heap)
77104 {
77105 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77106     sp_digit* priv = NULL;
77107     sp_point_1024* pub = NULL;
77108 #else
77109     sp_digit priv[16];
77110     sp_point_1024 pub[2];
77111 #endif
77112     sp_point_1024* p = NULL;
77113     const byte one[1] = { 1 };
77114     int err = MP_OKAY;
77115 
77116 
77117     /* Quick check the lengs of public key ordinates and private key are in
77118      * range. Proper check later.
77119      */
77120     if (((mp_count_bits(pX) > 1024) ||
77121         (mp_count_bits(pY) > 1024) ||
77122         ((privm != NULL) && (mp_count_bits(privm) > 1024)))) {
77123         err = ECC_OUT_OF_RANGE_E;
77124     }
77125 
77126 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77127     if (err == MP_OKAY) {
77128         pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
77129                                            DYNAMIC_TYPE_ECC);
77130         if (pub == NULL)
77131             err = MEMORY_E;
77132     }
77133     if (err == MP_OKAY && privm) {
77134         priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16, heap,
77135                                   DYNAMIC_TYPE_ECC);
77136         if (priv == NULL)
77137             err = MEMORY_E;
77138     }
77139 #endif
77140 
77141     if (err == MP_OKAY) {
77142         p = pub + 1;
77143 
77144         sp_1024_from_mp(pub->x, 16, pX);
77145         sp_1024_from_mp(pub->y, 16, pY);
77146         sp_1024_from_bin(pub->z, 16, one, (int)sizeof(one));
77147         if (privm)
77148             sp_1024_from_mp(priv, 16, privm);
77149 
77150         /* Check point at infinitiy. */
77151         if ((sp_1024_iszero_16(pub->x) != 0) &&
77152             (sp_1024_iszero_16(pub->y) != 0)) {
77153             err = ECC_INF_E;
77154         }
77155     }
77156 
77157     /* Check range of X and Y */
77158     if ((err == MP_OKAY) &&
77159             ((sp_1024_cmp_16(pub->x, p1024_mod) >= 0) ||
77160              (sp_1024_cmp_16(pub->y, p1024_mod) >= 0))) {
77161         err = ECC_OUT_OF_RANGE_E;
77162     }
77163 
77164     if (err == MP_OKAY) {
77165         /* Check point is on curve */
77166         err = sp_1024_ecc_is_point_16(pub, heap);
77167     }
77168 
77169     if (err == MP_OKAY) {
77170         /* Point * order = infinity */
77171             err = sp_1024_ecc_mulmod_16(p, pub, p1024_order, 1, 1, heap);
77172     }
77173     /* Check result is infinity */
77174     if ((err == MP_OKAY) && ((sp_1024_iszero_16(p->x) == 0) ||
77175                              (sp_1024_iszero_16(p->y) == 0))) {
77176         err = ECC_INF_E;
77177     }
77178 
77179     if (privm) {
77180         if (err == MP_OKAY) {
77181             /* Base * private = point */
77182                 err = sp_1024_ecc_mulmod_base_16(p, priv, 1, 1, heap);
77183         }
77184         /* Check result is public key */
77185         if ((err == MP_OKAY) &&
77186                 ((sp_1024_cmp_16(p->x, pub->x) != 0) ||
77187                  (sp_1024_cmp_16(p->y, pub->y) != 0))) {
77188             err = ECC_PRIV_KEY_E;
77189         }
77190     }
77191 
77192 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
77193     if (pub != NULL)
77194         XFREE(pub, heap, DYNAMIC_TYPE_ECC);
77195     if (priv != NULL)
77196         XFREE(priv, heap, DYNAMIC_TYPE_ECC);
77197 #endif
77198 
77199     return err;
77200 }
77201 #endif
77202 #endif /* WOLFSSL_SP_1024 */
77203 #endif /* WOLFSSL_HAVE_SP_ECC */
77204 #endif /* WOLFSSL_SP_ARM64_ASM */
77205 #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH | WOLFSSL_HAVE_SP_ECC */
77206