data_encoding/
lib.rs

1//! Efficient and customizable data-encoding functions like base64, base32, and hex
2//!
3//! This [crate] provides little-endian ASCII base-conversion encodings for
4//! bases of size 2, 4, 8, 16, 32, and 64. It supports:
5//!
6//! - [padding] for streaming
7//! - canonical encodings (e.g. [trailing bits] are checked)
8//! - in-place [encoding] and [decoding] functions
9//! - partial [decoding] functions (e.g. for error recovery)
10//! - character [translation] (e.g. for case-insensitivity)
11//! - most and least significant [bit-order]
12//! - [ignoring] characters when decoding (e.g. for skipping newlines)
13//! - [wrapping] the output when encoding
14//! - no-std environments with `default-features = false, features = ["alloc"]`
15//! - no-alloc environments with `default-features = false`
16//!
17//! You may use the [binary] or the [website] to play around.
18//!
19//! # Examples
20//!
21//! This crate provides predefined encodings as [constants]. These constants are of type
22//! [`Encoding`]. This type provides encoding and decoding functions with in-place or allocating
23//! variants. Here is an example using the allocating encoding function of [`BASE64`]:
24//!
25//! ```rust
26//! use data_encoding::BASE64;
27//! assert_eq!(BASE64.encode(b"Hello world"), "SGVsbG8gd29ybGQ=");
28//! ```
29//!
30//! Here is an example using the in-place decoding function of [`BASE32`]:
31//!
32//! ```rust
33//! use data_encoding::BASE32;
34//! let input = b"JBSWY3DPEB3W64TMMQ======";
35//! let mut output = vec![0; BASE32.decode_len(input.len()).unwrap()];
36//! let len = BASE32.decode_mut(input, &mut output).unwrap();
37//! assert_eq!(&output[0 .. len], b"Hello world");
38//! ```
39//!
40//! You are not limited to the predefined encodings. You may define your own encodings (with the
41//! same correctness and performance properties as the predefined ones) using the [`Specification`]
42//! type:
43//!
44//! ```rust
45//! use data_encoding::Specification;
46//! let hex = {
47//!     let mut spec = Specification::new();
48//!     spec.symbols.push_str("0123456789abcdef");
49//!     spec.encoding().unwrap()
50//! };
51//! assert_eq!(hex.encode(b"hello"), "68656c6c6f");
52//! ```
53//!
54//! You may use the [macro] library to define a compile-time custom encoding:
55//!
56//! ```rust,ignore
57//! use data_encoding::Encoding;
58//! use data_encoding_macro::new_encoding;
59//! const HEX: Encoding = new_encoding!{
60//!     symbols: "0123456789abcdef",
61//!     translate_from: "ABCDEF",
62//!     translate_to: "abcdef",
63//! };
64//! const BASE64: Encoding = new_encoding!{
65//!     symbols: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
66//!     padding: '=',
67//! };
68//! ```
69//!
70//! # Properties
71//!
72//! The [`HEXUPPER`], [`BASE32`], [`BASE32HEX`], [`BASE64`], and [`BASE64URL`] predefined encodings
73//! conform to [RFC4648].
74//!
75//! In general, the encoding and decoding functions satisfy the following properties:
76//!
77//! - They are deterministic: their output only depends on their input
78//! - They have no side-effects: they do not modify any hidden mutable state
79//! - They are correct: encoding followed by decoding gives the initial data
80//! - They are canonical (unless [`is_canonical`] returns false): decoding followed by encoding
81//!   gives the initial data
82//!
83//! This last property is usually not satisfied by base64 implementations. This is a matter of
84//! choice and this crate has made the choice to let the user choose. Support for canonical encoding
85//! as described by the [RFC][canonical] is provided. But it is also possible to disable checking
86//! trailing bits, to add characters translation, to decode concatenated padded inputs, and to
87//! ignore some characters. Note that non-canonical encodings may be an attack vector as described
88//! in [Base64 Malleability in Practice](https://eprint.iacr.org/2022/361.pdf).
89//!
90//! Since the RFC specifies the encoding function on all inputs and the decoding function on all
91//! possible encoded outputs, the differences between implementations come from the decoding
92//! function which may be more or less permissive. In this crate, the decoding function of canonical
93//! encodings rejects all inputs that are not a possible output of the encoding function. Here are
94//! some concrete examples of decoding differences between this crate, the `base64` crate, and the
95//! `base64` GNU program:
96//!
97//! | Input      | `data-encoding` | `base64`  | GNU `base64`  |
98//! | ---------- | --------------- | --------- | ------------- |
99//! | `AAB=`     | `Trailing(2)`   | `Last(2)` | `\x00\x00`    |
100//! | `AA\nB=`   | `Length(4)`     | `Byte(2)` | `\x00\x00`    |
101//! | `AAB`      | `Length(0)`     | `Padding` | Invalid input |
102//! | `AAA`      | `Length(0)`     | `Padding` | Invalid input |
103//! | `A\rA\nB=` | `Length(4)`     | `Byte(1)` | Invalid input |
104//! | `-_\r\n`   | `Symbol(0)`     | `Byte(0)` | Invalid input |
105//! | `AA==AA==` | `[0, 0]`        | `Byte(2)` | `\x00\x00`    |
106//!
107//! We can summarize these discrepancies as follows:
108//!
109//! | Discrepancy                | `data-encoding` | `base64` | GNU `base64` |
110//! | -------------------------- | --------------- | -------- | ------------ |
111//! | Check trailing bits        | Yes             | Yes      | No           |
112//! | Ignored characters         | None            | None     | `\n`         |
113//! | Translated characters      | None            | None     | None         |
114//! | Check padding              | Yes             | No       | Yes          |
115//! | Support concatenated input | Yes             | No       | Yes          |
116//!
117//! This crate permits to disable checking trailing bits. It permits to ignore some characters. It
118//! permits to translate characters. It permits to use unpadded encodings. However, for padded
119//! encodings, support for concatenated inputs cannot be disabled. This is simply because it doesn't
120//! make sense to use padding if it is not to support concatenated inputs.
121//!
122//! [RFC4648]: https://tools.ietf.org/html/rfc4648
123//! [`BASE32HEX`]: constant.BASE32HEX.html
124//! [`BASE32`]: constant.BASE32.html
125//! [`BASE64URL`]: constant.BASE64URL.html
126//! [`BASE64`]: constant.BASE64.html
127//! [`Encoding`]: struct.Encoding.html
128//! [`HEXUPPER`]: constant.HEXUPPER.html
129//! [`Specification`]: struct.Specification.html
130//! [`is_canonical`]: struct.Encoding.html#method.is_canonical
131//! [binary]: https://crates.io/crates/data-encoding-bin
132//! [bit-order]: struct.Specification.html#structfield.bit_order
133//! [canonical]: https://tools.ietf.org/html/rfc4648#section-3.5
134//! [constants]: index.html#constants
135//! [crate]: https://crates.io/crates/data-encoding
136//! [decoding]: struct.Encoding.html#method.decode_mut
137//! [encoding]: struct.Encoding.html#method.encode_mut
138//! [ignoring]: struct.Specification.html#structfield.ignore
139//! [macro]: https://crates.io/crates/data-encoding-macro
140//! [padding]: struct.Specification.html#structfield.padding
141//! [trailing bits]: struct.Specification.html#structfield.check_trailing_bits
142//! [translation]: struct.Specification.html#structfield.translate
143//! [website]: https://data-encoding.rs
144//! [wrapping]: struct.Specification.html#structfield.wrap
145
146#![no_std]
147#![cfg_attr(docsrs, feature(doc_auto_cfg))]
148// TODO: This list up to warn(clippy::pedantic) should ideally use a lint group.
149#![warn(elided_lifetimes_in_paths)]
150// TODO(msrv): #![warn(let_underscore_drop)]
151#![warn(missing_debug_implementations)]
152#![warn(missing_docs)]
153#![warn(unreachable_pub)]
154// TODO(msrv): #![warn(unsafe_op_in_unsafe_fn)]
155#![warn(unused_results)]
156#![allow(unused_unsafe)] // TODO(msrv)
157#![warn(clippy::pedantic)]
158#![allow(clippy::assigning_clones)] // TODO(msrv)
159#![allow(clippy::doc_markdown)]
160#![allow(clippy::enum_glob_use)]
161#![allow(clippy::similar_names)]
162#![allow(clippy::uninlined_format_args)] // TODO(msrv)
163
164#[cfg(feature = "alloc")]
165extern crate alloc;
166#[cfg(feature = "std")]
167extern crate std;
168
169#[cfg(feature = "alloc")]
170use alloc::borrow::{Cow, ToOwned};
171#[cfg(feature = "alloc")]
172use alloc::string::String;
173#[cfg(feature = "alloc")]
174use alloc::vec;
175#[cfg(feature = "alloc")]
176use alloc::vec::Vec;
177use core::convert::TryInto;
178
179macro_rules! check {
180    ($e: expr, $c: expr) => {
181        if !$c {
182            return Err($e);
183        }
184    };
185}
186
187trait Static<T: Copy>: Copy {
188    fn val(self) -> T;
189}
190
191macro_rules! define {
192    ($name: ident: $type: ty = $val: expr) => {
193        #[derive(Copy, Clone)]
194        struct $name;
195        impl Static<$type> for $name {
196            fn val(self) -> $type {
197                $val
198            }
199        }
200    };
201}
202
203define!(Bf: bool = false);
204define!(Bt: bool = true);
205define!(N1: usize = 1);
206define!(N2: usize = 2);
207define!(N3: usize = 3);
208define!(N4: usize = 4);
209define!(N5: usize = 5);
210define!(N6: usize = 6);
211
212#[derive(Copy, Clone)]
213struct On;
214
215impl<T: Copy> Static<Option<T>> for On {
216    fn val(self) -> Option<T> {
217        None
218    }
219}
220
221#[derive(Copy, Clone)]
222struct Os<T>(T);
223
224impl<T: Copy> Static<Option<T>> for Os<T> {
225    fn val(self) -> Option<T> {
226        Some(self.0)
227    }
228}
229
230macro_rules! dispatch {
231    (let $var: ident: bool = $val: expr; $($body: tt)*) => {
232        if $val {
233            let $var = Bt; dispatch!($($body)*)
234        } else {
235            let $var = Bf; dispatch!($($body)*)
236        }
237    };
238    (let $var: ident: usize = $val: expr; $($body: tt)*) => {
239        match $val {
240            1 => { let $var = N1; dispatch!($($body)*) },
241            2 => { let $var = N2; dispatch!($($body)*) },
242            3 => { let $var = N3; dispatch!($($body)*) },
243            4 => { let $var = N4; dispatch!($($body)*) },
244            5 => { let $var = N5; dispatch!($($body)*) },
245            6 => { let $var = N6; dispatch!($($body)*) },
246            _ => panic!(),
247        }
248    };
249    (let $var: ident: Option<$type: ty> = $val: expr; $($body: tt)*) => {
250        match $val {
251            None => { let $var = On; dispatch!($($body)*) },
252            Some(x) => { let $var = Os(x); dispatch!($($body)*) },
253        }
254    };
255    ($body: expr) => { $body };
256}
257
258unsafe fn chunk_unchecked(x: &[u8], n: usize, i: usize) -> &[u8] {
259    debug_assert!((i + 1) * n <= x.len());
260    unsafe { core::slice::from_raw_parts(x.as_ptr().add(n * i), n) }
261}
262
263unsafe fn chunk_mut_unchecked(x: &mut [u8], n: usize, i: usize) -> &mut [u8] {
264    debug_assert!((i + 1) * n <= x.len());
265    unsafe { core::slice::from_raw_parts_mut(x.as_mut_ptr().add(n * i), n) }
266}
267
268fn div_ceil(x: usize, m: usize) -> usize {
269    (x + m - 1) / m
270}
271
272fn floor(x: usize, m: usize) -> usize {
273    x / m * m
274}
275
276fn vectorize<F: FnMut(usize)>(n: usize, bs: usize, mut f: F) {
277    for k in 0 .. n / bs {
278        for i in k * bs .. (k + 1) * bs {
279            f(i);
280        }
281    }
282    for i in floor(n, bs) .. n {
283        f(i);
284    }
285}
286
287/// Decoding error kind
288#[derive(Debug, Copy, Clone, PartialEq, Eq)]
289pub enum DecodeKind {
290    /// Invalid length
291    Length,
292
293    /// Invalid symbol
294    Symbol,
295
296    /// Non-zero trailing bits
297    Trailing,
298
299    /// Invalid padding length
300    Padding,
301}
302
303impl core::fmt::Display for DecodeKind {
304    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
305        let description = match self {
306            DecodeKind::Length => "invalid length",
307            DecodeKind::Symbol => "invalid symbol",
308            DecodeKind::Trailing => "non-zero trailing bits",
309            DecodeKind::Padding => "invalid padding length",
310        };
311        write!(f, "{}", description)
312    }
313}
314
315/// Decoding error
316#[derive(Debug, Copy, Clone, PartialEq, Eq)]
317pub struct DecodeError {
318    /// Error position
319    ///
320    /// This position is always a valid input position and represents the first encountered error.
321    pub position: usize,
322
323    /// Error kind
324    pub kind: DecodeKind,
325}
326
327#[cfg(feature = "std")]
328impl std::error::Error for DecodeError {}
329
330impl core::fmt::Display for DecodeError {
331    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
332        write!(f, "{} at {}", self.kind, self.position)
333    }
334}
335
336/// Decoding error with partial result
337#[derive(Debug, Copy, Clone, PartialEq, Eq)]
338pub struct DecodePartial {
339    /// Number of bytes read from input
340    ///
341    /// This number does not exceed the error position: `read <= error.position`.
342    pub read: usize,
343
344    /// Number of bytes written to output
345    ///
346    /// This number does not exceed the decoded length: `written <= decode_len(read)`.
347    pub written: usize,
348
349    /// Decoding error
350    pub error: DecodeError,
351}
352
353const INVALID: u8 = 128;
354const IGNORE: u8 = 129;
355const PADDING: u8 = 130;
356
357fn order(msb: bool, n: usize, i: usize) -> usize {
358    if msb {
359        n - 1 - i
360    } else {
361        i
362    }
363}
364
365fn enc(bit: usize) -> usize {
366    match bit {
367        1 | 2 | 4 => 1,
368        3 | 6 => 3,
369        5 => 5,
370        _ => unreachable!(),
371    }
372}
373
374fn dec(bit: usize) -> usize {
375    enc(bit) * 8 / bit
376}
377
378fn encode_len<B: Static<usize>>(bit: B, len: usize) -> usize {
379    div_ceil(8 * len, bit.val())
380}
381
382fn encode_block<B: Static<usize>, M: Static<bool>>(
383    bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
384) {
385    debug_assert!(input.len() <= enc(bit.val()));
386    debug_assert_eq!(output.len(), encode_len(bit, input.len()));
387    let bit = bit.val();
388    let msb = msb.val();
389    let mut x = 0u64;
390    for (i, input) in input.iter().enumerate() {
391        x |= u64::from(*input) << (8 * order(msb, enc(bit), i));
392    }
393    for (i, output) in output.iter_mut().enumerate() {
394        let y = x >> (bit * order(msb, dec(bit), i));
395        *output = symbols[(y & 0xff) as usize];
396    }
397}
398
399fn encode_mut<B: Static<usize>, M: Static<bool>>(
400    bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
401) {
402    debug_assert_eq!(output.len(), encode_len(bit, input.len()));
403    let enc = enc(bit.val());
404    let dec = dec(bit.val());
405    let n = input.len() / enc;
406    let bs = match bit.val() {
407        5 => 2,
408        6 => 4,
409        _ => 1,
410    };
411    vectorize(n, bs, |i| {
412        let input = unsafe { chunk_unchecked(input, enc, i) };
413        let output = unsafe { chunk_mut_unchecked(output, dec, i) };
414        encode_block(bit, msb, symbols, input, output);
415    });
416    encode_block(bit, msb, symbols, &input[enc * n ..], &mut output[dec * n ..]);
417}
418
419// Fails if an input character does not translate to a symbol. The error is the
420// lowest index of such character. The output is not written to.
421fn decode_block<B: Static<usize>, M: Static<bool>>(
422    bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
423) -> Result<(), usize> {
424    debug_assert!(output.len() <= enc(bit.val()));
425    debug_assert_eq!(input.len(), encode_len(bit, output.len()));
426    let bit = bit.val();
427    let msb = msb.val();
428    let mut x = 0u64;
429    for j in 0 .. input.len() {
430        let y = values[input[j] as usize];
431        check!(j, y < 1 << bit);
432        x |= u64::from(y) << (bit * order(msb, dec(bit), j));
433    }
434    for (j, output) in output.iter_mut().enumerate() {
435        *output = (x >> (8 * order(msb, enc(bit), j)) & 0xff) as u8;
436    }
437    Ok(())
438}
439
440// Fails if an input character does not translate to a symbol. The error `pos`
441// is the lowest index of such character. The output is valid up to `pos / dec *
442// enc` excluded.
443fn decode_mut<B: Static<usize>, M: Static<bool>>(
444    bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
445) -> Result<(), usize> {
446    debug_assert_eq!(input.len(), encode_len(bit, output.len()));
447    let enc = enc(bit.val());
448    let dec = dec(bit.val());
449    let n = input.len() / dec;
450    for i in 0 .. n {
451        let input = unsafe { chunk_unchecked(input, dec, i) };
452        let output = unsafe { chunk_mut_unchecked(output, enc, i) };
453        decode_block(bit, msb, values, input, output).map_err(|e| dec * i + e)?;
454    }
455    decode_block(bit, msb, values, &input[dec * n ..], &mut output[enc * n ..])
456        .map_err(|e| dec * n + e)
457}
458
459// Fails if there are non-zero trailing bits.
460fn check_trail<B: Static<usize>, M: Static<bool>>(
461    bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8],
462) -> Result<(), ()> {
463    if 8 % bit.val() == 0 || !ctb {
464        return Ok(());
465    }
466    let trail = bit.val() * input.len() % 8;
467    if trail == 0 {
468        return Ok(());
469    }
470    let mut mask = (1 << trail) - 1;
471    if !msb.val() {
472        mask <<= bit.val() - trail;
473    }
474    check!((), values[input[input.len() - 1] as usize] & mask == 0);
475    Ok(())
476}
477
478// Fails if the padding length is invalid. The error is the index of the first
479// padding character.
480fn check_pad<B: Static<usize>>(bit: B, values: &[u8; 256], input: &[u8]) -> Result<usize, usize> {
481    let bit = bit.val();
482    debug_assert_eq!(input.len(), dec(bit));
483    let is_pad = |x: &&u8| values[**x as usize] == PADDING;
484    let count = input.iter().rev().take_while(is_pad).count();
485    let len = input.len() - count;
486    check!(len, len > 0 && bit * len % 8 < bit);
487    Ok(len)
488}
489
490fn encode_base_len<B: Static<usize>>(bit: B, len: usize) -> usize {
491    encode_len(bit, len)
492}
493
494fn encode_base<B: Static<usize>, M: Static<bool>>(
495    bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
496) {
497    debug_assert_eq!(output.len(), encode_base_len(bit, input.len()));
498    encode_mut(bit, msb, symbols, input, output);
499}
500
501fn encode_pad_len<B: Static<usize>, P: Static<Option<u8>>>(bit: B, pad: P, len: usize) -> usize {
502    match pad.val() {
503        None => encode_base_len(bit, len),
504        Some(_) => div_ceil(len, enc(bit.val())) * dec(bit.val()),
505    }
506}
507
508fn encode_pad<B: Static<usize>, M: Static<bool>, P: Static<Option<u8>>>(
509    bit: B, msb: M, symbols: &[u8; 256], spad: P, input: &[u8], output: &mut [u8],
510) {
511    let pad = match spad.val() {
512        None => return encode_base(bit, msb, symbols, input, output),
513        Some(pad) => pad,
514    };
515    debug_assert_eq!(output.len(), encode_pad_len(bit, spad, input.len()));
516    let olen = encode_base_len(bit, input.len());
517    encode_base(bit, msb, symbols, input, &mut output[.. olen]);
518    for output in output.iter_mut().skip(olen) {
519        *output = pad;
520    }
521}
522
523fn encode_wrap_len<
524    'a,
525    B: Static<usize>,
526    P: Static<Option<u8>>,
527    W: Static<Option<(usize, &'a [u8])>>,
528>(
529    bit: B, pad: P, wrap: W, ilen: usize,
530) -> usize {
531    let olen = encode_pad_len(bit, pad, ilen);
532    match wrap.val() {
533        None => olen,
534        Some((col, end)) => olen + end.len() * div_ceil(olen, col),
535    }
536}
537
538fn encode_wrap_mut<
539    'a,
540    B: Static<usize>,
541    M: Static<bool>,
542    P: Static<Option<u8>>,
543    W: Static<Option<(usize, &'a [u8])>>,
544>(
545    bit: B, msb: M, symbols: &[u8; 256], pad: P, wrap: W, input: &[u8], output: &mut [u8],
546) {
547    let (col, end) = match wrap.val() {
548        None => return encode_pad(bit, msb, symbols, pad, input, output),
549        Some((col, end)) => (col, end),
550    };
551    debug_assert_eq!(output.len(), encode_wrap_len(bit, pad, wrap, input.len()));
552    debug_assert_eq!(col % dec(bit.val()), 0);
553    let col = col / dec(bit.val());
554    let enc = col * enc(bit.val());
555    let dec = col * dec(bit.val()) + end.len();
556    let olen = dec - end.len();
557    let n = input.len() / enc;
558    for i in 0 .. n {
559        let input = unsafe { chunk_unchecked(input, enc, i) };
560        let output = unsafe { chunk_mut_unchecked(output, dec, i) };
561        encode_base(bit, msb, symbols, input, &mut output[.. olen]);
562        output[olen ..].copy_from_slice(end);
563    }
564    if input.len() > enc * n {
565        let olen = dec * n + encode_pad_len(bit, pad, input.len() - enc * n);
566        encode_pad(bit, msb, symbols, pad, &input[enc * n ..], &mut output[dec * n .. olen]);
567        output[olen ..].copy_from_slice(end);
568    }
569}
570
571// Returns the longest valid input length and associated output length.
572fn decode_wrap_len<B: Static<usize>, P: Static<bool>>(
573    bit: B, pad: P, len: usize,
574) -> (usize, usize) {
575    let bit = bit.val();
576    if pad.val() {
577        (floor(len, dec(bit)), len / dec(bit) * enc(bit))
578    } else {
579        let trail = bit * len % 8;
580        (len - trail / bit, bit * len / 8)
581    }
582}
583
584// Fails with Length if length is invalid. The error is the largest valid
585// length.
586fn decode_pad_len<B: Static<usize>, P: Static<bool>>(
587    bit: B, pad: P, len: usize,
588) -> Result<usize, DecodeError> {
589    let (ilen, olen) = decode_wrap_len(bit, pad, len);
590    check!(DecodeError { position: ilen, kind: DecodeKind::Length }, ilen == len);
591    Ok(olen)
592}
593
594// Fails with Length if length is invalid. The error is the largest valid
595// length.
596fn decode_base_len<B: Static<usize>>(bit: B, len: usize) -> Result<usize, DecodeError> {
597    decode_pad_len(bit, Bf, len)
598}
599
600// Fails with Symbol if an input character does not translate to a symbol. The
601// error is the lowest index of such character.
602// Fails with Trailing if there are non-zero trailing bits.
603fn decode_base_mut<B: Static<usize>, M: Static<bool>>(
604    bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8], output: &mut [u8],
605) -> Result<usize, DecodePartial> {
606    debug_assert_eq!(Ok(output.len()), decode_base_len(bit, input.len()));
607    let fail = |pos, kind| DecodePartial {
608        read: pos / dec(bit.val()) * dec(bit.val()),
609        written: pos / dec(bit.val()) * enc(bit.val()),
610        error: DecodeError { position: pos, kind },
611    };
612    decode_mut(bit, msb, values, input, output).map_err(|pos| fail(pos, DecodeKind::Symbol))?;
613    check_trail(bit, msb, ctb, values, input)
614        .map_err(|()| fail(input.len() - 1, DecodeKind::Trailing))?;
615    Ok(output.len())
616}
617
618// Fails with Symbol if an input character does not translate to a symbol. The
619// error is the lowest index of such character.
620// Fails with Padding if some padding length is invalid. The error is the index
621// of the first padding character of the invalid padding.
622// Fails with Trailing if there are non-zero trailing bits.
623fn decode_pad_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
624    bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
625) -> Result<usize, DecodePartial> {
626    if !pad.val() {
627        return decode_base_mut(bit, msb, ctb, values, input, output);
628    }
629    debug_assert_eq!(Ok(output.len()), decode_pad_len(bit, pad, input.len()));
630    let enc = enc(bit.val());
631    let dec = dec(bit.val());
632    let mut inpos = 0;
633    let mut outpos = 0;
634    let mut outend = output.len();
635    while inpos < input.len() {
636        match decode_base_mut(
637            bit,
638            msb,
639            ctb,
640            values,
641            &input[inpos ..],
642            &mut output[outpos .. outend],
643        ) {
644            Ok(written) => {
645                if cfg!(debug_assertions) {
646                    inpos = input.len();
647                }
648                outpos += written;
649                break;
650            }
651            Err(partial) => {
652                inpos += partial.read;
653                outpos += partial.written;
654            }
655        }
656        let inlen =
657            check_pad(bit, values, &input[inpos .. inpos + dec]).map_err(|pos| DecodePartial {
658                read: inpos,
659                written: outpos,
660                error: DecodeError { position: inpos + pos, kind: DecodeKind::Padding },
661            })?;
662        let outlen = decode_base_len(bit, inlen).unwrap();
663        let written = decode_base_mut(
664            bit,
665            msb,
666            ctb,
667            values,
668            &input[inpos .. inpos + inlen],
669            &mut output[outpos .. outpos + outlen],
670        )
671        .map_err(|partial| {
672            debug_assert_eq!(partial.read, 0);
673            debug_assert_eq!(partial.written, 0);
674            DecodePartial {
675                read: inpos,
676                written: outpos,
677                error: DecodeError {
678                    position: inpos + partial.error.position,
679                    kind: partial.error.kind,
680                },
681            }
682        })?;
683        debug_assert_eq!(written, outlen);
684        inpos += dec;
685        outpos += outlen;
686        outend -= enc - outlen;
687    }
688    debug_assert_eq!(inpos, input.len());
689    debug_assert_eq!(outpos, outend);
690    Ok(outend)
691}
692
693fn skip_ignore(values: &[u8; 256], input: &[u8], mut inpos: usize) -> usize {
694    while inpos < input.len() && values[input[inpos] as usize] == IGNORE {
695        inpos += 1;
696    }
697    inpos
698}
699
700// Returns next input and output position.
701// Fails with Symbol if an input character does not translate to a symbol. The
702// error is the lowest index of such character.
703// Fails with Padding if some padding length is invalid. The error is the index
704// of the first padding character of the invalid padding.
705// Fails with Trailing if there are non-zero trailing bits.
706fn decode_wrap_block<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
707    bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
708) -> Result<(usize, usize), DecodeError> {
709    let dec = dec(bit.val());
710    let mut buf = [0u8; 8];
711    let mut shift = [0usize; 8];
712    let mut bufpos = 0;
713    let mut inpos = 0;
714    while bufpos < dec {
715        inpos = skip_ignore(values, input, inpos);
716        if inpos == input.len() {
717            break;
718        }
719        shift[bufpos] = inpos;
720        buf[bufpos] = input[inpos];
721        bufpos += 1;
722        inpos += 1;
723    }
724    let olen = decode_pad_len(bit, pad, bufpos).map_err(|mut e| {
725        e.position = shift[e.position];
726        e
727    })?;
728    let written = decode_pad_mut(bit, msb, ctb, values, pad, &buf[.. bufpos], &mut output[.. olen])
729        .map_err(|partial| {
730            debug_assert_eq!(partial.read, 0);
731            debug_assert_eq!(partial.written, 0);
732            DecodeError { position: shift[partial.error.position], kind: partial.error.kind }
733        })?;
734    Ok((inpos, written))
735}
736
737// Fails with Symbol if an input character does not translate to a symbol. The
738// error is the lowest index of such character.
739// Fails with Padding if some padding length is invalid. The error is the index
740// of the first padding character of the invalid padding.
741// Fails with Trailing if there are non-zero trailing bits.
742// Fails with Length if input length (without ignored characters) is invalid.
743#[allow(clippy::too_many_arguments)]
744fn decode_wrap_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>, I: Static<bool>>(
745    bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, has_ignore: I, input: &[u8],
746    output: &mut [u8],
747) -> Result<usize, DecodePartial> {
748    if !has_ignore.val() {
749        return decode_pad_mut(bit, msb, ctb, values, pad, input, output);
750    }
751    debug_assert_eq!(output.len(), decode_wrap_len(bit, pad, input.len()).1);
752    let mut inpos = 0;
753    let mut outpos = 0;
754    while inpos < input.len() {
755        let (inlen, outlen) = decode_wrap_len(bit, pad, input.len() - inpos);
756        match decode_pad_mut(
757            bit,
758            msb,
759            ctb,
760            values,
761            pad,
762            &input[inpos .. inpos + inlen],
763            &mut output[outpos .. outpos + outlen],
764        ) {
765            Ok(written) => {
766                inpos += inlen;
767                outpos += written;
768                break;
769            }
770            Err(partial) => {
771                inpos += partial.read;
772                outpos += partial.written;
773            }
774        }
775        let (ipos, opos) =
776            decode_wrap_block(bit, msb, ctb, values, pad, &input[inpos ..], &mut output[outpos ..])
777                .map_err(|mut error| {
778                    error.position += inpos;
779                    DecodePartial { read: inpos, written: outpos, error }
780                })?;
781        inpos += ipos;
782        outpos += opos;
783    }
784    let inpos = skip_ignore(values, input, inpos);
785    if inpos == input.len() {
786        Ok(outpos)
787    } else {
788        Err(DecodePartial {
789            read: inpos,
790            written: outpos,
791            error: DecodeError { position: inpos, kind: DecodeKind::Length },
792        })
793    }
794}
795
796/// Order in which bits are read from a byte
797///
798/// The base-conversion encoding is always little-endian. This means that the least significant
799/// **byte** is always first. However, we can still choose whether, within a byte, this is the most
800/// significant or the least significant **bit** that is first. If the terminology is confusing,
801/// testing on an asymmetrical example should be enough to choose the correct value.
802///
803/// # Examples
804///
805/// In the following example, we can see that a base with the `MostSignificantFirst` bit-order has
806/// the most significant bit first in the encoded output. In particular, the output is in the same
807/// order as the bits in the byte. The opposite happens with the `LeastSignificantFirst` bit-order.
808/// The least significant bit is first and the output is in the reverse order.
809///
810/// ```rust
811/// use data_encoding::{BitOrder, Specification};
812/// let mut spec = Specification::new();
813/// spec.symbols.push_str("01");
814/// spec.bit_order = BitOrder::MostSignificantFirst;  // default
815/// let msb = spec.encoding().unwrap();
816/// spec.bit_order = BitOrder::LeastSignificantFirst;
817/// let lsb = spec.encoding().unwrap();
818/// assert_eq!(msb.encode(&[0b01010011]), "01010011");
819/// assert_eq!(lsb.encode(&[0b01010011]), "11001010");
820/// ```
821#[derive(Debug, Copy, Clone, PartialEq, Eq)]
822#[cfg(feature = "alloc")]
823pub enum BitOrder {
824    /// Most significant bit first
825    ///
826    /// This is the most common and most intuitive bit-order. In particular, this is the bit-order
827    /// used by [RFC4648] and thus the usual hexadecimal, base64, base32, base64url, and base32hex
828    /// encodings. This is the default bit-order when [specifying](struct.Specification.html) a
829    /// base.
830    ///
831    /// [RFC4648]: https://tools.ietf.org/html/rfc4648
832    MostSignificantFirst,
833
834    /// Least significant bit first
835    ///
836    /// # Examples
837    ///
838    /// DNSCurve [base32] uses least significant bit first:
839    ///
840    /// ```rust
841    /// use data_encoding::BASE32_DNSCURVE;
842    /// assert_eq!(BASE32_DNSCURVE.encode(&[0x64, 0x88]), "4321");
843    /// assert_eq!(BASE32_DNSCURVE.decode(b"4321").unwrap(), vec![0x64, 0x88]);
844    /// ```
845    ///
846    /// [base32]: constant.BASE32_DNSCURVE.html
847    LeastSignificantFirst,
848}
849#[cfg(feature = "alloc")]
850use crate::BitOrder::*;
851
852#[doc(hidden)]
853#[cfg(feature = "alloc")]
854pub type InternalEncoding = Cow<'static, [u8]>;
855
856#[doc(hidden)]
857#[cfg(not(feature = "alloc"))]
858pub type InternalEncoding = &'static [u8];
859
860/// Base-conversion encoding
861///
862/// See [Specification](struct.Specification.html) for technical details or how to define a new one.
863// Required fields:
864//   0 - 256 (256) symbols
865// 256 - 512 (256) values
866// 512 - 513 (  1) padding
867// 513 - 514 (  1) reserved(3),ctb(1),msb(1),bit(3)
868// Optional fields:
869// 514 - 515 (  1) width
870// 515 -   * (  N) separator
871// Invariants:
872// - symbols is 2^bit unique characters repeated 2^(8-bit) times
873// - values[128 ..] are INVALID
874// - values[0 .. 128] are either INVALID, IGNORE, PADDING, or < 2^bit
875// - padding is either < 128 or INVALID
876// - values[padding] is PADDING if padding < 128
877// - values and symbols are inverse
878// - ctb is true if 8 % bit == 0
879// - width is present if there is x such that values[x] is IGNORE
880// - width % dec(bit) == 0
881// - for all x in separator values[x] is IGNORE
882#[derive(Debug, Clone, PartialEq, Eq)]
883pub struct Encoding(#[doc(hidden)] pub InternalEncoding);
884
885/// How to translate characters when decoding
886///
887/// The order matters. The first character of the `from` field is translated to the first character
888/// of the `to` field. The second to the second. Etc.
889///
890/// See [Specification](struct.Specification.html) for more information.
891#[derive(Debug, Clone)]
892#[cfg(feature = "alloc")]
893pub struct Translate {
894    /// Characters to translate from
895    pub from: String,
896
897    /// Characters to translate to
898    pub to: String,
899}
900
901/// How to wrap the output when encoding
902///
903/// See [Specification](struct.Specification.html) for more information.
904#[derive(Debug, Clone)]
905#[cfg(feature = "alloc")]
906pub struct Wrap {
907    /// Wrapping width
908    ///
909    /// Must be a multiple of:
910    ///
911    /// - 8 for a bit-width of 1 (binary), 3 (octal), and 5 (base32)
912    /// - 4 for a bit-width of 2 (base4) and 6 (base64)
913    /// - 2 for a bit-width of 4 (hexadecimal)
914    ///
915    /// Wrapping is disabled if null.
916    pub width: usize,
917
918    /// Wrapping characters
919    ///
920    /// Wrapping is disabled if empty.
921    pub separator: String,
922}
923
924/// Base-conversion specification
925///
926/// It is possible to define custom encodings given a specification. To do so, it is important to
927/// understand the theory first.
928///
929/// # Theory
930///
931/// Each subsection has an equivalent subsection in the [Practice](#practice) section.
932///
933/// ## Basics
934///
935/// The main idea of a [base-conversion] encoding is to see `[u8]` as numbers written in
936/// little-endian base256 and convert them in another little-endian base. For performance reasons,
937/// this crate restricts this other base to be of size 2 (binary), 4 (base4), 8 (octal), 16
938/// (hexadecimal), 32 (base32), or 64 (base64). The converted number is written as `[u8]` although
939/// it doesn't use all the 256 possible values of `u8`. This crate encodes to ASCII, so only values
940/// smaller than 128 are allowed.
941///
942/// More precisely, we need the following elements:
943///
944/// - The bit-width N: 1 for binary, 2 for base4, 3 for octal, 4 for hexadecimal, 5 for base32, and
945///   6 for base64
946/// - The [bit-order](enum.BitOrder.html): most or least significant bit first
947/// - The symbols function S from [0, 2<sup>N</sup>) (called values and written `uN`) to symbols
948///   (represented as `u8` although only ASCII symbols are allowed, i.e. smaller than 128)
949/// - The values partial function V from ASCII to [0, 2<sup>N</sup>), i.e. from `u8` to `uN`
950/// - Whether trailing bits are checked: trailing bits are leading zeros in theory, but since
951///   numbers are little-endian they come last
952///
953/// For the encoding to be correct (i.e. encoding then decoding gives back the initial input),
954/// V(S(i)) must be defined and equal to i for all i in [0, 2<sup>N</sup>). For the encoding to be
955/// [canonical][canonical] (i.e. different inputs decode to different outputs, or equivalently,
956/// decoding then encoding gives back the initial input), trailing bits must be checked and if V(i)
957/// is defined then S(V(i)) is equal to i for all i.
958///
959/// Encoding and decoding are given by the following pipeline:
960///
961/// ```text
962/// [u8] <--1--> [[bit; 8]] <--2--> [[bit; N]] <--3--> [uN] <--4--> [u8]
963/// 1: Map bit-order between each u8 and [bit; 8]
964/// 2: Base conversion between base 2^8 and base 2^N (check trailing bits)
965/// 3: Map bit-order between each [bit; N] and uN
966/// 4: Map symbols/values between each uN and u8 (values must be defined)
967/// ```
968///
969/// ## Extensions
970///
971/// All these extensions make the encoding not canonical.
972///
973/// ### Padding
974///
975/// Padding is useful if the following conditions are met:
976///
977/// - the bit-width is 3 (octal), 5 (base32), or 6 (base64)
978/// - the length of the data to encode is not known in advance
979/// - the data must be sent without buffering
980///
981/// Bases for which the bit-width N does not divide 8 may not concatenate encoded data. This comes
982/// from the fact that it is not possible to make the difference between trailing bits and encoding
983/// bits. Padding solves this issue by adding a new character to discriminate between trailing bits
984/// and encoding bits. The idea is to work by blocks of lcm(8, N) bits, where lcm(8, N) is the least
985/// common multiple of 8 and N. When such block is not complete, it is padded.
986///
987/// To preserve correctness, the padding character must not be a symbol.
988///
989/// ### Ignore characters when decoding
990///
991/// Ignoring characters when decoding is useful if after encoding some characters are added for
992/// convenience or any other reason (like wrapping). In that case we want to first ignore those
993/// characters before decoding.
994///
995/// To preserve correctness, ignored characters must not contain symbols or the padding character.
996///
997/// ### Wrap output when encoding
998///
999/// Wrapping output when encoding is useful if the output is meant to be printed in a document where
1000/// width is limited (typically 80-columns documents). In that case, the wrapping width and the
1001/// wrapping separator have to be defined.
1002///
1003/// To preserve correctness, the wrapping separator characters must be ignored (see previous
1004/// subsection). As such, wrapping separator characters must also not contain symbols or the padding
1005/// character.
1006///
1007/// ### Translate characters when decoding
1008///
1009/// Translating characters when decoding is useful when encoded data may be copied by a humain
1010/// instead of a machine. Humans tend to confuse some characters for others. In that case we want to
1011/// translate those characters before decoding.
1012///
1013/// To preserve correctness, the characters we translate _from_ must not contain symbols or the
1014/// padding character, and the characters we translate _to_ must only contain symbols or the padding
1015/// character.
1016///
1017/// # Practice
1018///
1019/// ## Basics
1020///
1021/// ```rust
1022/// use data_encoding::{Encoding, Specification};
1023/// fn make_encoding(symbols: &str) -> Encoding {
1024///     let mut spec = Specification::new();
1025///     spec.symbols.push_str(symbols);
1026///     spec.encoding().unwrap()
1027/// }
1028/// let binary = make_encoding("01");
1029/// let octal = make_encoding("01234567");
1030/// let hexadecimal = make_encoding("0123456789abcdef");
1031/// assert_eq!(binary.encode(b"Bit"), "010000100110100101110100");
1032/// assert_eq!(octal.encode(b"Bit"), "20464564");
1033/// assert_eq!(hexadecimal.encode(b"Bit"), "426974");
1034/// ```
1035///
1036/// The `binary` base has 2 symbols `0` and `1` with value 0 and 1 respectively. The `octal` base
1037/// has 8 symbols `0` to `7` with value 0 to 7. The `hexadecimal` base has 16 symbols `0` to `9` and
1038/// `a` to `f` with value 0 to 15. The following diagram gives the idea of how encoding works in the
1039/// previous example (note that we can actually write such diagram only because the bit-order is
1040/// most significant first):
1041///
1042/// ```text
1043/// [      octal] |  2  :  0  :  4  :  6  :  4  :  5  :  6  :  4  |
1044/// [     binary] |0 1 0 0 0 0 1 0|0 1 1 0 1 0 0 1|0 1 1 1 0 1 0 0|
1045/// [hexadecimal] |   4   :   2   |   6   :   9   |   7   :   4   |
1046///                ^-- LSB                                       ^-- MSB
1047/// ```
1048///
1049/// Note that in theory, these little-endian numbers are read from right to left (the most
1050/// significant bit is at the right). Since leading zeros are meaningless (in our usual decimal
1051/// notation 0123 is the same as 123), it explains why trailing bits must be zero. Trailing bits may
1052/// occur when the bit-width of a base does not divide 8. Only binary, base4, and hexadecimal don't
1053/// have trailing bits issues. So let's consider octal and base64, which have trailing bits in
1054/// similar circumstances:
1055///
1056/// ```rust
1057/// use data_encoding::{Specification, BASE64_NOPAD};
1058/// let octal = {
1059///     let mut spec = Specification::new();
1060///     spec.symbols.push_str("01234567");
1061///     spec.encoding().unwrap()
1062/// };
1063/// assert_eq!(BASE64_NOPAD.encode(b"B"), "Qg");
1064/// assert_eq!(octal.encode(b"B"), "204");
1065/// ```
1066///
1067/// We have the following diagram, where the base64 values are written between parentheses:
1068///
1069/// ```text
1070/// [base64] |   Q(16)   :   g(32)   : [has 4 zero trailing bits]
1071/// [ octal] |  2  :  0  :  4  :       [has 1 zero trailing bit ]
1072///          |0 1 0 0 0 0 1 0|0 0 0 0
1073/// [ ascii] |       B       |
1074///                           ^-^-^-^-- leading zeros / trailing bits
1075/// ```
1076///
1077/// ## Extensions
1078///
1079/// ### Padding
1080///
1081/// For octal and base64, lcm(8, 3) == lcm(8, 6) == 24 bits or 3 bytes. For base32, lcm(8, 5) is 40
1082/// bits or 5 bytes. Let's consider octal and base64:
1083///
1084/// ```rust
1085/// use data_encoding::{Specification, BASE64};
1086/// let octal = {
1087///     let mut spec = Specification::new();
1088///     spec.symbols.push_str("01234567");
1089///     spec.padding = Some('=');
1090///     spec.encoding().unwrap()
1091/// };
1092/// // We start encoding but we only have "B" for now.
1093/// assert_eq!(BASE64.encode(b"B"), "Qg==");
1094/// assert_eq!(octal.encode(b"B"), "204=====");
1095/// // Now we have "it".
1096/// assert_eq!(BASE64.encode(b"it"), "aXQ=");
1097/// assert_eq!(octal.encode(b"it"), "322720==");
1098/// // By concatenating everything, we may decode the original data.
1099/// assert_eq!(BASE64.decode(b"Qg==aXQ=").unwrap(), b"Bit");
1100/// assert_eq!(octal.decode(b"204=====322720==").unwrap(), b"Bit");
1101/// ```
1102///
1103/// We have the following diagrams:
1104///
1105/// ```text
1106/// [base64] |   Q(16)   :   g(32)   :     =     :     =     |
1107/// [ octal] |  2  :  0  :  4  :  =  :  =  :  =  :  =  :  =  |
1108///          |0 1 0 0 0 0 1 0|. . . . . . . .|. . . . . . . .|
1109/// [ ascii] |       B       |        end of block aligned --^
1110///          ^-- beginning of block aligned
1111///
1112/// [base64] |   a(26)   :   X(23)   :   Q(16)   :     =     |
1113/// [ octal] |  3  :  2  :  2  :  7  :  2  :  0  :  =  :  =  |
1114///          |0 1 1 0 1 0 0 1|0 1 1 1 0 1 0 0|. . . . . . . .|
1115/// [ ascii] |       i       |       t       |
1116/// ```
1117///
1118/// ### Ignore characters when decoding
1119///
1120/// The typical use-case is to ignore newlines (`\r` and `\n`). But to keep the example small, we
1121/// will ignore spaces.
1122///
1123/// ```rust
1124/// let mut spec = data_encoding::HEXLOWER.specification();
1125/// spec.ignore.push_str(" \t");
1126/// let base = spec.encoding().unwrap();
1127/// assert_eq!(base.decode(b"42 69 74"), base.decode(b"426974"));
1128/// ```
1129///
1130/// ### Wrap output when encoding
1131///
1132/// The typical use-case is to wrap after 64 or 76 characters with a newline (`\r\n` or `\n`). But
1133/// to keep the example small, we will wrap after 8 characters with a space.
1134///
1135/// ```rust
1136/// let mut spec = data_encoding::BASE64.specification();
1137/// spec.wrap.width = 8;
1138/// spec.wrap.separator.push_str(" ");
1139/// let base64 = spec.encoding().unwrap();
1140/// assert_eq!(base64.encode(b"Hey you"), "SGV5IHlv dQ== ");
1141/// ```
1142///
1143/// Note that the output always ends with the separator.
1144///
1145/// ### Translate characters when decoding
1146///
1147/// The typical use-case is to translate lowercase to uppercase or reciprocally, but it is also used
1148/// for letters that look alike, like `O0` or `Il1`. Let's illustrate both examples.
1149///
1150/// ```rust
1151/// let mut spec = data_encoding::HEXLOWER.specification();
1152/// spec.translate.from.push_str("ABCDEFOIl");
1153/// spec.translate.to.push_str("abcdef011");
1154/// let base = spec.encoding().unwrap();
1155/// assert_eq!(base.decode(b"BOIl"), base.decode(b"b011"));
1156/// ```
1157///
1158/// [base-conversion]: https://en.wikipedia.org/wiki/Positional_notation#Base_conversion
1159/// [canonical]: https://tools.ietf.org/html/rfc4648#section-3.5
1160#[derive(Debug, Clone)]
1161#[cfg(feature = "alloc")]
1162pub struct Specification {
1163    /// Symbols
1164    ///
1165    /// The number of symbols must be 2, 4, 8, 16, 32, or 64. Symbols must be ASCII characters
1166    /// (smaller than 128) and they must be unique.
1167    pub symbols: String,
1168
1169    /// Bit-order
1170    ///
1171    /// The default is to use most significant bit first since it is the most common.
1172    pub bit_order: BitOrder,
1173
1174    /// Check trailing bits
1175    ///
1176    /// The default is to check trailing bits. This field is ignored when unnecessary (i.e. for
1177    /// base2, base4, and base16).
1178    pub check_trailing_bits: bool,
1179
1180    /// Padding
1181    ///
1182    /// The default is to not use padding. The padding character must be ASCII and must not be a
1183    /// symbol.
1184    pub padding: Option<char>,
1185
1186    /// Characters to ignore when decoding
1187    ///
1188    /// The default is to not ignore characters when decoding. The characters to ignore must be
1189    /// ASCII and must not be symbols or the padding character.
1190    pub ignore: String,
1191
1192    /// How to wrap the output when encoding
1193    ///
1194    /// The default is to not wrap the output when encoding. The wrapping characters must be ASCII
1195    /// and must not be symbols or the padding character.
1196    pub wrap: Wrap,
1197
1198    /// How to translate characters when decoding
1199    ///
1200    /// The default is to not translate characters when decoding. The characters to translate from
1201    /// must be ASCII and must not have already been assigned a semantics. The characters to
1202    /// translate to must be ASCII and must have been assigned a semantics (symbol, padding
1203    /// character, or ignored character).
1204    pub translate: Translate,
1205}
1206
1207#[cfg(feature = "alloc")]
1208impl Default for Specification {
1209    fn default() -> Self {
1210        Self::new()
1211    }
1212}
1213
1214impl Encoding {
1215    fn sym(&self) -> &[u8; 256] {
1216        self.0[0 .. 256].try_into().unwrap()
1217    }
1218
1219    fn val(&self) -> &[u8; 256] {
1220        self.0[256 .. 512].try_into().unwrap()
1221    }
1222
1223    fn pad(&self) -> Option<u8> {
1224        if self.0[512] < 128 {
1225            Some(self.0[512])
1226        } else {
1227            None
1228        }
1229    }
1230
1231    fn ctb(&self) -> bool {
1232        self.0[513] & 0x10 != 0
1233    }
1234
1235    fn msb(&self) -> bool {
1236        self.0[513] & 0x8 != 0
1237    }
1238
1239    fn bit(&self) -> usize {
1240        (self.0[513] & 0x7) as usize
1241    }
1242
1243    /// Minimum number of input and output blocks when encoding
1244    fn block_len(&self) -> (usize, usize) {
1245        let bit = self.bit();
1246        match self.wrap() {
1247            Some((col, end)) => (col / dec(bit) * enc(bit), col + end.len()),
1248            None => (enc(bit), dec(bit)),
1249        }
1250    }
1251
1252    fn wrap(&self) -> Option<(usize, &[u8])> {
1253        if self.0.len() <= 515 {
1254            return None;
1255        }
1256        Some((self.0[514] as usize, &self.0[515 ..]))
1257    }
1258
1259    fn has_ignore(&self) -> bool {
1260        self.0.len() >= 515
1261    }
1262
1263    /// Returns the encoded length of an input of length `len`
1264    ///
1265    /// See [`encode_mut`] for when to use it.
1266    ///
1267    /// [`encode_mut`]: struct.Encoding.html#method.encode_mut
1268    #[must_use]
1269    pub fn encode_len(&self, len: usize) -> usize {
1270        dispatch! {
1271            let bit: usize = self.bit();
1272            let pad: Option<u8> = self.pad();
1273            let wrap: Option<(usize, &[u8])> = self.wrap();
1274            encode_wrap_len(bit, pad, wrap, len)
1275        }
1276    }
1277
1278    /// Encodes `input` in `output`
1279    ///
1280    /// # Panics
1281    ///
1282    /// Panics if the `output` length does not match the result of [`encode_len`] for the `input`
1283    /// length.
1284    ///
1285    /// # Examples
1286    ///
1287    /// ```rust
1288    /// use data_encoding::BASE64;
1289    /// # let mut buffer = vec![0; 100];
1290    /// let input = b"Hello world";
1291    /// let output = &mut buffer[0 .. BASE64.encode_len(input.len())];
1292    /// BASE64.encode_mut(input, output);
1293    /// assert_eq!(output, b"SGVsbG8gd29ybGQ=");
1294    /// ```
1295    ///
1296    /// [`encode_len`]: struct.Encoding.html#method.encode_len
1297    #[allow(clippy::cognitive_complexity)]
1298    pub fn encode_mut(&self, input: &[u8], output: &mut [u8]) {
1299        assert_eq!(output.len(), self.encode_len(input.len()));
1300        dispatch! {
1301            let bit: usize = self.bit();
1302            let msb: bool = self.msb();
1303            let pad: Option<u8> = self.pad();
1304            let wrap: Option<(usize, &[u8])> = self.wrap();
1305            encode_wrap_mut(bit, msb, self.sym(), pad, wrap, input, output)
1306        }
1307    }
1308
1309    /// Appends the encoding of `input` to `output`
1310    ///
1311    /// # Examples
1312    ///
1313    /// ```rust
1314    /// use data_encoding::BASE64;
1315    /// # let mut buffer = vec![0; 100];
1316    /// let input = b"Hello world";
1317    /// let mut output = "Result: ".to_string();
1318    /// BASE64.encode_append(input, &mut output);
1319    /// assert_eq!(output, "Result: SGVsbG8gd29ybGQ=");
1320    /// ```
1321    #[cfg(feature = "alloc")]
1322    pub fn encode_append(&self, input: &[u8], output: &mut String) {
1323        let output = unsafe { output.as_mut_vec() };
1324        let output_len = output.len();
1325        output.resize(output_len + self.encode_len(input.len()), 0u8);
1326        self.encode_mut(input, &mut output[output_len ..]);
1327    }
1328
1329    /// Returns an object to encode a fragmented input and append it to `output`
1330    ///
1331    /// See the documentation of [`Encoder`] for more details and examples.
1332    #[cfg(feature = "alloc")]
1333    pub fn new_encoder<'a>(&'a self, output: &'a mut String) -> Encoder<'a> {
1334        Encoder::new(self, output)
1335    }
1336
1337    /// Writes the encoding of `input` to `output`
1338    ///
1339    /// This allocates a buffer of 1024 bytes on the stack. If you want to control the buffer size
1340    /// and location, use [`Encoding::encode_write_buffer()`] instead.
1341    ///
1342    /// # Errors
1343    ///
1344    /// Returns an error when writing to the output fails.
1345    pub fn encode_write(
1346        &self, input: &[u8], output: &mut impl core::fmt::Write,
1347    ) -> core::fmt::Result {
1348        self.encode_write_buffer(input, output, &mut [0; 1024])
1349    }
1350
1351    /// Writes the encoding of `input` to `output` using a temporary `buffer`
1352    ///
1353    /// # Panics
1354    ///
1355    /// Panics if the buffer is shorter than 510 bytes.
1356    ///
1357    /// # Errors
1358    ///
1359    /// Returns an error when writing to the output fails.
1360    pub fn encode_write_buffer(
1361        &self, input: &[u8], output: &mut impl core::fmt::Write, buffer: &mut [u8],
1362    ) -> core::fmt::Result {
1363        assert!(510 <= buffer.len());
1364        let (enc, dec) = self.block_len();
1365        for input in input.chunks(buffer.len() / dec * enc) {
1366            let buffer = &mut buffer[.. self.encode_len(input.len())];
1367            self.encode_mut(input, buffer);
1368            output.write_str(unsafe { core::str::from_utf8_unchecked(buffer) })?;
1369        }
1370        Ok(())
1371    }
1372
1373    /// Returns encoded `input`
1374    ///
1375    /// # Examples
1376    ///
1377    /// ```rust
1378    /// use data_encoding::BASE64;
1379    /// assert_eq!(BASE64.encode(b"Hello world"), "SGVsbG8gd29ybGQ=");
1380    /// ```
1381    #[cfg(feature = "alloc")]
1382    #[must_use]
1383    pub fn encode(&self, input: &[u8]) -> String {
1384        let mut output = vec![0u8; self.encode_len(input.len())];
1385        self.encode_mut(input, &mut output);
1386        unsafe { String::from_utf8_unchecked(output) }
1387    }
1388
1389    /// Returns the decoded length of an input of length `len`
1390    ///
1391    /// See [`decode_mut`] for when to use it.
1392    ///
1393    /// # Errors
1394    ///
1395    /// Returns an error if `len` is invalid. The error kind is [`Length`] and the [position] is the
1396    /// greatest valid input length.
1397    ///
1398    /// [`decode_mut`]: struct.Encoding.html#method.decode_mut
1399    /// [`Length`]: enum.DecodeKind.html#variant.Length
1400    /// [position]: struct.DecodeError.html#structfield.position
1401    pub fn decode_len(&self, len: usize) -> Result<usize, DecodeError> {
1402        let (ilen, olen) = dispatch! {
1403            let bit: usize = self.bit();
1404            let pad: bool = self.pad().is_some();
1405            decode_wrap_len(bit, pad, len)
1406        };
1407        check!(
1408            DecodeError { position: ilen, kind: DecodeKind::Length },
1409            self.has_ignore() || len == ilen
1410        );
1411        Ok(olen)
1412    }
1413
1414    /// Decodes `input` in `output`
1415    ///
1416    /// Returns the length of the decoded output. This length may be smaller than the output length
1417    /// if the input contained padding or ignored characters. The output bytes after the returned
1418    /// length are not initialized and should not be read.
1419    ///
1420    /// # Panics
1421    ///
1422    /// Panics if the `output` length does not match the result of [`decode_len`] for the `input`
1423    /// length. Also panics if `decode_len` fails for the `input` length.
1424    ///
1425    /// # Errors
1426    ///
1427    /// Returns an error if `input` is invalid. See [`decode`] for more details. The are two
1428    /// differences though:
1429    ///
1430    /// - [`Length`] may be returned only if the encoding allows ignored characters, because
1431    ///   otherwise this is already checked by [`decode_len`].
1432    /// - The [`read`] first bytes of the input have been successfully decoded to the [`written`]
1433    ///   first bytes of the output.
1434    ///
1435    /// # Examples
1436    ///
1437    /// ```rust
1438    /// use data_encoding::BASE64;
1439    /// # let mut buffer = vec![0; 100];
1440    /// let input = b"SGVsbA==byB3b3JsZA==";
1441    /// let output = &mut buffer[0 .. BASE64.decode_len(input.len()).unwrap()];
1442    /// let len = BASE64.decode_mut(input, output).unwrap();
1443    /// assert_eq!(&output[0 .. len], b"Hello world");
1444    /// ```
1445    ///
1446    /// [`decode_len`]: struct.Encoding.html#method.decode_len
1447    /// [`decode`]: struct.Encoding.html#method.decode
1448    /// [`Length`]: enum.DecodeKind.html#variant.Length
1449    /// [`read`]: struct.DecodePartial.html#structfield.read
1450    /// [`written`]: struct.DecodePartial.html#structfield.written
1451    #[allow(clippy::cognitive_complexity)]
1452    pub fn decode_mut(&self, input: &[u8], output: &mut [u8]) -> Result<usize, DecodePartial> {
1453        assert_eq!(Ok(output.len()), self.decode_len(input.len()));
1454        dispatch! {
1455            let bit: usize = self.bit();
1456            let msb: bool = self.msb();
1457            let pad: bool = self.pad().is_some();
1458            let has_ignore: bool = self.has_ignore();
1459            decode_wrap_mut(bit, msb, self.ctb(), self.val(), pad, has_ignore,
1460                            input, output)
1461        }
1462    }
1463
1464    /// Returns decoded `input`
1465    ///
1466    /// # Errors
1467    ///
1468    /// Returns an error if `input` is invalid. The error kind can be:
1469    ///
1470    /// - [`Length`] if the input length is invalid. The [position] is the greatest valid input
1471    ///   length.
1472    /// - [`Symbol`] if the input contains an invalid character. The [position] is the first invalid
1473    ///   character.
1474    /// - [`Trailing`] if the input has non-zero trailing bits. This is only possible if the
1475    ///   encoding checks trailing bits. The [position] is the first character containing non-zero
1476    ///   trailing bits.
1477    /// - [`Padding`] if the input has an invalid padding length. This is only possible if the
1478    ///   encoding uses padding. The [position] is the first padding character of the first padding
1479    ///   of invalid length.
1480    ///
1481    /// # Examples
1482    ///
1483    /// ```rust
1484    /// use data_encoding::BASE64;
1485    /// assert_eq!(BASE64.decode(b"SGVsbA==byB3b3JsZA==").unwrap(), b"Hello world");
1486    /// ```
1487    ///
1488    /// [`Length`]: enum.DecodeKind.html#variant.Length
1489    /// [`Symbol`]: enum.DecodeKind.html#variant.Symbol
1490    /// [`Trailing`]: enum.DecodeKind.html#variant.Trailing
1491    /// [`Padding`]: enum.DecodeKind.html#variant.Padding
1492    /// [position]: struct.DecodeError.html#structfield.position
1493    #[cfg(feature = "alloc")]
1494    pub fn decode(&self, input: &[u8]) -> Result<Vec<u8>, DecodeError> {
1495        let mut output = vec![0u8; self.decode_len(input.len())?];
1496        let len = self.decode_mut(input, &mut output).map_err(|partial| partial.error)?;
1497        output.truncate(len);
1498        Ok(output)
1499    }
1500
1501    /// Returns the bit-width
1502    #[must_use]
1503    pub fn bit_width(&self) -> usize {
1504        self.bit()
1505    }
1506
1507    /// Returns whether the encoding is canonical
1508    ///
1509    /// An encoding is not canonical if one of the following conditions holds:
1510    ///
1511    /// - trailing bits are not checked
1512    /// - padding is used
1513    /// - characters are ignored
1514    /// - characters are translated
1515    #[must_use]
1516    pub fn is_canonical(&self) -> bool {
1517        if !self.ctb() {
1518            return false;
1519        }
1520        let bit = self.bit();
1521        let sym = self.sym();
1522        let val = self.val();
1523        for i in 0 .. 256 {
1524            if val[i] == INVALID {
1525                continue;
1526            }
1527            if val[i] >= 1 << bit {
1528                return false;
1529            }
1530            if sym[val[i] as usize] as usize != i {
1531                return false;
1532            }
1533        }
1534        true
1535    }
1536
1537    /// Returns the encoding specification
1538    #[allow(clippy::missing_panics_doc)] // no panic
1539    #[cfg(feature = "alloc")]
1540    #[must_use]
1541    pub fn specification(&self) -> Specification {
1542        let mut specification = Specification::new();
1543        specification
1544            .symbols
1545            .push_str(core::str::from_utf8(&self.sym()[0 .. 1 << self.bit()]).unwrap());
1546        specification.bit_order =
1547            if self.msb() { MostSignificantFirst } else { LeastSignificantFirst };
1548        specification.check_trailing_bits = self.ctb();
1549        if let Some(pad) = self.pad() {
1550            specification.padding = Some(pad as char);
1551        }
1552        for i in 0 .. 128u8 {
1553            if self.val()[i as usize] != IGNORE {
1554                continue;
1555            }
1556            specification.ignore.push(i as char);
1557        }
1558        if let Some((col, end)) = self.wrap() {
1559            specification.wrap.width = col;
1560            specification.wrap.separator = core::str::from_utf8(end).unwrap().to_owned();
1561        }
1562        for i in 0 .. 128u8 {
1563            let canonical = if self.val()[i as usize] < 1 << self.bit() {
1564                self.sym()[self.val()[i as usize] as usize]
1565            } else if self.val()[i as usize] == PADDING {
1566                self.pad().unwrap()
1567            } else {
1568                continue;
1569            };
1570            if i == canonical {
1571                continue;
1572            }
1573            specification.translate.from.push(i as char);
1574            specification.translate.to.push(canonical as char);
1575        }
1576        specification
1577    }
1578
1579    #[doc(hidden)]
1580    #[must_use]
1581    pub const fn internal_new(implementation: &'static [u8]) -> Encoding {
1582        #[cfg(feature = "alloc")]
1583        let encoding = Encoding(Cow::Borrowed(implementation));
1584        #[cfg(not(feature = "alloc"))]
1585        let encoding = Encoding(implementation);
1586        encoding
1587    }
1588
1589    #[doc(hidden)]
1590    #[must_use]
1591    pub fn internal_implementation(&self) -> &[u8] {
1592        &self.0
1593    }
1594}
1595
1596/// Encodes fragmented input to an output
1597///
1598/// It is equivalent to use an [`Encoder`] with multiple calls to [`Encoder::append()`] than to
1599/// first concatenate all the input and then use [`Encoding::encode_append()`]. In particular, this
1600/// function will not introduce padding or wrapping between inputs.
1601///
1602/// # Examples
1603///
1604/// ```rust
1605/// // This is a bit inconvenient but we can't take a long-term reference to data_encoding::BASE64
1606/// // because it's a constant. We need to use a static which has an address instead. This will be
1607/// // fixed in version 3 of the library.
1608/// static BASE64: data_encoding::Encoding = data_encoding::BASE64;
1609/// let mut output = String::new();
1610/// let mut encoder = BASE64.new_encoder(&mut output);
1611/// encoder.append(b"hello");
1612/// encoder.append(b"world");
1613/// encoder.finalize();
1614/// assert_eq!(output, BASE64.encode(b"helloworld"));
1615/// ```
1616#[derive(Debug)]
1617#[cfg(feature = "alloc")]
1618pub struct Encoder<'a> {
1619    encoding: &'a Encoding,
1620    output: &'a mut String,
1621    buffer: [u8; 255],
1622    length: u8,
1623}
1624
1625#[cfg(feature = "alloc")]
1626impl<'a> Drop for Encoder<'a> {
1627    fn drop(&mut self) {
1628        self.encoding.encode_append(&self.buffer[.. self.length as usize], self.output);
1629    }
1630}
1631
1632#[cfg(feature = "alloc")]
1633impl<'a> Encoder<'a> {
1634    fn new(encoding: &'a Encoding, output: &'a mut String) -> Self {
1635        Encoder { encoding, output, buffer: [0; 255], length: 0 }
1636    }
1637
1638    /// Encodes the provided input fragment and appends the result to the output
1639    pub fn append(&mut self, mut input: &[u8]) {
1640        #[allow(clippy::cast_possible_truncation)] // no truncation
1641        let max = self.encoding.block_len().0 as u8;
1642        if self.length != 0 {
1643            let len = self.length;
1644            #[allow(clippy::cast_possible_truncation)] // no truncation
1645            let add = core::cmp::min((max - len) as usize, input.len()) as u8;
1646            self.buffer[len as usize ..][.. add as usize].copy_from_slice(&input[.. add as usize]);
1647            self.length += add;
1648            input = &input[add as usize ..];
1649            if self.length != max {
1650                debug_assert!(self.length < max);
1651                debug_assert!(input.is_empty());
1652                return;
1653            }
1654            self.encoding.encode_append(&self.buffer[.. max as usize], self.output);
1655            self.length = 0;
1656        }
1657        let len = floor(input.len(), max as usize);
1658        self.encoding.encode_append(&input[.. len], self.output);
1659        input = &input[len ..];
1660        #[allow(clippy::cast_possible_truncation)] // no truncation
1661        let len = input.len() as u8;
1662        self.buffer[.. len as usize].copy_from_slice(input);
1663        self.length = len;
1664    }
1665
1666    /// Makes sure all inputs have been encoded and appended to the output
1667    ///
1668    /// This is equivalent to dropping the encoder and required for correctness, otherwise some
1669    /// encoded data may be missing at the end.
1670    pub fn finalize(self) {}
1671}
1672
1673#[derive(Debug, Copy, Clone)]
1674#[cfg(feature = "alloc")]
1675enum SpecificationErrorImpl {
1676    BadSize,
1677    NotAscii,
1678    Duplicate(u8),
1679    ExtraPadding,
1680    WrapLength,
1681    WrapWidth(u8),
1682    FromTo,
1683    Undefined(u8),
1684}
1685#[cfg(feature = "alloc")]
1686use crate::SpecificationErrorImpl::*;
1687
1688/// Specification error
1689#[derive(Debug, Copy, Clone)]
1690#[cfg(feature = "alloc")]
1691pub struct SpecificationError(SpecificationErrorImpl);
1692
1693#[cfg(feature = "alloc")]
1694impl core::fmt::Display for SpecificationError {
1695    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1696        match self.0 {
1697            BadSize => write!(f, "invalid number of symbols"),
1698            NotAscii => write!(f, "non-ascii character"),
1699            Duplicate(c) => write!(f, "{:?} has conflicting definitions", c as char),
1700            ExtraPadding => write!(f, "unnecessary padding"),
1701            WrapLength => write!(f, "invalid wrap width or separator length"),
1702            WrapWidth(x) => write!(f, "wrap width not a multiple of {}", x),
1703            FromTo => write!(f, "translate from/to length mismatch"),
1704            Undefined(c) => write!(f, "{:?} is undefined", c as char),
1705        }
1706    }
1707}
1708
1709#[cfg(feature = "std")]
1710impl std::error::Error for SpecificationError {
1711    fn description(&self) -> &str {
1712        match self.0 {
1713            BadSize => "invalid number of symbols",
1714            NotAscii => "non-ascii character",
1715            Duplicate(_) => "conflicting definitions",
1716            ExtraPadding => "unnecessary padding",
1717            WrapLength => "invalid wrap width or separator length",
1718            WrapWidth(_) => "wrap width not a multiple",
1719            FromTo => "translate from/to length mismatch",
1720            Undefined(_) => "undefined character",
1721        }
1722    }
1723}
1724
1725#[cfg(feature = "alloc")]
1726impl Specification {
1727    /// Returns a default specification
1728    #[must_use]
1729    pub fn new() -> Specification {
1730        Specification {
1731            symbols: String::new(),
1732            bit_order: MostSignificantFirst,
1733            check_trailing_bits: true,
1734            padding: None,
1735            ignore: String::new(),
1736            wrap: Wrap { width: 0, separator: String::new() },
1737            translate: Translate { from: String::new(), to: String::new() },
1738        }
1739    }
1740
1741    /// Returns the specified encoding
1742    ///
1743    /// # Errors
1744    ///
1745    /// Returns an error if the specification is invalid.
1746    pub fn encoding(&self) -> Result<Encoding, SpecificationError> {
1747        let symbols = self.symbols.as_bytes();
1748        let bit: u8 = match symbols.len() {
1749            2 => 1,
1750            4 => 2,
1751            8 => 3,
1752            16 => 4,
1753            32 => 5,
1754            64 => 6,
1755            _ => return Err(SpecificationError(BadSize)),
1756        };
1757        let mut values = [INVALID; 128];
1758        let set = |v: &mut [u8; 128], i: u8, x: u8| {
1759            check!(SpecificationError(NotAscii), i < 128);
1760            if v[i as usize] == x {
1761                return Ok(());
1762            }
1763            check!(SpecificationError(Duplicate(i)), v[i as usize] == INVALID);
1764            v[i as usize] = x;
1765            Ok(())
1766        };
1767        for (v, symbols) in symbols.iter().enumerate() {
1768            #[allow(clippy::cast_possible_truncation)] // no truncation
1769            set(&mut values, *symbols, v as u8)?;
1770        }
1771        let msb = self.bit_order == MostSignificantFirst;
1772        let ctb = self.check_trailing_bits || 8 % bit == 0;
1773        let pad = match self.padding {
1774            None => None,
1775            Some(pad) => {
1776                check!(SpecificationError(ExtraPadding), 8 % bit != 0);
1777                check!(SpecificationError(NotAscii), pad.len_utf8() == 1);
1778                set(&mut values, pad as u8, PADDING)?;
1779                Some(pad as u8)
1780            }
1781        };
1782        for i in self.ignore.bytes() {
1783            set(&mut values, i, IGNORE)?;
1784        }
1785        let wrap = if self.wrap.separator.is_empty() || self.wrap.width == 0 {
1786            None
1787        } else {
1788            let col = self.wrap.width;
1789            let end = self.wrap.separator.as_bytes();
1790            check!(SpecificationError(WrapLength), col < 256 && end.len() < 256);
1791            #[allow(clippy::cast_possible_truncation)] // no truncation
1792            let col = col as u8;
1793            #[allow(clippy::cast_possible_truncation)] // no truncation
1794            let dec = dec(bit as usize) as u8;
1795            check!(SpecificationError(WrapWidth(dec)), col % dec == 0);
1796            for &i in end {
1797                set(&mut values, i, IGNORE)?;
1798            }
1799            Some((col, end))
1800        };
1801        let from = self.translate.from.as_bytes();
1802        let to = self.translate.to.as_bytes();
1803        check!(SpecificationError(FromTo), from.len() == to.len());
1804        for i in 0 .. from.len() {
1805            check!(SpecificationError(NotAscii), to[i] < 128);
1806            let v = values[to[i] as usize];
1807            check!(SpecificationError(Undefined(to[i])), v != INVALID);
1808            set(&mut values, from[i], v)?;
1809        }
1810        let mut encoding = Vec::new();
1811        for _ in 0 .. 256 / symbols.len() {
1812            encoding.extend_from_slice(symbols);
1813        }
1814        encoding.extend_from_slice(&values);
1815        encoding.extend_from_slice(&[INVALID; 128]);
1816        match pad {
1817            None => encoding.push(INVALID),
1818            Some(pad) => encoding.push(pad),
1819        }
1820        encoding.push(bit);
1821        if msb {
1822            encoding[513] |= 0x08;
1823        }
1824        if ctb {
1825            encoding[513] |= 0x10;
1826        }
1827        if let Some((col, end)) = wrap {
1828            encoding.push(col);
1829            encoding.extend_from_slice(end);
1830        } else if values.contains(&IGNORE) {
1831            encoding.push(0);
1832        }
1833        Ok(Encoding(Cow::Owned(encoding)))
1834    }
1835}
1836
1837/// Lowercase hexadecimal encoding
1838///
1839/// This encoding is a static version of:
1840///
1841/// ```rust
1842/// # use data_encoding::{Specification, HEXLOWER};
1843/// let mut spec = Specification::new();
1844/// spec.symbols.push_str("0123456789abcdef");
1845/// assert_eq!(HEXLOWER, spec.encoding().unwrap());
1846/// ```
1847///
1848/// # Examples
1849///
1850/// ```rust
1851/// use data_encoding::HEXLOWER;
1852/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1853/// assert_eq!(HEXLOWER.decode(b"deadbeef").unwrap(), deadbeef);
1854/// assert_eq!(HEXLOWER.encode(&deadbeef), "deadbeef");
1855/// ```
1856pub const HEXLOWER: Encoding = Encoding::internal_new(HEXLOWER_IMPL);
1857const HEXLOWER_IMPL: &[u8] = &[
1858    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1859    55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1860    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1861    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1862    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1863    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1864    56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1865    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1866    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1867    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1868    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1869    56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1870    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1871    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
1872    3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1873    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1874    128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1875    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1876    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1877    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1878    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1879    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1880    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1881    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1882    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1883];
1884
1885/// Lowercase hexadecimal encoding with case-insensitive decoding
1886///
1887/// This encoding is a static version of:
1888///
1889/// ```rust
1890/// # use data_encoding::{Specification, HEXLOWER_PERMISSIVE};
1891/// let mut spec = Specification::new();
1892/// spec.symbols.push_str("0123456789abcdef");
1893/// spec.translate.from.push_str("ABCDEF");
1894/// spec.translate.to.push_str("abcdef");
1895/// assert_eq!(HEXLOWER_PERMISSIVE, spec.encoding().unwrap());
1896/// ```
1897///
1898/// # Examples
1899///
1900/// ```rust
1901/// use data_encoding::HEXLOWER_PERMISSIVE;
1902/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1903/// assert_eq!(HEXLOWER_PERMISSIVE.decode(b"DeadBeef").unwrap(), deadbeef);
1904/// assert_eq!(HEXLOWER_PERMISSIVE.encode(&deadbeef), "deadbeef");
1905/// ```
1906///
1907/// You can also define a shorter name:
1908///
1909/// ```rust
1910/// use data_encoding::{Encoding, HEXLOWER_PERMISSIVE};
1911/// const HEX: Encoding = HEXLOWER_PERMISSIVE;
1912/// ```
1913pub const HEXLOWER_PERMISSIVE: Encoding = Encoding::internal_new(HEXLOWER_PERMISSIVE_IMPL);
1914const HEXLOWER_PERMISSIVE_IMPL: &[u8] = &[
1915    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1916    55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1917    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1918    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1919    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1920    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1921    56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1922    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1923    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1924    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1925    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1926    56, 57, 97, 98, 99, 100, 101, 102, 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, 128, 128,
1928    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
1929    3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128,
1930    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1931    128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 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, 128, 128, 128, 128, 128, 128, 128,
1939    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1940];
1941
1942/// Uppercase hexadecimal encoding
1943///
1944/// This encoding is a static version of:
1945///
1946/// ```rust
1947/// # use data_encoding::{Specification, HEXUPPER};
1948/// let mut spec = Specification::new();
1949/// spec.symbols.push_str("0123456789ABCDEF");
1950/// assert_eq!(HEXUPPER, spec.encoding().unwrap());
1951/// ```
1952///
1953/// It is compliant with [RFC4648] and known as "base16" or "hex".
1954///
1955/// # Examples
1956///
1957/// ```rust
1958/// use data_encoding::HEXUPPER;
1959/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1960/// assert_eq!(HEXUPPER.decode(b"DEADBEEF").unwrap(), deadbeef);
1961/// assert_eq!(HEXUPPER.encode(&deadbeef), "DEADBEEF");
1962/// ```
1963///
1964/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-8
1965pub const HEXUPPER: Encoding = Encoding::internal_new(HEXUPPER_IMPL);
1966const HEXUPPER_IMPL: &[u8] = &[
1967    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
1968    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
1969    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
1970    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
1971    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
1972    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
1973    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
1974    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
1975    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
1976    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
1977    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
1978    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1979    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1980    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
1981    12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1982    128, 128, 128, 128, 128, 128, 128, 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, 128, 128,
1985    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 128, 128, 128, 128, 128, 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, 28,
1991];
1992
1993/// Uppercase hexadecimal encoding with case-insensitive decoding
1994///
1995/// This encoding is a static version of:
1996///
1997/// ```rust
1998/// # use data_encoding::{Specification, HEXUPPER_PERMISSIVE};
1999/// let mut spec = Specification::new();
2000/// spec.symbols.push_str("0123456789ABCDEF");
2001/// spec.translate.from.push_str("abcdef");
2002/// spec.translate.to.push_str("ABCDEF");
2003/// assert_eq!(HEXUPPER_PERMISSIVE, spec.encoding().unwrap());
2004/// ```
2005///
2006/// # Examples
2007///
2008/// ```rust
2009/// use data_encoding::HEXUPPER_PERMISSIVE;
2010/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
2011/// assert_eq!(HEXUPPER_PERMISSIVE.decode(b"DeadBeef").unwrap(), deadbeef);
2012/// assert_eq!(HEXUPPER_PERMISSIVE.encode(&deadbeef), "DEADBEEF");
2013/// ```
2014pub const HEXUPPER_PERMISSIVE: Encoding = Encoding::internal_new(HEXUPPER_PERMISSIVE_IMPL);
2015const HEXUPPER_PERMISSIVE_IMPL: &[u8] = &[
2016    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2017    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2018    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2019    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2020    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2021    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2022    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2023    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2024    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2025    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2026    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2027    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2028    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2029    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2030    12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2031    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128,
2032    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2033    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2037    128, 128, 128, 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, 28,
2040];
2041
2042/// Padded base32 encoding
2043///
2044/// This encoding is a static version of:
2045///
2046/// ```rust
2047/// # use data_encoding::{Specification, BASE32};
2048/// let mut spec = Specification::new();
2049/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2050/// spec.padding = Some('=');
2051/// assert_eq!(BASE32, spec.encoding().unwrap());
2052/// ```
2053///
2054/// It conforms to [RFC4648].
2055///
2056/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-6
2057pub const BASE32: Encoding = Encoding::internal_new(BASE32_IMPL);
2058const BASE32_IMPL: &[u8] = &[
2059    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2060    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2061    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2062    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2063    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2064    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2065    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2066    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2067    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2068    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2069    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2070    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2071    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2072    128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 130, 128, 128,
2073    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,
2074    25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2075    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2076    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2077    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2078    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2079    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2080    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2081    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2082    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2083];
2084
2085/// Unpadded base32 encoding
2086///
2087/// This encoding is a static version of:
2088///
2089/// ```rust
2090/// # use data_encoding::{Specification, BASE32_NOPAD};
2091/// let mut spec = Specification::new();
2092/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2093/// assert_eq!(BASE32_NOPAD, spec.encoding().unwrap());
2094/// ```
2095pub const BASE32_NOPAD: Encoding = Encoding::internal_new(BASE32_NOPAD_IMPL);
2096const BASE32_NOPAD_IMPL: &[u8] = &[
2097    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2098    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2099    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2100    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2101    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2102    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2103    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2104    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2105    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2106    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2107    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2108    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2109    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2110    128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2111    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,
2112    25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2113    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2114    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2115    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2116    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2117    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2118    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2119    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2120    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2121];
2122
2123/// Padded base32hex encoding
2124///
2125/// This encoding is a static version of:
2126///
2127/// ```rust
2128/// # use data_encoding::{Specification, BASE32HEX};
2129/// let mut spec = Specification::new();
2130/// spec.symbols.push_str("0123456789ABCDEFGHIJKLMNOPQRSTUV");
2131/// spec.padding = Some('=');
2132/// assert_eq!(BASE32HEX, spec.encoding().unwrap());
2133/// ```
2134///
2135/// It conforms to [RFC4648].
2136///
2137/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-7
2138pub const BASE32HEX: Encoding = Encoding::internal_new(BASE32HEX_IMPL);
2139const BASE32HEX_IMPL: &[u8] = &[
2140    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2141    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2142    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2143    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2144    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2145    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2146    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2147    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2148    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2149    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2150    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2151    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2152    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2153    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 130, 128, 128, 128, 10, 11,
2154    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2155    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2156    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2157    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2158    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2159    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2160    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2161    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2162    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2163    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2164];
2165
2166/// Unpadded base32hex encoding
2167///
2168/// This encoding is a static version of:
2169///
2170/// ```rust
2171/// # use data_encoding::{Specification, BASE32HEX_NOPAD};
2172/// let mut spec = Specification::new();
2173/// spec.symbols.push_str("0123456789ABCDEFGHIJKLMNOPQRSTUV");
2174/// assert_eq!(BASE32HEX_NOPAD, spec.encoding().unwrap());
2175/// ```
2176pub const BASE32HEX_NOPAD: Encoding = Encoding::internal_new(BASE32HEX_NOPAD_IMPL);
2177const BASE32HEX_NOPAD_IMPL: &[u8] = &[
2178    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2179    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2180    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2181    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2182    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2183    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2184    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2185    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2186    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2187    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2188    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2189    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2190    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2191    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2192    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2193    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2194    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2195    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2196    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2197    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2198    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2199    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2200    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2201    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2202];
2203
2204/// DNSSEC base32 encoding
2205///
2206/// This encoding is a static version of:
2207///
2208/// ```rust
2209/// # use data_encoding::{Specification, BASE32_DNSSEC};
2210/// let mut spec = Specification::new();
2211/// spec.symbols.push_str("0123456789abcdefghijklmnopqrstuv");
2212/// spec.translate.from.push_str("ABCDEFGHIJKLMNOPQRSTUV");
2213/// spec.translate.to.push_str("abcdefghijklmnopqrstuv");
2214/// assert_eq!(BASE32_DNSSEC, spec.encoding().unwrap());
2215/// ```
2216///
2217/// It conforms to [RFC5155]:
2218///
2219/// - It uses a base32 extended hex alphabet.
2220/// - It is case-insensitive when decoding and uses lowercase when encoding.
2221/// - It does not use padding.
2222///
2223/// [RFC5155]: https://tools.ietf.org/html/rfc5155
2224pub const BASE32_DNSSEC: Encoding = Encoding::internal_new(BASE32_DNSSEC_IMPL);
2225const BASE32_DNSSEC_IMPL: &[u8] = &[
2226    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
2227    108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2228    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2229    116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104,
2230    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53,
2231    54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
2232    113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101,
2233    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49,
2234    50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
2235    110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98,
2236    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2237    118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
2238    107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 128, 128, 128, 128, 128, 128, 128,
2239    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2240    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2241    128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13,
2242    14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128,
2243    128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2244    26, 27, 28, 29, 30, 31, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2247    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2248    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 29,
2252];
2253
2254#[allow(clippy::doc_markdown)]
2255/// DNSCurve base32 encoding
2256///
2257/// This encoding is a static version of:
2258///
2259/// ```rust
2260/// # use data_encoding::{BitOrder, Specification, BASE32_DNSCURVE};
2261/// let mut spec = Specification::new();
2262/// spec.symbols.push_str("0123456789bcdfghjklmnpqrstuvwxyz");
2263/// spec.bit_order = BitOrder::LeastSignificantFirst;
2264/// spec.translate.from.push_str("BCDFGHJKLMNPQRSTUVWXYZ");
2265/// spec.translate.to.push_str("bcdfghjklmnpqrstuvwxyz");
2266/// assert_eq!(BASE32_DNSCURVE, spec.encoding().unwrap());
2267/// ```
2268///
2269/// It conforms to [DNSCurve].
2270///
2271/// [DNSCurve]: https://dnscurve.org/in-implement.html
2272pub const BASE32_DNSCURVE: Encoding = Encoding::internal_new(BASE32_DNSCURVE_IMPL);
2273const BASE32_DNSCURVE_IMPL: &[u8] = &[
2274    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110,
2275    112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2276    98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119,
2277    120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107,
2278    108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53,
2279    54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116,
2280    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103,
2281    104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49,
2282    50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113,
2283    114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99,
2284    100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
2285    122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109,
2286    110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 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, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2290    12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
2291    128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128,
2292    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 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, 21,
2300];
2301
2302/// Padded base64 encoding
2303///
2304/// This encoding is a static version of:
2305///
2306/// ```rust
2307/// # use data_encoding::{Specification, BASE64};
2308/// let mut spec = Specification::new();
2309/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2310/// spec.padding = Some('=');
2311/// assert_eq!(BASE64, spec.encoding().unwrap());
2312/// ```
2313///
2314/// It conforms to [RFC4648].
2315///
2316/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-4
2317pub const BASE64: Encoding = Encoding::internal_new(BASE64_IMPL);
2318const BASE64_IMPL: &[u8] = &[
2319    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2320    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2321    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2322    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2323    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2324    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2325    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2326    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2327    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2328    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2329    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2330    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 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, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2334    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,
2335    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2336    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 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, 128, 128, 128, 128,
2338    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2339    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2340    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2341    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2342    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2343    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2344];
2345
2346/// Unpadded base64 encoding
2347///
2348/// This encoding is a static version of:
2349///
2350/// ```rust
2351/// # use data_encoding::{Specification, BASE64_NOPAD};
2352/// let mut spec = Specification::new();
2353/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2354/// assert_eq!(BASE64_NOPAD, spec.encoding().unwrap());
2355/// ```
2356pub const BASE64_NOPAD: Encoding = Encoding::internal_new(BASE64_NOPAD_IMPL);
2357const BASE64_NOPAD_IMPL: &[u8] = &[
2358    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2359    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2360    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2361    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2362    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2363    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2364    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2365    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2366    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2367    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2368    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2369    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2370    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2371    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2372    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2373    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,
2374    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2375    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2378    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2379    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2380    128, 128, 128, 128, 128, 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, 30,
2383];
2384
2385/// MIME base64 encoding
2386///
2387/// This encoding is a static version of:
2388///
2389/// ```rust
2390/// # use data_encoding::{Specification, BASE64_MIME};
2391/// let mut spec = Specification::new();
2392/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2393/// spec.padding = Some('=');
2394/// spec.wrap.width = 76;
2395/// spec.wrap.separator.push_str("\r\n");
2396/// assert_eq!(BASE64_MIME, spec.encoding().unwrap());
2397/// ```
2398///
2399/// It does not exactly conform to [RFC2045] because it does not print the header
2400/// and does not ignore all characters.
2401///
2402/// [RFC2045]: https://tools.ietf.org/html/rfc2045
2403pub const BASE64_MIME: Encoding = Encoding::internal_new(BASE64_MIME_IMPL);
2404const BASE64_MIME_IMPL: &[u8] = &[
2405    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2406    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2407    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2408    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2409    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2410    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2411    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2412    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2413    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2414    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2415    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2416    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2417    128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2418    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2419    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2420    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,
2421    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2422    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2426    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2427    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2428    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2429    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30, 76, 13, 10,
2430];
2431
2432/// MIME base64 encoding without trailing bits check
2433///
2434/// This encoding is a static version of:
2435///
2436/// ```rust
2437/// # use data_encoding::{Specification, BASE64_MIME_PERMISSIVE};
2438/// let mut spec = Specification::new();
2439/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2440/// spec.padding = Some('=');
2441/// spec.wrap.width = 76;
2442/// spec.wrap.separator.push_str("\r\n");
2443/// spec.check_trailing_bits = false;
2444/// assert_eq!(BASE64_MIME_PERMISSIVE, spec.encoding().unwrap());
2445/// ```
2446///
2447/// It does not exactly conform to [RFC2045] because it does not print the header
2448/// and does not ignore all characters.
2449///
2450/// [RFC2045]: https://tools.ietf.org/html/rfc2045
2451pub const BASE64_MIME_PERMISSIVE: Encoding = Encoding::internal_new(BASE64_MIME_PERMISSIVE_IMPL);
2452const BASE64_MIME_PERMISSIVE_IMPL: &[u8] = &[
2453    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2454    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2455    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2456    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2457    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2458    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2459    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2460    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2461    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2462    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2463    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2464    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2465    128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2466    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2467    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2468    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,
2469    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2470    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2471    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2472    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 61, 14, 76, 13, 10,
2478];
2479
2480/// Padded base64url encoding
2481///
2482/// This encoding is a static version of:
2483///
2484/// ```rust
2485/// # use data_encoding::{Specification, BASE64URL};
2486/// let mut spec = Specification::new();
2487/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
2488/// spec.padding = Some('=');
2489/// assert_eq!(BASE64URL, spec.encoding().unwrap());
2490/// ```
2491///
2492/// It conforms to [RFC4648].
2493///
2494/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-5
2495pub const BASE64URL: Encoding = Encoding::internal_new(BASE64URL_IMPL);
2496const BASE64URL_IMPL: &[u8] = &[
2497    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2498    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2499    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2500    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2501    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2502    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2503    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2504    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2505    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2506    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2507    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2508    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2509    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2510    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2511    128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2512    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,
2513    24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2514    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 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, 128, 128, 128, 128, 128, 128, 128, 128,
2519    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2520    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2521    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2522];
2523
2524/// Unpadded base64url encoding
2525///
2526/// This encoding is a static version of:
2527///
2528/// ```rust
2529/// # use data_encoding::{Specification, BASE64URL_NOPAD};
2530/// let mut spec = Specification::new();
2531/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
2532/// assert_eq!(BASE64URL_NOPAD, spec.encoding().unwrap());
2533/// ```
2534pub const BASE64URL_NOPAD: Encoding = Encoding::internal_new(BASE64URL_NOPAD_IMPL);
2535const BASE64URL_NOPAD_IMPL: &[u8] = &[
2536    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2537    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2538    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2539    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2540    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2541    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2542    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2543    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2544    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2545    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2546    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2547    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2548    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2549    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2550    128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2551    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,
2552    24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2553    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2556    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2557    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2558    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 30,
2561];