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