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