// Copyright 2022 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

pub status "#bad Huffman code (over-subscribed)"
pub status "#bad Huffman code (under-subscribed)"
pub status "#bad block header"
pub status "#bad block length"
pub status "#bad checksum"
pub status "#bad header"
pub status "#bad number of sections"
pub status "#truncated input"
pub status "#unsupported block randomization"

pri status "#internal error: inconsistent Huffman decoder state"

pub const DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE : base.u64 = 0

pri const CLAMP_TO_5 : roarray[8] base.u8[..= 5] = [0, 1, 2, 3, 4, 5, 5, 5]

pub struct decoder? implements base.io_transformer(
        bits   : base.u32,
        n_bits : base.u32[..= 31],

        // Block size is measured prior to the RLE1 step.
        max_incl_block_size : base.u32[..= 900000],

        block_size               : base.u32[..= 900000],
        decode_huffman_finished  : base.bool,
        decode_huffman_which     : base.u8[..= 5],
        decode_huffman_ticks     : base.u32[..= 50],
        decode_huffman_section   : base.u32,
        decode_huffman_run_shift : base.u32[..= 23],

        flush_pointer      : base.u32[..= 1_048575],
        flush_repeat_count : base.u32[..= 255],
        flush_prev         : base.u8,

        ignore_checksum      : base.bool,
        final_checksum_have  : base.u32,
        block_checksum_have  : base.u32,
        block_checksum_want  : base.u32,
        original_pointer     : base.u32,
        num_symbols          : base.u32[..= 258],
        num_huffman_codes    : base.u32[..= 6],
        num_sections         : base.u32[..= 18001],
        code_lengths_bitmask : base.u32,

        util : base.utility,
) + (
        scratch : base.u32,

        letter_counts : array[256] base.u32,

        // presence[i] being non-zero is whether the byte value i occurs in the
        // block's decompressed output.
        presence : array[256] base.u8,

        // mtft is the Move To Front Transform state.
        mtft : array[256] base.u8,

        // huffman_selectors selects which of the huffman_trees to use for each
        // 50-symbol section.
        huffman_selectors : array[32768] base.u8,

        // Each array[2] base.u16 is a branch node in the Huffman tree. The
        // build_huffman_tree method comment details what the base.u16 values mean.
        //
        // Each Huffman tree has num_symbols leaf nodes and hence (num_symbols - 1)
        // branch nodes, also called internal nodes, as per
        // https://stackoverflow.com/questions/69399994/maximum-number-of-nodes-in-a-huffman-tree/69401083#69401083
        //
        // This can be proven inductively. The base case Huffman code (two symbols)
        // has one branch node (the root node). The inductive case, adding one
        // symbol to a (complete but possibly non-canonical) Huffman code replaces
        // one leaf node with one branch node (and two leaf nodes). The net gain in
        // branch nodes is +1.
        //
        // Since num_symbols' inclusive maximum is 258 (for RUNA, RUNB, 255 × mXYZ,
        // EOB), there are at most 257 branch nodes.
        huffman_trees : array[6] array[257] array[2] base.u16,

        // huffman_tables[which] caches the result of walking huffman_trees[which]
        // for each possible 8-bit input. The base.u16 value decomposes as:
        //  - The low 10 bits are the final node, where finality comes either from
        //    hitting a leaf node or from spending all 8 bits of the input. As per
        //    the build_huffman_tree method, a value of 0x100 = 256 or less means
        //    a branch node and 0x201 = 513 or more means a leaf node.
        //  - The middle 2 bits are unused.
        //  - The high 4 bits are the number of input bits spent.
        huffman_tables : array[6] array[256] base.u16,

        // bwt is the Burrows Wheeler Transform state. Per the README.md file, each
        // entry is a row with the low 8 bits holding the L column and the high 20
        // bits holding the U column. The middle 4 bits are unused.
        //
        // The read_code_lengths and build_huffman_tree methods also re-purpose
        // this buffer to temporarily hold up to 258 symbols' code lengths.
        bwt : array[1_048576] base.u32,
)

