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