symphonia_core/checksum/
crc32.rs

1// Symphonia
2// Copyright (c) 2019-2022 The Project Symphonia Developers.
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at https://mozilla.org/MPL/2.0/.
7
8use crate::io::Monitor;
9
10#[rustfmt::skip]
11const CRC32: [[u32; 256]; 8] =
12[
13    [
14        0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
15        0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
16        0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
17        0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
18        0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
19        0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
20        0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
21        0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
22        0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
23        0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
24        0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
25        0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
26        0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
27        0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
28        0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
29        0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
30        0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
31        0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
32        0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
33        0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
34        0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
35        0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
36        0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
37        0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
38        0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
39        0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
40        0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
41        0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
42        0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
43        0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
44        0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
45        0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
46        0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
47        0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
48        0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
49        0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
50        0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
51        0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
52        0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
53        0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
54        0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
55        0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
56        0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
57        0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
58        0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
59        0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
60        0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
61        0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
62        0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
63        0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
64        0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
65        0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
66        0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
67        0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
68        0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
69        0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
70        0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
71        0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
72        0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
73        0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
74        0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
75        0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
76        0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
77        0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,
78    ],
79    [
80        0x00000000, 0xd219c1dc, 0xa0f29e0f, 0x72eb5fd3,
81        0x452421a9, 0x973de075, 0xe5d6bfa6, 0x37cf7e7a,
82        0x8a484352, 0x5851828e, 0x2abadd5d, 0xf8a31c81,
83        0xcf6c62fb, 0x1d75a327, 0x6f9efcf4, 0xbd873d28,
84        0x10519b13, 0xc2485acf, 0xb0a3051c, 0x62bac4c0,
85        0x5575baba, 0x876c7b66, 0xf58724b5, 0x279ee569,
86        0x9a19d841, 0x4800199d, 0x3aeb464e, 0xe8f28792,
87        0xdf3df9e8, 0x0d243834, 0x7fcf67e7, 0xadd6a63b,
88        0x20a33626, 0xf2baf7fa, 0x8051a829, 0x524869f5,
89        0x6587178f, 0xb79ed653, 0xc5758980, 0x176c485c,
90        0xaaeb7574, 0x78f2b4a8, 0x0a19eb7b, 0xd8002aa7,
91        0xefcf54dd, 0x3dd69501, 0x4f3dcad2, 0x9d240b0e,
92        0x30f2ad35, 0xe2eb6ce9, 0x9000333a, 0x4219f2e6,
93        0x75d68c9c, 0xa7cf4d40, 0xd5241293, 0x073dd34f,
94        0xbabaee67, 0x68a32fbb, 0x1a487068, 0xc851b1b4,
95        0xff9ecfce, 0x2d870e12, 0x5f6c51c1, 0x8d75901d,
96        0x41466c4c, 0x935fad90, 0xe1b4f243, 0x33ad339f,
97        0x04624de5, 0xd67b8c39, 0xa490d3ea, 0x76891236,
98        0xcb0e2f1e, 0x1917eec2, 0x6bfcb111, 0xb9e570cd,
99        0x8e2a0eb7, 0x5c33cf6b, 0x2ed890b8, 0xfcc15164,
100        0x5117f75f, 0x830e3683, 0xf1e56950, 0x23fca88c,
101        0x1433d6f6, 0xc62a172a, 0xb4c148f9, 0x66d88925,
102        0xdb5fb40d, 0x094675d1, 0x7bad2a02, 0xa9b4ebde,
103        0x9e7b95a4, 0x4c625478, 0x3e890bab, 0xec90ca77,
104        0x61e55a6a, 0xb3fc9bb6, 0xc117c465, 0x130e05b9,
105        0x24c17bc3, 0xf6d8ba1f, 0x8433e5cc, 0x562a2410,
106        0xebad1938, 0x39b4d8e4, 0x4b5f8737, 0x994646eb,
107        0xae893891, 0x7c90f94d, 0x0e7ba69e, 0xdc626742,
108        0x71b4c179, 0xa3ad00a5, 0xd1465f76, 0x035f9eaa,
109        0x3490e0d0, 0xe689210c, 0x94627edf, 0x467bbf03,
110        0xfbfc822b, 0x29e543f7, 0x5b0e1c24, 0x8917ddf8,
111        0xbed8a382, 0x6cc1625e, 0x1e2a3d8d, 0xcc33fc51,
112        0x828cd898, 0x50951944, 0x227e4697, 0xf067874b,
113        0xc7a8f931, 0x15b138ed, 0x675a673e, 0xb543a6e2,
114        0x08c49bca, 0xdadd5a16, 0xa83605c5, 0x7a2fc419,
115        0x4de0ba63, 0x9ff97bbf, 0xed12246c, 0x3f0be5b0,
116        0x92dd438b, 0x40c48257, 0x322fdd84, 0xe0361c58,
117        0xd7f96222, 0x05e0a3fe, 0x770bfc2d, 0xa5123df1,
118        0x189500d9, 0xca8cc105, 0xb8679ed6, 0x6a7e5f0a,
119        0x5db12170, 0x8fa8e0ac, 0xfd43bf7f, 0x2f5a7ea3,
120        0xa22feebe, 0x70362f62, 0x02dd70b1, 0xd0c4b16d,
121        0xe70bcf17, 0x35120ecb, 0x47f95118, 0x95e090c4,
122        0x2867adec, 0xfa7e6c30, 0x889533e3, 0x5a8cf23f,
123        0x6d438c45, 0xbf5a4d99, 0xcdb1124a, 0x1fa8d396,
124        0xb27e75ad, 0x6067b471, 0x128ceba2, 0xc0952a7e,
125        0xf75a5404, 0x254395d8, 0x57a8ca0b, 0x85b10bd7,
126        0x383636ff, 0xea2ff723, 0x98c4a8f0, 0x4add692c,
127        0x7d121756, 0xaf0bd68a, 0xdde08959, 0x0ff94885,
128        0xc3cab4d4, 0x11d37508, 0x63382adb, 0xb121eb07,
129        0x86ee957d, 0x54f754a1, 0x261c0b72, 0xf405caae,
130        0x4982f786, 0x9b9b365a, 0xe9706989, 0x3b69a855,
131        0x0ca6d62f, 0xdebf17f3, 0xac544820, 0x7e4d89fc,
132        0xd39b2fc7, 0x0182ee1b, 0x7369b1c8, 0xa1707014,
133        0x96bf0e6e, 0x44a6cfb2, 0x364d9061, 0xe45451bd,
134        0x59d36c95, 0x8bcaad49, 0xf921f29a, 0x2b383346,
135        0x1cf74d3c, 0xceee8ce0, 0xbc05d333, 0x6e1c12ef,
136        0xe36982f2, 0x3170432e, 0x439b1cfd, 0x9182dd21,
137        0xa64da35b, 0x74546287, 0x06bf3d54, 0xd4a6fc88,
138        0x6921c1a0, 0xbb38007c, 0xc9d35faf, 0x1bca9e73,
139        0x2c05e009, 0xfe1c21d5, 0x8cf77e06, 0x5eeebfda,
140        0xf33819e1, 0x2121d83d, 0x53ca87ee, 0x81d34632,
141        0xb61c3848, 0x6405f994, 0x16eea647, 0xc4f7679b,
142        0x79705ab3, 0xab699b6f, 0xd982c4bc, 0x0b9b0560,
143        0x3c547b1a, 0xee4dbac6, 0x9ca6e515, 0x4ebf24c9,
144    ],
145    [
146        0x00000000, 0x01d8ac87, 0x03b1590e, 0x0269f589,
147        0x0762b21c, 0x06ba1e9b, 0x04d3eb12, 0x050b4795,
148        0x0ec56438, 0x0f1dc8bf, 0x0d743d36, 0x0cac91b1,
149        0x09a7d624, 0x087f7aa3, 0x0a168f2a, 0x0bce23ad,
150        0x1d8ac870, 0x1c5264f7, 0x1e3b917e, 0x1fe33df9,
151        0x1ae87a6c, 0x1b30d6eb, 0x19592362, 0x18818fe5,
152        0x134fac48, 0x129700cf, 0x10fef546, 0x112659c1,
153        0x142d1e54, 0x15f5b2d3, 0x179c475a, 0x1644ebdd,
154        0x3b1590e0, 0x3acd3c67, 0x38a4c9ee, 0x397c6569,
155        0x3c7722fc, 0x3daf8e7b, 0x3fc67bf2, 0x3e1ed775,
156        0x35d0f4d8, 0x3408585f, 0x3661add6, 0x37b90151,
157        0x32b246c4, 0x336aea43, 0x31031fca, 0x30dbb34d,
158        0x269f5890, 0x2747f417, 0x252e019e, 0x24f6ad19,
159        0x21fdea8c, 0x2025460b, 0x224cb382, 0x23941f05,
160        0x285a3ca8, 0x2982902f, 0x2beb65a6, 0x2a33c921,
161        0x2f388eb4, 0x2ee02233, 0x2c89d7ba, 0x2d517b3d,
162        0x762b21c0, 0x77f38d47, 0x759a78ce, 0x7442d449,
163        0x714993dc, 0x70913f5b, 0x72f8cad2, 0x73206655,
164        0x78ee45f8, 0x7936e97f, 0x7b5f1cf6, 0x7a87b071,
165        0x7f8cf7e4, 0x7e545b63, 0x7c3daeea, 0x7de5026d,
166        0x6ba1e9b0, 0x6a794537, 0x6810b0be, 0x69c81c39,
167        0x6cc35bac, 0x6d1bf72b, 0x6f7202a2, 0x6eaaae25,
168        0x65648d88, 0x64bc210f, 0x66d5d486, 0x670d7801,
169        0x62063f94, 0x63de9313, 0x61b7669a, 0x606fca1d,
170        0x4d3eb120, 0x4ce61da7, 0x4e8fe82e, 0x4f5744a9,
171        0x4a5c033c, 0x4b84afbb, 0x49ed5a32, 0x4835f6b5,
172        0x43fbd518, 0x4223799f, 0x404a8c16, 0x41922091,
173        0x44996704, 0x4541cb83, 0x47283e0a, 0x46f0928d,
174        0x50b47950, 0x516cd5d7, 0x5305205e, 0x52dd8cd9,
175        0x57d6cb4c, 0x560e67cb, 0x54679242, 0x55bf3ec5,
176        0x5e711d68, 0x5fa9b1ef, 0x5dc04466, 0x5c18e8e1,
177        0x5913af74, 0x58cb03f3, 0x5aa2f67a, 0x5b7a5afd,
178        0xec564380, 0xed8eef07, 0xefe71a8e, 0xee3fb609,
179        0xeb34f19c, 0xeaec5d1b, 0xe885a892, 0xe95d0415,
180        0xe29327b8, 0xe34b8b3f, 0xe1227eb6, 0xe0fad231,
181        0xe5f195a4, 0xe4293923, 0xe640ccaa, 0xe798602d,
182        0xf1dc8bf0, 0xf0042777, 0xf26dd2fe, 0xf3b57e79,
183        0xf6be39ec, 0xf766956b, 0xf50f60e2, 0xf4d7cc65,
184        0xff19efc8, 0xfec1434f, 0xfca8b6c6, 0xfd701a41,
185        0xf87b5dd4, 0xf9a3f153, 0xfbca04da, 0xfa12a85d,
186        0xd743d360, 0xd69b7fe7, 0xd4f28a6e, 0xd52a26e9,
187        0xd021617c, 0xd1f9cdfb, 0xd3903872, 0xd24894f5,
188        0xd986b758, 0xd85e1bdf, 0xda37ee56, 0xdbef42d1,
189        0xdee40544, 0xdf3ca9c3, 0xdd555c4a, 0xdc8df0cd,
190        0xcac91b10, 0xcb11b797, 0xc978421e, 0xc8a0ee99,
191        0xcdaba90c, 0xcc73058b, 0xce1af002, 0xcfc25c85,
192        0xc40c7f28, 0xc5d4d3af, 0xc7bd2626, 0xc6658aa1,
193        0xc36ecd34, 0xc2b661b3, 0xc0df943a, 0xc10738bd,
194        0x9a7d6240, 0x9ba5cec7, 0x99cc3b4e, 0x981497c9,
195        0x9d1fd05c, 0x9cc77cdb, 0x9eae8952, 0x9f7625d5,
196        0x94b80678, 0x9560aaff, 0x97095f76, 0x96d1f3f1,
197        0x93dab464, 0x920218e3, 0x906bed6a, 0x91b341ed,
198        0x87f7aa30, 0x862f06b7, 0x8446f33e, 0x859e5fb9,
199        0x8095182c, 0x814db4ab, 0x83244122, 0x82fceda5,
200        0x8932ce08, 0x88ea628f, 0x8a839706, 0x8b5b3b81,
201        0x8e507c14, 0x8f88d093, 0x8de1251a, 0x8c39899d,
202        0xa168f2a0, 0xa0b05e27, 0xa2d9abae, 0xa3010729,
203        0xa60a40bc, 0xa7d2ec3b, 0xa5bb19b2, 0xa463b535,
204        0xafad9698, 0xae753a1f, 0xac1ccf96, 0xadc46311,
205        0xa8cf2484, 0xa9178803, 0xab7e7d8a, 0xaaa6d10d,
206        0xbce23ad0, 0xbd3a9657, 0xbf5363de, 0xbe8bcf59,
207        0xbb8088cc, 0xba58244b, 0xb831d1c2, 0xb9e97d45,
208        0xb2275ee8, 0xb3fff26f, 0xb19607e6, 0xb04eab61,
209        0xb545ecf4, 0xb49d4073, 0xb6f4b5fa, 0xb72c197d,
210    ],
211    [
212        0x00000000, 0xdc6d9ab7, 0xbc1a28d9, 0x6077b26e,
213        0x7cf54c05, 0xa098d6b2, 0xc0ef64dc, 0x1c82fe6b,
214        0xf9ea980a, 0x258702bd, 0x45f0b0d3, 0x999d2a64,
215        0x851fd40f, 0x59724eb8, 0x3905fcd6, 0xe5686661,
216        0xf7142da3, 0x2b79b714, 0x4b0e057a, 0x97639fcd,
217        0x8be161a6, 0x578cfb11, 0x37fb497f, 0xeb96d3c8,
218        0x0efeb5a9, 0xd2932f1e, 0xb2e49d70, 0x6e8907c7,
219        0x720bf9ac, 0xae66631b, 0xce11d175, 0x127c4bc2,
220        0xeae946f1, 0x3684dc46, 0x56f36e28, 0x8a9ef49f,
221        0x961c0af4, 0x4a719043, 0x2a06222d, 0xf66bb89a,
222        0x1303defb, 0xcf6e444c, 0xaf19f622, 0x73746c95,
223        0x6ff692fe, 0xb39b0849, 0xd3ecba27, 0x0f812090,
224        0x1dfd6b52, 0xc190f1e5, 0xa1e7438b, 0x7d8ad93c,
225        0x61082757, 0xbd65bde0, 0xdd120f8e, 0x017f9539,
226        0xe417f358, 0x387a69ef, 0x580ddb81, 0x84604136,
227        0x98e2bf5d, 0x448f25ea, 0x24f89784, 0xf8950d33,
228        0xd1139055, 0x0d7e0ae2, 0x6d09b88c, 0xb164223b,
229        0xade6dc50, 0x718b46e7, 0x11fcf489, 0xcd916e3e,
230        0x28f9085f, 0xf49492e8, 0x94e32086, 0x488eba31,
231        0x540c445a, 0x8861deed, 0xe8166c83, 0x347bf634,
232        0x2607bdf6, 0xfa6a2741, 0x9a1d952f, 0x46700f98,
233        0x5af2f1f3, 0x869f6b44, 0xe6e8d92a, 0x3a85439d,
234        0xdfed25fc, 0x0380bf4b, 0x63f70d25, 0xbf9a9792,
235        0xa31869f9, 0x7f75f34e, 0x1f024120, 0xc36fdb97,
236        0x3bfad6a4, 0xe7974c13, 0x87e0fe7d, 0x5b8d64ca,
237        0x470f9aa1, 0x9b620016, 0xfb15b278, 0x277828cf,
238        0xc2104eae, 0x1e7dd419, 0x7e0a6677, 0xa267fcc0,
239        0xbee502ab, 0x6288981c, 0x02ff2a72, 0xde92b0c5,
240        0xcceefb07, 0x108361b0, 0x70f4d3de, 0xac994969,
241        0xb01bb702, 0x6c762db5, 0x0c019fdb, 0xd06c056c,
242        0x3504630d, 0xe969f9ba, 0x891e4bd4, 0x5573d163,
243        0x49f12f08, 0x959cb5bf, 0xf5eb07d1, 0x29869d66,
244        0xa6e63d1d, 0x7a8ba7aa, 0x1afc15c4, 0xc6918f73,
245        0xda137118, 0x067eebaf, 0x660959c1, 0xba64c376,
246        0x5f0ca517, 0x83613fa0, 0xe3168dce, 0x3f7b1779,
247        0x23f9e912, 0xff9473a5, 0x9fe3c1cb, 0x438e5b7c,
248        0x51f210be, 0x8d9f8a09, 0xede83867, 0x3185a2d0,
249        0x2d075cbb, 0xf16ac60c, 0x911d7462, 0x4d70eed5,
250        0xa81888b4, 0x74751203, 0x1402a06d, 0xc86f3ada,
251        0xd4edc4b1, 0x08805e06, 0x68f7ec68, 0xb49a76df,
252        0x4c0f7bec, 0x9062e15b, 0xf0155335, 0x2c78c982,
253        0x30fa37e9, 0xec97ad5e, 0x8ce01f30, 0x508d8587,
254        0xb5e5e3e6, 0x69887951, 0x09ffcb3f, 0xd5925188,
255        0xc910afe3, 0x157d3554, 0x750a873a, 0xa9671d8d,
256        0xbb1b564f, 0x6776ccf8, 0x07017e96, 0xdb6ce421,
257        0xc7ee1a4a, 0x1b8380fd, 0x7bf43293, 0xa799a824,
258        0x42f1ce45, 0x9e9c54f2, 0xfeebe69c, 0x22867c2b,
259        0x3e048240, 0xe26918f7, 0x821eaa99, 0x5e73302e,
260        0x77f5ad48, 0xab9837ff, 0xcbef8591, 0x17821f26,
261        0x0b00e14d, 0xd76d7bfa, 0xb71ac994, 0x6b775323,
262        0x8e1f3542, 0x5272aff5, 0x32051d9b, 0xee68872c,
263        0xf2ea7947, 0x2e87e3f0, 0x4ef0519e, 0x929dcb29,
264        0x80e180eb, 0x5c8c1a5c, 0x3cfba832, 0xe0963285,
265        0xfc14ccee, 0x20795659, 0x400ee437, 0x9c637e80,
266        0x790b18e1, 0xa5668256, 0xc5113038, 0x197caa8f,
267        0x05fe54e4, 0xd993ce53, 0xb9e47c3d, 0x6589e68a,
268        0x9d1cebb9, 0x4171710e, 0x2106c360, 0xfd6b59d7,
269        0xe1e9a7bc, 0x3d843d0b, 0x5df38f65, 0x819e15d2,
270        0x64f673b3, 0xb89be904, 0xd8ec5b6a, 0x0481c1dd,
271        0x18033fb6, 0xc46ea501, 0xa419176f, 0x78748dd8,
272        0x6a08c61a, 0xb6655cad, 0xd612eec3, 0x0a7f7474,
273        0x16fd8a1f, 0xca9010a8, 0xaae7a2c6, 0x768a3871,
274        0x93e25e10, 0x4f8fc4a7, 0x2ff876c9, 0xf395ec7e,
275        0xef171215, 0x337a88a2, 0x530d3acc, 0x8f60a07b,
276    ],
277    [
278        0x00000000, 0x490d678d, 0x921acf1a, 0xdb17a897,
279        0x20f48383, 0x69f9e40e, 0xb2ee4c99, 0xfbe32b14,
280        0x41e90706, 0x08e4608b, 0xd3f3c81c, 0x9afeaf91,
281        0x611d8485, 0x2810e308, 0xf3074b9f, 0xba0a2c12,
282        0x83d20e0c, 0xcadf6981, 0x11c8c116, 0x58c5a69b,
283        0xa3268d8f, 0xea2bea02, 0x313c4295, 0x78312518,
284        0xc23b090a, 0x8b366e87, 0x5021c610, 0x192ca19d,
285        0xe2cf8a89, 0xabc2ed04, 0x70d54593, 0x39d8221e,
286        0x036501af, 0x4a686622, 0x917fceb5, 0xd872a938,
287        0x2391822c, 0x6a9ce5a1, 0xb18b4d36, 0xf8862abb,
288        0x428c06a9, 0x0b816124, 0xd096c9b3, 0x999bae3e,
289        0x6278852a, 0x2b75e2a7, 0xf0624a30, 0xb96f2dbd,
290        0x80b70fa3, 0xc9ba682e, 0x12adc0b9, 0x5ba0a734,
291        0xa0438c20, 0xe94eebad, 0x3259433a, 0x7b5424b7,
292        0xc15e08a5, 0x88536f28, 0x5344c7bf, 0x1a49a032,
293        0xe1aa8b26, 0xa8a7ecab, 0x73b0443c, 0x3abd23b1,
294        0x06ca035e, 0x4fc764d3, 0x94d0cc44, 0xddddabc9,
295        0x263e80dd, 0x6f33e750, 0xb4244fc7, 0xfd29284a,
296        0x47230458, 0x0e2e63d5, 0xd539cb42, 0x9c34accf,
297        0x67d787db, 0x2edae056, 0xf5cd48c1, 0xbcc02f4c,
298        0x85180d52, 0xcc156adf, 0x1702c248, 0x5e0fa5c5,
299        0xa5ec8ed1, 0xece1e95c, 0x37f641cb, 0x7efb2646,
300        0xc4f10a54, 0x8dfc6dd9, 0x56ebc54e, 0x1fe6a2c3,
301        0xe40589d7, 0xad08ee5a, 0x761f46cd, 0x3f122140,
302        0x05af02f1, 0x4ca2657c, 0x97b5cdeb, 0xdeb8aa66,
303        0x255b8172, 0x6c56e6ff, 0xb7414e68, 0xfe4c29e5,
304        0x444605f7, 0x0d4b627a, 0xd65ccaed, 0x9f51ad60,
305        0x64b28674, 0x2dbfe1f9, 0xf6a8496e, 0xbfa52ee3,
306        0x867d0cfd, 0xcf706b70, 0x1467c3e7, 0x5d6aa46a,
307        0xa6898f7e, 0xef84e8f3, 0x34934064, 0x7d9e27e9,
308        0xc7940bfb, 0x8e996c76, 0x558ec4e1, 0x1c83a36c,
309        0xe7608878, 0xae6deff5, 0x757a4762, 0x3c7720ef,
310        0x0d9406bc, 0x44996131, 0x9f8ec9a6, 0xd683ae2b,
311        0x2d60853f, 0x646de2b2, 0xbf7a4a25, 0xf6772da8,
312        0x4c7d01ba, 0x05706637, 0xde67cea0, 0x976aa92d,
313        0x6c898239, 0x2584e5b4, 0xfe934d23, 0xb79e2aae,
314        0x8e4608b0, 0xc74b6f3d, 0x1c5cc7aa, 0x5551a027,
315        0xaeb28b33, 0xe7bfecbe, 0x3ca84429, 0x75a523a4,
316        0xcfaf0fb6, 0x86a2683b, 0x5db5c0ac, 0x14b8a721,
317        0xef5b8c35, 0xa656ebb8, 0x7d41432f, 0x344c24a2,
318        0x0ef10713, 0x47fc609e, 0x9cebc809, 0xd5e6af84,
319        0x2e058490, 0x6708e31d, 0xbc1f4b8a, 0xf5122c07,
320        0x4f180015, 0x06156798, 0xdd02cf0f, 0x940fa882,
321        0x6fec8396, 0x26e1e41b, 0xfdf64c8c, 0xb4fb2b01,
322        0x8d23091f, 0xc42e6e92, 0x1f39c605, 0x5634a188,
323        0xadd78a9c, 0xe4daed11, 0x3fcd4586, 0x76c0220b,
324        0xccca0e19, 0x85c76994, 0x5ed0c103, 0x17dda68e,
325        0xec3e8d9a, 0xa533ea17, 0x7e244280, 0x3729250d,
326        0x0b5e05e2, 0x4253626f, 0x9944caf8, 0xd049ad75,
327        0x2baa8661, 0x62a7e1ec, 0xb9b0497b, 0xf0bd2ef6,
328        0x4ab702e4, 0x03ba6569, 0xd8adcdfe, 0x91a0aa73,
329        0x6a438167, 0x234ee6ea, 0xf8594e7d, 0xb15429f0,
330        0x888c0bee, 0xc1816c63, 0x1a96c4f4, 0x539ba379,
331        0xa878886d, 0xe175efe0, 0x3a624777, 0x736f20fa,
332        0xc9650ce8, 0x80686b65, 0x5b7fc3f2, 0x1272a47f,
333        0xe9918f6b, 0xa09ce8e6, 0x7b8b4071, 0x328627fc,
334        0x083b044d, 0x413663c0, 0x9a21cb57, 0xd32cacda,
335        0x28cf87ce, 0x61c2e043, 0xbad548d4, 0xf3d82f59,
336        0x49d2034b, 0x00df64c6, 0xdbc8cc51, 0x92c5abdc,
337        0x692680c8, 0x202be745, 0xfb3c4fd2, 0xb231285f,
338        0x8be90a41, 0xc2e46dcc, 0x19f3c55b, 0x50fea2d6,
339        0xab1d89c2, 0xe210ee4f, 0x390746d8, 0x700a2155,
340        0xca000d47, 0x830d6aca, 0x581ac25d, 0x1117a5d0,
341        0xeaf48ec4, 0xa3f9e949, 0x78ee41de, 0x31e32653,
342    ],
343    [
344        0x00000000, 0x1b280d78, 0x36501af0, 0x2d781788,
345        0x6ca035e0, 0x77883898, 0x5af02f10, 0x41d82268,
346        0xd9406bc0, 0xc26866b8, 0xef107130, 0xf4387c48,
347        0xb5e05e20, 0xaec85358, 0x83b044d0, 0x989849a8,
348        0xb641ca37, 0xad69c74f, 0x8011d0c7, 0x9b39ddbf,
349        0xdae1ffd7, 0xc1c9f2af, 0xecb1e527, 0xf799e85f,
350        0x6f01a1f7, 0x7429ac8f, 0x5951bb07, 0x4279b67f,
351        0x03a19417, 0x1889996f, 0x35f18ee7, 0x2ed9839f,
352        0x684289d9, 0x736a84a1, 0x5e129329, 0x453a9e51,
353        0x04e2bc39, 0x1fcab141, 0x32b2a6c9, 0x299aabb1,
354        0xb102e219, 0xaa2aef61, 0x8752f8e9, 0x9c7af591,
355        0xdda2d7f9, 0xc68ada81, 0xebf2cd09, 0xf0dac071,
356        0xde0343ee, 0xc52b4e96, 0xe853591e, 0xf37b5466,
357        0xb2a3760e, 0xa98b7b76, 0x84f36cfe, 0x9fdb6186,
358        0x0743282e, 0x1c6b2556, 0x311332de, 0x2a3b3fa6,
359        0x6be31dce, 0x70cb10b6, 0x5db3073e, 0x469b0a46,
360        0xd08513b2, 0xcbad1eca, 0xe6d50942, 0xfdfd043a,
361        0xbc252652, 0xa70d2b2a, 0x8a753ca2, 0x915d31da,
362        0x09c57872, 0x12ed750a, 0x3f956282, 0x24bd6ffa,
363        0x65654d92, 0x7e4d40ea, 0x53355762, 0x481d5a1a,
364        0x66c4d985, 0x7decd4fd, 0x5094c375, 0x4bbcce0d,
365        0x0a64ec65, 0x114ce11d, 0x3c34f695, 0x271cfbed,
366        0xbf84b245, 0xa4acbf3d, 0x89d4a8b5, 0x92fca5cd,
367        0xd32487a5, 0xc80c8add, 0xe5749d55, 0xfe5c902d,
368        0xb8c79a6b, 0xa3ef9713, 0x8e97809b, 0x95bf8de3,
369        0xd467af8b, 0xcf4fa2f3, 0xe237b57b, 0xf91fb803,
370        0x6187f1ab, 0x7aaffcd3, 0x57d7eb5b, 0x4cffe623,
371        0x0d27c44b, 0x160fc933, 0x3b77debb, 0x205fd3c3,
372        0x0e86505c, 0x15ae5d24, 0x38d64aac, 0x23fe47d4,
373        0x622665bc, 0x790e68c4, 0x54767f4c, 0x4f5e7234,
374        0xd7c63b9c, 0xccee36e4, 0xe196216c, 0xfabe2c14,
375        0xbb660e7c, 0xa04e0304, 0x8d36148c, 0x961e19f4,
376        0xa5cb3ad3, 0xbee337ab, 0x939b2023, 0x88b32d5b,
377        0xc96b0f33, 0xd243024b, 0xff3b15c3, 0xe41318bb,
378        0x7c8b5113, 0x67a35c6b, 0x4adb4be3, 0x51f3469b,
379        0x102b64f3, 0x0b03698b, 0x267b7e03, 0x3d53737b,
380        0x138af0e4, 0x08a2fd9c, 0x25daea14, 0x3ef2e76c,
381        0x7f2ac504, 0x6402c87c, 0x497adff4, 0x5252d28c,
382        0xcaca9b24, 0xd1e2965c, 0xfc9a81d4, 0xe7b28cac,
383        0xa66aaec4, 0xbd42a3bc, 0x903ab434, 0x8b12b94c,
384        0xcd89b30a, 0xd6a1be72, 0xfbd9a9fa, 0xe0f1a482,
385        0xa12986ea, 0xba018b92, 0x97799c1a, 0x8c519162,
386        0x14c9d8ca, 0x0fe1d5b2, 0x2299c23a, 0x39b1cf42,
387        0x7869ed2a, 0x6341e052, 0x4e39f7da, 0x5511faa2,
388        0x7bc8793d, 0x60e07445, 0x4d9863cd, 0x56b06eb5,
389        0x17684cdd, 0x0c4041a5, 0x2138562d, 0x3a105b55,
390        0xa28812fd, 0xb9a01f85, 0x94d8080d, 0x8ff00575,
391        0xce28271d, 0xd5002a65, 0xf8783ded, 0xe3503095,
392        0x754e2961, 0x6e662419, 0x431e3391, 0x58363ee9,
393        0x19ee1c81, 0x02c611f9, 0x2fbe0671, 0x34960b09,
394        0xac0e42a1, 0xb7264fd9, 0x9a5e5851, 0x81765529,
395        0xc0ae7741, 0xdb867a39, 0xf6fe6db1, 0xedd660c9,
396        0xc30fe356, 0xd827ee2e, 0xf55ff9a6, 0xee77f4de,
397        0xafafd6b6, 0xb487dbce, 0x99ffcc46, 0x82d7c13e,
398        0x1a4f8896, 0x016785ee, 0x2c1f9266, 0x37379f1e,
399        0x76efbd76, 0x6dc7b00e, 0x40bfa786, 0x5b97aafe,
400        0x1d0ca0b8, 0x0624adc0, 0x2b5cba48, 0x3074b730,
401        0x71ac9558, 0x6a849820, 0x47fc8fa8, 0x5cd482d0,
402        0xc44ccb78, 0xdf64c600, 0xf21cd188, 0xe934dcf0,
403        0xa8ecfe98, 0xb3c4f3e0, 0x9ebce468, 0x8594e910,
404        0xab4d6a8f, 0xb06567f7, 0x9d1d707f, 0x86357d07,
405        0xc7ed5f6f, 0xdcc55217, 0xf1bd459f, 0xea9548e7,
406        0x720d014f, 0x69250c37, 0x445d1bbf, 0x5f7516c7,
407        0x1ead34af, 0x058539d7, 0x28fd2e5f, 0x33d52327,
408    ],
409    [
410        0x00000000, 0x4f576811, 0x9eaed022, 0xd1f9b833,
411        0x399cbdf3, 0x76cbd5e2, 0xa7326dd1, 0xe86505c0,
412        0x73397be6, 0x3c6e13f7, 0xed97abc4, 0xa2c0c3d5,
413        0x4aa5c615, 0x05f2ae04, 0xd40b1637, 0x9b5c7e26,
414        0xe672f7cc, 0xa9259fdd, 0x78dc27ee, 0x378b4fff,
415        0xdfee4a3f, 0x90b9222e, 0x41409a1d, 0x0e17f20c,
416        0x954b8c2a, 0xda1ce43b, 0x0be55c08, 0x44b23419,
417        0xacd731d9, 0xe38059c8, 0x3279e1fb, 0x7d2e89ea,
418        0xc824f22f, 0x87739a3e, 0x568a220d, 0x19dd4a1c,
419        0xf1b84fdc, 0xbeef27cd, 0x6f169ffe, 0x2041f7ef,
420        0xbb1d89c9, 0xf44ae1d8, 0x25b359eb, 0x6ae431fa,
421        0x8281343a, 0xcdd65c2b, 0x1c2fe418, 0x53788c09,
422        0x2e5605e3, 0x61016df2, 0xb0f8d5c1, 0xffafbdd0,
423        0x17cab810, 0x589dd001, 0x89646832, 0xc6330023,
424        0x5d6f7e05, 0x12381614, 0xc3c1ae27, 0x8c96c636,
425        0x64f3c3f6, 0x2ba4abe7, 0xfa5d13d4, 0xb50a7bc5,
426        0x9488f9e9, 0xdbdf91f8, 0x0a2629cb, 0x457141da,
427        0xad14441a, 0xe2432c0b, 0x33ba9438, 0x7cedfc29,
428        0xe7b1820f, 0xa8e6ea1e, 0x791f522d, 0x36483a3c,
429        0xde2d3ffc, 0x917a57ed, 0x4083efde, 0x0fd487cf,
430        0x72fa0e25, 0x3dad6634, 0xec54de07, 0xa303b616,
431        0x4b66b3d6, 0x0431dbc7, 0xd5c863f4, 0x9a9f0be5,
432        0x01c375c3, 0x4e941dd2, 0x9f6da5e1, 0xd03acdf0,
433        0x385fc830, 0x7708a021, 0xa6f11812, 0xe9a67003,
434        0x5cac0bc6, 0x13fb63d7, 0xc202dbe4, 0x8d55b3f5,
435        0x6530b635, 0x2a67de24, 0xfb9e6617, 0xb4c90e06,
436        0x2f957020, 0x60c21831, 0xb13ba002, 0xfe6cc813,
437        0x1609cdd3, 0x595ea5c2, 0x88a71df1, 0xc7f075e0,
438        0xbadefc0a, 0xf589941b, 0x24702c28, 0x6b274439,
439        0x834241f9, 0xcc1529e8, 0x1dec91db, 0x52bbf9ca,
440        0xc9e787ec, 0x86b0effd, 0x574957ce, 0x181e3fdf,
441        0xf07b3a1f, 0xbf2c520e, 0x6ed5ea3d, 0x2182822c,
442        0x2dd0ee65, 0x62878674, 0xb37e3e47, 0xfc295656,
443        0x144c5396, 0x5b1b3b87, 0x8ae283b4, 0xc5b5eba5,
444        0x5ee99583, 0x11befd92, 0xc04745a1, 0x8f102db0,
445        0x67752870, 0x28224061, 0xf9dbf852, 0xb68c9043,
446        0xcba219a9, 0x84f571b8, 0x550cc98b, 0x1a5ba19a,
447        0xf23ea45a, 0xbd69cc4b, 0x6c907478, 0x23c71c69,
448        0xb89b624f, 0xf7cc0a5e, 0x2635b26d, 0x6962da7c,
449        0x8107dfbc, 0xce50b7ad, 0x1fa90f9e, 0x50fe678f,
450        0xe5f41c4a, 0xaaa3745b, 0x7b5acc68, 0x340da479,
451        0xdc68a1b9, 0x933fc9a8, 0x42c6719b, 0x0d91198a,
452        0x96cd67ac, 0xd99a0fbd, 0x0863b78e, 0x4734df9f,
453        0xaf51da5f, 0xe006b24e, 0x31ff0a7d, 0x7ea8626c,
454        0x0386eb86, 0x4cd18397, 0x9d283ba4, 0xd27f53b5,
455        0x3a1a5675, 0x754d3e64, 0xa4b48657, 0xebe3ee46,
456        0x70bf9060, 0x3fe8f871, 0xee114042, 0xa1462853,
457        0x49232d93, 0x06744582, 0xd78dfdb1, 0x98da95a0,
458        0xb958178c, 0xf60f7f9d, 0x27f6c7ae, 0x68a1afbf,
459        0x80c4aa7f, 0xcf93c26e, 0x1e6a7a5d, 0x513d124c,
460        0xca616c6a, 0x8536047b, 0x54cfbc48, 0x1b98d459,
461        0xf3fdd199, 0xbcaab988, 0x6d5301bb, 0x220469aa,
462        0x5f2ae040, 0x107d8851, 0xc1843062, 0x8ed35873,
463        0x66b65db3, 0x29e135a2, 0xf8188d91, 0xb74fe580,
464        0x2c139ba6, 0x6344f3b7, 0xb2bd4b84, 0xfdea2395,
465        0x158f2655, 0x5ad84e44, 0x8b21f677, 0xc4769e66,
466        0x717ce5a3, 0x3e2b8db2, 0xefd23581, 0xa0855d90,
467        0x48e05850, 0x07b73041, 0xd64e8872, 0x9919e063,
468        0x02459e45, 0x4d12f654, 0x9ceb4e67, 0xd3bc2676,
469        0x3bd923b6, 0x748e4ba7, 0xa577f394, 0xea209b85,
470        0x970e126f, 0xd8597a7e, 0x09a0c24d, 0x46f7aa5c,
471        0xae92af9c, 0xe1c5c78d, 0x303c7fbe, 0x7f6b17af,
472        0xe4376989, 0xab600198, 0x7a99b9ab, 0x35ced1ba,
473        0xddabd47a, 0x92fcbc6b, 0x43050458, 0x0c526c49,
474    ],
475    [
476        0x00000000, 0x5ba1dcca, 0xb743b994, 0xece2655e,
477        0x6a466e9f, 0x31e7b255, 0xdd05d70b, 0x86a40bc1,
478        0xd48cdd3e, 0x8f2d01f4, 0x63cf64aa, 0x386eb860,
479        0xbecab3a1, 0xe56b6f6b, 0x09890a35, 0x5228d6ff,
480        0xadd8a7cb, 0xf6797b01, 0x1a9b1e5f, 0x413ac295,
481        0xc79ec954, 0x9c3f159e, 0x70dd70c0, 0x2b7cac0a,
482        0x79547af5, 0x22f5a63f, 0xce17c361, 0x95b61fab,
483        0x1312146a, 0x48b3c8a0, 0xa451adfe, 0xfff07134,
484        0x5f705221, 0x04d18eeb, 0xe833ebb5, 0xb392377f,
485        0x35363cbe, 0x6e97e074, 0x8275852a, 0xd9d459e0,
486        0x8bfc8f1f, 0xd05d53d5, 0x3cbf368b, 0x671eea41,
487        0xe1bae180, 0xba1b3d4a, 0x56f95814, 0x0d5884de,
488        0xf2a8f5ea, 0xa9092920, 0x45eb4c7e, 0x1e4a90b4,
489        0x98ee9b75, 0xc34f47bf, 0x2fad22e1, 0x740cfe2b,
490        0x262428d4, 0x7d85f41e, 0x91679140, 0xcac64d8a,
491        0x4c62464b, 0x17c39a81, 0xfb21ffdf, 0xa0802315,
492        0xbee0a442, 0xe5417888, 0x09a31dd6, 0x5202c11c,
493        0xd4a6cadd, 0x8f071617, 0x63e57349, 0x3844af83,
494        0x6a6c797c, 0x31cda5b6, 0xdd2fc0e8, 0x868e1c22,
495        0x002a17e3, 0x5b8bcb29, 0xb769ae77, 0xecc872bd,
496        0x13380389, 0x4899df43, 0xa47bba1d, 0xffda66d7,
497        0x797e6d16, 0x22dfb1dc, 0xce3dd482, 0x959c0848,
498        0xc7b4deb7, 0x9c15027d, 0x70f76723, 0x2b56bbe9,
499        0xadf2b028, 0xf6536ce2, 0x1ab109bc, 0x4110d576,
500        0xe190f663, 0xba312aa9, 0x56d34ff7, 0x0d72933d,
501        0x8bd698fc, 0xd0774436, 0x3c952168, 0x6734fda2,
502        0x351c2b5d, 0x6ebdf797, 0x825f92c9, 0xd9fe4e03,
503        0x5f5a45c2, 0x04fb9908, 0xe819fc56, 0xb3b8209c,
504        0x4c4851a8, 0x17e98d62, 0xfb0be83c, 0xa0aa34f6,
505        0x260e3f37, 0x7dafe3fd, 0x914d86a3, 0xcaec5a69,
506        0x98c48c96, 0xc365505c, 0x2f873502, 0x7426e9c8,
507        0xf282e209, 0xa9233ec3, 0x45c15b9d, 0x1e608757,
508        0x79005533, 0x22a189f9, 0xce43eca7, 0x95e2306d,
509        0x13463bac, 0x48e7e766, 0xa4058238, 0xffa45ef2,
510        0xad8c880d, 0xf62d54c7, 0x1acf3199, 0x416eed53,
511        0xc7cae692, 0x9c6b3a58, 0x70895f06, 0x2b2883cc,
512        0xd4d8f2f8, 0x8f792e32, 0x639b4b6c, 0x383a97a6,
513        0xbe9e9c67, 0xe53f40ad, 0x09dd25f3, 0x527cf939,
514        0x00542fc6, 0x5bf5f30c, 0xb7179652, 0xecb64a98,
515        0x6a124159, 0x31b39d93, 0xdd51f8cd, 0x86f02407,
516        0x26700712, 0x7dd1dbd8, 0x9133be86, 0xca92624c,
517        0x4c36698d, 0x1797b547, 0xfb75d019, 0xa0d40cd3,
518        0xf2fcda2c, 0xa95d06e6, 0x45bf63b8, 0x1e1ebf72,
519        0x98bab4b3, 0xc31b6879, 0x2ff90d27, 0x7458d1ed,
520        0x8ba8a0d9, 0xd0097c13, 0x3ceb194d, 0x674ac587,
521        0xe1eece46, 0xba4f128c, 0x56ad77d2, 0x0d0cab18,
522        0x5f247de7, 0x0485a12d, 0xe867c473, 0xb3c618b9,
523        0x35621378, 0x6ec3cfb2, 0x8221aaec, 0xd9807626,
524        0xc7e0f171, 0x9c412dbb, 0x70a348e5, 0x2b02942f,
525        0xada69fee, 0xf6074324, 0x1ae5267a, 0x4144fab0,
526        0x136c2c4f, 0x48cdf085, 0xa42f95db, 0xff8e4911,
527        0x792a42d0, 0x228b9e1a, 0xce69fb44, 0x95c8278e,
528        0x6a3856ba, 0x31998a70, 0xdd7bef2e, 0x86da33e4,
529        0x007e3825, 0x5bdfe4ef, 0xb73d81b1, 0xec9c5d7b,
530        0xbeb48b84, 0xe515574e, 0x09f73210, 0x5256eeda,
531        0xd4f2e51b, 0x8f5339d1, 0x63b15c8f, 0x38108045,
532        0x9890a350, 0xc3317f9a, 0x2fd31ac4, 0x7472c60e,
533        0xf2d6cdcf, 0xa9771105, 0x4595745b, 0x1e34a891,
534        0x4c1c7e6e, 0x17bda2a4, 0xfb5fc7fa, 0xa0fe1b30,
535        0x265a10f1, 0x7dfbcc3b, 0x9119a965, 0xcab875af,
536        0x3548049b, 0x6ee9d851, 0x820bbd0f, 0xd9aa61c5,
537        0x5f0e6a04, 0x04afb6ce, 0xe84dd390, 0xb3ec0f5a,
538        0xe1c4d9a5, 0xba65056f, 0x56876031, 0x0d26bcfb,
539        0x8b82b73a, 0xd0236bf0, 0x3cc10eae, 0x6760d264,
540    ]
541];
542
543/// `Crc32` implements the CRC-32 checksum algorithm using the standard polynomial.
544///
545/// * Polynomial = 0x04c11db7
546/// * RefIn = false
547/// * RefOut = false
548/// * XorOut = false
549pub struct Crc32 {
550    state: u32,
551}
552
553impl Crc32 {
554    /// Instantiates a `Crc32` instance with an initial state.
555    pub fn new(state: u32) -> Self {
556        Crc32 { state }
557    }
558
559    /// Returns the computed CRC.
560    pub fn crc(&self) -> u32 {
561        self.state
562    }
563}
564
565impl Monitor for Crc32 {
566    #[inline(always)]
567    fn process_byte(&mut self, byte: u8) {
568        self.state = (self.state << 8) ^ CRC32[0][usize::from((self.state >> 24) as u8 ^ byte)];
569    }
570
571    fn process_buf_bytes(&mut self, buf: &[u8]) {
572        let mut iter = buf.chunks_exact(8);
573
574        for bytes in &mut iter {
575            let word = (u32::from(bytes[0]) << 24)
576                | (u32::from(bytes[1]) << 16)
577                | (u32::from(bytes[2]) << 8)
578                | (u32::from(bytes[3]) << 0);
579
580            let xor = self.state ^ word;
581
582            self.state = CRC32[7][((xor >> 24) & 0xff) as usize]
583                ^ CRC32[6][((xor >> 16) & 0xff) as usize]
584                ^ CRC32[5][((xor >> 8) & 0xff) as usize]
585                ^ CRC32[4][((xor >> 0) & 0xff) as usize]
586                ^ CRC32[3][usize::from(bytes[4])]
587                ^ CRC32[2][usize::from(bytes[5])]
588                ^ CRC32[1][usize::from(bytes[6])]
589                ^ CRC32[0][usize::from(bytes[7])];
590        }
591
592        for byte in iter.remainder() {
593            self.process_byte(*byte);
594        }
595    }
596}
597
598#[cfg(test)]
599mod tests {
600    use super::{Crc32, Monitor};
601
602    #[test]
603    fn verify_crc32() {
604        // Test using CRC32/MPEG2 parameters.
605        {
606            let mut crc = Crc32::new(0xffffffff);
607            crc.process_buf_bytes(&[]);
608            assert_eq!(crc.crc(), 0xffffffff);
609        }
610        {
611            let mut crc = Crc32::new(0xffffffff);
612            crc.process_buf_bytes(&[0]);
613            assert_eq!(crc.crc(), 0x4e08bfb4);
614        }
615        {
616            let mut crc = Crc32::new(0xffffffff);
617            crc.process_buf_bytes(b"123456789");
618            assert_eq!(crc.crc(), 0x0376e6e7);
619        }
620        {
621            let mut crc = Crc32::new(0xffffffff);
622            crc.process_buf_bytes(b"abcdefghijklmnopqrstuvwxyz123456789");
623            assert_eq!(crc.crc(), 0x178dc1e0);
624        }
625        {
626            let mut crc = Crc32::new(0xffffffff);
627            crc.process_byte(b'1');
628            crc.process_byte(b'2');
629            crc.process_byte(b'3');
630            crc.process_byte(b'4');
631            crc.process_byte(b'5');
632            crc.process_byte(b'6');
633            crc.process_byte(b'7');
634            crc.process_byte(b'8');
635            crc.process_byte(b'9');
636            assert_eq!(crc.crc(), 0x0376e6e7);
637        }
638    }
639}