pub func decoder.set_quirk!(key: base.u32, value: base.u64) base.status {
    if args.key == base.QUIRK_IGNORE_CHECKSUM {
        this.ignore_checksum = args.value > 0
        return ok
    }
    return base."#unsupported option"
}

pub func decoder.workbuf_len() base.range_ii_u64 {
    return this.util.make_range_ii_u64(
            min_incl: DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE,
            max_incl: DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE)
}

pub func decoder.transform_io?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
    var status : base.status

    while true {
        status =? this.do_transform_io?(dst: args.dst, src: args.src, workbuf: args.workbuf)
        if (status == base."$short read") and args.src.is_closed() {
            return "#truncated input"
        }
        yield? status
    } endwhile
}

pri func decoder.do_transform_io?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
    var c                   : base.u8
    var i                   : base.u32
    var tag                 : base.u64
    var status              : base.status
    var final_checksum_want : base.u32

    // Read the header.
    c = args.src.read_u8?()
    if c <> 0x42 {
        return "#bad header"
    }
    c = args.src.read_u8?()
    if c <> 0x5A {
        return "#bad header"
    }
    c = args.src.read_u8?()
    if c <> 0x68 {
        return "#bad header"
    }
    c = args.src.read_u8?()
    if (c < '1') or ('9' < c) {
        return "#bad header"
    }
    this.max_incl_block_size = ((c - '0') as base.u32) * 100000

    while true {
        // Read the 48-bit tag.
        tag = 0
        i = 0
        while i < 48 {
            if this.n_bits <= 0 {
                c = args.src.read_u8?()
                this.bits = (c as base.u32) << 24
                this.n_bits = 8
                assert this.n_bits > 0
            }
            tag ~mod<<= 1
            tag |= (this.bits >> 31) as base.u64
            this.bits ~mod<<= 1
            this.n_bits -= 1
            i += 1
        } endwhile

        if tag == 0x1772_4538_5090 {
            break
        } else if tag <> 0x3141_5926_5359 {
            return "#bad block header"
        }

        this.prepare_block?(src: args.src)

        this.block_size = 0
        this.decode_huffman_finished = false
        this.decode_huffman_which = CLAMP_TO_5[this.huffman_selectors[0] & 7]
        this.decode_huffman_ticks = 50
        this.decode_huffman_section = 0
        this.decode_huffman_run_shift = 0
        while not this.decode_huffman_finished {
            status = this.decode_huffman_fast!(src: args.src)
            if status.is_error() {
                return status
            } else if this.decode_huffman_finished {
                break
            }
            this.decode_huffman_slow?(src: args.src)
        } endwhile

        this.invert_bwt!()

        this.block_checksum_have = 0xFFFF_FFFF
        if this.original_pointer >= this.block_size {
            return "#bad block length"
        }
        assert this.original_pointer < 900000 via "a < b: a < c; c <= b"(c: this.block_size)
        this.flush_pointer = this.bwt[this.original_pointer] >> 12
        this.flush_repeat_count = 0
        this.flush_prev = 0

        while this.block_size > 0 {
            this.flush_fast!(dst: args.dst)
            if this.block_size <= 0 {
                break
            }
            this.flush_slow?(dst: args.dst)
        } endwhile

        this.block_checksum_have ^= 0xFFFF_FFFF
        if (not this.ignore_checksum) and (this.block_checksum_have <> this.block_checksum_want) {
            return "#bad checksum"
        }
        this.final_checksum_have = this.block_checksum_have ^ (
                (this.final_checksum_have >> 31) |
                (this.final_checksum_have ~mod<< 1))
    } endwhile

    // Read the 32-bit final checksum.
    final_checksum_want = 0
    i = 0
    while i < 32 {
        if this.n_bits <= 0 {
            c = args.src.read_u8?()
            this.bits = (c as base.u32) << 24
            this.n_bits = 8
            assert this.n_bits > 0
        }
        final_checksum_want ~mod<<= 1
        final_checksum_want |= this.bits >> 31
        this.bits ~mod<<= 1
        this.n_bits -= 1
        i += 1
    } endwhile
    if (not this.ignore_checksum) and (this.final_checksum_have <> final_checksum_want) {
        return "#bad checksum"
    }
}

