blob: 595205cddc307d01dc6bc78edba1417b897b4eb6 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Bob Pearson78dff412012-03-23 15:02:24 -07002 * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin
3 * cleaned up code to current version of sparse and added the slicing-by-8
4 * algorithm to the closely similar existing slicing-by-4 algorithm.
5 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
7 * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks!
8 * Code was from the public domain, copyright abandoned. Code was
9 * subsequently included in the kernel, thus was re-licensed under the
10 * GNU GPL v2.
11 *
12 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
13 * Same crc32 function was used in 5 other places in the kernel.
14 * I made one version, and deleted the others.
15 * There are various incantations of crc32(). Some use a seed of 0 or ~0.
16 * Some xor at the end with ~0. The generic crc32() function takes
17 * seed as an argument, and doesn't xor at the end. Then individual
18 * users can do whatever they need.
19 * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
20 * fs/jffs2 uses seed 0, doesn't xor with ~0.
21 * fs/partitions/efi.c uses seed ~0, xor's with ~0.
22 *
23 * This source code is licensed under the GNU General Public License,
24 * Version 2. See the file COPYING for more details.
25 */
26
Bob Pearsonfbedceb2012-03-23 15:02:22 -070027/* see: Documentation/crc32.txt for a description of algorithms */
28
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/crc32.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070030#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/types.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include "crc32defs.h"
Bob Pearson60e58d52012-03-23 15:02:22 -070033
Bob Pearson9a1dbf62012-03-23 15:02:23 -070034#if CRC_LE_BITS > 8
Bob Pearsonce4320d2012-03-23 15:02:23 -070035# define tole(x) ((__force u32) __constant_cpu_to_le32(x))
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#else
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080037# define tole(x) (x)
38#endif
39
Bob Pearson9a1dbf62012-03-23 15:02:23 -070040#if CRC_BE_BITS > 8
Bob Pearsonce4320d2012-03-23 15:02:23 -070041# define tobe(x) ((__force u32) __constant_cpu_to_be32(x))
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080042#else
43# define tobe(x) (x)
Linus Torvalds1da177e2005-04-16 15:20:36 -070044#endif
Bob Pearson60e58d52012-03-23 15:02:22 -070045
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#include "crc32table.h"
47
48MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
Darrick J. Wong46c58012012-03-23 15:02:25 -070049MODULE_DESCRIPTION("Various CRC32 calculations");
Linus Torvalds1da177e2005-04-16 15:20:36 -070050MODULE_LICENSE("GPL");
51
Daniel Borkmann6e95fca2013-10-30 11:50:49 +010052#define GF2_DIM 32
53
54static u32 gf2_matrix_times(u32 *mat, u32 vec)
55{
56 u32 sum = 0;
57
58 while (vec) {
59 if (vec & 1)
60 sum ^= *mat;
61 vec >>= 1;
62 mat++;
63 }
64
65 return sum;
66}
67
68static void gf2_matrix_square(u32 *square, u32 *mat)
69{
70 int i;
71
72 for (i = 0; i < GF2_DIM; i++)
73 square[i] = gf2_matrix_times(mat, mat[i]);
74}
75
Bob Pearson9a1dbf62012-03-23 15:02:23 -070076#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080077
Bob Pearson324eb0f2012-03-23 15:02:24 -070078/* implements slicing-by-4 or slicing-by-8 algorithm */
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080079static inline u32
Joakim Tjernlund836e2af2010-05-24 14:33:31 -070080crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080081{
Andrew Morton0d2daf52010-05-25 23:43:03 -070082# ifdef __LITTLE_ENDIAN
Joakim Tjernlund57423322012-01-10 15:10:18 -080083# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
Bob Pearson324eb0f2012-03-23 15:02:24 -070084# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
85 t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
86# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
87 t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080088# else
Joakim Tjernlund57423322012-01-10 15:10:18 -080089# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
Bob Pearson324eb0f2012-03-23 15:02:24 -070090# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
91 t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
92# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
93 t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080094# endif
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080095 const u32 *b;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080096 size_t rem_len;
Bob Pearson0292c492012-03-23 15:02:24 -070097# ifdef CONFIG_X86
98 size_t i;
99# endif
Joakim Tjernlund57423322012-01-10 15:10:18 -0800100 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
Thiago Rafael Becker49ac5722012-07-30 14:41:26 -0700101# if CRC_LE_BITS != 32
Bob Pearson324eb0f2012-03-23 15:02:24 -0700102 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
Thiago Rafael Becker49ac5722012-07-30 14:41:26 -0700103# endif
Bob Pearson324eb0f2012-03-23 15:02:24 -0700104 u32 q;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800105
106 /* Align it */
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -0800107 if (unlikely((long)buf & 3 && len)) {
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800108 do {
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -0800109 DO_CRC(*buf++);
110 } while ((--len) && ((long)buf)&3);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800111 }
Bob Pearson324eb0f2012-03-23 15:02:24 -0700112
113# if CRC_LE_BITS == 32
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800114 rem_len = len & 3;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800115 len = len >> 2;
Bob Pearson324eb0f2012-03-23 15:02:24 -0700116# else
117 rem_len = len & 7;
118 len = len >> 3;
119# endif
120
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -0800121 b = (const u32 *)buf;
Bob Pearson0292c492012-03-23 15:02:24 -0700122# ifdef CONFIG_X86
123 --b;
124 for (i = 0; i < len; i++) {
125# else
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800126 for (--b; len; --len) {
Bob Pearson0292c492012-03-23 15:02:24 -0700127# endif
Bob Pearson324eb0f2012-03-23 15:02:24 -0700128 q = crc ^ *++b; /* use pre increment for speed */
129# if CRC_LE_BITS == 32
130 crc = DO_CRC4;
131# else
132 crc = DO_CRC8;
133 q = *++b;
134 crc ^= DO_CRC4;
135# endif
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800136 }
137 len = rem_len;
138 /* And the last few bytes */
139 if (len) {
140 u8 *p = (u8 *)(b + 1) - 1;
Bob Pearson0292c492012-03-23 15:02:24 -0700141# ifdef CONFIG_X86
142 for (i = 0; i < len; i++)
143 DO_CRC(*++p); /* use pre increment for speed */
144# else
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800145 do {
146 DO_CRC(*++p); /* use pre increment for speed */
147 } while (--len);
Bob Pearson0292c492012-03-23 15:02:24 -0700148# endif
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800149 }
150 return crc;
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -0800151#undef DO_CRC
Joakim Tjernlund836e2af2010-05-24 14:33:31 -0700152#undef DO_CRC4
Bob Pearson324eb0f2012-03-23 15:02:24 -0700153#undef DO_CRC8
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800154}
155#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700156
Daniel Borkmann6e95fca2013-10-30 11:50:49 +0100157/* For conditions of distribution and use, see copyright notice in zlib.h */
158static u32 crc32_generic_combine(u32 crc1, u32 crc2, size_t len2,
159 u32 polynomial)
160{
161 u32 even[GF2_DIM]; /* Even-power-of-two zeros operator */
162 u32 odd[GF2_DIM]; /* Odd-power-of-two zeros operator */
163 u32 row;
164 int i;
165
166 if (len2 <= 0)
167 return crc1;
168
169 /* Put operator for one zero bit in odd */
170 odd[0] = polynomial;
171 row = 1;
172 for (i = 1; i < GF2_DIM; i++) {
173 odd[i] = row;
174 row <<= 1;
175 }
176
177 gf2_matrix_square(even, odd); /* Put operator for two zero bits in even */
178 gf2_matrix_square(odd, even); /* Put operator for four zero bits in odd */
179
180 /* Apply len2 zeros to crc1 (first square will put the operator for one
181 * zero byte, eight zero bits, in even).
182 */
183 do {
184 /* Apply zeros operator for this bit of len2 */
185 gf2_matrix_square(even, odd);
186 if (len2 & 1)
187 crc1 = gf2_matrix_times(even, crc1);
188 len2 >>= 1;
189 /* If no more bits set, then done */
190 if (len2 == 0)
191 break;
192 /* Another iteration of the loop with odd and even swapped */
193 gf2_matrix_square(odd, even);
194 if (len2 & 1)
195 crc1 = gf2_matrix_times(odd, crc1);
196 len2 >>= 1;
197 } while (len2 != 0);
198
199 crc1 ^= crc2;
200 return crc1;
201}
202
Randy Dunlap2f721002006-06-25 05:48:59 -0700203/**
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700204 * crc32_le_generic() - Calculate bitwise little-endian Ethernet AUTODIN II
205 * CRC32/CRC32C
206 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for other
207 * uses, or the previous crc32/crc32c value if computing incrementally.
208 * @p: pointer to buffer over which CRC32/CRC32C is run
Randy Dunlap2f721002006-06-25 05:48:59 -0700209 * @len: length of buffer @p
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700210 * @tab: little-endian Ethernet table
211 * @polynomial: CRC32/CRC32c LE polynomial
Randy Dunlap2f721002006-06-25 05:48:59 -0700212 */
Darrick J. Wong46c58012012-03-23 15:02:25 -0700213static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
214 size_t len, const u32 (*tab)[256],
215 u32 polynomial)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216{
Bob Pearson60e58d52012-03-23 15:02:22 -0700217#if CRC_LE_BITS == 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218 int i;
219 while (len--) {
220 crc ^= *p++;
221 for (i = 0; i < 8; i++)
Darrick J. Wong46c58012012-03-23 15:02:25 -0700222 crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 }
Bob Pearson60e58d52012-03-23 15:02:22 -0700224# elif CRC_LE_BITS == 2
225 while (len--) {
226 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700227 crc = (crc >> 2) ^ tab[0][crc & 3];
228 crc = (crc >> 2) ^ tab[0][crc & 3];
229 crc = (crc >> 2) ^ tab[0][crc & 3];
230 crc = (crc >> 2) ^ tab[0][crc & 3];
Bob Pearson60e58d52012-03-23 15:02:22 -0700231 }
232# elif CRC_LE_BITS == 4
233 while (len--) {
234 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700235 crc = (crc >> 4) ^ tab[0][crc & 15];
236 crc = (crc >> 4) ^ tab[0][crc & 15];
Bob Pearson60e58d52012-03-23 15:02:22 -0700237 }
238# elif CRC_LE_BITS == 8
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700239 /* aka Sarwate algorithm */
240 while (len--) {
241 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700242 crc = (crc >> 8) ^ tab[0][crc & 255];
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700243 }
244# else
Bob Pearsonce4320d2012-03-23 15:02:23 -0700245 crc = (__force u32) __cpu_to_le32(crc);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800246 crc = crc32_body(crc, p, len, tab);
Bob Pearsonce4320d2012-03-23 15:02:23 -0700247 crc = __le32_to_cpu((__force __le32)crc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700249 return crc;
250}
Darrick J. Wong46c58012012-03-23 15:02:25 -0700251
252#if CRC_LE_BITS == 1
253u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
254{
255 return crc32_le_generic(crc, p, len, NULL, CRCPOLY_LE);
256}
257u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
258{
259 return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
260}
261#else
262u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
263{
Joe Mario8f243af2012-10-04 17:12:15 -0700264 return crc32_le_generic(crc, p, len,
265 (const u32 (*)[256])crc32table_le, CRCPOLY_LE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700266}
267u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
268{
Joe Mario8f243af2012-10-04 17:12:15 -0700269 return crc32_le_generic(crc, p, len,
270 (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700271}
272#endif
Daniel Borkmann6e95fca2013-10-30 11:50:49 +0100273u32 __pure crc32_le_combine(u32 crc1, u32 crc2, size_t len2)
274{
275 return crc32_generic_combine(crc1, crc2, len2, CRCPOLY_LE);
276}
277
278u32 __pure __crc32c_le_combine(u32 crc1, u32 crc2, size_t len2)
279{
280 return crc32_generic_combine(crc1, crc2, len2, CRC32C_POLY_LE);
281}
Bob Pearson60e58d52012-03-23 15:02:22 -0700282EXPORT_SYMBOL(crc32_le);
Daniel Borkmann6e95fca2013-10-30 11:50:49 +0100283EXPORT_SYMBOL(crc32_le_combine);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700284EXPORT_SYMBOL(__crc32c_le);
Daniel Borkmann6e95fca2013-10-30 11:50:49 +0100285EXPORT_SYMBOL(__crc32c_le_combine);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286
Randy Dunlap2f721002006-06-25 05:48:59 -0700287/**
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700288 * crc32_be_generic() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
Randy Dunlap2f721002006-06-25 05:48:59 -0700289 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
290 * other uses, or the previous crc32 value if computing incrementally.
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700291 * @p: pointer to buffer over which CRC32 is run
Randy Dunlap2f721002006-06-25 05:48:59 -0700292 * @len: length of buffer @p
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700293 * @tab: big-endian Ethernet table
294 * @polynomial: CRC32 BE polynomial
Randy Dunlap2f721002006-06-25 05:48:59 -0700295 */
Darrick J. Wong46c58012012-03-23 15:02:25 -0700296static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,
297 size_t len, const u32 (*tab)[256],
298 u32 polynomial)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299{
Bob Pearson60e58d52012-03-23 15:02:22 -0700300#if CRC_BE_BITS == 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301 int i;
302 while (len--) {
303 crc ^= *p++ << 24;
304 for (i = 0; i < 8; i++)
305 crc =
Darrick J. Wong46c58012012-03-23 15:02:25 -0700306 (crc << 1) ^ ((crc & 0x80000000) ? polynomial :
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 0);
308 }
Bob Pearson60e58d52012-03-23 15:02:22 -0700309# elif CRC_BE_BITS == 2
310 while (len--) {
311 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700312 crc = (crc << 2) ^ tab[0][crc >> 30];
313 crc = (crc << 2) ^ tab[0][crc >> 30];
314 crc = (crc << 2) ^ tab[0][crc >> 30];
315 crc = (crc << 2) ^ tab[0][crc >> 30];
Bob Pearson60e58d52012-03-23 15:02:22 -0700316 }
317# elif CRC_BE_BITS == 4
318 while (len--) {
319 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700320 crc = (crc << 4) ^ tab[0][crc >> 28];
321 crc = (crc << 4) ^ tab[0][crc >> 28];
Bob Pearson60e58d52012-03-23 15:02:22 -0700322 }
323# elif CRC_BE_BITS == 8
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700324 while (len--) {
325 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700326 crc = (crc << 8) ^ tab[0][crc >> 24];
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700327 }
328# else
Bob Pearsonce4320d2012-03-23 15:02:23 -0700329 crc = (__force u32) __cpu_to_be32(crc);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800330 crc = crc32_body(crc, p, len, tab);
Bob Pearsonce4320d2012-03-23 15:02:23 -0700331 crc = __be32_to_cpu((__force __be32)crc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332# endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700333 return crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334}
Darrick J. Wong46c58012012-03-23 15:02:25 -0700335
336#if CRC_LE_BITS == 1
337u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
338{
339 return crc32_be_generic(crc, p, len, NULL, CRCPOLY_BE);
340}
341#else
342u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
343{
Joe Mario8f243af2012-10-04 17:12:15 -0700344 return crc32_be_generic(crc, p, len,
345 (const u32 (*)[256])crc32table_be, CRCPOLY_BE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700346}
347#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348EXPORT_SYMBOL(crc32_be);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349
Bob Pearson3863ef32012-03-23 15:02:22 -0700350#ifdef CONFIG_CRC32_SELFTEST
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351
Bob Pearson3863ef32012-03-23 15:02:22 -0700352/* 4096 random bytes */
353static u8 __attribute__((__aligned__(8))) test_buf[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354{
Bob Pearson3863ef32012-03-23 15:02:22 -0700355 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
356 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
357 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
358 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
359 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
360 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
361 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
362 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
363 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
364 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
365 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
366 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
367 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
368 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
369 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
370 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
371 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
372 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
373 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
374 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
375 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
376 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
377 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
378 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
379 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
380 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
381 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
382 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
383 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
384 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
385 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
386 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
387 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
388 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
389 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
390 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
391 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
392 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
393 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
394 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
395 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
396 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
397 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
398 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
399 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
400 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
401 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
402 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
403 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
404 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
405 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
406 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
407 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
408 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
409 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
410 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
411 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
412 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
413 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
414 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
415 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
416 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
417 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
418 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
419 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
420 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
421 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
422 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
423 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
424 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
425 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
426 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
427 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
428 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
429 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
430 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
431 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
432 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
433 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
434 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
435 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
436 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
437 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
438 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
439 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
440 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
441 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
442 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
443 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
444 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
445 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
446 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
447 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
448 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
449 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
450 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
451 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
452 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
453 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
454 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
455 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
456 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
457 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
458 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
459 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
460 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
461 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
462 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
463 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
464 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
465 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
466 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
467 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
468 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
469 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
470 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
471 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
472 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
473 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
474 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
475 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
476 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
477 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
478 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
479 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
480 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
481 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
482 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
483 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
484 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
485 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
486 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
487 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
488 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
489 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
490 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
491 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
492 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
493 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
494 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
495 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
496 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
497 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
498 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
499 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
500 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
501 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
502 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
503 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
504 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
505 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
506 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
507 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
508 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
509 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
510 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
511 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
512 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
513 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
514 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
515 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
516 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
517 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
518 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
519 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
520 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
521 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
522 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
523 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
524 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
525 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
526 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
527 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
528 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
529 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
530 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
531 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
532 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
533 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
534 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
535 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
536 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
537 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
538 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
539 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
540 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
541 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
542 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
543 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
544 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
545 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
546 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
547 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
548 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
549 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
550 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
551 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
552 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
553 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
554 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
555 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
556 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
557 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
558 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
559 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
560 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
561 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
562 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
563 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
564 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
565 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
566 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
567 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
568 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
569 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
570 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
571 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
572 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
573 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
574 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
575 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
576 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
577 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
578 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
579 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
580 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
581 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
582 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
583 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
584 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
585 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
586 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
587 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
588 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
589 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
590 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
591 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
592 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
593 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
594 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
595 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
596 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
597 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
598 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
599 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
600 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
601 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
602 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
603 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
604 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
605 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
606 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
607 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
608 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
609 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
610 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
611 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
612 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
613 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
614 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
615 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
616 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
617 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
618 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
619 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
620 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
621 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
622 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
623 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
624 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
625 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
626 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
627 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
628 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
629 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
630 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
631 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
632 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
633 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
634 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
635 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
636 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
637 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
638 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
639 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
640 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
641 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
642 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
643 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
644 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
645 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
646 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
647 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
648 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
649 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
650 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
651 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
652 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
653 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
654 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
655 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
656 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
657 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
658 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
659 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
660 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
661 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
662 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
663 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
664 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
665 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
666 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
667 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
668 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
669 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
670 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
671 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
672 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
673 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
674 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
675 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
676 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
677 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
678 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
679 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
680 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
681 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
682 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
683 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
684 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
685 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
686 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
687 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
688 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
689 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
690 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
691 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
692 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
693 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
694 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
695 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
696 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
697 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
698 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
699 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
700 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
701 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
702 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
703 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
704 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
705 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
706 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
707 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
708 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
709 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
710 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
711 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
712 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
713 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
714 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
715 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
716 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
717 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
718 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
719 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
720 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
721 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
722 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
723 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
724 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
725 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
726 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
727 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
728 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
729 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
730 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
731 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
732 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
733 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
734 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
735 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
736 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
737 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
738 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
739 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
740 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
741 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
742 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
743 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
744 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
745 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
746 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
747 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
748 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
749 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
750 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
751 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
752 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
753 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
754 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
755 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
756 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
757 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
758 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
759 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
760 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
761 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
762 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
763 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
764 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
765 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
766 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
767 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
768 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
769 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
770 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
771 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
772 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
773 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
774 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
775 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
776 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
777 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
778 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
779 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
780 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
781 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
782 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
783 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
784 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
785 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
786 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
787 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
788 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
789 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
790 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
791 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
792 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
793 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
794 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
795 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
796 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
797 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
798 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
799 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
800 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
801 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
802 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
803 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
804 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
805 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
806 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
807 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
808 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
809 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
810 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
811 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
812 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
813 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
814 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
815 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
816 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
817 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
818 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
819 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
820 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
821 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
822 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
823 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
824 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
825 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
826 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
827 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
828 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
829 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
830 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
831 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
832 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
833 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
834 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
835 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
836 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
837 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
838 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
839 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
840 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
841 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
842 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
843 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
844 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
845 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
846 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
847 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
848 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
849 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
850 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
851 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
852 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
853 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
854 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
855 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
856 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
857 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
858 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
859 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
860 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
861 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
862 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
863 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
864 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
865 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
866 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
867};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868
Bob Pearson3863ef32012-03-23 15:02:22 -0700869/* 100 test cases */
870static struct crc_test {
871 u32 crc; /* random starting crc */
872 u32 start; /* random 6 bit offset in buf */
873 u32 length; /* random 11 bit length of test */
874 u32 crc_le; /* expected crc32_le result */
875 u32 crc_be; /* expected crc32_be result */
Darrick J. Wong577eba92012-03-23 15:02:26 -0700876 u32 crc32c_le; /* expected crc32c_le result */
Bob Pearson3863ef32012-03-23 15:02:22 -0700877} test[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878{
Daniel Borkmannd921e042013-10-30 11:50:48 +0100879 {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1, 0xf6e93d6c},
880 {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad, 0x0fe92aca},
881 {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f, 0x52e1ebb8},
882 {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a, 0x0798af9a},
883 {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2, 0x18eb3152},
884 {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793, 0xd00d08c7},
885 {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed, 0x8ba966bc},
886 {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35, 0x11d694a2},
887 {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2, 0x6ab3208d},
888 {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10, 0xba4603c5},
889 {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb, 0xe6071c6f},
890 {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0, 0x179ec30a},
891 {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb, 0x0903beb8},
892 {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed, 0x6a7cb4fa},
893 {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591, 0xdb535801},
894 {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67, 0x92bed597},
895 {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd, 0x192a3f1b},
896 {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a, 0xccbaec1a},
897 {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b, 0x7eabae4d},
898 {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f, 0x28c72982},
899 {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d, 0xc3cd4d18},
900 {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a, 0xbca8f0e7},
901 {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97, 0x713f60b3},
902 {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2, 0xebd08fd5},
903 {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138, 0x64406c59},
904 {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032, 0x7421890e},
905 {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f, 0xe9347603},
906 {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f, 0x1bef9060},
907 {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32, 0x34720072},
908 {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef, 0x48310f59},
909 {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0, 0x783a4213},
910 {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59, 0x9e8efd41},
911 {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4, 0xfc3d34a5},
912 {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c, 0x17a52ae2},
913 {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51, 0x886d935a},
914 {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11, 0xeaaeaeb2},
915 {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659, 0x8e900a4b},
916 {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af, 0xd74662b1},
917 {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99, 0xd26752ba},
918 {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b, 0x8b1fcd62},
919 {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521, 0xf54342fe},
920 {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3, 0x5b95b988},
921 {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d, 0x2e1176be},
922 {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f, 0x66120546},
923 {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b, 0xf256a5cc},
924 {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0, 0x4af1dd69},
925 {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195, 0x56f0a04a},
926 {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d, 0x74f6b6b2},
927 {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4, 0x085951fd},
928 {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3, 0xc65387eb},
929 {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643, 0x1ca9257b},
930 {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10, 0xfd196d76},
931 {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d, 0x5ef88339},
932 {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5, 0x2c3714d9},
933 {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b, 0x58576548},
934 {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee, 0xfd7c57de},
935 {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14, 0xd5fedd59},
936 {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a, 0x1cc3b17b},
937 {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b, 0x270eed73},
938 {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3, 0x91ecbb11},
939 {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826, 0x05ed8d0c},
940 {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06, 0x0b09ad5b},
941 {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35, 0xf8d511fb},
942 {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801, 0x5ad832cc},
943 {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2, 0x1214d196},
944 {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d, 0x5747218a},
945 {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c, 0xde8f14de},
946 {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba, 0x3563b7b9},
947 {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5, 0x071475d0},
948 {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b, 0x54c79d60},
949 {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178, 0x4c53eee6},
950 {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3, 0x10137a3c},
951 {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605, 0xaa9d6c73},
952 {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1, 0xb63d23e7},
953 {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9, 0x7f53e9cf},
954 {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78, 0x13c1cd83},
955 {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9, 0x49ff5867},
956 {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd, 0x8467f211},
957 {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab, 0x3f9683b2},
958 {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb, 0x76a3f874},
959 {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77, 0x863b702f},
960 {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da, 0xdc6c58ff},
961 {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39, 0x0622cc95},
962 {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16, 0xe85605cd},
963 {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208, 0x31da5f06},
964 {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e, 0xa1f2e784},
965 {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5, 0xb07cc616},
966 {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892, 0xbf943b6c},
967 {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db, 0x2c01af1c},
968 {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43, 0x0fe5f56d},
969 {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac, 0xf8943b2d},
970 {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7, 0xe4d89272},
971 {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2, 0x7c2f6bbb},
972 {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2, 0xabbf388b},
973 {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640, 0x1dca1f4e},
974 {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f, 0x5c170e23},
975 {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99, 0xc0e9d672},
976 {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7, 0xc18bdc86},
977 {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499, 0xa874fcdd},
978 {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a, 0x9dc0bb48},
Bob Pearson3863ef32012-03-23 15:02:22 -0700979};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980
Bob Pearson3863ef32012-03-23 15:02:22 -0700981#include <linux/time.h>
982
Darrick J. Wong577eba92012-03-23 15:02:26 -0700983static int __init crc32c_test(void)
984{
985 int i;
986 int errors = 0;
987 int bytes = 0;
988 struct timespec start, stop;
989 u64 nsec;
990 unsigned long flags;
991
992 /* keep static to prevent cache warming code from
993 * getting eliminated by the compiler */
994 static u32 crc;
995
996 /* pre-warm the cache */
997 for (i = 0; i < 100; i++) {
998 bytes += 2*test[i].length;
999
1000 crc ^= __crc32c_le(test[i].crc, test_buf +
1001 test[i].start, test[i].length);
1002 }
1003
1004 /* reduce OS noise */
1005 local_irq_save(flags);
1006 local_irq_disable();
1007
1008 getnstimeofday(&start);
1009 for (i = 0; i < 100; i++) {
1010 if (test[i].crc32c_le != __crc32c_le(test[i].crc, test_buf +
1011 test[i].start, test[i].length))
1012 errors++;
1013 }
1014 getnstimeofday(&stop);
1015
1016 local_irq_restore(flags);
1017 local_irq_enable();
1018
1019 nsec = stop.tv_nsec - start.tv_nsec +
1020 1000000000 * (stop.tv_sec - start.tv_sec);
1021
1022 pr_info("crc32c: CRC_LE_BITS = %d\n", CRC_LE_BITS);
1023
1024 if (errors)
1025 pr_warn("crc32c: %d self tests failed\n", errors);
1026 else {
1027 pr_info("crc32c: self tests passed, processed %d bytes in %lld nsec\n",
1028 bytes, nsec);
1029 }
1030
1031 return 0;
1032}
1033
1034static int __init crc32_test(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035{
Bob Pearson3863ef32012-03-23 15:02:22 -07001036 int i;
1037 int errors = 0;
1038 int bytes = 0;
1039 struct timespec start, stop;
1040 u64 nsec;
1041 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042
Bob Pearson3863ef32012-03-23 15:02:22 -07001043 /* keep static to prevent cache warming code from
1044 * getting eliminated by the compiler */
1045 static u32 crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046
Bob Pearson3863ef32012-03-23 15:02:22 -07001047 /* pre-warm the cache */
1048 for (i = 0; i < 100; i++) {
1049 bytes += 2*test[i].length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050
Bob Pearson3863ef32012-03-23 15:02:22 -07001051 crc ^= crc32_le(test[i].crc, test_buf +
1052 test[i].start, test[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053
Bob Pearson3863ef32012-03-23 15:02:22 -07001054 crc ^= crc32_be(test[i].crc, test_buf +
1055 test[i].start, test[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 }
1057
Bob Pearson3863ef32012-03-23 15:02:22 -07001058 /* reduce OS noise */
1059 local_irq_save(flags);
1060 local_irq_disable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061
Bob Pearson3863ef32012-03-23 15:02:22 -07001062 getnstimeofday(&start);
1063 for (i = 0; i < 100; i++) {
1064 if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
1065 test[i].start, test[i].length))
1066 errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067
Bob Pearson3863ef32012-03-23 15:02:22 -07001068 if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
1069 test[i].start, test[i].length))
1070 errors++;
1071 }
1072 getnstimeofday(&stop);
1073
1074 local_irq_restore(flags);
1075 local_irq_enable();
1076
1077 nsec = stop.tv_nsec - start.tv_nsec +
1078 1000000000 * (stop.tv_sec - start.tv_sec);
1079
1080 pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
1081 CRC_LE_BITS, CRC_BE_BITS);
1082
1083 if (errors)
1084 pr_warn("crc32: %d self tests failed\n", errors);
1085 else {
1086 pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
1087 bytes, nsec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088 }
1089
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 return 0;
1091}
1092
Darrick J. Wong577eba92012-03-23 15:02:26 -07001093static int __init crc32test_init(void)
1094{
1095 crc32_test();
1096 crc32c_test();
1097 return 0;
1098}
1099
Bob Pearson3863ef32012-03-23 15:02:22 -07001100static void __exit crc32_exit(void)
1101{
1102}
1103
Darrick J. Wong577eba92012-03-23 15:02:26 -07001104module_init(crc32test_init);
Bob Pearson3863ef32012-03-23 15:02:22 -07001105module_exit(crc32_exit);
1106#endif /* CONFIG_CRC32_SELFTEST */