Whamcloud - gitweb
65bca5c32ff58aa54c5b9416b2476ce6459653e0
[tools/e2fsprogs.git] / lib / ext2fs / crc32c.c
1 /*
2  * crc32c.c
3  *
4  * August 26, 2011 Darrick J. Wong <djwong at us.ibm.com>
5  * Reuse Bob Pearson's slice-by-8 implementation for e2fsprogs.
6  *
7  * July 20, 2011 Bob Pearson <rpearson at systemfabricworks.com>
8  * added slice by 8 algorithm to the existing conventional and
9  * slice by 4 algorithms.
10  *
11  * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
12  * Nicer crc32 functions/docs submitted by linux@horizon.com.  Thanks!
13  * Code was from the public domain, copyright abandoned.  Code was
14  * subsequently included in the kernel, thus was re-licensed under the
15  * GNU GPL v2.
16  *
17  * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
18  * Same crc32 function was used in 5 other places in the kernel.
19  * I made one version, and deleted the others.
20  * There are various incantations of crc32().  Some use a seed of 0 or ~0.
21  * Some xor at the end with ~0.  The generic crc32() function takes
22  * seed as an argument, and doesn't xor at the end.  Then individual
23  * users can do whatever they need.
24  *   drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
25  *   fs/jffs2 uses seed 0, doesn't xor with ~0.
26  *   fs/partitions/efi.c uses seed ~0, xor's with ~0.
27  *
28  * This source code is licensed under the GNU General Public License,
29  * Version 2.  See the file COPYING for more details.
30  */
31 #include "config.h"
32 #include <stdint.h>
33 #include <stdlib.h>
34 #include <stdio.h>
35 #define __force
36 #define min(x, y)               ((x) > (y) ? (y) : (x))
37 #define __ALIGN_KERNEL_MASK(x, mask)    (((x) + (mask)) & ~(mask))
38 #define __ALIGN_KERNEL(x, a)    __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
39 #define ALIGN(x, a)             __ALIGN_KERNEL((x), (a))
40 #define PTR_ALIGN(p, a)         ((typeof(p))ALIGN((unsigned long)(p), (a)))
41 #include "crc32c_defs.h"
42
43 #if CRC_LE_BITS > 8
44 # define tole(x) (__force uint32_t) __constant_cpu_to_le32(x)
45 #else
46 # define tole(x) (x)
47 #endif
48
49 #if CRC_BE_BITS > 8
50 # define tobe(x) (__force uint32_t) __constant_cpu_to_be32(x)
51 #else
52 # define tobe(x) (x)
53 #endif
54
55 #include "crc32c_table.h"
56
57 #if CRC_LE_BITS == 32
58 /* slice by 4 algorithm */
59 static uint32_t crc32c_le_body(uint32_t crc, uint8_t const *buf, size_t len)
60 {
61         const uint8_t *p8;
62         const uint32_t *p32;
63         size_t init_bytes;
64         size_t words;
65         size_t end_bytes;
66         size_t i;
67         uint32_t q;
68         uint8_t i0, i1, i2, i3;
69
70         crc = (__force uint32_t) __cpu_to_le32(crc);
71
72         /* unroll loop into 'init_bytes' odd bytes followed by
73          * 'words' aligned 4 byte words followed by
74          * 'end_bytes' odd bytes at the end */
75         p8 = buf;
76         p32 = (uint32_t *)PTR_ALIGN(p8, 4);
77         init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
78         words = (len - init_bytes) >> 2;
79         end_bytes = (len - init_bytes) & 3;
80
81         for (i = 0; i < init_bytes; i++) {
82 #ifndef WORDS_BIGENDIAN
83                 i0 = *p8++ ^ crc;
84                 crc = t0_le[i0] ^ (crc >> 8);
85 #else
86                 i0 = *p8++ ^ (crc >> 24);
87                 crc = t0_le[i0] ^ (crc << 8);
88 #endif
89         }
90
91         /* using pre-increment below slightly faster */
92         p32--;
93
94         for (i = 0; i < words; i++) {
95 #ifndef WORDS_BIGENDIAN
96                 q = *++p32 ^ crc;
97                 i3 = q;
98                 i2 = q >> 8;
99                 i1 = q >> 16;
100                 i0 = q >> 24;
101                 crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
102 #else
103                 q = *++p32 ^ crc;
104                 i3 = q >> 24;
105                 i2 = q >> 16;
106                 i1 = q >> 8;
107                 i0 = q;
108                 crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
109 #endif
110         }
111
112         p8 = (uint8_t *)(++p32);
113
114         for (i = 0; i < end_bytes; i++) {
115 #ifndef WORDS_BIGENDIAN
116                 i0 = *p8++ ^ crc;
117                 crc = t0_le[i0] ^ (crc >> 8);
118 #else
119                 i0 = *p8++ ^ (crc >> 24);
120                 crc = t0_le[i0] ^ (crc << 8);
121 #endif
122         }
123
124         return __le32_to_cpu((__force __le32)crc);
125 }
126 #endif
127
128 #if CRC_BE_BITS == 32
129 static uint32_t crc32c_be_body(uint32_t crc, uint8_t const *buf, size_t len)
130 {
131         const uint8_t *p8;
132         const uint32_t *p32;
133         size_t init_bytes;
134         size_t words;
135         size_t end_bytes;
136         size_t i;
137         uint32_t q;
138         uint8_t i0, i1, i2, i3;
139
140         crc = (__force uint32_t) __cpu_to_be32(crc);
141
142         p8 = buf;
143         p32 = (uint32_t *)PTR_ALIGN(p8, 4);
144         init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
145         words = (len - init_bytes) >> 2;
146         end_bytes = (len - init_bytes) & 3;
147
148         for (i = 0; i < init_bytes; i++) {
149 #ifndef WORDS_BIGENDIAN
150                 i0 = *p8++ ^ crc;
151                 crc = t0_be[i0] ^ (crc >> 8);
152 #else
153                 i0 = *p8++ ^ (crc >> 24);
154                 crc = t0_be[i0] ^ (crc << 8);
155 #endif
156         }
157
158         p32--;
159
160         for (i = 0; i < words; i++) {
161 #ifndef WORDS_BIGENDIAN
162                 q = *++p32 ^ crc;
163                 i3 = q;
164                 i2 = q >> 8;
165                 i1 = q >> 16;
166                 i0 = q >> 24;
167                 crc = t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
168 #else
169                 q = *++p32 ^ crc;
170                 i3 = q >> 24;
171                 i2 = q >> 16;
172                 i1 = q >> 8;
173                 i0 = q;
174                 crc = t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
175 #endif
176         }
177
178         p8 = (uint8_t *)(++p32);
179
180         for (i = 0; i < end_bytes; i++) {
181 #ifndef WORDS_BIGENDIAN
182                 i0 = *p8++ ^ crc;
183                 crc = t0_be[i0] ^ (crc >> 8);
184 #else
185                 i0 = *p8++ ^ (crc >> 24);
186                 crc = t0_be[i0] ^ (crc << 8);
187 #endif
188         }
189
190         return __be32_to_cpu((__force __be32)crc);
191 }
192 #endif
193
194 #if CRC_LE_BITS == 64
195 /* slice by 8 algorithm */
196 static uint32_t crc32c_le_body(uint32_t crc, uint8_t const *buf, size_t len)
197 {
198         const uint8_t *p8;
199         const uint32_t *p32;
200         size_t init_bytes;
201         size_t words;
202         size_t end_bytes;
203         size_t i;
204         uint32_t q;
205         uint8_t i0, i1, i2, i3;
206
207         crc = (__force uint32_t) __cpu_to_le32(crc);
208
209         p8 = buf;
210         p32 = (uint32_t *)PTR_ALIGN(p8, 8);
211         init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
212         words = (len - init_bytes) >> 3;
213         end_bytes = (len - init_bytes) & 7;
214
215         for (i = 0; i < init_bytes; i++) {
216 #ifndef WORDS_BIGENDIAN
217                 i0 = *p8++ ^ crc;
218                 crc = t0_le[i0] ^ (crc >> 8);
219 #else
220                 i0 = *p8++ ^ (crc >> 24);
221                 crc = t0_le[i0] ^ (crc << 8);
222 #endif
223         }
224
225         p32--;
226
227         for (i = 0; i < words; i++) {
228 #ifndef WORDS_BIGENDIAN
229                 q = *++p32 ^ crc;
230                 i3 = q;
231                 i2 = q >> 8;
232                 i1 = q >> 16;
233                 i0 = q >> 24;
234                 crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0];
235
236                 q = *++p32;
237                 i3 = q;
238                 i2 = q >> 8;
239                 i1 = q >> 16;
240                 i0 = q >> 24;
241                 crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
242 #else
243                 q = *++p32 ^ crc;
244                 i3 = q >> 24;
245                 i2 = q >> 16;
246                 i1 = q >> 8;
247                 i0 = q;
248                 crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0];
249
250                 q = *++p32;
251                 i3 = q >> 24;
252                 i2 = q >> 16;
253                 i1 = q >> 8;
254                 i0 = q;
255                 crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
256 #endif
257         }
258
259         p8 = (uint8_t *)(++p32);
260
261         for (i = 0; i < end_bytes; i++) {
262 #ifndef WORDS_BIGENDIAN
263                 i0 = *p8++ ^ crc;
264                 crc = t0_le[i0] ^ (crc >> 8);
265 #else
266                 i0 = *p8++ ^ (crc >> 24);
267                 crc = t0_le[i0] ^ (crc << 8);
268 #endif
269         }
270
271         return __le32_to_cpu(crc);
272 }
273 #endif
274
275 #if CRC_BE_BITS == 64
276 static uint32_t crc32c_be_body(uint32_t crc, uint8_t const *buf, size_t len)
277 {
278         const uint8_t *p8;
279         const uint32_t *p32;
280         size_t init_bytes;
281         size_t words;
282         size_t end_bytes;
283         size_t i;
284         uint32_t q;
285         uint8_t i0, i1, i2, i3;
286
287         crc = (__force uint32_t) __cpu_to_be32(crc);
288
289         p8 = buf;
290         p32 = (uint32_t *)PTR_ALIGN(p8, 8);
291         init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
292         words = (len - init_bytes) >> 3;
293         end_bytes = (len - init_bytes) & 7;
294
295         for (i = 0; i < init_bytes; i++) {
296 #ifndef WORDS_BIGENDIAN
297                 i0 = *p8++ ^ crc;
298                 crc = t0_be[i0] ^ (crc >> 8);
299 #else
300                 i0 = *p8++ ^ (crc >> 24);
301                 crc = t0_be[i0] ^ (crc << 8);
302 #endif
303         }
304
305         p32--;
306
307         for (i = 0; i < words; i++) {
308 #ifndef WORDS_BIGENDIAN
309                 q = *++p32 ^ crc;
310                 i3 = q;
311                 i2 = q >> 8;
312                 i1 = q >> 16;
313                 i0 = q >> 24;
314                 crc = t7_be[i3] ^ t6_be[i2] ^ t5_be[i1] ^ t4_be[i0];
315
316                 q = *++p32;
317                 i3 = q;
318                 i2 = q >> 8;
319                 i1 = q >> 16;
320                 i0 = q >> 24;
321                 crc ^= t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
322 #else
323                 q = *++p32 ^ crc;
324                 i3 = q >> 24;
325                 i2 = q >> 16;
326                 i1 = q >> 8;
327                 i0 = q;
328                 crc = t7_be[i3] ^ t6_be[i2] ^ t5_be[i1] ^ t4_be[i0];
329
330                 q = *++p32;
331                 i3 = q >> 24;
332                 i2 = q >> 16;
333                 i1 = q >> 8;
334                 i0 = q;
335                 crc ^= t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
336 #endif
337         }
338
339         p8 = (uint8_t *)(++p32);
340
341         for (i = 0; i < end_bytes; i++) {
342 #ifndef WORDS_BIGENDIAN
343                 i0 = *p8++ ^ crc;
344                 crc = t0_be[i0] ^ (crc >> 8);
345 #else
346                 i0 = *p8++ ^ (crc >> 24);
347                 crc = t0_be[i0] ^ (crc << 8);
348 #endif
349         }
350
351         return __be32_to_cpu(crc);
352 }
353 #endif
354
355 /**
356  * crc32c_le() - Calculate bitwise little-endian CRC32c.
357  * @crc: seed value for computation.  ~0 for ext4, sometimes 0 for
358  *      other uses, or the previous crc32c value if computing incrementally.
359  * @p: pointer to buffer over which CRC is run
360  * @len: length of buffer @p
361  */
362 uint32_t ext2fs_crc32c_le(uint32_t crc, unsigned char const *p, size_t len)
363 {
364 #if CRC_LE_BITS == 1
365         int i;
366         while (len--) {
367                 crc ^= *p++;
368                 for (i = 0; i < 8; i++)
369                         crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
370         }
371 # elif CRC_LE_BITS == 2
372         while (len--) {
373                 crc ^= *p++;
374                 crc = (crc >> 2) ^ t0_le[crc & 0x03];
375                 crc = (crc >> 2) ^ t0_le[crc & 0x03];
376                 crc = (crc >> 2) ^ t0_le[crc & 0x03];
377                 crc = (crc >> 2) ^ t0_le[crc & 0x03];
378         }
379 # elif CRC_LE_BITS == 4
380         while (len--) {
381                 crc ^= *p++;
382                 crc = (crc >> 4) ^ t0_le[crc & 0x0f];
383                 crc = (crc >> 4) ^ t0_le[crc & 0x0f];
384         }
385 # elif CRC_LE_BITS == 8
386         while (len--) {
387                 crc ^= *p++;
388                 crc = (crc >> 8) ^ t0_le[crc & 0xff];
389         }
390 # else
391         crc = crc32c_le_body(crc, p, len);
392 # endif
393         return crc;
394 }
395
396 /**
397  * crc32c_be() - Calculate bitwise big-endian CRC32c.
398  * @crc: seed value for computation.  ~0 for ext4, sometimes 0 for
399  *      other uses, or the previous crc32c value if computing incrementally.
400  * @p: pointer to buffer over which CRC is run
401  * @len: length of buffer @p
402  */
403 uint32_t ext2fs_crc32c_be(uint32_t crc, unsigned char const *p, size_t len)
404 {
405 #if CRC_BE_BITS == 1
406         int i;
407         while (len--) {
408                 crc ^= *p++ << 24;
409                 for (i = 0; i < 8; i++)
410                         crc = (crc << 1) ^
411                               ((crc & 0x80000000) ? CRCPOLY_BE : 0);
412         }
413 # elif CRC_BE_BITS == 2
414         while (len--) {
415                 crc ^= *p++ << 24;
416                 crc = (crc << 2) ^ t0_be[crc >> 30];
417                 crc = (crc << 2) ^ t0_be[crc >> 30];
418                 crc = (crc << 2) ^ t0_be[crc >> 30];
419                 crc = (crc << 2) ^ t0_be[crc >> 30];
420         }
421 # elif CRC_BE_BITS == 4
422         while (len--) {
423                 crc ^= *p++ << 24;
424                 crc = (crc << 4) ^ t0_be[crc >> 28];
425                 crc = (crc << 4) ^ t0_be[crc >> 28];
426         }
427 # elif CRC_BE_BITS == 8
428         while (len--) {
429                 crc ^= *p++ << 24;
430                 crc = (crc << 8) ^ t0_be[crc >> 24];
431         }
432 # else
433         crc = crc32c_be_body(crc, p, len);
434 # endif
435         return crc;
436 }
437
438 #ifdef UNITTEST
439 static uint8_t test_buf[] = {
440         0xd9, 0xd7, 0x6a, 0x13, 0x3a, 0xb1, 0x05, 0x48,
441         0xda, 0xad, 0x14, 0xbd, 0x03, 0x3a, 0x58, 0x5e,
442         0x6e, 0xd1, 0x56, 0xc9, 0x2e, 0xc4, 0xcb, 0x6b,
443         0xe8, 0x77, 0x52, 0x37, 0x4e, 0x0f, 0x55, 0xd2,
444         0x12, 0x65, 0x90, 0xc2, 0x41, 0x49, 0x81, 0x01,
445         0xf5, 0x01, 0xeb, 0x2d, 0x78, 0x74, 0x23, 0x5d,
446         0x84, 0x5c, 0x81, 0x92, 0x21, 0xe9, 0x8d, 0x1d,
447         0x89, 0xf2, 0x4a, 0xac, 0xdd, 0xf9, 0xaf, 0xee,
448         0x44, 0xe7, 0x6e, 0xed, 0xfb, 0xd8, 0x89, 0x0e,
449         0x96, 0x62, 0xcd, 0xa4, 0x4b, 0xa9, 0xe5, 0x45,
450         0xb1, 0x29, 0x9b, 0x0f, 0xfc, 0xbd, 0x83, 0xab,
451         0xa8, 0x54, 0x96, 0x44, 0x2c, 0x7f, 0xbb, 0xe7,
452         0x52, 0x29, 0x08, 0xee, 0x14, 0xc5, 0xc2, 0xec,
453         0x5a, 0xeb, 0x40, 0x40, 0xea, 0xd1, 0x3d, 0x15,
454         0x73, 0xaa, 0x8c, 0x73, 0xfc, 0xf2, 0x2b, 0x49,
455         0x0b, 0x13, 0x96, 0xd9, 0x8e, 0x4b, 0xbc, 0xe0,
456         0xf4, 0xd2, 0xe0, 0x2e, 0x7a, 0xf0, 0x5d, 0x1f,
457         0xd2, 0x92, 0x97, 0xe0, 0xaa, 0x59, 0xab, 0xc9,
458         0x5c, 0xa6, 0x51, 0x1a, 0xe3, 0xd6, 0x06, 0xb9,
459         0xae, 0xb8, 0x76, 0x36, 0x79, 0x37, 0x52, 0xf6,
460         0x34, 0xaf, 0x27, 0x19, 0xe1, 0xc0, 0x2b, 0xdd,
461         0x01, 0x15, 0xcd, 0xce, 0x44, 0xf6, 0x4c, 0x18,
462         0x92, 0x69, 0xbe, 0x8a, 0x76, 0x23, 0x52, 0x13,
463         0x3f, 0xf9, 0xe0, 0xf5, 0x06, 0x28, 0x7c, 0xc7,
464         0xf3, 0x42, 0x0f, 0xdd, 0x40, 0x33, 0xf7, 0x99,
465         0xe2, 0xad, 0x26, 0xd9, 0x53, 0x10, 0x72, 0x0c,
466         0x4e, 0x43, 0x4c, 0x61, 0xfe, 0xd9, 0xc1, 0x16,
467         0xa1, 0x93, 0xca, 0x3c, 0x75, 0x7f, 0x07, 0x7a,
468         0x65, 0xb3, 0x53, 0x2a, 0x52, 0x00, 0xa0, 0x62,
469         0xe0, 0xa3, 0x1f, 0xad, 0xd7, 0xbb, 0xc0, 0x83,
470         0x5d, 0x54, 0x87, 0x5f, 0xc8, 0x2f, 0xc8, 0xbf,
471         0x69, 0x04, 0x91, 0xc8, 0xa6, 0x1d, 0x4d, 0x46,
472         0x91, 0xfc, 0x26, 0xf4, 0x16, 0xd1, 0xa4, 0xbf,
473         0x5c, 0xa2, 0x6c, 0xdd, 0xb4, 0x40, 0xf2, 0x2e,
474         0xa2, 0xad, 0xf7, 0xf4, 0xa5, 0x8a, 0x3e, 0x23,
475         0x64, 0x08, 0xc8, 0xa1, 0xa0, 0xf0, 0x5d, 0x70,
476         0xd2, 0x77, 0xfd, 0xc8, 0x50, 0x83, 0x0f, 0xd6,
477         0x2b, 0xe4, 0x1f, 0x52, 0x34, 0x33, 0x68, 0xfd,
478         0x92, 0xbe, 0x9f, 0x97, 0x6b, 0x8d, 0x81, 0x91,
479         0x0f, 0xef, 0x65, 0xc8, 0x0d, 0x15, 0x01, 0x77,
480         0x58, 0xb2, 0xf4, 0x1b, 0x06, 0x7e, 0xf5, 0xca,
481         0x15, 0x2e, 0x38, 0xd8, 0x81, 0x1c, 0x1c, 0xa0,
482         0xb6, 0x13, 0x6a, 0x2b, 0x71, 0x34, 0x52, 0xd7,
483         0x1d, 0xbd, 0x37, 0x59, 0xbc, 0x86, 0x25, 0x2b,
484         0xa8, 0x93, 0xce, 0x1a, 0x03, 0x16, 0xfe, 0x01,
485         0x57, 0x99, 0x24, 0x25, 0x2c, 0xb3, 0xab, 0x1e,
486         0x2d, 0x65, 0x20, 0x89, 0x17, 0x02, 0x0e, 0x0a,
487         0xf5, 0x1e, 0xc7, 0xff, 0x1f, 0x61, 0xa9, 0x54,
488         0x18, 0xd4, 0xba, 0x50, 0x57, 0x02, 0xa1, 0xab,
489         0x22, 0x2e, 0x07, 0xea, 0xa9, 0xa3, 0x83, 0x4f,
490         0x27, 0xf5, 0xc5, 0xee, 0x3c, 0x3b, 0x10, 0xad,
491         0x32, 0x2b, 0x1c, 0x03, 0xcb, 0xaf, 0x98, 0x83,
492         0x54, 0xc3, 0x68, 0x63, 0xd4, 0xe0, 0x0e, 0x3c,
493         0x1a, 0x4e, 0xc0, 0x81, 0xd0, 0xe8, 0x6a, 0x62,
494         0x6b, 0x3e, 0x6f, 0xc4, 0xc6, 0x33, 0x4e, 0x26,
495         0x21, 0xf5, 0x04, 0xdf, 0xfa, 0xce, 0x45, 0xaf,
496         0xdc, 0x5e, 0x1b, 0xad, 0x93, 0xca, 0xf5, 0xcf,
497         0xd7, 0xee, 0x0c, 0x5c, 0x5e, 0xb4, 0xf0, 0x92,
498         0xd2, 0xf2, 0xf0, 0xa9, 0x1e, 0xab, 0x80, 0x68,
499         0x46, 0xef, 0xcc, 0x26, 0x0c, 0x5c, 0xdd, 0x4e,
500         0x83, 0xb8, 0xb9, 0x53, 0x6e, 0xf8, 0x93, 0x38,
501         0x67, 0xa4, 0x41, 0x87, 0x72, 0xe7, 0x7e, 0x86,
502         0xc9, 0x49, 0x00, 0x33, 0xb1, 0x38, 0x6c, 0x71,
503         0xd7, 0x1d, 0x8e, 0x61, 0x01, 0xb6, 0x57, 0xa9,
504         0xf1, 0xac, 0x15, 0xc2, 0x83, 0x77, 0xca, 0x64,
505         0xca, 0x7b, 0x6c, 0xa1, 0x10, 0x1b, 0x13, 0xd0,
506         0xd3, 0x9e, 0x9e, 0x10, 0x70, 0xc8, 0x1a, 0xbb,
507         0x3f, 0x19, 0x86, 0xab, 0x01, 0x0e, 0xea, 0x34,
508         0x22, 0xea, 0xe2, 0x15, 0xb7, 0xed, 0x21, 0x21,
509         0x75, 0xa5, 0xe7, 0x08, 0xa1, 0x38, 0xe0, 0x91,
510         0x05, 0x60, 0xea, 0xa7, 0x50, 0x27, 0x18, 0x07,
511         0x9d, 0xe0, 0x18, 0x2b, 0xd4, 0x07, 0x59, 0x00,
512         0xe6, 0x45, 0x18, 0x2a, 0x30, 0x6e, 0xf3, 0xb4,
513         0xd0, 0xef, 0xa6, 0x5b, 0x71, 0xa2, 0x5a, 0x3b,
514         0x89, 0x4c, 0xaf, 0x3f, 0xcb, 0x9f, 0x03, 0xfb,
515         0x43, 0x7c, 0x6b, 0xd3, 0x6a, 0xea, 0xce, 0x4a,
516         0x5f, 0x64, 0xb5, 0x62, 0xda, 0x5d, 0x27, 0xb7,
517         0xb8, 0x11, 0xca, 0x33, 0x30, 0xec, 0x70, 0xf0,
518         0x1b, 0x03, 0x50, 0xff, 0x5e, 0xa6, 0x08, 0xde,
519         0x37, 0x70, 0xc0, 0x81, 0x55, 0x60, 0x17, 0xa1,
520         0x85, 0xae, 0x26, 0x44, 0xe4, 0x67, 0x3c, 0x91,
521         0xfd, 0xc4, 0x3d, 0x97, 0x72, 0x23, 0xf3, 0x3c,
522         0x8f, 0xe0, 0xe2, 0xf2, 0x09, 0x96, 0x10, 0x67,
523         0xb5, 0xfe, 0xff, 0x3d, 0x4a, 0xc8, 0x62, 0x11,
524         0xa5, 0x98, 0xc1, 0x2d, 0x40, 0x82, 0x88, 0x8b,
525         0xe5, 0xb0, 0x75, 0xbf, 0x2f, 0xa8, 0x6a, 0x55,
526         0x49, 0x2e, 0x9c, 0x29, 0xd2, 0x7c, 0xbf, 0xf3,
527         0xaa, 0x3a, 0x16, 0x4a, 0xa4, 0x15, 0xf3, 0x48,
528         0xde, 0x38, 0x13, 0x44, 0x26, 0x02, 0xe6, 0xe9,
529         0xa8, 0x24, 0x89, 0xb5, 0x43, 0x95, 0xe4, 0x4c,
530         0xc3, 0xa0, 0xdf, 0xcc, 0x42, 0xf8, 0x8d, 0xb0,
531         0x3b, 0xea, 0x10, 0xb7, 0xe1, 0x40, 0x54, 0xb9,
532         0xa3, 0x2d, 0xfb, 0xb4, 0x91, 0xc0, 0x3e, 0x94,
533         0xf1, 0xa1, 0x3c, 0xbe, 0xef, 0xb8, 0x70, 0x55,
534         0x0a, 0x26, 0x93, 0xbf, 0xe6, 0x21, 0x92, 0x32,
535         0x3c, 0x39, 0x27, 0x6a, 0x23, 0x48, 0x02, 0x35,
536         0x3c, 0xd4, 0xcc, 0x04, 0xc0, 0x4e, 0xa7, 0x02,
537         0x63, 0x37, 0xc2, 0xb8, 0x56, 0x1d, 0x57, 0x57,
538         0x42, 0x04, 0x8d, 0xee, 0xcf, 0x8b, 0xc9, 0xc3,
539         0xba, 0x3b, 0x15, 0xd7, 0xaf, 0xbf, 0x9e, 0xcd,
540         0x44, 0xcf, 0xf0, 0x00, 0xb7, 0x3a, 0xfc, 0xa8,
541         0x12, 0xab, 0x3a, 0x62, 0x01, 0x21, 0x46, 0xe9,
542         0x1e, 0x48, 0x37, 0xfc, 0x13, 0x4d, 0xf6, 0x2a,
543         0x72, 0x40, 0x75, 0x38, 0x71, 0xf2, 0x17, 0x20,
544         0x2c, 0xdd, 0xc0, 0x49, 0xbc, 0x63, 0x33, 0xea,
545         0x06, 0x75, 0x41, 0xe7, 0x5c, 0x1f, 0xfb, 0xf9,
546         0x68, 0x83, 0xc2, 0x5a, 0x4a, 0x1e, 0x61, 0x08,
547         0x57, 0xf3, 0x00, 0xba, 0x77, 0x92, 0x63, 0xa5,
548         0xb7, 0xfe, 0x97, 0x22, 0xda, 0x5e, 0xd3, 0xaf,
549         0xbc, 0x89, 0x0d, 0x4c, 0x37, 0xa9, 0x27, 0x4a,
550         0x7f, 0xdb, 0x81, 0x39, 0x11, 0x86, 0x12, 0xf9,
551         0x10, 0x50, 0xe4, 0xdb, 0x72, 0xf9, 0xae, 0x10,
552         0x7c, 0xed, 0x50, 0x5c, 0x61, 0xeb, 0x42, 0x1e,
553         0xa4, 0xf4, 0xf0, 0xfa, 0x45, 0x4d, 0x95, 0x2b,
554         0xd4, 0x67, 0x4a, 0xe3, 0x8a, 0x15, 0x55, 0x92,
555         0x77, 0x64, 0x8c, 0x51, 0x38, 0xf9, 0x26, 0x3e,
556         0x68, 0xe2, 0xac, 0xbb, 0x64, 0x77, 0xe2, 0x82,
557         0xa4, 0x42, 0x41, 0x38, 0xa0, 0xf0, 0xc9, 0xd8,
558         0x6c, 0xe0, 0xef, 0x4c, 0xda, 0xb4, 0x92, 0xef,
559         0x1b, 0xe3, 0x9b, 0xc1, 0x44, 0x3c, 0xb9, 0xb7,
560         0x39, 0xac, 0x5c, 0x32, 0x39, 0xb4, 0x21, 0x85,
561         0x93, 0xbc, 0xf2, 0x51, 0x43, 0xb7, 0xae, 0x1e,
562         0x61, 0x9c, 0x38, 0x9c, 0xaa, 0xff, 0xde, 0xfc,
563         0xbf, 0x85, 0xef, 0x17, 0x34, 0x36, 0x71, 0x5f,
564         0x04, 0x16, 0xa6, 0x9e, 0xfd, 0x3a, 0x03, 0xd8,
565         0xbf, 0x71, 0x70, 0x20, 0x8f, 0x7c, 0xfb, 0xff,
566         0x61, 0xe0, 0xe2, 0x60, 0xa7, 0xb1, 0xc0, 0xe0,
567         0xd9, 0x3f, 0xdc, 0x8d, 0x4a, 0xa4, 0x52, 0x61,
568         0xaf, 0x9d, 0xdf, 0x8a, 0x0d, 0x41, 0xc0, 0x25,
569         0x68, 0x12, 0x7b, 0xd5, 0xc7, 0xdb, 0x68, 0x70,
570         0x2d, 0x7d, 0x95, 0x12, 0x03, 0x23, 0x0c, 0xe8,
571         0x14, 0x41, 0x11, 0x28, 0xec, 0x9d, 0xd3, 0x28,
572         0x77, 0x7a, 0x3c, 0x93, 0x8e, 0x5c, 0x7e, 0xb3,
573         0x42, 0x9a, 0x18, 0x25, 0x93, 0xc8, 0xea, 0x43,
574         0x1b, 0xbe, 0xd5, 0x27, 0xf1, 0xd4, 0xe0, 0x1e,
575         0xce, 0xc7, 0xc7, 0x2c, 0x25, 0x35, 0x58, 0xb8,
576         0x6c, 0xf3, 0xa2, 0xad, 0xe7, 0x58, 0x49, 0x47,
577         0xf7, 0xca, 0xde, 0x8b, 0x81, 0xb7, 0x75, 0xf4,
578         0x95, 0xa7, 0x5c, 0xc3, 0x2c, 0x0e, 0x1c, 0x52,
579         0x9a, 0xc3, 0x2a, 0x00, 0x21, 0xa7, 0x51, 0x6b,
580         0xf0, 0x05, 0x87, 0x8c, 0x42, 0x1b, 0xc3, 0x2e,
581         0xa3, 0x76, 0x22, 0xd5, 0x7f, 0x56, 0x10, 0xef,
582         0x98, 0x85, 0x65, 0x86, 0x71, 0x87, 0xd2, 0x8c,
583         0xc0, 0x47, 0x20, 0xe8, 0xb5, 0x1c, 0xe3, 0xdd,
584         0x3c, 0x5c, 0x03, 0xbb, 0x0e, 0x97, 0x3b, 0xe1,
585         0x56, 0x9a, 0xd5, 0x0a, 0x63, 0xd5, 0x33, 0xaf,
586         0x36, 0xca, 0xcf, 0x8f, 0x00, 0x28, 0xa3, 0x45,
587         0xb8, 0xcd, 0xde, 0x73, 0xd4, 0xfa, 0x2d, 0x6f,
588         0xdb, 0x93, 0xaa, 0xdd, 0x7f, 0xd2, 0x22, 0x9c,
589         0x96, 0x48, 0x1e, 0xa8, 0x63, 0xbe, 0xbc, 0x0d,
590         0x14, 0x3c, 0x2e, 0x11, 0x1f, 0xd2, 0xf4, 0x57,
591         0xb3, 0x47, 0xf8, 0xa6, 0x1b, 0xc3, 0xa7, 0x95,
592         0x2d, 0xd4, 0xca, 0xb8, 0x0d, 0xfb, 0x06, 0x85,
593         0xda, 0x63, 0xf0, 0x3e, 0x9d, 0x5e, 0xee, 0xce,
594         0xed, 0x74, 0x1d, 0x2c, 0x97, 0x3f, 0x71, 0x95,
595         0x12, 0x03, 0xc5, 0x92, 0x46, 0x84, 0x1b, 0x07,
596         0xe6, 0xb4, 0x1d, 0x3a, 0xf1, 0x89, 0x90, 0x50,
597         0x10, 0x29, 0x34, 0xc0, 0x90, 0xbe, 0x4a, 0xa9,
598         0x0d, 0xb0, 0x7b, 0xfb, 0x35, 0xee, 0x4e, 0x34,
599         0xec, 0x5a, 0x58, 0xbc, 0xb8, 0xda, 0x38, 0x88,
600         0x8c, 0x74, 0x1e, 0xc9, 0xab, 0x78, 0x2e, 0x2a,
601         0x17, 0x8a, 0x43, 0x3d, 0xa1, 0x2a, 0x41, 0xb5,
602         0xd6, 0xe8, 0x5b, 0xc5, 0x4a, 0x1c, 0x3c, 0x9f,
603         0x8d, 0x3a, 0x69, 0x88, 0xf8, 0x80, 0xd2, 0x11,
604         0xfc, 0x7e, 0x80, 0x8e, 0x7f, 0x85, 0x64, 0x9c,
605         0x46, 0x58, 0xc8, 0x48, 0x98, 0x4b, 0xf5, 0x73,
606         0x3f, 0x49, 0xce, 0x53, 0x2c, 0xd5, 0xfc, 0x33,
607         0xf1, 0x6f, 0xd8, 0xe9, 0x2e, 0x70, 0x2e, 0xdc,
608         0xe5, 0x43, 0x80, 0x38, 0xf2, 0x87, 0xed, 0x85,
609         0xe4, 0x3e, 0x45, 0x14, 0x20, 0xcf, 0xa0, 0x61,
610         0x4f, 0xe8, 0xd7, 0x5b, 0xb3, 0x0d, 0x0e, 0x4e,
611         0x4d, 0xce, 0xbe, 0xba, 0xaa, 0x90, 0x09, 0xcb,
612         0x4b, 0x5d, 0x08, 0xff, 0x52, 0xd5, 0x23, 0xbc,
613         0xad, 0x8d, 0xd3, 0x06, 0x4a, 0xa0, 0x51, 0x56,
614         0xa7, 0xd8, 0x33, 0xab, 0xbc, 0xd0, 0xdf, 0x92,
615         0x87, 0x20, 0x2d, 0x7b, 0x5e, 0xfa, 0x30, 0xa7,
616         0x06, 0x06, 0xe5, 0x4f, 0x2c, 0xb5, 0x61, 0xd7,
617         0x54, 0xd3, 0xdf, 0xd0, 0x0a, 0xb0, 0x06, 0xce,
618         0xf6, 0x86, 0xb7, 0x8e, 0xaa, 0x7b, 0x78, 0xd5,
619         0xb9, 0xeb, 0x07, 0xac, 0x5f, 0xc5, 0xd2, 0x8c,
620         0x40, 0xe0, 0x7f, 0x98, 0xd4, 0xe5, 0x4b, 0xca,
621         0xfb, 0x47, 0xef, 0xef, 0xb9, 0x4d, 0x6d, 0x8f,
622         0x82, 0x68, 0x74, 0x84, 0xe0, 0x0a, 0x93, 0x0f,
623         0xb2, 0x01, 0xa9, 0x9f, 0x68, 0x6a, 0xe8, 0xf7,
624         0xfb, 0x0b, 0xde, 0x17, 0xe0, 0x30, 0x38, 0x51,
625         0xbc, 0x07, 0xb8, 0x2c, 0x91, 0x0f, 0xc1, 0x0e,
626         0xa6, 0xf9, 0xf0, 0xd5, 0x48, 0x76, 0x8a, 0xde,
627         0x74, 0xe3, 0x30, 0x65, 0x56, 0xb3, 0x5c, 0xe2,
628         0x89, 0x8d, 0xda, 0x80, 0xad, 0x0f, 0x22, 0xfb,
629         0x24, 0x1d, 0x16, 0xdd, 0x34, 0x4b, 0x90, 0x58,
630         0x4e, 0x0c, 0x13, 0x28, 0xcf, 0x1d, 0xa4, 0xaa,
631         0xb7, 0xf3, 0xb1, 0x66, 0xad, 0x3b, 0xcf, 0x79,
632         0x12, 0x04, 0xd7, 0x79, 0xd9, 0x5f, 0xdf, 0x89,
633         0xb2, 0x5b, 0xa7, 0x9a, 0x26, 0x1e, 0x67, 0x46,
634         0x7c, 0x66, 0x95, 0x67, 0xe6, 0x45, 0x8b, 0x1f,
635         0x65, 0x79, 0x9f, 0x6d, 0x11, 0x81, 0x17, 0x0d,
636         0x11, 0xb0, 0x5c, 0xb4, 0xc7, 0x27, 0x87, 0xab,
637         0x5d, 0x0a, 0x18, 0xae, 0x4e, 0x06, 0xa3, 0x3d,
638         0xc7, 0xb0, 0x22, 0xba, 0x03, 0xa4, 0x0f, 0xe5,
639         0x1c, 0x72, 0x2a, 0x04, 0xce, 0x83, 0xe9, 0xf3,
640         0xd7, 0xc9, 0x67, 0x6c, 0x1e, 0x6b, 0x3c, 0x9b,
641         0x0b, 0x5e, 0x6a, 0xa6, 0x79, 0x0a, 0xf1, 0xbe,
642         0xd7, 0xb4, 0x6f, 0x45, 0x1e, 0xfb, 0x78, 0x97,
643         0xaf, 0x34, 0x76, 0x95, 0x52, 0xf7, 0x3d, 0x5d,
644         0x07, 0x28, 0x57, 0x9c, 0x4a, 0x0f, 0xcf, 0x0b,
645         0x1b, 0xc4, 0xc2, 0x72, 0xd7, 0x72, 0x38, 0x9b,
646         0xea, 0xeb, 0xee, 0xae, 0x34, 0xc8, 0x01, 0xd7,
647         0xa5, 0xe3, 0xce, 0x41, 0xad, 0x02, 0x60, 0x23,
648         0x18, 0x36, 0xba, 0x17, 0xfa, 0xcf, 0xe4, 0xda,
649         0xdc, 0xfc, 0x82, 0xdc, 0x7c, 0x11, 0xf4, 0xb8,
650         0x52, 0x5d, 0xf7, 0x2f, 0xc8, 0xfe, 0x4a, 0xe6,
651         0xb9, 0xaf, 0x4b, 0x17, 0x18, 0x91, 0xc2, 0xfe,
652         0xd7, 0x3a, 0x77, 0x0c, 0xa0, 0x43, 0x9c, 0x6f,
653         0x13, 0x06, 0xbe, 0x6e, 0xe0, 0x1a, 0x3c, 0xf3,
654         0xf5, 0xcc, 0x78, 0xfb, 0x5d, 0xd5, 0xda, 0xb7,
655         0x58, 0xea, 0x86, 0x42, 0x6b, 0x32, 0xff, 0xb2,
656         0xe2, 0xee, 0x03, 0x1f, 0xf4, 0xef, 0xdb, 0x53,
657         0x79, 0xd5, 0x4e, 0xaf, 0x60, 0x8e, 0x02, 0xc2,
658         0xcc, 0x39, 0x97, 0x7b, 0xfd, 0xa1, 0xf8, 0x7a,
659         0x26, 0xe8, 0x55, 0xd6, 0xa4, 0x8b, 0xa0, 0x1b,
660         0x2d, 0x63, 0xaa, 0x73, 0x71, 0x6e, 0xbf, 0x8b,
661         0x3b, 0xe3, 0x1b, 0x0d, 0xbb, 0x2e, 0x44, 0x09,
662         0x64, 0xac, 0xc7, 0x9e, 0xb5, 0xc6, 0x77, 0xb0,
663         0x79, 0xb3, 0xaa, 0xfc, 0x67, 0x57, 0x9a, 0x50,
664         0x81, 0x37, 0x14, 0x7c, 0xd7, 0xa0, 0xd4, 0x6a,
665         0x79, 0x84, 0x51, 0x0e, 0x95, 0x0a, 0x30, 0xa3,
666         0x60, 0x55, 0x48, 0x05, 0x16, 0xae, 0x43, 0x90,
667         0xdc, 0x8e, 0x09, 0xbe, 0x79, 0xf6, 0x90, 0x74,
668         0xf8, 0x20, 0x96, 0x4d, 0xa7, 0xf5, 0x1a, 0x2b,
669         0xc7, 0x15, 0x9d, 0x18, 0xf7, 0x94, 0x87, 0xf7,
670         0xf4, 0xfb, 0x0d, 0x61, 0xb6, 0xd7, 0xbe, 0x10,
671         0x8e, 0x47, 0x3c, 0x10, 0x44, 0x90, 0x52, 0x21,
672         0x83, 0xc0, 0xf5, 0x99, 0xaa, 0xbc, 0xf6, 0x55,
673         0xae, 0xf5, 0xb2, 0xa4, 0xcd, 0x4d, 0xb9, 0x38,
674         0x6c, 0xbc, 0x80, 0xc3, 0xad, 0xf4, 0x46, 0x31,
675         0x01, 0x58, 0x2d, 0x88, 0x57, 0xc3, 0x23, 0xd1,
676         0x64, 0xc9, 0xa3, 0x21, 0x6b, 0x8b, 0x8a, 0x23,
677         0x2c, 0x4f, 0xa9, 0xcd, 0x67, 0xfa, 0x77, 0xad,
678         0xa3, 0x16, 0xa2, 0xe5, 0x19, 0x14, 0x70, 0x41,
679         0x5b, 0xda, 0x14, 0xde, 0xe3, 0xe5, 0xc1, 0x15,
680         0xb4, 0x77, 0xa4, 0x9b, 0xb8, 0xb1, 0x28, 0x51,
681         0x30, 0xb4, 0xf1, 0xf3, 0xf8, 0x6d, 0xd0, 0xc3,
682         0x8c, 0x4c, 0x76, 0xb0, 0x9a, 0xdf, 0xc8, 0xbe,
683         0xf8, 0x4a, 0x61, 0x6e, 0x3e, 0xd6, 0x3c, 0xe8,
684         0xde, 0x56, 0xa0, 0x9c, 0x25, 0xbe, 0xce, 0x93,
685         0x1f, 0x88, 0xfb, 0x9a, 0x1a, 0xe2, 0xff, 0x88,
686         0xad, 0x10, 0xcb, 0x6c, 0xd6, 0xe7, 0x39, 0x0b,
687         0xe5, 0x1a, 0x06, 0x05, 0x64, 0x5b, 0x0a, 0xdf,
688         0x22, 0x58, 0xd7, 0xfb, 0x88, 0x12, 0xdd, 0xb7,
689         0x52, 0x3a, 0xc9, 0xbf, 0x49, 0xdf, 0x8c, 0x87,
690         0x9f, 0x84, 0xb5, 0x0a, 0xf6, 0x00, 0x52, 0xae,
691         0x67, 0x12, 0x1a, 0x8c, 0x71, 0x15, 0xf5, 0xa1,
692         0x13, 0x39, 0xf0, 0x91, 0x7e, 0x88, 0x7c, 0xb3,
693         0x95, 0x50, 0x02, 0xa6, 0x63, 0xb5, 0x64, 0xfb,
694         0x90, 0x87, 0x61, 0xe2, 0x27, 0xaf, 0x11, 0x0c,
695         0x73, 0x83, 0xef, 0xa9, 0x28, 0xfe, 0xc8, 0x85,
696         0x1a, 0x3a, 0xde, 0xf2, 0xe5, 0x25, 0x64, 0x6d,
697         0xaa, 0x41, 0x4c, 0x80, 0x2e, 0x84, 0xff, 0xc1,
698         0xc0, 0x54, 0x0c, 0x29, 0x1b, 0xa3, 0x07, 0x7c,
699         0x33, 0x4c, 0x10, 0xf6, 0x6f, 0x79, 0xdf, 0xd3,
700         0xf0, 0x24, 0x57, 0xf1, 0x60, 0xe1, 0xf0, 0xbd,
701         0xc4, 0x1f, 0xf4, 0x67, 0xd2, 0xd3, 0xcc, 0x6a,
702         0x07, 0x72, 0x44, 0x16, 0x85, 0x46, 0xd0, 0x73,
703         0x87, 0xa9, 0xc7, 0x2f, 0xd1, 0xf5, 0xec, 0xe3,
704         0x28, 0xa3, 0x93, 0x4f, 0xd7, 0x76, 0xc1, 0x3c,
705         0x0d, 0x13, 0x33, 0xcf, 0x5b, 0xbd, 0x6a, 0x52,
706         0x4e, 0xee, 0xc8, 0x5e, 0xa1, 0x58, 0x4a, 0x08,
707         0x81, 0xd9, 0x23, 0xcc, 0xfb, 0x1c, 0xb2, 0xd8,
708         0xa3, 0xe4, 0x53, 0xfe, 0xf4, 0x4b, 0x48, 0xc1,
709         0x20, 0xa4, 0x97, 0xf8, 0x38, 0xa3, 0x69, 0xc1,
710         0x11, 0xf0, 0xa1, 0x3b, 0xa9, 0x9a, 0x12, 0x61,
711         0xe8, 0x8d, 0x99, 0x44, 0x3f, 0x94, 0x72, 0x82,
712         0x19, 0x96, 0x62, 0xb0, 0xa6, 0x64, 0x05, 0x19,
713         0x8f, 0xd6, 0x5d, 0x05, 0xbf, 0x79, 0x9e, 0x9d,
714         0xe4, 0x93, 0x4c, 0xad, 0x61, 0x8c, 0x18, 0xda,
715         0xb6, 0x2e, 0xb3, 0xca, 0x14, 0x4d, 0x53, 0xa4,
716         0x97, 0x27, 0x10, 0x56, 0xa2, 0x67, 0x5a, 0x5a,
717         0x5e, 0x13, 0xc0, 0xdb, 0xa7, 0x9f, 0x45, 0x5b,
718         0xeb, 0x1a, 0x14, 0x0c, 0x8c, 0x38, 0x5e, 0x77,
719         0x9a, 0xec, 0x75, 0x68, 0x93, 0x65, 0x02, 0x9c,
720         0xfb, 0x62, 0x60, 0x49, 0xdd, 0xb2, 0x2a, 0x67,
721         0x86, 0xe3, 0x8a, 0x7d, 0x8c, 0x46, 0x78, 0x81,
722         0x60, 0x69, 0xf2, 0x3f, 0x74, 0x11, 0x35, 0xff,
723         0x77, 0xa3, 0x66, 0x20, 0xfc, 0x98, 0x4a, 0x35,
724         0x7a, 0x52, 0xe4, 0x90, 0x13, 0x80, 0xb9, 0xa6,
725         0x73, 0x7a, 0x7d, 0x66, 0x6e, 0x6b, 0xb6, 0x43,
726         0x10, 0xd5, 0x91, 0x2b, 0x66, 0xdd, 0x89, 0x87,
727         0xe3, 0x8c, 0x58, 0x53, 0x2f, 0x40, 0x74, 0x45,
728         0x1b, 0x77, 0x7a, 0xa4, 0x44, 0x19, 0x78, 0xba,
729         0x87, 0x10, 0x41, 0x31, 0x32, 0x5f, 0x87, 0x68,
730         0xde, 0x43, 0x4a, 0xef, 0x33, 0xb3, 0x11, 0x83,
731         0xa9, 0xc2, 0x6f, 0x8d, 0x34, 0xe2, 0x95, 0x84,
732         0x3a, 0x4f, 0x6f, 0x8c, 0x31, 0x1d, 0xb6, 0xf5,
733         0x95, 0x0d, 0x01, 0x11, 0x20, 0xdf, 0x72, 0xf3,
734         0x3f, 0x9a, 0x33, 0xaa, 0xb1, 0x06, 0x6a, 0x63,
735         0x47, 0x91, 0x01, 0xdf, 0xb3, 0x54, 0x36, 0xfd,
736         0x06, 0x2d, 0xb8, 0x08, 0xe3, 0xd3, 0x65, 0xac,
737         0x66, 0x03, 0xee, 0xa4, 0x63, 0xbd, 0xd4, 0xce,
738         0xbd, 0x79, 0xa7, 0x48, 0x38, 0xc5, 0x7d, 0xb5,
739         0x71, 0x9a, 0x3c, 0x11, 0x7c, 0x6c, 0xe2, 0x54,
740         0x02, 0x5d, 0x42, 0xab, 0x25, 0x93, 0x66, 0x01,
741         0x37, 0x78, 0x35, 0x4a, 0x8c, 0x19, 0x4d, 0x00,
742         0x75, 0x4f, 0xcc, 0xc0, 0x26, 0x82, 0xc1, 0x35,
743         0x8c, 0xc7, 0xc2, 0x59, 0x01, 0x3e, 0x98, 0x22,
744         0x88, 0x9c, 0x90, 0x75, 0x05, 0x33, 0x07, 0xb9,
745         0x39, 0x81, 0x38, 0x58, 0x10, 0x29, 0xcf, 0xc8,
746         0x98, 0xb2, 0x03, 0xd7, 0x5b, 0xb3, 0x18, 0xba,
747         0x34, 0x0c, 0x9f, 0xab, 0xd7, 0xed, 0x29, 0x82,
748         0x41, 0xe0, 0x20, 0x97, 0x57, 0x92, 0xb2, 0xb8,
749         0x10, 0x2d, 0x0b, 0xa2, 0xc5, 0x8f, 0x90, 0x6f,
750         0xed, 0x12, 0x56, 0x25, 0xbe, 0xfd, 0x75, 0xf7,
751         0xb6, 0xf8, 0x40, 0x67, 0x39, 0x11, 0xfa, 0x15,
752         0xae, 0x6a, 0x54, 0x5f, 0x32, 0x2b, 0xf8, 0x48,
753         0x55, 0xbe, 0x86, 0x2f, 0x69, 0x48, 0x5b, 0x5d,
754         0x4d, 0xb7, 0x35, 0xaa, 0xb6, 0x91, 0x88, 0x19,
755         0x96, 0x1c, 0x68, 0xf6, 0x85, 0x9e, 0xb3, 0xb2,
756         0xa3, 0x32, 0xd4, 0x52, 0x70, 0xb7, 0x62, 0xe3,
757         0x14, 0xb6, 0x78, 0x5f, 0x1b, 0x1d, 0x04, 0x9c,
758         0x26, 0x0c, 0x33, 0x94, 0xb1, 0x97, 0x08, 0xdb,
759         0x0b, 0x39, 0x29, 0xd4, 0xbc, 0x6d, 0xdf, 0x02,
760         0xc6, 0x99, 0xab, 0x99, 0x32, 0xe5, 0xce, 0x51,
761         0x4f, 0xae, 0xb8, 0x8b, 0xe0, 0xaf, 0x07, 0xc4,
762         0xf9, 0x41, 0x7c, 0x59, 0xa0, 0xac, 0x74, 0x4d,
763         0x7e, 0x43, 0x77, 0x9c, 0x06, 0x49, 0x79, 0x8a,
764         0x14, 0x73, 0x93, 0xa8, 0x5b, 0x1b, 0x34, 0x29,
765         0x78, 0x04, 0x2f, 0xd7, 0x1f, 0x13, 0x90, 0xe0,
766         0xdd, 0x3b, 0x42, 0x6b, 0x79, 0x6e, 0x52, 0xc7,
767         0x0f, 0x38, 0xda, 0x01, 0x2c, 0x8d, 0xe6, 0x94,
768         0x5d, 0x59, 0x27, 0x1d, 0x10, 0x4e, 0x11, 0x36,
769         0xfb, 0x53, 0x16, 0x05, 0x25, 0xf2, 0x64, 0xd8,
770         0xf9, 0xcd, 0x5c, 0xfe, 0xb4, 0x18, 0x44, 0x80,
771         0x10, 0xbc, 0x3d, 0xf3, 0x1d, 0x5a, 0xf0, 0xc1,
772         0xc3, 0x55, 0xff, 0x41, 0x3e, 0xe3, 0xef, 0x44,
773         0xb2, 0xc0, 0x01, 0x18, 0xa2, 0x49, 0x88, 0x78,
774         0x0d, 0x4c, 0xc8, 0x73, 0xcf, 0x30, 0x85, 0x3a,
775         0x88, 0x90, 0x01, 0xcf, 0x69, 0x53, 0xa3, 0x18,
776         0x3f, 0xd6, 0xe7, 0x94, 0x14, 0xa7, 0xae, 0xcd,
777         0x6f, 0x11, 0x72, 0xfe, 0x2b, 0xb0, 0x81, 0x53,
778         0xea, 0x67, 0xd6, 0xe4, 0xca, 0x42, 0xa0, 0xf9,
779         0xb1, 0xd4, 0xb5, 0x3b, 0xc9, 0xf0, 0x36, 0xc1,
780         0x1c, 0xf4, 0xb1, 0xf6, 0x84, 0xd0, 0x86, 0x6c,
781         0x76, 0x9a, 0x03, 0xc2, 0xb6, 0x2e, 0x9a, 0x46,
782         0xf5, 0x5f, 0x2c, 0x38, 0xac, 0xad, 0x6f, 0x2e,
783         0x7a, 0x18, 0x2d, 0x22, 0x95, 0x5e, 0x5e, 0xc9,
784         0x7a, 0x0a, 0x56, 0xe1, 0xc7, 0x15, 0xfd, 0xbf,
785         0xff, 0xf7, 0x7e, 0x85, 0x20, 0xa9, 0x8a, 0x9c,
786         0xa9, 0x7d, 0xe8, 0xed, 0xfc, 0x7f, 0xbb, 0xf0,
787         0x05, 0x3f, 0xce, 0x4f, 0x4c, 0xee, 0xa4, 0xa0,
788         0xcc, 0x9c, 0x62, 0x1e, 0xd6, 0xd0, 0x30, 0x37,
789         0xb8, 0x98, 0x56, 0x1d, 0xaa, 0xd6, 0x5e, 0x73,
790         0x12, 0xe4, 0x88, 0x82, 0x48, 0x64, 0x06, 0xd7,
791         0x2a, 0x31, 0x50, 0x7b, 0x10, 0x17, 0xb8, 0x4c,
792         0x5a, 0x8d, 0xf1, 0xfc, 0xf1, 0x33, 0x3b, 0x98,
793         0x42, 0x18, 0x5b, 0x35, 0x78, 0xca, 0x8e, 0x41,
794         0x52, 0xae, 0x6d, 0xe1, 0xa2, 0x9d, 0x5b, 0xbd,
795         0xf3, 0x5f, 0x49, 0xc1, 0x27, 0x06, 0xc1, 0xaf,
796         0xc0, 0xa3, 0x9d, 0xf3, 0x1c, 0x8e, 0x90, 0x8a,
797         0xb0, 0x69, 0xb0, 0xc5, 0x11, 0x0c, 0x91, 0x14,
798         0x1f, 0x5e, 0x10, 0xe1, 0x1d, 0x14, 0x30, 0x54,
799         0x1e, 0x17, 0x3d, 0x31, 0x7b, 0xbf, 0x2f, 0x9d,
800         0x6d, 0x63, 0x32, 0xf0, 0x9d, 0x9f, 0x95, 0x3d,
801         0x0b, 0xd2, 0x4d, 0x10, 0xe2, 0x3f, 0x67, 0x69,
802         0x43, 0x9a, 0x4a, 0x2c, 0x54, 0x71, 0xa8, 0xa0,
803         0x9e, 0x9f, 0x10, 0xaf, 0x1b, 0xce, 0x99, 0xe3,
804         0x25, 0x32, 0x10, 0x54, 0x80, 0xfe, 0xda, 0x57,
805         0xd0, 0xb2, 0x92, 0x7f, 0xbb, 0x5f, 0xe7, 0x4d,
806         0x1b, 0x3d, 0x46, 0x4d, 0xe4, 0x4c, 0xd6, 0xaf,
807         0x1a, 0x32, 0x12, 0x40, 0xb8, 0x84, 0x8e, 0xe4,
808         0x80, 0xce, 0x7e, 0xc1, 0x13, 0x8b, 0xb0, 0xb7,
809         0x6f, 0x24, 0xba, 0x85, 0x50, 0x83, 0xc3, 0xcf,
810         0x19, 0xb3, 0xf0, 0xc7, 0xee, 0x68, 0xbe, 0x9e,
811         0x6d, 0xb9, 0xfb, 0xd5, 0x29, 0xce, 0x82, 0xcd,
812         0x69, 0x16, 0x68, 0x6b, 0x6a, 0xf4, 0x02, 0x32,
813         0xce, 0x60, 0x37, 0x0c, 0xb9, 0x38, 0x92, 0x9c,
814         0x42, 0xa9, 0x0b, 0x53, 0x96, 0xfe, 0x39, 0xc1,
815         0x24, 0x65, 0x9b, 0xcd, 0xe7, 0x8d, 0x36, 0x07,
816         0x9f, 0x1d, 0x35, 0x8e, 0xdc, 0x4c, 0xb5, 0x68,
817         0xc5, 0xfd, 0x44, 0x19, 0xf2, 0x6c, 0x59, 0x1c,
818         0xb1, 0x0b, 0x35, 0x48, 0x86, 0x1a, 0x05, 0x22,
819         0x03, 0x0c, 0x0c, 0xa2, 0x92, 0x90, 0x35, 0xfb,
820         0x37, 0x94, 0xc7, 0x15, 0x84, 0xae, 0xe8, 0x05,
821         0xa0, 0xf7, 0x30, 0x11, 0x5c, 0xe4, 0x5d, 0x3e,
822         0x12, 0x54, 0x80, 0x54, 0x6b, 0x09, 0x8c, 0xce,
823         0x80, 0x5e, 0xa7, 0xc8, 0x6a, 0x0c, 0x56, 0xe1,
824         0x18, 0x7d, 0xc9, 0x39, 0xc1, 0xef, 0xe3, 0x25,
825         0xa0, 0x8b, 0x2f, 0x60, 0x3a, 0x43, 0x39, 0xa6,
826         0x28, 0x28, 0x7b, 0x4c, 0x77, 0xd4, 0x49, 0x61,
827         0x46, 0xe9, 0x1b, 0x45, 0xd6, 0xb1, 0x56, 0xe1,
828         0x7d, 0x34, 0xcd, 0x06, 0xb6, 0x67, 0x8d, 0x7d,
829         0x7a, 0xe2, 0xbe, 0x68, 0x35, 0xa6, 0x78, 0xe5,
830         0x47, 0x48, 0xb7, 0xc7, 0xde, 0xcd, 0xc9, 0x05,
831         0xb4, 0xe7, 0x50, 0x48, 0xe1, 0x4b, 0xfe, 0x76,
832         0x77, 0xc6, 0xf7, 0x5f, 0xcb, 0xc2, 0xa8, 0xd7,
833         0xd6, 0x8a, 0xe5, 0x49, 0xd9, 0xca, 0x45, 0xf4,
834         0xda, 0xcd, 0x33, 0xd1, 0x59, 0x2d, 0x9e, 0xc1,
835         0x5c, 0xe6, 0x01, 0x18, 0xb8, 0xf0, 0x5e, 0xb1,
836         0x69, 0x95, 0x2f, 0x02, 0x2a, 0xe7, 0x4a, 0xd7,
837         0xd1, 0xc3, 0xd5, 0x6f, 0x15, 0xc8, 0xdc, 0x29,
838         0xde, 0xb9, 0x3f, 0x8b, 0xa6, 0xbc, 0xdd, 0x25,
839         0x84, 0x35, 0x3c, 0x90, 0x2d, 0xc2, 0x1e, 0x98,
840         0x8a, 0x50, 0x09, 0x77, 0x42, 0xe9, 0x35, 0x8a,
841         0x7c, 0x97, 0xbf, 0xe8, 0xbf, 0x56, 0xd0, 0x8b,
842         0x65, 0xd3, 0xaf, 0x1e, 0x05, 0x94, 0xfa, 0xac,
843         0xa8, 0x2b, 0x28, 0xcb, 0x37, 0x3e, 0xe8, 0xbb,
844         0x66, 0x3a, 0xed, 0xb2, 0x48, 0x10, 0x0f, 0x3a,
845         0x5a, 0xc5, 0xdb, 0x26, 0x0e, 0xaa, 0x5e, 0x69,
846         0x15, 0xd6, 0x81, 0xae, 0xbd, 0xe6, 0x03, 0xf1,
847         0xf6, 0x37, 0xc8, 0xde, 0x70, 0x1f, 0x64, 0xb9,
848         0x5e, 0xbf, 0x2e, 0x4f, 0xb1, 0xea, 0xa0, 0x17,
849         0xe6, 0x7c, 0xf9, 0x2f, 0x1e, 0xd8, 0x58, 0xde,
850         0xa7, 0xf0, 0x46, 0x52, 0x95, 0xdf, 0xa4, 0x96,
851         0xd0, 0xc4, 0x97, 0x2b, 0x95, 0xcd, 0x5e, 0x40,
852         0x23, 0x5c, 0x10, 0xee, 0xba, 0x72, 0x9b, 0xcf,
853         0x0b, 0xe8, 0x18, 0x3a, 0x70, 0xd2, 0x5e, 0x07,
854         0x68, 0x93, 0xef, 0x4a, 0x5b, 0x8d, 0x72, 0x41,
855         0x4e, 0xea, 0x33, 0x6a, 0x0a, 0x5e, 0xfb, 0x02,
856         0x3f, 0xd4, 0xed, 0x5b, 0xe0, 0x42, 0x84, 0xd4,
857         0xaa, 0x85, 0xdc, 0x5b, 0x67, 0xee, 0x71, 0x67,
858         0xba, 0x8e, 0xd2, 0xbe, 0x61, 0xdf, 0x5a, 0x26,
859         0xb9, 0xf0, 0x77, 0x81, 0x53, 0x24, 0x16, 0xcb,
860         0x8c, 0xb8, 0x06, 0x6e, 0x68, 0xda, 0xc8, 0x2d,
861         0x17, 0x54, 0xdb, 0x46, 0xcb, 0xfd, 0x1f, 0x3d,
862         0x94, 0x81, 0x09, 0x4b, 0xfa, 0xb1, 0x46, 0xd9,
863         0x11, 0xa3, 0xb7, 0x31, 0x9c, 0xd2, 0x38, 0xd6,
864         0xba, 0x3d, 0xa3, 0x74, 0xd8, 0xf1, 0x24, 0xe8,
865         0x9c, 0xcb, 0x1d, 0xf9, 0x4a, 0xf7, 0xc8, 0x4b,
866         0xfe, 0x97, 0x7c, 0xa1, 0x02, 0xeb, 0x40, 0xc3,
867         0x89, 0x71, 0x01, 0xcd, 0x33, 0x2a, 0xc2, 0x82,
868         0xce, 0x62, 0x8d, 0x53, 0x7c, 0xdf, 0xce, 0xd7,
869         0xf5, 0xa8, 0x4f, 0xf2, 0xf2, 0x2e, 0xc1, 0xeb,
870         0x97, 0x99, 0x37, 0x3c, 0x53, 0xa6, 0xb4, 0x46,
871         0x05, 0x64, 0x92, 0x87, 0x08, 0x3c, 0x23, 0x4b,
872         0x9d, 0x67, 0x18, 0xf9, 0xe2, 0x0b, 0x1c, 0x39,
873         0xd3, 0x87, 0x70, 0xc0, 0xb9, 0x1e, 0x52, 0x0a,
874         0x0f, 0x48, 0xe2, 0xe7, 0x51, 0x72, 0x94, 0xf7,
875         0xa3, 0xdc, 0xe5, 0x66, 0x33, 0x39, 0x54, 0x06,
876         0x55, 0x93, 0x30, 0xf9, 0x5e, 0x76, 0x8f, 0xe0,
877         0x59, 0x4d, 0x0d, 0xa7, 0xf5, 0xbe, 0xdb, 0x20,
878         0xad, 0x0d, 0x76, 0x88, 0x5f, 0x9c, 0x7c, 0x75,
879         0x2f, 0x2a, 0x0b, 0x79, 0x6e, 0xd3, 0xe2, 0x66,
880         0xf5, 0x4a, 0x2d, 0x87, 0x87, 0x49, 0x84, 0x17,
881         0xa2, 0x62, 0x4c, 0xbb, 0xe4, 0x6e, 0x98, 0x10,
882         0xc9, 0xfb, 0x8a, 0x04, 0x68, 0x8d, 0x22, 0x66,
883         0xad, 0xea, 0x2a, 0xc9, 0x97, 0x2d, 0x3c, 0xbc,
884         0xd0, 0x77, 0x5f, 0xe6, 0xb8, 0x7f, 0xe6, 0xf6,
885         0x39, 0xbf, 0x56, 0x0e, 0x26, 0x6d, 0xc5, 0x3e,
886         0x53, 0x19, 0xd6, 0xb4, 0x57, 0x36, 0xa3, 0xc6,
887         0xd3, 0x3d, 0x66, 0x79, 0x30, 0x5c, 0x14, 0x0c,
888         0x0f, 0x3e, 0x96, 0xae, 0x90, 0x97, 0xab, 0x0d,
889         0x9f, 0xc3, 0xe7, 0x66, 0x3e, 0xe0, 0x31, 0x43,
890         0x4b, 0x01, 0xb3, 0x0e, 0x9e, 0x8c, 0x82, 0x4a,
891         0x8c, 0xc7, 0x79, 0x85, 0xdf, 0x75, 0x0d, 0xb4,
892         0x2b, 0x03, 0x14, 0xef, 0x72, 0x58, 0xfd, 0x64,
893         0xc8, 0xe3, 0x0d, 0x9a, 0x14, 0x6f, 0x76, 0xf9,
894         0x46, 0xd1, 0xd2, 0x81, 0xb3, 0x16, 0x6e, 0xc7,
895         0x76, 0x82, 0xce, 0xf4, 0xee, 0x33, 0x00, 0xe6,
896         0x77, 0xc4, 0xad, 0x4f, 0x06, 0xa7, 0x48, 0x80,
897         0x9e, 0x21, 0x66, 0xca, 0x75, 0x69, 0x57, 0xcb,
898         0xf0, 0x67, 0x6a, 0xaa, 0x8f, 0x88, 0x14, 0xbd,
899         0x65, 0x62, 0xe2, 0xad, 0xcc, 0x22, 0x88, 0x7b,
900         0x94, 0xbd, 0x0e, 0xcd, 0xb6, 0x69, 0xa2, 0xcb,
901         0x7d, 0x57, 0x5c, 0xb4, 0x92, 0x80, 0x13, 0x99,
902         0x84, 0xf3, 0x79, 0x0a, 0x2d, 0x70, 0xa4, 0xe0,
903         0xde, 0xc6, 0x32, 0xb0, 0x8a, 0x62, 0xb5, 0xcf,
904         0xfa, 0x5e, 0x5a, 0x92, 0x32, 0x7d, 0x34, 0x07,
905         0xb5, 0x52, 0x3a, 0xb5, 0x7d, 0x0f, 0xa1, 0xba,
906         0x56, 0xd0, 0x07, 0x76, 0x11, 0xf2, 0xc3, 0x33,
907         0x9d, 0xbd, 0x12, 0x35, 0x5e, 0xf7, 0x05, 0x88,
908         0x76, 0x94, 0xa6, 0xbf, 0xed, 0xb8, 0xa4, 0xa2,
909         0x0c, 0xbe, 0x0f, 0x6a, 0xaf, 0xf3, 0x1b, 0x33,
910         0x4a, 0xb7, 0x68, 0x3f, 0xbe, 0x95, 0x13, 0x97,
911         0x0f, 0x15, 0x17, 0x1b, 0x23, 0xaa, 0x08, 0x78,
912         0xa6, 0x5b, 0x08, 0xa2, 0x9d, 0x03, 0xa8, 0xa7,
913         0x39, 0xdc, 0xbc, 0x9a, 0x85, 0xf5, 0xe5, 0x55,
914         0x59, 0x3c, 0xef, 0xf9, 0x3f, 0x22, 0x8e, 0xf8,
915         0xd8, 0x3e, 0x02, 0x0b, 0xd8, 0x78, 0x4b, 0x15,
916         0x7f, 0xaa, 0x2c, 0xff, 0xbe, 0x77, 0x33, 0xc7,
917         0x6a, 0x12, 0xaa, 0xa4, 0xbe, 0xc0, 0x3b, 0xcb,
918         0x13, 0x9d, 0x9c, 0x5a, 0x9f, 0x8a, 0x57, 0x36,
919         0x4f, 0x02, 0x5a, 0xf8, 0x1d, 0x97, 0x77, 0x43,
920         0xc8, 0xa5, 0xb7, 0x9b, 0x10, 0x98, 0xfd, 0x58,
921         0xbf, 0x42, 0xf6, 0xbf, 0xff, 0x6c, 0x40, 0x18,
922         0x18, 0xdf, 0xac, 0x57, 0x71, 0xea, 0xcc, 0x8e,
923         0xfd, 0xfe, 0x10, 0xfb, 0xb9, 0xfe, 0xbc, 0x9a,
924         0x9c, 0x27, 0xe4, 0x10, 0x15, 0x94, 0x41, 0xa1,
925         0xcc, 0xf6, 0x25, 0x49, 0x4f, 0x96, 0xc1, 0x8c,
926         0x9e, 0x3e, 0x18, 0x29, 0x49, 0x92, 0xe7, 0xfe,
927         0x22, 0xff, 0xed, 0x02, 0x16, 0x90, 0xef, 0xac,
928         0xec, 0x95, 0x1d, 0x5b, 0x94, 0x9c, 0xf6, 0x7c,
929         0x1b, 0x5a, 0x9d, 0xb0, 0x9b, 0x05, 0x36, 0xbf,
930         0xef, 0xec, 0x63, 0x35, 0x40, 0x24, 0x45, 0x40,
931         0x30, 0x1a, 0x9b, 0x90, 0xc3, 0xc2, 0xf7, 0x37,
932         0xfb, 0x08, 0x8e, 0x48, 0x19, 0x48, 0xed, 0xa8,
933         0xa8, 0x04, 0x6f, 0xd0, 0x33, 0xe9, 0xb8, 0x8d,
934         0xe7, 0x1e, 0x5c, 0x47, 0x74, 0xc0, 0x66, 0x30,
935         0x4e, 0xa7, 0x86, 0x73, 0xf1, 0xe5, 0x78, 0xa6,
936         0xe0, 0xc1, 0xda, 0x13, 0x72, 0x07, 0x85, 0x34,
937         0x63, 0x95, 0x49, 0x30, 0x4b, 0x9d, 0x03, 0xf1,
938         0x7a, 0x6b, 0x91, 0xa2, 0x85, 0x41, 0xf9, 0x4a,
939         0xd6, 0xff, 0xff, 0x86, 0xf7, 0xf0, 0xce, 0xb9,
940         0x07, 0xf1, 0x88, 0x04, 0x33, 0xaa, 0xeb, 0x54,
941         0xb2, 0x1c, 0x8e, 0x2e, 0x7b, 0x04, 0xa8, 0xcc,
942         0x2c, 0x7a, 0xb3, 0xad, 0x1a, 0x89, 0x38, 0x89,
943         0xd7, 0x11, 0x3a, 0x8c, 0xcf, 0xe3, 0xc5, 0xba,
944         0xb0, 0xcc, 0xc4, 0xe3, 0x33, 0xf3, 0x18, 0xba,
945         0xec, 0x56, 0xd9, 0x1c, 0x40, 0x70, 0x0d, 0x4e,
946         0x97, 0x01, 0x23, 0xf3, 0x5a, 0xdc, 0xbf, 0x68,
947         0x93, 0xc2, 0x1d, 0x8a, 0x96, 0xb7, 0xac, 0x18,
948         0x6f, 0xf7, 0x84, 0x71, 0x0d, 0x3d, 0xf8, 0xba,
949         0xdf, 0xb6, 0x89, 0x1d, 0x78, 0x19, 0xf2, 0x59,
950         0xe9, 0x15, 0x55, 0x29, 0x73, 0x50, 0x59, 0x14,
951         0x02, 0x21, 0x16, 0x8f, 0x0f, 0xdf, 0xa5, 0xf0,
952 };
953
954 static struct crc_test {
955         uint32_t crc;           /* random starting crc */
956         uint32_t start;         /* random offset in buf */
957         uint32_t length;        /* random length of test */
958         uint32_t crc_le;        /* expected crc32_le result */
959         uint32_t crc_be;        /* expected crc32_be result */
960 } test[] = {
961         {0xffffffff, 0x00000000, 0x00001000, 0x13934bef, 0x14f3b75f},
962         {0xfe7328ea, 0x00000763, 0x00000717, 0xed2c0d70, 0x57531214},
963         {0x4c40684e, 0x00000721, 0x0000011e, 0xd7f46ccc, 0xedf12ec3},
964         {0x6b487f90, 0x00000264, 0x000007bc, 0x759e9939, 0x9af8e387},
965         {0x9f5810db, 0x00000afa, 0x00000255, 0x2685197f, 0x716de6ed},
966         {0xb15c4755, 0x00000d5b, 0x000002a4, 0xd8fadcb5, 0xfc34ae3f},
967         {0x06518253, 0x00000ffb, 0x00000004, 0xabee2433, 0xfa30ac9e},
968         {0xd9e71c55, 0x00000a2a, 0x00000259, 0x96682af2, 0xe5907ea3},
969         {0x0c1ae843, 0x00000ce4, 0x0000031b, 0x7b637c43, 0xe7f71b04},
970         {0xec3cd517, 0x000002ff, 0x00000566, 0x5d719a77, 0xed16e045},
971         {0x77828e95, 0x0000067f, 0x0000038f, 0x43ee5b6c, 0x35999927},
972         {0xec87b4e3, 0x00000d1c, 0x000002e3, 0x2ddd2eee, 0x9452d3f8},
973         {0x412158bb, 0x00000eee, 0x00000111, 0x67b38ba2, 0x177976d0},
974         {0x2e52de3e, 0x00000c4a, 0x000003b5, 0xbcc5d61d, 0xf60fee71},
975         {0x6ddaae8b, 0x00000d99, 0x00000266, 0x8b535544, 0x1dab8596},
976         {0x049b6cb1, 0x000009c5, 0x000000b0, 0xfc22cabc, 0x47ebc954},
977         {0x77d4b954, 0x0000028a, 0x000007fa, 0x71d00923, 0x905585ef},
978         {0x5e192355, 0x00000ac1, 0x000001fa, 0xb966b81a, 0x33c12903},
979         {0x7d80b71d, 0x00000213, 0x000001e0, 0x2bba371a, 0x5f4bd8d9},
980         {0x01f6f1e4, 0x000001d6, 0x00000395, 0xb7e8a647, 0x2a7943a1},
981         {0x1dfabb13, 0x00000e14, 0x000001eb, 0x53917fba, 0x8dee1e5d},
982         {0xb00a4449, 0x00000bf6, 0x00000409, 0xedecb577, 0x628e087d},
983         {0x7ecd3981, 0x0000083f, 0x0000016b, 0xefef62b9, 0xda4f94e6},
984         {0xf8f330d2, 0x000004be, 0x00000757, 0x9357c9f3, 0x8e2d5c2f},
985         {0x03c38af2, 0x00000d23, 0x000002dc, 0x360fa8c0, 0x6294c0d6},
986         {0x687bb79b, 0x00000f3d, 0x000000c2, 0x448d3be2, 0x08f48f3a},
987         {0x6710f550, 0x000009e9, 0x00000603, 0xdbfd1998, 0xc950ac29},
988         {0x873171d1, 0x00000787, 0x000004d5, 0xab7f1b62, 0xe66896ab},
989         {0x373b1314, 0x00000f0f, 0x000000f0, 0x184098ab, 0x4038e674},
990         {0x90fad9cd, 0x00000ead, 0x00000152, 0x23ce52ff, 0x9eff3974},
991         {0x19676fe7, 0x0000007d, 0x0000070d, 0xf8a76f1e, 0xfbc5c8a9},
992         {0x89facd45, 0x000005f3, 0x00000473, 0x4331a006, 0xb8f0f0cc},
993         {0x6f173747, 0x00000fc3, 0x0000003c, 0xb012f08e, 0x5126e378},
994         {0x4b44a106, 0x0000075a, 0x0000008b, 0xf6f7ac38, 0xf9b1781b},
995         {0xb620ad06, 0x00000774, 0x0000017e, 0xd34558e6, 0xb175edd3},
996         {0x976f21e9, 0x000008d7, 0x0000034a, 0xe533aa3a, 0x1e4367b9},
997         {0x687628c0, 0x000006c5, 0x0000061b, 0x3a840b15, 0xfb5989a0},
998         {0xe24ac108, 0x00000cd0, 0x0000032f, 0x51010ae8, 0xcdd8f182},
999         {0x361c44a3, 0x00000304, 0x00000719, 0xfd7bd481, 0x12de540f},
1000         {0xd93ff95e, 0x00000db7, 0x0000008e, 0xcfbbc304, 0x42eecd5a},
1001         {0xed752d12, 0x00000883, 0x00000091, 0x65a6c868, 0x9ebfa578},
1002         {0xb4ff4b54, 0x000003d3, 0x000001c1, 0xf82597e7, 0xa8ad2b19},
1003         {0x111b520f, 0x00000708, 0x000000eb, 0xc3e109f3, 0x323ace17},
1004         {0x62c806f2, 0x00000ba3, 0x0000045c, 0x874d3a72, 0xaf1a1360},
1005         {0x40d97470, 0x000005e1, 0x0000058d, 0x87a9684f, 0x524244a8},
1006         {0x4312179c, 0x00000056, 0x0000070e, 0x809a00f5, 0xf9e940b0},
1007         {0x13d5f84c, 0x00000a2d, 0x00000104, 0xf3d27578, 0x5d33341c},
1008         {0x1f302cb2, 0x00000151, 0x00000014, 0x1e162693, 0x53c3cfc3},
1009         {0xe491db24, 0x00000600, 0x000006f6, 0x7ff09615, 0xa300ecf7},
1010         {0xf9a98069, 0x000002ba, 0x000002ad, 0x01af7387, 0x31c0911e},
1011         {0xe9c477ad, 0x0000015f, 0x00000778, 0x6facf9a0, 0x1993b688},
1012         {0x353f32b2, 0x0000087c, 0x00000783, 0x6cc964ea, 0x418db561},
1013         {0x78e1b24f, 0x00000650, 0x000006a8, 0xb3bb7c27, 0xf2aad006},
1014         {0x61aa400e, 0x00000049, 0x00000254, 0xb8cd1681, 0x79150b15},
1015         {0xb84b10b0, 0x00000f73, 0x0000008c, 0x406a6450, 0x0c705222},
1016         {0x9fa99c9c, 0x00000a7c, 0x000004d7, 0xfb3d21b4, 0xe4e789df},
1017         {0x3fc9ebe3, 0x00000cd9, 0x000000d6, 0x43803f9c, 0x5a152be5},
1018         {0x529879cd, 0x000002f2, 0x00000595, 0x78b4c6a6, 0xf7236ec4},
1019         {0x3a933019, 0x00000516, 0x00000266, 0xdcb45436, 0x2c7935f5},
1020         {0x887b4977, 0x00000227, 0x0000038d, 0xc5f7c3d9, 0x0d6d7df6},
1021         {0x770745de, 0x000008c6, 0x00000739, 0xf69145e8, 0x47d5efc9},
1022         {0x28be3b47, 0x00000c46, 0x0000032b, 0x764c028f, 0x1eb70d64},
1023         {0x5013a050, 0x00000cf6, 0x00000309, 0xea8fe164, 0x186affa4},
1024         {0x2ec4c9ba, 0x000006e8, 0x0000078d, 0xa35557a9, 0xb41f49ec},
1025         {0xa9f950c9, 0x00000d33, 0x000002cc, 0x41ea8618, 0xab8dfae3},
1026         {0x5b520229, 0x000007b2, 0x00000484, 0x44569f1f, 0x607a8052},
1027         {0xd8dcbbfc, 0x0000002f, 0x0000048c, 0xdb88ab8b, 0xf1c411f1},
1028         {0x25529792, 0x00000d1d, 0x000002e2, 0x20cda404, 0x32683a2d},
1029         {0x9f3f6d71, 0x00000238, 0x0000079a, 0x0720443e, 0x4b8ba2ff},
1030         {0x64121215, 0x000007ff, 0x0000038f, 0x6aacff2c, 0x3b84233b},
1031         {0xfb6cdde0, 0x00000ef8, 0x00000107, 0xbd43a0f1, 0x926624d0},
1032         {0x221c9d6f, 0x000007b6, 0x0000014f, 0xb67f834b, 0x2bdedda4},
1033         {0x030e1de4, 0x00000836, 0x000004b4, 0x0d67d26a, 0x75a73b73},
1034         {0xb56fa6cf, 0x00000c07, 0x000003f8, 0x60601ac1, 0x10a43f35},
1035         {0xb55c89f5, 0x0000098e, 0x000001d4, 0x2400efbe, 0x006e28eb},
1036         {0x5e90b6d5, 0x0000070b, 0x000003ea, 0x3bb5d6ea, 0xb175fa6b},
1037         {0x2a7045ae, 0x00000961, 0x00000633, 0xfca89e4b, 0x962cd6d2},
1038         {0x8b374ea9, 0x000006ba, 0x00000780, 0xbce036ed, 0x4dc8279b},
1039         {0x8bd90bc9, 0x00000562, 0x00000369, 0xcb26a24b, 0x50dee743},
1040         {0x5b1b1762, 0x000000fd, 0x0000051a, 0x33cdda07, 0xee75ff7b},
1041         {0xa4153555, 0x0000058f, 0x000005c7, 0xbe50eeca, 0xe73fffcc},
1042         {0x0be1f931, 0x00000651, 0x00000672, 0x95a25753, 0x4ad6270f},
1043         {0xb7e78618, 0x00000a7f, 0x000002bb, 0xe06bcc1c, 0x1a35ee59},
1044         {0x4a9bc41b, 0x00000e51, 0x000001ae, 0x709e8d2c, 0x75080ca8},
1045         {0xfc359d13, 0x00000440, 0x000002f8, 0x0a58451f, 0x6fa3cfbf},
1046         {0x5aa48619, 0x000006d1, 0x00000284, 0x928ead83, 0xbd600efc},
1047         {0xa609afa8, 0x0000053e, 0x00000272, 0xb048c141, 0x184f80bb},
1048         {0x3f108afb, 0x00000949, 0x00000150, 0x9a6bb5bc, 0x0ea02be1},
1049         {0x79bec2d3, 0x000008ed, 0x00000712, 0x32692d57, 0x2eb13289},
1050         {0x9429e067, 0x00000bc3, 0x0000043c, 0x5295ceff, 0x8a9014a7},
1051         {0xae58b96a, 0x0000082d, 0x000007d2, 0xc2a681ba, 0x6af94089},
1052         {0x95df24be, 0x00000985, 0x000004c1, 0x3a287765, 0x379fcb42},
1053         {0x5e94976f, 0x00000596, 0x000004ed, 0xff00c489, 0x991fc1f5},
1054         {0xf5e5f1de, 0x00000d31, 0x000002ce, 0x35f28e91, 0x543def1a},
1055         {0xa2c219cf, 0x00000a3c, 0x00000374, 0x707d21eb, 0xa6d28bc1},
1056         {0xf21b6ceb, 0x00000919, 0x00000135, 0x0847fb8b, 0x224468c2},
1057         {0xaa988728, 0x00000787, 0x00000771, 0x885aeaa4, 0x814db00b},
1058         {0xaa5dfaac, 0x000003e5, 0x0000051b, 0x52c48ab7, 0x725bef8a},
1059         {0x0a053968, 0x00000d2a, 0x000002d5, 0x7a90256d, 0xc53b9402},
1060         {0x1421dc20, 0x00000eef, 0x00000110, 0x97d6da24, 0x10846935},
1061         {0xb47c2166, 0x00000a6a, 0x00000209, 0xcfd6cc52, 0x46e2797e},
1062         {0x77dd1955, 0x000000de, 0x00000266, 0xba74bcaa, 0x4fa3fe9c},
1063         {0x68a03cc2, 0x0000082f, 0x000007b0, 0x752bd5d8, 0x4f760c63},
1064         {0x0226b0a3, 0x00000a5f, 0x000005a0, 0x82de4970, 0x8ee1310e},
1065         {0x637bf3b1, 0x00000d93, 0x0000026c, 0x5c7115cb, 0x9f6a0ced},
1066         {0x3b120edf, 0x00000c13, 0x000003ec, 0x80d7d20f, 0x241657d5},
1067         {0xe2456780, 0x000002eb, 0x00000641, 0xc0a5d289, 0x74df96b4},
1068         {0x9b2e7125, 0x00000c0c, 0x000003f3, 0xcc15f57e, 0x03e290bf},
1069         {0x153033ef, 0x00000787, 0x000006b6, 0x3cde443b, 0x7bf1d121},
1070         {0x18458b3f, 0x0000066c, 0x00000561, 0x9a2bd8c6, 0x9d564bef},
1071         {0x4ff9d4b9, 0x00000c8f, 0x0000033a, 0xd0ee6d6d, 0xee00aa0b},
1072         {0xdf84b5d9, 0x00000802, 0x0000029a, 0xdab0d74a, 0xd0cb63dc},
1073         {0x81ee15df, 0x000003ce, 0x00000725, 0x9942e2de, 0xe48fb26b},
1074         {0x5c768e04, 0x00000afd, 0x00000160, 0x36110831, 0x8dc74483},
1075         {0xe5e18094, 0x00000b4b, 0x000000a0, 0xffa3e4a7, 0xc0145e1b},
1076         {0xed7263b6, 0x00000d0d, 0x000002f2, 0xb0006a35, 0x5468ae3a},
1077         {0x5bfde7d7, 0x000006fb, 0x00000554, 0xa4193b76, 0xb73d34b2},
1078         {0x67f4a743, 0x00000b85, 0x0000047a, 0xf05c8d8f, 0x4f843e49},
1079         {0xf13bdf22, 0x00000ff7, 0x00000008, 0x816351eb, 0x41f537f6},
1080         {0x08ecc608, 0x00000d5d, 0x00000098, 0x90492772, 0xf5172204},
1081         {0x296f52ba, 0x000004f9, 0x00000788, 0x5e5a4896, 0xe01d5b46},
1082         {0xbe4624c2, 0x00000427, 0x000004ef, 0xcd267b94, 0x7b9069f4},
1083         {0x906f7c7c, 0x00000a05, 0x0000003f, 0x03fcfc33, 0x7b6ff563},
1084         {0x8f7b323e, 0x00000458, 0x000004c7, 0xcd4969c8, 0xd4c22ada},
1085         {0x88d6593d, 0x00000597, 0x000005b5, 0xf199cd3b, 0x5c3e8ca2},
1086         {0x978a7768, 0x00000268, 0x000001d3, 0xb28c95bd, 0x49a2cc67},
1087         {0x857a621e, 0x000007a7, 0x000003a8, 0xf4bf84ab, 0xde26f369},
1088         {0xb0e121ef, 0x000005be, 0x00000644, 0x28747c14, 0x61d4dc6b},
1089         {0, 0, 0, 0, 0},
1090 };
1091
1092 static int test_crc32c(void)
1093 {
1094         struct crc_test *t = test;
1095         int failures = 0;
1096
1097         while (t->length) {
1098                 uint32_t be, le;
1099                 le = ext2fs_crc32c_le(t->crc, test_buf + t->start, t->length);
1100                 be = ext2fs_crc32c_be(t->crc, test_buf + t->start, t->length);
1101                 if (le != t->crc_le) {
1102                         printf("Test %d LE fails, %x != %x\n",
1103                                (t - test), le, t->crc_le);
1104                         failures++;
1105                 }
1106                 if (be != t->crc_be) {
1107                         printf("Test %d BE fails, %x != %x\n",
1108                                (t - test), be, t->crc_be);
1109                         failures++;
1110                 }
1111                 t++;
1112         }
1113
1114         return failures;
1115 }
1116
1117 int main(int argc, char *argv[])
1118 {
1119         int ret;
1120
1121         ret = test_crc32c();
1122         if (!ret)
1123                 printf("No failures.\n");
1124
1125         return ret;
1126 }
1127 #endif /* UNITTEST */