pri func decoder.prepare_block?(src: base.io_reader) {
    var c        : base.u8
    var i        : base.u32
    var j        : base.u32
    var selector : base.u32
    var sel_ff   : base.u32
    var movee    : base.u8
    var status   : base.status

    // Read the 32-bit block checksum.
    this.block_checksum_want = 0
    i = 0
    while i < 32 {
        if this.n_bits <= 0 {
            c = args.src.read_u8?()
            this.bits = (c as base.u32) << 24
            this.n_bits = 8
            assert this.n_bits > 0
        }
        this.block_checksum_want ~mod<<= 1
        this.block_checksum_want |= this.bits >> 31
        this.bits ~mod<<= 1
        this.n_bits -= 1
        i += 1
    } endwhile

    // Read the "block randomized" bit.
    if this.n_bits <= 0 {
        c = args.src.read_u8?()
        this.bits = (c as base.u32) << 24
        this.n_bits = 8
        assert this.n_bits > 0
    }
    if (this.bits >> 31) <> 0 {
        return "#unsupported block randomization"
    }
    this.bits ~mod<<= 1
    this.n_bits -= 1

    // Read the 24-bit original pointer. The BWT technical report calls this I.
    this.original_pointer = 0
    i = 0
    while i < 24 {
        if this.n_bits <= 0 {
            c = args.src.read_u8?()
            this.bits = (c as base.u32) << 24
            this.n_bits = 8
            assert this.n_bits > 0
        }
        this.original_pointer ~mod<<= 1
        this.original_pointer |= this.bits >> 31
        this.bits ~mod<<= 1
        this.n_bits -= 1
        i += 1
    } endwhile

    // Reset the presence bitmap.
    i = 0
    while i < 256 {
        this.presence[i] = 0
        i += 1
    } endwhile

    // Read the 16-bit high-level presence bitmap.
    i = 0
    while i < 256 {
        if this.n_bits <= 0 {
            c = args.src.read_u8?()
            this.bits = (c as base.u32) << 24
            this.n_bits = 8
            assert this.n_bits > 0
        }
        if (this.bits >> 31) <> 0 {
            this.presence[i] = 1
        }
        this.bits ~mod<<= 1
        this.n_bits -= 1
        i += 16
    } endwhile

    // Read the 16-bit low-level presence bitmaps.
    this.scratch = 0
    i = 0
    while i < 256 {
        if this.presence[i] == 0 {
            i += 16
            continue
        }
        while true {
            if this.n_bits <= 0 {
                c = args.src.read_u8?()
                this.bits = (c as base.u32) << 24
                this.n_bits = 8
                assert this.n_bits > 0
            }
            this.scratch ~mod+= this.bits >> 31
            this.presence[i & 0xFF] = (this.bits >> 31) as base.u8
            this.bits ~mod<<= 1
            this.n_bits -= 1
            i ~mod+= 1
            if (i & 15) == 0 {
                break
            }
        } endwhile
    } endwhile
    if (this.scratch < 1) or (256 < this.scratch) {
        return "#bad block header"
    }
    this.num_symbols = this.scratch + 2

    // Read the 3-bit number of Huffman codes.
    this.scratch = 0
    i = 0
    while i < 3 {
        if this.n_bits <= 0 {
            c = args.src.read_u8?()
            this.bits = (c as base.u32) << 24
            this.n_bits = 8
            assert this.n_bits > 0
        }
        this.scratch ~mod<<= 1
        this.scratch |= this.bits >> 31
        this.bits ~mod<<= 1
        this.n_bits -= 1
        i += 1
    } endwhile
    if (this.scratch < 2) or (6 < this.scratch) {
        return "#bad block header"
    }
    this.num_huffman_codes = this.scratch

    // Read the 15-bit number of sections.
    this.scratch = 0
    i = 0
    while i < 15 {
        if this.n_bits <= 0 {
            c = args.src.read_u8?()
            this.bits = (c as base.u32) << 24
            this.n_bits = 8
            assert this.n_bits > 0
        }
        this.scratch ~mod<<= 1
        this.scratch |= this.bits >> 31
        this.bits ~mod<<= 1
        this.n_bits -= 1
        i += 1
    } endwhile
    if (this.scratch < 1) or (18001 < this.scratch) {
        return "#bad block header"
    }
    this.num_sections = this.scratch

    // Initialize the MTFT state.
    i = 0
    while i < this.num_huffman_codes {
        assert i < 6 via "a < b: a < c; c <= b"(c: this.num_huffman_codes)
        this.mtft[i] = i as base.u8
        i += 1
    } endwhile

    // Read each section's Huffman code selector, applying the MTFT.
    i = 0
    while i < this.num_sections {
        assert i < 18001 via "a < b: a < c; c <= b"(c: this.num_sections)
        selector = 0

        // Read a unary encoded natural number.
        while true,
                inv i < 18001,
        {
            if this.n_bits <= 0 {
                c = args.src.read_u8?()
                this.bits = (c as base.u32) << 24
                this.n_bits = 8
                assert this.n_bits > 0
            }
            if (this.bits >> 31) == 0 {
                this.bits ~mod<<= 1
                this.n_bits -= 1
                break
            }
            this.bits ~mod<<= 1
            this.n_bits -= 1
            selector ~mod+= 1
            if selector >= this.num_huffman_codes {
                return "#bad block header"
            }
        } endwhile

        // Move to front.
        if selector == 0 {
            this.huffman_selectors[i] = this.mtft[0]
        } else {
            sel_ff = selector & 0xFF
            movee = this.mtft[sel_ff]
            this.mtft[1 .. 1 + sel_ff].copy_from_slice!(
                    s: this.mtft[.. sel_ff])
            this.mtft[0] = movee
            this.huffman_selectors[i] = movee
        }

        i += 1
    } endwhile

    // Read the Huffman codes.
    i = 0
    while i < this.num_huffman_codes {
        assert i < 6 via "a < b: a < c; c <= b"(c: this.num_huffman_codes)
        this.read_code_lengths?(src: args.src)
        status = this.build_huffman_tree!(which: i)
        if status.is_error() {
            return status
        }
        this.build_huffman_table!(which: i)
        i += 1
    } endwhile

    // Initialize the MTFT state.
    i = 0
    j = 0
    while i < 256 {
        if this.presence[i] <> 0 {
            this.mtft[j & 0xFF] = i as base.u8
            j ~mod+= 1
        }
        i += 1
    } endwhile

    // Initialize the letter counts.
    i = 0
    while i < 256 {
        this.letter_counts[i] = 0
        i += 1
    } endwhile
}

