From 53984e5be200c40c4cf2ded9a1d002a5906c9e1f Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Tue, 8 Mar 2016 15:54:50 +0100 Subject: [PATCH] compress/flate: optimize huffman bit encoder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part 1 of optimizing the deflater. This optimizes the bitwriter by: * Removing allocations. * Storing compound values for bit codes instead of 2 separate tables. * Accumulate 48 bits between writes instead of 24. * Inline bit flushing. This also contains code that will be used in later CL's (writeBlockDynamic, writeBlockHuff). Tests for Huffman bit writer encoding regressions has been added. name old speed new speed delta EncodeDigitsSpeed1e4-4 19.3MB/s ± 1% 21.6MB/s ± 1% +11.77% EncodeDigitsSpeed1e5-4 25.0MB/s ± 6% 30.7MB/s ± 1% +22.70% EncodeDigitsSpeed1e6-4 28.2MB/s ± 1% 32.3MB/s ± 1% +14.64% EncodeDigitsDefault1e4-4 13.3MB/s ± 0% 14.2MB/s ± 1% +7.07% EncodeDigitsDefault1e5-4 6.43MB/s ± 1% 6.64MB/s ± 1% +3.27% EncodeDigitsDefault1e6-4 5.81MB/s ± 0% 5.85MB/s ± 1% +0.69% EncodeDigitsCompress1e4-4 13.2MB/s ± 0% 14.4MB/s ± 0% +9.10% EncodeDigitsCompress1e5-4 6.40MB/s ± 1% 6.61MB/s ± 0% +3.20% EncodeDigitsCompress1e6-4 5.80MB/s ± 1% 5.90MB/s ± 1% +1.64% EncodeTwainSpeed1e4-4 18.4MB/s ± 1% 20.7MB/s ± 1% +12.72% EncodeTwainSpeed1e5-4 27.7MB/s ± 1% 31.0MB/s ± 1% +11.78% EncodeTwainSpeed1e6-4 29.1MB/s ± 0% 32.9MB/s ± 2% +13.25% EncodeTwainDefault1e4-4 12.4MB/s ± 0% 13.1MB/s ± 1% +5.88% EncodeTwainDefault1e5-4 7.52MB/s ± 1% 7.83MB/s ± 0% +4.19% EncodeTwainDefault1e6-4 7.08MB/s ± 1% 7.26MB/s ± 0% +2.54% EncodeTwainCompress1e4-4 12.0MB/s ± 1% 12.8MB/s ± 1% +6.70% EncodeTwainCompress1e5-4 5.96MB/s ± 1% 6.16MB/s ± 0% +3.27% EncodeTwainCompress1e6-4 5.37MB/s ± 0% 5.39MB/s ± 1% +0.47% >Allocations: benchmark old allocs new allocs delta BenchmarkEncodeDigitsSpeed1e4-4 50 0 -100.00% BenchmarkEncodeDigitsSpeed1e5-4 110 0 -100.00% BenchmarkEncodeDigitsSpeed1e6-4 1032 0 -100.00% BenchmarkEncodeDigitsDefault1e4-4 56 0 -100.00% BenchmarkEncodeDigitsDefault1e5-4 120 0 -100.00% BenchmarkEncodeDigitsDefault1e6-4 966 0 -100.00% BenchmarkEncodeDigitsCompress1e4-4 56 0 -100.00% BenchmarkEncodeDigitsCompress1e5-4 120 0 -100.00% BenchmarkEncodeDigitsCompress1e6-4 966 0 -100.00% BenchmarkEncodeTwainSpeed1e4-4 58 0 -100.00% BenchmarkEncodeTwainSpeed1e5-4 132 0 -100.00% BenchmarkEncodeTwainSpeed1e6-4 1082 0 -100.00% BenchmarkEncodeTwainDefault1e4-4 52 0 -100.00% BenchmarkEncodeTwainDefault1e5-4 126 0 -100.00% BenchmarkEncodeTwainDefault1e6-4 886 0 -100.00% BenchmarkEncodeTwainCompress1e4-4 52 0 -100.00% BenchmarkEncodeTwainCompress1e5-4 120 0 -100.00% BenchmarkEncodeTwainCompress1e6-4 880 0 -100.00% benchmark old bytes new bytes delta BenchmarkEncodeDigitsSpeed1e4-4 4288 2 -99.95% BenchmarkEncodeDigitsSpeed1e5-4 8896 15 -99.83% BenchmarkEncodeDigitsSpeed1e6-4 84098 153 -99.82% BenchmarkEncodeDigitsDefault1e4-4 4480 3 -99.93% BenchmarkEncodeDigitsDefault1e5-4 9216 76 -99.18% BenchmarkEncodeDigitsDefault1e6-4 73920 768 -98.96% BenchmarkEncodeDigitsCompress1e4-4 4480 3 -99.93% BenchmarkEncodeDigitsCompress1e5-4 9216 76 -99.18% BenchmarkEncodeDigitsCompress1e6-4 73920 768 -98.96% BenchmarkEncodeTwainSpeed1e4-4 4544 2 -99.96% BenchmarkEncodeTwainSpeed1e5-4 9600 15 -99.84% BenchmarkEncodeTwainSpeed1e6-4 77633 153 -99.80% BenchmarkEncodeTwainDefault1e4-4 4352 3 -99.93% BenchmarkEncodeTwainDefault1e5-4 9408 76 -99.19% BenchmarkEncodeTwainDefault1e6-4 65984 768 -98.84% BenchmarkEncodeTwainCompress1e4-4 4352 3 -99.93% BenchmarkEncodeTwainCompress1e5-4 9216 76 -99.18% BenchmarkEncodeTwainCompress1e6-4 65792 768 -98.83% Updates #14258 Change-Id: Ibaa97b9619743ad623094727228eb2ada1ec7f1f Reviewed-on: https://go-review.googlesource.com/19336 Reviewed-by: Nigel Tao Reviewed-by: Joe Tsai Run-TryBot: Joe Tsai TryBot-Result: Gobot Gobot --- misc/nacl/testzip.proto | 2 + src/compress/flate/huffman_bit_writer.go | 442 ++++++++++++------ src/compress/flate/huffman_bit_writer_test.go | 366 +++++++++++++++ src/compress/flate/huffman_code.go | 113 +++-- .../testdata/huffman-null-max.dyn.expect | Bin 0 -> 78 bytes .../huffman-null-max.dyn.expect-noinput | Bin 0 -> 78 bytes .../flate/testdata/huffman-null-max.golden | Bin 0 -> 8204 bytes .../flate/testdata/huffman-null-max.in | Bin 0 -> 65535 bytes .../flate/testdata/huffman-null-max.wb.expect | Bin 0 -> 78 bytes .../huffman-null-max.wb.expect-noinput | Bin 0 -> 78 bytes .../flate/testdata/huffman-pi.dyn.expect | Bin 0 -> 1696 bytes .../testdata/huffman-pi.dyn.expect-noinput | Bin 0 -> 1696 bytes src/compress/flate/testdata/huffman-pi.golden | Bin 0 -> 1606 bytes src/compress/flate/testdata/huffman-pi.in | 1 + .../flate/testdata/huffman-pi.wb.expect | Bin 0 -> 1696 bytes .../testdata/huffman-pi.wb.expect-noinput | Bin 0 -> 1696 bytes .../flate/testdata/huffman-rand-1k.dyn.expect | Bin 0 -> 1054 bytes .../huffman-rand-1k.dyn.expect-noinput | Bin 0 -> 1054 bytes .../flate/testdata/huffman-rand-1k.golden | Bin 0 -> 1005 bytes .../flate/testdata/huffman-rand-1k.in | Bin 0 -> 1000 bytes .../flate/testdata/huffman-rand-1k.wb.expect | Bin 0 -> 1005 bytes .../huffman-rand-1k.wb.expect-noinput | Bin 0 -> 1054 bytes .../testdata/huffman-rand-limit.dyn.expect | Bin 0 -> 229 bytes .../huffman-rand-limit.dyn.expect-noinput | Bin 0 -> 229 bytes .../flate/testdata/huffman-rand-limit.golden | Bin 0 -> 252 bytes .../flate/testdata/huffman-rand-limit.in | 4 + .../testdata/huffman-rand-limit.wb.expect | Bin 0 -> 186 bytes .../huffman-rand-limit.wb.expect-noinput | Bin 0 -> 186 bytes .../flate/testdata/huffman-rand-max.golden | Bin 0 -> 65540 bytes .../flate/testdata/huffman-rand-max.in | Bin 0 -> 65535 bytes .../flate/testdata/huffman-shifts.dyn.expect | Bin 0 -> 32 bytes .../huffman-shifts.dyn.expect-noinput | Bin 0 -> 32 bytes .../flate/testdata/huffman-shifts.golden | Bin 0 -> 1812 bytes src/compress/flate/testdata/huffman-shifts.in | 2 + .../flate/testdata/huffman-shifts.wb.expect | Bin 0 -> 32 bytes .../testdata/huffman-shifts.wb.expect-noinput | Bin 0 -> 32 bytes .../testdata/huffman-text-shift.dyn.expect | Bin 0 -> 231 bytes .../huffman-text-shift.dyn.expect-noinput | Bin 0 -> 231 bytes .../flate/testdata/huffman-text-shift.golden | Bin 0 -> 231 bytes .../flate/testdata/huffman-text-shift.in | 14 + .../testdata/huffman-text-shift.wb.expect | Bin 0 -> 231 bytes .../huffman-text-shift.wb.expect-noinput | Bin 0 -> 231 bytes .../flate/testdata/huffman-text.dyn.expect | 1 + .../testdata/huffman-text.dyn.expect-noinput | 1 + .../flate/testdata/huffman-text.golden | 3 + src/compress/flate/testdata/huffman-text.in | 13 + .../flate/testdata/huffman-text.wb.expect | 1 + .../testdata/huffman-text.wb.expect-noinput | 1 + .../flate/testdata/huffman-zero.dyn.expect | Bin 0 -> 17 bytes .../testdata/huffman-zero.dyn.expect-noinput | Bin 0 -> 17 bytes .../flate/testdata/huffman-zero.golden | Bin 0 -> 51 bytes src/compress/flate/testdata/huffman-zero.in | 1 + .../flate/testdata/huffman-zero.wb.expect | Bin 0 -> 6 bytes .../testdata/huffman-zero.wb.expect-noinput | Bin 0 -> 6 bytes .../null-long-match.dyn.expect-noinput | Bin 0 -> 206 bytes .../null-long-match.wb.expect-noinput | Bin 0 -> 206 bytes 56 files changed, 781 insertions(+), 184 deletions(-) create mode 100644 src/compress/flate/huffman_bit_writer_test.go create mode 100644 src/compress/flate/testdata/huffman-null-max.dyn.expect create mode 100644 src/compress/flate/testdata/huffman-null-max.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-null-max.golden create mode 100644 src/compress/flate/testdata/huffman-null-max.in create mode 100644 src/compress/flate/testdata/huffman-null-max.wb.expect create mode 100644 src/compress/flate/testdata/huffman-null-max.wb.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-pi.dyn.expect create mode 100644 src/compress/flate/testdata/huffman-pi.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-pi.golden create mode 100644 src/compress/flate/testdata/huffman-pi.in create mode 100644 src/compress/flate/testdata/huffman-pi.wb.expect create mode 100644 src/compress/flate/testdata/huffman-pi.wb.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-rand-1k.dyn.expect create mode 100644 src/compress/flate/testdata/huffman-rand-1k.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-rand-1k.golden create mode 100644 src/compress/flate/testdata/huffman-rand-1k.in create mode 100644 src/compress/flate/testdata/huffman-rand-1k.wb.expect create mode 100644 src/compress/flate/testdata/huffman-rand-1k.wb.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-rand-limit.dyn.expect create mode 100644 src/compress/flate/testdata/huffman-rand-limit.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-rand-limit.golden create mode 100644 src/compress/flate/testdata/huffman-rand-limit.in create mode 100644 src/compress/flate/testdata/huffman-rand-limit.wb.expect create mode 100644 src/compress/flate/testdata/huffman-rand-limit.wb.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-rand-max.golden create mode 100644 src/compress/flate/testdata/huffman-rand-max.in create mode 100644 src/compress/flate/testdata/huffman-shifts.dyn.expect create mode 100644 src/compress/flate/testdata/huffman-shifts.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-shifts.golden create mode 100644 src/compress/flate/testdata/huffman-shifts.in create mode 100644 src/compress/flate/testdata/huffman-shifts.wb.expect create mode 100644 src/compress/flate/testdata/huffman-shifts.wb.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-text-shift.dyn.expect create mode 100644 src/compress/flate/testdata/huffman-text-shift.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-text-shift.golden create mode 100644 src/compress/flate/testdata/huffman-text-shift.in create mode 100644 src/compress/flate/testdata/huffman-text-shift.wb.expect create mode 100644 src/compress/flate/testdata/huffman-text-shift.wb.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-text.dyn.expect create mode 100644 src/compress/flate/testdata/huffman-text.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-text.golden create mode 100644 src/compress/flate/testdata/huffman-text.in create mode 100644 src/compress/flate/testdata/huffman-text.wb.expect create mode 100644 src/compress/flate/testdata/huffman-text.wb.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-zero.dyn.expect create mode 100644 src/compress/flate/testdata/huffman-zero.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/huffman-zero.golden create mode 100644 src/compress/flate/testdata/huffman-zero.in create mode 100644 src/compress/flate/testdata/huffman-zero.wb.expect create mode 100644 src/compress/flate/testdata/huffman-zero.wb.expect-noinput create mode 100644 src/compress/flate/testdata/null-long-match.dyn.expect-noinput create mode 100644 src/compress/flate/testdata/null-long-match.wb.expect-noinput diff --git a/misc/nacl/testzip.proto b/misc/nacl/testzip.proto index 4e82ac9b4bf..42db92f3274 100644 --- a/misc/nacl/testzip.proto +++ b/misc/nacl/testzip.proto @@ -56,6 +56,8 @@ go src=.. testdata + flate + testdata + + gzip testdata + diff --git a/src/compress/flate/huffman_bit_writer.go b/src/compress/flate/huffman_bit_writer.go index abbb63464ce..b99f86ea137 100644 --- a/src/compress/flate/huffman_bit_writer.go +++ b/src/compress/flate/huffman_bit_writer.go @@ -22,6 +22,17 @@ const ( // The number of codegen codes. codegenCodeCount = 19 badCode = 255 + + // bufferFlushSize indicates the buffer size + // after which bytes are flushed to the writer. + // Should preferably be a multiple of 6, since + // we accumulate 6 bytes between writes to the buffer. + bufferFlushSize = 240 + + // bufferSize is the actual output byte buffer size. + // It must have additional headroom for a flush + // which can contain up to 8 bytes. + bufferSize = bufferFlushSize + 8 ) // The number of extra bits needed by length code X - LENGTH_CODES_START. @@ -70,9 +81,9 @@ type huffmanBitWriter struct { w io.Writer // Data waiting to be written is bytes[0:nbytes] // and then the low nbits of bits. - bits uint32 - nbits uint32 - bytes [64]byte + bits uint64 + nbits uint + bytes [bufferSize]byte nbytes int literalFreq []int32 offsetFreq []int32 @@ -92,52 +103,15 @@ func newHuffmanBitWriter(w io.Writer) *huffmanBitWriter { codegen: make([]uint8, maxNumLit+offsetCodeCount+1), codegenFreq: make([]int32, codegenCodeCount), literalEncoding: newHuffmanEncoder(maxNumLit), - offsetEncoding: newHuffmanEncoder(offsetCodeCount), codegenEncoding: newHuffmanEncoder(codegenCodeCount), + offsetEncoding: newHuffmanEncoder(offsetCodeCount), } } func (w *huffmanBitWriter) reset(writer io.Writer) { w.w = writer w.bits, w.nbits, w.nbytes, w.err = 0, 0, 0, nil - w.bytes = [64]byte{} - for i := range w.codegen { - w.codegen[i] = 0 - } - for _, s := range [...][]int32{w.literalFreq, w.offsetFreq, w.codegenFreq} { - for i := range s { - s[i] = 0 - } - } - for _, enc := range [...]*huffmanEncoder{ - w.literalEncoding, - w.offsetEncoding, - w.codegenEncoding} { - for i := range enc.code { - enc.code[i] = 0 - } - for i := range enc.codeBits { - enc.codeBits[i] = 0 - } - } -} - -func (w *huffmanBitWriter) flushBits() { - if w.err != nil { - w.nbits = 0 - return - } - bits := w.bits - w.bits >>= 16 - w.nbits -= 16 - n := w.nbytes - w.bytes[n] = byte(bits) - w.bytes[n+1] = byte(bits >> 8) - if n += 2; n >= len(w.bytes) { - _, w.err = w.w.Write(w.bytes[0:]) - n = 0 - } - w.nbytes = n + w.bytes = [bufferSize]byte{} } func (w *huffmanBitWriter) flush() { @@ -146,26 +120,41 @@ func (w *huffmanBitWriter) flush() { return } n := w.nbytes - if w.nbits > 8 { + for w.nbits != 0 { w.bytes[n] = byte(w.bits) w.bits >>= 8 - w.nbits -= 8 - n++ - } - if w.nbits > 0 { - w.bytes[n] = byte(w.bits) - w.nbits = 0 + if w.nbits > 8 { // Avoid underflow + w.nbits -= 8 + } else { + w.nbits = 0 + } n++ } w.bits = 0 - _, w.err = w.w.Write(w.bytes[0:n]) + _, w.err = w.w.Write(w.bytes[:n]) w.nbytes = 0 } -func (w *huffmanBitWriter) writeBits(b, nb int32) { - w.bits |= uint32(b) << w.nbits - if w.nbits += uint32(nb); w.nbits >= 16 { - w.flushBits() +func (w *huffmanBitWriter) writeBits(b int32, nb uint) { + w.bits |= uint64(b) << w.nbits + w.nbits += nb + if w.nbits >= 48 { + bits := w.bits + w.bits >>= 48 + w.nbits -= 48 + n := w.nbytes + w.bytes[n+0] = byte(bits) + w.bytes[n+1] = byte(bits >> 8) + w.bytes[n+2] = byte(bits >> 16) + w.bytes[n+3] = byte(bits >> 24) + w.bytes[n+4] = byte(bits >> 32) + w.bytes[n+5] = byte(bits >> 40) + n += 6 + if n >= bufferFlushSize { + _, w.err = w.w.Write(w.bytes[:n]) + n = 0 + } + w.nbytes = n } } @@ -174,17 +163,18 @@ func (w *huffmanBitWriter) writeBytes(bytes []byte) { return } n := w.nbytes - if w.nbits == 8 { - w.bytes[n] = byte(w.bits) - w.nbits = 0 - n++ - } - if w.nbits != 0 { + if w.nbits&7 != 0 { w.err = InternalError("writeBytes with unfinished bits") return } + for w.nbits != 0 { + w.bytes[n] = byte(w.bits) + w.bits >>= 8 + w.nbits -= 8 + n++ + } if n != 0 { - _, w.err = w.w.Write(w.bytes[0:n]) + _, w.err = w.w.Write(w.bytes[:n]) if w.err != nil { return } @@ -204,7 +194,8 @@ func (w *huffmanBitWriter) writeBytes(bytes []byte) { // // numLiterals The number of literals in literalEncoding // numOffsets The number of offsets in offsetEncoding -func (w *huffmanBitWriter) generateCodegen(numLiterals int, numOffsets int) { +// litenc, offenc The literal and offset encoder to use +func (w *huffmanBitWriter) generateCodegen(numLiterals int, numOffsets int, litEnc, offEnc *huffmanEncoder) { for i := range w.codegenFreq { w.codegenFreq[i] = 0 } @@ -214,8 +205,15 @@ func (w *huffmanBitWriter) generateCodegen(numLiterals int, numOffsets int) { // so far. codegen := w.codegen // cache // Copy the concatenated code sizes to codegen. Put a marker at the end. - copy(codegen[0:numLiterals], w.literalEncoding.codeBits) - copy(codegen[numLiterals:numLiterals+numOffsets], w.offsetEncoding.codeBits) + cgnl := codegen[:numLiterals] + for i := range cgnl { + cgnl[i] = uint8(litEnc.codes[i].len) + } + + cgnl = codegen[numLiterals : numLiterals+numOffsets] + for i := range cgnl { + cgnl[i] = uint8(offEnc.codes[i].len) + } codegen[numLiterals+numOffsets] = badCode size := codegen[0] @@ -284,11 +282,30 @@ func (w *huffmanBitWriter) generateCodegen(numLiterals int, numOffsets int) { codegen[outIndex] = badCode } -func (w *huffmanBitWriter) writeCode(code *huffmanEncoder, literal uint32) { +func (w *huffmanBitWriter) writeCode(c hcode) { if w.err != nil { return } - w.writeBits(int32(code.code[literal]), int32(code.codeBits[literal])) + w.bits |= uint64(c.code) << w.nbits + w.nbits += uint(c.len) + if w.nbits >= 48 { + bits := w.bits + w.bits >>= 48 + w.nbits -= 48 + n := w.nbytes + w.bytes[n+0] = byte(bits) + w.bytes[n+1] = byte(bits >> 8) + w.bytes[n+2] = byte(bits >> 16) + w.bytes[n+3] = byte(bits >> 24) + w.bytes[n+4] = byte(bits >> 32) + w.bytes[n+5] = byte(bits >> 40) + n += 6 + if n >= bufferFlushSize { + _, w.err = w.w.Write(w.bytes[:n]) + n = 0 + } + w.nbytes = n + } } // Write the header of a dynamic Huffman block to the output stream. @@ -310,7 +327,7 @@ func (w *huffmanBitWriter) writeDynamicHeader(numLiterals int, numOffsets int, n w.writeBits(int32(numCodegens-4), 4) for i := 0; i < numCodegens; i++ { - value := w.codegenEncoding.codeBits[codegenOrder[i]] + value := uint(w.codegenEncoding.codes[codegenOrder[i]].len) w.writeBits(int32(value), 3) } @@ -321,8 +338,7 @@ func (w *huffmanBitWriter) writeDynamicHeader(numLiterals int, numOffsets int, n if codeWord == badCode { break } - // The low byte contains the actual code to generate. - w.writeCode(w.codegenEncoding, uint32(codeWord)) + w.writeCode(w.codegenEncoding.codes[uint32(codeWord)]) switch codeWord { case 16: @@ -371,48 +387,9 @@ func (w *huffmanBitWriter) writeBlock(tokens []token, eof bool, input []byte) { if w.err != nil { return } - for i := range w.literalFreq { - w.literalFreq[i] = 0 - } - for i := range w.offsetFreq { - w.offsetFreq[i] = 0 - } - n := len(tokens) - tokens = tokens[0 : n+1] - tokens[n] = endBlockMarker - - for _, t := range tokens { - switch t.typ() { - case literalType: - w.literalFreq[t.literal()]++ - case matchType: - length := t.length() - offset := t.offset() - w.literalFreq[lengthCodesStart+lengthCode(length)]++ - w.offsetFreq[offsetCode(offset)]++ - } - } - - // get the number of literals - numLiterals := len(w.literalFreq) - for w.literalFreq[numLiterals-1] == 0 { - numLiterals-- - } - // get the number of offsets - numOffsets := len(w.offsetFreq) - for numOffsets > 0 && w.offsetFreq[numOffsets-1] == 0 { - numOffsets-- - } - if numOffsets == 0 { - // We haven't found a single match. If we want to go with the dynamic encoding, - // we should count at least one offset to be sure that the offset huffman tree could be encoded. - w.offsetFreq[0] = 1 - numOffsets = 1 - } - - w.literalEncoding.generate(w.literalFreq, 15) - w.offsetEncoding.generate(w.offsetFreq, 15) + tokens = append(tokens, endBlockMarker) + numLiterals, numOffsets := w.indexTokens(tokens) storedBytes := 0 if input != nil { @@ -450,7 +427,7 @@ func (w *huffmanBitWriter) writeBlock(tokens []token, eof bool, input []byte) { // Generate codegen and codegenFrequencies, which indicates how to encode // the literalEncoding and the offsetEncoding. - w.generateCodegen(numLiterals, numOffsets) + w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, w.offsetEncoding) w.codegenEncoding.generate(w.codegenFreq, 7) numCodegens = len(w.codegenFreq) for numCodegens > 4 && w.codegenFreq[codegenOrder[numCodegens-1]] == 0 { @@ -475,7 +452,7 @@ func (w *huffmanBitWriter) writeBlock(tokens []token, eof bool, input []byte) { // Stored bytes? if storedSize < size { w.writeStoredHeader(storedBytes, eof) - w.writeBytes(input[0:storedBytes]) + w.writeBytes(input[:storedBytes]) return } @@ -485,33 +462,222 @@ func (w *huffmanBitWriter) writeBlock(tokens []token, eof bool, input []byte) { } else { w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) } + + // Write the tokens. + w.writeTokens(tokens, literalEncoding.codes, offsetEncoding.codes) + +} + +// writeBlockDynamic encodes a block using a dynamic Huffman table. +// This should be used if the symbols used have a disproportionate +// histogram distribution. +func (w *huffmanBitWriter) writeBlockDynamic(tokens []token, eof bool, input []byte) { + if w.err != nil { + return + } + + tokens = append(tokens, endBlockMarker) + numLiterals, numOffsets := w.indexTokens(tokens) + + // Generate codegen and codegenFrequencies, which indicates how to encode + // the literalEncoding and the offsetEncoding. + w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, w.offsetEncoding) + w.codegenEncoding.generate(w.codegenFreq, 7) + numCodegens := len(w.codegenFreq) + for numCodegens > 4 && w.codegenFreq[codegenOrder[numCodegens-1]] == 0 { + numCodegens-- + } + + // Write Huffman table. + w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) + + // Write the tokens. + w.writeTokens(tokens, w.literalEncoding.codes, w.offsetEncoding.codes) +} + +// indexTokens indexes a slice of tokens, and updates +// literalFreq and offsetFreq, and generates literalEncoding +// and offsetEncoding. +// The number of literal and offset tokens is returned. +func (w *huffmanBitWriter) indexTokens(tokens []token) (numLiterals, numOffsets int) { + for i := range w.literalFreq { + w.literalFreq[i] = 0 + } + for i := range w.offsetFreq { + w.offsetFreq[i] = 0 + } + for _, t := range tokens { - switch t.typ() { - case literalType: - w.writeCode(literalEncoding, t.literal()) - break - case matchType: - // Write the length - length := t.length() - lengthCode := lengthCode(length) - w.writeCode(literalEncoding, lengthCode+lengthCodesStart) - extraLengthBits := int32(lengthExtraBits[lengthCode]) - if extraLengthBits > 0 { - extraLength := int32(length - lengthBase[lengthCode]) - w.writeBits(extraLength, extraLengthBits) - } - // Write the offset - offset := t.offset() - offsetCode := offsetCode(offset) - w.writeCode(offsetEncoding, offsetCode) - extraOffsetBits := int32(offsetExtraBits[offsetCode]) - if extraOffsetBits > 0 { - extraOffset := int32(offset - offsetBase[offsetCode]) - w.writeBits(extraOffset, extraOffsetBits) - } - break - default: - panic("unknown token type: " + string(t)) + if t < matchType { + w.literalFreq[t.literal()]++ + continue + } + length := t.length() + offset := t.offset() + w.literalFreq[lengthCodesStart+lengthCode(length)]++ + w.offsetFreq[offsetCode(offset)]++ + } + + // get the number of literals + numLiterals = len(w.literalFreq) + for w.literalFreq[numLiterals-1] == 0 { + numLiterals-- + } + // get the number of offsets + numOffsets = len(w.offsetFreq) + for numOffsets > 0 && w.offsetFreq[numOffsets-1] == 0 { + numOffsets-- + } + if numOffsets == 0 { + // We haven't found a single match. If we want to go with the dynamic encoding, + // we should count at least one offset to be sure that the offset huffman tree could be encoded. + w.offsetFreq[0] = 1 + numOffsets = 1 + } + w.literalEncoding.generate(w.literalFreq, 15) + w.offsetEncoding.generate(w.offsetFreq, 15) + return +} + +// writeTokens writes a slice of tokens to the output. +// codes for literal and offset encoding must be supplied. +func (w *huffmanBitWriter) writeTokens(tokens []token, leCodes, oeCodes []hcode) { + for _, t := range tokens { + if t < matchType { + w.writeCode(leCodes[t.literal()]) + continue + } + // Write the length + length := t.length() + lengthCode := lengthCode(length) + w.writeCode(leCodes[lengthCode+lengthCodesStart]) + extraLengthBits := uint(lengthExtraBits[lengthCode]) + if extraLengthBits > 0 { + extraLength := int32(length - lengthBase[lengthCode]) + w.writeBits(extraLength, extraLengthBits) + } + // Write the offset + offset := t.offset() + offsetCode := offsetCode(offset) + w.writeCode(oeCodes[offsetCode]) + extraOffsetBits := uint(offsetExtraBits[offsetCode]) + if extraOffsetBits > 0 { + extraOffset := int32(offset - offsetBase[offsetCode]) + w.writeBits(extraOffset, extraOffsetBits) } } } + +// huffOffset is a static offset encoder used for huffman only encoding. +// It can be reused since we will not be encoding offset values. +var huffOffset *huffmanEncoder + +func init() { + w := newHuffmanBitWriter(nil) + w.offsetFreq[0] = 1 + huffOffset = newHuffmanEncoder(offsetCodeCount) + huffOffset.generate(w.offsetFreq, 15) +} + +// writeBlockHuff encodes a block of bytes as either +// Huffman encoded literals or uncompressed bytes if the +// results only gains very little from compression. +func (w *huffmanBitWriter) writeBlockHuff(eof bool, input []byte) { + if w.err != nil { + return + } + + // Clear histogram + for i := range w.literalFreq { + w.literalFreq[i] = 0 + } + + // Add everything as literals + histogram(input, w.literalFreq) + + w.literalFreq[endBlockMarker] = 1 + + const numLiterals = endBlockMarker + 1 + const numOffsets = 1 + + w.literalEncoding.generate(w.literalFreq, 15) + + // Figure out smallest code. + // Always use dynamic Huffman or Store + var numCodegens int + + // Generate codegen and codegenFrequencies, which indicates how to encode + // the literalEncoding and the offsetEncoding. + w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, huffOffset) + w.codegenEncoding.generate(w.codegenFreq, 7) + numCodegens = len(w.codegenFreq) + for numCodegens > 4 && w.codegenFreq[codegenOrder[numCodegens-1]] == 0 { + numCodegens-- + } + headerSize := int64(3+5+5+4+(3*numCodegens)) + + w.codegenEncoding.bitLength(w.codegenFreq) + + int64(w.codegenFreq[16]*2) + + int64(w.codegenFreq[17]*3) + + int64(w.codegenFreq[18]*7) + + // Includes EOB marker + size := headerSize + w.literalEncoding.bitLength(w.literalFreq) + + // Calculate stored size + var storedSize int64 = math.MaxInt64 + var storedBytes = len(input) + if storedBytes <= maxStoreBlockSize { + storedSize = int64(storedBytes+5) * 8 + } + + // Store bytes, if we don't get a reasonable improvement. + if storedSize < (size + size>>4) { + w.writeStoredHeader(storedBytes, eof) + w.writeBytes(input) + return + } + + // Huffman. + w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) + encoding := w.literalEncoding.codes + n := w.nbytes + for _, t := range input { + // Bitwriting inlined, ~30% speedup + c := encoding[t] + w.bits |= uint64(c.code) << w.nbits + w.nbits += uint(c.len) + if w.nbits < 48 { + continue + } + // Store 6 bytes + bits := w.bits + w.bits >>= 48 + w.nbits -= 48 + w.bytes[n+0] = byte(bits) + w.bytes[n+1] = byte(bits >> 8) + w.bytes[n+2] = byte(bits >> 16) + w.bytes[n+3] = byte(bits >> 24) + w.bytes[n+4] = byte(bits >> 32) + w.bytes[n+5] = byte(bits >> 40) + n += 6 + if n < bufferFlushSize { + continue + } + _, w.err = w.w.Write(w.bytes[:n]) + if w.err != nil { + return + } + n = 0 + } + w.nbytes = n + w.writeCode(encoding[endBlockMarker]) +} + +// histogram accumulates a histogram of b in h. +// +// len(h) must be >= 256, and h's elements must be all zeroes. +func histogram(b []byte, h []int32) { + for _, t := range b { + h[t]++ + } +} diff --git a/src/compress/flate/huffman_bit_writer_test.go b/src/compress/flate/huffman_bit_writer_test.go new file mode 100644 index 00000000000..882d3abec18 --- /dev/null +++ b/src/compress/flate/huffman_bit_writer_test.go @@ -0,0 +1,366 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +import ( + "bytes" + "flag" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" +) + +var update = flag.Bool("update", false, "update reference files") + +// TestBlockHuff tests huffman encoding against reference files +// to detect possible regressions. +// If encoding/bit allocation changes you can regenerate these files +// by using the -update flag. +func TestBlockHuff(t *testing.T) { + // determine input files + match, err := filepath.Glob("testdata/huffman-*.in") + if err != nil { + t.Fatal(err) + } + + for _, in := range match { + out := in // for files where input and output are identical + if strings.HasSuffix(in, ".in") { + out = in[:len(in)-len(".in")] + ".golden" + } + testBlockHuff(t, in, out) + } +} + +func testBlockHuff(t *testing.T, in, out string) { + all, err := ioutil.ReadFile(in) + if err != nil { + t.Error(err) + return + } + var buf bytes.Buffer + bw := newHuffmanBitWriter(&buf) + bw.writeBlockHuff(false, all) + bw.flush() + got := buf.Bytes() + + want, err := ioutil.ReadFile(out) + if err != nil && !*update { + t.Error(err) + return + } + + t.Logf("Testing %q", in) + if !bytes.Equal(got, want) { + if *update { + if in != out { + t.Logf("Updating %q", out) + if err := ioutil.WriteFile(out, got, 0666); err != nil { + t.Error(err) + } + return + } + // in == out: don't accidentally destroy input + t.Errorf("WARNING: -update did not rewrite input file %s", in) + } + + t.Errorf("%q != %q (see %q)", in, out, in+".got") + if err := ioutil.WriteFile(in+".got", got, 0666); err != nil { + t.Error(err) + } + return + } + t.Log("Output ok") + + // Test if the writer produces the same output after reset. + buf.Reset() + bw.reset(&buf) + bw.writeBlockHuff(false, all) + bw.flush() + got = buf.Bytes() + if !bytes.Equal(got, want) { + t.Errorf("after reset %q != %q (see %q)", in, out, in+".reset.got") + if err := ioutil.WriteFile(in+".reset.got", got, 0666); err != nil { + t.Error(err) + } + return + } + t.Log("Reset ok") + testWriterEOF(t, "huff", huffTest{input: in}, true) +} + +type huffTest struct { + tokens []token + input string // File name of input data matching the tokens. + want string // File name of data with the expected output with input available. + wantNoInput string // File name of the expected output when no input is available. +} + +const ml = 0x7fc00000 // Maximum length token. Used to reduce the size of writeBlockTests + +var writeBlockTests = []huffTest{ + { + input: "testdata/huffman-null-max.in", + want: "testdata/huffman-null-max.%s.expect", + wantNoInput: "testdata/huffman-null-max.%s.expect-noinput", + tokens: []token{0x0, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, 0x0, 0x0}, + }, + { + input: "testdata/huffman-pi.in", + want: "testdata/huffman-pi.%s.expect", + wantNoInput: "testdata/huffman-pi.%s.expect-noinput", + tokens: []token{0x33, 0x2e, 0x31, 0x34, 0x31, 0x35, 0x39, 0x32, 0x36, 0x35, 0x33, 0x35, 0x38, 0x39, 0x37, 0x39, 0x33, 0x32, 0x33, 0x38, 0x34, 0x36, 0x32, 0x36, 0x34, 0x33, 0x33, 0x38, 0x33, 0x32, 0x37, 0x39, 0x35, 0x30, 0x32, 0x38, 0x38, 0x34, 0x31, 0x39, 0x37, 0x31, 0x36, 0x39, 0x33, 0x39, 0x39, 0x33, 0x37, 0x35, 0x31, 0x30, 0x35, 0x38, 0x32, 0x30, 0x39, 0x37, 0x34, 0x39, 0x34, 0x34, 0x35, 0x39, 0x32, 0x33, 0x30, 0x37, 0x38, 0x31, 0x36, 0x34, 0x30, 0x36, 0x32, 0x38, 0x36, 0x32, 0x30, 0x38, 0x39, 0x39, 0x38, 0x36, 0x32, 0x38, 0x30, 0x33, 0x34, 0x38, 0x32, 0x35, 0x33, 0x34, 0x32, 0x31, 0x31, 0x37, 0x30, 0x36, 0x37, 0x39, 0x38, 0x32, 0x31, 0x34, 0x38, 0x30, 0x38, 0x36, 0x35, 0x31, 0x33, 0x32, 0x38, 0x32, 0x33, 0x30, 0x36, 0x36, 0x34, 0x37, 0x30, 0x39, 0x33, 0x38, 0x34, 0x34, 0x36, 0x30, 0x39, 0x35, 0x35, 0x30, 0x35, 0x38, 0x32, 0x32, 0x33, 0x31, 0x37, 0x32, 0x35, 0x33, 0x35, 0x39, 0x34, 0x30, 0x38, 0x31, 0x32, 0x38, 0x34, 0x38, 0x31, 0x31, 0x31, 0x37, 0x34, 0x4040007e, 0x34, 0x31, 0x30, 0x32, 0x37, 0x30, 0x31, 0x39, 0x33, 0x38, 0x35, 0x32, 0x31, 0x31, 0x30, 0x35, 0x35, 0x35, 0x39, 0x36, 0x34, 0x34, 0x36, 0x32, 0x32, 0x39, 0x34, 0x38, 0x39, 0x35, 0x34, 0x39, 0x33, 0x30, 0x33, 0x38, 0x31, 0x40400012, 0x32, 0x38, 0x38, 0x31, 0x30, 0x39, 0x37, 0x35, 0x36, 0x36, 0x35, 0x39, 0x33, 0x33, 0x34, 0x34, 0x36, 0x40400047, 0x37, 0x35, 0x36, 0x34, 0x38, 0x32, 0x33, 0x33, 0x37, 0x38, 0x36, 0x37, 0x38, 0x33, 0x31, 0x36, 0x35, 0x32, 0x37, 0x31, 0x32, 0x30, 0x31, 0x39, 0x30, 0x39, 0x31, 0x34, 0x4040001a, 0x35, 0x36, 0x36, 0x39, 0x32, 0x33, 0x34, 0x36, 0x404000b2, 0x36, 0x31, 0x30, 0x34, 0x35, 0x34, 0x33, 0x32, 0x36, 0x40400032, 0x31, 0x33, 0x33, 0x39, 0x33, 0x36, 0x30, 0x37, 0x32, 0x36, 0x30, 0x32, 0x34, 0x39, 0x31, 0x34, 0x31, 0x32, 0x37, 0x33, 0x37, 0x32, 0x34, 0x35, 0x38, 0x37, 0x30, 0x30, 0x36, 0x36, 0x30, 0x36, 0x33, 0x31, 0x35, 0x35, 0x38, 0x38, 0x31, 0x37, 0x34, 0x38, 0x38, 0x31, 0x35, 0x32, 0x30, 0x39, 0x32, 0x30, 0x39, 0x36, 0x32, 0x38, 0x32, 0x39, 0x32, 0x35, 0x34, 0x30, 0x39, 0x31, 0x37, 0x31, 0x35, 0x33, 0x36, 0x34, 0x33, 0x36, 0x37, 0x38, 0x39, 0x32, 0x35, 0x39, 0x30, 0x33, 0x36, 0x30, 0x30, 0x31, 0x31, 0x33, 0x33, 0x30, 0x35, 0x33, 0x30, 0x35, 0x34, 0x38, 0x38, 0x32, 0x30, 0x34, 0x36, 0x36, 0x35, 0x32, 0x31, 0x33, 0x38, 0x34, 0x31, 0x34, 0x36, 0x39, 0x35, 0x31, 0x39, 0x34, 0x31, 0x35, 0x31, 0x31, 0x36, 0x30, 0x39, 0x34, 0x33, 0x33, 0x30, 0x35, 0x37, 0x32, 0x37, 0x30, 0x33, 0x36, 0x35, 0x37, 0x35, 0x39, 0x35, 0x39, 0x31, 0x39, 0x35, 0x33, 0x30, 0x39, 0x32, 0x31, 0x38, 0x36, 0x31, 0x31, 0x37, 0x404000e9, 0x33, 0x32, 0x40400009, 0x39, 0x33, 0x31, 0x30, 0x35, 0x31, 0x31, 0x38, 0x35, 0x34, 0x38, 0x30, 0x37, 0x4040010e, 0x33, 0x37, 0x39, 0x39, 0x36, 0x32, 0x37, 0x34, 0x39, 0x35, 0x36, 0x37, 0x33, 0x35, 0x31, 0x38, 0x38, 0x35, 0x37, 0x35, 0x32, 0x37, 0x32, 0x34, 0x38, 0x39, 0x31, 0x32, 0x32, 0x37, 0x39, 0x33, 0x38, 0x31, 0x38, 0x33, 0x30, 0x31, 0x31, 0x39, 0x34, 0x39, 0x31, 0x32, 0x39, 0x38, 0x33, 0x33, 0x36, 0x37, 0x33, 0x33, 0x36, 0x32, 0x34, 0x34, 0x30, 0x36, 0x35, 0x36, 0x36, 0x34, 0x33, 0x30, 0x38, 0x36, 0x30, 0x32, 0x31, 0x33, 0x39, 0x34, 0x39, 0x34, 0x36, 0x33, 0x39, 0x35, 0x32, 0x32, 0x34, 0x37, 0x33, 0x37, 0x31, 0x39, 0x30, 0x37, 0x30, 0x32, 0x31, 0x37, 0x39, 0x38, 0x40800099, 0x37, 0x30, 0x32, 0x37, 0x37, 0x30, 0x35, 0x33, 0x39, 0x32, 0x31, 0x37, 0x31, 0x37, 0x36, 0x32, 0x39, 0x33, 0x31, 0x37, 0x36, 0x37, 0x35, 0x40800232, 0x37, 0x34, 0x38, 0x31, 0x40400006, 0x36, 0x36, 0x39, 0x34, 0x30, 0x404001e7, 0x30, 0x30, 0x30, 0x35, 0x36, 0x38, 0x31, 0x32, 0x37, 0x31, 0x34, 0x35, 0x32, 0x36, 0x33, 0x35, 0x36, 0x30, 0x38, 0x32, 0x37, 0x37, 0x38, 0x35, 0x37, 0x37, 0x31, 0x33, 0x34, 0x32, 0x37, 0x35, 0x37, 0x37, 0x38, 0x39, 0x36, 0x40400129, 0x33, 0x36, 0x33, 0x37, 0x31, 0x37, 0x38, 0x37, 0x32, 0x31, 0x34, 0x36, 0x38, 0x34, 0x34, 0x30, 0x39, 0x30, 0x31, 0x32, 0x32, 0x34, 0x39, 0x35, 0x33, 0x34, 0x33, 0x30, 0x31, 0x34, 0x36, 0x35, 0x34, 0x39, 0x35, 0x38, 0x35, 0x33, 0x37, 0x31, 0x30, 0x35, 0x30, 0x37, 0x39, 0x404000ca, 0x36, 0x40400153, 0x38, 0x39, 0x32, 0x33, 0x35, 0x34, 0x404001c9, 0x39, 0x35, 0x36, 0x31, 0x31, 0x32, 0x31, 0x32, 0x39, 0x30, 0x32, 0x31, 0x39, 0x36, 0x30, 0x38, 0x36, 0x34, 0x30, 0x33, 0x34, 0x34, 0x31, 0x38, 0x31, 0x35, 0x39, 0x38, 0x31, 0x33, 0x36, 0x32, 0x39, 0x37, 0x37, 0x34, 0x40400074, 0x30, 0x39, 0x39, 0x36, 0x30, 0x35, 0x31, 0x38, 0x37, 0x30, 0x37, 0x32, 0x31, 0x31, 0x33, 0x34, 0x39, 0x40800000, 0x38, 0x33, 0x37, 0x32, 0x39, 0x37, 0x38, 0x30, 0x34, 0x39, 0x39, 0x404002da, 0x39, 0x37, 0x33, 0x31, 0x37, 0x33, 0x32, 0x38, 0x4040018a, 0x36, 0x33, 0x31, 0x38, 0x35, 0x40400301, 0x404002e8, 0x34, 0x35, 0x35, 0x33, 0x34, 0x36, 0x39, 0x30, 0x38, 0x33, 0x30, 0x32, 0x36, 0x34, 0x32, 0x35, 0x32, 0x32, 0x33, 0x30, 0x404002e3, 0x40400267, 0x38, 0x35, 0x30, 0x33, 0x35, 0x32, 0x36, 0x31, 0x39, 0x33, 0x31, 0x31, 0x40400212, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x33, 0x31, 0x33, 0x37, 0x38, 0x33, 0x38, 0x37, 0x35, 0x32, 0x38, 0x38, 0x36, 0x35, 0x38, 0x37, 0x35, 0x33, 0x33, 0x32, 0x30, 0x38, 0x33, 0x38, 0x31, 0x34, 0x32, 0x30, 0x36, 0x40400140, 0x4040012b, 0x31, 0x34, 0x37, 0x33, 0x30, 0x33, 0x35, 0x39, 0x4080032e, 0x39, 0x30, 0x34, 0x32, 0x38, 0x37, 0x35, 0x35, 0x34, 0x36, 0x38, 0x37, 0x33, 0x31, 0x31, 0x35, 0x39, 0x35, 0x40400355, 0x33, 0x38, 0x38, 0x32, 0x33, 0x35, 0x33, 0x37, 0x38, 0x37, 0x35, 0x4080037f, 0x39, 0x4040013a, 0x31, 0x40400148, 0x38, 0x30, 0x35, 0x33, 0x4040018a, 0x32, 0x32, 0x36, 0x38, 0x30, 0x36, 0x36, 0x31, 0x33, 0x30, 0x30, 0x31, 0x39, 0x32, 0x37, 0x38, 0x37, 0x36, 0x36, 0x31, 0x31, 0x31, 0x39, 0x35, 0x39, 0x40400237, 0x36, 0x40800124, 0x38, 0x39, 0x33, 0x38, 0x30, 0x39, 0x35, 0x32, 0x35, 0x37, 0x32, 0x30, 0x31, 0x30, 0x36, 0x35, 0x34, 0x38, 0x35, 0x38, 0x36, 0x33, 0x32, 0x37, 0x4040009a, 0x39, 0x33, 0x36, 0x31, 0x35, 0x33, 0x40400220, 0x4080015c, 0x32, 0x33, 0x30, 0x33, 0x30, 0x31, 0x39, 0x35, 0x32, 0x30, 0x33, 0x35, 0x33, 0x30, 0x31, 0x38, 0x35, 0x32, 0x40400171, 0x40400075, 0x33, 0x36, 0x32, 0x32, 0x35, 0x39, 0x39, 0x34, 0x31, 0x33, 0x40400254, 0x34, 0x39, 0x37, 0x32, 0x31, 0x37, 0x404000de, 0x33, 0x34, 0x37, 0x39, 0x31, 0x33, 0x31, 0x35, 0x31, 0x35, 0x35, 0x37, 0x34, 0x38, 0x35, 0x37, 0x32, 0x34, 0x32, 0x34, 0x35, 0x34, 0x31, 0x35, 0x30, 0x36, 0x39, 0x4040013f, 0x38, 0x32, 0x39, 0x35, 0x33, 0x33, 0x31, 0x31, 0x36, 0x38, 0x36, 0x31, 0x37, 0x32, 0x37, 0x38, 0x40400337, 0x39, 0x30, 0x37, 0x35, 0x30, 0x39, 0x4040010d, 0x37, 0x35, 0x34, 0x36, 0x33, 0x37, 0x34, 0x36, 0x34, 0x39, 0x33, 0x39, 0x33, 0x31, 0x39, 0x32, 0x35, 0x35, 0x30, 0x36, 0x30, 0x34, 0x30, 0x30, 0x39, 0x4040026b, 0x31, 0x36, 0x37, 0x31, 0x31, 0x33, 0x39, 0x30, 0x30, 0x39, 0x38, 0x40400335, 0x34, 0x30, 0x31, 0x32, 0x38, 0x35, 0x38, 0x33, 0x36, 0x31, 0x36, 0x30, 0x33, 0x35, 0x36, 0x33, 0x37, 0x30, 0x37, 0x36, 0x36, 0x30, 0x31, 0x30, 0x34, 0x40400172, 0x38, 0x31, 0x39, 0x34, 0x32, 0x39, 0x4080041e, 0x404000ef, 0x4040028b, 0x37, 0x38, 0x33, 0x37, 0x34, 0x404004a8, 0x38, 0x32, 0x35, 0x35, 0x33, 0x37, 0x40800209, 0x32, 0x36, 0x38, 0x4040002e, 0x34, 0x30, 0x34, 0x37, 0x404001d1, 0x34, 0x404004b5, 0x4040038d, 0x38, 0x34, 0x404003a8, 0x36, 0x40c0031f, 0x33, 0x33, 0x31, 0x33, 0x36, 0x37, 0x37, 0x30, 0x32, 0x38, 0x39, 0x38, 0x39, 0x31, 0x35, 0x32, 0x40400062, 0x35, 0x32, 0x31, 0x36, 0x32, 0x30, 0x35, 0x36, 0x39, 0x36, 0x40400411, 0x30, 0x35, 0x38, 0x40400477, 0x35, 0x40400498, 0x35, 0x31, 0x31, 0x40400209, 0x38, 0x32, 0x34, 0x33, 0x30, 0x30, 0x33, 0x35, 0x35, 0x38, 0x37, 0x36, 0x34, 0x30, 0x32, 0x34, 0x37, 0x34, 0x39, 0x36, 0x34, 0x37, 0x33, 0x32, 0x36, 0x33, 0x4040043e, 0x39, 0x39, 0x32, 0x4040044b, 0x34, 0x32, 0x36, 0x39, 0x40c002c5, 0x37, 0x404001d6, 0x34, 0x4040053d, 0x4040041d, 0x39, 0x33, 0x34, 0x31, 0x37, 0x404001ad, 0x31, 0x32, 0x4040002a, 0x34, 0x4040019e, 0x31, 0x35, 0x30, 0x33, 0x30, 0x32, 0x38, 0x36, 0x31, 0x38, 0x32, 0x39, 0x37, 0x34, 0x35, 0x35, 0x35, 0x37, 0x30, 0x36, 0x37, 0x34, 0x40400135, 0x35, 0x30, 0x35, 0x34, 0x39, 0x34, 0x35, 0x38, 0x404001c5, 0x39, 0x40400051, 0x35, 0x36, 0x404001ec, 0x37, 0x32, 0x31, 0x30, 0x37, 0x39, 0x40400159, 0x33, 0x30, 0x4040010a, 0x33, 0x32, 0x31, 0x31, 0x36, 0x35, 0x33, 0x34, 0x34, 0x39, 0x38, 0x37, 0x32, 0x30, 0x32, 0x37, 0x4040011b, 0x30, 0x32, 0x33, 0x36, 0x34, 0x4040022e, 0x35, 0x34, 0x39, 0x39, 0x31, 0x31, 0x39, 0x38, 0x40400418, 0x34, 0x4040011b, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x36, 0x39, 0x40400450, 0x32, 0x36, 0x35, 0x404002e4, 0x37, 0x38, 0x36, 0x32, 0x35, 0x35, 0x31, 0x404003da, 0x31, 0x37, 0x35, 0x37, 0x34, 0x36, 0x37, 0x32, 0x38, 0x39, 0x30, 0x39, 0x37, 0x37, 0x37, 0x37, 0x40800453, 0x30, 0x30, 0x30, 0x404005fd, 0x37, 0x30, 0x404004df, 0x36, 0x404003e9, 0x34, 0x39, 0x31, 0x4040041e, 0x40400297, 0x32, 0x31, 0x34, 0x37, 0x37, 0x32, 0x33, 0x35, 0x30, 0x31, 0x34, 0x31, 0x34, 0x40400643, 0x33, 0x35, 0x36, 0x404004af, 0x31, 0x36, 0x31, 0x33, 0x36, 0x31, 0x31, 0x35, 0x37, 0x33, 0x35, 0x32, 0x35, 0x40400504, 0x33, 0x34, 0x4040005b, 0x31, 0x38, 0x4040047b, 0x38, 0x34, 0x404005e7, 0x33, 0x33, 0x32, 0x33, 0x39, 0x30, 0x37, 0x33, 0x39, 0x34, 0x31, 0x34, 0x33, 0x33, 0x33, 0x34, 0x35, 0x34, 0x37, 0x37, 0x36, 0x32, 0x34, 0x40400242, 0x32, 0x35, 0x31, 0x38, 0x39, 0x38, 0x33, 0x35, 0x36, 0x39, 0x34, 0x38, 0x35, 0x35, 0x36, 0x32, 0x30, 0x39, 0x39, 0x32, 0x31, 0x39, 0x32, 0x32, 0x32, 0x31, 0x38, 0x34, 0x32, 0x37, 0x4040023e, 0x32, 0x404000ba, 0x36, 0x38, 0x38, 0x37, 0x36, 0x37, 0x31, 0x37, 0x39, 0x30, 0x40400055, 0x30, 0x40800106, 0x36, 0x36, 0x404003e7, 0x38, 0x38, 0x36, 0x32, 0x37, 0x32, 0x404006dc, 0x31, 0x37, 0x38, 0x36, 0x30, 0x38, 0x35, 0x37, 0x40400073, 0x33, 0x408002fc, 0x37, 0x39, 0x37, 0x36, 0x36, 0x38, 0x31, 0x404002bd, 0x30, 0x30, 0x39, 0x35, 0x33, 0x38, 0x38, 0x40400638, 0x33, 0x404006a5, 0x30, 0x36, 0x38, 0x30, 0x30, 0x36, 0x34, 0x32, 0x32, 0x35, 0x31, 0x32, 0x35, 0x32, 0x4040057b, 0x37, 0x33, 0x39, 0x32, 0x40400297, 0x40400474, 0x34, 0x408006b3, 0x38, 0x36, 0x32, 0x36, 0x39, 0x34, 0x35, 0x404001e5, 0x34, 0x31, 0x39, 0x36, 0x35, 0x32, 0x38, 0x35, 0x30, 0x40400099, 0x4040039c, 0x31, 0x38, 0x36, 0x33, 0x404001be, 0x34, 0x40800154, 0x32, 0x30, 0x33, 0x39, 0x4040058b, 0x34, 0x35, 0x404002bc, 0x32, 0x33, 0x37, 0x4040042c, 0x36, 0x40400510, 0x35, 0x36, 0x40400638, 0x37, 0x31, 0x39, 0x31, 0x37, 0x32, 0x38, 0x40400171, 0x37, 0x36, 0x34, 0x36, 0x35, 0x37, 0x35, 0x37, 0x33, 0x39, 0x40400101, 0x33, 0x38, 0x39, 0x40400748, 0x38, 0x33, 0x32, 0x36, 0x34, 0x35, 0x39, 0x39, 0x35, 0x38, 0x404006a7, 0x30, 0x34, 0x37, 0x38, 0x404001de, 0x40400328, 0x39, 0x4040002d, 0x36, 0x34, 0x30, 0x37, 0x38, 0x39, 0x35, 0x31, 0x4040008e, 0x36, 0x38, 0x33, 0x4040012f, 0x32, 0x35, 0x39, 0x35, 0x37, 0x30, 0x40400468, 0x38, 0x32, 0x32, 0x404002c8, 0x32, 0x4040061b, 0x34, 0x30, 0x37, 0x37, 0x32, 0x36, 0x37, 0x31, 0x39, 0x34, 0x37, 0x38, 0x40400319, 0x38, 0x32, 0x36, 0x30, 0x31, 0x34, 0x37, 0x36, 0x39, 0x39, 0x30, 0x39, 0x404004e8, 0x30, 0x31, 0x33, 0x36, 0x33, 0x39, 0x34, 0x34, 0x33, 0x4040027f, 0x33, 0x30, 0x40400105, 0x32, 0x30, 0x33, 0x34, 0x39, 0x36, 0x32, 0x35, 0x32, 0x34, 0x35, 0x31, 0x37, 0x404003b5, 0x39, 0x36, 0x35, 0x31, 0x34, 0x33, 0x31, 0x34, 0x32, 0x39, 0x38, 0x30, 0x39, 0x31, 0x39, 0x30, 0x36, 0x35, 0x39, 0x32, 0x40400282, 0x37, 0x32, 0x32, 0x31, 0x36, 0x39, 0x36, 0x34, 0x36, 0x40400419, 0x4040007a, 0x35, 0x4040050e, 0x34, 0x40800565, 0x38, 0x40400559, 0x39, 0x37, 0x4040057b, 0x35, 0x34, 0x4040049d, 0x4040023e, 0x37, 0x4040065a, 0x38, 0x34, 0x36, 0x38, 0x31, 0x33, 0x4040008c, 0x36, 0x38, 0x33, 0x38, 0x36, 0x38, 0x39, 0x34, 0x32, 0x37, 0x37, 0x34, 0x31, 0x35, 0x35, 0x39, 0x39, 0x31, 0x38, 0x35, 0x4040005a, 0x32, 0x34, 0x35, 0x39, 0x35, 0x33, 0x39, 0x35, 0x39, 0x34, 0x33, 0x31, 0x404005b7, 0x37, 0x40400012, 0x36, 0x38, 0x30, 0x38, 0x34, 0x35, 0x404002e7, 0x37, 0x33, 0x4040081e, 0x39, 0x35, 0x38, 0x34, 0x38, 0x36, 0x35, 0x33, 0x38, 0x404006e8, 0x36, 0x32, 0x404000f2, 0x36, 0x30, 0x39, 0x404004b6, 0x36, 0x30, 0x38, 0x30, 0x35, 0x31, 0x32, 0x34, 0x33, 0x38, 0x38, 0x34, 0x4040013a, 0x4040000b, 0x34, 0x31, 0x33, 0x4040030f, 0x37, 0x36, 0x32, 0x37, 0x38, 0x40400341, 0x37, 0x31, 0x35, 0x4040059b, 0x33, 0x35, 0x39, 0x39, 0x37, 0x37, 0x30, 0x30, 0x31, 0x32, 0x39, 0x40400472, 0x38, 0x39, 0x34, 0x34, 0x31, 0x40400277, 0x36, 0x38, 0x35, 0x35, 0x4040005f, 0x34, 0x30, 0x36, 0x33, 0x404008e6, 0x32, 0x30, 0x37, 0x32, 0x32, 0x40400158, 0x40800203, 0x34, 0x38, 0x31, 0x35, 0x38, 0x40400205, 0x404001fe, 0x4040027a, 0x40400298, 0x33, 0x39, 0x34, 0x35, 0x32, 0x32, 0x36, 0x37, 0x40c00496, 0x38, 0x4040058a, 0x32, 0x31, 0x404002ea, 0x32, 0x40400387, 0x35, 0x34, 0x36, 0x36, 0x36, 0x4040051b, 0x32, 0x33, 0x39, 0x38, 0x36, 0x34, 0x35, 0x36, 0x404004c4, 0x31, 0x36, 0x33, 0x35, 0x40800253, 0x40400811, 0x37, 0x404008ad, 0x39, 0x38, 0x4040045e, 0x39, 0x33, 0x36, 0x33, 0x34, 0x4040075b, 0x37, 0x34, 0x33, 0x32, 0x34, 0x4040047b, 0x31, 0x35, 0x30, 0x37, 0x36, 0x404004bb, 0x37, 0x39, 0x34, 0x35, 0x31, 0x30, 0x39, 0x4040003e, 0x30, 0x39, 0x34, 0x30, 0x404006a6, 0x38, 0x38, 0x37, 0x39, 0x37, 0x31, 0x30, 0x38, 0x39, 0x33, 0x404008f0, 0x36, 0x39, 0x31, 0x33, 0x36, 0x38, 0x36, 0x37, 0x32, 0x4040025b, 0x404001fe, 0x35, 0x4040053f, 0x40400468, 0x40400801, 0x31, 0x37, 0x39, 0x32, 0x38, 0x36, 0x38, 0x404008cc, 0x38, 0x37, 0x34, 0x37, 0x4080079e, 0x38, 0x32, 0x34, 0x4040097a, 0x38, 0x4040025b, 0x37, 0x31, 0x34, 0x39, 0x30, 0x39, 0x36, 0x37, 0x35, 0x39, 0x38, 0x404006ef, 0x33, 0x36, 0x35, 0x40400134, 0x38, 0x31, 0x4040005c, 0x40400745, 0x40400936, 0x36, 0x38, 0x32, 0x39, 0x4040057e, 0x38, 0x37, 0x32, 0x32, 0x36, 0x35, 0x38, 0x38, 0x30, 0x40400611, 0x35, 0x40400249, 0x34, 0x32, 0x37, 0x30, 0x34, 0x37, 0x37, 0x35, 0x35, 0x4040081e, 0x33, 0x37, 0x39, 0x36, 0x34, 0x31, 0x34, 0x35, 0x31, 0x35, 0x32, 0x404005fd, 0x32, 0x33, 0x34, 0x33, 0x36, 0x34, 0x35, 0x34, 0x404005de, 0x34, 0x34, 0x34, 0x37, 0x39, 0x35, 0x4040003c, 0x40400523, 0x408008e6, 0x34, 0x31, 0x4040052a, 0x33, 0x40400304, 0x35, 0x32, 0x33, 0x31, 0x40800841, 0x31, 0x36, 0x36, 0x31, 0x404008b2, 0x35, 0x39, 0x36, 0x39, 0x35, 0x33, 0x36, 0x32, 0x33, 0x31, 0x34, 0x404005ff, 0x32, 0x34, 0x38, 0x34, 0x39, 0x33, 0x37, 0x31, 0x38, 0x37, 0x31, 0x31, 0x30, 0x31, 0x34, 0x35, 0x37, 0x36, 0x35, 0x34, 0x40400761, 0x30, 0x32, 0x37, 0x39, 0x39, 0x33, 0x34, 0x34, 0x30, 0x33, 0x37, 0x34, 0x32, 0x30, 0x30, 0x37, 0x4040093f, 0x37, 0x38, 0x35, 0x33, 0x39, 0x30, 0x36, 0x32, 0x31, 0x39, 0x40800299, 0x40400345, 0x38, 0x34, 0x37, 0x408003d2, 0x38, 0x33, 0x33, 0x32, 0x31, 0x34, 0x34, 0x35, 0x37, 0x31, 0x40400284, 0x40400776, 0x34, 0x33, 0x35, 0x30, 0x40400928, 0x40400468, 0x35, 0x33, 0x31, 0x39, 0x31, 0x30, 0x34, 0x38, 0x34, 0x38, 0x31, 0x30, 0x30, 0x35, 0x33, 0x37, 0x30, 0x36, 0x404008bc, 0x4080059d, 0x40800781, 0x31, 0x40400559, 0x37, 0x4040031b, 0x35, 0x404007ec, 0x4040040c, 0x36, 0x33, 0x408007dc, 0x34, 0x40400971, 0x4080034e, 0x408003f5, 0x38, 0x4080052d, 0x40800887, 0x39, 0x40400187, 0x39, 0x31, 0x404008ce, 0x38, 0x31, 0x34, 0x36, 0x37, 0x35, 0x31, 0x4040062b, 0x31, 0x32, 0x33, 0x39, 0x40c001a9, 0x39, 0x30, 0x37, 0x31, 0x38, 0x36, 0x34, 0x39, 0x34, 0x32, 0x33, 0x31, 0x39, 0x36, 0x31, 0x35, 0x36, 0x404001ec, 0x404006bc, 0x39, 0x35, 0x40400926, 0x40400469, 0x4040011b, 0x36, 0x30, 0x33, 0x38, 0x40400a25, 0x4040016f, 0x40400384, 0x36, 0x32, 0x4040045a, 0x35, 0x4040084c, 0x36, 0x33, 0x38, 0x39, 0x33, 0x37, 0x37, 0x38, 0x37, 0x404008c5, 0x404000f8, 0x39, 0x37, 0x39, 0x32, 0x30, 0x37, 0x37, 0x33, 0x404005d7, 0x32, 0x31, 0x38, 0x32, 0x35, 0x36, 0x404007df, 0x36, 0x36, 0x404006d6, 0x34, 0x32, 0x4080067e, 0x36, 0x404006e6, 0x34, 0x34, 0x40400024, 0x35, 0x34, 0x39, 0x32, 0x30, 0x32, 0x36, 0x30, 0x35, 0x40400ab3, 0x408003e4, 0x32, 0x30, 0x31, 0x34, 0x39, 0x404004d2, 0x38, 0x35, 0x30, 0x37, 0x33, 0x40400599, 0x36, 0x36, 0x36, 0x30, 0x40400194, 0x32, 0x34, 0x33, 0x34, 0x30, 0x40400087, 0x30, 0x4040076b, 0x38, 0x36, 0x33, 0x40400956, 0x404007e4, 0x4040042b, 0x40400174, 0x35, 0x37, 0x39, 0x36, 0x32, 0x36, 0x38, 0x35, 0x36, 0x40400140, 0x35, 0x30, 0x38, 0x40400523, 0x35, 0x38, 0x37, 0x39, 0x36, 0x39, 0x39, 0x40400711, 0x35, 0x37, 0x34, 0x40400a18, 0x38, 0x34, 0x30, 0x404008b3, 0x31, 0x34, 0x35, 0x39, 0x31, 0x4040078c, 0x37, 0x30, 0x40400234, 0x30, 0x31, 0x40400be7, 0x31, 0x32, 0x40400c74, 0x30, 0x404003c3, 0x33, 0x39, 0x40400b2a, 0x40400112, 0x37, 0x31, 0x35, 0x404003b0, 0x34, 0x32, 0x30, 0x40800bf2, 0x39, 0x40400bc2, 0x30, 0x37, 0x40400341, 0x40400795, 0x40400aaf, 0x40400c62, 0x32, 0x31, 0x40400960, 0x32, 0x35, 0x31, 0x4040057b, 0x40400944, 0x39, 0x32, 0x404001b2, 0x38, 0x32, 0x36, 0x40400b66, 0x32, 0x40400278, 0x33, 0x32, 0x31, 0x35, 0x37, 0x39, 0x31, 0x39, 0x38, 0x34, 0x31, 0x34, 0x4080087b, 0x39, 0x31, 0x36, 0x34, 0x408006e8, 0x39, 0x40800b58, 0x404008db, 0x37, 0x32, 0x32, 0x40400321, 0x35, 0x404008a4, 0x40400141, 0x39, 0x31, 0x30, 0x404000bc, 0x40400c5b, 0x35, 0x32, 0x38, 0x30, 0x31, 0x37, 0x40400231, 0x37, 0x31, 0x32, 0x40400914, 0x38, 0x33, 0x32, 0x40400373, 0x31, 0x40400589, 0x30, 0x39, 0x33, 0x35, 0x33, 0x39, 0x36, 0x35, 0x37, 0x4040064b, 0x31, 0x30, 0x38, 0x33, 0x40400069, 0x35, 0x31, 0x4040077a, 0x40400d5a, 0x31, 0x34, 0x34, 0x34, 0x32, 0x31, 0x30, 0x30, 0x40400202, 0x30, 0x33, 0x4040019c, 0x31, 0x31, 0x30, 0x33, 0x40400c81, 0x40400009, 0x40400026, 0x40c00602, 0x35, 0x31, 0x36, 0x404005d9, 0x40800883, 0x4040092a, 0x35, 0x40800c42, 0x38, 0x35, 0x31, 0x37, 0x31, 0x34, 0x33, 0x37, 0x40400605, 0x4040006d, 0x31, 0x35, 0x35, 0x36, 0x35, 0x30, 0x38, 0x38, 0x404003b9, 0x39, 0x38, 0x39, 0x38, 0x35, 0x39, 0x39, 0x38, 0x32, 0x33, 0x38, 0x404001cf, 0x404009ba, 0x33, 0x4040016c, 0x4040043e, 0x404009c3, 0x38, 0x40800e05, 0x33, 0x32, 0x40400107, 0x35, 0x40400305, 0x33, 0x404001ca, 0x39, 0x4040041b, 0x39, 0x38, 0x4040087d, 0x34, 0x40400cb8, 0x37, 0x4040064b, 0x30, 0x37, 0x404000e5, 0x34, 0x38, 0x31, 0x34, 0x31, 0x40400539, 0x38, 0x35, 0x39, 0x34, 0x36, 0x31, 0x40400bc9, 0x38, 0x30}, + }, + { + input: "testdata/huffman-rand-1k.in", + want: "testdata/huffman-rand-1k.%s.expect", + wantNoInput: "testdata/huffman-rand-1k.%s.expect-noinput", + tokens: []token{0xf8, 0x8b, 0x96, 0x76, 0x48, 0xd, 0x85, 0x94, 0x25, 0x80, 0xaf, 0xc2, 0xfe, 0x8d, 0xe8, 0x20, 0xeb, 0x17, 0x86, 0xc9, 0xb7, 0xc5, 0xde, 0x6, 0xea, 0x7d, 0x18, 0x8b, 0xe7, 0x3e, 0x7, 0xda, 0xdf, 0xff, 0x6c, 0x73, 0xde, 0xcc, 0xe7, 0x6d, 0x8d, 0x4, 0x19, 0x49, 0x7f, 0x47, 0x1f, 0x48, 0x15, 0xb0, 0xe8, 0x9e, 0xf2, 0x31, 0x59, 0xde, 0x34, 0xb4, 0x5b, 0xe5, 0xe0, 0x9, 0x11, 0x30, 0xc2, 0x88, 0x5b, 0x7c, 0x5d, 0x14, 0x13, 0x6f, 0x23, 0xa9, 0xd, 0xbc, 0x2d, 0x23, 0xbe, 0xd9, 0xed, 0x75, 0x4, 0x6c, 0x99, 0xdf, 0xfd, 0x70, 0x66, 0xe6, 0xee, 0xd9, 0xb1, 0x9e, 0x6e, 0x83, 0x59, 0xd5, 0xd4, 0x80, 0x59, 0x98, 0x77, 0x89, 0x43, 0x38, 0xc9, 0xaf, 0x30, 0x32, 0x9a, 0x20, 0x1b, 0x46, 0x3d, 0x67, 0x6e, 0xd7, 0x72, 0x9e, 0x4e, 0x21, 0x4f, 0xc6, 0xe0, 0xd4, 0x7b, 0x4, 0x8d, 0xa5, 0x3, 0xf6, 0x5, 0x9b, 0x6b, 0xdc, 0x2a, 0x93, 0x77, 0x28, 0xfd, 0xb4, 0x62, 0xda, 0x20, 0xe7, 0x1f, 0xab, 0x6b, 0x51, 0x43, 0x39, 0x2f, 0xa0, 0x92, 0x1, 0x6c, 0x75, 0x3e, 0xf4, 0x35, 0xfd, 0x43, 0x2e, 0xf7, 0xa4, 0x75, 0xda, 0xea, 0x9b, 0xa, 0x64, 0xb, 0xe0, 0x23, 0x29, 0xbd, 0xf7, 0xe7, 0x83, 0x3c, 0xfb, 0xdf, 0xb3, 0xae, 0x4f, 0xa4, 0x47, 0x55, 0x99, 0xde, 0x2f, 0x96, 0x6e, 0x1c, 0x43, 0x4c, 0x87, 0xe2, 0x7c, 0xd9, 0x5f, 0x4c, 0x7c, 0xe8, 0x90, 0x3, 0xdb, 0x30, 0x95, 0xd6, 0x22, 0xc, 0x47, 0xb8, 0x4d, 0x6b, 0xbd, 0x24, 0x11, 0xab, 0x2c, 0xd7, 0xbe, 0x6e, 0x7a, 0xd6, 0x8, 0xa3, 0x98, 0xd8, 0xdd, 0x15, 0x6a, 0xfa, 0x93, 0x30, 0x1, 0x25, 0x1d, 0xa2, 0x74, 0x86, 0x4b, 0x6a, 0x95, 0xe8, 0xe1, 0x4e, 0xe, 0x76, 0xb9, 0x49, 0xa9, 0x5f, 0xa0, 0xa6, 0x63, 0x3c, 0x7e, 0x7e, 0x20, 0x13, 0x4f, 0xbb, 0x66, 0x92, 0xb8, 0x2e, 0xa4, 0xfa, 0x48, 0xcb, 0xae, 0xb9, 0x3c, 0xaf, 0xd3, 0x1f, 0xe1, 0xd5, 0x8d, 0x42, 0x6d, 0xf0, 0xfc, 0x8c, 0xc, 0x0, 0xde, 0x40, 0xab, 0x8b, 0x47, 0x97, 0x4e, 0xa8, 0xcf, 0x8e, 0xdb, 0xa6, 0x8b, 0x20, 0x9, 0x84, 0x7a, 0x66, 0xe5, 0x98, 0x29, 0x2, 0x95, 0xe6, 0x38, 0x32, 0x60, 0x3, 0xe3, 0x9a, 0x1e, 0x54, 0xe8, 0x63, 0x80, 0x48, 0x9c, 0xe7, 0x63, 0x33, 0x6e, 0xa0, 0x65, 0x83, 0xfa, 0xc6, 0xba, 0x7a, 0x43, 0x71, 0x5, 0xf5, 0x68, 0x69, 0x85, 0x9c, 0xba, 0x45, 0xcd, 0x6b, 0xb, 0x19, 0xd1, 0xbb, 0x7f, 0x70, 0x85, 0x92, 0xd1, 0xb4, 0x64, 0x82, 0xb1, 0xe4, 0x62, 0xc5, 0x3c, 0x46, 0x1f, 0x92, 0x31, 0x1c, 0x4e, 0x41, 0x77, 0xf7, 0xe7, 0x87, 0xa2, 0xf, 0x6e, 0xe8, 0x92, 0x3, 0x6b, 0xa, 0xe7, 0xa9, 0x3b, 0x11, 0xda, 0x66, 0x8a, 0x29, 0xda, 0x79, 0xe1, 0x64, 0x8d, 0xe3, 0x54, 0xd4, 0xf5, 0xef, 0x64, 0x87, 0x3b, 0xf4, 0xc2, 0xf4, 0x71, 0x13, 0xa9, 0xe9, 0xe0, 0xa2, 0x6, 0x14, 0xab, 0x5d, 0xa7, 0x96, 0x0, 0xd6, 0xc3, 0xcc, 0x57, 0xed, 0x39, 0x6a, 0x25, 0xcd, 0x76, 0xea, 0xba, 0x3a, 0xf2, 0xa1, 0x95, 0x5d, 0xe5, 0x71, 0xcf, 0x9c, 0x62, 0x9e, 0x6a, 0xfa, 0xd5, 0x31, 0xd1, 0xa8, 0x66, 0x30, 0x33, 0xaa, 0x51, 0x17, 0x13, 0x82, 0x99, 0xc8, 0x14, 0x60, 0x9f, 0x4d, 0x32, 0x6d, 0xda, 0x19, 0x26, 0x21, 0xdc, 0x7e, 0x2e, 0x25, 0x67, 0x72, 0xca, 0xf, 0x92, 0xcd, 0xf6, 0xd6, 0xcb, 0x97, 0x8a, 0x33, 0x58, 0x73, 0x70, 0x91, 0x1d, 0xbf, 0x28, 0x23, 0xa3, 0xc, 0xf1, 0x83, 0xc3, 0xc8, 0x56, 0x77, 0x68, 0xe3, 0x82, 0xba, 0xb9, 0x57, 0x56, 0x57, 0x9c, 0xc3, 0xd6, 0x14, 0x5, 0x3c, 0xb1, 0xaf, 0x93, 0xc8, 0x8a, 0x57, 0x7f, 0x53, 0xfa, 0x2f, 0xaa, 0x6e, 0x66, 0x83, 0xfa, 0x33, 0xd1, 0x21, 0xab, 0x1b, 0x71, 0xb4, 0x7c, 0xda, 0xfd, 0xfb, 0x7f, 0x20, 0xab, 0x5e, 0xd5, 0xca, 0xfd, 0xdd, 0xe0, 0xee, 0xda, 0xba, 0xa8, 0x27, 0x99, 0x97, 0x69, 0xc1, 0x3c, 0x82, 0x8c, 0xa, 0x5c, 0x2d, 0x5b, 0x88, 0x3e, 0x34, 0x35, 0x86, 0x37, 0x46, 0x79, 0xe1, 0xaa, 0x19, 0xfb, 0xaa, 0xde, 0x15, 0x9, 0xd, 0x1a, 0x57, 0xff, 0xb5, 0xf, 0xf3, 0x2b, 0x5a, 0x6a, 0x4d, 0x19, 0x77, 0x71, 0x45, 0xdf, 0x4f, 0xb3, 0xec, 0xf1, 0xeb, 0x18, 0x53, 0x3e, 0x3b, 0x47, 0x8, 0x9a, 0x73, 0xa0, 0x5c, 0x8c, 0x5f, 0xeb, 0xf, 0x3a, 0xc2, 0x43, 0x67, 0xb4, 0x66, 0x67, 0x80, 0x58, 0xe, 0xc1, 0xec, 0x40, 0xd4, 0x22, 0x94, 0xca, 0xf9, 0xe8, 0x92, 0xe4, 0x69, 0x38, 0xbe, 0x67, 0x64, 0xca, 0x50, 0xc7, 0x6, 0x67, 0x42, 0x6e, 0xa3, 0xf0, 0xb7, 0x6c, 0xf2, 0xe8, 0x5f, 0xb1, 0xaf, 0xe7, 0xdb, 0xbb, 0x77, 0xb5, 0xf8, 0xcb, 0x8, 0xc4, 0x75, 0x7e, 0xc0, 0xf9, 0x1c, 0x7f, 0x3c, 0x89, 0x2f, 0xd2, 0x58, 0x3a, 0xe2, 0xf8, 0x91, 0xb6, 0x7b, 0x24, 0x27, 0xe9, 0xae, 0x84, 0x8b, 0xde, 0x74, 0xac, 0xfd, 0xd9, 0xb7, 0x69, 0x2a, 0xec, 0x32, 0x6f, 0xf0, 0x92, 0x84, 0xf1, 0x40, 0xc, 0x8a, 0xbc, 0x39, 0x6e, 0x2e, 0x73, 0xd4, 0x6e, 0x8a, 0x74, 0x2a, 0xdc, 0x60, 0x1f, 0xa3, 0x7, 0xde, 0x75, 0x8b, 0x74, 0xc8, 0xfe, 0x63, 0x75, 0xf6, 0x3d, 0x63, 0xac, 0x33, 0x89, 0xc3, 0xf0, 0xf8, 0x2d, 0x6b, 0xb4, 0x9e, 0x74, 0x8b, 0x5c, 0x33, 0xb4, 0xca, 0xa8, 0xe4, 0x99, 0xb6, 0x90, 0xa1, 0xef, 0xf, 0xd3, 0x61, 0xb2, 0xc6, 0x1a, 0x94, 0x7c, 0x44, 0x55, 0xf4, 0x45, 0xff, 0x9e, 0xa5, 0x5a, 0xc6, 0xa0, 0xe8, 0x2a, 0xc1, 0x8d, 0x6f, 0x34, 0x11, 0xb9, 0xbe, 0x4e, 0xd9, 0x87, 0x97, 0x73, 0xcf, 0x3d, 0x23, 0xae, 0xd5, 0x1a, 0x5e, 0xae, 0x5d, 0x6a, 0x3, 0xf9, 0x22, 0xd, 0x10, 0xd9, 0x47, 0x69, 0x15, 0x3f, 0xee, 0x52, 0xa3, 0x8, 0xd2, 0x3c, 0x51, 0xf4, 0xf8, 0x9d, 0xe4, 0x98, 0x89, 0xc8, 0x67, 0x39, 0xd5, 0x5e, 0x35, 0x78, 0x27, 0xe8, 0x3c, 0x80, 0xae, 0x79, 0x71, 0xd2, 0x93, 0xf4, 0xaa, 0x51, 0x12, 0x1c, 0x4b, 0x1b, 0xe5, 0x6e, 0x15, 0x6f, 0xe4, 0xbb, 0x51, 0x9b, 0x45, 0x9f, 0xf9, 0xc4, 0x8c, 0x2a, 0xfb, 0x1a, 0xdf, 0x55, 0xd3, 0x48, 0x93, 0x27, 0x1, 0x26, 0xc2, 0x6b, 0x55, 0x6d, 0xa2, 0xfb, 0x84, 0x8b, 0xc9, 0x9e, 0x28, 0xc2, 0xef, 0x1a, 0x24, 0xec, 0x9b, 0xae, 0xbd, 0x60, 0xe9, 0x15, 0x35, 0xee, 0x42, 0xa4, 0x33, 0x5b, 0xfa, 0xf, 0xb6, 0xf7, 0x1, 0xa6, 0x2, 0x4c, 0xca, 0x90, 0x58, 0x3a, 0x96, 0x41, 0xe7, 0xcb, 0x9, 0x8c, 0xdb, 0x85, 0x4d, 0xa8, 0x89, 0xf3, 0xb5, 0x8e, 0xfd, 0x75, 0x5b, 0x4f, 0xed, 0xde, 0x3f, 0xeb, 0x38, 0xa3, 0xbe, 0xb0, 0x73, 0xfc, 0xb8, 0x54, 0xf7, 0x4c, 0x30, 0x67, 0x2e, 0x38, 0xa2, 0x54, 0x18, 0xba, 0x8, 0xbf, 0xf2, 0x39, 0xd5, 0xfe, 0xa5, 0x41, 0xc6, 0x66, 0x66, 0xba, 0x81, 0xef, 0x67, 0xe4, 0xe6, 0x3c, 0xc, 0xca, 0xa4, 0xa, 0x79, 0xb3, 0x57, 0x8b, 0x8a, 0x75, 0x98, 0x18, 0x42, 0x2f, 0x29, 0xa3, 0x82, 0xef, 0x9f, 0x86, 0x6, 0x23, 0xe1, 0x75, 0xfa, 0x8, 0xb1, 0xde, 0x17, 0x4a}, + }, + { + input: "testdata/huffman-rand-limit.in", + want: "testdata/huffman-rand-limit.%s.expect", + wantNoInput: "testdata/huffman-rand-limit.%s.expect-noinput", + tokens: []token{0x61, 0x51c00000, 0xa, 0xf8, 0x8b, 0x96, 0x76, 0x48, 0xa, 0x85, 0x94, 0x25, 0x80, 0xaf, 0xc2, 0xfe, 0x8d, 0xe8, 0x20, 0xeb, 0x17, 0x86, 0xc9, 0xb7, 0xc5, 0xde, 0x6, 0xea, 0x7d, 0x18, 0x8b, 0xe7, 0x3e, 0x7, 0xda, 0xdf, 0xff, 0x6c, 0x73, 0xde, 0xcc, 0xe7, 0x6d, 0x8d, 0x4, 0x19, 0x49, 0x7f, 0x47, 0x1f, 0x48, 0x15, 0xb0, 0xe8, 0x9e, 0xf2, 0x31, 0x59, 0xde, 0x34, 0xb4, 0x5b, 0xe5, 0xe0, 0x9, 0x11, 0x30, 0xc2, 0x88, 0x5b, 0x7c, 0x5d, 0x14, 0x13, 0x6f, 0x23, 0xa9, 0xa, 0xbc, 0x2d, 0x23, 0xbe, 0xd9, 0xed, 0x75, 0x4, 0x6c, 0x99, 0xdf, 0xfd, 0x70, 0x66, 0xe6, 0xee, 0xd9, 0xb1, 0x9e, 0x6e, 0x83, 0x59, 0xd5, 0xd4, 0x80, 0x59, 0x98, 0x77, 0x89, 0x43, 0x38, 0xc9, 0xaf, 0x30, 0x32, 0x9a, 0x20, 0x1b, 0x46, 0x3d, 0x67, 0x6e, 0xd7, 0x72, 0x9e, 0x4e, 0x21, 0x4f, 0xc6, 0xe0, 0xd4, 0x7b, 0x4, 0x8d, 0xa5, 0x3, 0xf6, 0x5, 0x9b, 0x6b, 0xdc, 0x2a, 0x93, 0x77, 0x28, 0xfd, 0xb4, 0x62, 0xda, 0x20, 0xe7, 0x1f, 0xab, 0x6b, 0x51, 0x43, 0x39, 0x2f, 0xa0, 0x92, 0x1, 0x6c, 0x75, 0x3e, 0xf4, 0x35, 0xfd, 0x43, 0x2e, 0xf7, 0xa4, 0x75, 0xda, 0xea, 0x9b, 0xa}, + }, + { + input: "testdata/huffman-shifts.in", + want: "testdata/huffman-shifts.%s.expect", + wantNoInput: "testdata/huffman-shifts.%s.expect-noinput", + tokens: []token{0x31, 0x30, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x52400001, 0xd, 0xa, 0x32, 0x33, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7fc00001, 0x7f400001}, + }, + { + input: "testdata/huffman-text-shift.in", + want: "testdata/huffman-text-shift.%s.expect", + wantNoInput: "testdata/huffman-text-shift.%s.expect-noinput", + tokens: []token{0x2f, 0x2f, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x32, 0x30, 0x30, 0x39, 0x54, 0x68, 0x47, 0x6f, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x2e, 0x41, 0x6c, 0x6c, 0x40800016, 0x72, 0x72, 0x76, 0x64, 0x2e, 0xd, 0xa, 0x2f, 0x2f, 0x55, 0x6f, 0x66, 0x74, 0x68, 0x69, 0x6f, 0x75, 0x72, 0x63, 0x63, 0x6f, 0x64, 0x69, 0x67, 0x6f, 0x76, 0x72, 0x6e, 0x64, 0x62, 0x79, 0x42, 0x53, 0x44, 0x2d, 0x74, 0x79, 0x6c, 0x40400020, 0x6c, 0x69, 0x63, 0x6e, 0x74, 0x68, 0x74, 0x63, 0x6e, 0x62, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x74, 0x68, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x66, 0x69, 0x6c, 0x2e, 0xd, 0xa, 0xd, 0xa, 0x70, 0x63, 0x6b, 0x67, 0x6d, 0x69, 0x6e, 0x4040000a, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x6f, 0x22, 0x4040000c, 0x66, 0x75, 0x6e, 0x63, 0x6d, 0x69, 0x6e, 0x28, 0x29, 0x7b, 0xd, 0xa, 0x9, 0x76, 0x72, 0x62, 0x3d, 0x6d, 0x6b, 0x28, 0x5b, 0x5d, 0x62, 0x79, 0x74, 0x2c, 0x36, 0x35, 0x35, 0x33, 0x35, 0x29, 0xd, 0xa, 0x9, 0x66, 0x2c, 0x5f, 0x3a, 0x3d, 0x6f, 0x2e, 0x43, 0x72, 0x74, 0x28, 0x22, 0x68, 0x75, 0x66, 0x66, 0x6d, 0x6e, 0x2d, 0x6e, 0x75, 0x6c, 0x6c, 0x2d, 0x6d, 0x78, 0x2e, 0x69, 0x6e, 0x22, 0x40800021, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x28, 0x62, 0x29, 0xd, 0xa, 0x7d, 0xd, 0xa, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x58, 0x78, 0x79, 0x7a, 0x21, 0x22, 0x23, 0xc2, 0xa4, 0x25, 0x26, 0x2f, 0x3f, 0x22}, + }, + { + input: "testdata/huffman-text.in", + want: "testdata/huffman-text.%s.expect", + wantNoInput: "testdata/huffman-text.%s.expect-noinput", + tokens: []token{0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x4080001e, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0xd, 0xa, 0x2f, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x42, 0x53, 0x44, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x40800036, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0xd, 0xa, 0xd, 0xa, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x4040000f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x22, 0x6f, 0x73, 0x22, 0x4040000e, 0x66, 0x75, 0x6e, 0x63, 0x4080001b, 0x28, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x9, 0x76, 0x61, 0x72, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x28, 0x5b, 0x5d, 0x62, 0x79, 0x74, 0x65, 0x2c, 0x20, 0x36, 0x35, 0x35, 0x33, 0x35, 0x29, 0xd, 0xa, 0x9, 0x66, 0x2c, 0x20, 0x5f, 0x20, 0x3a, 0x3d, 0x20, 0x6f, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x22, 0x68, 0x75, 0x66, 0x66, 0x6d, 0x61, 0x6e, 0x2d, 0x6e, 0x75, 0x6c, 0x6c, 0x2d, 0x6d, 0x61, 0x78, 0x2e, 0x69, 0x6e, 0x22, 0x4080002a, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x28, 0x62, 0x29, 0xd, 0xa, 0x7d, 0xd, 0xa}, + }, + { + input: "testdata/huffman-zero.in", + want: "testdata/huffman-zero.%s.expect", + wantNoInput: "testdata/huffman-zero.%s.expect-noinput", + tokens: []token{0x30, ml, 0x4b800000}, + }, + { + input: "", + want: "", + wantNoInput: "testdata/null-long-match.%s.expect-noinput", + tokens: []token{0x0, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, 0x41400000}, + }, +} + +// TestWriteBlock tests if the writeBlock encoding has changed. +// To update the reference files use the "-update" flag on the test. +func TestWriteBlock(t *testing.T) { + for _, test := range writeBlockTests { + testBlock(t, test, "wb") + } +} + +// TestWriteBlockDynamic tests if the writeBlockDynamic encoding has changed. +// To update the reference files use the "-update" flag on the test. +func TestWriteBlockDynamic(t *testing.T) { + for _, test := range writeBlockTests { + testBlock(t, test, "dyn") + } +} + +// testBlock tests a block against its references, +// or regenerate the references, if "-update" flag is set. +func testBlock(t *testing.T, test huffTest, ttype string) { + if test.want != "" { + test.want = fmt.Sprintf(test.want, ttype) + } + test.wantNoInput = fmt.Sprintf(test.wantNoInput, ttype) + if *update { + if test.input != "" { + t.Logf("Updating %q", test.want) + input, err := ioutil.ReadFile(test.input) + if err != nil { + t.Error(err) + return + } + + f, err := os.Create(test.want) + if err != nil { + t.Error(err) + return + } + defer f.Close() + bw := newHuffmanBitWriter(f) + writeToType(t, ttype, bw, test.tokens, input) + } + + t.Logf("Updating %q", test.wantNoInput) + f, err := os.Create(test.wantNoInput) + if err != nil { + t.Error(err) + return + } + defer f.Close() + bw := newHuffmanBitWriter(f) + writeToType(t, ttype, bw, test.tokens, nil) + return + } + + if test.input != "" { + t.Logf("Testing %q", test.want) + input, err := ioutil.ReadFile(test.input) + if err != nil { + t.Error(err) + return + } + want, err := ioutil.ReadFile(test.want) + if err != nil { + t.Error(err) + return + } + var buf bytes.Buffer + bw := newHuffmanBitWriter(&buf) + writeToType(t, ttype, bw, test.tokens, input) + + got := buf.Bytes() + if !bytes.Equal(got, want) { + t.Errorf("writeBlock did not yield expected result for file %q with input. See %q", test.want, test.want+".got") + if err := ioutil.WriteFile(test.want+".got", got, 0666); err != nil { + t.Error(err) + } + } + t.Log("Output ok") + + // Test if the writer produces the same output after reset. + buf.Reset() + bw.reset(&buf) + writeToType(t, ttype, bw, test.tokens, input) + bw.flush() + got = buf.Bytes() + if !bytes.Equal(got, want) { + t.Errorf("reset: writeBlock did not yield expected result for file %q with input. See %q", test.want, test.want+".reset.got") + if err := ioutil.WriteFile(test.want+".reset.got", got, 0666); err != nil { + t.Error(err) + } + return + } + t.Log("Reset ok") + testWriterEOF(t, "wb", test, true) + } + t.Logf("Testing %q", test.wantNoInput) + wantNI, err := ioutil.ReadFile(test.wantNoInput) + if err != nil { + t.Error(err) + return + } + var buf bytes.Buffer + bw := newHuffmanBitWriter(&buf) + writeToType(t, ttype, bw, test.tokens, nil) + + got := buf.Bytes() + if !bytes.Equal(got, wantNI) { + t.Errorf("writeBlock did not yield expected result for file %q with input. See %q", test.wantNoInput, test.wantNoInput+".got") + if err := ioutil.WriteFile(test.want+".got", got, 0666); err != nil { + t.Error(err) + } + } else if got[0]&1 == 1 { + t.Error("got unexpected EOF") + return + } + + t.Log("Output ok") + + // Test if the writer produces the same output after reset. + buf.Reset() + bw.reset(&buf) + writeToType(t, ttype, bw, test.tokens, nil) + bw.flush() + got = buf.Bytes() + if !bytes.Equal(got, wantNI) { + t.Errorf("reset: writeBlock did not yield expected result for file %q without input. See %q", test.want, test.want+".reset.got") + if err := ioutil.WriteFile(test.want+".reset.got", got, 0666); err != nil { + t.Error(err) + } + return + } + t.Log("Reset ok") + testWriterEOF(t, "wb", test, false) +} + +func writeToType(t *testing.T, ttype string, bw *huffmanBitWriter, tok []token, input []byte) { + switch ttype { + case "wb": + bw.writeBlock(tok, false, input) + case "dyn": + bw.writeBlockDynamic(tok, false, input) + default: + panic("unknown test type") + } + + if bw.err != nil { + t.Error(bw.err) + return + } + + bw.flush() + if bw.err != nil { + t.Error(bw.err) + return + } +} + +// testWriterEOF tests if the written block contains an EOF marker. +func testWriterEOF(t *testing.T, ttype string, test huffTest, useInput bool) { + if useInput && test.input == "" { + return + } + var input []byte + if useInput { + var err error + input, err = ioutil.ReadFile(test.input) + if err != nil { + t.Error(err) + return + } + } + var buf bytes.Buffer + bw := newHuffmanBitWriter(&buf) + switch ttype { + case "wb": + bw.writeBlock(test.tokens, true, input) + case "dyn": + bw.writeBlockDynamic(test.tokens, true, input) + case "huff": + bw.writeBlockHuff(true, input) + default: + panic("unknown test type") + } + if bw.err != nil { + t.Error(bw.err) + return + } + + bw.flush() + if bw.err != nil { + t.Error(bw.err) + return + } + b := buf.Bytes() + if len(b) == 0 { + t.Error("no output received") + return + } + if b[0]&1 != 1 { + t.Errorf("block not marked with EOF for input %q", test.input) + return + } + t.Log("EOF ok") +} diff --git a/src/compress/flate/huffman_code.go b/src/compress/flate/huffman_code.go index 1a4de12dd6e..b0328c6e08a 100644 --- a/src/compress/flate/huffman_code.go +++ b/src/compress/flate/huffman_code.go @@ -9,9 +9,17 @@ import ( "sort" ) +// hcode is a huffman code with a bit code and bit length. +type hcode struct { + code, len uint16 +} + type huffmanEncoder struct { - codeBits []uint8 - code []uint16 + codes []hcode + freqcache []literalNode + bitCount [17]int32 + lns byLiteral // stored to avoid repeated allocation in generate + lfs byFreq // stored to avoid repeated allocation in generate } type literalNode struct { @@ -39,21 +47,26 @@ type levelInfo struct { needed int32 } +// set sets the code and length of an hcode. +func (h *hcode) set(code uint16, length uint16) { + h.len = length + h.code = code +} + func maxNode() literalNode { return literalNode{math.MaxUint16, math.MaxInt32} } func newHuffmanEncoder(size int) *huffmanEncoder { - return &huffmanEncoder{make([]uint8, size), make([]uint16, size)} + return &huffmanEncoder{codes: make([]hcode, size)} } // Generates a HuffmanCode corresponding to the fixed literal table func generateFixedLiteralEncoding() *huffmanEncoder { h := newHuffmanEncoder(maxNumLit) - codeBits := h.codeBits - code := h.code + codes := h.codes var ch uint16 for ch = 0; ch < maxNumLit; ch++ { var bits uint16 - var size uint8 + var size uint16 switch { case ch < 144: // size 8, 000110000 .. 10111111 @@ -75,19 +88,16 @@ func generateFixedLiteralEncoding() *huffmanEncoder { bits = ch + 192 - 280 size = 8 } - codeBits[ch] = size - code[ch] = reverseBits(bits, size) + codes[ch] = hcode{code: reverseBits(bits, byte(size)), len: size} } return h } func generateFixedOffsetEncoding() *huffmanEncoder { h := newHuffmanEncoder(30) - codeBits := h.codeBits - code := h.code + codes := h.codes for ch := uint16(0); ch < 30; ch++ { - codeBits[ch] = 5 - code[ch] = reverseBits(ch, 5) + codes[ch] = hcode{code: reverseBits(ch, 5), len: 5} } return h } @@ -99,7 +109,7 @@ func (h *huffmanEncoder) bitLength(freq []int32) int64 { var total int64 for i, f := range freq { if f != 0 { - total += int64(f) * int64(h.codeBits[i]) + total += int64(f) * int64(h.codes[i].len) } } return total @@ -220,7 +230,7 @@ func (h *huffmanEncoder) bitCounts(list []literalNode, maxBits int32) []int32 { panic("leafCounts[maxBits][maxBits] != n") } - bitCount := make([]int32, maxBits+1) + bitCount := h.bitCount[:maxBits+1] bits := 1 counts := &leafCounts[maxBits] for level := maxBits; level > 0; level-- { @@ -246,10 +256,10 @@ func (h *huffmanEncoder) assignEncodingAndSize(bitCount []int32, list []literalN // code, code + 1, .... The code values are // assigned in literal order (not frequency order). chunk := list[len(list)-int(bits):] - sortByLiteral(chunk) + + h.lns.sort(chunk) for _, node := range chunk { - h.codeBits[node.literal] = uint8(n) - h.code[node.literal] = reverseBits(code, uint8(n)) + h.codes[node.literal] = hcode{code: reverseBits(code, uint8(n)), len: uint16(n)} code++ } list = list[0 : len(list)-int(bits)] @@ -261,7 +271,13 @@ func (h *huffmanEncoder) assignEncodingAndSize(bitCount []int32, list []literalN // freq An array of frequencies, in which frequency[i] gives the frequency of literal i. // maxBits The maximum number of bits to use for any literal. func (h *huffmanEncoder) generate(freq []int32, maxBits int32) { - list := make([]literalNode, len(freq)+1) + if h.freqcache == nil { + // Allocate a reusable buffer with the longest possible frequency table. + // Possible lengths are codegenCodeCount, offsetCodeCount and maxNumLit. + // The largest of these is maxNumLit, so we allocate for that case. + h.freqcache = make([]literalNode, maxNumLit+1) + } + list := h.freqcache[:len(freq)+1] // Number of non-zero literals count := 0 // Set list to be the set of all non-zero literals and their frequencies @@ -270,23 +286,23 @@ func (h *huffmanEncoder) generate(freq []int32, maxBits int32) { list[count] = literalNode{uint16(i), f} count++ } else { - h.codeBits[i] = 0 + list[count] = literalNode{} + h.codes[i].len = 0 } } - // If freq[] is shorter than codeBits[], fill rest of codeBits[] with zeros - h.codeBits = h.codeBits[0:len(freq)] - list = list[0:count] + list[len(freq)] = literalNode{} + + list = list[:count] if count <= 2 { // Handle the small cases here, because they are awkward for the general case code. With // two or fewer literals, everything has bit length 1. for i, node := range list { // "list" is in order of increasing literal value. - h.codeBits[node.literal] = 1 - h.code[node.literal] = uint16(i) + h.codes[node.literal].set(uint16(i), 1) } return } - sortByFreq(list) + h.lfs.sort(list) // Get the number of literals for each bit count bitCount := h.bitCounts(list, maxBits) @@ -294,30 +310,35 @@ func (h *huffmanEncoder) generate(freq []int32, maxBits int32) { h.assignEncodingAndSize(bitCount, list) } -type literalNodeSorter struct { - a []literalNode - less func(i, j int) bool -} +type byLiteral []literalNode -func (s literalNodeSorter) Len() int { return len(s.a) } - -func (s literalNodeSorter) Less(i, j int) bool { - return s.less(i, j) -} - -func (s literalNodeSorter) Swap(i, j int) { s.a[i], s.a[j] = s.a[j], s.a[i] } - -func sortByFreq(a []literalNode) { - s := &literalNodeSorter{a, func(i, j int) bool { - if a[i].freq == a[j].freq { - return a[i].literal < a[j].literal - } - return a[i].freq < a[j].freq - }} +func (s *byLiteral) sort(a []literalNode) { + *s = byLiteral(a) sort.Sort(s) } -func sortByLiteral(a []literalNode) { - s := &literalNodeSorter{a, func(i, j int) bool { return a[i].literal < a[j].literal }} +func (s byLiteral) Len() int { return len(s) } + +func (s byLiteral) Less(i, j int) bool { + return s[i].literal < s[j].literal +} + +func (s byLiteral) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +type byFreq []literalNode + +func (s *byFreq) sort(a []literalNode) { + *s = byFreq(a) sort.Sort(s) } + +func (s byFreq) Len() int { return len(s) } + +func (s byFreq) Less(i, j int) bool { + if s[i].freq == s[j].freq { + return s[i].literal < s[j].literal + } + return s[i].freq < s[j].freq +} + +func (s byFreq) Swap(i, j int) { s[i], s[j] = s[j], s[i] } diff --git a/src/compress/flate/testdata/huffman-null-max.dyn.expect b/src/compress/flate/testdata/huffman-null-max.dyn.expect new file mode 100644 index 0000000000000000000000000000000000000000..c08165143f2c570013c4916cbac5addfe9622a55 GIT binary patch literal 78 ZcmaEJppgLx8W#LrDZUcKq5v#l0|1+Y23i0B literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-null-max.dyn.expect-noinput b/src/compress/flate/testdata/huffman-null-max.dyn.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..c08165143f2c570013c4916cbac5addfe9622a55 GIT binary patch literal 78 ZcmaEJppgLx8W#LrDZUcKq5v#l0|1+Y23i0B literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-null-max.golden b/src/compress/flate/testdata/huffman-null-max.golden new file mode 100644 index 0000000000000000000000000000000000000000..db422ca3983d12e71e31979d7b3dddd080dcbca7 GIT binary patch literal 8204 zcmeIuK@9*P3YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ t0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFwg)F00961 literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-null-max.wb.expect b/src/compress/flate/testdata/huffman-null-max.wb.expect new file mode 100644 index 0000000000000000000000000000000000000000..c08165143f2c570013c4916cbac5addfe9622a55 GIT binary patch literal 78 ZcmaEJppgLx8W#LrDZUcKq5v#l0|1+Y23i0B literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-null-max.wb.expect-noinput b/src/compress/flate/testdata/huffman-null-max.wb.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..c08165143f2c570013c4916cbac5addfe9622a55 GIT binary patch literal 78 ZcmaEJppgLx8W#LrDZUcKq5v#l0|1+Y23i0B literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-pi.dyn.expect b/src/compress/flate/testdata/huffman-pi.dyn.expect new file mode 100644 index 0000000000000000000000000000000000000000..e4396ac6fe5e34609ccb7ea0bc359e6adb48c7f4 GIT binary patch literal 1696 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 EAEW(DiU0rr literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-pi.in b/src/compress/flate/testdata/huffman-pi.in new file mode 100644 index 00000000000..efaed43431a --- /dev/null +++ b/src/compress/flate/testdata/huffman-pi.in @@ -0,0 +1 @@ +3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203496252451749399651431429809190659250937221696461515709858387410597885959772975498930161753928468138268683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506016842739452267467678895252138522549954666727823986456596116354886230577456498035593634568174324112515076069479451096596094025228879710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364542858444795265867821051141354735739523113427166102135969536231442952484937187110145765403590279934403742007310578539062198387447808478489683321445713868751943506430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180 \ No newline at end of file diff --git a/src/compress/flate/testdata/huffman-pi.wb.expect b/src/compress/flate/testdata/huffman-pi.wb.expect new file mode 100644 index 0000000000000000000000000000000000000000..e4396ac6fe5e34609ccb7ea0bc359e6adb48c7f4 GIT binary patch literal 1696 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 Yxt^P)DKm4sCRYuzNKydW#Fu~kAGX;UBLDyZ literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-1k.dyn.expect-noinput b/src/compress/flate/testdata/huffman-rand-1k.dyn.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..0c24742fde2487e3a454ec3364f15e541693c37c GIT binary patch literal 1054 zcmV+(1mXJxzzaAU2mk=!nayIXbMy_f)7H$mL&SF;F?3`%k8@)&&%@Oe(UOiioadDG zS>BI}35WJ&PF@*1*&LbA=aF5pFj3x*HIFRrKcto>d1~bp8)vlgPG~al`sLh_uD4>f zwcquqQs)bz`O{dU_?0E5ZyfOj3vL$R|;Io1R(-}eKi+pE+?-hv`IeFsDFRE4SU5j~y=5(3C6?qYw^br64(dswwJMG1iwh9bz5{6%{CK{d z?OTrws1RG0;tdgAc^^}S;a;h-Le*Jl$;@?4WVbi2?}j$(yZ8P0lo@^JyA?I@?GEt7oU6m&;AhmaN!WN2o4Ue&a8T%J8g~M#1p4zh)_hxG4z2`Ogny za;mxRW4Md@6TRsPIrIrmbY`0*@-5uMh;C)*<4Qh|=G6i5GP){GL)z@9EkaXFMahfN zv?c%P&)d;?j&h!ypwqm%P^YHL3jM3}%*^0B)TTYwcr0m+>#+B{By^cDULDE6Dg;&& zO=u{r#qY9CX2q~>M2)v~oJjxXwYfA4W6UEykUq9QGg?N01rigUU44BE!qnW&8XUe) zez=s$?Lpl~RS(YSo`<)!77bHS>Gu?tEqHX60yc4tb%nr56)BI?!K^R=U-@BSOT=w5 zsVIvXfM*tHgqR0EakjC|{oW&au|@y5MGR8cGC-Yn06%^E0PC$!Cb-Z0wr}jN>)ms9 zL;@;_wIK!J>p%w{0>eRLG6F9RY`9EcFXkV~=#m(_eoQp~r+?KjZg}QSSL~iFyscF_ z+e_{^90j}~rTuecm=4dkoD6jMc=)XI@ePwzb~aU<_(Cb{iZR=;j^CkY@49GGUfJU< zh|_pVqS;)85%YqWL`@t%i6ZSgMZJLK5AGbA<2Z~&Y6y(OZ<17W7CzqwPW|%tkU??k z4*_!bQ%1vsp<0>Q04?4|yQkkrm{&#|cY?4524U<_tm@Hqt*?a07|`vlpP7J3xS#y+ zPf2l=uqk^9aS%w&GBx^|J3nR zNecGe6yILAWA?u!e(Cl<@PcA2?CSjWxPaGt_JWfJ*C8~T`^Pp$vI5uS*J~uVqo@>8 Yxt^P)DKm4sCRYuzNKydW#Fu~kAGX;UBLDyZ literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-1k.golden b/src/compress/flate/testdata/huffman-rand-1k.golden new file mode 100644 index 0000000000000000000000000000000000000000..09dc798ee37df82176b8b7c9998c88a14207c1ad GIT binary patch literal 1005 zcmVlcQ}x5eHD>U|iC=ROD8-~ViL-puE1 zjRYA__oQ{&>YEB=3*aLuz4zyXJp13Xu1};#Rhix|mTnwF zOo!rp*PZhF=TqnOy;6>9pEFaaeUqI8B!YL)2W zP7ZdtNvU6;rei#QejpQ1yJnKOE~NTM%dWXRuhSpl)r~@J@cfJn0Ny~Wi$|AEsLzhu zri&m6gnDM>m?;94<~TB71LK+=ROn-XNSxENOU6sujQmH^hn%vbF>Y9-Bf>bg4ep_N_banGD$o@)BlG0~`IFf*!A z7ZZY+$P{3oO)_oT873jzel8_va>@^q&Gy#Imx?o3b8wLzzbGT44Do}*$X0h~ljl$J4Xnb zbD&&|U+WJ#!b4}YW@ms{4#Dg|)FPD1`RJ15X*j-TWXe#-24_NUqwu$E^5|c&ujkvl zceVJ-2*h=M!1)}1Jc%#TSUTePk+ypzC+V()i{5ms{n@u^D(o_E@REe_Kn#k!Ic_d< z)NYD&D%@ZnqX*t~i*(5TV|DgDW2`fY!|?bmYqXwpi(E6b%BbX-wveIk57S|?#u}7- zL{;=f|DL5<#-Qjb!HsV;5xKrj*@u^N&pjiq)f!%|U1|gQA`KAPM`;y5?oy)&(mYZ0 z_?_gKiO6R;)m}AtC+IwYu6c3Nlk}=l5*$k#%8*z(mO5DYDWih#pN0k_;dS~5vECO-S0Dj5 literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-1k.in b/src/compress/flate/testdata/huffman-rand-1k.in new file mode 100644 index 0000000000000000000000000000000000000000..ce038ebb5bd911cd054b86c044fd26e6003225e2 GIT binary patch literal 1000 zcmV&K%;#;51Q|(x zM;}NPu;`xhFDh+BMJ6ccYFsSUg>Bfi<~bp&jg-~DiA=I+_Co^FF# z)zpAln0JXoILWUtGMXS8Mm=Y4*K(dtAy3BO)O!Str33Z_n`_)ElXocnv|`#I=O3$U zQA0T|pppS>bw2bp{X;JIq;=Zrn+jwL;3Fx$_veE=``@#!Pozgxncgp!ZX82QhvIzM zUrc=HkOSK=mDVB*N4QOEy(AHOADFT(|I5J=Zkm4@Lua&RXMk7^!R$cPB9zMc=#u1VIKF3O%23A!XF_hH@V9L8=wGp~=i9q?wfM^j z#C3ka`5b>di7(PvI^y_|wtFNe>8^x}-gK<}*|%vb>@sigl7#U<42rxtZZ31wZi;j& z++ZK02i|pybjbc=b@n}DtTTzj@c1ojw4QW}Tr;%FsN|WpkfHAn(_ym48kBrQRrE#w zo~2sGpy(>Wjc+s&xxP->hnI8DJtMBw8eXnlY6JNq4G`H!X%#>2QlkjcJW=%co#dE_ z$Y(j#UNv|p=sbX~d2!N{^r}%397`MJZWV9jyHT4(pZUa$D*GDWRnth5CjlnHYgKKc z`-F?ho+!fa8YJwSuDxLC6*cZcq%&Lk54QIKrUFdLkXSmFLFdZ}jN64xsEPBnj{S98 zPwn16>o}vnuyg#lRQF6UXD&FRR2aGlzw$ZN{-r_2W@fs9?`P!ZJPgXD3VE|vi;8ua W7(y>8qk`|Bh6W?yb@~Xg-WN)Vp#LfW literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-1k.wb.expect b/src/compress/flate/testdata/huffman-rand-1k.wb.expect new file mode 100644 index 0000000000000000000000000000000000000000..09dc798ee37df82176b8b7c9998c88a14207c1ad GIT binary patch literal 1005 zcmVlcQ}x5eHD>U|iC=ROD8-~ViL-puE1 zjRYA__oQ{&>YEB=3*aLuz4zyXJp13Xu1};#Rhix|mTnwF zOo!rp*PZhF=TqnOy;6>9pEFaaeUqI8B!YL)2W zP7ZdtNvU6;rei#QejpQ1yJnKOE~NTM%dWXRuhSpl)r~@J@cfJn0Ny~Wi$|AEsLzhu zri&m6gnDM>m?;94<~TB71LK+=ROn-XNSxENOU6sujQmH^hn%vbF>Y9-Bf>bg4ep_N_banGD$o@)BlG0~`IFf*!A z7ZZY+$P{3oO)_oT873jzel8_va>@^q&Gy#Imx?o3b8wLzzbGT44Do}*$X0h~ljl$J4Xnb zbD&&|U+WJ#!b4}YW@ms{4#Dg|)FPD1`RJ15X*j-TWXe#-24_NUqwu$E^5|c&ujkvl zceVJ-2*h=M!1)}1Jc%#TSUTePk+ypzC+V()i{5ms{n@u^D(o_E@REe_Kn#k!Ic_d< z)NYD&D%@ZnqX*t~i*(5TV|DgDW2`fY!|?bmYqXwpi(E6b%BbX-wveIk57S|?#u}7- zL{;=f|DL5<#-Qjb!HsV;5xKrj*@u^N&pjiq)f!%|U1|gQA`KAPM`;y5?oy)&(mYZ0 z_?_gKiO6R;)m}AtC+IwYu6c3Nlk}=l5*$k#%8*z(mO5DYDWih#pN0k_;dS~5vECO-S0Dj5 literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-1k.wb.expect-noinput b/src/compress/flate/testdata/huffman-rand-1k.wb.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..0c24742fde2487e3a454ec3364f15e541693c37c GIT binary patch literal 1054 zcmV+(1mXJxzzaAU2mk=!nayIXbMy_f)7H$mL&SF;F?3`%k8@)&&%@Oe(UOiioadDG zS>BI}35WJ&PF@*1*&LbA=aF5pFj3x*HIFRrKcto>d1~bp8)vlgPG~al`sLh_uD4>f zwcquqQs)bz`O{dU_?0E5ZyfOj3vL$R|;Io1R(-}eKi+pE+?-hv`IeFsDFRE4SU5j~y=5(3C6?qYw^br64(dswwJMG1iwh9bz5{6%{CK{d z?OTrws1RG0;tdgAc^^}S;a;h-Le*Jl$;@?4WVbi2?}j$(yZ8P0lo@^JyA?I@?GEt7oU6m&;AhmaN!WN2o4Ue&a8T%J8g~M#1p4zh)_hxG4z2`Ogny za;mxRW4Md@6TRsPIrIrmbY`0*@-5uMh;C)*<4Qh|=G6i5GP){GL)z@9EkaXFMahfN zv?c%P&)d;?j&h!ypwqm%P^YHL3jM3}%*^0B)TTYwcr0m+>#+B{By^cDULDE6Dg;&& zO=u{r#qY9CX2q~>M2)v~oJjxXwYfA4W6UEykUq9QGg?N01rigUU44BE!qnW&8XUe) zez=s$?Lpl~RS(YSo`<)!77bHS>Gu?tEqHX60yc4tb%nr56)BI?!K^R=U-@BSOT=w5 zsVIvXfM*tHgqR0EakjC|{oW&au|@y5MGR8cGC-Yn06%^E0PC$!Cb-Z0wr}jN>)ms9 zL;@;_wIK!J>p%w{0>eRLG6F9RY`9EcFXkV~=#m(_eoQp~r+?KjZg}QSSL~iFyscF_ z+e_{^90j}~rTuecm=4dkoD6jMc=)XI@ePwzb~aU<_(Cb{iZR=;j^CkY@49GGUfJU< zh|_pVqS;)85%YqWL`@t%i6ZSgMZJLK5AGbA<2Z~&Y6y(OZ<17W7CzqwPW|%tkU??k z4*_!bQ%1vsp<0>Q04?4|yQkkrm{&#|cY?4524U<_tm@Hqt*?a07|`vlpP7J3xS#y+ zPf2l=uqk^9aS%w&GBx^|J3nR zNecGe6yILAWA?u!e(Cl<@PcA2?CSjWxPaGt_JWfJ*C8~T`^Pp$vI5uS*J~uVqo@>8 Yxt^P)DKm4sCRYuzNKydW#Fu~kAGX;UBLDyZ literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-limit.dyn.expect b/src/compress/flate/testdata/huffman-rand-limit.dyn.expect new file mode 100644 index 0000000000000000000000000000000000000000..2d6527934e98300d744c7558a025250f67e0f1c9 GIT binary patch literal 229 zcmVoXRI~IhW&XxGJNu5- o$p8QV literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-limit.in b/src/compress/flate/testdata/huffman-rand-limit.in new file mode 100644 index 00000000000..fb5b1be6198 --- /dev/null +++ b/src/compress/flate/testdata/huffman-rand-limit.in @@ -0,0 +1,4 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +vH +% ɷ}>lsmIGH1Y4[ 0ˆ[|]o# +-#ulpfٱnYԀYwC8ɯ02 F=gnrN!O{k*w(b kQC9/lu>5C.u diff --git a/src/compress/flate/testdata/huffman-rand-limit.wb.expect b/src/compress/flate/testdata/huffman-rand-limit.wb.expect new file mode 100644 index 0000000000000000000000000000000000000000..881e59c9ab9bb356c5f1b8f2e188818bd42dbcf0 GIT binary patch literal 186 zcmV;r07d^wq#oe<(LJrqgR6ClYQy?N|9W32ycTaex&7!pwpX+&C|&*fKV2Rd8oFPOxbQ)>6c^slqt_a&vbUd`qL0Dk3ZG5`Po literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-limit.wb.expect-noinput b/src/compress/flate/testdata/huffman-rand-limit.wb.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..881e59c9ab9bb356c5f1b8f2e188818bd42dbcf0 GIT binary patch literal 186 zcmV;r07d^wq#oe<(LJrqgR6ClYQy?N|9W32ycTaex&7!pwpX+&C|&*fKV2Rd8oFPOxbQ)>6c^slqt_a&vbUd`qL0Dk3ZG5`Po literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-max.golden b/src/compress/flate/testdata/huffman-rand-max.golden new file mode 100644 index 0000000000000000000000000000000000000000..47d53c89c077d0e62aeaf818154f60921960de5c GIT binary patch literal 65540 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

