pax_global_header00006660000000000000000000000064132111627610014512gustar00rootroot0000000000000052 comment=a60800c1a614a2964985eb614f2aa9082f148edf python-magic-0.4.15/000077500000000000000000000000001321116276100142005ustar00rootroot00000000000000python-magic-0.4.15/.gitignore000066400000000000000000000000371321116276100161700ustar00rootroot00000000000000deb_dist python_magic.egg-info python-magic-0.4.15/.travis.yml000066400000000000000000000005321321116276100163110ustar00rootroot00000000000000language: python # needed to use trusty sudo: required dist: xenial python: - "2.6" - "2.7" - "3.3" - "3.4" - "3.5" - "3.6" - "nightly" install: - pip install coverage - python setup.py install script: - coverage run setup.py test after_success: - pip install coveralls && coveralls - pip install codecov && codecov python-magic-0.4.15/LICENSE000066400000000000000000000020711321116276100152050ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2001-2014 Adam Hupp Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. python-magic-0.4.15/MANIFEST.in000066400000000000000000000000351321116276100157340ustar00rootroot00000000000000include *.py include LICENSE python-magic-0.4.15/README.md000066400000000000000000000103621321116276100154610ustar00rootroot00000000000000# python-magic [![PyPI version](https://badge.fury.io/py/python-magic.svg)](https://badge.fury.io/py/python-magic) [![Build Status](https://travis-ci.org/ahupp/python-magic.svg?branch=master)](https://travis-ci.org/ahupp/python-magic) python-magic is a python interface to the libmagic file type identification library. libmagic identifies file types by checking their headers according to a predefined list of file types. This functionality is exposed to the command line by the Unix command `file`. ## Usage ```python >>> import magic >>> magic.from_file("testdata/test.pdf") 'PDF document, version 1.2' >>> magic.from_buffer(open("testdata/test.pdf").read(1024)) 'PDF document, version 1.2' >>> magic.from_file("testdata/test.pdf", mime=True) 'application/pdf' ``` There is also a `Magic` class that provides more direct control, including overriding the magic database file and turning on character encoding detection. This is not recommended for general use. In particular, it's not safe for sharing across multiple threads and will fail throw if this is attempted. ```python >>> f = magic.Magic(uncompress=True) >>> f.from_file('testdata/test.gz') 'ASCII text (gzip compressed data, was "test", last modified: Sat Jun 28 21:32:52 2008, from Unix)' ``` You can also combine the flag options: ```python >>> f = magic.Magic(mime=True, uncompress=True) >>> f.from_file('testdata/test.gz') 'text/plain' ``` ## Versioning Minor version bumps should be backwards compatible. Major bumps are not. ## Name Conflict There are, sadly, two libraries which use the module name `magic`. Both have been around for quite a while.If you are using this module and get an error using a method like `open`, your code is expecting the other one. Hopefully one day these will be reconciled. ## Installation The current stable version of python-magic is available on pypi and can be installed by running `pip install python-magic`. Other sources: - pypi: http://pypi.python.org/pypi/python-magic/ - github: https://github.com/ahupp/python-magic ### Windows You'll need DLLs for libmagic. @julian-r has uploaded a versoin of this project that includes binaries to pypi: https://pypi.python.org/pypi/python-magic-bin/0.4.14 Other sources of the libraries in the past have been [File for Windows](http://gnuwin32.sourceforge.net/packages/file.htm) . You will need to copy the file `magic` out of `[binary-zip]\share\misc`, and pass it's location to `Magic(magic_file=...)`. If you are using a 64-bit build of python, you'll need 64-bit libmagic binaries which can be found here: https://github.com/pidydx/libmagicwin64. Newer version can be found here: https://github.com/nscaife/file-windows. ### OSX - When using Homebrew: `brew install libmagic` - When using macports: `port install file` ### Troubleshooting - 'MagicException: could not find any magic files!': some installations of libmagic do not correctly point to their magic database file. Try specifying the path to the file explicitly in the constructor: `magic.Magic(magic_file="path_to_magic_file")`. - 'WindowsError: [Error 193] %1 is not a valid Win32 application': Attempting to run the 32-bit libmagic DLL in a 64-bit build of python will fail with this error. Here are 64-bit builds of libmagic for windows: https://github.com/pidydx/libmagicwin64 - 'WindowsError: exception: access violation writing 0x00000000 ' This may indicate you are mixing Windows Python and Cygwin Python. Make sure your libmagic and python builds are consistent. ## Author Written by Adam Hupp in 2001 for a project that never got off the ground. It originally used SWIG for the C library bindings, but switched to ctypes once that was part of the python standard library. You can contact me via my [website](http://hupp.org/adam) or [github](http://github.com/ahupp). ## Contributors Thanks to these folks on github who submitted features and bugfixes. - Amit Sethi - [bigben87](https://github.com/bigben87) - [fallgesetz](https://github.com/fallgesetz) - [FlaPer87](https://github.com/FlaPer87) - [lukenowak](https://github.com/lukenowak) - NicolasDelaby - sacha@ssl.co.uk - SimpleSeb - [tehmaze](https://github.com/tehmaze) ## License python-magic is distributed under the MIT license. See the included LICENSE file for details. python-magic-0.4.15/__init__.py000066400000000000000000000000001321116276100162770ustar00rootroot00000000000000python-magic-0.4.15/magic.py000066400000000000000000000226751321116276100156460ustar00rootroot00000000000000""" magic is a wrapper around the libmagic file identification library. See README for more information. Usage: >>> import magic >>> magic.from_file("testdata/test.pdf") 'PDF document, version 1.2' >>> magic.from_file("testdata/test.pdf", mime=True) 'application/pdf' >>> magic.from_buffer(open("testdata/test.pdf").read(1024)) 'PDF document, version 1.2' >>> """ import sys import glob import os.path import ctypes import ctypes.util import threading from ctypes import c_char_p, c_int, c_size_t, c_void_p class MagicException(Exception): def __init__(self, message): super(MagicException, self).__init__(message) self.message = message class Magic: """ Magic is a wrapper around the libmagic C library. """ def __init__(self, mime=False, magic_file=None, mime_encoding=False, keep_going=False, uncompress=False): """ Create a new libmagic wrapper. mime - if True, mimetypes are returned instead of textual descriptions mime_encoding - if True, codec is returned magic_file - use a mime database other than the system default keep_going - don't stop at the first match, keep going uncompress - Try to look inside compressed files. """ self.flags = MAGIC_NONE if mime: self.flags |= MAGIC_MIME if mime_encoding: self.flags |= MAGIC_MIME_ENCODING if keep_going: self.flags |= MAGIC_CONTINUE if uncompress: self.flags |= MAGIC_COMPRESS self.cookie = magic_open(self.flags) self.lock = threading.Lock() magic_load(self.cookie, magic_file) def from_buffer(self, buf): """ Identify the contents of `buf` """ with self.lock: try: # if we're on python3, convert buf to bytes # otherwise this string is passed as wchar* # which is not what libmagic expects if type(buf) == str and str != bytes: buf = buf.encode('utf-8', errors='replace') return maybe_decode(magic_buffer(self.cookie, buf)) except MagicException as e: return self._handle509Bug(e) def from_file(self, filename): # raise FileNotFoundException or IOError if the file does not exist with open(filename): pass with self.lock: try: return maybe_decode(magic_file(self.cookie, filename)) except MagicException as e: return self._handle509Bug(e) def _handle509Bug(self, e): # libmagic 5.09 has a bug where it might fail to identify the # mimetype of a file and returns null from magic_file (and # likely _buffer), but also does not return an error message. if e.message is None and (self.flags & MAGIC_MIME): return "application/octet-stream" else: raise e def __del__(self): # no _thread_check here because there can be no other # references to this object at this point. # during shutdown magic_close may have been cleared already so # make sure it exists before using it. # the self.cookie check should be unnecessary and was an # incorrect fix for a threading problem, however I'm leaving # it in because it's harmless and I'm slightly afraid to # remove it. if self.cookie and magic_close: magic_close(self.cookie) self.cookie = None _instances = {} def _get_magic_type(mime): i = _instances.get(mime) if i is None: i = _instances[mime] = Magic(mime=mime) return i def from_file(filename, mime=False): """" Accepts a filename and returns the detected filetype. Return value is the mimetype if mime=True, otherwise a human readable name. >>> magic.from_file("testdata/test.pdf", mime=True) 'application/pdf' """ m = _get_magic_type(mime) return m.from_file(filename) def from_buffer(buffer, mime=False): """ Accepts a binary string and returns the detected filetype. Return value is the mimetype if mime=True, otherwise a human readable name. >>> magic.from_buffer(open("testdata/test.pdf").read(1024)) 'PDF document, version 1.2' """ m = _get_magic_type(mime) return m.from_buffer(buffer) libmagic = None # Let's try to find magic or magic1 dll = ctypes.util.find_library('magic') or ctypes.util.find_library('magic1') or ctypes.util.find_library('cygmagic-1') # This is necessary because find_library returns None if it doesn't find the library if dll: libmagic = ctypes.CDLL(dll) if not libmagic or not libmagic._name: windows_dlls = ['magic1.dll','cygmagic-1.dll'] platform_to_lib = {'darwin': ['/opt/local/lib/libmagic.dylib', '/usr/local/lib/libmagic.dylib'] + # Assumes there will only be one version installed glob.glob('/usr/local/Cellar/libmagic/*/lib/libmagic.dylib'), 'win32': windows_dlls, 'cygwin': windows_dlls, 'linux': ['libmagic.so.1'], # fallback for some Linuxes (e.g. Alpine) where library search does not work } platform = 'linux' if sys.platform.startswith('linux') else sys.platform for dll in platform_to_lib.get(platform, []): try: libmagic = ctypes.CDLL(dll) break except OSError: pass if not libmagic or not libmagic._name: # It is better to raise an ImportError since we are importing magic module raise ImportError('failed to find libmagic. Check your installation') magic_t = ctypes.c_void_p def errorcheck_null(result, func, args): if result is None: err = magic_error(args[0]) raise MagicException(err) else: return result def errorcheck_negative_one(result, func, args): if result is -1: err = magic_error(args[0]) raise MagicException(err) else: return result # return str on python3. Don't want to unconditionally # decode because that results in unicode on python2 def maybe_decode(s): if str == bytes: return s else: return s.decode('utf-8') def coerce_filename(filename): if filename is None: return None # ctypes will implicitly convert unicode strings to bytes with # .encode('ascii'). If you use the filesystem encoding # then you'll get inconsistent behavior (crashes) depending on the user's # LANG environment variable is_unicode = (sys.version_info[0] <= 2 and isinstance(filename, unicode)) or \ (sys.version_info[0] >= 3 and isinstance(filename, str)) if is_unicode: return filename.encode('utf-8', 'surrogateescape') else: return filename magic_open = libmagic.magic_open magic_open.restype = magic_t magic_open.argtypes = [c_int] magic_close = libmagic.magic_close magic_close.restype = None magic_close.argtypes = [magic_t] magic_error = libmagic.magic_error magic_error.restype = c_char_p magic_error.argtypes = [magic_t] magic_errno = libmagic.magic_errno magic_errno.restype = c_int magic_errno.argtypes = [magic_t] _magic_file = libmagic.magic_file _magic_file.restype = c_char_p _magic_file.argtypes = [magic_t, c_char_p] _magic_file.errcheck = errorcheck_null def magic_file(cookie, filename): return _magic_file(cookie, coerce_filename(filename)) _magic_buffer = libmagic.magic_buffer _magic_buffer.restype = c_char_p _magic_buffer.argtypes = [magic_t, c_void_p, c_size_t] _magic_buffer.errcheck = errorcheck_null def magic_buffer(cookie, buf): return _magic_buffer(cookie, buf, len(buf)) _magic_load = libmagic.magic_load _magic_load.restype = c_int _magic_load.argtypes = [magic_t, c_char_p] _magic_load.errcheck = errorcheck_negative_one def magic_load(cookie, filename): return _magic_load(cookie, coerce_filename(filename)) magic_setflags = libmagic.magic_setflags magic_setflags.restype = c_int magic_setflags.argtypes = [magic_t, c_int] magic_check = libmagic.magic_check magic_check.restype = c_int magic_check.argtypes = [magic_t, c_char_p] magic_compile = libmagic.magic_compile magic_compile.restype = c_int magic_compile.argtypes = [magic_t, c_char_p] MAGIC_NONE = 0x000000 # No flags MAGIC_DEBUG = 0x000001 # Turn on debugging MAGIC_SYMLINK = 0x000002 # Follow symlinks MAGIC_COMPRESS = 0x000004 # Check inside compressed files MAGIC_DEVICES = 0x000008 # Look at the contents of devices MAGIC_MIME = 0x000010 # Return a mime string MAGIC_MIME_ENCODING = 0x000400 # Return the MIME encoding MAGIC_CONTINUE = 0x000020 # Return all matches MAGIC_CHECK = 0x000040 # Print warnings to stderr MAGIC_PRESERVE_ATIME = 0x000080 # Restore access time on exit MAGIC_RAW = 0x000100 # Don't translate unprintable chars MAGIC_ERROR = 0x000200 # Handle ENOENT etc as real errors MAGIC_NO_CHECK_COMPRESS = 0x001000 # Don't check for compressed files MAGIC_NO_CHECK_TAR = 0x002000 # Don't check for tar files MAGIC_NO_CHECK_SOFT = 0x004000 # Don't check magic entries MAGIC_NO_CHECK_APPTYPE = 0x008000 # Don't check application type MAGIC_NO_CHECK_ELF = 0x010000 # Don't check for elf details MAGIC_NO_CHECK_ASCII = 0x020000 # Don't check for ascii files MAGIC_NO_CHECK_TROFF = 0x040000 # Don't check ascii/troff MAGIC_NO_CHECK_FORTRAN = 0x080000 # Don't check ascii/fortran MAGIC_NO_CHECK_TOKENS = 0x100000 # Don't check ascii/tokens python-magic-0.4.15/setup.cfg000066400000000000000000000001051321116276100160150ustar00rootroot00000000000000[global] command_packages=stdeb.command [bdist_wheel] universal = 1 python-magic-0.4.15/setup.py000066400000000000000000000023621321116276100157150ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from setuptools import setup setup(name='python-magic', description='File type identification using libmagic', author='Adam Hupp', author_email='adam@hupp.org', url="http://github.com/ahupp/python-magic", version='0.4.15', py_modules=['magic'], long_description="""This module uses ctypes to access the libmagic file type identification library. It makes use of the local magic database and supports both textual and MIME-type output. """, keywords="mime magic file", license="MIT", test_suite='test', classifiers=[ 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: Implementation :: CPython', ], ) python-magic-0.4.15/stdeb.cfg000066400000000000000000000000721321116276100157610ustar00rootroot00000000000000[python-magic] Depends: libmagic1 Conflicts: python-magic python-magic-0.4.15/test/000077500000000000000000000000001321116276100151575ustar00rootroot00000000000000python-magic-0.4.15/test/__init__.py000066400000000000000000000000001321116276100172560ustar00rootroot00000000000000python-magic-0.4.15/test/run.sh000077500000000000000000000004261321116276100163240ustar00rootroot00000000000000#!/bin/sh # ensure we can use unicode filenames in the test export LC_ALL=en_US.UTF-8 THISDIR=`dirname $0` export PYTHONPATH=${THISDIR}/.. echo "python2.6" python2.6 ${THISDIR}/test.py echo "python2.7" python2.7 ${THISDIR}/test.py echo "python3.0" python3 ${THISDIR}/test.py python-magic-0.4.15/test/test.py000077500000000000000000000076221321116276100165220ustar00rootroot00000000000000import os, sys # for output which reports a local time os.environ['TZ'] = 'GMT' import shutil import os.path import unittest import magic class MagicTest(unittest.TestCase): TESTDATA_DIR = os.path.join(os.path.dirname(__file__), 'testdata') def assert_values(self, m, expected_values): for filename, expected_value in expected_values.items(): try: filename = os.path.join(self.TESTDATA_DIR, filename) except TypeError: filename = os.path.join(self.TESTDATA_DIR.encode('utf-8'), filename) if type(expected_value) is not tuple: expected_value = (expected_value,) for i in expected_value: with open(filename, 'rb') as f: buf_value = m.from_buffer(f.read()) file_value = m.from_file(filename) if buf_value == i and file_value == i: break else: self.assertTrue(False, "no match for " + repr(expected_value)) def test_from_buffer_str_and_bytes(self): m = magic.Magic(mime=True) s = '#!/usr/bin/env python\nprint("foo")' self.assertEqual("text/x-python", m.from_buffer(s)) b = b'#!/usr/bin/env python\nprint("foo")' self.assertEqual("text/x-python", m.from_buffer(b)) def test_mime_types(self): dest = os.path.join(MagicTest.TESTDATA_DIR, b'\xce\xbb'.decode('utf-8')) shutil.copyfile(os.path.join(MagicTest.TESTDATA_DIR, 'lambda'), dest) try: m = magic.Magic(mime=True) self.assert_values(m, { 'magic._pyc_': 'application/octet-stream', 'test.pdf': 'application/pdf', 'test.gz': 'application/gzip', 'text.txt': 'text/plain', b'\xce\xbb'.decode('utf-8'): 'text/plain', b'\xce\xbb': 'text/plain', }) finally: os.unlink(dest) def test_descriptions(self): m = magic.Magic() os.environ['TZ'] = 'UTC' # To get the last modified date of test.gz in UTC try: self.assert_values(m, { 'magic._pyc_': 'python 2.4 byte-compiled', 'test.pdf': 'PDF document, version 1.2', 'test.gz': ('gzip compressed data, was "test", from Unix, last modified: Sun Jun 29 01:32:52 2008', 'gzip compressed data, was "test", last modified: Sun Jun 29 01:32:52 2008, from Unix'), 'text.txt': 'ASCII text', }) finally: del os.environ['TZ'] def test_mime_encodings(self): m = magic.Magic(mime_encoding=True) self.assert_values(m, { 'text-iso8859-1.txt': 'iso-8859-1', 'text.txt': 'us-ascii', }) def test_errors(self): m = magic.Magic() self.assertRaises(IOError, m.from_file, 'nonexistent') self.assertRaises(magic.MagicException, magic.Magic, magic_file='nonexistent') os.environ['MAGIC'] = 'nonexistent' try: self.assertRaises(magic.MagicException, magic.Magic) finally: del os.environ['MAGIC'] def test_keep_going(self): filename = os.path.join(self.TESTDATA_DIR, 'keep-going.jpg') m = magic.Magic(mime=True) self.assertEqual(m.from_file(filename), 'image/jpeg') m = magic.Magic(mime=True, keep_going=True) self.assertEqual(m.from_file(filename), 'image/jpeg') def test_rethrow(self): old = magic.magic_buffer try: def t(x,y): raise magic.MagicException("passthrough") magic.magic_buffer = t self.assertRaises(magic.MagicException, magic.from_buffer, "hello", True) finally: magic.magic_buffer = old if __name__ == '__main__': unittest.main() python-magic-0.4.15/test/testdata/000077500000000000000000000000001321116276100167705ustar00rootroot00000000000000python-magic-0.4.15/test/testdata/keep-going.jpg000066400000000000000000002000171321116276100215170ustar00rootroot00000000000000JFIFHHl&G'j݌уGjUIf9肶joU8T >P܂;ֳ|$ltD6(@85Z/jJV)PYH)!vzW9e2Zʰ v֡Oc)>I+V a=}!O^*o@4(;''$PBNƤWc_h`. ٳR;w)-J^V#z`Ҫ  uac!pJ~]<ޥU"A`'FjH ]BHzڬ,!s*D4&iJNƑR&d]p"ҦD`8[*:Ud8&s޹:aB eqtV6!gRX08 ad]oXƄxO)n ͢Ə~2sҽ'Eڃi/.2 9~9b*]cT$ W3?9&f &QS#P,Y|<joqJ7czT*#5; `@Z2v972U72WF^v֫1,{rv%]nUeMQYF])?ִ6]qJ+jV8UGSW 0ǃVPdPpvji1ecČ<Ȧiݻ#zE%rʠmޝ8ކ2&]jЪ25p@rVF(2mu)lTU6;PngU\E&MBX4`nENm2)'o]L)lRI#ہ xCv+O5UH%1֦eV+0Yy4bLv5fGlj3rG؊-=J * WTr{ Fd9>S}ؐT3 犸TJW@v"*gb/B;GGe*[ `֬ :dcdݑb)ChH[#[{dqKif?wg0P0syܱe79=$ קij{@7IҶک`TҶn%[qC_-WP,N"8j\ree{J;!k0Lp {h*QI6۔Us0P@SU@pA{՗J@fSozmdfqb6zJE'ҡ eu?{\bd9$ZT.x^@5E ©- dLo\}1Q^Cr*wM6fBۥ-b ~\Ku+x(HU#ڋXG&7ocR Ԋkm!FztiK3Aޮ ㎠UwFwhf@r2TI>zBJrÁ* ` &ș\͒E 3b:5JL(PyWNWUj.2OQH*BzU\FAcAugf㪚kP#:P")Vpy> RŕfFI%s)FbAΛ 8>j@YzU6бrT 4s7$1r g { 6GA @G;x`傇.8#zJo8=FsFcrE8+ 碎1 gƚ07͚o8rGמj%݆!>\t4%@3YIܖmSsE)@I!r=sEA<~c;$ ,F8_Z @~Es_BmO61W:Vac1c==F:zc֮yzKs[bFE%wά vXBF;z{T+ ZktWv>@ݐUIy#FPI$)ʪ*+M"$9nIJor}_-)Y.0: 92hPݹI͵ׯ4GJ#dM5fRz 变GS+$>щ8✡B*ǽ VQ ce@_ڥU]?Jxv4kbTؾX`r34w)ܽ Y I7)pzvcQv1;1` n"#l(~\xOVb8ѡ 0עE ۜp:SYeO Fqc8zc,Ij󃌌5F TZacN7|JbxT #qV;¯*zޢ`av7mQxe>E\weO"mw_8+§x&%n|zʹ'G핾R6S1xnpr|< $ppiݙQH #Қ2:6Πr3ޡ6`i!ePG<ޣl" ==ʌ[Ґ)@lAЏ_JiP CS8l TcTd$)Oc.U9qީ(*IUpI_P{1eq֛- bA{uuhBOQUfw6qئ3vުcp,'V\T `IzV\\K:ԌvKמ8-o ޤGlI9€-6(n]pRw%dTLsQ]Ā0N8*D]⵱QLlR/J]vIj<e ĸ)8j9u+ڦؠ.py$o S˴cYȸj+c`"v(?N̅u6 'T݋sے,;w /'@3Jx7b֥;B[.O+Tnc88O^)$c$wԶ#j0A"'Y(ۀf w89=k9KCk##r0ym+Oi%[Pƫg9 ^鸈3e,Wc:#22yMHTcYQzs F+ɐۉzS0idB$tRNzI Dˑ:UVö ׯC-t"yU J#$u(^QcGVR[yo*lNwj- Pscqyv۝rxs^6/9ٳXҔQ8UGIVV=3Et}/G?cNp֜$& 3z@n׷z#Lb@zU,t*$ʷ"$r=}kв.V] LY *P;3jlYSy^n(Ο95݂0j >`PI9>鯞^ckģu1gv_1pT.ǃUGbG-{g$\_k3 P-ڭ3v lss/` -v5+@Lr3:T@3Ouvr uP5ecB$ }j GNH )VܽzBʤ}P&VgT5 șdU,8O'֢$| fgr }9=)  cFd4g/Kk8?_Wv9~l:?2QOZޤ2m,}j<G{UӨ5MR]RĝRxUpB@{򏐫֪`yt)KQ؂yccls֭I\cGZznܮerj ܶxhU GqÒzG01KC#p?wnېA.їj֡v{63nT73r=*1`a>d-{nSr7^Khɲ 8U=EGQ[vK Tp\g l#B[vЩ'kn,_Jb~bnhR6rWz¬Vx냜WyATnAnL[hu$Z`GvڱZ'+$GkvĒ+sN0z|LGYعlL˹@Y}O<e+g>,<7S&RG=+BRUQ5W쏈6@bSnO<10*Fv?vz31簨geaAQyn'dcq'tU˪q9JNU!x@O*E,i@Q޵G;/a288 <\U݂~WlEq ;mتO;@D'Xu-RWiܑd8Js-q1Peev{H{9njLLCW~BmU$Jj;g<"!YCva8bAaRvnAUdq֬@{6ZNL荙evf}Oִ`IF09Y&u`@[i"k^U`I#gMi&V`WfWԉN[p|(QH~O<3 G}Hl_jLg>z5IA!s(@/ cڮ a&zdOô(Ҏko")&;wgIoʢFMd7ߥ)O_ cIr w@z*җCp-efPb9#w^cx $eiv|/##Stn +lnW#$8q4iY5Qgs;rw !7ԔeLބ}׈t)v|#ZlV"zkS[:#]E%3XrxEq{z@kP]Ii jQtlȶ#dye#;Vk(&#6=T.Z/n1+W %JؿXЀYb9|%ξ2ms^W|mi193w>_ʃǹ&A Ͻ.j t"!Br Uv|Uڃ"[Tr)H%N_8 ;U)@hYs֧wv@@=1TsĆ+h#jHkg2qQIP$`S eg,P7o]9AF[>cjE8d `S%ddѵ m֪61DȘJ9$uN=*'h !^ycLl}k9ȴBC3nst>Ӏ1Hw3zQnY@u(^Ї; FQǧPi@9?"簦@یrTй&=q-@>/9*%ڜ 2q{iy*qڕ\\Lgg\/྆ nw\L}mmFΰXsY3q2GExxPtxgʺn}+hec$zzs|/fϢ!,dTT7=kPZ7:&sVR\EPy<Z09xͫeM-4NC#aDVdcƧI|! /BOjR6^ p}iO7+q[e4r-ңܩ!gӵyh 6fx%!oάh+'O1'Xެ\he#zU ;k_;cְn&lyeO")u/exxl$W[%ѬhxR-Bhj*ּQὍ#,OZw$Ե dHO;0(ٮNMz;k$s6a_>ִt:g FڡdK+u5>`e{1tR&+yLGcҩi3w0_%sP\nu溑F9kas4b[``=#Sͭ8Zӓv9- v ̫I'u>UtuMf|DLSU$}AlmA+kh%E]-ADrVSS쭩eahdN=ԋ\ͦ_\lnTuG#QI~:ӵ2h4+fhMiWCn=L.ЗEC1?1T#'')VavUVc&~PzWR$s)նsڿuSKeV]㰯R-=uԓ9flvyq [i3Yݗ|8鶖Vugxjj7o# P1In[NLgҸ}dM6%Ư %Y{Tc$go7̊~p+ "u$N O]kTGr)B̸nC\5NwFnKB2{TT.nD1L7G&2=+nu^bMtba MkǩCMy\n RʜzY}^[An$B!ewkCrxQ`A\-ԺM["籮'SH-.l6ӷbOj}ԒZ3j̱ b';k`@{5;R7~; "*@+DJdkY-rf]"T^ 6v6 ET;E<׊ƥH/ƣv}+ayɼl}nn}SN[{ Jm$}DY+>:D+fysz"Qx^Юeڇl:ΫMu:OI'3 x?ؕ~q̭K;>7X~+oZӛg/'+R+Ɏr; H*|gʏ{j6D 1zCs|o*C1v!J{Co3`{QVZY#,EXHq+5@ L 3@ 0yww& \F7aO"SNqғcHW*\q `:Pp|u]ev"MBF jx\ɖ .y_ZűGaApz xȩU 3YKMk oz t8DēǩVaoy|,lL.IO   I\ƙgZİI%#˶;ԩ(KcFƚGL?&>i+k6H>\FL-!X-lڿ3רG[mJUQ6ֆMKXBf2~~V& \ dZ ;Ii+raj/lWhn1ಓlzz5| #rC.ǸRF,.KA;-AJ$ZwYE[ zsSx_2fw|u\'qI6^H˙%%kwX=в[s(ˤxzdE!CUt[ $dniF=3UynخdlKkZ5WQE<ѨI]\V=αkj1iu`Es'׬RilBV[oEZŌVtd#u?J {:jF]2k!Dms*M+Q/e|AQ+ɯ#5ul |y)Ĭ3lW:|/yohj2ov uL"+WjO_Ϯx+?:hP ;\]Z$jG#qѳZMcolέ#&~@VJMZI"!2)/%i;݌ծ4H%ulQ/Z^êlJ?W? ).ZB6>//4xM-,&kO|{WTLn:{\ɭEgnek!!>vZ7 $Y1'=q:/5;_[U;8aKkqoFo.}?yrNE֒ܵѩ5=RR,Dpi7W(ܓ"-rQZeXiR c@tP'F4+<i鶚jwrh.YںYciZæ·K3Ha105}OK_讁d|$ΰe[Z۶`q=诜[Ovt{4~Md 듓Ylɵ*,YVˊtjc'Hᇠ+"A:ަRGDR+,$ymt'YI~Ԃ9MYQ r:fImAhiZX?7CrLL{1һH͸u0@ܽǽ89r*URw@G44>c!vV\f"Beۙ>FW"O[Av:s:g^m 1\g*ctw*|I}F&~*ͺBU6T ԌAbI<%?*SQ(ȦnyX1 x lQܭ1zK R <5-+An@ANq$AG,{UJY*%ׄ~8mZBIl2n+avgڼZƪbm Ѓ^TV, rTL+bN֮\,JQ>jwq V؛z_s{ХpճCnHKHOҢ@B`#Tu=+kQ%GyQ~@6fFOѿEĮcVtwVRnI:sWOxXs€ C~olZѷK? tkd=,Vn[RfL8ivI1y'u *EϡܴH÷rթ#[8u6}V$ C)c⋧ԖA¸b/Fr8/#1+ӼYqxzMv[ E9Iyhi|=.⶞U,|&9![S+I^1 ]xADYڮlq?kˣ%k7C"8t'qҢNMdyMaq O@»["+$$C_gexq{UbHxdiƳ56f GIVM5+esWYT>[uZjv:[ZŭQp^aea&- ٙ } n&M\J6#Z0F:C5.m^yC#N,}yF+p>Pg{mK`䴱y/.ulJtCb<%X^Rdk}A"]ooW@80\ 8Gm\H$MVTf" &>~*TZ6Y'a ZpΧ,c}LfMn_>,Tr%p$7 3q]Η=Ť&'yd{Ո|//5e@rd/yhvz8vBk,^8)p*}*:.kcO=YwCc$+ bVz;7vSNKFyU(.n&"];dY<\57X69=+89YK 0zUVfVU9PC2۴CpYQ?cUvr0OLs\u [1ڠ UY7@啘+=.{T6@<ԡnB8*8ʒ9# ޟ<=CfJŔ (OjWrj|fS l#sjhW\8]Zg1RrVYTKgz"Ǔ9"` NRWsNrQ /-_W*Pg2#}* B<*c-Ž+9HNmb')E2N\֟Jx Z nLx9">*s4tQ:\Mi,9I re̱UJv, &$V)^ lv `dEz2wg#D$+F!? qwM'ᜌ̀ ֣nfSr,ƲyUX>#*ZaoYFI=1Ғil$ ;C0%f vaКs dDc\w^ƻYMy%[ZWpKk1CصyOCwp٠8t<#ҧM8;4{%χb7[;^I?,zX`&o굄~#i k %ݴW3՝j]>mIf7vڱ|n3:9& ZdK&ɂ1U-4^-OJ.R?R+&E>muCRgWPb8=}+ 4$lbJ}Nm(& Fd5Zm!"eda#s^fZwld |< Ou/Kcis+QޓZ[ٜ?WVTaTj/o(ؒ][G|/*>!Ѣ c\qkq5oΑ?=M]xbE )oEYկ,|?cBc-o%s.fnC[k5"d3޽3Kd|1-zoDKoTڹ O[\3 ylD%|mš,o\W'.^JMk|V-RWjX\] {&s:/f@zG} m}91|<9q3w >ԨTiMӇ`G]ͽECq}j-\/pl+۫ROSlsiV@>S\jBSeS]?q4V HYvQXZ"HU.$n_=kώQ5ʹm[2Ӄb>Ut=43*h]Y>AC^Q JaYRT޴O{PJ EV'zyNx*=[#yNޝp eY+3y͑?Rh5~b5F枸 %ӐJm7@;NEю.DUA.uY#&gSqqJa2G8-itCK7J2i֗¸-(+ysѸSk6qިH)p;;0%Riӡ>T/k1i?p7)$k[#^ #Z9L{1հ\{д>/KnX'8*U̜<5Fs6:U {wϥX};Z๵~8܇A,]3LgTvx=n^⼇P2WD!\1wiҊӳt{m)bY1>>?h,29 +wQv;c8=HA&x;#gI#A䧽yMJc,nr1+sϥr$d"UF%2Z:mt~;t6+}뒽Kwl>nI2VbOKiIYG{^qu%-@ƛUQh^>i