pri func decoder.read_code_lengths?(src: base.io_reader) {
    var c           : base.u8
    var i           : base.u32
    var code_length : base.u32

    this.code_lengths_bitmask = 0

    // Read the 5-bit starting value.
    i = 0
    while i < 5 {
        if this.n_bits <= 0 {
            c = args.src.read_u8?()
            this.bits = (c as base.u32) << 24
            this.n_bits = 8
            assert this.n_bits > 0
        }
        code_length ~mod<<= 1
        code_length |= this.bits >> 31
        this.bits ~mod<<= 1
        this.n_bits -= 1
        i += 1
    } endwhile

    // Read the code lengths.
    i = 0
    while i < this.num_symbols {
        assert i < 258 via "a < b: a < c; c <= b"(c: this.num_symbols)
        while true,
                inv i < 258,
        {
            if (code_length < 1) or (20 < code_length) {
                return "#bad block header"
            }

            if this.n_bits <= 0 {
                c = args.src.read_u8?()
                this.bits = (c as base.u32) << 24
                this.n_bits = 8
                assert this.n_bits > 0
            }
            if (this.bits >> 31) == 0 {
                this.bits ~mod<<= 1
                this.n_bits -= 1
                break
            }
            this.bits ~mod<<= 1
            this.n_bits -= 1

            if this.n_bits <= 0 {
                c = args.src.read_u8?()
                this.bits = (c as base.u32) << 24
                this.n_bits = 8
                assert this.n_bits > 0
            }
            if (this.bits >> 31) == 0 {
                code_length ~mod+= 1
            } else {
                code_length ~mod-= 1
            }
            this.bits ~mod<<= 1
            this.n_bits -= 1
        } endwhile

        this.code_lengths_bitmask |= (1 as base.u32) << (code_length & 31)
        this.bwt[i] = code_length
        i += 1
    } endwhile
}