-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 literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-rand-max.in b/src/compress/flate/testdata/huffman-rand-max.in new file mode 100644 index 0000000000000000000000000000000000000000..8418633d2ac9791cc75a316d53c8490a328daa39 GIT binary patch literal 65535 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 literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-shifts.dyn.expect b/src/compress/flate/testdata/huffman-shifts.dyn.expect new file mode 100644 index 0000000000000000000000000000000000000000..7812c1c62da3cbaeb6399e9aa8ab65ae7efa9b08 GIT binary patch literal 32 ocmaEJ(2|$IfP>+{UeCQBetd7^G}D{T$iTpm^J~2nL&Iw}0NYm#xc~qF literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-shifts.dyn.expect-noinput b/src/compress/flate/testdata/huffman-shifts.dyn.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..7812c1c62da3cbaeb6399e9aa8ab65ae7efa9b08 GIT binary patch literal 32 ocmaEJ(2|$IfP>+{UeCQBetd7^G}D{T$iTpm^J~2nL&Iw}0NYm#xc~qF literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-shifts.golden b/src/compress/flate/testdata/huffman-shifts.golden new file mode 100644 index 0000000000000000000000000000000000000000..f5133778e1c783a6da12f76fec3f04014c77694e GIT binary patch literal 1812 zcmZQM;K<8hAkcE4esWdg(f!+{1xLYX2#kinFbsi-|F1=5uiZLIjE2EzI>3_+tN@OD BEKdLc literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-shifts.in b/src/compress/flate/testdata/huffman-shifts.in new file mode 100644 index 00000000000..7c7a50d1583 --- /dev/null +++ b/src/compress/flate/testdata/huffman-shifts.in @@ -0,0 +1,2 @@ +101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010 +232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323 \ No newline at end of file diff --git a/src/compress/flate/testdata/huffman-shifts.wb.expect b/src/compress/flate/testdata/huffman-shifts.wb.expect new file mode 100644 index 0000000000000000000000000000000000000000..7812c1c62da3cbaeb6399e9aa8ab65ae7efa9b08 GIT binary patch literal 32 ocmaEJ(2|$IfP>+{UeCQBetd7^G}D{T$iTpm^J~2nL&Iw}0NYm#xc~qF literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-shifts.wb.expect-noinput b/src/compress/flate/testdata/huffman-shifts.wb.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..7812c1c62da3cbaeb6399e9aa8ab65ae7efa9b08 GIT binary patch literal 32 ocmaEJ(2|$IfP>+{UeCQBetd7^G}D{T$iTpm^J~2nL&Iw}0NYm#xc~qF literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-text-shift.dyn.expect b/src/compress/flate/testdata/huffman-text-shift.dyn.expect new file mode 100644 index 0000000000000000000000000000000000000000..71ce3aeb75a86e8375d9ac4350b7d83b9229a3ed GIT binary patch literal 231 zcmVb2j)h-%-Q8H+K zIkmg!?Y-=9be1Hi$&iwP9DQ6&foC2grh=5#ja@KiZ1-F{b`bob2j)h-%-Q8H+K zIkmg!?Y-=9be1Hi$&iwP9DQ6&foC2grh=5#ja@KiZ1-F{b`bow{lnwaYQ1@WJ+zb2j)h-%-Q8H+K zIkmg!?Y-=9be1Hi$&iwP9DQ6&foC2grh=5#ja@KiZ1-F{b`bob2j)h-%-Q8H+K zIkmg!?Y-=9be1Hi$&iwP9DQ6&foC2grh=5#ja@KiZ1-F{b`bo4 a=-^ 1`_ 1 ő:Y-F66!A`aC;ANyr4ߜU!GKС#r:B[G3.L׶bFRuM]^⇳(#Z ivBBH2S]u/ֽWTGnr \ No newline at end of file diff --git a/src/compress/flate/testdata/huffman-text.dyn.expect-noinput b/src/compress/flate/testdata/huffman-text.dyn.expect-noinput new file mode 100644 index 00000000000..d448727c323 --- /dev/null +++ b/src/compress/flate/testdata/huffman-text.dyn.expect-noinput @@ -0,0 +1 @@ +_K0`K0Aasě)^HIɟb߻_>4 a=-^ 1`_ 1 ő:Y-F66!A`aC;ANyr4ߜU!GKС#r:B[G3.L׶bFRuM]^⇳(#Z ivBBH2S]u/ֽWTGnr \ No newline at end of file diff --git a/src/compress/flate/testdata/huffman-text.golden b/src/compress/flate/testdata/huffman-text.golden new file mode 100644 index 00000000000..6d34c61fe0d --- /dev/null +++ b/src/compress/flate/testdata/huffman-text.golden @@ -0,0 +1,3 @@ +AK0xßZLPa!xADI&#IEp]LƿFp 188h$5S- F66!)v.0Y& SN|d2: +t|둍xz9骺Ɏ3 +&&=ôUD=Fu]qUL+>FQYLZofTߵEŴ{Yʶbe \ No newline at end of file diff --git a/src/compress/flate/testdata/huffman-text.in b/src/compress/flate/testdata/huffman-text.in new file mode 100644 index 00000000000..73398b98b54 --- /dev/null +++ b/src/compress/flate/testdata/huffman-text.in @@ -0,0 +1,13 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "os" + +func main() { + var b = make([]byte, 65535) + f, _ := os.Create("huffman-null-max.in") + f.Write(b) +} diff --git a/src/compress/flate/testdata/huffman-text.wb.expect b/src/compress/flate/testdata/huffman-text.wb.expect new file mode 100644 index 00000000000..d448727c323 --- /dev/null +++ b/src/compress/flate/testdata/huffman-text.wb.expect @@ -0,0 +1 @@ +_K0`K0Aasě)^HIɟb߻_>4 a=-^ 1`_ 1 ő:Y-F66!A`aC;ANyr4ߜU!GKС#r:B[G3.L׶bFRuM]^⇳(#Z ivBBH2S]u/ֽWTGnr \ No newline at end of file diff --git a/src/compress/flate/testdata/huffman-text.wb.expect-noinput b/src/compress/flate/testdata/huffman-text.wb.expect-noinput new file mode 100644 index 00000000000..d448727c323 --- /dev/null +++ b/src/compress/flate/testdata/huffman-text.wb.expect-noinput @@ -0,0 +1 @@ +_K0`K0Aasě)^HIɟb߻_>4 a=-^ 1`_ 1 ő:Y-F66!A`aC;ANyr4ߜU!GKС#r:B[G3.L׶bFRuM]^⇳(#Z ivBBH2S]u/ֽWTGnr \ No newline at end of file diff --git a/src/compress/flate/testdata/huffman-zero.dyn.expect b/src/compress/flate/testdata/huffman-zero.dyn.expect new file mode 100644 index 0000000000000000000000000000000000000000..830348a79ad9ab38d0edc449e8335c056f7d185f GIT binary patch literal 17 XcmaEJU?T$%G#D)X^D^m0zK$>eMUV%O literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-zero.dyn.expect-noinput b/src/compress/flate/testdata/huffman-zero.dyn.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..830348a79ad9ab38d0edc449e8335c056f7d185f GIT binary patch literal 17 XcmaEJU?T$%G#D)X^D^m0zK$>eMUV%O literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-zero.golden b/src/compress/flate/testdata/huffman-zero.golden new file mode 100644 index 0000000000000000000000000000000000000000..5abdbaff9a69ad9c71178ba3641fa548818c9030 GIT binary patch literal 51 VcmZQM(8vG+6IB0~f*Aw}2LPDS1Frx8 literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-zero.in b/src/compress/flate/testdata/huffman-zero.in new file mode 100644 index 00000000000..349be0e6ec6 --- /dev/null +++ b/src/compress/flate/testdata/huffman-zero.in @@ -0,0 +1 @@ +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/src/compress/flate/testdata/huffman-zero.wb.expect b/src/compress/flate/testdata/huffman-zero.wb.expect new file mode 100644 index 0000000000000000000000000000000000000000..dbe401c54c4b6f45f3169376185a476dcf00dde9 GIT binary patch literal 6 NcmXq#U{zse0006o0CxZY literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/huffman-zero.wb.expect-noinput b/src/compress/flate/testdata/huffman-zero.wb.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..dbe401c54c4b6f45f3169376185a476dcf00dde9 GIT binary patch literal 6 NcmXq#U{zse0006o0CxZY literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/null-long-match.dyn.expect-noinput b/src/compress/flate/testdata/null-long-match.dyn.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..8b92d9fc20f1ee1fea5e4cc84d18aeea26a6fdaa GIT binary patch literal 206 ccmaEJz>txFf#HzC@8#d3xFvwhAq<`X0E^!Sx&QzG literal 0 HcmV?d00001 diff --git a/src/compress/flate/testdata/null-long-match.wb.expect-noinput b/src/compress/flate/testdata/null-long-match.wb.expect-noinput new file mode 100644 index 0000000000000000000000000000000000000000..8b92d9fc20f1ee1fea5e4cc84d18aeea26a6fdaa GIT binary patch literal 206 ccmaEJz>txFf#HzC@8#d3xFvwhAq<`X0E^!Sx&QzG literal 0 HcmV?d00001