1#![no_std]
147#![cfg_attr(docsrs, feature(doc_auto_cfg))]
148
149#[cfg(feature = "alloc")]
150extern crate alloc;
151#[cfg(feature = "std")]
152extern crate std;
153
154#[cfg(feature = "alloc")]
155use alloc::borrow::{Cow, ToOwned};
156#[cfg(feature = "alloc")]
157use alloc::string::String;
158#[cfg(feature = "alloc")]
159use alloc::vec;
160#[cfg(feature = "alloc")]
161use alloc::vec::Vec;
162use core::convert::TryInto;
163use core::debug_assert as safety_assert;
164
165macro_rules! check {
166 ($e: expr, $c: expr) => {
167 if !$c {
168 return Err($e);
169 }
170 };
171}
172
173trait Static<T: Copy>: Copy {
174 fn val(self) -> T;
175}
176
177macro_rules! define {
178 ($name: ident: $type: ty = $val: expr) => {
179 #[derive(Copy, Clone)]
180 struct $name;
181 impl Static<$type> for $name {
182 fn val(self) -> $type {
183 $val
184 }
185 }
186 };
187}
188
189define!(Bf: bool = false);
190define!(Bt: bool = true);
191define!(N1: usize = 1);
192define!(N2: usize = 2);
193define!(N3: usize = 3);
194define!(N4: usize = 4);
195define!(N5: usize = 5);
196define!(N6: usize = 6);
197
198#[derive(Copy, Clone)]
199struct On;
200
201impl<T: Copy> Static<Option<T>> for On {
202 fn val(self) -> Option<T> {
203 None
204 }
205}
206
207#[derive(Copy, Clone)]
208struct Os<T>(T);
209
210impl<T: Copy> Static<Option<T>> for Os<T> {
211 fn val(self) -> Option<T> {
212 Some(self.0)
213 }
214}
215
216macro_rules! dispatch {
217 (let $var: ident: bool = $val: expr; $($body: tt)*) => {
218 if $val {
219 let $var = Bt; dispatch!($($body)*)
220 } else {
221 let $var = Bf; dispatch!($($body)*)
222 }
223 };
224 (let $var: ident: usize = $val: expr; $($body: tt)*) => {
225 match $val {
226 1 => { let $var = N1; dispatch!($($body)*) },
227 2 => { let $var = N2; dispatch!($($body)*) },
228 3 => { let $var = N3; dispatch!($($body)*) },
229 4 => { let $var = N4; dispatch!($($body)*) },
230 5 => { let $var = N5; dispatch!($($body)*) },
231 6 => { let $var = N6; dispatch!($($body)*) },
232 _ => panic!(),
233 }
234 };
235 (let $var: ident: Option<$type: ty> = $val: expr; $($body: tt)*) => {
236 match $val {
237 None => { let $var = On; dispatch!($($body)*) },
238 Some(x) => { let $var = Os(x); dispatch!($($body)*) },
239 }
240 };
241 ($body: expr) => { $body };
242}
243
244fn chunk_unchecked<T>(x: &[T], n: usize, i: usize) -> &[T] {
245 safety_assert!((i + 1) * n <= x.len());
246 unsafe { core::slice::from_raw_parts(x.as_ptr().add(n * i), n) }
248}
249
250fn chunk_mut_unchecked<T>(x: &mut [T], n: usize, i: usize) -> &mut [T] {
251 safety_assert!((i + 1) * n <= x.len());
252 unsafe { core::slice::from_raw_parts_mut(x.as_mut_ptr().add(n * i), n) }
254}
255
256fn div_ceil(x: usize, m: usize) -> usize {
257 (x + m - 1) / m
258}
259
260fn floor(x: usize, m: usize) -> usize {
261 x / m * m
262}
263
264#[inline]
265fn vectorize<F: FnMut(usize)>(n: usize, bs: usize, mut f: F) {
266 for k in 0 .. n / bs {
267 for i in k * bs .. (k + 1) * bs {
268 f(i);
269 }
270 }
271 for i in floor(n, bs) .. n {
272 f(i);
273 }
274}
275
276#[derive(Debug, Copy, Clone, PartialEq, Eq)]
278pub enum DecodeKind {
279 Length,
281
282 Symbol,
284
285 Trailing,
287
288 Padding,
290}
291
292impl core::fmt::Display for DecodeKind {
293 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
294 let description = match self {
295 DecodeKind::Length => "invalid length",
296 DecodeKind::Symbol => "invalid symbol",
297 DecodeKind::Trailing => "non-zero trailing bits",
298 DecodeKind::Padding => "invalid padding length",
299 };
300 write!(f, "{}", description)
301 }
302}
303
304#[derive(Debug, Copy, Clone, PartialEq, Eq)]
306pub struct DecodeError {
307 pub position: usize,
311
312 pub kind: DecodeKind,
314}
315
316#[cfg(feature = "std")]
317impl std::error::Error for DecodeError {}
318
319impl core::fmt::Display for DecodeError {
320 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
321 write!(f, "{} at {}", self.kind, self.position)
322 }
323}
324
325#[derive(Debug, Copy, Clone, PartialEq, Eq)]
327pub struct DecodePartial {
328 pub read: usize,
332
333 pub written: usize,
337
338 pub error: DecodeError,
340}
341
342const INVALID: u8 = 128;
343const IGNORE: u8 = 129;
344const PADDING: u8 = 130;
345
346fn order(msb: bool, n: usize, i: usize) -> usize {
347 if msb {
348 n - 1 - i
349 } else {
350 i
351 }
352}
353
354#[inline]
355fn enc(bit: usize) -> usize {
356 match bit {
357 1 | 2 | 4 => 1,
358 3 | 6 => 3,
359 5 => 5,
360 _ => unreachable!(),
361 }
362}
363
364#[inline]
365fn dec(bit: usize) -> usize {
366 enc(bit) * 8 / bit
367}
368
369fn encode_len<B: Static<usize>>(bit: B, len: usize) -> usize {
370 div_ceil(8 * len, bit.val())
371}
372
373fn encode_block<B: Static<usize>, M: Static<bool>>(
374 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
375) {
376 debug_assert!(input.len() <= enc(bit.val()));
377 debug_assert_eq!(output.len(), encode_len(bit, input.len()));
378 let bit = bit.val();
379 let msb = msb.val();
380 let mut x = 0u64;
381 for (i, input) in input.iter().enumerate() {
382 x |= u64::from(*input) << (8 * order(msb, enc(bit), i));
383 }
384 for (i, output) in output.iter_mut().enumerate() {
385 let y = x >> (bit * order(msb, dec(bit), i));
386 *output = symbols[(y & 0xff) as usize];
387 }
388}
389
390fn encode_mut<B: Static<usize>, M: Static<bool>>(
391 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
392) {
393 debug_assert_eq!(output.len(), encode_len(bit, input.len()));
394 let enc = enc(bit.val());
395 let dec = dec(bit.val());
396 let n = input.len() / enc;
397 let bs = match bit.val() {
398 5 => 2,
399 6 => 4,
400 _ => 1,
401 };
402 vectorize(n, bs, |i| {
403 let input = chunk_unchecked(input, enc, i);
404 let output = chunk_mut_unchecked(output, dec, i);
405 encode_block(bit, msb, symbols, input, output);
406 });
407 encode_block(bit, msb, symbols, &input[enc * n ..], &mut output[dec * n ..]);
408}
409
410fn decode_block<B: Static<usize>, M: Static<bool>>(
413 bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
414) -> Result<(), usize> {
415 debug_assert!(output.len() <= enc(bit.val()));
416 debug_assert_eq!(input.len(), encode_len(bit, output.len()));
417 let bit = bit.val();
418 let msb = msb.val();
419 let mut x = 0u64;
420 for j in 0 .. input.len() {
421 let y = values[input[j] as usize];
422 check!(j, y < 1 << bit);
423 x |= u64::from(y) << (bit * order(msb, dec(bit), j));
424 }
425 for (j, output) in output.iter_mut().enumerate() {
426 *output = ((x >> (8 * order(msb, enc(bit), j))) & 0xff) as u8;
427 }
428 Ok(())
429}
430
431fn decode_mut<B: Static<usize>, M: Static<bool>>(
435 bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
436) -> Result<(), usize> {
437 debug_assert_eq!(input.len(), encode_len(bit, output.len()));
438 let enc = enc(bit.val());
439 let dec = dec(bit.val());
440 let n = input.len() / dec;
441 for i in 0 .. n {
442 let input = chunk_unchecked(input, dec, i);
443 let output = chunk_mut_unchecked(output, enc, i);
444 decode_block(bit, msb, values, input, output).map_err(|e| dec * i + e)?;
445 }
446 decode_block(bit, msb, values, &input[dec * n ..], &mut output[enc * n ..])
447 .map_err(|e| dec * n + e)
448}
449
450fn check_trail<B: Static<usize>, M: Static<bool>>(
452 bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8],
453) -> Result<(), ()> {
454 if 8 % bit.val() == 0 || !ctb {
455 return Ok(());
456 }
457 let trail = bit.val() * input.len() % 8;
458 if trail == 0 {
459 return Ok(());
460 }
461 let mut mask = (1 << trail) - 1;
462 if !msb.val() {
463 mask <<= bit.val() - trail;
464 }
465 check!((), values[input[input.len() - 1] as usize] & mask == 0);
466 Ok(())
467}
468
469fn check_pad<B: Static<usize>>(bit: B, values: &[u8; 256], input: &[u8]) -> Result<usize, usize> {
472 let bit = bit.val();
473 debug_assert_eq!(input.len(), dec(bit));
474 let is_pad = |x: &&u8| values[**x as usize] == PADDING;
475 let count = input.iter().rev().take_while(is_pad).count();
476 let len = input.len() - count;
477 check!(len, len > 0 && bit * len % 8 < bit);
478 Ok(len)
479}
480
481fn encode_base_len<B: Static<usize>>(bit: B, len: usize) -> usize {
482 encode_len(bit, len)
483}
484
485fn encode_base<B: Static<usize>, M: Static<bool>>(
486 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
487) {
488 debug_assert_eq!(output.len(), encode_base_len(bit, input.len()));
489 encode_mut(bit, msb, symbols, input, output);
490}
491
492fn encode_pad_len<B: Static<usize>, P: Static<Option<u8>>>(bit: B, pad: P, len: usize) -> usize {
493 match pad.val() {
494 None => encode_base_len(bit, len),
495 Some(_) => div_ceil(len, enc(bit.val())) * dec(bit.val()),
496 }
497}
498
499fn encode_pad<B: Static<usize>, M: Static<bool>, P: Static<Option<u8>>>(
500 bit: B, msb: M, symbols: &[u8; 256], spad: P, input: &[u8], output: &mut [u8],
501) {
502 let pad = match spad.val() {
503 None => return encode_base(bit, msb, symbols, input, output),
504 Some(pad) => pad,
505 };
506 debug_assert_eq!(output.len(), encode_pad_len(bit, spad, input.len()));
507 let olen = encode_base_len(bit, input.len());
508 encode_base(bit, msb, symbols, input, &mut output[.. olen]);
509 for output in output.iter_mut().skip(olen) {
510 *output = pad;
511 }
512}
513
514fn encode_wrap_len<
515 'a,
516 B: Static<usize>,
517 P: Static<Option<u8>>,
518 W: Static<Option<(usize, &'a [u8])>>,
519>(
520 bit: B, pad: P, wrap: W, ilen: usize,
521) -> usize {
522 let olen = encode_pad_len(bit, pad, ilen);
523 match wrap.val() {
524 None => olen,
525 Some((col, end)) => olen + end.len() * div_ceil(olen, col),
526 }
527}
528
529fn encode_wrap_mut<
530 'a,
531 B: Static<usize>,
532 M: Static<bool>,
533 P: Static<Option<u8>>,
534 W: Static<Option<(usize, &'a [u8])>>,
535>(
536 bit: B, msb: M, symbols: &[u8; 256], pad: P, wrap: W, input: &[u8], output: &mut [u8],
537) {
538 let (col, end) = match wrap.val() {
539 None => return encode_pad(bit, msb, symbols, pad, input, output),
540 Some((col, end)) => (col, end),
541 };
542 debug_assert_eq!(output.len(), encode_wrap_len(bit, pad, wrap, input.len()));
543 debug_assert_eq!(col % dec(bit.val()), 0);
544 let col = col / dec(bit.val());
545 let enc = col * enc(bit.val());
546 let dec = col * dec(bit.val()) + end.len();
547 let olen = dec - end.len();
548 let n = input.len() / enc;
549 for i in 0 .. n {
550 let input = chunk_unchecked(input, enc, i);
551 let output = chunk_mut_unchecked(output, dec, i);
552 encode_base(bit, msb, symbols, input, &mut output[.. olen]);
553 output[olen ..].copy_from_slice(end);
554 }
555 if input.len() > enc * n {
556 let olen = dec * n + encode_pad_len(bit, pad, input.len() - enc * n);
557 encode_pad(bit, msb, symbols, pad, &input[enc * n ..], &mut output[dec * n .. olen]);
558 output[olen ..].copy_from_slice(end);
559 }
560}
561
562fn decode_wrap_len<B: Static<usize>, P: Static<bool>>(
564 bit: B, pad: P, len: usize,
565) -> (usize, usize) {
566 let bit = bit.val();
567 if pad.val() {
568 (floor(len, dec(bit)), len / dec(bit) * enc(bit))
569 } else {
570 let trail = bit * len % 8;
571 (len - trail / bit, bit * len / 8)
572 }
573}
574
575fn decode_pad_len<B: Static<usize>, P: Static<bool>>(
578 bit: B, pad: P, len: usize,
579) -> Result<usize, DecodeError> {
580 let (ilen, olen) = decode_wrap_len(bit, pad, len);
581 check!(DecodeError { position: ilen, kind: DecodeKind::Length }, ilen == len);
582 Ok(olen)
583}
584
585fn decode_base_len<B: Static<usize>>(bit: B, len: usize) -> Result<usize, DecodeError> {
588 decode_pad_len(bit, Bf, len)
589}
590
591fn decode_base_mut<B: Static<usize>, M: Static<bool>>(
595 bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8], output: &mut [u8],
596) -> Result<usize, DecodePartial> {
597 debug_assert_eq!(Ok(output.len()), decode_base_len(bit, input.len()));
598 let fail = |pos, kind| DecodePartial {
599 read: pos / dec(bit.val()) * dec(bit.val()),
600 written: pos / dec(bit.val()) * enc(bit.val()),
601 error: DecodeError { position: pos, kind },
602 };
603 decode_mut(bit, msb, values, input, output).map_err(|pos| fail(pos, DecodeKind::Symbol))?;
604 check_trail(bit, msb, ctb, values, input)
605 .map_err(|()| fail(input.len() - 1, DecodeKind::Trailing))?;
606 Ok(output.len())
607}
608
609fn decode_pad_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
615 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
616) -> Result<usize, DecodePartial> {
617 if !pad.val() {
618 return decode_base_mut(bit, msb, ctb, values, input, output);
619 }
620 debug_assert_eq!(Ok(output.len()), decode_pad_len(bit, pad, input.len()));
621 let enc = enc(bit.val());
622 let dec = dec(bit.val());
623 let mut inpos = 0;
624 let mut outpos = 0;
625 let mut outend = output.len();
626 while inpos < input.len() {
627 match decode_base_mut(
628 bit,
629 msb,
630 ctb,
631 values,
632 &input[inpos ..],
633 &mut output[outpos .. outend],
634 ) {
635 Ok(written) => {
636 if cfg!(debug_assertions) {
637 inpos = input.len();
638 }
639 outpos += written;
640 break;
641 }
642 Err(partial) => {
643 inpos += partial.read;
644 outpos += partial.written;
645 }
646 }
647 let inlen =
648 check_pad(bit, values, &input[inpos .. inpos + dec]).map_err(|pos| DecodePartial {
649 read: inpos,
650 written: outpos,
651 error: DecodeError { position: inpos + pos, kind: DecodeKind::Padding },
652 })?;
653 let outlen = decode_base_len(bit, inlen).unwrap();
654 let written = decode_base_mut(
655 bit,
656 msb,
657 ctb,
658 values,
659 &input[inpos .. inpos + inlen],
660 &mut output[outpos .. outpos + outlen],
661 )
662 .map_err(|partial| {
663 debug_assert_eq!(partial.read, 0);
664 debug_assert_eq!(partial.written, 0);
665 DecodePartial {
666 read: inpos,
667 written: outpos,
668 error: DecodeError {
669 position: inpos + partial.error.position,
670 kind: partial.error.kind,
671 },
672 }
673 })?;
674 debug_assert_eq!(written, outlen);
675 inpos += dec;
676 outpos += outlen;
677 outend -= enc - outlen;
678 }
679 debug_assert_eq!(inpos, input.len());
680 debug_assert_eq!(outpos, outend);
681 Ok(outend)
682}
683
684fn skip_ignore(values: &[u8; 256], input: &[u8], mut inpos: usize) -> usize {
685 while inpos < input.len() && values[input[inpos] as usize] == IGNORE {
686 inpos += 1;
687 }
688 inpos
689}
690
691fn decode_wrap_block<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
698 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
699) -> Result<(usize, usize), DecodeError> {
700 let dec = dec(bit.val());
701 let mut buf = [0u8; 8];
702 let mut shift = [0usize; 8];
703 let mut bufpos = 0;
704 let mut inpos = 0;
705 while bufpos < dec {
706 inpos = skip_ignore(values, input, inpos);
707 if inpos == input.len() {
708 break;
709 }
710 shift[bufpos] = inpos;
711 buf[bufpos] = input[inpos];
712 bufpos += 1;
713 inpos += 1;
714 }
715 let olen = decode_pad_len(bit, pad, bufpos).map_err(|mut e| {
716 e.position = shift[e.position];
717 e
718 })?;
719 let written = decode_pad_mut(bit, msb, ctb, values, pad, &buf[.. bufpos], &mut output[.. olen])
720 .map_err(|partial| {
721 debug_assert_eq!(partial.read, 0);
722 debug_assert_eq!(partial.written, 0);
723 DecodeError { position: shift[partial.error.position], kind: partial.error.kind }
724 })?;
725 Ok((inpos, written))
726}
727
728#[allow(clippy::too_many_arguments)]
735fn decode_wrap_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>, I: Static<bool>>(
736 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, has_ignore: I, input: &[u8],
737 output: &mut [u8],
738) -> Result<usize, DecodePartial> {
739 if !has_ignore.val() {
740 return decode_pad_mut(bit, msb, ctb, values, pad, input, output);
741 }
742 debug_assert_eq!(output.len(), decode_wrap_len(bit, pad, input.len()).1);
743 let mut inpos = 0;
744 let mut outpos = 0;
745 while inpos < input.len() {
746 let (inlen, outlen) = decode_wrap_len(bit, pad, input.len() - inpos);
747 match decode_pad_mut(
748 bit,
749 msb,
750 ctb,
751 values,
752 pad,
753 &input[inpos .. inpos + inlen],
754 &mut output[outpos .. outpos + outlen],
755 ) {
756 Ok(written) => {
757 inpos += inlen;
758 outpos += written;
759 break;
760 }
761 Err(partial) => {
762 inpos += partial.read;
763 outpos += partial.written;
764 }
765 }
766 let (ipos, opos) =
767 decode_wrap_block(bit, msb, ctb, values, pad, &input[inpos ..], &mut output[outpos ..])
768 .map_err(|mut error| {
769 error.position += inpos;
770 DecodePartial { read: inpos, written: outpos, error }
771 })?;
772 inpos += ipos;
773 outpos += opos;
774 }
775 let inpos = skip_ignore(values, input, inpos);
776 if inpos == input.len() {
777 Ok(outpos)
778 } else {
779 Err(DecodePartial {
780 read: inpos,
781 written: outpos,
782 error: DecodeError { position: inpos, kind: DecodeKind::Length },
783 })
784 }
785}
786
787#[derive(Debug, Copy, Clone, PartialEq, Eq)]
813#[cfg(feature = "alloc")]
814pub enum BitOrder {
815 MostSignificantFirst,
824
825 LeastSignificantFirst,
839}
840#[cfg(feature = "alloc")]
841use crate::BitOrder::*;
842
843#[doc(hidden)]
844#[cfg(feature = "alloc")]
845pub type InternalEncoding = Cow<'static, [u8]>;
846
847#[doc(hidden)]
848#[cfg(not(feature = "alloc"))]
849pub type InternalEncoding = &'static [u8];
850
851#[derive(Debug, Clone, PartialEq, Eq)]
874#[repr(transparent)]
875pub struct Encoding(#[doc(hidden)] pub InternalEncoding);
876
877#[derive(Debug, Clone)]
884#[cfg(feature = "alloc")]
885pub struct Translate {
886 pub from: String,
888
889 pub to: String,
891}
892
893#[derive(Debug, Clone)]
897#[cfg(feature = "alloc")]
898pub struct Wrap {
899 pub width: usize,
909
910 pub separator: String,
914}
915
916#[derive(Debug, Clone)]
1153#[cfg(feature = "alloc")]
1154pub struct Specification {
1155 pub symbols: String,
1160
1161 pub bit_order: BitOrder,
1165
1166 pub check_trailing_bits: bool,
1171
1172 pub padding: Option<char>,
1177
1178 pub ignore: String,
1183
1184 pub wrap: Wrap,
1189
1190 pub translate: Translate,
1197}
1198
1199#[cfg(feature = "alloc")]
1200impl Default for Specification {
1201 fn default() -> Self {
1202 Self::new()
1203 }
1204}
1205
1206impl Encoding {
1207 fn sym(&self) -> &[u8; 256] {
1208 self.0[0 .. 256].try_into().unwrap()
1209 }
1210
1211 fn val(&self) -> &[u8; 256] {
1212 self.0[256 .. 512].try_into().unwrap()
1213 }
1214
1215 fn pad(&self) -> Option<u8> {
1216 if self.0[512] < 128 {
1217 Some(self.0[512])
1218 } else {
1219 None
1220 }
1221 }
1222
1223 fn ctb(&self) -> bool {
1224 self.0[513] & 0x10 != 0
1225 }
1226
1227 fn msb(&self) -> bool {
1228 self.0[513] & 0x8 != 0
1229 }
1230
1231 fn bit(&self) -> usize {
1232 (self.0[513] & 0x7) as usize
1233 }
1234
1235 fn block_len(&self) -> (usize, usize) {
1237 let bit = self.bit();
1238 match self.wrap() {
1239 Some((col, end)) => (col / dec(bit) * enc(bit), col + end.len()),
1240 None => (enc(bit), dec(bit)),
1241 }
1242 }
1243
1244 fn wrap(&self) -> Option<(usize, &[u8])> {
1245 if self.0.len() <= 515 {
1246 return None;
1247 }
1248 Some((self.0[514] as usize, &self.0[515 ..]))
1249 }
1250
1251 fn has_ignore(&self) -> bool {
1252 self.0.len() >= 515
1253 }
1254
1255 #[must_use]
1261 pub fn encode_len(&self, len: usize) -> usize {
1262 dispatch! {
1263 let bit: usize = self.bit();
1264 let pad: Option<u8> = self.pad();
1265 let wrap: Option<(usize, &[u8])> = self.wrap();
1266 encode_wrap_len(bit, pad, wrap, len)
1267 }
1268 }
1269
1270 #[allow(clippy::cognitive_complexity)]
1290 pub fn encode_mut(&self, input: &[u8], output: &mut [u8]) {
1291 assert_eq!(output.len(), self.encode_len(input.len()));
1292 dispatch! {
1293 let bit: usize = self.bit();
1294 let msb: bool = self.msb();
1295 let pad: Option<u8> = self.pad();
1296 let wrap: Option<(usize, &[u8])> = self.wrap();
1297 encode_wrap_mut(bit, msb, self.sym(), pad, wrap, input, output)
1298 }
1299 }
1300
1301 pub fn encode_mut_str<'a>(&self, input: &[u8], output: &'a mut [u8]) -> &'a str {
1323 self.encode_mut(input, output);
1324 safety_assert!(output.is_ascii());
1325 unsafe { core::str::from_utf8_unchecked(output) }
1327 }
1328
1329 #[cfg(feature = "alloc")]
1342 pub fn encode_append(&self, input: &[u8], output: &mut String) {
1343 let output = unsafe { output.as_mut_vec() };
1345 let output_len = output.len();
1346 output.resize(output_len + self.encode_len(input.len()), 0u8);
1347 self.encode_mut(input, &mut output[output_len ..]);
1348 safety_assert!(output[output_len ..].is_ascii());
1349 }
1350
1351 #[cfg(feature = "alloc")]
1355 pub fn new_encoder<'a>(&'a self, output: &'a mut String) -> Encoder<'a> {
1356 Encoder::new(self, output)
1357 }
1358
1359 pub fn encode_write(
1368 &self, input: &[u8], output: &mut impl core::fmt::Write,
1369 ) -> core::fmt::Result {
1370 self.encode_write_buffer(input, output, &mut [0; 1024])
1371 }
1372
1373 pub fn encode_write_buffer(
1383 &self, input: &[u8], output: &mut impl core::fmt::Write, buffer: &mut [u8],
1384 ) -> core::fmt::Result {
1385 assert!(510 <= buffer.len());
1386 let (enc, dec) = self.block_len();
1387 for input in input.chunks(buffer.len() / dec * enc) {
1388 let buffer = &mut buffer[.. self.encode_len(input.len())];
1389 self.encode_mut(input, buffer);
1390 safety_assert!(buffer.is_ascii());
1391 output.write_str(unsafe { core::str::from_utf8_unchecked(buffer) })?;
1393 }
1394 Ok(())
1395 }
1396
1397 #[must_use]
1409 pub fn encode_display<'a>(&'a self, input: &'a [u8]) -> Display<'a> {
1410 Display { encoding: self, input }
1411 }
1412
1413 #[cfg(feature = "alloc")]
1422 #[must_use]
1423 pub fn encode(&self, input: &[u8]) -> String {
1424 let mut output = vec![0u8; self.encode_len(input.len())];
1425 self.encode_mut(input, &mut output);
1426 safety_assert!(output.is_ascii());
1427 unsafe { String::from_utf8_unchecked(output) }
1429 }
1430
1431 pub fn decode_len(&self, len: usize) -> Result<usize, DecodeError> {
1445 let (ilen, olen) = dispatch! {
1446 let bit: usize = self.bit();
1447 let pad: bool = self.pad().is_some();
1448 decode_wrap_len(bit, pad, len)
1449 };
1450 check!(
1451 DecodeError { position: ilen, kind: DecodeKind::Length },
1452 self.has_ignore() || len == ilen
1453 );
1454 Ok(olen)
1455 }
1456
1457 #[allow(clippy::cognitive_complexity)]
1495 pub fn decode_mut(&self, input: &[u8], output: &mut [u8]) -> Result<usize, DecodePartial> {
1496 assert_eq!(Ok(output.len()), self.decode_len(input.len()));
1497 dispatch! {
1498 let bit: usize = self.bit();
1499 let msb: bool = self.msb();
1500 let pad: bool = self.pad().is_some();
1501 let has_ignore: bool = self.has_ignore();
1502 decode_wrap_mut(bit, msb, self.ctb(), self.val(), pad, has_ignore,
1503 input, output)
1504 }
1505 }
1506
1507 #[cfg(feature = "alloc")]
1537 pub fn decode(&self, input: &[u8]) -> Result<Vec<u8>, DecodeError> {
1538 let mut output = vec![0u8; self.decode_len(input.len())?];
1539 let len = self.decode_mut(input, &mut output).map_err(|partial| partial.error)?;
1540 output.truncate(len);
1541 Ok(output)
1542 }
1543
1544 #[must_use]
1546 pub fn bit_width(&self) -> usize {
1547 self.bit()
1548 }
1549
1550 #[must_use]
1559 pub fn is_canonical(&self) -> bool {
1560 if !self.ctb() {
1561 return false;
1562 }
1563 let bit = self.bit();
1564 let sym = self.sym();
1565 let val = self.val();
1566 for i in 0 .. 256 {
1567 if val[i] == INVALID {
1568 continue;
1569 }
1570 if val[i] >= 1 << bit {
1571 return false;
1572 }
1573 if sym[val[i] as usize] as usize != i {
1574 return false;
1575 }
1576 }
1577 true
1578 }
1579
1580 #[allow(clippy::missing_panics_doc)] #[cfg(feature = "alloc")]
1583 #[must_use]
1584 pub fn specification(&self) -> Specification {
1585 let mut specification = Specification::new();
1586 specification
1587 .symbols
1588 .push_str(core::str::from_utf8(&self.sym()[0 .. 1 << self.bit()]).unwrap());
1589 specification.bit_order =
1590 if self.msb() { MostSignificantFirst } else { LeastSignificantFirst };
1591 specification.check_trailing_bits = self.ctb();
1592 if let Some(pad) = self.pad() {
1593 specification.padding = Some(pad as char);
1594 }
1595 for i in 0 .. 128u8 {
1596 if self.val()[i as usize] != IGNORE {
1597 continue;
1598 }
1599 specification.ignore.push(i as char);
1600 }
1601 if let Some((col, end)) = self.wrap() {
1602 specification.wrap.width = col;
1603 specification.wrap.separator = core::str::from_utf8(end).unwrap().to_owned();
1604 }
1605 for i in 0 .. 128u8 {
1606 let canonical = if self.val()[i as usize] < 1 << self.bit() {
1607 self.sym()[self.val()[i as usize] as usize]
1608 } else if self.val()[i as usize] == PADDING {
1609 self.pad().unwrap()
1610 } else {
1611 continue;
1612 };
1613 if i == canonical {
1614 continue;
1615 }
1616 specification.translate.from.push(i as char);
1617 specification.translate.to.push(canonical as char);
1618 }
1619 specification
1620 }
1621
1622 #[doc(hidden)]
1623 #[must_use]
1624 pub const fn internal_new(implementation: &'static [u8]) -> Encoding {
1625 #[cfg(feature = "alloc")]
1626 let encoding = Encoding(Cow::Borrowed(implementation));
1627 #[cfg(not(feature = "alloc"))]
1628 let encoding = Encoding(implementation);
1629 encoding
1630 }
1631
1632 #[doc(hidden)]
1633 #[must_use]
1634 pub fn internal_implementation(&self) -> &[u8] {
1635 &self.0
1636 }
1637}
1638
1639#[derive(Debug)]
1660#[cfg(feature = "alloc")]
1661pub struct Encoder<'a> {
1662 encoding: &'a Encoding,
1663 output: &'a mut String,
1664 buffer: [u8; 255],
1665 length: u8,
1666}
1667
1668#[cfg(feature = "alloc")]
1669impl Drop for Encoder<'_> {
1670 fn drop(&mut self) {
1671 self.encoding.encode_append(&self.buffer[.. self.length as usize], self.output);
1672 }
1673}
1674
1675#[cfg(feature = "alloc")]
1676impl<'a> Encoder<'a> {
1677 fn new(encoding: &'a Encoding, output: &'a mut String) -> Self {
1678 Encoder { encoding, output, buffer: [0; 255], length: 0 }
1679 }
1680
1681 pub fn append(&mut self, mut input: &[u8]) {
1683 #[allow(clippy::cast_possible_truncation)] let max = self.encoding.block_len().0 as u8;
1685 if self.length != 0 {
1686 let len = self.length;
1687 #[allow(clippy::cast_possible_truncation)] let add = core::cmp::min((max - len) as usize, input.len()) as u8;
1689 self.buffer[len as usize ..][.. add as usize].copy_from_slice(&input[.. add as usize]);
1690 self.length += add;
1691 input = &input[add as usize ..];
1692 if self.length != max {
1693 debug_assert!(self.length < max);
1694 debug_assert!(input.is_empty());
1695 return;
1696 }
1697 self.encoding.encode_append(&self.buffer[.. max as usize], self.output);
1698 self.length = 0;
1699 }
1700 let len = floor(input.len(), max as usize);
1701 self.encoding.encode_append(&input[.. len], self.output);
1702 input = &input[len ..];
1703 #[allow(clippy::cast_possible_truncation)] let len = input.len() as u8;
1705 self.buffer[.. len as usize].copy_from_slice(input);
1706 self.length = len;
1707 }
1708
1709 pub fn finalize(self) {}
1714}
1715
1716#[derive(Debug)]
1718pub struct Display<'a> {
1719 encoding: &'a Encoding,
1720 input: &'a [u8],
1721}
1722
1723impl core::fmt::Display for Display<'_> {
1724 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1725 self.encoding.encode_write(self.input, f)
1726 }
1727}
1728
1729#[derive(Debug, Copy, Clone)]
1730#[cfg(feature = "alloc")]
1731enum SpecificationErrorImpl {
1732 BadSize,
1733 NotAscii,
1734 Duplicate(u8),
1735 ExtraPadding,
1736 WrapLength,
1737 WrapWidth(u8),
1738 FromTo,
1739 Undefined(u8),
1740}
1741#[cfg(feature = "alloc")]
1742use crate::SpecificationErrorImpl::*;
1743
1744#[derive(Debug, Copy, Clone)]
1746#[cfg(feature = "alloc")]
1747pub struct SpecificationError(SpecificationErrorImpl);
1748
1749#[cfg(feature = "alloc")]
1750impl core::fmt::Display for SpecificationError {
1751 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1752 match self.0 {
1753 BadSize => write!(f, "invalid number of symbols"),
1754 NotAscii => write!(f, "non-ascii character"),
1755 Duplicate(c) => write!(f, "{:?} has conflicting definitions", c as char),
1756 ExtraPadding => write!(f, "unnecessary padding"),
1757 WrapLength => write!(f, "invalid wrap width or separator length"),
1758 WrapWidth(x) => write!(f, "wrap width not a multiple of {}", x),
1759 FromTo => write!(f, "translate from/to length mismatch"),
1760 Undefined(c) => write!(f, "{:?} is undefined", c as char),
1761 }
1762 }
1763}
1764
1765#[cfg(feature = "std")]
1766impl std::error::Error for SpecificationError {
1767 fn description(&self) -> &str {
1768 match self.0 {
1769 BadSize => "invalid number of symbols",
1770 NotAscii => "non-ascii character",
1771 Duplicate(_) => "conflicting definitions",
1772 ExtraPadding => "unnecessary padding",
1773 WrapLength => "invalid wrap width or separator length",
1774 WrapWidth(_) => "wrap width not a multiple",
1775 FromTo => "translate from/to length mismatch",
1776 Undefined(_) => "undefined character",
1777 }
1778 }
1779}
1780
1781#[cfg(feature = "alloc")]
1782impl Specification {
1783 #[must_use]
1785 pub fn new() -> Specification {
1786 Specification {
1787 symbols: String::new(),
1788 bit_order: MostSignificantFirst,
1789 check_trailing_bits: true,
1790 padding: None,
1791 ignore: String::new(),
1792 wrap: Wrap { width: 0, separator: String::new() },
1793 translate: Translate { from: String::new(), to: String::new() },
1794 }
1795 }
1796
1797 pub fn encoding(&self) -> Result<Encoding, SpecificationError> {
1803 let symbols = self.symbols.as_bytes();
1804 let bit: u8 = match symbols.len() {
1805 2 => 1,
1806 4 => 2,
1807 8 => 3,
1808 16 => 4,
1809 32 => 5,
1810 64 => 6,
1811 _ => return Err(SpecificationError(BadSize)),
1812 };
1813 let mut values = [INVALID; 128];
1814 let set = |v: &mut [u8; 128], i: u8, x: u8| {
1815 check!(SpecificationError(NotAscii), i < 128);
1816 if v[i as usize] == x {
1817 return Ok(());
1818 }
1819 check!(SpecificationError(Duplicate(i)), v[i as usize] == INVALID);
1820 v[i as usize] = x;
1821 Ok(())
1822 };
1823 for (v, symbols) in symbols.iter().enumerate() {
1824 #[allow(clippy::cast_possible_truncation)] set(&mut values, *symbols, v as u8)?;
1826 }
1827 let msb = self.bit_order == MostSignificantFirst;
1828 let ctb = self.check_trailing_bits || 8 % bit == 0;
1829 let pad = match self.padding {
1830 None => None,
1831 Some(pad) => {
1832 check!(SpecificationError(ExtraPadding), 8 % bit != 0);
1833 check!(SpecificationError(NotAscii), pad.len_utf8() == 1);
1834 set(&mut values, pad as u8, PADDING)?;
1835 Some(pad as u8)
1836 }
1837 };
1838 for i in self.ignore.bytes() {
1839 set(&mut values, i, IGNORE)?;
1840 }
1841 let wrap = if self.wrap.separator.is_empty() || self.wrap.width == 0 {
1842 None
1843 } else {
1844 let col = self.wrap.width;
1845 let end = self.wrap.separator.as_bytes();
1846 check!(SpecificationError(WrapLength), col < 256 && end.len() < 256);
1847 #[allow(clippy::cast_possible_truncation)] let col = col as u8;
1849 #[allow(clippy::cast_possible_truncation)] let dec = dec(bit as usize) as u8;
1851 check!(SpecificationError(WrapWidth(dec)), col % dec == 0);
1852 for &i in end {
1853 set(&mut values, i, IGNORE)?;
1854 }
1855 Some((col, end))
1856 };
1857 let from = self.translate.from.as_bytes();
1858 let to = self.translate.to.as_bytes();
1859 check!(SpecificationError(FromTo), from.len() == to.len());
1860 for i in 0 .. from.len() {
1861 check!(SpecificationError(NotAscii), to[i] < 128);
1862 let v = values[to[i] as usize];
1863 check!(SpecificationError(Undefined(to[i])), v != INVALID);
1864 set(&mut values, from[i], v)?;
1865 }
1866 let mut encoding = Vec::new();
1867 for _ in 0 .. 256 / symbols.len() {
1868 encoding.extend_from_slice(symbols);
1869 }
1870 encoding.extend_from_slice(&values);
1871 encoding.extend_from_slice(&[INVALID; 128]);
1872 match pad {
1873 None => encoding.push(INVALID),
1874 Some(pad) => encoding.push(pad),
1875 }
1876 encoding.push(bit);
1877 if msb {
1878 encoding[513] |= 0x08;
1879 }
1880 if ctb {
1881 encoding[513] |= 0x10;
1882 }
1883 if let Some((col, end)) = wrap {
1884 encoding.push(col);
1885 encoding.extend_from_slice(end);
1886 } else if values.contains(&IGNORE) {
1887 encoding.push(0);
1888 }
1889 Ok(Encoding(Cow::Owned(encoding)))
1890 }
1891}
1892
1893pub const HEXLOWER: Encoding = Encoding::internal_new(HEXLOWER_IMPL);
1913const HEXLOWER_IMPL: &[u8] = &[
1914 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1915 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1916 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1917 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1918 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1919 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1920 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1921 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1922 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1923 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1924 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1925 56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1926 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1927 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
1928 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1929 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1930 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1931 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1932 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1933 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1934 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1935 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1936 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1937 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1938 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1939];
1940
1941pub const HEXLOWER_PERMISSIVE: Encoding = Encoding::internal_new(HEXLOWER_PERMISSIVE_IMPL);
1970const HEXLOWER_PERMISSIVE_IMPL: &[u8] = &[
1971 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1972 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1973 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1974 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1975 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1976 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1977 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1978 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1979 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1980 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1981 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1982 56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1983 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1984 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
1985 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128,
1986 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1987 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1988 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1989 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1990 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1991 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1992 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1993 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1994 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1995 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1996];
1997
1998pub const HEXUPPER: Encoding = Encoding::internal_new(HEXUPPER_IMPL);
2022const HEXUPPER_IMPL: &[u8] = &[
2023 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2024 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2025 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2026 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2027 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2028 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2029 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2030 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2031 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2032 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2033 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2034 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2035 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2036 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2037 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2038 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2039 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2040 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2041 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2042 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2043 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2044 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2045 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2046 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2047];
2048
2049pub const HEXUPPER_PERMISSIVE: Encoding = Encoding::internal_new(HEXUPPER_PERMISSIVE_IMPL);
2071const HEXUPPER_PERMISSIVE_IMPL: &[u8] = &[
2072 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2073 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2074 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2075 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2076 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2077 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2078 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2079 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2080 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2081 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2082 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2083 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2084 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2085 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2086 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2087 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128,
2088 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2089 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2090 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2091 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2092 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2093 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2094 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2095 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2096];
2097
2098pub const BASE32: Encoding = Encoding::internal_new(BASE32_IMPL);
2114const BASE32_IMPL: &[u8] = &[
2115 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2116 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2117 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2118 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2119 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2120 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2121 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2122 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2123 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2124 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2125 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2126 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2127 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2128 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 130, 128, 128,
2129 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2130 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2131 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2132 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2133 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2134 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2135 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2136 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2137 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2138 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2139];
2140
2141pub const BASE32_NOPAD: Encoding = Encoding::internal_new(BASE32_NOPAD_IMPL);
2152const BASE32_NOPAD_IMPL: &[u8] = &[
2153 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2154 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2155 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2156 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2157 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2158 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2159 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2160 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2161 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2162 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2163 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2164 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2165 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2166 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2167 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2168 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2169 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2170 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2171 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2172 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2173 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2174 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2175 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2176 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2177];
2178
2179pub const BASE32_NOPAD_NOCASE: Encoding = Encoding::internal_new(BASE32_NOPAD_NOCASE_IMPL);
2192const BASE32_NOPAD_NOCASE_IMPL: &[u8] = &[
2193 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2194 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2195 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2196 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2197 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2198 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2199 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2200 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2201 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2202 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2203 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2204 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2205 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2206 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2207 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2208 25, 128, 128, 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2209 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2210 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2211 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2212 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2213 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2214 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2215 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2216 128, 128, 128, 128, 128, 128, 128, 128, 29,
2217];
2218
2219pub const BASE32_NOPAD_VISUAL: Encoding = Encoding::internal_new(BASE32_NOPAD_VISUAL_IMPL);
2232const BASE32_NOPAD_VISUAL_IMPL: &[u8] = &[
2233 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2234 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2235 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2236 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2237 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2238 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2239 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2240 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2241 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2242 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2243 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2244 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2245 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2246 128, 128, 128, 128, 14, 8, 26, 27, 28, 29, 30, 31, 1, 128, 128, 128, 128, 128, 128, 128, 128,
2247 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2248 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 8, 128,
2249 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2250 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2251 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2252 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2253 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2254 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2255 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2256 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2257];
2258
2259pub const BASE32HEX: Encoding = Encoding::internal_new(BASE32HEX_IMPL);
2275const BASE32HEX_IMPL: &[u8] = &[
2276 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2277 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2278 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2279 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2280 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2281 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2282 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2283 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2284 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2285 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2286 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2287 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2288 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2289 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 130, 128, 128, 128, 10, 11,
2290 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2291 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2292 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2293 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2294 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2295 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2296 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2297 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2298 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2299 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2300];
2301
2302pub const BASE32HEX_NOPAD: Encoding = Encoding::internal_new(BASE32HEX_NOPAD_IMPL);
2313const BASE32HEX_NOPAD_IMPL: &[u8] = &[
2314 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2315 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2316 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2317 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2318 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2319 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2320 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2321 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2322 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2323 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2324 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2325 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2326 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2327 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2328 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2329 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2330 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2331 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2332 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2333 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2334 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2335 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2336 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2337 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2338];
2339
2340pub const BASE32_DNSSEC: Encoding = Encoding::internal_new(BASE32_DNSSEC_IMPL);
2361const BASE32_DNSSEC_IMPL: &[u8] = &[
2362 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
2363 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2364 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2365 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104,
2366 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53,
2367 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
2368 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101,
2369 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49,
2370 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
2371 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98,
2372 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2373 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
2374 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 128, 128, 128, 128, 128, 128, 128,
2375 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2376 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2377 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13,
2378 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128,
2379 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2380 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2381 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2382 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2383 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2384 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2385 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2386 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2387 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2388];
2389
2390#[allow(clippy::doc_markdown)]
2391pub const BASE32_DNSCURVE: Encoding = Encoding::internal_new(BASE32_DNSCURVE_IMPL);
2409const BASE32_DNSCURVE_IMPL: &[u8] = &[
2410 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110,
2411 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2412 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119,
2413 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107,
2414 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53,
2415 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116,
2416 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103,
2417 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49,
2418 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113,
2419 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99,
2420 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
2421 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109,
2422 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 128, 128, 128, 128, 128, 128,
2423 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2424 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2425 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2426 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
2427 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128,
2428 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2429 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2430 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2431 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2432 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2433 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2434 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2435 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 21,
2436];
2437
2438pub const BASE64: Encoding = Encoding::internal_new(BASE64_IMPL);
2454const BASE64_IMPL: &[u8] = &[
2455 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2456 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2457 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2458 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2459 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2460 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2461 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2462 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2463 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2464 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2465 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2466 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2467 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2468 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2469 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2470 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2471 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2472 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2473 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2474 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2475 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2476 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2477 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2478 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2479 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2480];
2481
2482pub const BASE64_NOPAD: Encoding = Encoding::internal_new(BASE64_NOPAD_IMPL);
2493const BASE64_NOPAD_IMPL: &[u8] = &[
2494 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2495 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2496 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2497 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2498 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2499 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2500 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2501 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2502 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2503 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2504 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2505 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2506 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2507 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2508 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2509 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2510 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2511 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2512 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2513 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2514 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2515 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2516 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2517 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2518 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2519];
2520
2521pub const BASE64_MIME: Encoding = Encoding::internal_new(BASE64_MIME_IMPL);
2540const BASE64_MIME_IMPL: &[u8] = &[
2541 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2542 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2543 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2544 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2545 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2546 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2547 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2548 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2549 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2550 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2551 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2552 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2553 128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2554 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2555 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2556 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2557 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2558 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2559 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2560 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2561 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2562 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2563 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2564 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2565 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30, 76, 13, 10,
2566];
2567
2568pub const BASE64_MIME_PERMISSIVE: Encoding = Encoding::internal_new(BASE64_MIME_PERMISSIVE_IMPL);
2588const BASE64_MIME_PERMISSIVE_IMPL: &[u8] = &[
2589 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2590 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2591 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2592 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2593 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2594 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2595 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2596 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2597 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2598 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2599 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2600 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2601 128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2602 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2603 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2604 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2605 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2606 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2607 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2608 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2609 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2610 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2611 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2612 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2613 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 14, 76, 13, 10,
2614];
2615
2616pub const BASE64URL: Encoding = Encoding::internal_new(BASE64URL_IMPL);
2632const BASE64URL_IMPL: &[u8] = &[
2633 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2634 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2635 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2636 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2637 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2638 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2639 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2640 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2641 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2642 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2643 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2644 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2645 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2646 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2647 128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2648 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2649 24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2650 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2651 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2652 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2653 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2654 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2655 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2656 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2657 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2658];
2659
2660pub const BASE64URL_NOPAD: Encoding = Encoding::internal_new(BASE64URL_NOPAD_IMPL);
2671const BASE64URL_NOPAD_IMPL: &[u8] = &[
2672 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2673 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2674 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2675 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2676 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2677 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2678 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2679 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2680 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2681 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2682 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2683 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2684 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2685 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2686 128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2687 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2688 24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2689 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2690 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2691 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2692 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2693 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2694 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2695 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2696 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2697];