GZŬ}؍=jgSA!*n1F+F{t-4iCϞZSA{U ONkEτ_h&d5-?mbc#c&=k[Ne6o>{sW\iI]R9 KNM,hQȣ_?Z e^IR+?/=[w+ci4:&#3.zn>$F=3={pRS4%}Vw]I]q-zrHۢ*Mu~H Fѵ ܰ~=˿kFX܀*r\zXިTb8oh -J#?,Z.AN z{Vs &T{_+&VSn+"B!` 9#BnXFN/_4IVҶEBc?ƺ#N$nڪEma5H~匼3)%tQ,gj7KI]d5־b4 xMR[rf`&sIcy%a,%0BQ]7Id0J+V:~vl󥉮yf#j bq,V[m I׫-IcL:"7V5֪s˗)i*ɚQ&v]%֓3^kœe}Fbw4tIw rpW,UYM6քE'ie5$b~vzMjXھ{CeEgqE6 CRZ۔~[_N+WR(# ˟OZXG#1 (~؏( f9W:eպ })UdcGZ/q&̓g)ySaä-*K00?ɮO~0KVD 81 7zt ҴU'k{XUʄLY=E1#GzWP&!0]dA Z!>SZ6lVe׵7U<zZTi '-eM*@՛ڷ-u [HmC,ds[85"#WKe[}>v0GrbE {DgfOX#]FqAX4wI;hj$d=b-1/=*hZD)(ezJyhV*ѕYYlcXS2Cos,[?w\W[=~KEi}%B2llI5(dIiw""fwr*Қia xtz+Bk3mFܺƱƣVxvXn'hSu*IlU n:+=#{kW1ؚRmjTG}!Xbtx ,ڌnah=j꧝\\<O]丽GDQSX['%2 nvJګ=4$9v { zWH^{eljZ}80 ,Q<%^[򜷑nc?(-ݙsw`} vs5WBIPHOTN\2}꽹vqf1Z0 X+") qlϥHr) v)Zq[󖴗U7d9s jEwɷGG 5DUFp~cEmebU= r.m,GGqDk6;5:[脁f-a{;o>vT5*0Vݣ;yÉN2O<̾mľd^5p: U15.ጬjK+ ŷTĤ8jƬ%v(4f5kiZ&1[]1IҶˆ DŽՁbF+ X|E65%6vTsw)rk˵%?i0>7 Gyku 6}r5,TOXiE+ޡYNh |YIs*'b=*.-y,Xa*̲*cW$KM ] @Ѕ FG9!]Wl F,3{=$/:EqV\>4=CbL?;W,kNYZKU5#]בJ'9%J\8i7As@D qZƤThmns1^eR\,Me]+9bǹWmsoM Ł\ٳ]V fIusWehPfwrWwV5jpZ;[=C&!pU=t~`-BW?w-O]t'8#]f2qw4U[h%34c[֪Xd^9%ET6Ln$ O%?9TcBS 'Nojz)ػ*>1?,f=jcs_OZBUC{\@mCNIJv?.` =#xW9Z%ٴ-Ҧ?"$¢2kayp5drl#*BH̩}jz6c:LG#]Ia5/ЍⰕ!0\MXr=1U jW0웋{DU'DH\-˸k>P4aT`X8e@9ӏTS?t pce 8\iHF:kPۢ3\y/_g@FC* Aiuq>#⨵o~,vnWE Z06jGBj^< %$.-Z+mBx5^ wxƕgw楍=bKA,$~*xsQ4oH}[;7]Mȩ!;^Чߎ5W)dv=+::/#,3rqH\g|xvu-f N:WN٣̎s: ktJ01)<6bU-(1TǪSF˂޼~+ uM1#Y2!ݤm 똸>Վm|X}jaj(ܪR4"F勑Ry->{B7BH Ҩ<1=C 1°ql!ҝFFU;H7[Q?#*Ati>oaaoiDˑ=*PiaԺ"Ia`έd8m/o~&刭 k2Y|h iF cy'] )Ur[lt<=Siav-3qtq?Z{1m5kљ.RT<7y5-OJ^SMག(o/gUBȐ(I5LځK1"$!=jZwj}jo~ F^ b,imZe CmmI4|5:KG+RΚIi9%j6:l:Gl3GA_[Ntd\\G [r1C_uoˬAec¤C]6-N\FMR*^n|#p[h[ƠlDj%&8|ֽƢ&I pc)^Vj\m6K7 \+N6mCf$W}}j SOxӖpc\4sWNe?jSNͶ$6j^!gu$f+?s:5Zzg >HQ}kڽ֔nEK27~6~& RAҼ(vt,7=8(|*i<ޮJbٯ$}"taSo ϭ|?}f\q+]XQD<(4sN?Zo{ s)ϭnk_@ĩqnmy晖lƛO6z^Ϊ~x"iMLU[8_›=b4pHv[ko._zb}%2[ RMMpըGl`?*Jd""Vݐ+`zOrr:H$V*W'N 73r'BS|;޺?kjE@I==Z>hʸe=v7M/u\]:3$2X:3cvڷgC-5PgzmEQoXkNWK,.:gw?Z {NՔUMyhQ)RH3?U$Ѝ0Xt}t]&AVlM>! QXBe-29G]{ڊֳQ#yVRV:dQ4B1ӁcmFXf1h1ٙqdwODK"md=)u+HJ⣌*!#|I<A$v G^ ? O٬w$@j2mf8xHy*xҳpF-:RH6.GLO DdRct;U{fqy_Ak%^hQ.ùB$ތ|)gi1,O1Pe/c߼ .BzۚQ VTc %ɇS Y2Dxg8J^,[' v5bܙe w銕9Xâ*7cfh(NӖ`+E4^?ΜX9 PFKI$nZuLןcW- ks[eo::5Ɨj~3`Ct=foyo{Kp%qh*xFo [mYۂ}{6jNږ]dR߷$T˝ųNi'ff6wZ5ж{{0 ۧ#{kRv15EJ c$RM׀?ZMJ\H ; >"A{UW6WM&鯦 OTNy2+F9в*6dmZL| KAv9f*֔4E5,N*؎Vxc=Wɨ @Kzgbg5d$gq(e#2"UzAJځ[sW|L5:W"XcqKI8NedQx]QMN|t z֣\[E6c$L}D}/w6hZFBsA|B̪#1\>PHVSa$*|;Vn KȢd߈c3*0X38 LW.ޢn]F$dު) *ͦ|eM&ay${PO1J҆Wv?1< ITtROD6ؿ4j^IFf4f߹$NxҪK֡_.@%zТ.q$ʰV*{1$U`dQUږ.GEMm#Ѣwbj ĕU-W5m+ljuSZ2V+wU^^{Oig<*O,XPGʷ `k:VdΔg8kO5؆#4ǀ0vGFÂ|qgs&Yd{T5w̄۹<!wx%Y\kKUilESڽޱ|< 9cY$GهwC:8IvJ=tF=&+[B;+(\b6"jrѼ3,do$B1t033z b%DXFz7ӇӢtpõIRxkbbCg S^k)JǙZWd"K(ȲGaEM{ (U =,Y^+u=Oҳ$SV<lӌ̦idq19:S^MbS$HG[:Jy0X|9mH<}(?[s* D8S[6 2O9ډ-WGL}kdW `OeR;Z\hpI8](p@~eyX9?'Qo"ޞp[4GZ0L] s5H7k@NviI9^4w)3PkQ/"{:}xo_Q>*mjjHK ⚀r얉'*#_BM^³]!nmqœdBIxé2`m%~Vӎy4otNsiRi"yƶ`r?-IwuTX+\?0k-JTҫl>MFA;iz]?GlHtU2=u uAo OyIvc>\t5Zc$ӭS,VzB$xJr@1)ZGћ Մ`U%z)VƖF!=4!8vR!5S<*ȹVCaA}r.%H#$8|mt7;O$zU$g˩3"' z|3ZvIq?,08 Y'V`Z>dyXwuTJm\Lzd-ASM**+@X0}3\4(K$#)kNm43NM'3ȩԓ哜޹A#[uGGWyˢW5:)o;0 saVo ܑ5,6U~qgDg!"Ț:) |P}hE$,l3lYBGҴ\@rQIrZhtUiӦ)˱?7ϜӯdR%YB:VLrL'8??8?Z|h U PjFJkB#*3,r8SI%R (x./$U&Ezkd)bPQrw4T!U4%̓Ee,yϥ_"@>l¥o`{JyE Ȃ99^Êy޻Y۶fRmӤrC0)DJmkR ֑JQLf+6p8Pj# j-͵D#sV 5AVC/t^n]Źc2*X׳؊WAQEL9ɧ}-PPC{pYU]7YKMG적5\ l)v ?QQAru#viJM;i(2!BF +w L*qSȑՏCL{M9d0*]^EMTeI(: ?f7'MMsKf!xB-k|=k{dXwZd;8Z'ZvIyl\!xKd"(Ż316*=j D`,#qYUV{ifbÎ ZalR g1-9.Qu[1|c5U$*MܓQ%`NɌt뜑S²F6Qrebb*ȹQ Cɒ5~1$T"=((yqXƐp6LWy&eo(|0#H>t N dV$cjZ;NhB{ELwȘ̼|֞ eݳZ:ʋ4lLf Rvenn r"_5y8gT8f-Sÿ)cչyB ZYl.d_ ~bJ1M >K 6A3,GQWP֍y0Ա؈vgZKwbv82[DXjΣ@Zݖ#8ϒL.s}V+-/2Μz碻H#>;$ WaTHmSXY aCjIM#WOҰYR(eFâU y. 87ޑi>[5HO*c=7+rN!P̅sPj7lzVĔ/#3}qM5r^> '6Ὡ#wVcU%a'@=jKqRp2}JLW"<";ƭbn ջiB[cʆ6,le^)G 1nڪ/K7:\y_#X!- >XnsVku7@(W݃ ˑ})mv3Ҵ2?Oȹ-צ8am2Vh%vXE}B`0G~}j~o=|+5roi$ &Qpkb*hN1f=>7xI *!6RE,p Nj E.mŒdޤo yQ_f\6 d o@zVr軶[*\R5$wܦ@'a>ԶoyRgrQ{[P=wqyT8ek , [t fPWdk}n&C1;Z#[h]GX.724BOS.dPH]"Ot"y9MTP8) +*zIq񷗴2֘ya̱JN0Y,aFl{Ue.;v"V'788vEHwP\/s֝$tv '#Dfqc>f"D%,G'Ec}G 'ˏdHzӪǶ4@/.8TZLXcY7n)!Ib9a92_Yʭ6sy`lMi\0M-Q΃(WRUE7PciثqAH\9$#D1Dfi7r 2,#|r'%EXƎFcbrH?-O#s! ʠd\K"PTKqfҹFYr1EM-GU@:4l[$V SM2NqJOR%ʍ?:[V K~qhUwlz٥ 9RVwmMH$hٛ Rn:SHAmڥs C(Qq\25ZԓQkkyV$ZaؙfB= 3&]Pe&k.Nݩ׊dAe<0q޽ fib8/-]ͳyf V[oimYdN W[k/|[ʄww\VG'itas|-uxTLpq-67w&\)_zn눕pzcw߈C篽yU(:$wXr f8&f.k6+?)b0*r6{dIW+pmˉ_j4jT&5jEu7;yב AUk1Ok0\q\sBn$uI1*9Ε\UOCUW`:[-camcg$0?5!Ԟ*Z ;qz{$ ]ϭZmreeyܝʠg4RNu^dHY,rq2l'5wv^4SGESI4ڸe PWd|he1(mr8a۫F7O/;cCV%бIID%ޮDMWټw/hdYH|p*vF\|(`9o+]7 ߼ulS`~*?n[M#l-,ܣqگ."pH# &Sȴ8%rebG)ִ5(}F]=+T}zH =yU, b,^zjUp2$+n9Io6-%2r $6ʎ>cHdĻdci\].O+hjs 9M g(Dz.vR *cTgiXn'PvLs0RAw!.AnLzo"2rFz5^ T({ª .7tJLr~]\!;$>XY+**G溑=IQjygt5-3Ϸ9p#!9d =xA;YKQd\F|nqM٤`>np} dxgE=ȥ-@P>?ZjD0pϻ$j4ֱOF8CW&.mC>%>5nn3DDYoaU'&Pt %nw;]]KWmա$RPۑݳb"Hcar1Q+i[QpE' -W/|nGPFN>1B++qJƒb76C7Q늻m{djy0~vtq,rHT`?Ҥy o >njܵ&[X4: ȐlD7t-VWE' %>[zv\ڊAQh،N^!1 q]W6%nO,W$ c#Y'U;Ic^IvbvP}P$G>$~Cp61dUErL>#ֲ.`#HY'8wnV:9Օ7H T.Εn op!h13[dy$za4˨Kf<ƾ,Q)b/9Xj.3Mv{eAϩq;y̵jCɴm )1MMm,AW,k\w8ʼ;_S7m"l?-ѮK?7g+Z~5#F>Wҳf+B-_EG-KG̫T~Fu xn,c-bG={?r@+l?7ҝZ LXļԵ"ؒ8 9#]=Ѩf)WpOR=er5%V X:q)g^F[$SW -R!/M>gOkOZj(j-"t3L1=j{`0r0xZ | I=|K>CqEy!Ke=Ҋ|[QKui!x J\$Y Wb<ߠaMCyq=i[(E0V]J푞zϥ0#SErڬ?4 f ڳeܰo"$e<άNvZtOp3$0S:-AћG^J)U9b݇%-wP\6 L>[i\2eHSr@i[j_M5,pOUGQhukT%+q}re'ڨJB<Ҧqq ^6_~jCtm75#2vER |cӈ)Y[V쭧o< ZbG)#3 d}*[kw_1|8&:B=Uɾ+<7P.[֥tfI?s%DA +Eʲ]@20ږ=Np~NYՈyQ=ꍽ7ΒA{PY^!Z9RHoɔ6K~RKi|†a9HnG\iyS_rl{)\z؉n㐯1[v#k'I'ؚiX%G\*T_EmLv̽>JJ >mlhDq^d$MG6. 1mb-XNDؑq&mN2$c*IbK3M Q֣"A+LktͥZeUO Lް/RZHU,~v={ҳ]#ee ng |09VgڱU+ U5XWD[i2O2]E"H'+٬bU׾Y%-#J>Y ",78'=3UL2[\ )cڄи"F'QgܖUGWEi .NJ*$6v'1G$uSH#ԬJ<ԍTܽsWAov`3&lM~q6MX3 9fC{ -4ki_h*;U[(c$C'>s<:*ܪn{:K=4ǀL5i4^tSfwcs)GԜ GYo$ݼg'/^6a3+)Tj+VZ87de\2UeCu&ϓ|#q涮<]+š$28v?\ٮ5Vy]Fq8澷/ƳNIEwgcx/}BMJ&?v!;W;qO:. ]&حc4gCKiю7"/TwL}iZGoX"OD69%.!_}$Ҵ66 -(J"C}x-j4>7br9&`T7A3_F_j۸Շq mL'[=8J tG6kB[B*`HW3jz Q~Y=%9Yt!dٴyE%{Fʊʓ =G3L\NI38GjA/nYN;`406Uד%ZͽC#2f~"Ⱦib9|ukUC{pn\ӞbHscn~ }P + i]N \>9RO}FY4ϔyݻCpo|JMqGh.$ԡƪ~qU^Ֆi 2!NcC_}{hĊr7Gjl,1\xTb1;T4nyQ$c]KcD:I$GlGrڗ΍!ϸzK\*ΘFv}?tjhcQږ jw4-NdBj9r=}*oQ $ej#Uoqmle¯jѱi%Lz|ނU6vo9{CX'k {us"5̳'·9ޔda<}MnTJg#hdTmVKVc/ L.˧˴৩>hւR4iD'qG--^I'3>UCpV}w6[θyY.ϭ%mMt͠fc';s fn;CfM.=Vi֭"b+ Z Ī^_,SܛmH .B@ {⧷OP5<`\~b߹x& Ng#20`@*A͡kUA~$1[FU?{yomni'#1ЌVm;m9-e$w[L~yV}{UpLz\X{-M3]߼o_k6[)'#s𸭛5ޫ[# '& F5'V!cACz]`0,cqE3ȫ'Fm(fmH?ǵY 2Ϲ_jc=Ҥkx!a9DEBf؝K7Wb#"+G!er;;V-(cUn'5FrzN! n>>KWKdmnQq>d=q^95}FTK['vH8bv!wH_־vaA :hMJ"یB|? Go L:8U$MDmjz9>x:w dPJ\C1}`xV__@МkAH Oq:K1k}$3Bk1؏jFArwOʧ.K%ȉl6خb32p MloQZ΋BSi8`*ֱ9Hacg;؍KWR\drҤY̎@eP{pEBZh.D2BuÑ[=b9p5tR\] d1|p $\ [2:3 %:FTUs֣]̲n~Zk+(xҩu{kg9f|=cYJzK)\2y5i|{s \q׭k_}+7ݮoCk'e Zsv}{(奉JĚbd/O_fB .tRA?OJяQRhUֽ O-B;ݘ`^•6Qdi\%g.%~Y-–Iuc7;(7 PFV6$Ք>JdI/U]5+D`'UDĤl#Qc.f{EmO D1|E̶kq*V[+[C1$1AI&- HeUܩ|\Z?׺%ӯ{Xm8S5bH[tm'bokܽ*v!jj<+.w5:>H{d6QSA5܉2z6&qh5iVL_G-gqa鞢bkF#V.BM}q]kYhErXfmcFBcRz9t ha;=>v+ a"C :enmp6X:3he%Ť;TH۵}KCK&heMOp}Q굣ulQH6sVajPPn0 YmeddvaIma%ܹ=l~[H9;TӘ"]58)ZIk-Kt5xKM&|qs!\Ү:4cOcE=^„ȐO}+R?hZqk;-;{--twGҶС.3\[=о;Q:tBD, MH WϞ6k;;4/yR,K1#Gw>6g,ջ{t( G;~E^¸\oǚ]ZƵj-׋TS(z>*ԅˣ~ճ55/hM,X3ZX{Z=mi- yw:{!Y[˸Enx5 y[Oe zJ^bǟm`rzz*o"rxu .;$6ӵ}ۇ(Ft7I\qj+d՞VHӎU H+ K[[۶3aP)t8FInnxoQҭ[Il\G5d\:߈qi%fӮ&F~$b6%(eW_nqZPlaIT|s[O-i*2jDn3*m<ƃxHed#ezXW_GVY1vVk!m'D6OXk]}֗hM& xd*{5I%چ%F7`z]n$q&޸-o\ܐ SD*uS]wW[?cQ$>^sM|/oE>N1QE;,t˿9Z?4#?5?ړHbP8QkNc}"qs*xj-_~eUU]q6C^/1nmbBz2>a] }۽Yp/T/|7ͅiT"~yWV\Z-dҼElQ4|}OPk Q5 xnRe'=s]:\kD YمbM<;^ Six2ZGQھhWuN3K B#k։RAOszT3iVBeRx+%*W=DNR̒&&~5S&ۂp8c]|6qɧ|$l bT<'ˡEe|UUvI95 Oӭ-^1p$HGҩ+S |o"ȋ*^եpD Čg79tH&Rgx1AmeP -ew#ieIhF?'业 e\>:ք,Po.|G*G^;xY(fӮ.,&0:e{_`)#g/*@[qA+JPHHHq}Ǐ۵8P#,#m~^7'mO61$`/ڶh [}J`}E@=#*|lyDڤ}xW!%M |_`"R=JK8TqRٯ]UmD2"{iNm.=k2ֻiՏ/ Z񕾉c]Zbk'nk5;[k g[ma|gtSzD]r$'=}<ƓKkb\WV:լ7NVVFWyt8Rѵ,8Vޚ-ijBX!.:T"[n tsKŘDH2)`Qϧֲ d̈̒&5XCp6bV"Trb׶{UK;[zTc$2-lstm_NΐڴYC=:/lr5 [4{ktʱUJL+t&eBfS+&+Iؒ˂Wn1$ms: qv8'Y2YŖ[EVfycuoY ,٬+тuw[[vq{cޝb2c %b3JGYC}%"ʉ=HtF)=LFڹ3Kq7x\Tw/(Xyj1mhֿ:I͢B0tw4!qӯ>nLC+0/;?Q}ꅡ po ֖mhC/m嶿XLWX "BU7WC%,>gYݿNQ6n!U{t0eR%y;v‹hrHumUu&kWtOA\*Ec#,̄GSZx ELy 1'޲t.^4v&x;ʾۆ8=_3⸛>Xh{:__ <()fӬaIJw}A^#[@D<jt K_-2 >aTYnB`|~֣kDGST{v xG/O𬷵Ѽ;Jv)QgI`&O+oJ}T) 6!r=+'Z\ּ5Omznb2~,ؖ[ٴrZU;q!Z[ڵGlnj5>=J6Kv}`dQ3|I}^]zI q^iqM$jBˌ)# sQ >&Ѡ[=oO1.v6 (6GOoξM+B|4My !vb><W~a+ 2eMET2|}M/y1^i^K 駅$YN? M&st>%99c]mn44$7|g֪k*׊+mR-/>c_񌛻I]NGPM [5 uXufI}Jˊ_H"X5[H# -jJ+PR`8k<1kjjO6RDwDz{3^=NK&K)|:=0BUxy~#R K ͨL̢q=7M JUUF*Jgc[Ć[>m$Yvմu0^]]N2f"}";iaDAs]*hDl1zWorɂc3L=- MӴ5< kr \\A Hǵ^Y7X6&ln;gck> %Ko+w] ('RmB@wG쭯,a#뻰VԴ3qKsz]I%T” ibK`vil^h6eyŕ_z^ Ak_7Mɏ?O}yi0{M[rڶsjB-pZN9#e}O'Xҭke pO _;{ v#nS}?šD yyۮ3~LI\/m`45津8?d-skӛu<#ROoJk\Z6IC /o5<9k+B6A"cr$֑a$UeEQ\66zڱQD fx#y_áiI"4DgSjί? xVȿ3W,yn, 2f߹\.v'Kk俙ЄSQ^t/VRzOhGdM>rD󕔞vIvZΓifBmv>ƴ!f&{{b6HX7= b(k3;\I*[_oj.D1ܵEo"b@;ޕԥCr cgjX`Z-Z]XlPEK)um.;H ˖>‡9^dܤ=14cUM s޴,uGHV;&[bY_ oiy}$;h?wNLqG?Ere}jo/3G3ە-jgf9w1 {Z- jqXM,*1ZI3D1Hd8c꼾AIFM\´]**&|30* כd }EؙJc؋Y$I8SAVmZ4(v;>歮}-'oJJoro%[˵7Ҷ6t -%A+2 TTxє*rt{CiY} J㳻ݮw0{\؈҇s,<˦}r!@VW;vkؾVU[{&EMGZS}U":^ϤiLcjw#a *4p#VwZoVn%9/nFpHUcT@`7U,iEQW~k7 ܎af&sFL\{]I$Ub摣~uv X%YL,&gYBi"BKezxfA3ql#j5WQֺaT{测eM2!sJ Ij imp]wo+Gҷ*:.1Sbaʎ[cw$ w٥c6սΎ;6x٘+mo^`3)5m#3O>ޕ -VU9ZŽMR3v*|˞on0l&ebC2mҹ{VdRVAI>{7gi6#GK)]M)@ הu')f3`ֵt#\bE+h}Uww3[$]1ᇨ>msrE~b1Vd{U_[Z%blpgޗ,cudښǒm__Z!6Gd92 ʓ"i<{ZzV$,jB?C{hXmm33gRVFx ڠ kI9Re吩,[15kV/pN\Ql4ǛN-(zY- I]S?x硩877&gin8͂$ a@D74rE,j>̌Rמx]ot 5ɑ\#].>K[k8i4Q5q7qF9[ kuu&hC4B\D߷mOZxgx~hl-/M{4P7Iai"`IomUwQ^×/-ΤZqc5xWJQKqXtYGjz7Xn9~/F^4[P|7)^ozն`j]‰x .[ vخs_W{*ĥ fiihW7wp^K!ƸVzW|16.-ԁ G޻#*VjZNfxbV$$E䝛qy-|GIau{9JV;k&=KH\=Z|5riCy{#ݳ ϔɓAԓ[~f~֡hm{rma=jΩmwCXޥ+g֛{p {~漮5nY$2`-N a}kú&!nlI$ {d:Em?PNE%Prs#]4k"#}#e-;y$dBuGExd{E0£=[łͤɒuܨLQ-#p{z)[x;z2El+Q+"T%O֜bf!hfVqc7ڱ}nf28i-^IW Q{}MfMxޅX)?Aq0EcGefT+60MqqzTwm\,X~ʞ2甾JجY<}v0z1شco̓ӟb޼ۡ ۘ \Ug&iZh:T\qr rFy#q#6c+z MJcsXYF|ȎK5Ԡ*,ysjccmk<:s/^3j*aO wYU&UU Ik:8qN h䜟j[ &C*dI|qfijiEz8"õlE]%xnRl (!mwGCjqFc+j툾f>LJ ݏZ85QwL-Jpbi }jKw{{R7M2pki%\Vr*>9M9UFņ[%&UQP%!˰ ocZ|d$prpk7$fv5V%SZ+O#?-Z*nj.mQޤ6VVg4]k/.-'*3z\׋tfOMz'g(:d 6R[lc4gڛnv J:v)kǛ['wҺE&c|Bb~vCkS֗rϳ{{*שZ͉Y>joC-w244 ݥKp_15~-Yo"IKīOB}+b^dԮ-u(b88q=rO4$MP +L `n=WҒۨm.\|ult՚[J'Z(T{ZD("=o^"Bֳ,nd6B[ \뺝5([Vn8?kl9vHz[#d鶝X(6 o]ܬ)&H;r⴦0`\ڹ+M/Hx5iW`ٷAJt'rikpG\sN\=L VWLl!ۻZqڴk\]ͩNWl $r,amWYz<FfrRW7sOiv>5 k@A$x&ڨ=z*hz5j bֱ2dzAJᴨ,$I. x&yr;\xx*J6O~n'}+Re+[eG#btⳝ9'f>`g}@ qK7r+bucu<;sMOsoo^ZD36vF^=M6}B-th8T==M [$)1IbJ::}k添1EuPvБ޼$IBI%3Py#j!N/"8ckɓ޴4VW7|SH׵hG|@.|A4`|;Bntg\ѵSnSl (^5-3dmvVڤwB BEgix#nm/u5!MsCN;IkiC]VV!w(qڼTKkoCΚ H/S}JT/[jIiMZE#H珑 {'*׺f׉.:}ePvcrqU42X*FI# tp?mK:+G5?׼di c[eiW<uhEN79BZZ]b"۞1#oojdmE>V %7š &յӨjR=ƦY e<-sgƷ+tOoqUN0N[IxGIe#y3+ed#>.lr_TH$F3k´{񮯮xvQx#C) t$v#I> _Z*z\<#=kar1%^xMW|# ю->(%dZ\Q_17uO[Opgy՗.p6N[[ tVvڄl_֫CrTu/VԵHӜQmB|}uxI|jD(20C ǃLkfyVB1[kjAW[< ͏KC^PH"l-Kl>'-W;O xSA-ΐs"ܹ?j4ۯK[}.L-/gۈקxòxƆOUfF#fך'r*7g]:G|>O^'0 S׮̰@voSQ+p(ۅ@ j1gW~yI[Fd##'JMOUiLqҹ'f_)c$Ոe)}5K[Jjݴͼ"&oJYvX877rKGO$ ح½1HzE ūւ3ar2yXg%V./,Oi}i%jܫCg}M^bנlTnDX1 1SƳI|@LjUrs/R+=[/Vr6k`]|Eb'$;WSMuy ]‘qD8;iĽUqY-M!KvM ߽_"~6UāFwTo{dEo.qP4M$XRAeojC1(c!⳦8d^җB[/$i_j/_nOI"5-!gH|~g4KXRMiWʠ#үv۽R\K=u4O.Ng[s,ef=WT/e;YF*׺g'\U⶷$Qs“ؚVIH!3[F@;#Oz{vw%Ɵ$FwN]ݎovm")G'H==뢭IIZCDMgr;}t"+{e9,Ϟ_<p鶳uHc>s(LVM],T[ aM{wc"أ }b-ݨh7"u]ѲXOҮK4MZH @]|TrȖZȗ5ܬH|Uc"鳭p H {Myfk{#bRTՙkjSk]żqjO/ć].56[M|o#Fl5r_kUKձMvY>naQ"l=kt-]>505 ʤօVtЫFjpk$Ү] M7 Ѱ~-l`ɽ~=O~Vt|AhnkvReqg' nKh[(ZXC:R5-ZcjDss4k_iW.LUn+Ći¿nfl]JڽIuW6ڨ41CoPmks.Bм9qiw]Lx}q|Wmsoag9?hcՉ,sYEi<$ V;wuG>һ/ duPַ])FtOoNJqZ:МiZΝeoKemuwz!|֬ßyx#\׾ U]Z/484;}*bk `yG~-ԴRINJJZUh_ܙP7R%\ʾ(naa{$g~k,nmF"f}mB鳞’>s-|Ak[o0#'ֽ^ tgBч#-ռ=}dH~T)s g]uk7d1"HmF|ñ^x7E׶aqW[%C R)i덃:AL]݉=+oIs"%Zd>S&Ƨ:QDyJ+5\ |sSNb?FR'WxOZyo]c*_Z; F5 Uu6{ 6aڸaupn#j6օ- -'sJOZ杧E,d˴qVi Ln13uu;fU!bFth.pj+~ onXq+t 5Z;<s2}=/?̢x|G ۈoCuԥdt>]m5s D%KDLY*׿|E ~wFr^>ӭV0!><$+obDֲOvv *gyx["U:&>>ȒfܣsXuk2s<Ge稯GAwMb{ypEyEWZ8m5Hrh[QQTz3'Z27c/,@n&}0sYzo)~i#&}Od|8#ԣ:nedӮ؈#=;dž{ăQ"' ?}LG.2犻gCẑֳ]5=^HVЬ촽2M%?cڨxn96Klc^Kt6 >rOfZ+qN]ҒNmƱh1$CSQhۗWsGv\{kiu@Pe;+{_4ugqpMgOzRǍx_|E c[ڼf+_Q", Y%~ ?)Sw&I|8+(ukW)q5p˵R/t/jXk8mmW74ٵ;b=wSȊ1B"YjgemQX!ٯ-7ĝ{P啎mk{"-ĹیIɷv*ce>+4ǩ%E{VΫ)Ҵ>;` ?N嶚:=+ˉUϗ?vw:UIs<4B$,vʑۚt8O4Fg.n$vV>{oPi%k+* 4%zsWMB_գ%EG 4 {ƃQVn<:وKGtP-ԉ]:gnui{ mڕOeF:⽇)t˸cO~2}sZiwۙ#(TR*Iwusj^kIdwGjѪ1sv]Rî^_ڔ!2G^-kzmBPK{o6*a-´G%"?><Ȯ7M^5U^gpx݁?zh9S%cdrW;I&g$O{5Ҽ7xsJԦӮ5 [Pov0^OYThgs.|H!X{k|PtZ+ +öTQ9":=Ər3ê[mc'1E[\][vAPzY/6Q^[ui'F[1ᩴ+<6p͓޲E4&PHhҞ |4;WG,ބ]uF'z4}& <;|.>"xbEyݝMVO={eOMƸxZ}^Z;ceLsr yZT(Fw? P,TJ<-5j&9KG9ɬW.infb>}2>?Zo<;\x~-zy6-.x:\jqoz-uۛYN$=_J^"6Pgj΂xr' IS_玼 bX/ z^ŕg{ Hu;0855UX)9M=?EEWvZ_F][z x3^Uͬ;fBI,}!o;\ 7+u?rhZo 4E'sҜ-Yq4xui$ۢ\!jGͼdC֬[źo|;-~.)¡M86ZZ&/ksC,}m}޾RhiN&=K};׳iM?n矊<KZ݅űCJӕ>oWk7~e InWxᾉ| {69Ց'/'h$x[05~ڸ/|W>)X4QݪoK01o]h;ѵrmLϲU!6PX[ՄJNnî<ͪ>u >$iP;נè+ ;HK(2SMV AJ3F{u6UQ,v; {3'R7j粼14+5р1i7Z,6@m&n>AO/z-TwyPiY/aޣmMc a¹k-F]>اPO\˺34|e\}X[rYOd$җRK"r:'+%$zV$1ʌ協;T|T%{!f|=;PѴ9#֮[p.yAt_ϧi_i/aq _JM$;%;ˋEi8@6)aę5纯 4; qk  vn5mbSO—<#ǥ6w:ω-!Ziɵ ;:i?ŅfMz VLrIT=}kІ1d=v OmFɤjj<C 7dax+-1$zݿBEiI Y$ʝ=MhkNVMܧد#e~ScVb BXga1YXҚtړ^Ut2. ၬf]['rM,$.x]eU.W֫-m#"aa*ZsM$Q170Sg_zHSui#l쁘Y8GiV٬;5Ėogr NWN6wN_l[I8Ce%T]7%}1jiR%\DC?Z6v_Oefr34{> "[3.yD17ҋJ\2dMFkcl_JshL'.+uZ▷}']=˰dwWE⎯[=uK/JKSeIOzEY~DekNMU4%+3M.!m$"i%$nC~+KJ=?Zocx|-k2KUP1[y7{WZ',.vtqKһCpqfJe;ߴ^00 g wBssxdmLqZ">>~P[,3T~;t']vi LHNp~Z㩇vivNz[c%# “>\m/}4+)}Ѿw7bZ|F[ӵ7Q5Uk\xuVmC%ĩk"j9Sg*5)5М*6d[XtvX̗xyOfZn/.,cQ*y<&J> xONy\Z4VF{|]> -]*=:'2\D8)WZURHʛQyA?tZGOyD8kǸw6nZ޳tUBy?tW? x^ҼKy>+ڑzΩC\ˣ\C$Ifܞ½ 9Yf1WߖK<6xN& 3n5⽳NZ[[O/iiB cֻ|F,!K;i|CM=}keKZM3O&%u>[StjЪJ>WnSKʭJ`-K}fbjA[|"Hk|;N׫i 𽕛ZI=!- +0ώKGFé&"IX ]*a ۣ|SHRՔ= NЯ|(:eq3e{m3_>:k4Vlp'XWgFW^Yl#Ǜ}}kQhJU#M4zޡ?_xM 9 s4Ђ}fPF,0$aSadISҺ`d$ ,k*c%6Qey3>U] -1ToDUV~{E{KZ|WZƵӵ-bd%58z IGYnMsrZw՘/. V5<'ҵl1' U3\YhKvB4!@xg饐zI%_PǎRe_3 r{TwSJЖp#FqB[,V6UPxy}rCځ FU4'VnirŸLqX>4?mkZt2]H<_ʎU)G M'JP{`I2 |,V/rO+M2NG䈮9z|xbѼ?bXp= t _egmk_:#SszW]S0)Z/c|_Zx[XuCEpFGZþ$mU?I|%mږ,G'rwVnX—Na!b05qoԥ]~Z\]^'00TGwZƿC&8ÄR0N={׵Om~ mէ.';JߚPǀc(jV>Q}^յgկb1X\=?s7> FRnI2 ǡ |?o6zL,;}kW#H67 BR)\7j\)'*~F zK"lKnX'Jk b;i :jy";lKuBD%e0|<]m&}Q-liXlbk|=%z!W<,bϴmZVi;H[=@ϥcSA=j7.1 }ǦkuN_1\9G{w|MHecPX^N"/;N7*ƼyxLzhI ʹ7%}ǑW \ݼM56q&4mVD^Ȳ%>0HNx1-t˔5-6/6܀\qu5lkiF)\?lSKBbH<=y[֗/5[mrM[Q%wƨ:`zck.OO?]h`608[_tخ Kkkl8wNn>XNhϪc5| i=J-* t湏5t_ ̚e{>v3{[vZͬ/5ŨhT9{#~0_Aܠ6> jmCVV7FWFd_,cPyW>_;8éP)s◃<j1pE\5 JƩVkJ7LOaMGwl>޵z]#Ğr]‚Q2J?!\-?j~0Oմ+)r1zԾ;[\iYX!YBk%us RZ{c{ؿg|;V5MxG|;XҢXvE3kެV7IFg !wE$.@85e8|L*4є$ywmysZVIţ:IǠ\DLap8ZX)p jReU$O!?{+L(k.gmֻ~ذ4J2{Ս b:iHvtqqb<s]DVo,j#+5ڛ̃壌g8ܑCW͠F~ejnwfp%'CUN|nAΛ[-.ͧpFI?ZԥK7W,hy }j^̇&/iB.1ĝ$B˪e9UϭpצX&JPFl^j( -q!9C)ltʥM&ݦœasꚴ6xʠC6I,6zlͪ XX J+/tI=dgeZ* #>#|U\T/v[ .-$ c.Y=WV+]d KA2y{/7wMڪ5쒴 )XRԿ$bvTqҳZIb:G\jSCn-]R /'Vmt k5U68Y,qy>bVY4!N5#RM$nvpfE>aF xU=MM5F,/>z{W+qhTx?!oJjZ~uq5R:(9e=d}ddC"}xWCtZeddZdZdZdZddZRS(NcCsti}|o|tiO}nti||_|oti |i|}nti |i}|djo|i ndS(Ni( tcmagict MAGIC_NONEtflagstmimet MAGIC_MIMEt magic_opentselftcookiet magic_filet magic_loadtrest_Magic__check_error(R RR RR((Rt__init__ s  cCs2ti|i|}|p|in|SdS(N(Rt magic_bufferR R tbufRR(R RR((RtbufferscCsati|i|}|p=tii|pt ti |iq]|i n|SdS(N( RR R R tfilenameRtostpathtexiststIOErrort magic_errorR(R RR((Rtfile!s cCsti|idS(N(Rt magic_closeR R (R ((Rt__del__-scCs-ti|i}|ot|ndS(N(RRR R terrR(R RR((Rt __check_error0s( RRtFalsetNoneRRRRR(((RRs  t__main__(tos.pathRRt ExceptionRRR(RRRR((Rt?s  3 python-magic-0.4.15/test/testdata/test.gz000066400000000000000000000000501321116276100203040ustar00rootroot00000000000000DfHtestHQ/IQ4python-magic-0.4.15/test/testdata/test.pdf000066400000000000000000000040001321116276100204340ustar00rootroot00000000000000%PDF-1.2 7 0 obj [5 0 R/XYZ 111.6 757.86] endobj 13 0 obj << /Title(About this document) /A<< /S/GoTo /D(subsection.1.1) >> /Parent 12 0 R /Next 14 0 R >> endobj 15 0 obj << /Title(Compiling with GHC) /A<< /S/GoTo /D(subsubsection.1.2.1) >> /Parent 14 0 R /Next 16 0 R >> endobj 16 0 obj << /Title(Compiling with Hugs) /A<< /S/GoTo /D(subsubsection.1.2.2) >> /Parent 14 0 R /Prev 15 0 R >> endobj 14 0 obj << /Title(Compatibility) /A<< /S/GoTo /D(subsection.1.2) >> /Parent 12 0 R /Prev 13 0 R /First 15 0 R /Last 16 0 R /Count -2 /Next 17 0 R >> endobj 17 0 obj << /Title(Reporting bugs) /A<< /S/GoTo /D(subsection.1.3) >> /Parent 12 0 R /Prev 14 0 R /Next 18 0 R >> endobj 18 0 obj << /Title(History) /A<< /S/GoTo /D(subsection.1.4) >> /Parent 12 0 R /Prev 17 0 R /Next 19 0 R >> endobj 19 0 obj << /Title(License) /A<< /S/GoTo /D(subsection.1.5) >> /Parent 12 0 R /Prev 18 0 R >> endobj 12 0 obj << /Title(Introduction) /A<< /S/GoTo /D(section.1) >> /Parent 11 0 R /First 13 0 R /Last 19 0 R /Count -5 /Next 20 0 R >> endobj 21 0 obj << /Title(Running a parser) /A<< /S/GoTo /D(subsection.2.1) >> /Parent 20 0 R /Next 22 0 R >> endobj 22 0 obj << /Title(Sequence and choice) /A<< /S/GoTo /D(subsection.2.2) >> /Parent 20 0 R /Prev 21 0 R /Next 23 0 R >> endobj 23 0 obj << /Title(Predictive parsers) /A<< /S/GoTo /D(subsection.2.3) >> /Parent 20 0 R /Prev 22 0 R /Next 24 0 R >> endobj 24 0 obj << /Title(Adding semantics) /A<< /S/GoTo /D(subsection.2.4) >> /Parent 20 0 R /Prev 23 0 R /Next 25 0 R >> endobj 25 0 obj << /Title(Sequences and seperators) /A<< /S/GoTo /D(subsection.2.5) >> /Parent 20 0 R /Prev 24 0 R /Next 26 0 R >> endobj 26 0 obj << /Title(Improving error messages) /A<< /S/GoTo /D(subsection.2.6) >> /Parent 20 0 R /Prev 25 0 R /Next 27 0 R >> endobj 27 0 obj << /Title(Expressions) /A<< /S/GoTo /D(subsection.2.7) >> /Parent 20 0 R /Prev 26 0 R /Next 28 0 R >> endobj 28 0 obj << /Title(Lexical analysis) /A<< /S/GoTo /D(subsection.2.8) >> /Parent 20 0 R /Prev 27 0 R /Next 29 0 R >> endobj 30 0 obj << /Title(Lexeme parserspython-magic-0.4.15/test/testdata/text-iso8859-1.txt000066400000000000000000000000621321116276100217770ustar00rootroot00000000000000This is a web page encoded in iso-8859-1 python-magic-0.4.15/test/testdata/text.txt000066400000000000000000000000171321116276100205130ustar00rootroot00000000000000Hello, World!