// build_huffman_tree builds a canonical Huffman tree given the symbols' code
// lengths. For the "abraca.txt.bz2" example, the code lengths are:
//  - symbol=0x301 (RUNA)  cl=3
//  - symbol=0x302 (RUNB)  cl=3
//  - symbol=0x201 (m01)   cl=2
//  - symbol=0x202 (m02)   cl=3
//  - symbol=0x203 (m03)   cl=2
//  - symbol=0x300 (EOB)   cl=3
//
// The bitstring mapping is:
//  - "00"   0x201 (m01)
//  - "01"   0x203 (m03)
//  - "100"  0x301 (RUNA)
//  - "101"  0x302 (RUNB)
//  - "110"  0x202 (m02)
//  - "111"  0x300 (EOB)
//
// The Huffman tree has 5 branch nodes (where 5+1 is both the number of leaf
// nodes and the number of symbols). Each branch node has two children,
// represented by a base.u16 value. 0x100 = 256 or less means that the child is
// a branch node. 0x201 ..= 0x2FF means an mNN leaf node. 0x300, 0x301 and
// 0x302 mean EOB, RUNA and RUNB leaf nodes.
//  - node0 = [0x001 (node1), 0x002 (node2)]
//  - node1 = [0x201 (m01)  , 0x203 (m03)  ]
//  - node2 = [0x003 (node3), 0x004 (node4)]
//  - node3 = [0x301 (RUNA) , 0x302 (RUNB) ]
//  - node4 = [0x202 (m02)  , 0x300 (EOB)  ]
//
// For example, the tree walk from node0 right (1) to node2 left (0) to node3
// left (0) to RUNA means that the RUNA bitstring is "100".
//
// The tree is built incrementally by considering symbols in increasing code
// length order, maintaining a stack of nodes that's the path from the root
// (node0) to the latest created-but-unfinished node. Created means that their
// left child is assigned (non-zero). Unfinished means that their right child
// is pending (zero). For example, after adding the 0x201, 0x203 and 0x301
// symbols, we would have this (in-progress) tree:
//  - node0 = [0x001 (node1), 0x002 (node2)]
//  - node1 = [0x201 (m01)  , 0x203 (m03)  ]
//  - node2 = [0x003 (node3), 0            ]
//  - node3 = [0x301 (RUNA) , 0            ]
//
// The stack would be [node0, node2, node3]. The next symbol would fill in the
// top of the stack, node3. If that symbol's code length matches the stack
// height (here, 3) then it would pop the stack. Otherwise it would push new
// nodes onto the stack until the stack height matched that code length.
pri func decoder.build_huffman_tree!(which: base.u32[..= 5]) base.status {
    var code_length      : base.u32
    var symbol_index     : base.u32
    var num_branch_nodes : base.u32[..= 257]
    var stack_height     : base.u32[..= 21]
    var stack_values     : array[21] base.u32[..= 256]
    var node_index       : base.u32[..= 256]
    var leaf_value       : base.u16

    // Push a root node.
    this.huffman_trees[args.which][0][0] = 0
    this.huffman_trees[args.which][0][1] = 0
    num_branch_nodes = 1
    stack_height = 1
    stack_values[0] = 0

    code_length = 1
    while code_length <= 20 {
        if (this.code_lengths_bitmask & ((1 as base.u32) << code_length)) == 0 {
            code_length += 1
            continue
        }
        symbol_index = 0
        while symbol_index < this.num_symbols,
                inv code_length <= 20,
        {
            assert symbol_index < 258 via "a < b: a < c; c <= b"(c: this.num_symbols)
            if this.bwt[symbol_index] <> code_length {
                symbol_index += 1
                continue
            }

            while true,
                    inv code_length <= 20,
                    inv symbol_index < 258,
                    post stack_height > 0,
            {
                if stack_height <= 0 {
                    return "#bad Huffman code (over-subscribed)"
                } else if stack_height >= code_length {
                    break
                }
                assert stack_height < 20 via "a < b: a < c; c <= b"(c: code_length)

                node_index = stack_values[stack_height - 1]
                if this.huffman_trees[args.which][node_index][0] == 0 {
                    this.huffman_trees[args.which][node_index][0] = num_branch_nodes as base.u16
                } else {
                    this.huffman_trees[args.which][node_index][1] = num_branch_nodes as base.u16
                }
                if num_branch_nodes >= 257 {
                    return "#bad Huffman code (under-subscribed)"
                }
                stack_values[stack_height] = num_branch_nodes
                this.huffman_trees[args.which][num_branch_nodes][0] = 0
                this.huffman_trees[args.which][num_branch_nodes][1] = 0
                num_branch_nodes += 1
                stack_height += 1
            } endwhile

            node_index = stack_values[stack_height - 1]
            if symbol_index < 2 {
                leaf_value = (0x301 + symbol_index) as base.u16
            } else if (symbol_index + 1) < this.num_symbols {
                leaf_value = (0x1FF + symbol_index) as base.u16
            } else {
                leaf_value = 0x300
            }

            if this.huffman_trees[args.which][node_index][0] == 0 {
                this.huffman_trees[args.which][node_index][0] = leaf_value
            } else {
                this.huffman_trees[args.which][node_index][1] = leaf_value
                stack_height -= 1
                while stack_height > 0,
                        inv code_length <= 20,
                        inv symbol_index < 258,
                {
                    node_index = stack_values[stack_height - 1]
                    if this.huffman_trees[args.which][node_index][1] == 0 {
                        break
                    }
                    stack_height -= 1
                } endwhile
            }

            symbol_index += 1
        } endwhile
        code_length += 1
    } endwhile

    if stack_height <> 0 {
        return "#bad Huffman code (under-subscribed)"
    }
    return ok
}

