• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import _compression
2from io import BytesIO, UnsupportedOperation, DEFAULT_BUFFER_SIZE
3import os
4import pathlib
5import pickle
6import random
7import sys
8from test import support
9import unittest
10
11from test.support import (
12    _4G, TESTFN, import_module, bigmemtest, run_unittest, unlink
13)
14
15lzma = import_module("lzma")
16from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile
17
18
19class CompressorDecompressorTestCase(unittest.TestCase):
20
21    # Test error cases.
22
23    def test_simple_bad_args(self):
24        self.assertRaises(TypeError, LZMACompressor, [])
25        self.assertRaises(TypeError, LZMACompressor, format=3.45)
26        self.assertRaises(TypeError, LZMACompressor, check="")
27        self.assertRaises(TypeError, LZMACompressor, preset="asdf")
28        self.assertRaises(TypeError, LZMACompressor, filters=3)
29        # Can't specify FORMAT_AUTO when compressing.
30        self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO)
31        # Can't specify a preset and a custom filter chain at the same time.
32        with self.assertRaises(ValueError):
33            LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}])
34
35        self.assertRaises(TypeError, LZMADecompressor, ())
36        self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw")
37        with self.assertRaises(TypeError):
38            LZMADecompressor(lzma.FORMAT_RAW, filters="zzz")
39        # Cannot specify a memory limit with FILTER_RAW.
40        with self.assertRaises(ValueError):
41            LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000)
42        # Can only specify a custom filter chain with FILTER_RAW.
43        self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1)
44        with self.assertRaises(ValueError):
45            LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
46        with self.assertRaises(ValueError):
47            LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
48
49        lzc = LZMACompressor()
50        self.assertRaises(TypeError, lzc.compress)
51        self.assertRaises(TypeError, lzc.compress, b"foo", b"bar")
52        self.assertRaises(TypeError, lzc.flush, b"blah")
53        empty = lzc.flush()
54        self.assertRaises(ValueError, lzc.compress, b"quux")
55        self.assertRaises(ValueError, lzc.flush)
56
57        lzd = LZMADecompressor()
58        self.assertRaises(TypeError, lzd.decompress)
59        self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar")
60        lzd.decompress(empty)
61        self.assertRaises(EOFError, lzd.decompress, b"quux")
62
63    def test_bad_filter_spec(self):
64        self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"])
65        self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}])
66        self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}])
67        with self.assertRaises(ValueError):
68            LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
69        with self.assertRaises(ValueError):
70            LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
71        with self.assertRaises(ValueError):
72            LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}])
73
74    def test_decompressor_after_eof(self):
75        lzd = LZMADecompressor()
76        lzd.decompress(COMPRESSED_XZ)
77        self.assertRaises(EOFError, lzd.decompress, b"nyan")
78
79    def test_decompressor_memlimit(self):
80        lzd = LZMADecompressor(memlimit=1024)
81        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
82
83        lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024)
84        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
85
86        lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024)
87        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
88
89    # Test LZMADecompressor on known-good input data.
90
91    def _test_decompressor(self, lzd, data, check, unused_data=b""):
92        self.assertFalse(lzd.eof)
93        out = lzd.decompress(data)
94        self.assertEqual(out, INPUT)
95        self.assertEqual(lzd.check, check)
96        self.assertTrue(lzd.eof)
97        self.assertEqual(lzd.unused_data, unused_data)
98
99    def test_decompressor_auto(self):
100        lzd = LZMADecompressor()
101        self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
102
103        lzd = LZMADecompressor()
104        self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
105
106    def test_decompressor_xz(self):
107        lzd = LZMADecompressor(lzma.FORMAT_XZ)
108        self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
109
110    def test_decompressor_alone(self):
111        lzd = LZMADecompressor(lzma.FORMAT_ALONE)
112        self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
113
114    def test_decompressor_raw_1(self):
115        lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
116        self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE)
117
118    def test_decompressor_raw_2(self):
119        lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
120        self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE)
121
122    def test_decompressor_raw_3(self):
123        lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
124        self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE)
125
126    def test_decompressor_raw_4(self):
127        lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
128        self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE)
129
130    def test_decompressor_chunks(self):
131        lzd = LZMADecompressor()
132        out = []
133        for i in range(0, len(COMPRESSED_XZ), 10):
134            self.assertFalse(lzd.eof)
135            out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
136        out = b"".join(out)
137        self.assertEqual(out, INPUT)
138        self.assertEqual(lzd.check, lzma.CHECK_CRC64)
139        self.assertTrue(lzd.eof)
140        self.assertEqual(lzd.unused_data, b"")
141
142    def test_decompressor_chunks_empty(self):
143        lzd = LZMADecompressor()
144        out = []
145        for i in range(0, len(COMPRESSED_XZ), 10):
146            self.assertFalse(lzd.eof)
147            out.append(lzd.decompress(b''))
148            out.append(lzd.decompress(b''))
149            out.append(lzd.decompress(b''))
150            out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
151        out = b"".join(out)
152        self.assertEqual(out, INPUT)
153        self.assertEqual(lzd.check, lzma.CHECK_CRC64)
154        self.assertTrue(lzd.eof)
155        self.assertEqual(lzd.unused_data, b"")
156
157    def test_decompressor_chunks_maxsize(self):
158        lzd = LZMADecompressor()
159        max_length = 100
160        out = []
161
162        # Feed first half the input
163        len_ = len(COMPRESSED_XZ) // 2
164        out.append(lzd.decompress(COMPRESSED_XZ[:len_],
165                                  max_length=max_length))
166        self.assertFalse(lzd.needs_input)
167        self.assertEqual(len(out[-1]), max_length)
168
169        # Retrieve more data without providing more input
170        out.append(lzd.decompress(b'', max_length=max_length))
171        self.assertFalse(lzd.needs_input)
172        self.assertEqual(len(out[-1]), max_length)
173
174        # Retrieve more data while providing more input
175        out.append(lzd.decompress(COMPRESSED_XZ[len_:],
176                                  max_length=max_length))
177        self.assertLessEqual(len(out[-1]), max_length)
178
179        # Retrieve remaining uncompressed data
180        while not lzd.eof:
181            out.append(lzd.decompress(b'', max_length=max_length))
182            self.assertLessEqual(len(out[-1]), max_length)
183
184        out = b"".join(out)
185        self.assertEqual(out, INPUT)
186        self.assertEqual(lzd.check, lzma.CHECK_CRC64)
187        self.assertEqual(lzd.unused_data, b"")
188
189    def test_decompressor_inputbuf_1(self):
190        # Test reusing input buffer after moving existing
191        # contents to beginning
192        lzd = LZMADecompressor()
193        out = []
194
195        # Create input buffer and fill it
196        self.assertEqual(lzd.decompress(COMPRESSED_XZ[:100],
197                                        max_length=0), b'')
198
199        # Retrieve some results, freeing capacity at beginning
200        # of input buffer
201        out.append(lzd.decompress(b'', 2))
202
203        # Add more data that fits into input buffer after
204        # moving existing data to beginning
205        out.append(lzd.decompress(COMPRESSED_XZ[100:105], 15))
206
207        # Decompress rest of data
208        out.append(lzd.decompress(COMPRESSED_XZ[105:]))
209        self.assertEqual(b''.join(out), INPUT)
210
211    def test_decompressor_inputbuf_2(self):
212        # Test reusing input buffer by appending data at the
213        # end right away
214        lzd = LZMADecompressor()
215        out = []
216
217        # Create input buffer and empty it
218        self.assertEqual(lzd.decompress(COMPRESSED_XZ[:200],
219                                        max_length=0), b'')
220        out.append(lzd.decompress(b''))
221
222        # Fill buffer with new data
223        out.append(lzd.decompress(COMPRESSED_XZ[200:280], 2))
224
225        # Append some more data, not enough to require resize
226        out.append(lzd.decompress(COMPRESSED_XZ[280:300], 2))
227
228        # Decompress rest of data
229        out.append(lzd.decompress(COMPRESSED_XZ[300:]))
230        self.assertEqual(b''.join(out), INPUT)
231
232    def test_decompressor_inputbuf_3(self):
233        # Test reusing input buffer after extending it
234
235        lzd = LZMADecompressor()
236        out = []
237
238        # Create almost full input buffer
239        out.append(lzd.decompress(COMPRESSED_XZ[:200], 5))
240
241        # Add even more data to it, requiring resize
242        out.append(lzd.decompress(COMPRESSED_XZ[200:300], 5))
243
244        # Decompress rest of data
245        out.append(lzd.decompress(COMPRESSED_XZ[300:]))
246        self.assertEqual(b''.join(out), INPUT)
247
248    def test_decompressor_unused_data(self):
249        lzd = LZMADecompressor()
250        extra = b"fooblibar"
251        self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64,
252                                unused_data=extra)
253
254    def test_decompressor_bad_input(self):
255        lzd = LZMADecompressor()
256        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
257
258        lzd = LZMADecompressor(lzma.FORMAT_XZ)
259        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
260
261        lzd = LZMADecompressor(lzma.FORMAT_ALONE)
262        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
263
264        lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
265        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
266
267    def test_decompressor_bug_28275(self):
268        # Test coverage for Issue 28275
269        lzd = LZMADecompressor()
270        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
271        # Previously, a second call could crash due to internal inconsistency
272        self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
273
274    # Test that LZMACompressor->LZMADecompressor preserves the input data.
275
276    def test_roundtrip_xz(self):
277        lzc = LZMACompressor()
278        cdata = lzc.compress(INPUT) + lzc.flush()
279        lzd = LZMADecompressor()
280        self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
281
282    def test_roundtrip_alone(self):
283        lzc = LZMACompressor(lzma.FORMAT_ALONE)
284        cdata = lzc.compress(INPUT) + lzc.flush()
285        lzd = LZMADecompressor()
286        self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
287
288    def test_roundtrip_raw(self):
289        lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
290        cdata = lzc.compress(INPUT) + lzc.flush()
291        lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
292        self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
293
294    def test_roundtrip_raw_empty(self):
295        lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
296        cdata = lzc.compress(INPUT)
297        cdata += lzc.compress(b'')
298        cdata += lzc.compress(b'')
299        cdata += lzc.compress(b'')
300        cdata += lzc.flush()
301        lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
302        self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
303
304    def test_roundtrip_chunks(self):
305        lzc = LZMACompressor()
306        cdata = []
307        for i in range(0, len(INPUT), 10):
308            cdata.append(lzc.compress(INPUT[i:i+10]))
309        cdata.append(lzc.flush())
310        cdata = b"".join(cdata)
311        lzd = LZMADecompressor()
312        self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
313
314    def test_roundtrip_empty_chunks(self):
315        lzc = LZMACompressor()
316        cdata = []
317        for i in range(0, len(INPUT), 10):
318            cdata.append(lzc.compress(INPUT[i:i+10]))
319            cdata.append(lzc.compress(b''))
320            cdata.append(lzc.compress(b''))
321            cdata.append(lzc.compress(b''))
322        cdata.append(lzc.flush())
323        cdata = b"".join(cdata)
324        lzd = LZMADecompressor()
325        self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
326
327    # LZMADecompressor intentionally does not handle concatenated streams.
328
329    def test_decompressor_multistream(self):
330        lzd = LZMADecompressor()
331        self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
332                                lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
333
334    # Test with inputs larger than 4GiB.
335
336    @support.skip_if_pgo_task
337    @bigmemtest(size=_4G + 100, memuse=2)
338    def test_compressor_bigmem(self, size):
339        lzc = LZMACompressor()
340        cdata = lzc.compress(b"x" * size) + lzc.flush()
341        ddata = lzma.decompress(cdata)
342        try:
343            self.assertEqual(len(ddata), size)
344            self.assertEqual(len(ddata.strip(b"x")), 0)
345        finally:
346            ddata = None
347
348    @support.skip_if_pgo_task
349    @bigmemtest(size=_4G + 100, memuse=3)
350    def test_decompressor_bigmem(self, size):
351        lzd = LZMADecompressor()
352        blocksize = 10 * 1024 * 1024
353        block = random.randbytes(blocksize)
354        try:
355            input = block * (size // blocksize + 1)
356            cdata = lzma.compress(input)
357            ddata = lzd.decompress(cdata)
358            self.assertEqual(ddata, input)
359        finally:
360            input = cdata = ddata = None
361
362    # Pickling raises an exception; there's no way to serialize an lzma_stream.
363
364    def test_pickle(self):
365        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
366            with self.assertRaises(TypeError):
367                pickle.dumps(LZMACompressor(), proto)
368            with self.assertRaises(TypeError):
369                pickle.dumps(LZMADecompressor(), proto)
370
371    @support.refcount_test
372    def test_refleaks_in_decompressor___init__(self):
373        gettotalrefcount = support.get_attribute(sys, 'gettotalrefcount')
374        lzd = LZMADecompressor()
375        refs_before = gettotalrefcount()
376        for i in range(100):
377            lzd.__init__()
378        self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10)
379
380
381class CompressDecompressFunctionTestCase(unittest.TestCase):
382
383    # Test error cases:
384
385    def test_bad_args(self):
386        self.assertRaises(TypeError, lzma.compress)
387        self.assertRaises(TypeError, lzma.compress, [])
388        self.assertRaises(TypeError, lzma.compress, b"", format="xz")
389        self.assertRaises(TypeError, lzma.compress, b"", check="none")
390        self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
391        self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
392        # Can't specify a preset and a custom filter chain at the same time.
393        with self.assertRaises(ValueError):
394            lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
395
396        self.assertRaises(TypeError, lzma.decompress)
397        self.assertRaises(TypeError, lzma.decompress, [])
398        self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
399        self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
400        with self.assertRaises(TypeError):
401            lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
402        # Cannot specify a memory limit with FILTER_RAW.
403        with self.assertRaises(ValueError):
404            lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
405        # Can only specify a custom filter chain with FILTER_RAW.
406        with self.assertRaises(ValueError):
407            lzma.decompress(b"", filters=FILTERS_RAW_1)
408        with self.assertRaises(ValueError):
409            lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
410        with self.assertRaises(ValueError):
411            lzma.decompress(
412                    b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
413
414    def test_decompress_memlimit(self):
415        with self.assertRaises(LZMAError):
416            lzma.decompress(COMPRESSED_XZ, memlimit=1024)
417        with self.assertRaises(LZMAError):
418            lzma.decompress(
419                    COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
420        with self.assertRaises(LZMAError):
421            lzma.decompress(
422                    COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
423
424    # Test LZMADecompressor on known-good input data.
425
426    def test_decompress_good_input(self):
427        ddata = lzma.decompress(COMPRESSED_XZ)
428        self.assertEqual(ddata, INPUT)
429
430        ddata = lzma.decompress(COMPRESSED_ALONE)
431        self.assertEqual(ddata, INPUT)
432
433        ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
434        self.assertEqual(ddata, INPUT)
435
436        ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
437        self.assertEqual(ddata, INPUT)
438
439        ddata = lzma.decompress(
440                COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
441        self.assertEqual(ddata, INPUT)
442
443        ddata = lzma.decompress(
444                COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
445        self.assertEqual(ddata, INPUT)
446
447        ddata = lzma.decompress(
448                COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
449        self.assertEqual(ddata, INPUT)
450
451        ddata = lzma.decompress(
452                COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
453        self.assertEqual(ddata, INPUT)
454
455    def test_decompress_incomplete_input(self):
456        self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
457        self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
458        self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
459                          format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
460        self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
461                          format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
462        self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
463                          format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
464        self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
465                          format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
466
467    def test_decompress_bad_input(self):
468        with self.assertRaises(LZMAError):
469            lzma.decompress(COMPRESSED_BOGUS)
470        with self.assertRaises(LZMAError):
471            lzma.decompress(COMPRESSED_RAW_1)
472        with self.assertRaises(LZMAError):
473            lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
474        with self.assertRaises(LZMAError):
475            lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
476        with self.assertRaises(LZMAError):
477            lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
478                            filters=FILTERS_RAW_1)
479
480    # Test that compress()->decompress() preserves the input data.
481
482    def test_roundtrip(self):
483        cdata = lzma.compress(INPUT)
484        ddata = lzma.decompress(cdata)
485        self.assertEqual(ddata, INPUT)
486
487        cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
488        ddata = lzma.decompress(cdata)
489        self.assertEqual(ddata, INPUT)
490
491        cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
492        ddata = lzma.decompress(cdata)
493        self.assertEqual(ddata, INPUT)
494
495        cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
496        ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
497        self.assertEqual(ddata, INPUT)
498
499    # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
500
501    def test_decompress_multistream(self):
502        ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
503        self.assertEqual(ddata, INPUT * 2)
504
505    # Test robust handling of non-LZMA data following the compressed stream(s).
506
507    def test_decompress_trailing_junk(self):
508        ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_BOGUS)
509        self.assertEqual(ddata, INPUT)
510
511    def test_decompress_multistream_trailing_junk(self):
512        ddata = lzma.decompress(COMPRESSED_XZ * 3 + COMPRESSED_BOGUS)
513        self.assertEqual(ddata, INPUT * 3)
514
515
516class TempFile:
517    """Context manager - creates a file, and deletes it on __exit__."""
518
519    def __init__(self, filename, data=b""):
520        self.filename = filename
521        self.data = data
522
523    def __enter__(self):
524        with open(self.filename, "wb") as f:
525            f.write(self.data)
526
527    def __exit__(self, *args):
528        unlink(self.filename)
529
530
531class FileTestCase(unittest.TestCase):
532
533    def test_init(self):
534        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
535            pass
536        with LZMAFile(BytesIO(), "w") as f:
537            pass
538        with LZMAFile(BytesIO(), "x") as f:
539            pass
540        with LZMAFile(BytesIO(), "a") as f:
541            pass
542
543    def test_init_with_PathLike_filename(self):
544        filename = pathlib.Path(TESTFN)
545        with TempFile(filename, COMPRESSED_XZ):
546            with LZMAFile(filename) as f:
547                self.assertEqual(f.read(), INPUT)
548            with LZMAFile(filename, "a") as f:
549                f.write(INPUT)
550            with LZMAFile(filename) as f:
551                self.assertEqual(f.read(), INPUT * 2)
552
553    def test_init_with_filename(self):
554        with TempFile(TESTFN, COMPRESSED_XZ):
555            with LZMAFile(TESTFN) as f:
556                pass
557            with LZMAFile(TESTFN, "w") as f:
558                pass
559            with LZMAFile(TESTFN, "a") as f:
560                pass
561
562    def test_init_mode(self):
563        with TempFile(TESTFN):
564            with LZMAFile(TESTFN, "r"):
565                pass
566            with LZMAFile(TESTFN, "rb"):
567                pass
568            with LZMAFile(TESTFN, "w"):
569                pass
570            with LZMAFile(TESTFN, "wb"):
571                pass
572            with LZMAFile(TESTFN, "a"):
573                pass
574            with LZMAFile(TESTFN, "ab"):
575                pass
576
577    def test_init_with_x_mode(self):
578        self.addCleanup(unlink, TESTFN)
579        for mode in ("x", "xb"):
580            unlink(TESTFN)
581            with LZMAFile(TESTFN, mode):
582                pass
583            with self.assertRaises(FileExistsError):
584                with LZMAFile(TESTFN, mode):
585                    pass
586
587    def test_init_bad_mode(self):
588        with self.assertRaises(ValueError):
589            LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
590        with self.assertRaises(ValueError):
591            LZMAFile(BytesIO(COMPRESSED_XZ), "")
592        with self.assertRaises(ValueError):
593            LZMAFile(BytesIO(COMPRESSED_XZ), "xt")
594        with self.assertRaises(ValueError):
595            LZMAFile(BytesIO(COMPRESSED_XZ), "x+")
596        with self.assertRaises(ValueError):
597            LZMAFile(BytesIO(COMPRESSED_XZ), "rx")
598        with self.assertRaises(ValueError):
599            LZMAFile(BytesIO(COMPRESSED_XZ), "wx")
600        with self.assertRaises(ValueError):
601            LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
602        with self.assertRaises(ValueError):
603            LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
604        with self.assertRaises(ValueError):
605            LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
606        with self.assertRaises(ValueError):
607            LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
608        with self.assertRaises(ValueError):
609            LZMAFile(BytesIO(COMPRESSED_XZ), "rw")
610
611    def test_init_bad_check(self):
612        with self.assertRaises(TypeError):
613            LZMAFile(BytesIO(), "w", check=b"asd")
614        # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
615        with self.assertRaises(LZMAError):
616            LZMAFile(BytesIO(), "w", check=lzma.CHECK_UNKNOWN)
617        with self.assertRaises(LZMAError):
618            LZMAFile(BytesIO(), "w", check=lzma.CHECK_ID_MAX + 3)
619        # Cannot specify a check with mode="r".
620        with self.assertRaises(ValueError):
621            LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
622        with self.assertRaises(ValueError):
623            LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
624        with self.assertRaises(ValueError):
625            LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
626        with self.assertRaises(ValueError):
627            LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
628        with self.assertRaises(ValueError):
629            LZMAFile(BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
630
631    def test_init_bad_preset(self):
632        with self.assertRaises(TypeError):
633            LZMAFile(BytesIO(), "w", preset=4.39)
634        with self.assertRaises(LZMAError):
635            LZMAFile(BytesIO(), "w", preset=10)
636        with self.assertRaises(LZMAError):
637            LZMAFile(BytesIO(), "w", preset=23)
638        with self.assertRaises(OverflowError):
639            LZMAFile(BytesIO(), "w", preset=-1)
640        with self.assertRaises(OverflowError):
641            LZMAFile(BytesIO(), "w", preset=-7)
642        with self.assertRaises(TypeError):
643            LZMAFile(BytesIO(), "w", preset="foo")
644        # Cannot specify a preset with mode="r".
645        with self.assertRaises(ValueError):
646            LZMAFile(BytesIO(COMPRESSED_XZ), preset=3)
647
648    def test_init_bad_filter_spec(self):
649        with self.assertRaises(TypeError):
650            LZMAFile(BytesIO(), "w", filters=[b"wobsite"])
651        with self.assertRaises(ValueError):
652            LZMAFile(BytesIO(), "w", filters=[{"xyzzy": 3}])
653        with self.assertRaises(ValueError):
654            LZMAFile(BytesIO(), "w", filters=[{"id": 98765}])
655        with self.assertRaises(ValueError):
656            LZMAFile(BytesIO(), "w",
657                     filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
658        with self.assertRaises(ValueError):
659            LZMAFile(BytesIO(), "w",
660                     filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
661        with self.assertRaises(ValueError):
662            LZMAFile(BytesIO(), "w",
663                     filters=[{"id": lzma.FILTER_X86, "foo": 0}])
664
665    def test_init_with_preset_and_filters(self):
666        with self.assertRaises(ValueError):
667            LZMAFile(BytesIO(), "w", format=lzma.FORMAT_RAW,
668                     preset=6, filters=FILTERS_RAW_1)
669
670    def test_close(self):
671        with BytesIO(COMPRESSED_XZ) as src:
672            f = LZMAFile(src)
673            f.close()
674            # LZMAFile.close() should not close the underlying file object.
675            self.assertFalse(src.closed)
676            # Try closing an already-closed LZMAFile.
677            f.close()
678            self.assertFalse(src.closed)
679
680        # Test with a real file on disk, opened directly by LZMAFile.
681        with TempFile(TESTFN, COMPRESSED_XZ):
682            f = LZMAFile(TESTFN)
683            fp = f._fp
684            f.close()
685            # Here, LZMAFile.close() *should* close the underlying file object.
686            self.assertTrue(fp.closed)
687            # Try closing an already-closed LZMAFile.
688            f.close()
689
690    def test_closed(self):
691        f = LZMAFile(BytesIO(COMPRESSED_XZ))
692        try:
693            self.assertFalse(f.closed)
694            f.read()
695            self.assertFalse(f.closed)
696        finally:
697            f.close()
698        self.assertTrue(f.closed)
699
700        f = LZMAFile(BytesIO(), "w")
701        try:
702            self.assertFalse(f.closed)
703        finally:
704            f.close()
705        self.assertTrue(f.closed)
706
707    def test_fileno(self):
708        f = LZMAFile(BytesIO(COMPRESSED_XZ))
709        try:
710            self.assertRaises(UnsupportedOperation, f.fileno)
711        finally:
712            f.close()
713        self.assertRaises(ValueError, f.fileno)
714        with TempFile(TESTFN, COMPRESSED_XZ):
715            f = LZMAFile(TESTFN)
716            try:
717                self.assertEqual(f.fileno(), f._fp.fileno())
718                self.assertIsInstance(f.fileno(), int)
719            finally:
720                f.close()
721        self.assertRaises(ValueError, f.fileno)
722
723    def test_seekable(self):
724        f = LZMAFile(BytesIO(COMPRESSED_XZ))
725        try:
726            self.assertTrue(f.seekable())
727            f.read()
728            self.assertTrue(f.seekable())
729        finally:
730            f.close()
731        self.assertRaises(ValueError, f.seekable)
732
733        f = LZMAFile(BytesIO(), "w")
734        try:
735            self.assertFalse(f.seekable())
736        finally:
737            f.close()
738        self.assertRaises(ValueError, f.seekable)
739
740        src = BytesIO(COMPRESSED_XZ)
741        src.seekable = lambda: False
742        f = LZMAFile(src)
743        try:
744            self.assertFalse(f.seekable())
745        finally:
746            f.close()
747        self.assertRaises(ValueError, f.seekable)
748
749    def test_readable(self):
750        f = LZMAFile(BytesIO(COMPRESSED_XZ))
751        try:
752            self.assertTrue(f.readable())
753            f.read()
754            self.assertTrue(f.readable())
755        finally:
756            f.close()
757        self.assertRaises(ValueError, f.readable)
758
759        f = LZMAFile(BytesIO(), "w")
760        try:
761            self.assertFalse(f.readable())
762        finally:
763            f.close()
764        self.assertRaises(ValueError, f.readable)
765
766    def test_writable(self):
767        f = LZMAFile(BytesIO(COMPRESSED_XZ))
768        try:
769            self.assertFalse(f.writable())
770            f.read()
771            self.assertFalse(f.writable())
772        finally:
773            f.close()
774        self.assertRaises(ValueError, f.writable)
775
776        f = LZMAFile(BytesIO(), "w")
777        try:
778            self.assertTrue(f.writable())
779        finally:
780            f.close()
781        self.assertRaises(ValueError, f.writable)
782
783    def test_read(self):
784        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
785            self.assertEqual(f.read(), INPUT)
786            self.assertEqual(f.read(), b"")
787        with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
788            self.assertEqual(f.read(), INPUT)
789        with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
790            self.assertEqual(f.read(), INPUT)
791            self.assertEqual(f.read(), b"")
792        with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
793            self.assertEqual(f.read(), INPUT)
794            self.assertEqual(f.read(), b"")
795        with LZMAFile(BytesIO(COMPRESSED_RAW_1),
796                      format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
797            self.assertEqual(f.read(), INPUT)
798            self.assertEqual(f.read(), b"")
799        with LZMAFile(BytesIO(COMPRESSED_RAW_2),
800                      format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
801            self.assertEqual(f.read(), INPUT)
802            self.assertEqual(f.read(), b"")
803        with LZMAFile(BytesIO(COMPRESSED_RAW_3),
804                      format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
805            self.assertEqual(f.read(), INPUT)
806            self.assertEqual(f.read(), b"")
807        with LZMAFile(BytesIO(COMPRESSED_RAW_4),
808                      format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
809            self.assertEqual(f.read(), INPUT)
810            self.assertEqual(f.read(), b"")
811
812    def test_read_0(self):
813        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
814            self.assertEqual(f.read(0), b"")
815        with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
816            self.assertEqual(f.read(0), b"")
817        with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
818            self.assertEqual(f.read(0), b"")
819        with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
820            self.assertEqual(f.read(0), b"")
821
822    def test_read_10(self):
823        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
824            chunks = []
825            while True:
826                result = f.read(10)
827                if not result:
828                    break
829                self.assertLessEqual(len(result), 10)
830                chunks.append(result)
831            self.assertEqual(b"".join(chunks), INPUT)
832
833    def test_read_multistream(self):
834        with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
835            self.assertEqual(f.read(), INPUT * 5)
836        with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
837            self.assertEqual(f.read(), INPUT * 2)
838        with LZMAFile(BytesIO(COMPRESSED_RAW_3 * 4),
839                      format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
840            self.assertEqual(f.read(), INPUT * 4)
841
842    def test_read_multistream_buffer_size_aligned(self):
843        # Test the case where a stream boundary coincides with the end
844        # of the raw read buffer.
845        saved_buffer_size = _compression.BUFFER_SIZE
846        _compression.BUFFER_SIZE = len(COMPRESSED_XZ)
847        try:
848            with LZMAFile(BytesIO(COMPRESSED_XZ *  5)) as f:
849                self.assertEqual(f.read(), INPUT * 5)
850        finally:
851            _compression.BUFFER_SIZE = saved_buffer_size
852
853    def test_read_trailing_junk(self):
854        with LZMAFile(BytesIO(COMPRESSED_XZ + COMPRESSED_BOGUS)) as f:
855            self.assertEqual(f.read(), INPUT)
856
857    def test_read_multistream_trailing_junk(self):
858        with LZMAFile(BytesIO(COMPRESSED_XZ * 5 + COMPRESSED_BOGUS)) as f:
859            self.assertEqual(f.read(), INPUT * 5)
860
861    def test_read_from_file(self):
862        with TempFile(TESTFN, COMPRESSED_XZ):
863            with LZMAFile(TESTFN) as f:
864                self.assertEqual(f.read(), INPUT)
865                self.assertEqual(f.read(), b"")
866
867    def test_read_from_file_with_bytes_filename(self):
868        try:
869            bytes_filename = TESTFN.encode("ascii")
870        except UnicodeEncodeError:
871            self.skipTest("Temporary file name needs to be ASCII")
872        with TempFile(TESTFN, COMPRESSED_XZ):
873            with LZMAFile(bytes_filename) as f:
874                self.assertEqual(f.read(), INPUT)
875                self.assertEqual(f.read(), b"")
876
877    def test_read_incomplete(self):
878        with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f:
879            self.assertRaises(EOFError, f.read)
880
881    def test_read_truncated(self):
882        # Drop stream footer: CRC (4 bytes), index size (4 bytes),
883        # flags (2 bytes) and magic number (2 bytes).
884        truncated = COMPRESSED_XZ[:-12]
885        with LZMAFile(BytesIO(truncated)) as f:
886            self.assertRaises(EOFError, f.read)
887        with LZMAFile(BytesIO(truncated)) as f:
888            self.assertEqual(f.read(len(INPUT)), INPUT)
889            self.assertRaises(EOFError, f.read, 1)
890        # Incomplete 12-byte header.
891        for i in range(12):
892            with LZMAFile(BytesIO(truncated[:i])) as f:
893                self.assertRaises(EOFError, f.read, 1)
894
895    def test_read_bad_args(self):
896        f = LZMAFile(BytesIO(COMPRESSED_XZ))
897        f.close()
898        self.assertRaises(ValueError, f.read)
899        with LZMAFile(BytesIO(), "w") as f:
900            self.assertRaises(ValueError, f.read)
901        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
902            self.assertRaises(TypeError, f.read, float())
903
904    def test_read_bad_data(self):
905        with LZMAFile(BytesIO(COMPRESSED_BOGUS)) as f:
906            self.assertRaises(LZMAError, f.read)
907
908    def test_read1(self):
909        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
910            blocks = []
911            while True:
912                result = f.read1()
913                if not result:
914                    break
915                blocks.append(result)
916            self.assertEqual(b"".join(blocks), INPUT)
917            self.assertEqual(f.read1(), b"")
918
919    def test_read1_0(self):
920        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
921            self.assertEqual(f.read1(0), b"")
922
923    def test_read1_10(self):
924        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
925            blocks = []
926            while True:
927                result = f.read1(10)
928                if not result:
929                    break
930                blocks.append(result)
931            self.assertEqual(b"".join(blocks), INPUT)
932            self.assertEqual(f.read1(), b"")
933
934    def test_read1_multistream(self):
935        with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
936            blocks = []
937            while True:
938                result = f.read1()
939                if not result:
940                    break
941                blocks.append(result)
942            self.assertEqual(b"".join(blocks), INPUT * 5)
943            self.assertEqual(f.read1(), b"")
944
945    def test_read1_bad_args(self):
946        f = LZMAFile(BytesIO(COMPRESSED_XZ))
947        f.close()
948        self.assertRaises(ValueError, f.read1)
949        with LZMAFile(BytesIO(), "w") as f:
950            self.assertRaises(ValueError, f.read1)
951        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
952            self.assertRaises(TypeError, f.read1, None)
953
954    def test_peek(self):
955        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
956            result = f.peek()
957            self.assertGreater(len(result), 0)
958            self.assertTrue(INPUT.startswith(result))
959            self.assertEqual(f.read(), INPUT)
960        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
961            result = f.peek(10)
962            self.assertGreater(len(result), 0)
963            self.assertTrue(INPUT.startswith(result))
964            self.assertEqual(f.read(), INPUT)
965
966    def test_peek_bad_args(self):
967        with LZMAFile(BytesIO(), "w") as f:
968            self.assertRaises(ValueError, f.peek)
969
970    def test_iterator(self):
971        with BytesIO(INPUT) as f:
972            lines = f.readlines()
973        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
974            self.assertListEqual(list(iter(f)), lines)
975        with LZMAFile(BytesIO(COMPRESSED_ALONE)) as f:
976            self.assertListEqual(list(iter(f)), lines)
977        with LZMAFile(BytesIO(COMPRESSED_XZ), format=lzma.FORMAT_XZ) as f:
978            self.assertListEqual(list(iter(f)), lines)
979        with LZMAFile(BytesIO(COMPRESSED_ALONE), format=lzma.FORMAT_ALONE) as f:
980            self.assertListEqual(list(iter(f)), lines)
981        with LZMAFile(BytesIO(COMPRESSED_RAW_2),
982                      format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
983            self.assertListEqual(list(iter(f)), lines)
984
985    def test_readline(self):
986        with BytesIO(INPUT) as f:
987            lines = f.readlines()
988        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
989            for line in lines:
990                self.assertEqual(f.readline(), line)
991
992    def test_readlines(self):
993        with BytesIO(INPUT) as f:
994            lines = f.readlines()
995        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
996            self.assertListEqual(f.readlines(), lines)
997
998    def test_decompress_limited(self):
999        """Decompressed data buffering should be limited"""
1000        bomb = lzma.compress(b'\0' * int(2e6), preset=6)
1001        self.assertLess(len(bomb), _compression.BUFFER_SIZE)
1002
1003        decomp = LZMAFile(BytesIO(bomb))
1004        self.assertEqual(decomp.read(1), b'\0')
1005        max_decomp = 1 + DEFAULT_BUFFER_SIZE
1006        self.assertLessEqual(decomp._buffer.raw.tell(), max_decomp,
1007            "Excessive amount of data was decompressed")
1008
1009    def test_write(self):
1010        with BytesIO() as dst:
1011            with LZMAFile(dst, "w") as f:
1012                f.write(INPUT)
1013            expected = lzma.compress(INPUT)
1014            self.assertEqual(dst.getvalue(), expected)
1015        with BytesIO() as dst:
1016            with LZMAFile(dst, "w", format=lzma.FORMAT_XZ) as f:
1017                f.write(INPUT)
1018            expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
1019            self.assertEqual(dst.getvalue(), expected)
1020        with BytesIO() as dst:
1021            with LZMAFile(dst, "w", format=lzma.FORMAT_ALONE) as f:
1022                f.write(INPUT)
1023            expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
1024            self.assertEqual(dst.getvalue(), expected)
1025        with BytesIO() as dst:
1026            with LZMAFile(dst, "w", format=lzma.FORMAT_RAW,
1027                          filters=FILTERS_RAW_2) as f:
1028                f.write(INPUT)
1029            expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
1030                                     filters=FILTERS_RAW_2)
1031            self.assertEqual(dst.getvalue(), expected)
1032
1033    def test_write_10(self):
1034        with BytesIO() as dst:
1035            with LZMAFile(dst, "w") as f:
1036                for start in range(0, len(INPUT), 10):
1037                    f.write(INPUT[start:start+10])
1038            expected = lzma.compress(INPUT)
1039            self.assertEqual(dst.getvalue(), expected)
1040
1041    def test_write_append(self):
1042        part1 = INPUT[:1024]
1043        part2 = INPUT[1024:1536]
1044        part3 = INPUT[1536:]
1045        expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
1046        with BytesIO() as dst:
1047            with LZMAFile(dst, "w") as f:
1048                f.write(part1)
1049            with LZMAFile(dst, "a") as f:
1050                f.write(part2)
1051            with LZMAFile(dst, "a") as f:
1052                f.write(part3)
1053            self.assertEqual(dst.getvalue(), expected)
1054
1055    def test_write_to_file(self):
1056        try:
1057            with LZMAFile(TESTFN, "w") as f:
1058                f.write(INPUT)
1059            expected = lzma.compress(INPUT)
1060            with open(TESTFN, "rb") as f:
1061                self.assertEqual(f.read(), expected)
1062        finally:
1063            unlink(TESTFN)
1064
1065    def test_write_to_file_with_bytes_filename(self):
1066        try:
1067            bytes_filename = TESTFN.encode("ascii")
1068        except UnicodeEncodeError:
1069            self.skipTest("Temporary file name needs to be ASCII")
1070        try:
1071            with LZMAFile(bytes_filename, "w") as f:
1072                f.write(INPUT)
1073            expected = lzma.compress(INPUT)
1074            with open(TESTFN, "rb") as f:
1075                self.assertEqual(f.read(), expected)
1076        finally:
1077            unlink(TESTFN)
1078
1079    def test_write_append_to_file(self):
1080        part1 = INPUT[:1024]
1081        part2 = INPUT[1024:1536]
1082        part3 = INPUT[1536:]
1083        expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
1084        try:
1085            with LZMAFile(TESTFN, "w") as f:
1086                f.write(part1)
1087            with LZMAFile(TESTFN, "a") as f:
1088                f.write(part2)
1089            with LZMAFile(TESTFN, "a") as f:
1090                f.write(part3)
1091            with open(TESTFN, "rb") as f:
1092                self.assertEqual(f.read(), expected)
1093        finally:
1094            unlink(TESTFN)
1095
1096    def test_write_bad_args(self):
1097        f = LZMAFile(BytesIO(), "w")
1098        f.close()
1099        self.assertRaises(ValueError, f.write, b"foo")
1100        with LZMAFile(BytesIO(COMPRESSED_XZ), "r") as f:
1101            self.assertRaises(ValueError, f.write, b"bar")
1102        with LZMAFile(BytesIO(), "w") as f:
1103            self.assertRaises(TypeError, f.write, None)
1104            self.assertRaises(TypeError, f.write, "text")
1105            self.assertRaises(TypeError, f.write, 789)
1106
1107    def test_writelines(self):
1108        with BytesIO(INPUT) as f:
1109            lines = f.readlines()
1110        with BytesIO() as dst:
1111            with LZMAFile(dst, "w") as f:
1112                f.writelines(lines)
1113            expected = lzma.compress(INPUT)
1114            self.assertEqual(dst.getvalue(), expected)
1115
1116    def test_seek_forward(self):
1117        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1118            f.seek(555)
1119            self.assertEqual(f.read(), INPUT[555:])
1120
1121    def test_seek_forward_across_streams(self):
1122        with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
1123            f.seek(len(INPUT) + 123)
1124            self.assertEqual(f.read(), INPUT[123:])
1125
1126    def test_seek_forward_relative_to_current(self):
1127        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1128            f.read(100)
1129            f.seek(1236, 1)
1130            self.assertEqual(f.read(), INPUT[1336:])
1131
1132    def test_seek_forward_relative_to_end(self):
1133        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1134            f.seek(-555, 2)
1135            self.assertEqual(f.read(), INPUT[-555:])
1136
1137    def test_seek_backward(self):
1138        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1139            f.read(1001)
1140            f.seek(211)
1141            self.assertEqual(f.read(), INPUT[211:])
1142
1143    def test_seek_backward_across_streams(self):
1144        with LZMAFile(BytesIO(COMPRESSED_XZ * 2)) as f:
1145            f.read(len(INPUT) + 333)
1146            f.seek(737)
1147            self.assertEqual(f.read(), INPUT[737:] + INPUT)
1148
1149    def test_seek_backward_relative_to_end(self):
1150        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1151            f.seek(-150, 2)
1152            self.assertEqual(f.read(), INPUT[-150:])
1153
1154    def test_seek_past_end(self):
1155        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1156            f.seek(len(INPUT) + 9001)
1157            self.assertEqual(f.tell(), len(INPUT))
1158            self.assertEqual(f.read(), b"")
1159
1160    def test_seek_past_start(self):
1161        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1162            f.seek(-88)
1163            self.assertEqual(f.tell(), 0)
1164            self.assertEqual(f.read(), INPUT)
1165
1166    def test_seek_bad_args(self):
1167        f = LZMAFile(BytesIO(COMPRESSED_XZ))
1168        f.close()
1169        self.assertRaises(ValueError, f.seek, 0)
1170        with LZMAFile(BytesIO(), "w") as f:
1171            self.assertRaises(ValueError, f.seek, 0)
1172        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1173            self.assertRaises(ValueError, f.seek, 0, 3)
1174            # io.BufferedReader raises TypeError instead of ValueError
1175            self.assertRaises((TypeError, ValueError), f.seek, 9, ())
1176            self.assertRaises(TypeError, f.seek, None)
1177            self.assertRaises(TypeError, f.seek, b"derp")
1178
1179    def test_tell(self):
1180        with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
1181            pos = 0
1182            while True:
1183                self.assertEqual(f.tell(), pos)
1184                result = f.read(183)
1185                if not result:
1186                    break
1187                pos += len(result)
1188            self.assertEqual(f.tell(), len(INPUT))
1189        with LZMAFile(BytesIO(), "w") as f:
1190            for pos in range(0, len(INPUT), 144):
1191                self.assertEqual(f.tell(), pos)
1192                f.write(INPUT[pos:pos+144])
1193            self.assertEqual(f.tell(), len(INPUT))
1194
1195    def test_tell_bad_args(self):
1196        f = LZMAFile(BytesIO(COMPRESSED_XZ))
1197        f.close()
1198        self.assertRaises(ValueError, f.tell)
1199
1200    def test_issue21872(self):
1201        # sometimes decompress data incompletely
1202
1203        # ---------------------
1204        # when max_length == -1
1205        # ---------------------
1206        d1 = LZMADecompressor()
1207        entire = d1.decompress(ISSUE_21872_DAT, max_length=-1)
1208        self.assertEqual(len(entire), 13160)
1209        self.assertTrue(d1.eof)
1210
1211        # ---------------------
1212        # when max_length > 0
1213        # ---------------------
1214        d2 = LZMADecompressor()
1215
1216        # When this value of max_length is used, the input and output
1217        # buffers are exhausted at the same time, and lzs's internal
1218        # state still have 11 bytes can be output.
1219        out1 = d2.decompress(ISSUE_21872_DAT, max_length=13149)
1220        self.assertFalse(d2.needs_input) # ensure needs_input mechanism works
1221        self.assertFalse(d2.eof)
1222
1223        # simulate needs_input mechanism
1224        # output internal state's 11 bytes
1225        out2 = d2.decompress(b'')
1226        self.assertEqual(len(out2), 11)
1227        self.assertTrue(d2.eof)
1228        self.assertEqual(out1 + out2, entire)
1229
1230
1231class OpenTestCase(unittest.TestCase):
1232
1233    def test_binary_modes(self):
1234        with lzma.open(BytesIO(COMPRESSED_XZ), "rb") as f:
1235            self.assertEqual(f.read(), INPUT)
1236        with BytesIO() as bio:
1237            with lzma.open(bio, "wb") as f:
1238                f.write(INPUT)
1239            file_data = lzma.decompress(bio.getvalue())
1240            self.assertEqual(file_data, INPUT)
1241            with lzma.open(bio, "ab") as f:
1242                f.write(INPUT)
1243            file_data = lzma.decompress(bio.getvalue())
1244            self.assertEqual(file_data, INPUT * 2)
1245
1246    def test_text_modes(self):
1247        uncompressed = INPUT.decode("ascii")
1248        uncompressed_raw = uncompressed.replace("\n", os.linesep)
1249        with lzma.open(BytesIO(COMPRESSED_XZ), "rt") as f:
1250            self.assertEqual(f.read(), uncompressed)
1251        with BytesIO() as bio:
1252            with lzma.open(bio, "wt") as f:
1253                f.write(uncompressed)
1254            file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1255            self.assertEqual(file_data, uncompressed_raw)
1256            with lzma.open(bio, "at") as f:
1257                f.write(uncompressed)
1258            file_data = lzma.decompress(bio.getvalue()).decode("ascii")
1259            self.assertEqual(file_data, uncompressed_raw * 2)
1260
1261    def test_filename(self):
1262        with TempFile(TESTFN):
1263            with lzma.open(TESTFN, "wb") as f:
1264                f.write(INPUT)
1265            with open(TESTFN, "rb") as f:
1266                file_data = lzma.decompress(f.read())
1267                self.assertEqual(file_data, INPUT)
1268            with lzma.open(TESTFN, "rb") as f:
1269                self.assertEqual(f.read(), INPUT)
1270            with lzma.open(TESTFN, "ab") as f:
1271                f.write(INPUT)
1272            with lzma.open(TESTFN, "rb") as f:
1273                self.assertEqual(f.read(), INPUT * 2)
1274
1275    def test_with_pathlike_filename(self):
1276        filename = pathlib.Path(TESTFN)
1277        with TempFile(filename):
1278            with lzma.open(filename, "wb") as f:
1279                f.write(INPUT)
1280            with open(filename, "rb") as f:
1281                file_data = lzma.decompress(f.read())
1282                self.assertEqual(file_data, INPUT)
1283            with lzma.open(filename, "rb") as f:
1284                self.assertEqual(f.read(), INPUT)
1285
1286    def test_bad_params(self):
1287        # Test invalid parameter combinations.
1288        with self.assertRaises(ValueError):
1289            lzma.open(TESTFN, "")
1290        with self.assertRaises(ValueError):
1291            lzma.open(TESTFN, "rbt")
1292        with self.assertRaises(ValueError):
1293            lzma.open(TESTFN, "rb", encoding="utf-8")
1294        with self.assertRaises(ValueError):
1295            lzma.open(TESTFN, "rb", errors="ignore")
1296        with self.assertRaises(ValueError):
1297            lzma.open(TESTFN, "rb", newline="\n")
1298
1299    def test_format_and_filters(self):
1300        # Test non-default format and filter chain.
1301        options = {"format": lzma.FORMAT_RAW, "filters": FILTERS_RAW_1}
1302        with lzma.open(BytesIO(COMPRESSED_RAW_1), "rb", **options) as f:
1303            self.assertEqual(f.read(), INPUT)
1304        with BytesIO() as bio:
1305            with lzma.open(bio, "wb", **options) as f:
1306                f.write(INPUT)
1307            file_data = lzma.decompress(bio.getvalue(), **options)
1308            self.assertEqual(file_data, INPUT)
1309
1310    def test_encoding(self):
1311        # Test non-default encoding.
1312        uncompressed = INPUT.decode("ascii")
1313        uncompressed_raw = uncompressed.replace("\n", os.linesep)
1314        with BytesIO() as bio:
1315            with lzma.open(bio, "wt", encoding="utf-16-le") as f:
1316                f.write(uncompressed)
1317            file_data = lzma.decompress(bio.getvalue()).decode("utf-16-le")
1318            self.assertEqual(file_data, uncompressed_raw)
1319            bio.seek(0)
1320            with lzma.open(bio, "rt", encoding="utf-16-le") as f:
1321                self.assertEqual(f.read(), uncompressed)
1322
1323    def test_encoding_error_handler(self):
1324        # Test with non-default encoding error handler.
1325        with BytesIO(lzma.compress(b"foo\xffbar")) as bio:
1326            with lzma.open(bio, "rt", encoding="ascii", errors="ignore") as f:
1327                self.assertEqual(f.read(), "foobar")
1328
1329    def test_newline(self):
1330        # Test with explicit newline (universal newline mode disabled).
1331        text = INPUT.decode("ascii")
1332        with BytesIO() as bio:
1333            with lzma.open(bio, "wt", newline="\n") as f:
1334                f.write(text)
1335            bio.seek(0)
1336            with lzma.open(bio, "rt", newline="\r") as f:
1337                self.assertEqual(f.readlines(), [text])
1338
1339    def test_x_mode(self):
1340        self.addCleanup(unlink, TESTFN)
1341        for mode in ("x", "xb", "xt"):
1342            unlink(TESTFN)
1343            with lzma.open(TESTFN, mode):
1344                pass
1345            with self.assertRaises(FileExistsError):
1346                with lzma.open(TESTFN, mode):
1347                    pass
1348
1349
1350class MiscellaneousTestCase(unittest.TestCase):
1351
1352    def test_is_check_supported(self):
1353        # CHECK_NONE and CHECK_CRC32 should always be supported,
1354        # regardless of the options liblzma was compiled with.
1355        self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
1356        self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
1357
1358        # The .xz format spec cannot store check IDs above this value.
1359        self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
1360
1361        # This value should not be a valid check ID.
1362        self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
1363
1364    def test__encode_filter_properties(self):
1365        with self.assertRaises(TypeError):
1366            lzma._encode_filter_properties(b"not a dict")
1367        with self.assertRaises(ValueError):
1368            lzma._encode_filter_properties({"id": 0x100})
1369        with self.assertRaises(ValueError):
1370            lzma._encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
1371        with self.assertRaises(lzma.LZMAError):
1372            lzma._encode_filter_properties({"id": lzma.FILTER_DELTA,
1373                                           "dist": 9001})
1374
1375        # Test with parameters used by zipfile module.
1376        props = lzma._encode_filter_properties({
1377                "id": lzma.FILTER_LZMA1,
1378                "pb": 2,
1379                "lp": 0,
1380                "lc": 3,
1381                "dict_size": 8 << 20,
1382            })
1383        self.assertEqual(props, b"]\x00\x00\x80\x00")
1384
1385    def test__decode_filter_properties(self):
1386        with self.assertRaises(TypeError):
1387            lzma._decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
1388        with self.assertRaises(lzma.LZMAError):
1389            lzma._decode_filter_properties(lzma.FILTER_DELTA, b"too long")
1390
1391        # Test with parameters used by zipfile module.
1392        filterspec = lzma._decode_filter_properties(
1393                lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1394        self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
1395        self.assertEqual(filterspec["pb"], 2)
1396        self.assertEqual(filterspec["lp"], 0)
1397        self.assertEqual(filterspec["lc"], 3)
1398        self.assertEqual(filterspec["dict_size"], 8 << 20)
1399
1400    def test_filter_properties_roundtrip(self):
1401        spec1 = lzma._decode_filter_properties(
1402                lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
1403        reencoded = lzma._encode_filter_properties(spec1)
1404        spec2 = lzma._decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
1405        self.assertEqual(spec1, spec2)
1406
1407
1408# Test data:
1409
1410INPUT = b"""
1411LAERTES
1412
1413       O, fear me not.
1414       I stay too long: but here my father comes.
1415
1416       Enter POLONIUS
1417
1418       A double blessing is a double grace,
1419       Occasion smiles upon a second leave.
1420
1421LORD POLONIUS
1422
1423       Yet here, Laertes! aboard, aboard, for shame!
1424       The wind sits in the shoulder of your sail,
1425       And you are stay'd for. There; my blessing with thee!
1426       And these few precepts in thy memory
1427       See thou character. Give thy thoughts no tongue,
1428       Nor any unproportioned thought his act.
1429       Be thou familiar, but by no means vulgar.
1430       Those friends thou hast, and their adoption tried,
1431       Grapple them to thy soul with hoops of steel;
1432       But do not dull thy palm with entertainment
1433       Of each new-hatch'd, unfledged comrade. Beware
1434       Of entrance to a quarrel, but being in,
1435       Bear't that the opposed may beware of thee.
1436       Give every man thy ear, but few thy voice;
1437       Take each man's censure, but reserve thy judgment.
1438       Costly thy habit as thy purse can buy,
1439       But not express'd in fancy; rich, not gaudy;
1440       For the apparel oft proclaims the man,
1441       And they in France of the best rank and station
1442       Are of a most select and generous chief in that.
1443       Neither a borrower nor a lender be;
1444       For loan oft loses both itself and friend,
1445       And borrowing dulls the edge of husbandry.
1446       This above all: to thine ownself be true,
1447       And it must follow, as the night the day,
1448       Thou canst not then be false to any man.
1449       Farewell: my blessing season this in thee!
1450
1451LAERTES
1452
1453       Most humbly do I take my leave, my lord.
1454
1455LORD POLONIUS
1456
1457       The time invites you; go; your servants tend.
1458
1459LAERTES
1460
1461       Farewell, Ophelia; and remember well
1462       What I have said to you.
1463
1464OPHELIA
1465
1466       'Tis in my memory lock'd,
1467       And you yourself shall keep the key of it.
1468
1469LAERTES
1470
1471       Farewell.
1472"""
1473
1474COMPRESSED_BOGUS = b"this is not a valid lzma stream"
1475
1476COMPRESSED_XZ = (
1477    b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1478    b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1479    b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1480    b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1481    b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1482    b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1483    b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1484    b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1485    b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1486    b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1487    b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1488    b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1489    b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1490    b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1491    b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1492    b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1493    b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1494    b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1495    b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1496    b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1497    b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1498    b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1499    b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1500    b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1501    b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1502    b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1503    b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1504    b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1505    b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1506    b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1507    b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1508    b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1509    b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1510    b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1511    b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1512    b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1513    b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1514    b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1515    b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1516    b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1517    b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1518    b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1519    b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1520    b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1521)
1522
1523COMPRESSED_ALONE = (
1524    b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1525    b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1526    b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1527    b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1528    b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1529    b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1530    b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1531    b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1532    b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1533    b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1534    b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1535    b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1536    b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1537    b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1538    b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1539    b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1540    b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1541    b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1542    b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1543    b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1544    b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1545    b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1546    b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1547    b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1548    b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1549    b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1550    b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1551    b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1552    b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1553    b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1554    b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1555    b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1556    b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1557    b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1558    b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1559    b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1560    b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1561    b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1562    b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1563    b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1564    b"\xfbf\x7f\xff\xf0\x19\xeax"
1565)
1566
1567FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1568COMPRESSED_RAW_1 = (
1569    b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1570    b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1571    b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1572    b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1573    b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1574    b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1575    b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1576    b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1577    b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1578    b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1579    b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1580    b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1581    b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1582    b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1583    b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1584    b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1585    b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1586    b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1587    b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1588    b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1589    b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1590    b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1591    b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1592    b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1593    b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1594    b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1595    b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1596    b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1597    b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1598    b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1599    b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1600    b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1601    b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1602    b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1603    b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1604    b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1605    b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1606    b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1607    b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1608    b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1609    b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1610    b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1611    b"\xf6*F\xb32\x00\x00\x00"
1612)
1613
1614FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1615                 {"id": lzma.FILTER_LZMA2,
1616                  "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1617COMPRESSED_RAW_2 = (
1618    b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1619    b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1620    b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1621    b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1622    b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1623    b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1624    b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1625    b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1626    b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1627    b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1628    b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1629    b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1630    b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1631    b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1632    b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1633    b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1634    b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1635    b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1636    b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1637    b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1638    b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1639    b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1640    b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1641    b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1642    b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1643    b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1644    b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1645    b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1646    b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1647    b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1648    b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1649    b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1650    b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1651    b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1652    b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1653    b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1654    b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1655    b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1656    b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1657    b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1658    b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1659    b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1660    b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1661    b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1662    b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1663    b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1664    b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1665    b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1666    b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1667    b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1668    b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1669    b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1670    b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1671    b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1672    b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1673    b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1674    b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1675    b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1676    b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1677)
1678
1679FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1680                 {"id": lzma.FILTER_LZMA2}]
1681COMPRESSED_RAW_3 = (
1682    b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1683    b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1684    b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1685    b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1686    b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1687    b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1688    b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1689    b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1690    b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1691    b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1692    b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1693    b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1694    b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1695    b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1696    b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1697    b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1698    b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1699    b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1700    b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1701    b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1702    b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1703    b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1704    b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1705    b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1706    b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1707    b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1708    b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1709    b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1710    b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1711    b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1712    b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1713    b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1714    b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1715    b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1716    b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1717    b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1718    b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1719    b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1720    b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1721    b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1722    b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1723    b"\xec!\t4\x00\x00\x00"
1724)
1725
1726FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1727                 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1728                 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1729COMPRESSED_RAW_4 = (
1730    b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1731    b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1732    b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1733    b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1734    b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1735    b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1736    b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1737    b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1738    b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1739    b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1740    b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1741    b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1742    b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1743    b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1744    b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1745    b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1746    b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1747    b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1748    b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1749    b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1750    b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1751    b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1752    b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1753    b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1754    b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1755    b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1756    b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1757    b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1758    b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1759    b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1760    b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1761    b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1762    b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1763    b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1764    b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1765    b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1766    b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1767    b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1768    b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1769    b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1770    b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1771    b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1772    b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1773    b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1774    b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1775    b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1776    b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1777    b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1778    b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1779    b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1780    b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1781    b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1782    b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1783    b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1784    b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1785    b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1786    b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1787    b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1788    b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1789    b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1790    b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1791    b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1792    b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1793    b"\x00"
1794)
1795
1796ISSUE_21872_DAT = (
1797    b']\x00\x00@\x00h3\x00\x00\x00\x00\x00\x00\x00\x00`D\x0c\x99\xc8'
1798    b'\xd1\xbbZ^\xc43+\x83\xcd\xf1\xc6g\xec-\x061F\xb1\xbb\xc7\x17%-\xea'
1799    b'\xfap\xfb\x8fs\x128\xb2,\x88\xe4\xc0\x12|*x\xd0\xa2\xc4b\x1b!\x02c'
1800    b'\xab\xd9\x87U\xb8n \xfaVJ\x9a"\xb78\xff%_\x17`?@*\xc2\x82'
1801    b"\xf2^\x1b\xb8\x04&\xc0\xbb\x03g\x9d\xca\xe9\xa4\xc9\xaf'\xe5\x8e}"
1802    b'F\xdd\x11\xf3\x86\xbe\x1fN\x95\\\xef\xa2Mz-\xcb\x9a\xe3O@'
1803    b"\x19\x07\xf6\xee\x9e\x9ag\xc6\xa5w\rnG'\x99\xfd\xfeGI\xb0"
1804    b'\xbb\xf9\xc2\xe1\xff\xc5r\xcf\x85y[\x01\xa1\xbd\xcc/\xa3\x1b\x83\xaa'
1805    b'\xc6\xf9\x99\x0c\xb6_\xc9MQ+x\xa2F\xda]\xdd\xe8\xfb\x1a&'
1806    b',\xc4\x19\x1df\x81\x1e\x90\xf3\xb8Hgr\x85v\xbe\xa3qx\x01Y\xb5\x9fF'
1807    b"\x13\x18\x01\xe69\x9b\xc8'\x1e\x9d\xd6\xe4F\x84\xac\xf8d<\x11\xd5"
1808    b'\\\x0b\xeb\x0e\x82\xab\xb1\xe6\x1fka\xe1i\xc4 C\xb1"4)\xd6\xa7`\x02'
1809    b'\xec\x11\x8c\xf0\x14\xb0\x1d\x1c\xecy\xf0\xb7|\x11j\x85X\xb2!\x1c'
1810    b'\xac\xb5N\xc7\x85j\x9ev\xf5\xe6\x0b\xc1]c\xc15\x16\x9f\xd5\x99'
1811    b"\xfei^\xd2G\x9b\xbdl\xab:\xbe,\xa9'4\x82\xe5\xee\xb3\xc1"
1812    b'$\x93\x95\xa8Y\x16\xf5\xbf\xacw\x91\x04\x1d\x18\x06\xe9\xc5\xfdk\x06'
1813    b'\xe8\xfck\xc5\x86>\x8b~\xa4\xcb\xf1\xb3\x04\xf1\x04G5\xe2\xcc]'
1814    b'\x16\xbf\x140d\x18\xe2\xedw#(3\xca\xa1\x80bX\x7f\xb3\x84'
1815    b'\x9d\xdb\xe7\x08\x97\xcd\x16\xb9\xf1\xd5r+m\x1e\xcb3q\xc5\x9e\x92'
1816    b"\x7f\x8e*\xc7\xde\xe9\xe26\xcds\xb1\x10-\xf6r\x02?\x9d\xddCgJN'"
1817    b'\x11M\xfa\nQ\n\xe6`m\xb8N\xbbq\x8el\x0b\x02\xc7:q\x04G\xa1T'
1818    b'\xf1\xfe!0\x85~\xe5\x884\xe9\x89\xfb\x13J8\x15\xe42\xb6\xad'
1819    b'\x877A\x9a\xa6\xbft]\xd0\xe35M\xb0\x0cK\xc8\xf6\x88\xae\xed\xa9,j7'
1820    b'\x81\x13\xa0(\xcb\xe1\xe9l2\x7f\xcd\xda\x95(\xa70B\xbd\xf4\xe3'
1821    b'hp\x94\xbdJ\xd7\t\xc7g\xffo?\x89?\xf8}\x7f\xbc\x1c\x87'
1822    b'\x14\xc0\xcf\x8cV:\x9a\x0e\xd0\xb2\x1ck\xffk\xb9\xe0=\xc7\x8d/'
1823    b'\xb8\xff\x7f\x1d\x87`\x19.\x98X*~\xa7j\xb9\x0b"\xf4\xe4;V`\xb9\xd7'
1824    b'\x03\x1e\xd0t0\xd3\xde\x1fd\xb9\xe2)\x16\x81}\xb1\\b\x7fJ'
1825    b'\x92\xf4\xff\n+V!\xe9\xde\x98\xa0\x8fK\xdf7\xb9\xc0\x12\x1f\xe2'
1826    b'\xe9\xb0`\xae\x14\r\xa7\xc4\x81~\xd8\x8d\xc5\x06\xd8m\xb0Y\x8a)'
1827    b'\x06/\xbb\xf9\xac\xeaP\xe0\x91\x05m[\xe5z\xe6Z\xf3\x9f\xc7\xd0'
1828    b'\xd3\x8b\xf3\x8a\x1b\xfa\xe4Pf\xbc0\x17\x10\xa9\xd0\x95J{\xb3\xc3'
1829    b'\xfdW\x9bop\x0f\xbe\xaee\xa3]\x93\x9c\xda\xb75<\xf6g!\xcc\xb1\xfc\\'
1830    b'7\x152Mc\x17\x84\x9d\xcd35\r0\xacL-\xf3\xfb\xcb\x96\x1e\xe9U\x7f'
1831    b'\xd7\xca\xb0\xcc\x89\x0c*\xce\x14\xd1P\xf1\x03\xb6.~9o?\xe8'
1832    b'\r\x86\xe0\x92\x87}\xa3\x84\x03P\xe0\xc2\x7f\n;m\x9d\x9e\xb4|'
1833    b'\x8c\x18\xc0#0\xfe3\x07<\xda\xd8\xcf^\xd4Hi\xd6\xb3\x0bT'
1834    b'\x1dF\x88\x85q}\x02\xc6&\xc4\xae\xce\x9cU\xfa\x0f\xcc\xb6\x1f\x11'
1835    b'drw\x9eN\x19\xbd\xffz\x0f\xf0\x04s\xadR\xc1\xc0\xbfl\xf1\xba\xf95^'
1836    b'e\xb1\xfbVY\xd9\x9f\x1c\xbf*\xc4\xa86\x08+\xd6\x88[\xc4_rc\xf0f'
1837    b'\xb8\xd4\xec\x1dx\x19|\xbf\xa7\xe0\x82\x0b\x8c~\x10L/\x90\xd6\xfb'
1838    b'\x81\xdb\x98\xcc\x02\x14\xa5C\xb2\xa7i\xfd\xcd\x1fO\xf7\xe9\x89t\xf0'
1839    b'\x17\xa5\x1c\xad\xfe<Q`%\x075k\n7\x9eI\x82<#)&\x04\xc2\xf0C\xd4`!'
1840    b'\xcb\xa9\xf9\xb3F\x86\xb5\xc3M\xbeu\x12\xb2\xca\x95e\x10\x0b\xb1\xcc'
1841    b'\x01b\x9bXa\x1b[B\x8c\x07\x11Of;\xeaC\xebr\x8eb\xd9\x9c\xe4i]<z\x9a'
1842    b'\x03T\x8b9pF\x10\x8c\x84\xc7\x0e\xeaPw\xe5\xa0\x94\x1f\x84\xdd'
1843    b'a\xe8\x85\xc2\x00\xebq\xe7&Wo5q8\xc2t\x98\xab\xb7\x7f\xe64-H'
1844    b'\t\xb4d\xbe\x06\xe3Q\x8b\xa9J\xb0\x00\xd7s.\x85"\xc0p\x05'
1845    b'\x1c\x06N\x87\xa5\xf8\xc3g\x1b}\x0f\x0f\xc3|\x90\xea\xefd3X'
1846    b'[\xab\x04E\xf2\xf2\xc9\x08\x8a\xa8+W\xa2v\xec\x15G\x08/I<L\\1'
1847    b'\xff\x15O\xaa\x89{\xd1mW\x13\xbd~\xe1\x90^\xc4@\r\xed\xb5D@\xb4\x08'
1848    b'A\x90\xe69;\xc7BO\xdb\xda\xebu\x9e\xa9tN\xae\x8aJ5\xcd\x11\x1d\xea'
1849    b"\xe5\xa7\x04\xe6\x82Z\xc7O\xe46[7\xdco*[\xbe\x0b\xc9\xb7a\xab'\xf6"
1850    b"\xd1u\xdb\xd9q\xf5+y\x1b\x00\xb4\xf3a\xae\xf1M\xc4\xbc\xd00'\x06pQ"
1851    b'\x8dH\xaa\xaa\xc4\xd2K\x9b\xc0\xe9\xec=n\xa9\x1a\x8a\xc2\xe8\x18\xbc'
1852    b'\x93\xb8F\xa1\x8fOY\xe7\xda\xcf0\t\xff|\xd9\xe5\xcf\xe7\xf6\xbe'
1853    b'\xf8\x04\x17\xf2\xe5P\xa7y~\xce\x11h0\x81\x80d[\x00_v\xbbc\xdbI'
1854    b'3\xbc`W\xc0yrkB\xf5\x9f\xe9i\xc5\x8a^\x8d\xd4\x81\xd9\x05\xc1\xfc>'
1855    b'"\xd1v`\x82\xd5$\x89\xcf^\xd52.\xafd\xe8d@\xaa\xd5Y|\x90\x84'
1856    b'j\xdb}\x84riV\x8e\xf0X4rB\xf2NPS[\x8e\x88\xd4\x0fI\xb8'
1857    b'\xdd\xcb\x1d\xf2(\xdf;9\x9e|\xef^0;.*[\x9fl\x7f\xa2_X\xaff!\xbb\x03'
1858    b'\xff\x19\x8f\x88\xb5\xb6\x884\xa3\x05\xde3D{\xe3\xcb\xce\xe4t]'
1859    b'\x875\xe3Uf\xae\xea\x88\x1c\x03b\n\xb1,Q\xec\xcf\x08\t\xde@\x83\xaa<'
1860    b',-\xe4\xee\x9b\x843\xe5\x007\tK\xac\x057\xd6*X\xa3\xc6~\xba\xe6O'
1861    b'\x81kz"\xbe\xe43sL\xf1\xfa;\xf4^\x1e\xb4\x80\xe2\xbd\xaa\x17Z\xe1f'
1862    b'\xda\xa6\xb9\x07:]}\x9fa\x0b?\xba\xe7\xf15\x04M\xe3\n}M\xa4\xcb\r'
1863    b'2\x8a\x88\xa9\xa7\x92\x93\x84\x81Yo\x00\xcc\xc4\xab\x9aT\x96\x0b\xbe'
1864    b'U\xac\x1d\x8d\x1b\x98"\xf8\x8f\xf1u\xc1n\xcc\xfcA\xcc\x90\xb7i'
1865    b'\x83\x9c\x9c~\x1d4\xa2\xf0*J\xe7t\x12\xb4\xe3\xa0u\xd7\x95Z'
1866    b'\xf7\xafG\x96~ST,\xa7\rC\x06\xf4\xf0\xeb`2\x9e>Q\x0e\xf6\xf5\xc5'
1867    b'\x9b\xb5\xaf\xbe\xa3\x8f\xc0\xa3hu\x14\x12 \x97\x99\x04b\x8e\xc7\x1b'
1868    b'VKc\xc1\xf3 \xde\x85-:\xdc\x1f\xac\xce*\x06\xb3\x80;`'
1869    b'\xdb\xdd\x97\xfdg\xbf\xe7\xa8S\x08}\xf55e7\xb8/\xf0!\xc8'
1870    b"Y\xa8\x9a\x07'\xe2\xde\r\x02\xe1\xb2\x0c\xf4C\xcd\xf9\xcb(\xe8\x90"
1871    b'\xd3bTD\x15_\xf6\xc3\xfb\xb3E\xfc\xd6\x98{\xc6\\fz\x81\xa99\x85\xcb'
1872    b'\xa5\xb1\x1d\x94bqW\x1a!;z~\x18\x88\xe8i\xdb\x1b\x8d\x8d'
1873    b'\x06\xaa\x0e\x99s+5k\x00\xe4\xffh\xfe\xdbt\xa6\x1bU\xde\xa3'
1874    b'\xef\xcb\x86\x9e\x81\x16j\n\x9d\xbc\xbbC\x80?\x010\xc7Jj;'
1875    b'\xc4\xe5\x86\xd5\x0e0d#\xc6;\xb8\xd1\xc7c\xb5&8?\xd9J\xe5\xden\xb9'
1876    b'\xe9cb4\xbb\xe6\x14\xe0\xe7l\x1b\x85\x94\x1fh\xf1n\xdeZ\xbe'
1877    b'\x88\xff\xc2e\xca\xdc,B-\x8ac\xc9\xdf\xf5|&\xe4LL\xf0\x1f\xaa8\xbd'
1878    b'\xc26\x94bVi\xd3\x0c\x1c\xb6\xbb\x99F\x8f\x0e\xcc\x8e4\xc6/^W\xf5?'
1879    b'\xdc\x84(\x14dO\x9aD6\x0f4\xa3,\x0c\x0bS\x9fJ\xe1\xacc^\x8a0\t\x80D['
1880    b'\xb8\xe6\x86\xb0\xe8\xd4\xf9\x1en\xf1\xf5^\xeb\xb8\xb8\xf8'
1881    b')\xa8\xbf\xaa\x84\x86\xb1a \x95\x16\x08\x1c\xbb@\xbd+\r/\xfb'
1882    b'\x92\xfbh\xf1\x8d3\xf9\x92\xde`\xf1\x86\x03\xaa+\xd9\xd9\xc6P\xaf'
1883    b'\xe3-\xea\xa5\x0fB\xca\xde\xd5n^\xe3/\xbf\xa6w\xc8\x0e<M'
1884    b'\xc2\x1e!\xd4\xc6E\xf2\xad\x0c\xbc\x1d\x88Y\x03\x98<\x92\xd9\xa6B'
1885    b'\xc7\x83\xb5"\x97D|&\xc4\xd4\xfad\x0e\xde\x06\xa3\xc2\x9c`\xf2'
1886    b'7\x03\x1a\xed\xd80\x10\xe9\x0co\x10\xcf\x18\x16\xa7\x1c'
1887    b"\xe5\x96\xa4\xd9\xe1\xa5v;]\xb7\xa9\xdc'hA\xe3\x9c&\x98\x0b9\xdf~@"
1888    b'\xf8\xact\x87<\xf94\x0c\x9d\x93\xb0)\xe1\xa2\x0f\x1e=:&\xd56\xa5A+'
1889    b'\xab\xc4\x00\x8d\x81\x93\xd4\xd8<\x82k\\d\xd8v\xab\xbd^l5C?\xd4\xa0'
1890    b'M\x12C\xc8\x80\r\xc83\xe8\xc0\xf5\xdf\xca\x05\xf4BPjy\xbe\x91\x9bzE'
1891    b"\xd8[\x93oT\r\x13\x16'\x1a\xbd*H\xd6\xfe\r\xf3\x91M\x8b\xee\x8f7f"
1892    b"\x0b;\xaa\x85\xf2\xdd'\x0fwM \xbd\x13\xb9\xe5\xb8\xb7 D+P\x1c\xe4g"
1893    b'n\xd2\xf1kc\x15\xaf\xc6\x90V\x03\xc2UovfZ\xcc\xd23^\xb3\xe7\xbf'
1894    b'\xacv\x1d\x82\xedx\xa3J\xa9\xb7\xcf\x0c\xe6j\x96n*o\x18>'
1895    b'\xc6\xfd\x97_+D{\x03\x15\xe8s\xb1\xc8HAG\xcf\xf4\x1a\xdd'
1896    b'\xad\x11\xbf\x157q+\xdeW\x89g"X\x82\xfd~\xf7\xab4\xf6`\xab\xf1q'
1897    b')\x82\x10K\xe9sV\xfe\xe45\xafs*\x14\xa7;\xac{\x06\x9d<@\x93G'
1898    b'j\x1d\xefL\xe9\xd8\x92\x19&\xa1\x16\x19\x04\tu5\x01]\xf6\xf4'
1899    b'\xcd\\\xd8A|I\xd4\xeb\x05\x88C\xc6e\xacQ\xe9*\x97~\x9au\xf8Xy'
1900    b"\x17P\x10\x9f\n\x8c\xe2fZEu>\x9b\x1e\x91\x0b'`\xbd\xc0\xa8\x86c\x1d"
1901    b'Z\xe2\xdc8j\x95\xffU\x90\x1e\xf4o\xbc\xe5\xe3e>\xd2R\xc0b#\xbc\x15'
1902    b'H-\xb9!\xde\x9d\x90k\xdew\x9b{\x99\xde\xf7/K)A\xfd\xf5\xe6:\xda'
1903    b'UM\xcc\xbb\xa2\x0b\x9a\x93\xf5{9\xc0 \xd2((6i\xc0\xbbu\xd8\x9e\x8d'
1904    b'\xf8\x04q\x10\xd4\x14\x9e7-\xb9B\xea\x01Q8\xc8v\x9a\x12A\x88Cd\x92'
1905    b"\x1c\x8c!\xf4\x94\x87'\xe3\xcd\xae\xf7\xd8\x93\xfa\xde\xa8b\x9e\xee2"
1906    b'K\xdb\x00l\x9d\t\xb1|D\x05U\xbb\xf4>\xf1w\x887\xd1}W\x9d|g|1\xb0\x13'
1907    b"\xa3 \xe5\xbfm@\xc06+\xb7\t\xcf\x15D\x9a \x1fM\x1f\xd2\xb5'\xa9\xbb"
1908    b'~Co\x82\xfa\xc2\t\xe6f\xfc\xbeI\xae1\x8e\xbe\xb8\xcf\x86\x17'
1909    b'\x9f\xe2`\xbd\xaf\xba\xb9\xbc\x1b\xa3\xcd\x82\x8fwc\xefd\xa9\xd5\x14'
1910    b'\xe2C\xafUE\xb6\x11MJH\xd0=\x05\xd4*I\xff"\r\x1b^\xcaS6=\xec@\xd5'
1911    b'\x11,\xe0\x87Gr\xaa[\xb8\xbc>n\xbd\x81\x0c\x07<\xe9\x92('
1912    b'\xb2\xff\xac}\xe7\xb6\x15\x90\x9f~4\x9a\xe6\xd6\xd8s\xed\x99tf'
1913    b'\xa0f\xf8\xf1\x87\t\x96/)\x85\xb6\n\xd7\xb2w\x0b\xbc\xba\x99\xee'
1914    b'Q\xeen\x1d\xad\x03\xc3s\xd1\xfd\xa2\xc6\xb7\x9a\x9c(G<6\xad[~H '
1915    b'\x16\x89\x89\xd0\xc3\xd2\xca~\xac\xea\xa5\xed\xe5\xfb\r:'
1916    b'\x8e\xa6\xf1e\xbb\xba\xbd\xe0(\xa3\x89_\x01(\xb5c\xcc\x9f\x1fg'
1917    b'v\xfd\x17\xb3\x08S=S\xee\xfc\x85>\x91\x8d\x8d\nYR\xb3G\xd1A\xa2\xb1'
1918    b'\xec\xb0\x01\xd2\xcd\xf9\xfe\x82\x06O\xb3\xecd\xa9c\xe0\x8eP\x90\xce'
1919    b'\xe0\xcd\xd8\xd8\xdc\x9f\xaa\x01"[Q~\xe4\x88\xa1#\xc1\x12C\xcf'
1920    b'\xbe\x80\x11H\xbf\x86\xd8\xbem\xcfWFQ(X\x01DK\xdfB\xaa\x10.-'
1921    b'\xd5\x9e|\x86\x15\x86N]\xc7Z\x17\xcd=\xd7)M\xde\x15\xa4LTi\xa0\x15'
1922    b'\xd1\xe7\xbdN\xa4?\xd1\xe7\x02\xfe4\xe4O\x89\x98&\x96\x0f\x02\x9c'
1923    b'\x9e\x19\xaa\x13u7\xbd0\xdc\xd8\x93\xf4BNE\x1d\x93\x82\x81\x16'
1924    b'\xe5y\xcf\x98D\xca\x9a\xe2\xfd\xcdL\xcc\xd1\xfc_\x0b\x1c\xa0]\xdc'
1925    b'\xa91 \xc9c\xd8\xbf\x97\xcfp\xe6\x19-\xad\xff\xcc\xd1N(\xe8'
1926    b'\xeb#\x182\x96I\xf7l\xf3r\x00'
1927)
1928
1929
1930def test_main():
1931    run_unittest(
1932        CompressorDecompressorTestCase,
1933        CompressDecompressFunctionTestCase,
1934        FileTestCase,
1935        OpenTestCase,
1936        MiscellaneousTestCase,
1937    )
1938
1939if __name__ == "__main__":
1940    test_main()
1941