pri func decoder.build_huffman_table!(which: base.u32[..= 5]) {
    var i      : base.u32
    var bits   : base.u32
    var n_bits : base.u16[..= 8]
    var child  : base.u16

    while i < 256 {
        bits = i << 24
        n_bits = 0
        child = 0
        while (child < 257) and (n_bits < 8),
                inv i < 256,
        {
            child = this.huffman_trees[args.which][child][bits >> 31]
            bits ~mod<<= 1
            n_bits += 1
        } endwhile
        this.huffman_tables[args.which][i] = (child | (n_bits << 12)) as base.u16
        i += 1
    } endwhile
}

// invert_bwt performs "two passes over the data, and one pass over the
// alphabet", per the BWT technical report, except that the first data pass
// (accumulating this.letter_counts) is integrated into the decode_huffman_etc
// methods.
pri func decoder.invert_bwt!() {
    var i       : base.u32
    var letter  : base.u32[..= 255]
    var sum     : base.u32
    var old_sum : base.u32

    // Alphabet pass.
    sum = 0
    i = 0
    while i < 256 {
        old_sum = sum
        sum ~mod+= this.letter_counts[i]
        this.letter_counts[i] = old_sum
        i += 1
    } endwhile

    // Second data pass, but per the README.md file, calculate the U column
    // instead of the BWT technical report's T column.
    i = 0
    while i < this.block_size {
        assert i < 900000 via "a < b: a < c; c <= b"(c: this.block_size)
        letter = this.bwt[i] & 0xFF
        this.bwt[this.letter_counts[letter] & 1_048575] |= i << 12
        this.letter_counts[letter] ~mod+= 1
        i += 1
    } endwhile
}

// The table below was created by script/print-crc32-magic-numbers.go with the
// -reverse flag set.

pri const REV_CRC32_TABLE : roarray[256] base.u32 = [
        0x0000_0000, 0x04C1_1DB7, 0x0982_3B6E, 0x0D43_26D9, 0x1304_76DC, 0x17C5_6B6B, 0x1A86_4DB2, 0x1E47_5005,
        0x2608_EDB8, 0x22C9_F00F, 0x2F8A_D6D6, 0x2B4B_CB61, 0x350C_9B64, 0x31CD_86D3, 0x3C8E_A00A, 0x384F_BDBD,
        0x4C11_DB70, 0x48D0_C6C7, 0x4593_E01E, 0x4152_FDA9, 0x5F15_ADAC, 0x5BD4_B01B, 0x5697_96C2, 0x5256_8B75,
        0x6A19_36C8, 0x6ED8_2B7F, 0x639B_0DA6, 0x675A_1011, 0x791D_4014, 0x7DDC_5DA3, 0x709F_7B7A, 0x745E_66CD,
        0x9823_B6E0, 0x9CE2_AB57, 0x91A1_8D8E, 0x9560_9039, 0x8B27_C03C, 0x8FE6_DD8B, 0x82A5_FB52, 0x8664_E6E5,
        0xBE2B_5B58, 0xBAEA_46EF, 0xB7A9_6036, 0xB368_7D81, 0xAD2F_2D84, 0xA9EE_3033, 0xA4AD_16EA, 0xA06C_0B5D,
        0xD432_6D90, 0xD0F3_7027, 0xDDB0_56FE, 0xD971_4B49, 0xC736_1B4C, 0xC3F7_06FB, 0xCEB4_2022, 0xCA75_3D95,
        0xF23A_8028, 0xF6FB_9D9F, 0xFBB8_BB46, 0xFF79_A6F1, 0xE13E_F6F4, 0xE5FF_EB43, 0xE8BC_CD9A, 0xEC7D_D02D,
        0x3486_7077, 0x3047_6DC0, 0x3D04_4B19, 0x39C5_56AE, 0x2782_06AB, 0x2343_1B1C, 0x2E00_3DC5, 0x2AC1_2072,
        0x128E_9DCF, 0x164F_8078, 0x1B0C_A6A1, 0x1FCD_BB16, 0x018A_EB13, 0x054B_F6A4, 0x0808_D07D, 0x0CC9_CDCA,
        0x7897_AB07, 0x7C56_B6B0, 0x7115_9069, 0x75D4_8DDE, 0x6B93_DDDB, 0x6F52_C06C, 0x6211_E6B5, 0x66D0_FB02,
        0x5E9F_46BF, 0x5A5E_5B08, 0x571D_7DD1, 0x53DC_6066, 0x4D9B_3063, 0x495A_2DD4, 0x4419_0B0D, 0x40D8_16BA,
        0xACA5_C697, 0xA864_DB20, 0xA527_FDF9, 0xA1E6_E04E, 0xBFA1_B04B, 0xBB60_ADFC, 0xB623_8B25, 0xB2E2_9692,
        0x8AAD_2B2F, 0x8E6C_3698, 0x832F_1041, 0x87EE_0DF6, 0x99A9_5DF3, 0x9D68_4044, 0x902B_669D, 0x94EA_7B2A,
        0xE0B4_1DE7, 0xE475_0050, 0xE936_2689, 0xEDF7_3B3E, 0xF3B0_6B3B, 0xF771_768C, 0xFA32_5055, 0xFEF3_4DE2,
        0xC6BC_F05F, 0xC27D_EDE8, 0xCF3E_CB31, 0xCBFF_D686, 0xD5B8_8683, 0xD179_9B34, 0xDC3A_BDED, 0xD8FB_A05A,
        0x690C_E0EE, 0x6DCD_FD59, 0x608E_DB80, 0x644F_C637, 0x7A08_9632, 0x7EC9_8B85, 0x738A_AD5C, 0x774B_B0EB,
        0x4F04_0D56, 0x4BC5_10E1, 0x4686_3638, 0x4247_2B8F, 0x5C00_7B8A, 0x58C1_663D, 0x5582_40E4, 0x5143_5D53,
        0x251D_3B9E, 0x21DC_2629, 0x2C9F_00F0, 0x285E_1D47, 0x3619_4D42, 0x32D8_50F5, 0x3F9B_762C, 0x3B5A_6B9B,
        0x0315_D626, 0x07D4_CB91, 0x0A97_ED48, 0x0E56_F0FF, 0x1011_A0FA, 0x14D0_BD4D, 0x1993_9B94, 0x1D52_8623,
        0xF12F_560E, 0xF5EE_4BB9, 0xF8AD_6D60, 0xFC6C_70D7, 0xE22B_20D2, 0xE6EA_3D65, 0xEBA9_1BBC, 0xEF68_060B,
        0xD727_BBB6, 0xD3E6_A601, 0xDEA5_80D8, 0xDA64_9D6F, 0xC423_CD6A, 0xC0E2_D0DD, 0xCDA1_F604, 0xC960_EBB3,
        0xBD3E_8D7E, 0xB9FF_90C9, 0xB4BC_B610, 0xB07D_ABA7, 0xAE3A_FBA2, 0xAAFB_E615, 0xA7B8_C0CC, 0xA379_DD7B,
        0x9B36_60C6, 0x9FF7_7D71, 0x92B4_5BA8, 0x9675_461F, 0x8832_161A, 0x8CF3_0BAD, 0x81B0_2D74, 0x8571_30C3,
        0x5D8A_9099, 0x594B_8D2E, 0x5408_ABF7, 0x50C9_B640, 0x4E8E_E645, 0x4A4F_FBF2, 0x470C_DD2B, 0x43CD_C09C,
        0x7B82_7D21, 0x7F43_6096, 0x7200_464F, 0x76C1_5BF8, 0x6886_0BFD, 0x6C47_164A, 0x6104_3093, 0x65C5_2D24,
        0x119B_4BE9, 0x155A_565E, 0x1819_7087, 0x1CD8_6D30, 0x029F_3D35, 0x065E_2082, 0x0B1D_065B, 0x0FDC_1BEC,
        0x3793_A651, 0x3352_BBE6, 0x3E11_9D3F, 0x3AD0_8088, 0x2497_D08D, 0x2056_CD3A, 0x2D15_EBE3, 0x29D4_F654,
        0xC5A9_2679, 0xC168_3BCE, 0xCC2B_1D17, 0xC8EA_00A0, 0xD6AD_50A5, 0xD26C_4D12, 0xDF2F_6BCB, 0xDBEE_767C,
        0xE3A1_CBC1, 0xE760_D676, 0xEA23_F0AF, 0xEEE2_ED18, 0xF0A5_BD1D, 0xF464_A0AA, 0xF927_8673, 0xFDE6_9BC4,
        0x89B8_FD09, 0x8D79_E0BE, 0x803A_C667, 0x84FB_DBD0, 0x9ABC_8BD5, 0x9E7D_9662, 0x933E_B0BB, 0x97FF_AD0C,
        0xAFB0_10B1, 0xAB71_0D06, 0xA632_2BDF, 0xA2F3_3668, 0xBCB4_666D, 0xB875_7BDA, 0xB536_5D03, 0xB1F7_40B4,
]
