From 666b828af342e3da50dd828fd1e1ee4d0156a89e Mon Sep 17 00:00:00 2001 From: Samuel Date: Thu, 22 Mar 2018 16:02:01 +0800 Subject: [PATCH] Added ascii2img -- allows conversion of ascii to images. \nTODO: installation & portability --- ascii2img/make.sh | 6 + ascii2img/src/PIL/BdfFontFile.py | 133 + ascii2img/src/PIL/BmpImagePlugin.py | 290 ++ ascii2img/src/PIL/BufrStubImagePlugin.py | 72 + ascii2img/src/PIL/ContainerIO.py | 116 + ascii2img/src/PIL/CurImagePlugin.py | 86 + ascii2img/src/PIL/DcxImagePlugin.py | 87 + ascii2img/src/PIL/DdsImagePlugin.py | 172 + ascii2img/src/PIL/EpsImagePlugin.py | 424 +++ ascii2img/src/PIL/ExifTags.py | 315 ++ ascii2img/src/PIL/FitsStubImagePlugin.py | 75 + ascii2img/src/PIL/FliImagePlugin.py | 163 + ascii2img/src/PIL/FontFile.py | 114 + ascii2img/src/PIL/FpxImagePlugin.py | 228 ++ ascii2img/src/PIL/FtexImagePlugin.py | 94 + ascii2img/src/PIL/GbrImagePlugin.py | 93 + ascii2img/src/PIL/GdImageFile.py | 90 + ascii2img/src/PIL/GifImagePlugin.py | 805 +++++ ascii2img/src/PIL/GimpGradientFile.py | 137 + ascii2img/src/PIL/GimpPaletteFile.py | 62 + ascii2img/src/PIL/GribStubImagePlugin.py | 73 + ascii2img/src/PIL/Hdf5StubImagePlugin.py | 72 + ascii2img/src/PIL/IcnsImagePlugin.py | 365 +++ ascii2img/src/PIL/IcoImagePlugin.py | 284 ++ ascii2img/src/PIL/ImImagePlugin.py | 348 ++ ascii2img/src/PIL/Image.py | 2877 +++++++++++++++++ ascii2img/src/PIL/Image.pyc | Bin 0 -> 85265 bytes ascii2img/src/PIL/ImageChops.py | 283 ++ ascii2img/src/PIL/ImageCms.py | 973 ++++++ ascii2img/src/PIL/ImageColor.py | 294 ++ ascii2img/src/PIL/ImageDraw.py | 386 +++ ascii2img/src/PIL/ImageDraw2.py | 111 + ascii2img/src/PIL/ImageEnhance.py | 100 + ascii2img/src/PIL/ImageFile.py | 662 ++++ ascii2img/src/PIL/ImageFilter.py | 299 ++ ascii2img/src/PIL/ImageFont.py | 455 +++ ascii2img/src/PIL/ImageGrab.py | 80 + ascii2img/src/PIL/ImageMath.py | 269 ++ ascii2img/src/PIL/ImageMode.py | 55 + ascii2img/src/PIL/ImageMorph.py | 250 ++ ascii2img/src/PIL/ImageOps.py | 529 +++ ascii2img/src/PIL/ImagePalette.py | 216 ++ ascii2img/src/PIL/ImagePath.py | 60 + ascii2img/src/PIL/ImageQt.py | 203 ++ ascii2img/src/PIL/ImageSequence.py | 56 + ascii2img/src/PIL/ImageShow.py | 181 ++ ascii2img/src/PIL/ImageStat.py | 147 + ascii2img/src/PIL/ImageTransform.py | 98 + ascii2img/src/PIL/ImageWin.py | 227 ++ ascii2img/src/PIL/ImtImagePlugin.py | 95 + ascii2img/src/PIL/IptcImagePlugin.py | 257 ++ ascii2img/src/PIL/Jpeg2KImagePlugin.py | 275 ++ ascii2img/src/PIL/JpegImagePlugin.py | 788 +++++ ascii2img/src/PIL/JpegPresets.py | 241 ++ ascii2img/src/PIL/McIdasImagePlugin.py | 75 + ascii2img/src/PIL/MicImagePlugin.py | 107 + ascii2img/src/PIL/MpegImagePlugin.py | 85 + ascii2img/src/PIL/MpoImagePlugin.py | 99 + ascii2img/src/PIL/MspImagePlugin.py | 192 ++ ascii2img/src/PIL/OleFileIO.py | 12 + ascii2img/src/PIL/PSDraw.py | 235 ++ ascii2img/src/PIL/PaletteFile.py | 55 + ascii2img/src/PIL/PalmImagePlugin.py | 238 ++ ascii2img/src/PIL/PcdImagePlugin.py | 66 + ascii2img/src/PIL/PcfFontFile.py | 245 ++ ascii2img/src/PIL/PcxImagePlugin.py | 180 ++ ascii2img/src/PIL/PdfImagePlugin.py | 271 ++ ascii2img/src/PIL/PixarImagePlugin.py | 71 + ascii2img/src/PIL/PngImagePlugin.py | 845 +++++ ascii2img/src/PIL/PpmImagePlugin.py | 167 + ascii2img/src/PIL/PsdImagePlugin.py | 306 ++ ascii2img/src/PIL/PyAccess.py | 317 ++ ascii2img/src/PIL/SgiImagePlugin.py | 226 ++ ascii2img/src/PIL/SpiderImagePlugin.py | 316 ++ ascii2img/src/PIL/SunImagePlugin.py | 135 + ascii2img/src/PIL/TarIO.py | 56 + ascii2img/src/PIL/TgaImagePlugin.py | 192 ++ ascii2img/src/PIL/TiffImagePlugin.py | 1821 +++++++++++ ascii2img/src/PIL/TiffTags.py | 447 +++ ascii2img/src/PIL/WalImageFile.py | 127 + ascii2img/src/PIL/WebPImagePlugin.py | 78 + ascii2img/src/PIL/WmfImagePlugin.py | 167 + ascii2img/src/PIL/XVThumbImagePlugin.py | 80 + ascii2img/src/PIL/XbmImagePlugin.py | 96 + ascii2img/src/PIL/XpmImagePlugin.py | 128 + ascii2img/src/PIL/__init__.py | 64 + ascii2img/src/PIL/__init__.pyc | Bin 0 -> 1361 bytes .../src/PIL/__pycache__/Image.cpython-36.pyc | Bin 0 -> 78378 bytes .../PIL/__pycache__/ImageColor.cpython-36.pyc | Bin 0 -> 6070 bytes .../PIL/__pycache__/ImageDraw.cpython-36.pyc | Bin 0 -> 9924 bytes .../PIL/__pycache__/ImageFont.cpython-36.pyc | Bin 0 -> 18142 bytes .../PIL/__pycache__/ImageMode.cpython-36.pyc | Bin 0 -> 1222 bytes .../PIL/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1141 bytes .../PIL/__pycache__/_binary.cpython-36.pyc | Bin 0 -> 2577 bytes .../src/PIL/__pycache__/_util.cpython-36.pyc | Bin 0 -> 1169 bytes .../PIL/__pycache__/version.cpython-36.pyc | Bin 0 -> 128 bytes ascii2img/src/PIL/_binary.py | 93 + .../_imaging.cpython-35m-x86_64-linux-gnu.so | Bin 0 -> 357688 bytes .../_imaging.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 357688 bytes ...imagingcms.cpython-35m-x86_64-linux-gnu.so | Bin 0 -> 34704 bytes ...imagingcms.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 34704 bytes ..._imagingft.cpython-35m-x86_64-linux-gnu.so | Bin 0 -> 25472 bytes ..._imagingft.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 25472 bytes ...magingmath.cpython-35m-x86_64-linux-gnu.so | Bin 0 -> 18720 bytes ...magingmath.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 18720 bytes ...agingmorph.cpython-35m-x86_64-linux-gnu.so | Bin 0 -> 10560 bytes ...agingmorph.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 10560 bytes ascii2img/src/PIL/_tkinter_finder.py | 20 + ascii2img/src/PIL/_util.py | 27 + .../PIL/_webp.cpython-35m-x86_64-linux-gnu.so | Bin 0 -> 10720 bytes .../PIL/_webp.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 10720 bytes ascii2img/src/PIL/features.py | 78 + ascii2img/src/PIL/version.py | 2 + ascii2img/src/PIL/version.pyc | Bin 0 -> 143 bytes ascii2img/src/__main__.py | 74 + .../src/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 1726 bytes ascii2img/src/ascii2png.zip | Bin 0 -> 707629 bytes ascii2img/src/setup.py | 6 + 118 files changed, 22970 insertions(+) create mode 100644 ascii2img/make.sh create mode 100644 ascii2img/src/PIL/BdfFontFile.py create mode 100644 ascii2img/src/PIL/BmpImagePlugin.py create mode 100644 ascii2img/src/PIL/BufrStubImagePlugin.py create mode 100644 ascii2img/src/PIL/ContainerIO.py create mode 100644 ascii2img/src/PIL/CurImagePlugin.py create mode 100644 ascii2img/src/PIL/DcxImagePlugin.py create mode 100644 ascii2img/src/PIL/DdsImagePlugin.py create mode 100644 ascii2img/src/PIL/EpsImagePlugin.py create mode 100644 ascii2img/src/PIL/ExifTags.py create mode 100644 ascii2img/src/PIL/FitsStubImagePlugin.py create mode 100644 ascii2img/src/PIL/FliImagePlugin.py create mode 100644 ascii2img/src/PIL/FontFile.py create mode 100644 ascii2img/src/PIL/FpxImagePlugin.py create mode 100644 ascii2img/src/PIL/FtexImagePlugin.py create mode 100644 ascii2img/src/PIL/GbrImagePlugin.py create mode 100644 ascii2img/src/PIL/GdImageFile.py create mode 100644 ascii2img/src/PIL/GifImagePlugin.py create mode 100644 ascii2img/src/PIL/GimpGradientFile.py create mode 100644 ascii2img/src/PIL/GimpPaletteFile.py create mode 100644 ascii2img/src/PIL/GribStubImagePlugin.py create mode 100644 ascii2img/src/PIL/Hdf5StubImagePlugin.py create mode 100644 ascii2img/src/PIL/IcnsImagePlugin.py create mode 100644 ascii2img/src/PIL/IcoImagePlugin.py create mode 100644 ascii2img/src/PIL/ImImagePlugin.py create mode 100644 ascii2img/src/PIL/Image.py create mode 100644 ascii2img/src/PIL/Image.pyc create mode 100644 ascii2img/src/PIL/ImageChops.py create mode 100644 ascii2img/src/PIL/ImageCms.py create mode 100644 ascii2img/src/PIL/ImageColor.py create mode 100644 ascii2img/src/PIL/ImageDraw.py create mode 100644 ascii2img/src/PIL/ImageDraw2.py create mode 100644 ascii2img/src/PIL/ImageEnhance.py create mode 100644 ascii2img/src/PIL/ImageFile.py create mode 100644 ascii2img/src/PIL/ImageFilter.py create mode 100644 ascii2img/src/PIL/ImageFont.py create mode 100644 ascii2img/src/PIL/ImageGrab.py create mode 100644 ascii2img/src/PIL/ImageMath.py create mode 100644 ascii2img/src/PIL/ImageMode.py create mode 100644 ascii2img/src/PIL/ImageMorph.py create mode 100644 ascii2img/src/PIL/ImageOps.py create mode 100644 ascii2img/src/PIL/ImagePalette.py create mode 100644 ascii2img/src/PIL/ImagePath.py create mode 100644 ascii2img/src/PIL/ImageQt.py create mode 100644 ascii2img/src/PIL/ImageSequence.py create mode 100644 ascii2img/src/PIL/ImageShow.py create mode 100644 ascii2img/src/PIL/ImageStat.py create mode 100644 ascii2img/src/PIL/ImageTransform.py create mode 100644 ascii2img/src/PIL/ImageWin.py create mode 100644 ascii2img/src/PIL/ImtImagePlugin.py create mode 100644 ascii2img/src/PIL/IptcImagePlugin.py create mode 100644 ascii2img/src/PIL/Jpeg2KImagePlugin.py create mode 100644 ascii2img/src/PIL/JpegImagePlugin.py create mode 100644 ascii2img/src/PIL/JpegPresets.py create mode 100644 ascii2img/src/PIL/McIdasImagePlugin.py create mode 100644 ascii2img/src/PIL/MicImagePlugin.py create mode 100644 ascii2img/src/PIL/MpegImagePlugin.py create mode 100644 ascii2img/src/PIL/MpoImagePlugin.py create mode 100644 ascii2img/src/PIL/MspImagePlugin.py create mode 100644 ascii2img/src/PIL/OleFileIO.py create mode 100644 ascii2img/src/PIL/PSDraw.py create mode 100644 ascii2img/src/PIL/PaletteFile.py create mode 100644 ascii2img/src/PIL/PalmImagePlugin.py create mode 100644 ascii2img/src/PIL/PcdImagePlugin.py create mode 100644 ascii2img/src/PIL/PcfFontFile.py create mode 100644 ascii2img/src/PIL/PcxImagePlugin.py create mode 100644 ascii2img/src/PIL/PdfImagePlugin.py create mode 100644 ascii2img/src/PIL/PixarImagePlugin.py create mode 100644 ascii2img/src/PIL/PngImagePlugin.py create mode 100644 ascii2img/src/PIL/PpmImagePlugin.py create mode 100644 ascii2img/src/PIL/PsdImagePlugin.py create mode 100644 ascii2img/src/PIL/PyAccess.py create mode 100644 ascii2img/src/PIL/SgiImagePlugin.py create mode 100644 ascii2img/src/PIL/SpiderImagePlugin.py create mode 100644 ascii2img/src/PIL/SunImagePlugin.py create mode 100644 ascii2img/src/PIL/TarIO.py create mode 100644 ascii2img/src/PIL/TgaImagePlugin.py create mode 100644 ascii2img/src/PIL/TiffImagePlugin.py create mode 100644 ascii2img/src/PIL/TiffTags.py create mode 100644 ascii2img/src/PIL/WalImageFile.py create mode 100644 ascii2img/src/PIL/WebPImagePlugin.py create mode 100644 ascii2img/src/PIL/WmfImagePlugin.py create mode 100644 ascii2img/src/PIL/XVThumbImagePlugin.py create mode 100644 ascii2img/src/PIL/XbmImagePlugin.py create mode 100644 ascii2img/src/PIL/XpmImagePlugin.py create mode 100644 ascii2img/src/PIL/__init__.py create mode 100644 ascii2img/src/PIL/__init__.pyc create mode 100644 ascii2img/src/PIL/__pycache__/Image.cpython-36.pyc create mode 100644 ascii2img/src/PIL/__pycache__/ImageColor.cpython-36.pyc create mode 100644 ascii2img/src/PIL/__pycache__/ImageDraw.cpython-36.pyc create mode 100644 ascii2img/src/PIL/__pycache__/ImageFont.cpython-36.pyc create mode 100644 ascii2img/src/PIL/__pycache__/ImageMode.cpython-36.pyc create mode 100644 ascii2img/src/PIL/__pycache__/__init__.cpython-36.pyc create mode 100644 ascii2img/src/PIL/__pycache__/_binary.cpython-36.pyc create mode 100644 ascii2img/src/PIL/__pycache__/_util.cpython-36.pyc create mode 100644 ascii2img/src/PIL/__pycache__/version.cpython-36.pyc create mode 100644 ascii2img/src/PIL/_binary.py create mode 100644 ascii2img/src/PIL/_imaging.cpython-35m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imaging.cpython-36m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imagingcms.cpython-35m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imagingcms.cpython-36m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imagingft.cpython-35m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imagingft.cpython-36m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imagingmath.cpython-35m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imagingmath.cpython-36m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imagingmorph.cpython-35m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_imagingmorph.cpython-36m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_tkinter_finder.py create mode 100644 ascii2img/src/PIL/_util.py create mode 100644 ascii2img/src/PIL/_webp.cpython-35m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/_webp.cpython-36m-x86_64-linux-gnu.so create mode 100644 ascii2img/src/PIL/features.py create mode 100644 ascii2img/src/PIL/version.py create mode 100644 ascii2img/src/PIL/version.pyc create mode 100755 ascii2img/src/__main__.py create mode 100644 ascii2img/src/__pycache__/__main__.cpython-36.pyc create mode 100644 ascii2img/src/ascii2png.zip create mode 100644 ascii2img/src/setup.py diff --git a/ascii2img/make.sh b/ascii2img/make.sh new file mode 100644 index 0000000..fb3df7b --- /dev/null +++ b/ascii2img/make.sh @@ -0,0 +1,6 @@ +cd src +zip -r ascii2png.zip ./* +echo '#!/usr/bin/env python3' | cat - ascii2png.zip > ascii2png + +chmod +x ascii2png +mv ascii2png ../ diff --git a/ascii2img/src/PIL/BdfFontFile.py b/ascii2img/src/PIL/BdfFontFile.py new file mode 100644 index 0000000..c8bc604 --- /dev/null +++ b/ascii2img/src/PIL/BdfFontFile.py @@ -0,0 +1,133 @@ +# +# The Python Imaging Library +# $Id$ +# +# bitmap distribution font (bdf) file parser +# +# history: +# 1996-05-16 fl created (as bdf2pil) +# 1997-08-25 fl converted to FontFile driver +# 2001-05-25 fl removed bogus __init__ call +# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) +# 2003-04-22 fl more robustification (from Graham Dumpleton) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from . import Image, FontFile + + +# -------------------------------------------------------------------- +# parse X Bitmap Distribution Format (BDF) +# -------------------------------------------------------------------- + +bdf_slant = { + "R": "Roman", + "I": "Italic", + "O": "Oblique", + "RI": "Reverse Italic", + "RO": "Reverse Oblique", + "OT": "Other" +} + +bdf_spacing = { + "P": "Proportional", + "M": "Monospaced", + "C": "Cell" +} + + +def bdf_char(f): + # skip to STARTCHAR + while True: + s = f.readline() + if not s: + return None + if s[:9] == b"STARTCHAR": + break + id = s[9:].strip().decode('ascii') + + # load symbol properties + props = {} + while True: + s = f.readline() + if not s or s[:6] == b"BITMAP": + break + i = s.find(b" ") + props[s[:i].decode('ascii')] = s[i+1:-1].decode('ascii') + + # load bitmap + bitmap = [] + while True: + s = f.readline() + if not s or s[:7] == b"ENDCHAR": + break + bitmap.append(s[:-1]) + bitmap = b"".join(bitmap) + + [x, y, l, d] = [int(p) for p in props["BBX"].split()] + [dx, dy] = [int(p) for p in props["DWIDTH"].split()] + + bbox = (dx, dy), (l, -d-y, x+l, -d), (0, 0, x, y) + + try: + im = Image.frombytes("1", (x, y), bitmap, "hex", "1") + except ValueError: + # deal with zero-width characters + im = Image.new("1", (x, y)) + + return id, int(props["ENCODING"]), bbox, im + + +## +# Font file plugin for the X11 BDF format. + +class BdfFontFile(FontFile.FontFile): + + def __init__(self, fp): + + FontFile.FontFile.__init__(self) + + s = fp.readline() + if s[:13] != b"STARTFONT 2.1": + raise SyntaxError("not a valid BDF file") + + props = {} + comments = [] + + while True: + s = fp.readline() + if not s or s[:13] == b"ENDPROPERTIES": + break + i = s.find(b" ") + props[s[:i].decode('ascii')] = s[i+1:-1].decode('ascii') + if s[:i] in [b"COMMENT", b"COPYRIGHT"]: + if s.find(b"LogicalFontDescription") < 0: + comments.append(s[i+1:-1].decode('ascii')) + + # font = props["FONT"].split("-") + + # font[4] = bdf_slant[font[4].upper()] + # font[11] = bdf_spacing[font[11].upper()] + + # ascent = int(props["FONT_ASCENT"]) + # descent = int(props["FONT_DESCENT"]) + + # fontname = ";".join(font[1:]) + + # print("#", fontname) + # for i in comments: + # print("#", i) + + while True: + c = bdf_char(fp) + if not c: + break + id, ch, (xy, dst, src), im = c + if 0 <= ch < len(self.glyph): + self.glyph[ch] = xy, dst, src, im diff --git a/ascii2img/src/PIL/BmpImagePlugin.py b/ascii2img/src/PIL/BmpImagePlugin.py new file mode 100644 index 0000000..cf18eab --- /dev/null +++ b/ascii2img/src/PIL/BmpImagePlugin.py @@ -0,0 +1,290 @@ +# +# The Python Imaging Library. +# $Id$ +# +# BMP file handler +# +# Windows (and OS/2) native bitmap storage format. +# +# history: +# 1995-09-01 fl Created +# 1996-04-30 fl Added save +# 1997-08-27 fl Fixed save of 1-bit images +# 1998-03-06 fl Load P images as L where possible +# 1998-07-03 fl Load P images as 1 where possible +# 1998-12-29 fl Handle small palettes +# 2002-12-30 fl Fixed load of 1-bit palette images +# 2003-04-21 fl Fixed load of 1-bit monochrome images +# 2003-04-23 fl Added limited support for BI_BITFIELDS compression +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1995-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, i32le as i32, \ + o8, o16le as o16, o32le as o32 +import math + +__version__ = "0.7" + +# +# -------------------------------------------------------------------- +# Read BMP file + +BIT2MODE = { + # bits => mode, rawmode + 1: ("P", "P;1"), + 4: ("P", "P;4"), + 8: ("P", "P"), + 16: ("RGB", "BGR;15"), + 24: ("RGB", "BGR"), + 32: ("RGB", "BGRX"), +} + + +def _accept(prefix): + return prefix[:2] == b"BM" + + +# ============================================================================== +# Image plugin for the Windows BMP format. +# ============================================================================== +class BmpImageFile(ImageFile.ImageFile): + """ Image plugin for the Windows Bitmap format (BMP) """ + + # -------------------------------------------------------------- Description + format_description = "Windows Bitmap" + format = "BMP" + # --------------------------------------------------- BMP Compression values + COMPRESSIONS = {'RAW': 0, 'RLE8': 1, 'RLE4': 2, 'BITFIELDS': 3, 'JPEG': 4, 'PNG': 5} + RAW, RLE8, RLE4, BITFIELDS, JPEG, PNG = 0, 1, 2, 3, 4, 5 + + def _bitmap(self, header=0, offset=0): + """ Read relevant info about the BMP """ + read, seek = self.fp.read, self.fp.seek + if header: + seek(header) + file_info = {} + file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) + file_info['direction'] = -1 + # --------------------- If requested, read header at a specific position + header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size + # --------------------------------------------------- IBM OS/2 Bitmap v1 + # ------ This format has different offsets because of width/height types + if file_info['header_size'] == 12: + file_info['width'] = i16(header_data[0:2]) + file_info['height'] = i16(header_data[2:4]) + file_info['planes'] = i16(header_data[4:6]) + file_info['bits'] = i16(header_data[6:8]) + file_info['compression'] = self.RAW + file_info['palette_padding'] = 3 + # ---------------------------------------------- Windows Bitmap v2 to v5 + elif file_info['header_size'] in (40, 64, 108, 124): # v3, OS/2 v2, v4, v5 + if file_info['header_size'] >= 40: # v3 and OS/2 + file_info['y_flip'] = i8(header_data[7]) == 0xff + file_info['direction'] = 1 if file_info['y_flip'] else -1 + file_info['width'] = i32(header_data[0:4]) + file_info['height'] = i32(header_data[4:8]) if not file_info['y_flip'] else 2**32 - i32(header_data[4:8]) + file_info['planes'] = i16(header_data[8:10]) + file_info['bits'] = i16(header_data[10:12]) + file_info['compression'] = i32(header_data[12:16]) + file_info['data_size'] = i32(header_data[16:20]) # byte size of pixel data + file_info['pixels_per_meter'] = (i32(header_data[20:24]), i32(header_data[24:28])) + file_info['colors'] = i32(header_data[28:32]) + file_info['palette_padding'] = 4 + self.info["dpi"] = tuple( + map(lambda x: int(math.ceil(x / 39.3701)), + file_info['pixels_per_meter'])) + if file_info['compression'] == self.BITFIELDS: + if len(header_data) >= 52: + for idx, mask in enumerate(['r_mask', 'g_mask', 'b_mask', 'a_mask']): + file_info[mask] = i32(header_data[36+idx*4:40+idx*4]) + else: + # 40 byte headers only have the three components in the bitfields masks, + # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also https://github.com/python-pillow/Pillow/issues/1293 + # There is a 4th component in the RGBQuad, in the alpha location, but it + # is listed as a reserved component, and it is not generally an alpha channel + file_info['a_mask'] = 0x0 + for mask in ['r_mask', 'g_mask', 'b_mask']: + file_info[mask] = i32(read(4)) + file_info['rgb_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask']) + file_info['rgba_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask'], file_info['a_mask']) + else: + raise IOError("Unsupported BMP header type (%d)" % file_info['header_size']) + # ------------------ Special case : header is reported 40, which + # ---------------------- is shorter than real size for bpp >= 16 + self.size = file_info['width'], file_info['height'] + # -------- If color count was not found in the header, compute from bits + file_info['colors'] = file_info['colors'] if file_info.get('colors', 0) else (1 << file_info['bits']) + # -------------------------------- Check abnormal values for DOS attacks + if file_info['width'] * file_info['height'] > 2**31: + raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) + # ----------------------- Check bit depth for unusual unsupported values + self.mode, raw_mode = BIT2MODE.get(file_info['bits'], (None, None)) + if self.mode is None: + raise IOError("Unsupported BMP pixel depth (%d)" % file_info['bits']) + # ----------------- Process BMP with Bitfields compression (not palette) + if file_info['compression'] == self.BITFIELDS: + SUPPORTED = { + 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0), (0xff000000, 0xff0000, 0xff00, 0x0)], + 24: [(0xff0000, 0xff00, 0xff)], + 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)] + } + MASK_MODES = { + (32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", + (32, (0xff000000, 0xff0000, 0xff00, 0x0)): "XBGR", + (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", + (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", + (24, (0xff0000, 0xff00, 0xff)): "BGR", + (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", + (16, (0x7c00, 0x3e0, 0x1f)): "BGR;15" + } + if file_info['bits'] in SUPPORTED: + if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: + raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] + self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode + elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]: + raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])] + else: + raise IOError("Unsupported BMP bitfields layout") + else: + raise IOError("Unsupported BMP bitfields layout") + elif file_info['compression'] == self.RAW: + if file_info['bits'] == 32 and header == 22: # 32-bit .cur offset + raw_mode, self.mode = "BGRA", "RGBA" + else: + raise IOError("Unsupported BMP compression (%d)" % file_info['compression']) + # ---------------- Once the header is processed, process the palette/LUT + if self.mode == "P": # Paletted for 1, 4 and 8 bit images + # ----------------------------------------------------- 1-bit images + if not (0 < file_info['colors'] <= 65536): + raise IOError("Unsupported BMP Palette size (%d)" % file_info['colors']) + else: + padding = file_info['palette_padding'] + palette = read(padding * file_info['colors']) + greyscale = True + indices = (0, 255) if file_info['colors'] == 2 else list(range(file_info['colors'])) + # ------------------ Check if greyscale and ignore palette if so + for ind, val in enumerate(indices): + rgb = palette[ind*padding:ind*padding + 3] + if rgb != o8(val) * 3: + greyscale = False + # -------- If all colors are grey, white or black, ditch palette + if greyscale: + self.mode = "1" if file_info['colors'] == 2 else "L" + raw_mode = self.mode + else: + self.mode = "P" + self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", palette) + + # ----------------------------- Finally set the tile data for the plugin + self.info['compression'] = file_info['compression'] + self.tile = [('raw', (0, 0, file_info['width'], file_info['height']), offset or self.fp.tell(), + (raw_mode, ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), file_info['direction']) + )] + + def _open(self): + """ Open file, check magic number and read header """ + # read 14 bytes: magic number, filesize, reserved, header final offset + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if head_data[0:2] != b"BM": + raise SyntaxError("Not a BMP file") + # read the start position of the BMP image data (u32) + offset = i32(head_data[10:14]) + # load bitmap information (offset=raster info) + self._bitmap(offset=offset) + + +# ============================================================================== +# Image plugin for the DIB format (BMP alias) +# ============================================================================== +class DibImageFile(BmpImageFile): + + format = "DIB" + format_description = "Windows Bitmap" + + def _open(self): + self._bitmap() + +# +# -------------------------------------------------------------------- +# Write BMP file + +SAVE = { + "1": ("1", 1, 2), + "L": ("L", 8, 256), + "P": ("P", 8, 256), + "RGB": ("BGR", 24, 0), + "RGBA": ("BGRA", 32, 0), +} + + +def _save(im, fp, filename, check=0): + try: + rawmode, bits, colors = SAVE[im.mode] + except KeyError: + raise IOError("cannot write mode %s as BMP" % im.mode) + + if check: + return check + + info = im.encoderinfo + + dpi = info.get("dpi", (96, 96)) + + # 1 meter == 39.3701 inches + ppm = tuple(map(lambda x: int(x * 39.3701), dpi)) + + stride = ((im.size[0]*bits+7)//8+3) & (~3) + header = 40 # or 64 for OS/2 version 2 + offset = 14 + header + colors * 4 + image = stride * im.size[1] + + # bitmap header + fp.write(b"BM" + # file type (magic) + o32(offset+image) + # file size + o32(0) + # reserved + o32(offset)) # image data offset + + # bitmap info header + fp.write(o32(header) + # info header size + o32(im.size[0]) + # width + o32(im.size[1]) + # height + o16(1) + # planes + o16(bits) + # depth + o32(0) + # compression (0=uncompressed) + o32(image) + # size of bitmap + o32(ppm[0]) + o32(ppm[1]) + # resolution + o32(colors) + # colors used + o32(colors)) # colors important + + fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) + + if im.mode == "1": + for i in (0, 255): + fp.write(o8(i) * 4) + elif im.mode == "L": + for i in range(256): + fp.write(o8(i) * 4) + elif im.mode == "P": + fp.write(im.im.getpalette("RGB", "BGRX")) + + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, + (rawmode, stride, -1))]) + +# +# -------------------------------------------------------------------- +# Registry + +Image.register_open(BmpImageFile.format, BmpImageFile, _accept) +Image.register_save(BmpImageFile.format, _save) + +Image.register_extension(BmpImageFile.format, ".bmp") + +Image.register_mime(BmpImageFile.format, "image/bmp") diff --git a/ascii2img/src/PIL/BufrStubImagePlugin.py b/ascii2img/src/PIL/BufrStubImagePlugin.py new file mode 100644 index 0000000..16d83c7 --- /dev/null +++ b/ascii2img/src/PIL/BufrStubImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library +# $Id$ +# +# BUFR stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific BUFR image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + +def _accept(prefix): + return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" + + +class BufrStubImageFile(ImageFile.StubImageFile): + + format = "BUFR" + format_description = "BUFR" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(4)): + raise SyntaxError("Not a BUFR file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self.size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise IOError("BUFR save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) +Image.register_save(BufrStubImageFile.format, _save) + +Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/ascii2img/src/PIL/ContainerIO.py b/ascii2img/src/PIL/ContainerIO.py new file mode 100644 index 0000000..496ed68 --- /dev/null +++ b/ascii2img/src/PIL/ContainerIO.py @@ -0,0 +1,116 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a class to read from a container file +# +# History: +# 1995-06-18 fl Created +# 1995-09-07 fl Added readline(), readlines() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +## +# A file object that provides read access to a part of an existing +# file (for example a TAR file). + + +class ContainerIO(object): + + def __init__(self, file, offset, length): + """ + Create file object. + + :param file: Existing file. + :param offset: Start of region, in bytes. + :param length: Size of region, in bytes. + """ + self.fh = file + self.pos = 0 + self.offset = offset + self.length = length + self.fh.seek(offset) + + ## + # Always false. + + def isatty(self): + return 0 + + def seek(self, offset, mode=0): + """ + Move file pointer. + + :param offset: Offset in bytes. + :param mode: Starting position. Use 0 for beginning of region, 1 + for current offset, and 2 for end of region. You cannot move + the pointer outside the defined region. + """ + if mode == 1: + self.pos = self.pos + offset + elif mode == 2: + self.pos = self.length + offset + else: + self.pos = offset + # clamp + self.pos = max(0, min(self.pos, self.length)) + self.fh.seek(self.offset + self.pos) + + def tell(self): + """ + Get current file pointer. + + :returns: Offset from start of region, in bytes. + """ + return self.pos + + def read(self, n=0): + """ + Read data. + + :param n: Number of bytes to read. If omitted or zero, + read until end of region. + :returns: An 8-bit string. + """ + if n: + n = min(n, self.length - self.pos) + else: + n = self.length - self.pos + if not n: # EOF + return "" + self.pos = self.pos + n + return self.fh.read(n) + + def readline(self): + """ + Read a line of text. + + :returns: An 8-bit string. + """ + s = "" + while True: + c = self.read(1) + if not c: + break + s = s + c + if c == "\n": + break + return s + + def readlines(self): + """ + Read multiple lines of text. + + :returns: A list of 8-bit strings. + """ + l = [] + while True: + s = self.readline() + if not s: + break + l.append(s) + return l diff --git a/ascii2img/src/PIL/CurImagePlugin.py b/ascii2img/src/PIL/CurImagePlugin.py new file mode 100644 index 0000000..e4257cd --- /dev/null +++ b/ascii2img/src/PIL/CurImagePlugin.py @@ -0,0 +1,86 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Cursor support for PIL +# +# notes: +# uses BmpImagePlugin.py to read the bitmap data. +# +# history: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from . import Image, BmpImagePlugin +from ._binary import i8, i16le as i16, i32le as i32 + +__version__ = "0.1" + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + return prefix[:4] == b"\0\0\2\0" + + +## +# Image plugin for Windows Cursor files. + +class CurImageFile(BmpImagePlugin.BmpImageFile): + + format = "CUR" + format_description = "Windows Cursor" + + def _open(self): + + offset = self.fp.tell() + + # check magic + s = self.fp.read(6) + if not _accept(s): + raise SyntaxError("not a CUR file") + + # pick the largest cursor in the file + m = b"" + for i in range(i16(s[4:])): + s = self.fp.read(16) + if not m: + m = s + elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]): + m = s + # print("width", i8(s[0])) + # print("height", i8(s[1])) + # print("colors", i8(s[2])) + # print("reserved", i8(s[3])) + # print("hotspot x", i16(s[4:])) + # print("hotspot y", i16(s[6:])) + # print("bytes", i32(s[8:])) + # print("offset", i32(s[12:])) + if not m: + raise TypeError("No cursors were found") + + # load as bitmap + self._bitmap(i32(m[12:]) + offset) + + # patch up the bitmap height + self.size = self.size[0], self.size[1]//2 + d, e, o, a = self.tile[0] + self.tile[0] = d, (0, 0)+self.size, o, a + + return + + +# +# -------------------------------------------------------------------- + +Image.register_open(CurImageFile.format, CurImageFile, _accept) + +Image.register_extension(CurImageFile.format, ".cur") diff --git a/ascii2img/src/PIL/DcxImagePlugin.py b/ascii2img/src/PIL/DcxImagePlugin.py new file mode 100644 index 0000000..0d920ad --- /dev/null +++ b/ascii2img/src/PIL/DcxImagePlugin.py @@ -0,0 +1,87 @@ +# +# The Python Imaging Library. +# $Id$ +# +# DCX file handling +# +# DCX is a container file format defined by Intel, commonly used +# for fax applications. Each DCX file consists of a directory +# (a list of file offsets) followed by a set of (usually 1-bit) +# PCX files. +# +# History: +# 1995-09-09 fl Created +# 1996-03-20 fl Properly derived from PcxImageFile. +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2002-07-30 fl Fixed file handling +# +# Copyright (c) 1997-98 by Secret Labs AB. +# Copyright (c) 1995-96 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._binary import i32le as i32 +from .PcxImagePlugin import PcxImageFile + +__version__ = "0.2" + +MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? + + +def _accept(prefix): + return len(prefix) >= 4 and i32(prefix) == MAGIC + + +## +# Image plugin for the Intel DCX format. + +class DcxImageFile(PcxImageFile): + + format = "DCX" + format_description = "Intel DCX" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # Header + s = self.fp.read(4) + if i32(s) != MAGIC: + raise SyntaxError("not a DCX file") + + # Component directory + self._offset = [] + for i in range(1024): + offset = i32(self.fp.read(4)) + if not offset: + break + self._offset.append(offset) + + self.__fp = self.fp + self.frame = None + self.seek(0) + + @property + def n_frames(self): + return len(self._offset) + + @property + def is_animated(self): + return len(self._offset) > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + self.frame = frame + self.fp = self.__fp + self.fp.seek(self._offset[frame]) + PcxImageFile._open(self) + + def tell(self): + return self.frame + + +Image.register_open(DcxImageFile.format, DcxImageFile, _accept) + +Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/ascii2img/src/PIL/DdsImagePlugin.py b/ascii2img/src/PIL/DdsImagePlugin.py new file mode 100644 index 0000000..9508e61 --- /dev/null +++ b/ascii2img/src/PIL/DdsImagePlugin.py @@ -0,0 +1,172 @@ +""" +A Pillow loader for .dds files (S3TC-compressed aka DXTC) +Jerome Leclanche + +Documentation: + http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ +""" + +import struct +from io import BytesIO +from . import Image, ImageFile + + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + +# DDS flags +DDSD_CAPS = 0x1 +DDSD_HEIGHT = 0x2 +DDSD_WIDTH = 0x4 +DDSD_PITCH = 0x8 +DDSD_PIXELFORMAT = 0x1000 +DDSD_MIPMAPCOUNT = 0x20000 +DDSD_LINEARSIZE = 0x80000 +DDSD_DEPTH = 0x800000 + +# DDS caps +DDSCAPS_COMPLEX = 0x8 +DDSCAPS_TEXTURE = 0x1000 +DDSCAPS_MIPMAP = 0x400000 + +DDSCAPS2_CUBEMAP = 0x200 +DDSCAPS2_CUBEMAP_POSITIVEX = 0x400 +DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800 +DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000 +DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000 +DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000 +DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000 +DDSCAPS2_VOLUME = 0x200000 + +# Pixel Format +DDPF_ALPHAPIXELS = 0x1 +DDPF_ALPHA = 0x2 +DDPF_FOURCC = 0x4 +DDPF_PALETTEINDEXED8 = 0x20 +DDPF_RGB = 0x40 +DDPF_LUMINANCE = 0x20000 + + +# dds.h + +DDS_FOURCC = DDPF_FOURCC +DDS_RGB = DDPF_RGB +DDS_RGBA = DDPF_RGB | DDPF_ALPHAPIXELS +DDS_LUMINANCE = DDPF_LUMINANCE +DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS +DDS_ALPHA = DDPF_ALPHA +DDS_PAL8 = DDPF_PALETTEINDEXED8 + +DDS_HEADER_FLAGS_TEXTURE = (DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | + DDSD_PIXELFORMAT) +DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT +DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH +DDS_HEADER_FLAGS_PITCH = DDSD_PITCH +DDS_HEADER_FLAGS_LINEARSIZE = DDSD_LINEARSIZE + +DDS_HEIGHT = DDSD_HEIGHT +DDS_WIDTH = DDSD_WIDTH + +DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS_TEXTURE +DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS_COMPLEX | DDSCAPS_MIPMAP +DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS_COMPLEX + +DDS_CUBEMAP_POSITIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +DDS_CUBEMAP_NEGATIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +DDS_CUBEMAP_POSITIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +DDS_CUBEMAP_NEGATIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +DDS_CUBEMAP_POSITIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ + + +# DXT1 +DXT1_FOURCC = 0x31545844 + +# DXT3 +DXT3_FOURCC = 0x33545844 + +# DXT5 +DXT5_FOURCC = 0x35545844 + + +# dxgiformat.h + +DXGI_FORMAT_BC7_TYPELESS = 97 +DXGI_FORMAT_BC7_UNORM = 98 +DXGI_FORMAT_BC7_UNORM_SRGB = 99 + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self): + magic, header_size = struct.unpack(" 0: + s = fp.read(min(lengthfile, 100*1024)) + if not s: + break + lengthfile -= len(s) + f.write(s) + + # Build ghostscript command + command = ["gs", + "-q", # quiet mode + "-g%dx%d" % size, # set output geometry (pixels) + "-r%fx%f" % res, # set input DPI (dots per inch) + "-dBATCH", # exit after processing + "-dNOPAUSE", # don't pause between pages, + "-dSAFER", # safe mode + "-sDEVICE=ppmraw", # ppm driver + "-sOutputFile=%s" % outfile, # output file + "-c", "%d %d translate" % (-bbox[0], -bbox[1]), + # adjust for image origin + "-f", infile, # input file + "-c", "showpage", # showpage (see: https://bugs.ghostscript.com/show_bug.cgi?id=698272) + ] + + if gs_windows_binary is not None: + if not gs_windows_binary: + raise WindowsError('Unable to locate Ghostscript on paths') + command[0] = gs_windows_binary + + # push data through ghostscript + try: + with open(os.devnull, 'w+b') as devnull: + subprocess.check_call(command, stdin=devnull, stdout=devnull) + im = Image.open(outfile) + im.load() + finally: + try: + os.unlink(outfile) + if infile_temp: + os.unlink(infile_temp) + except OSError: + pass + + return im.im.copy() + + +class PSFile(object): + """ + Wrapper for bytesio object that treats either CR or LF as end of line. + """ + def __init__(self, fp): + self.fp = fp + self.char = None + + def seek(self, offset, whence=0): + self.char = None + self.fp.seek(offset, whence) + + def readline(self): + s = self.char or b"" + self.char = None + + c = self.fp.read(1) + while c not in b"\r\n": + s = s + c + c = self.fp.read(1) + + self.char = self.fp.read(1) + # line endings can be 1 or 2 of \r \n, in either order + if self.char in b"\r\n": + self.char = None + + return s.decode('latin-1') + + +def _accept(prefix): + return prefix[:4] == b"%!PS" or \ + (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) + +## +# Image plugin for Encapsulated Postscript. This plugin supports only +# a few variants of this format. + + +class EpsImageFile(ImageFile.ImageFile): + """EPS File Parser for the Python Imaging Library""" + + format = "EPS" + format_description = "Encapsulated Postscript" + + mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} + + def _open(self): + (length, offset) = self._find_offset(self.fp) + + # Rewrap the open file pointer in something that will + # convert line endings and decode to latin-1. + try: + if bytes is str: + # Python2, no encoding conversion necessary + fp = open(self.fp.name, "Ur") + else: + # Python3, can use bare open command. + fp = open(self.fp.name, "Ur", encoding='latin-1') + except: + # Expect this for bytesio/stringio + fp = PSFile(self.fp) + + # go to offset - start of "%!PS" + fp.seek(offset) + + box = None + + self.mode = "RGB" + self.size = 1, 1 # FIXME: huh? + + # + # Load EPS header + + s = fp.readline().strip('\r\n') + + while s: + if len(s) > 255: + raise SyntaxError("not an EPS file") + + try: + m = split.match(s) + except re.error as v: + raise SyntaxError("not an EPS file") + + if m: + k, v = m.group(1, 2) + self.info[k] = v + if k == "BoundingBox": + try: + # Note: The DSC spec says that BoundingBox + # fields should be integers, but some drivers + # put floating point values there anyway. + box = [int(float(i)) for i in v.split()] + self.size = box[2] - box[0], box[3] - box[1] + self.tile = [("eps", (0, 0) + self.size, offset, + (length, box))] + except: + pass + + else: + m = field.match(s) + if m: + k = m.group(1) + + if k == "EndComments": + break + if k[:8] == "PS-Adobe": + self.info[k[:8]] = k[9:] + else: + self.info[k] = "" + elif s[0] == '%': + # handle non-DSC Postscript comments that some + # tools mistakenly put in the Comments section + pass + else: + raise IOError("bad EPS header") + + s = fp.readline().strip('\r\n') + + if s[:1] != "%": + break + + # + # Scan for an "ImageData" descriptor + + while s[:1] == "%": + + if len(s) > 255: + raise SyntaxError("not an EPS file") + + if s[:11] == "%ImageData:": + # Encoded bitmapped image. + x, y, bi, mo = s[11:].split(None, 7)[:4] + + if int(bi) != 8: + break + try: + self.mode = self.mode_map[int(mo)] + except ValueError: + break + + self.size = int(x), int(y) + return + + s = fp.readline().strip('\r\n') + if not s: + break + + if not box: + raise IOError("cannot determine EPS bounding box") + + def _find_offset(self, fp): + + s = fp.read(160) + + if s[:4] == b"%!PS": + # for HEAD without binary preview + fp.seek(0, 2) + length = fp.tell() + offset = 0 + elif i32(s[0:4]) == 0xC6D3D0C5: + # FIX for: Some EPS file not handled correctly / issue #302 + # EPS can contain binary data + # or start directly with latin coding + # more info see: + # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf + offset = i32(s[4:8]) + length = i32(s[8:12]) + else: + raise SyntaxError("not an EPS file") + + return (length, offset) + + def load(self, scale=1): + # Load EPS via Ghostscript + if not self.tile: + return + self.im = Ghostscript(self.tile, self.size, self.fp, scale) + self.mode = self.im.mode + self.size = self.im.size + self.tile = [] + + def load_seek(self, *args, **kwargs): + # we can't incrementally load, so force ImageFile.parser to + # use our custom load method by defining this method. + pass + + +# +# -------------------------------------------------------------------- + +def _save(im, fp, filename, eps=1): + """EPS Writer for the Python Imaging Library.""" + + # + # make sure image data is available + im.load() + + # + # determine postscript image mode + if im.mode == "L": + operator = (8, 1, "image") + elif im.mode == "RGB": + operator = (8, 3, "false 3 colorimage") + elif im.mode == "CMYK": + operator = (8, 4, "false 4 colorimage") + else: + raise ValueError("image mode is not supported") + + class NoCloseStream(object): + def __init__(self, fp): + self.fp = fp + + def __getattr__(self, name): + return getattr(self.fp, name) + + def close(self): + pass + + base_fp = fp + if fp != sys.stdout: + fp = NoCloseStream(fp) + if sys.version_info[0] > 2: + fp = io.TextIOWrapper(fp, encoding='latin-1') + + if eps: + # + # write EPS header + fp.write("%!PS-Adobe-3.0 EPSF-3.0\n") + fp.write("%%Creator: PIL 0.1 EpsEncode\n") + # fp.write("%%CreationDate: %s"...) + fp.write("%%%%BoundingBox: 0 0 %d %d\n" % im.size) + fp.write("%%Pages: 1\n") + fp.write("%%EndComments\n") + fp.write("%%Page: 1 1\n") + fp.write("%%ImageData: %d %d " % im.size) + fp.write("%d %d 0 1 1 \"%s\"\n" % operator) + + # + # image header + fp.write("gsave\n") + fp.write("10 dict begin\n") + fp.write("/buf %d string def\n" % (im.size[0] * operator[1])) + fp.write("%d %d scale\n" % im.size) + fp.write("%d %d 8\n" % im.size) # <= bits + fp.write("[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) + fp.write("{ currentfile buf readhexstring pop } bind\n") + fp.write(operator[2] + "\n") + if hasattr(fp, "flush"): + fp.flush() + + ImageFile._save(im, base_fp, [("eps", (0, 0)+im.size, 0, None)]) + + fp.write("\n%%%%EndBinary\n") + fp.write("grestore end\n") + if hasattr(fp, "flush"): + fp.flush() + +# +# -------------------------------------------------------------------- + +Image.register_open(EpsImageFile.format, EpsImageFile, _accept) + +Image.register_save(EpsImageFile.format, _save) + +Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) + +Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/ascii2img/src/PIL/ExifTags.py b/ascii2img/src/PIL/ExifTags.py new file mode 100644 index 0000000..a8ad26b --- /dev/null +++ b/ascii2img/src/PIL/ExifTags.py @@ -0,0 +1,315 @@ +# +# The Python Imaging Library. +# $Id$ +# +# EXIF tags +# +# Copyright (c) 2003 by Secret Labs AB +# +# See the README file for information on usage and redistribution. +# + +## +# This module provides constants and clear-text names for various +# well-known EXIF tags. +## + +## +# Maps EXIF tags to tag names. + +TAGS = { + + # possibly incomplete + 0x000b: "ProcessingSoftware", + 0x00fe: "NewSubfileType", + 0x00ff: "SubfileType", + 0x0100: "ImageWidth", + 0x0101: "ImageLength", + 0x0102: "BitsPerSample", + 0x0103: "Compression", + 0x0106: "PhotometricInterpretation", + 0x0107: "Thresholding", + 0x0108: "CellWidth", + 0x0109: "CellLength", + 0x010a: "FillOrder", + 0x010d: "DocumentName", + 0x010e: "ImageDescription", + 0x010f: "Make", + 0x0110: "Model", + 0x0111: "StripOffsets", + 0x0112: "Orientation", + 0x0115: "SamplesPerPixel", + 0x0116: "RowsPerStrip", + 0x0117: "StripByteCounts", + 0x0118: "MinSampleValue", + 0x0119: "MaxSampleValue", + 0x011a: "XResolution", + 0x011b: "YResolution", + 0x011c: "PlanarConfiguration", + 0x011d: "PageName", + 0x0120: "FreeOffsets", + 0x0121: "FreeByteCounts", + 0x0122: "GrayResponseUnit", + 0x0123: "GrayResponseCurve", + 0x0124: "T4Options", + 0x0125: "T6Options", + 0x0128: "ResolutionUnit", + 0x0129: "PageNumber", + 0x012d: "TransferFunction", + 0x0131: "Software", + 0x0132: "DateTime", + 0x013b: "Artist", + 0x013c: "HostComputer", + 0x013d: "Predictor", + 0x013e: "WhitePoint", + 0x013f: "PrimaryChromaticities", + 0x0140: "ColorMap", + 0x0141: "HalftoneHints", + 0x0142: "TileWidth", + 0x0143: "TileLength", + 0x0144: "TileOffsets", + 0x0145: "TileByteCounts", + 0x014a: "SubIFDs", + 0x014c: "InkSet", + 0x014d: "InkNames", + 0x014e: "NumberOfInks", + 0x0150: "DotRange", + 0x0151: "TargetPrinter", + 0x0152: "ExtraSamples", + 0x0153: "SampleFormat", + 0x0154: "SMinSampleValue", + 0x0155: "SMaxSampleValue", + 0x0156: "TransferRange", + 0x0157: "ClipPath", + 0x0158: "XClipPathUnits", + 0x0159: "YClipPathUnits", + 0x015a: "Indexed", + 0x015b: "JPEGTables", + 0x015f: "OPIProxy", + 0x0200: "JPEGProc", + 0x0201: "JpegIFOffset", + 0x0202: "JpegIFByteCount", + 0x0203: "JpegRestartInterval", + 0x0205: "JpegLosslessPredictors", + 0x0206: "JpegPointTransforms", + 0x0207: "JpegQTables", + 0x0208: "JpegDCTables", + 0x0209: "JpegACTables", + 0x0211: "YCbCrCoefficients", + 0x0212: "YCbCrSubSampling", + 0x0213: "YCbCrPositioning", + 0x0214: "ReferenceBlackWhite", + 0x02bc: "XMLPacket", + 0x1000: "RelatedImageFileFormat", + 0x1001: "RelatedImageWidth", + 0x1002: "RelatedImageLength", + 0x4746: "Rating", + 0x4749: "RatingPercent", + 0x800d: "ImageID", + 0x828d: "CFARepeatPatternDim", + 0x828e: "CFAPattern", + 0x828f: "BatteryLevel", + 0x8298: "Copyright", + 0x829a: "ExposureTime", + 0x829d: "FNumber", + 0x83bb: "IPTCNAA", + 0x8649: "ImageResources", + 0x8769: "ExifOffset", + 0x8773: "InterColorProfile", + 0x8822: "ExposureProgram", + 0x8824: "SpectralSensitivity", + 0x8825: "GPSInfo", + 0x8827: "ISOSpeedRatings", + 0x8828: "OECF", + 0x8829: "Interlace", + 0x882a: "TimeZoneOffset", + 0x882b: "SelfTimerMode", + 0x9000: "ExifVersion", + 0x9003: "DateTimeOriginal", + 0x9004: "DateTimeDigitized", + 0x9101: "ComponentsConfiguration", + 0x9102: "CompressedBitsPerPixel", + 0x9201: "ShutterSpeedValue", + 0x9202: "ApertureValue", + 0x9203: "BrightnessValue", + 0x9204: "ExposureBiasValue", + 0x9205: "MaxApertureValue", + 0x9206: "SubjectDistance", + 0x9207: "MeteringMode", + 0x9208: "LightSource", + 0x9209: "Flash", + 0x920a: "FocalLength", + 0x920b: "FlashEnergy", + 0x920c: "SpatialFrequencyResponse", + 0x920d: "Noise", + 0x9211: "ImageNumber", + 0x9212: "SecurityClassification", + 0x9213: "ImageHistory", + 0x9214: "SubjectLocation", + 0x9215: "ExposureIndex", + 0x9216: "TIFF/EPStandardID", + 0x927c: "MakerNote", + 0x9286: "UserComment", + 0x9290: "SubsecTime", + 0x9291: "SubsecTimeOriginal", + 0x9292: "SubsecTimeDigitized", + 0x9c9b: "XPTitle", + 0x9c9c: "XPComment", + 0x9c9d: "XPAuthor", + 0x9c9e: "XPKeywords", + 0x9c9f: "XPSubject", + 0xa000: "FlashPixVersion", + 0xa001: "ColorSpace", + 0xa002: "ExifImageWidth", + 0xa003: "ExifImageHeight", + 0xa004: "RelatedSoundFile", + 0xa005: "ExifInteroperabilityOffset", + 0xa20b: "FlashEnergy", + 0xa20c: "SpatialFrequencyResponse", + 0xa20e: "FocalPlaneXResolution", + 0xa20f: "FocalPlaneYResolution", + 0xa210: "FocalPlaneResolutionUnit", + 0xa214: "SubjectLocation", + 0xa215: "ExposureIndex", + 0xa217: "SensingMethod", + 0xa300: "FileSource", + 0xa301: "SceneType", + 0xa302: "CFAPattern", + 0xa401: "CustomRendered", + 0xa402: "ExposureMode", + 0xa403: "WhiteBalance", + 0xa404: "DigitalZoomRatio", + 0xa405: "FocalLengthIn35mmFilm", + 0xa406: "SceneCaptureType", + 0xa407: "GainControl", + 0xa408: "Contrast", + 0xa409: "Saturation", + 0xa40a: "Sharpness", + 0xa40b: "DeviceSettingDescription", + 0xa40c: "SubjectDistanceRange", + 0xa420: "ImageUniqueID", + 0xa430: "CameraOwnerName", + 0xa431: "BodySerialNumber", + 0xa432: "LensSpecification", + 0xa433: "LensMake", + 0xa434: "LensModel", + 0xa435: "LensSerialNumber", + 0xa500: "Gamma", + 0xc4a5: "PrintImageMatching", + 0xc612: "DNGVersion", + 0xc613: "DNGBackwardVersion", + 0xc614: "UniqueCameraModel", + 0xc615: "LocalizedCameraModel", + 0xc616: "CFAPlaneColor", + 0xc617: "CFALayout", + 0xc618: "LinearizationTable", + 0xc619: "BlackLevelRepeatDim", + 0xc61a: "BlackLevel", + 0xc61b: "BlackLevelDeltaH", + 0xc61c: "BlackLevelDeltaV", + 0xc61d: "WhiteLevel", + 0xc61e: "DefaultScale", + 0xc61f: "DefaultCropOrigin", + 0xc620: "DefaultCropSize", + 0xc621: "ColorMatrix1", + 0xc622: "ColorMatrix2", + 0xc623: "CameraCalibration1", + 0xc624: "CameraCalibration2", + 0xc625: "ReductionMatrix1", + 0xc626: "ReductionMatrix2", + 0xc627: "AnalogBalance", + 0xc628: "AsShotNeutral", + 0xc629: "AsShotWhiteXY", + 0xc62a: "BaselineExposure", + 0xc62b: "BaselineNoise", + 0xc62c: "BaselineSharpness", + 0xc62d: "BayerGreenSplit", + 0xc62e: "LinearResponseLimit", + 0xc62f: "CameraSerialNumber", + 0xc630: "LensInfo", + 0xc631: "ChromaBlurRadius", + 0xc632: "AntiAliasStrength", + 0xc633: "ShadowScale", + 0xc634: "DNGPrivateData", + 0xc635: "MakerNoteSafety", + 0xc65a: "CalibrationIlluminant1", + 0xc65b: "CalibrationIlluminant2", + 0xc65c: "BestQualityScale", + 0xc65d: "RawDataUniqueID", + 0xc68b: "OriginalRawFileName", + 0xc68c: "OriginalRawFileData", + 0xc68d: "ActiveArea", + 0xc68e: "MaskedAreas", + 0xc68f: "AsShotICCProfile", + 0xc690: "AsShotPreProfileMatrix", + 0xc691: "CurrentICCProfile", + 0xc692: "CurrentPreProfileMatrix", + 0xc6bf: "ColorimetricReference", + 0xc6f3: "CameraCalibrationSignature", + 0xc6f4: "ProfileCalibrationSignature", + 0xc6f6: "AsShotProfileName", + 0xc6f7: "NoiseReductionApplied", + 0xc6f8: "ProfileName", + 0xc6f9: "ProfileHueSatMapDims", + 0xc6fa: "ProfileHueSatMapData1", + 0xc6fb: "ProfileHueSatMapData2", + 0xc6fc: "ProfileToneCurve", + 0xc6fd: "ProfileEmbedPolicy", + 0xc6fe: "ProfileCopyright", + 0xc714: "ForwardMatrix1", + 0xc715: "ForwardMatrix2", + 0xc716: "PreviewApplicationName", + 0xc717: "PreviewApplicationVersion", + 0xc718: "PreviewSettingsName", + 0xc719: "PreviewSettingsDigest", + 0xc71a: "PreviewColorSpace", + 0xc71b: "PreviewDateTime", + 0xc71c: "RawImageDigest", + 0xc71d: "OriginalRawFileDigest", + 0xc71e: "SubTileBlockSize", + 0xc71f: "RowInterleaveFactor", + 0xc725: "ProfileLookTableDims", + 0xc726: "ProfileLookTableData", + 0xc740: "OpcodeList1", + 0xc741: "OpcodeList2", + 0xc74e: "OpcodeList3", + 0xc761: "NoiseProfile" +} + +## +# Maps EXIF GPS tags to tag names. + +GPSTAGS = { + 0: "GPSVersionID", + 1: "GPSLatitudeRef", + 2: "GPSLatitude", + 3: "GPSLongitudeRef", + 4: "GPSLongitude", + 5: "GPSAltitudeRef", + 6: "GPSAltitude", + 7: "GPSTimeStamp", + 8: "GPSSatellites", + 9: "GPSStatus", + 10: "GPSMeasureMode", + 11: "GPSDOP", + 12: "GPSSpeedRef", + 13: "GPSSpeed", + 14: "GPSTrackRef", + 15: "GPSTrack", + 16: "GPSImgDirectionRef", + 17: "GPSImgDirection", + 18: "GPSMapDatum", + 19: "GPSDestLatitudeRef", + 20: "GPSDestLatitude", + 21: "GPSDestLongitudeRef", + 22: "GPSDestLongitude", + 23: "GPSDestBearingRef", + 24: "GPSDestBearing", + 25: "GPSDestDistanceRef", + 26: "GPSDestDistance", + 27: "GPSProcessingMethod", + 28: "GPSAreaInformation", + 29: "GPSDateStamp", + 30: "GPSDifferential", + 31: "GPSHPositioningError", +} diff --git a/ascii2img/src/PIL/FitsStubImagePlugin.py b/ascii2img/src/PIL/FitsStubImagePlugin.py new file mode 100644 index 0000000..be926ca --- /dev/null +++ b/ascii2img/src/PIL/FitsStubImagePlugin.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library +# $Id$ +# +# FITS stub adapter +# +# Copyright (c) 1998-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific FITS image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[:6] == b"SIMPLE" + + +class FITSStubImageFile(ImageFile.StubImageFile): + + format = "FITS" + format_description = "FITS" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(6)): + raise SyntaxError("Not a FITS file") + + # FIXME: add more sanity checks here; mandatory header items + # include SIMPLE, BITPIX, NAXIS, etc. + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self.size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise IOError("FITS save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(FITSStubImageFile.format, FITSStubImageFile, _accept) +Image.register_save(FITSStubImageFile.format, _save) + +Image.register_extensions(FITSStubImageFile.format, [".fit", ".fits"]) diff --git a/ascii2img/src/PIL/FliImagePlugin.py b/ascii2img/src/PIL/FliImagePlugin.py new file mode 100644 index 0000000..2c190b6 --- /dev/null +++ b/ascii2img/src/PIL/FliImagePlugin.py @@ -0,0 +1,163 @@ +# +# The Python Imaging Library. +# $Id$ +# +# FLI/FLC file handling. +# +# History: +# 95-09-01 fl Created +# 97-01-03 fl Fixed parser, setup decoder tile +# 98-07-15 fl Renamed offset attribute to avoid name clash +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, i32le as i32, o8 + +__version__ = "0.2" + + +# +# decoder + +def _accept(prefix): + return len(prefix) >= 6 and i16(prefix[4:6]) in [0xAF11, 0xAF12] + + +## +# Image plugin for the FLI/FLC animation format. Use the seek +# method to load individual frames. + +class FliImageFile(ImageFile.ImageFile): + + format = "FLI" + format_description = "Autodesk FLI/FLC Animation" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # HEAD + s = self.fp.read(128) + magic = i16(s[4:6]) + if not (magic in [0xAF11, 0xAF12] and + i16(s[14:16]) in [0, 3] and # flags + s[20:22] == b"\x00\x00"): # reserved + raise SyntaxError("not an FLI/FLC file") + + # frames + self.__framecount = i16(s[6:8]) + + # image characteristics + self.mode = "P" + self.size = i16(s[8:10]), i16(s[10:12]) + + # animation speed + duration = i32(s[16:20]) + if magic == 0xAF11: + duration = (duration * 1000) // 70 + self.info["duration"] = duration + + # look for palette + palette = [(a, a, a) for a in range(256)] + + s = self.fp.read(16) + + self.__offset = 128 + + if i16(s[4:6]) == 0xF100: + # prefix chunk; ignore it + self.__offset = self.__offset + i32(s) + s = self.fp.read(16) + + if i16(s[4:6]) == 0xF1FA: + # look for palette chunk + s = self.fp.read(6) + if i16(s[4:6]) == 11: + self._palette(palette, 2) + elif i16(s[4:6]) == 4: + self._palette(palette, 0) + + palette = [o8(r)+o8(g)+o8(b) for (r, g, b) in palette] + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + # set things up to decode first frame + self.__frame = -1 + self.__fp = self.fp + self.__rewind = self.fp.tell() + self.seek(0) + + def _palette(self, palette, shift): + # load palette + + i = 0 + for e in range(i16(self.fp.read(2))): + s = self.fp.read(2) + i = i + i8(s[0]) + n = i8(s[1]) + if n == 0: + n = 256 + s = self.fp.read(n * 3) + for n in range(0, len(s), 3): + r = i8(s[n]) << shift + g = i8(s[n+1]) << shift + b = i8(s[n+2]) << shift + palette[i] = (r, g, b) + i += 1 + + @property + def n_frames(self): + return self.__framecount + + @property + def is_animated(self): + return self.__framecount > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0) + + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + + def _seek(self, frame): + if frame == 0: + self.__frame = -1 + self.__fp.seek(self.__rewind) + self.__offset = 128 + + if frame != self.__frame + 1: + raise ValueError("cannot seek to frame %d" % frame) + self.__frame = frame + + # move to next frame + self.fp = self.__fp + self.fp.seek(self.__offset) + + s = self.fp.read(4) + if not s: + raise EOFError + + framesize = i32(s) + + self.decodermaxblock = framesize + self.tile = [("fli", (0, 0)+self.size, self.__offset, None)] + + self.__offset += framesize + + def tell(self): + return self.__frame + + +# +# registry + +Image.register_open(FliImageFile.format, FliImageFile, _accept) + +Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/ascii2img/src/PIL/FontFile.py b/ascii2img/src/PIL/FontFile.py new file mode 100644 index 0000000..46e49bc --- /dev/null +++ b/ascii2img/src/PIL/FontFile.py @@ -0,0 +1,114 @@ +# +# The Python Imaging Library +# $Id$ +# +# base class for raster font file parsers +# +# history: +# 1997-06-05 fl created +# 1997-08-19 fl restrict image width +# +# Copyright (c) 1997-1998 by Secret Labs AB +# Copyright (c) 1997-1998 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +import os +from . import Image, _binary + +WIDTH = 800 + + +def puti16(fp, values): + # write network order (big-endian) 16-bit sequence + for v in values: + if v < 0: + v += 65536 + fp.write(_binary.o16be(v)) + + +## +# Base class for raster font file handlers. + +class FontFile(object): + + bitmap = None + + def __init__(self): + + self.info = {} + self.glyph = [None] * 256 + + def __getitem__(self, ix): + return self.glyph[ix] + + def compile(self): + "Create metrics and bitmap" + + if self.bitmap: + return + + # create bitmap large enough to hold all data + h = w = maxwidth = 0 + lines = 1 + for glyph in self: + if glyph: + d, dst, src, im = glyph + h = max(h, src[3] - src[1]) + w = w + (src[2] - src[0]) + if w > WIDTH: + lines += 1 + w = (src[2] - src[0]) + maxwidth = max(maxwidth, w) + + xsize = maxwidth + ysize = lines * h + + if xsize == 0 and ysize == 0: + return "" + + self.ysize = h + + # paste glyphs into bitmap + self.bitmap = Image.new("1", (xsize, ysize)) + self.metrics = [None] * 256 + x = y = 0 + for i in range(256): + glyph = self[i] + if glyph: + d, dst, src, im = glyph + xx = src[2] - src[0] + # yy = src[3] - src[1] + x0, y0 = x, y + x = x + xx + if x > WIDTH: + x, y = 0, y + h + x0, y0 = x, y + x = xx + s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 + self.bitmap.paste(im.crop(src), s) + # print(chr(i), dst, s) + self.metrics[i] = d, dst, s + + def save(self, filename): + "Save font" + + self.compile() + + # font data + self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") + + # font metrics + with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: + fp.write(b"PILfont\n") + fp.write((";;;;;;%d;\n" % self.ysize).encode('ascii')) # HACK!!! + fp.write(b"DATA\n") + for id in range(256): + m = self.metrics[id] + if not m: + puti16(fp, [0] * 10) + else: + puti16(fp, m[0] + m[1] + m[2]) diff --git a/ascii2img/src/PIL/FpxImagePlugin.py b/ascii2img/src/PIL/FpxImagePlugin.py new file mode 100644 index 0000000..23f15f4 --- /dev/null +++ b/ascii2img/src/PIL/FpxImagePlugin.py @@ -0,0 +1,228 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library. +# $Id$ +# +# FlashPix support for PIL +# +# History: +# 97-01-25 fl Created (reads uncompressed RGB images only) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from . import Image, ImageFile +from ._binary import i32le as i32, i8 + +import olefile + +__version__ = "0.1" + +# we map from colour field tuples to (mode, rawmode) descriptors +MODES = { + # opacity + (0x00007ffe): ("A", "L"), + # monochrome + (0x00010000,): ("L", "L"), + (0x00018000, 0x00017ffe): ("RGBA", "LA"), + # photo YCC + (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), + (0x00028000, 0x00028001, 0x00028002, 0x00027ffe): ("RGBA", "YCCA;P"), + # standard RGB (NIFRGB) + (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), + (0x00038000, 0x00038001, 0x00038002, 0x00037ffe): ("RGBA", "RGBA"), +} + + +# +# -------------------------------------------------------------------- + +def _accept(prefix): + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for the FlashPix images. + +class FpxImageFile(ImageFile.ImageFile): + + format = "FPX" + format_description = "FlashPix" + + def _open(self): + # + # read the OLE directory and see if this is a likely + # to be a FlashPix file + + try: + self.ole = olefile.OleFileIO(self.fp) + except IOError: + raise SyntaxError("not an FPX file; invalid OLE file") + + if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": + raise SyntaxError("not an FPX file; bad root CLSID") + + self._open_index(1) + + def _open_index(self, index=1): + # + # get the Image Contents Property Set + + prop = self.ole.getproperties([ + "Data Object Store %06d" % index, + "\005Image Contents" + ]) + + # size (highest resolution) + + self.size = prop[0x1000002], prop[0x1000003] + + size = max(self.size) + i = 1 + while size > 64: + size = size / 2 + i += 1 + self.maxid = i - 1 + + # mode. instead of using a single field for this, flashpix + # requires you to specify the mode for each channel in each + # resolution subimage, and leaves it to the decoder to make + # sure that they all match. for now, we'll cheat and assume + # that this is always the case. + + id = self.maxid << 16 + + s = prop[0x2000002 | id] + + colors = [] + for i in range(i32(s, 4)): + # note: for now, we ignore the "uncalibrated" flag + colors.append(i32(s, 8+i*4) & 0x7fffffff) + + self.mode, self.rawmode = MODES[tuple(colors)] + + # load JPEG tables, if any + self.jpeg = {} + for i in range(256): + id = 0x3000001 | (i << 16) + if id in prop: + self.jpeg[i] = prop[id] + + # print(len(self.jpeg), "tables loaded") + + self._open_subimage(1, self.maxid) + + def _open_subimage(self, index=1, subimage=0): + # + # setup tile descriptors for a given subimage + + stream = [ + "Data Object Store %06d" % index, + "Resolution %04d" % subimage, + "Subimage 0000 Header" + ] + + fp = self.ole.openstream(stream) + + # skip prefix + fp.read(28) + + # header stream + s = fp.read(36) + + size = i32(s, 4), i32(s, 8) + # tilecount = i32(s, 12) + tilesize = i32(s, 16), i32(s, 20) + # channels = i32(s, 24) + offset = i32(s, 28) + length = i32(s, 32) + + # print(size, self.mode, self.rawmode) + + if size != self.size: + raise IOError("subimage mismatch") + + # get tile descriptors + fp.seek(28 + offset) + s = fp.read(i32(s, 12) * length) + + x = y = 0 + xsize, ysize = size + xtile, ytile = tilesize + self.tile = [] + + for i in range(0, len(s), length): + + compression = i32(s, i+8) + + if compression == 0: + self.tile.append(("raw", (x, y, x+xtile, y+ytile), + i32(s, i) + 28, (self.rawmode))) + + elif compression == 1: + + # FIXME: the fill decoder is not implemented + self.tile.append(("fill", (x, y, x+xtile, y+ytile), + i32(s, i) + 28, (self.rawmode, s[12:16]))) + + elif compression == 2: + + internal_color_conversion = i8(s[14]) + jpeg_tables = i8(s[15]) + rawmode = self.rawmode + + if internal_color_conversion: + # The image is stored as usual (usually YCbCr). + if rawmode == "RGBA": + # For "RGBA", data is stored as YCbCrA based on + # negative RGB. The following trick works around + # this problem : + jpegmode, rawmode = "YCbCrK", "CMYK" + else: + jpegmode = None # let the decoder decide + + else: + # The image is stored as defined by rawmode + jpegmode = rawmode + + self.tile.append(("jpeg", (x, y, x+xtile, y+ytile), + i32(s, i) + 28, (rawmode, jpegmode))) + + # FIXME: jpeg tables are tile dependent; the prefix + # data must be placed in the tile descriptor itself! + + if jpeg_tables: + self.tile_prefix = self.jpeg[jpeg_tables] + + else: + raise IOError("unknown/invalid compression") + + x = x + xtile + if x >= xsize: + x, y = 0, y + ytile + if y >= ysize: + break # isn't really required + + self.stream = stream + self.fp = None + + def load(self): + + if not self.fp: + self.fp = self.ole.openstream(self.stream[:2] + + ["Subimage 0000 Data"]) + + return ImageFile.ImageFile.load(self) + +# +# -------------------------------------------------------------------- + +Image.register_open(FpxImageFile.format, FpxImageFile, _accept) + +Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/ascii2img/src/PIL/FtexImagePlugin.py b/ascii2img/src/PIL/FtexImagePlugin.py new file mode 100644 index 0000000..9b98090 --- /dev/null +++ b/ascii2img/src/PIL/FtexImagePlugin.py @@ -0,0 +1,94 @@ +""" +A Pillow loader for .ftc and .ftu files (FTEX) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 + +The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a +packed custom format called FTEX. This file format uses file extensions FTC and FTU. +* FTC files are compressed textures (using standard texture compression). +* FTU files are not compressed. +Texture File Format +The FTC and FTU texture files both use the same format. This +has the following structure: +{header} +{format_directory} +{data} +Where: +{header} = { u32:magic, u32:version, u32:width, u32:height, u32:mipmap_count, u32:format_count } + +* The "magic" number is "FTEX". +* "width" and "height" are the dimensions of the texture. +* "mipmap_count" is the number of mipmaps in the texture. +* "format_count" is the number of texture formats (different versions of the same texture) in this file. + +{format_directory} = format_count * { u32:format, u32:where } + +The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB uncompressed textures. +The texture data for a format starts at the position "where" in the file. + +Each set of texture data in the file has the following structure: +{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } +* "mipmap_size" is the number of bytes in that mip level. For compressed textures this is the +size of the texture data compressed with DXT1. For 24 bit uncompressed textures, this is 3 * width * height. +Following this are the image bytes for that mipmap level. + +Note: All data is stored in little-Endian (Intel) byte order. +""" + +import struct +from io import BytesIO +from . import Image, ImageFile + + +MAGIC = b"FTEX" +FORMAT_DXT1 = 0 +FORMAT_UNCOMPRESSED = 1 + + +class FtexImageFile(ImageFile.ImageFile): + format = "FTEX" + format_description = "Texture File Format (IW2:EOC)" + + def _open(self): + magic = struct.unpack("= 8 and i32(prefix[:4]) >= 20 and i32(prefix[4:8]) in (1, 2) + + +## +# Image plugin for the GIMP brush format. + +class GbrImageFile(ImageFile.ImageFile): + + format = "GBR" + format_description = "GIMP brush file" + + def _open(self): + header_size = i32(self.fp.read(4)) + version = i32(self.fp.read(4)) + if header_size < 20: + raise SyntaxError("not a GIMP brush") + if version not in (1, 2): + raise SyntaxError("Unsupported GIMP brush version: %s" % version) + + width = i32(self.fp.read(4)) + height = i32(self.fp.read(4)) + color_depth = i32(self.fp.read(4)) + if width <= 0 or height <= 0: + raise SyntaxError("not a GIMP brush") + if color_depth not in (1, 4): + raise SyntaxError("Unsupported GIMP brush color depth: %s" % color_depth) + + if version == 1: + comment_length = header_size-20 + else: + comment_length = header_size-28 + magic_number = self.fp.read(4) + if magic_number != b'GIMP': + raise SyntaxError("not a GIMP brush, bad magic number") + self.info['spacing'] = i32(self.fp.read(4)) + + comment = self.fp.read(comment_length)[:-1] + + if color_depth == 1: + self.mode = "L" + else: + self.mode = 'RGBA' + + self.size = width, height + + self.info["comment"] = comment + + # Image might not be small + Image._decompression_bomb_check(self.size) + + # Data is an uncompressed block of w * h * bytes/pixel + self._data_size = width * height * color_depth + + def load(self): + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self._data_size)) + +# +# registry + +Image.register_open(GbrImageFile.format, GbrImageFile, _accept) +Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/ascii2img/src/PIL/GdImageFile.py b/ascii2img/src/PIL/GdImageFile.py new file mode 100644 index 0000000..09ab5ec --- /dev/null +++ b/ascii2img/src/PIL/GdImageFile.py @@ -0,0 +1,90 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GD file handling +# +# History: +# 1996-04-12 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +# NOTE: This format cannot be automatically recognized, so the +# class is not registered for use with Image.open(). To open a +# gd file, use the GdImageFile.open() function instead. + +# THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This +# implementation is provided for convenience and demonstrational +# purposes only. + + +from . import ImageFile, ImagePalette +from ._binary import i16be as i16 +from ._util import isPath + +__version__ = "0.1" + +try: + import builtins +except ImportError: + import __builtin__ + builtins = __builtin__ + + +## +# Image plugin for the GD uncompressed format. Note that this format +# is not supported by the standard Image.open function. To use +# this plugin, you have to import the GdImageFile module and +# use the GdImageFile.open function. + +class GdImageFile(ImageFile.ImageFile): + + format = "GD" + format_description = "GD uncompressed images" + + def _open(self): + + # Header + s = self.fp.read(775) + + self.mode = "L" # FIXME: "P" + self.size = i16(s[0:2]), i16(s[2:4]) + + # transparency index + tindex = i16(s[5:7]) + if tindex < 256: + self.info["transparent"] = tindex + + self.palette = ImagePalette.raw("RGB", s[7:]) + + self.tile = [("raw", (0, 0)+self.size, 775, ("L", 0, -1))] + + +def open(fp, mode="r"): + """ + Load texture from a GD image file. + + :param filename: GD file name, or an opened file handle. + :param mode: Optional mode. In this version, if the mode argument + is given, it must be "r". + :returns: An image instance. + :raises IOError: If the image could not be read. + """ + if mode != "r": + raise ValueError("bad mode") + + if isPath(fp): + filename = fp + fp = builtins.open(fp, "rb") + else: + filename = "" + + try: + return GdImageFile(fp, filename) + except SyntaxError: + raise IOError("cannot identify this image file") diff --git a/ascii2img/src/PIL/GifImagePlugin.py b/ascii2img/src/PIL/GifImagePlugin.py new file mode 100644 index 0000000..64764f9 --- /dev/null +++ b/ascii2img/src/PIL/GifImagePlugin.py @@ -0,0 +1,805 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GIF file handling +# +# History: +# 1995-09-01 fl Created +# 1996-12-14 fl Added interlace support +# 1996-12-30 fl Added animation support +# 1997-01-05 fl Added write support, fixed local colour map bug +# 1997-02-23 fl Make sure to load raster data in getdata() +# 1997-07-05 fl Support external decoder (0.4) +# 1998-07-09 fl Handle all modes when saving (0.5) +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) +# 2001-04-17 fl Added palette optimization (0.7) +# 2002-06-06 fl Added transparency support for save (0.8) +# 2004-02-24 fl Disable interlacing for small images +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile, ImagePalette, ImageChops, ImageSequence +from ._binary import i8, i16le as i16, o8, o16le as o16 + +import itertools + +__version__ = "0.9" + + +# -------------------------------------------------------------------- +# Identify/read GIF files + +def _accept(prefix): + return prefix[:6] in [b"GIF87a", b"GIF89a"] + + +## +# Image plugin for GIF images. This plugin supports both GIF87 and +# GIF89 images. + +class GifImageFile(ImageFile.ImageFile): + + format = "GIF" + format_description = "Compuserve GIF" + _close_exclusive_fp_after_loading = False + + global_palette = None + + def data(self): + s = self.fp.read(1) + if s and i8(s): + return self.fp.read(i8(s)) + return None + + def _open(self): + + # Screen + s = self.fp.read(13) + if s[:6] not in [b"GIF87a", b"GIF89a"]: + raise SyntaxError("not a GIF file") + + self.info["version"] = s[:6] + self.size = i16(s[6:]), i16(s[8:]) + self.tile = [] + flags = i8(s[10]) + bits = (flags & 7) + 1 + + if flags & 128: + # get global palette + self.info["background"] = i8(s[11]) + # check if palette contains colour indices + p = self.fp.read(3 << bits) + for i in range(0, len(p), 3): + if not (i//3 == i8(p[i]) == i8(p[i+1]) == i8(p[i+2])): + p = ImagePalette.raw("RGB", p) + self.global_palette = self.palette = p + break + + self.__fp = self.fp # FIXME: hack + self.__rewind = self.fp.tell() + self._n_frames = None + self._is_animated = None + self._seek(0) # get ready to read first frame + + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + try: + while True: + self.seek(self.tell() + 1) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + @property + def is_animated(self): + if self._is_animated is None: + if self._n_frames is not None: + self._is_animated = self._n_frames != 1 + else: + current = self.tell() + + try: + self.seek(1) + self._is_animated = True + except EOFError: + self._is_animated = False + + self.seek(current) + return self._is_animated + + def seek(self, frame): + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0) + + last_frame = self.__frame + for f in range(self.__frame + 1, frame + 1): + try: + self._seek(f) + except EOFError: + self.seek(last_frame) + raise EOFError("no more images in GIF file") + + def _seek(self, frame): + + if frame == 0: + # rewind + self.__offset = 0 + self.dispose = None + self.dispose_extent = [0, 0, 0, 0] # x0, y0, x1, y1 + self.__frame = -1 + self.__fp.seek(self.__rewind) + self._prev_im = None + self.disposal_method = 0 + else: + # ensure that the previous frame was loaded + if not self.im: + self.load() + + if frame != self.__frame + 1: + raise ValueError("cannot seek to frame %d" % frame) + self.__frame = frame + + self.tile = [] + + self.fp = self.__fp + if self.__offset: + # backup to last frame + self.fp.seek(self.__offset) + while self.data(): + pass + self.__offset = 0 + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + + from copy import copy + self.palette = copy(self.global_palette) + + while True: + + s = self.fp.read(1) + if not s or s == b";": + break + + elif s == b"!": + # + # extensions + # + s = self.fp.read(1) + block = self.data() + if i8(s) == 249: + # + # graphic control extension + # + flags = i8(block[0]) + if flags & 1: + self.info["transparency"] = i8(block[3]) + self.info["duration"] = i16(block[1:3]) * 10 + + # disposal method - find the value of bits 4 - 6 + dispose_bits = 0b00011100 & flags + dispose_bits = dispose_bits >> 2 + if dispose_bits: + # only set the dispose if it is not + # unspecified. I'm not sure if this is + # correct, but it seems to prevent the last + # frame from looking odd for some animations + self.disposal_method = dispose_bits + elif i8(s) == 254: + # + # comment extension + # + self.info["comment"] = block + elif i8(s) == 255: + # + # application extension + # + self.info["extension"] = block, self.fp.tell() + if block[:11] == b"NETSCAPE2.0": + block = self.data() + if len(block) >= 3 and i8(block[0]) == 1: + self.info["loop"] = i16(block[1:3]) + while self.data(): + pass + + elif s == b",": + # + # local image + # + s = self.fp.read(9) + + # extent + x0, y0 = i16(s[0:]), i16(s[2:]) + x1, y1 = x0 + i16(s[4:]), y0 + i16(s[6:]) + self.dispose_extent = x0, y0, x1, y1 + flags = i8(s[8]) + + interlace = (flags & 64) != 0 + + if flags & 128: + bits = (flags & 7) + 1 + self.palette =\ + ImagePalette.raw("RGB", self.fp.read(3 << bits)) + + # image data + bits = i8(self.fp.read(1)) + self.__offset = self.fp.tell() + self.tile = [("gif", + (x0, y0, x1, y1), + self.__offset, + (bits, interlace))] + break + + else: + pass + # raise IOError, "illegal GIF tag `%x`" % i8(s) + + try: + if self.disposal_method < 2: + # do not dispose or none specified + self.dispose = None + elif self.disposal_method == 2: + # replace with background colour + self.dispose = Image.core.fill("P", self.size, + self.info["background"]) + else: + # replace with previous contents + if self.im: + self.dispose = self.im.copy() + + # only dispose the extent in this frame + if self.dispose: + self.dispose = self._crop(self.dispose, self.dispose_extent) + except (AttributeError, KeyError): + pass + + if not self.tile: + # self.__fp = None + raise EOFError + + self.mode = "L" + if self.palette: + self.mode = "P" + + def tell(self): + return self.__frame + + def load_end(self): + ImageFile.ImageFile.load_end(self) + + # if the disposal method is 'do not dispose', transparent + # pixels should show the content of the previous frame + if self._prev_im and self.disposal_method == 1: + # we do this by pasting the updated area onto the previous + # frame which we then use as the current image content + updated = self._crop(self.im, self.dispose_extent) + self._prev_im.paste(updated, self.dispose_extent, + updated.convert('RGBA')) + self.im = self._prev_im + self._prev_im = self.im.copy() + +# -------------------------------------------------------------------- +# Write GIF files + +RAWMODE = { + "1": "L", + "L": "L", + "P": "P" +} + + +def _normalize_mode(im, initial_call=False): + """ + Takes an image (or frame), returns an image in a mode that is appropriate + for saving in a Gif. + + It may return the original image, or it may return an image converted to + palette or 'L' mode. + + UNDONE: What is the point of mucking with the initial call palette, for + an image that shouldn't have a palette, or it would be a mode 'P' and + get returned in the RAWMODE clause. + + :param im: Image object + :param initial_call: Default false, set to true for a single frame. + :returns: Image object + """ + if im.mode in RAWMODE: + im.load() + return im + if Image.getmodebase(im.mode) == "RGB": + if initial_call: + palette_size = 256 + if im.palette: + palette_size = len(im.palette.getdata()[1]) // 3 + return im.convert("P", palette=Image.ADAPTIVE, colors=palette_size) + else: + return im.convert("P") + return im.convert("L") + + +def _normalize_palette(im, palette, info): + """ + Normalizes the palette for image. + - Sets the palette to the incoming palette, if provided. + - Ensures that there's a palette for L mode images + - Optimizes the palette if necessary/desired. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: Image object + """ + source_palette = None + if palette: + # a bytes palette + if isinstance(palette, (bytes, bytearray, list)): + source_palette = bytearray(palette[:768]) + if isinstance(palette, ImagePalette.ImagePalette): + source_palette = bytearray(itertools.chain.from_iterable( + zip(palette.palette[:256], + palette.palette[256:512], + palette.palette[512:768]))) + + if im.mode == "P": + if not source_palette: + source_palette = im.im.getpalette("RGB")[:768] + else: # L-mode + if not source_palette: + source_palette = bytearray(i//3 for i in range(768)) + im.palette = ImagePalette.ImagePalette("RGB", + palette=source_palette) + + used_palette_colors = _get_optimize(im, info) + if used_palette_colors is not None: + return im.remap_palette(used_palette_colors, source_palette) + + im.palette.palette = source_palette + return im + + +def _write_single_frame(im, fp, palette): + im_out = _normalize_mode(im, True) + im_out = _normalize_palette(im_out, palette, im.encoderinfo) + + for s in _get_global_header(im_out, im.encoderinfo): + fp.write(s) + + # local image header + flags = 0 + if get_interlace(im): + flags = flags | 64 + _write_local_header(fp, im, (0, 0), flags) + + im_out.encoderconfig = (8, get_interlace(im)) + ImageFile._save(im_out, fp, [("gif", (0, 0)+im.size, 0, + RAWMODE[im_out.mode])]) + + fp.write(b"\0") # end of image data + + +def _write_multiple_frames(im, fp, palette): + + duration = im.encoderinfo.get("duration", None) + + im_frames = [] + frame_count = 0 + for imSequence in [im]+im.encoderinfo.get("append_images", []): + for im_frame in ImageSequence.Iterator(imSequence): + # a copy is required here since seek can still mutate the image + im_frame = _normalize_mode(im_frame.copy()) + im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) + + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo['duration'] = duration[frame_count] + frame_count += 1 + + if im_frames: + # delta frame + previous = im_frames[-1] + if _get_palette_bytes(im_frame) == _get_palette_bytes(previous['im']): + delta = ImageChops.subtract_modulo(im_frame, + previous['im']) + else: + delta = ImageChops.subtract_modulo(im_frame.convert('RGB'), + previous['im'].convert('RGB')) + bbox = delta.getbbox() + if not bbox: + # This frame is identical to the previous frame + if duration: + previous['encoderinfo']['duration'] += encoderinfo['duration'] + continue + else: + bbox = None + im_frames.append({ + 'im': im_frame, + 'bbox': bbox, + 'encoderinfo': encoderinfo + }) + + if len(im_frames) > 1: + for frame_data in im_frames: + im_frame = frame_data['im'] + if not frame_data['bbox']: + # global header + for s in _get_global_header(im_frame, + frame_data['encoderinfo']): + fp.write(s) + offset = (0, 0) + else: + # compress difference + frame_data['encoderinfo']['include_color_table'] = True + + im_frame = im_frame.crop(frame_data['bbox']) + offset = frame_data['bbox'][:2] + _write_frame_data(fp, im_frame, offset, frame_data['encoderinfo']) + return True + + +def _save_all(im, fp, filename): + _save(im, fp, filename, save_all=True) + + +def _save(im, fp, filename, save_all=False): + im.encoderinfo.update(im.info) + # header + try: + palette = im.encoderinfo["palette"] + except KeyError: + palette = None + im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) + + if not save_all or not _write_multiple_frames(im, fp, palette): + _write_single_frame(im, fp, palette) + + fp.write(b";") # end of file + + if hasattr(fp, "flush"): + fp.flush() + + +def get_interlace(im): + interlace = im.encoderinfo.get("interlace", 1) + + # workaround for @PIL153 + if min(im.size) < 16: + interlace = 0 + + return interlace + + +def _write_local_header(fp, im, offset, flags): + transparent_color_exists = False + try: + transparency = im.encoderinfo["transparency"] + except KeyError: + pass + else: + transparency = int(transparency) + # optimize the block away if transparent color is not used + transparent_color_exists = True + + used_palette_colors = _get_optimize(im, im.encoderinfo) + if used_palette_colors is not None: + # adjust the transparency index after optimize + try: + transparency = used_palette_colors.index(transparency) + except ValueError: + transparent_color_exists = False + + if "duration" in im.encoderinfo: + duration = int(im.encoderinfo["duration"] / 10) + else: + duration = 0 + if transparent_color_exists or duration != 0: + transparency_flag = 1 if transparent_color_exists else 0 + if not transparent_color_exists: + transparency = 0 + + fp.write(b"!" + + o8(249) + # extension intro + o8(4) + # length + o8(transparency_flag) + # packed fields + o16(duration) + # duration + o8(transparency) + # transparency index + o8(0)) + + if "comment" in im.encoderinfo and 1 <= len(im.encoderinfo["comment"]) <= 255: + fp.write(b"!" + + o8(254) + # extension intro + o8(len(im.encoderinfo["comment"])) + + im.encoderinfo["comment"] + + o8(0)) + if "loop" in im.encoderinfo: + number_of_loops = im.encoderinfo["loop"] + fp.write(b"!" + + o8(255) + # extension intro + o8(11) + + b"NETSCAPE2.0" + + o8(3) + + o8(1) + + o16(number_of_loops) + # number of loops + o8(0)) + include_color_table = im.encoderinfo.get('include_color_table') + if include_color_table: + palette = im.encoderinfo.get("palette", None) + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + if color_table_size: + flags = flags | 128 # local color table flag + flags = flags | color_table_size + + fp.write(b"," + + o16(offset[0]) + # offset + o16(offset[1]) + + o16(im.size[0]) + # size + o16(im.size[1]) + + o8(flags)) # flags + if include_color_table and color_table_size: + fp.write(_get_header_palette(palette_bytes)) + fp.write(o8(8)) # bits + + +def _save_netpbm(im, fp, filename): + + # Unused by default. + # To use, uncomment the register_save call at the end of the file. + # + # If you need real GIF compression and/or RGB quantization, you + # can use the external NETPBM/PBMPLUS utilities. See comments + # below for information on how to enable this. + + import os + from subprocess import Popen, check_call, PIPE, CalledProcessError + file = im._dump() + + with open(filename, 'wb') as f: + if im.mode != "RGB": + with open(os.devnull, 'wb') as devnull: + check_call(["ppmtogif", file], stdout=f, stderr=devnull) + else: + # Pipe ppmquant output into ppmtogif + # "ppmquant 256 %s | ppmtogif > %s" % (file, filename) + quant_cmd = ["ppmquant", "256", file] + togif_cmd = ["ppmtogif"] + with open(os.devnull, 'wb') as devnull: + quant_proc = Popen(quant_cmd, stdout=PIPE, stderr=devnull) + togif_proc = Popen(togif_cmd, stdin=quant_proc.stdout, + stdout=f, stderr=devnull) + + # Allow ppmquant to receive SIGPIPE if ppmtogif exits + quant_proc.stdout.close() + + retcode = quant_proc.wait() + if retcode: + raise CalledProcessError(retcode, quant_cmd) + + retcode = togif_proc.wait() + if retcode: + raise CalledProcessError(retcode, togif_cmd) + + try: + os.unlink(file) + except OSError: + pass + + +# Force optimization so that we can test performance against +# cases where it took lots of memory and time previously. +_FORCE_OPTIMIZE = False + + +def _get_optimize(im, info): + """ + Palette optimization is a potentially expensive operation. + + This function determines if the palette should be optimized using + some heuristics, then returns the list of palette entries in use. + + :param im: Image object + :param info: encoderinfo + :returns: list of indexes of palette entries in use, or None + """ + if im.mode in ("P", "L") and info and info.get("optimize", 0): + # Potentially expensive operation. + + # The palette saves 3 bytes per color not used, but palette + # lengths are restricted to 3*(2**N) bytes. Max saving would + # be 768 -> 6 bytes if we went all the way down to 2 colors. + # * If we're over 128 colors, we can't save any space. + # * If there aren't any holes, it's not worth collapsing. + # * If we have a 'large' image, the palette is in the noise. + + # create the new palette if not every color is used + optimise = _FORCE_OPTIMIZE or im.mode == 'L' + if optimise or im.width * im.height < 512 * 512: + # check which colors are used + used_palette_colors = [] + for i, count in enumerate(im.histogram()): + if count: + used_palette_colors.append(i) + + if optimise or (len(used_palette_colors) <= 128 and + max(used_palette_colors) > len(used_palette_colors)): + return used_palette_colors + + +def _get_color_table_size(palette_bytes): + # calculate the palette size for the header + import math + color_table_size = int(math.ceil(math.log(len(palette_bytes)//3, 2)))-1 + if color_table_size < 0: + color_table_size = 0 + return color_table_size + + +def _get_header_palette(palette_bytes): + """ + Returns the palette, null padded to the next power of 2 (*3) bytes + suitable for direct inclusion in the GIF header + + :param palette_bytes: Unpadded palette bytes, in RGBRGB form + :returns: Null padded palette + """ + color_table_size = _get_color_table_size(palette_bytes) + + # add the missing amount of bytes + # the palette has to be 2< 0: + palette_bytes += o8(0) * 3 * actual_target_size_diff + return palette_bytes + + +def _get_palette_bytes(im): + """ + Gets the palette for inclusion in the gif header + + :param im: Image object + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ + return im.palette.palette + + +def _get_global_header(im, info): + """Return a list of strings representing a GIF header""" + + # Header Block + # http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp + + version = b"87a" + for extensionKey in ["transparency", "duration", "loop", "comment"]: + if info and extensionKey in info: + if ((extensionKey == "duration" and info[extensionKey] == 0) or + (extensionKey == "comment" and not (1 <= len(info[extensionKey]) <= 255))): + continue + version = b"89a" + break + else: + if im.info.get("version") == b"89a": + version = b"89a" + + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + + background = info["background"] if "background" in info else 0 + + return [ + b"GIF"+version + # signature + version + o16(im.size[0]) + # canvas width + o16(im.size[1]), # canvas height + + # Logical Screen Descriptor + # size of global color table + global color table flag + o8(color_table_size + 128), # packed fields + # background + reserved/aspect + o8(background) + o8(0), + + # Global Color Table + _get_header_palette(palette_bytes) + ] + + +def _write_frame_data(fp, im_frame, offset, params): + try: + im_frame.encoderinfo = params + + # local image header + _write_local_header(fp, im_frame, offset, 0) + + ImageFile._save(im_frame, fp, [("gif", (0, 0)+im_frame.size, 0, + RAWMODE[im_frame.mode])]) + + fp.write(b"\0") # end of image data + finally: + del im_frame.encoderinfo + +# -------------------------------------------------------------------- +# Legacy GIF utilities + + +def getheader(im, palette=None, info=None): + """ + Legacy Method to get Gif data from image. + + Warning:: May modify image data. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: tuple of(list of header items, optimized palette) + + """ + used_palette_colors = _get_optimize(im, info) + + if info is None: + info = {} + + if "background" not in info and "background" in im.info: + info["background"] = im.info["background"] + + im_mod = _normalize_palette(im, palette, info) + im.palette = im_mod.palette + im.im = im_mod.im + header = _get_global_header(im, info) + + return header, used_palette_colors + + +# To specify duration, add the time in milliseconds to getdata(), +# e.g. getdata(im_frame, duration=1000) +def getdata(im, offset=(0, 0), **params): + """ + Legacy Method + + Return a list of strings representing this image. + The first string is a local image header, the rest contains + encoded image data. + + :param im: Image object + :param offset: Tuple of (x, y) pixels. Defaults to (0,0) + :param \**params: E.g. duration or other encoder info parameters + :returns: List of Bytes containing gif encoded frame data + + """ + class Collector(object): + data = [] + + def write(self, data): + self.data.append(data) + + im.load() # make sure raster data is available + + fp = Collector() + + _write_frame_data(fp, im, offset, params) + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GifImageFile.format, GifImageFile, _accept) +Image.register_save(GifImageFile.format, _save) +Image.register_save_all(GifImageFile.format, _save_all) +Image.register_extension(GifImageFile.format, ".gif") +Image.register_mime(GifImageFile.format, "image/gif") + +# +# Uncomment the following line if you wish to use NETPBM/PBMPLUS +# instead of the built-in "uncompressed" GIF encoder + +# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/ascii2img/src/PIL/GimpGradientFile.py b/ascii2img/src/PIL/GimpGradientFile.py new file mode 100644 index 0000000..43cd726 --- /dev/null +++ b/ascii2img/src/PIL/GimpGradientFile.py @@ -0,0 +1,137 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read (and render) GIMP gradient files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from math import pi, log, sin, sqrt +from ._binary import o8 + +# -------------------------------------------------------------------- +# Stuff to translate curve segments to palette values (derived from +# the corresponding code in GIMP, written by Federico Mena Quintero. +# See the GIMP distribution for more information.) +# + +EPSILON = 1e-10 + + +def linear(middle, pos): + if pos <= middle: + if middle < EPSILON: + return 0.0 + else: + return 0.5 * pos / middle + else: + pos = pos - middle + middle = 1.0 - middle + if middle < EPSILON: + return 1.0 + else: + return 0.5 + 0.5 * pos / middle + + +def curved(middle, pos): + return pos ** (log(0.5) / log(max(middle, EPSILON))) + + +def sine(middle, pos): + return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 + + +def sphere_increasing(middle, pos): + return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) + + +def sphere_decreasing(middle, pos): + return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) + +SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] + + +class GradientFile(object): + + gradient = None + + def getpalette(self, entries=256): + + palette = [] + + ix = 0 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + for i in range(entries): + + x = i / float(entries-1) + + while x1 < x: + ix += 1 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + w = x1 - x0 + + if w < EPSILON: + scale = segment(0.5, 0.5) + else: + scale = segment((xm - x0) / w, (x - x0) / w) + + # expand to RGBA + r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) + g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) + b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) + a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) + + # add to palette + palette.append(r + g + b + a) + + return b"".join(palette), "RGBA" + + +## +# File handler for GIMP's gradient format. + +class GimpGradientFile(GradientFile): + + def __init__(self, fp): + + if fp.readline()[:13] != b"GIMP Gradient": + raise SyntaxError("not a GIMP gradient file") + + line = fp.readline() + + # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do + if line.startswith(b"Name: "): + line = fp.readline().strip() + + count = int(line) + + gradient = [] + + for i in range(count): + + s = fp.readline().split() + w = [float(x) for x in s[:11]] + + x0, x1 = w[0], w[2] + xm = w[1] + rgb0 = w[3:7] + rgb1 = w[7:11] + + segment = SEGMENTS[int(s[11])] + cspace = int(s[12]) + + if cspace != 0: + raise IOError("cannot handle HSV colour space") + + gradient.append((x0, x1, xm, rgb0, rgb1, segment)) + + self.gradient = gradient diff --git a/ascii2img/src/PIL/GimpPaletteFile.py b/ascii2img/src/PIL/GimpPaletteFile.py new file mode 100644 index 0000000..6eef6a2 --- /dev/null +++ b/ascii2img/src/PIL/GimpPaletteFile.py @@ -0,0 +1,62 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read GIMP palette files +# +# History: +# 1997-08-23 fl Created +# 2004-09-07 fl Support GIMP 2.0 palette files. +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1997-2004. +# +# See the README file for information on usage and redistribution. +# + +import re +from ._binary import o8 + + +## +# File handler for GIMP's palette format. + +class GimpPaletteFile(object): + + rawmode = "RGB" + + def __init__(self, fp): + + self.palette = [o8(i)*3 for i in range(256)] + + if fp.readline()[:12] != b"GIMP Palette": + raise SyntaxError("not a GIMP palette file") + + i = 0 + + while i <= 255: + + s = fp.readline() + + if not s: + break + # skip fields and comment lines + if re.match(br"\w+:|#", s): + continue + if len(s) > 100: + raise SyntaxError("bad palette file") + + v = tuple(map(int, s.split()[:3])) + if len(v) != 3: + raise ValueError("bad palette entry") + + if 0 <= i <= 255: + self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) + + i += 1 + + self.palette = b"".join(self.palette) + + def getpalette(self): + + return self.palette, self.rawmode diff --git a/ascii2img/src/PIL/GribStubImagePlugin.py b/ascii2img/src/PIL/GribStubImagePlugin.py new file mode 100644 index 0000000..33c8291 --- /dev/null +++ b/ascii2img/src/PIL/GribStubImagePlugin.py @@ -0,0 +1,73 @@ +# +# The Python Imaging Library +# $Id$ +# +# GRIB stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile +from ._binary import i8 + +_handler = None + + +def register_handler(handler): + """ + Install application-specific GRIB image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + +def _accept(prefix): + return prefix[0:4] == b"GRIB" and i8(prefix[7]) == 1 + + +class GribStubImageFile(ImageFile.StubImageFile): + + format = "GRIB" + format_description = "GRIB" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + raise SyntaxError("Not a GRIB file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self.size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise IOError("GRIB save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) +Image.register_save(GribStubImageFile.format, _save) + +Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/ascii2img/src/PIL/Hdf5StubImagePlugin.py b/ascii2img/src/PIL/Hdf5StubImagePlugin.py new file mode 100644 index 0000000..de4d5bb --- /dev/null +++ b/ascii2img/src/PIL/Hdf5StubImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library +# $Id$ +# +# HDF5 stub adapter +# +# Copyright (c) 2000-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific HDF5 image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + +def _accept(prefix): + return prefix[:8] == b"\x89HDF\r\n\x1a\n" + + +class HDF5StubImageFile(ImageFile.StubImageFile): + + format = "HDF5" + format_description = "HDF5" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + raise SyntaxError("Not an HDF file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self.size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise IOError("HDF5 save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) +Image.register_save(HDF5StubImageFile.format, _save) + +Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/ascii2img/src/PIL/IcnsImagePlugin.py b/ascii2img/src/PIL/IcnsImagePlugin.py new file mode 100644 index 0000000..5c5bd7c --- /dev/null +++ b/ascii2img/src/PIL/IcnsImagePlugin.py @@ -0,0 +1,365 @@ +# +# The Python Imaging Library. +# $Id$ +# +# macOS icns file decoder, based on icns.py by Bob Ippolito. +# +# history: +# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. +# +# Copyright (c) 2004 by Bob Ippolito. +# Copyright (c) 2004 by Secret Labs. +# Copyright (c) 2004 by Fredrik Lundh. +# Copyright (c) 2014 by Alastair Houghton. +# +# See the README file for information on usage and redistribution. +# + +from PIL import Image, ImageFile, PngImagePlugin +from PIL._binary import i8 +import io +import os +import shutil +import struct +import sys +import tempfile + +enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') +if enable_jpeg2k: + from PIL import Jpeg2KImagePlugin + +HEADERSIZE = 8 + + +def nextheader(fobj): + return struct.unpack('>4sI', fobj.read(HEADERSIZE)) + + +def read_32t(fobj, start_length, size): + # The 128x128 icon seems to have an extra header for some reason. + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(4) + if sig != b'\x00\x00\x00\x00': + raise SyntaxError('Unknown signature, expecting 0x00000000') + return read_32(fobj, (start + 4, length - 4), size) + + +def read_32(fobj, start_length, size): + """ + Read a 32bit RGB icon resource. Seems to be either uncompressed or + an RLE packbits-like scheme. + """ + (start, length) = start_length + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + if length == sizesq * 3: + # uncompressed ("RGBRGBGB") + indata = fobj.read(length) + im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) + else: + # decode image + im = Image.new("RGB", pixel_size, None) + for band_ix in range(3): + data = [] + bytesleft = sizesq + while bytesleft > 0: + byte = fobj.read(1) + if not byte: + break + byte = i8(byte) + if byte & 0x80: + blocksize = byte - 125 + byte = fobj.read(1) + for i in range(blocksize): + data.append(byte) + else: + blocksize = byte + 1 + data.append(fobj.read(blocksize)) + bytesleft -= blocksize + if bytesleft <= 0: + break + if bytesleft != 0: + raise SyntaxError( + "Error reading channel [%r left]" % bytesleft + ) + band = Image.frombuffer( + "L", pixel_size, b"".join(data), "raw", "L", 0, 1 + ) + im.im.putband(band.im, band_ix) + return {"RGB": im} + + +def read_mk(fobj, start_length, size): + # Alpha masks seem to be uncompressed + start = start_length[0] + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + band = Image.frombuffer( + "L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1 + ) + return {"A": band} + + +def read_png_or_jpeg2000(fobj, start_length, size): + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(12) + if sig[:8] == b'\x89PNG\x0d\x0a\x1a\x0a': + fobj.seek(start) + im = PngImagePlugin.PngImageFile(fobj) + return {"RGBA": im} + elif sig[:4] == b'\xff\x4f\xff\x51' \ + or sig[:4] == b'\x0d\x0a\x87\x0a' \ + or sig == b'\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a': + if not enable_jpeg2k: + raise ValueError('Unsupported icon subimage format (rebuild PIL ' + 'with JPEG 2000 support to fix this)') + # j2k, jpc or j2c + fobj.seek(start) + jp2kstream = fobj.read(length) + f = io.BytesIO(jp2kstream) + im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) + if im.mode != 'RGBA': + im = im.convert('RGBA') + return {"RGBA": im} + else: + raise ValueError('Unsupported icon subimage format') + + +class IcnsFile(object): + + SIZES = { + (512, 512, 2): [ + (b'ic10', read_png_or_jpeg2000), + ], + (512, 512, 1): [ + (b'ic09', read_png_or_jpeg2000), + ], + (256, 256, 2): [ + (b'ic14', read_png_or_jpeg2000), + ], + (256, 256, 1): [ + (b'ic08', read_png_or_jpeg2000), + ], + (128, 128, 2): [ + (b'ic13', read_png_or_jpeg2000), + ], + (128, 128, 1): [ + (b'ic07', read_png_or_jpeg2000), + (b'it32', read_32t), + (b't8mk', read_mk), + ], + (64, 64, 1): [ + (b'icp6', read_png_or_jpeg2000), + ], + (32, 32, 2): [ + (b'ic12', read_png_or_jpeg2000), + ], + (48, 48, 1): [ + (b'ih32', read_32), + (b'h8mk', read_mk), + ], + (32, 32, 1): [ + (b'icp5', read_png_or_jpeg2000), + (b'il32', read_32), + (b'l8mk', read_mk), + ], + (16, 16, 2): [ + (b'ic11', read_png_or_jpeg2000), + ], + (16, 16, 1): [ + (b'icp4', read_png_or_jpeg2000), + (b'is32', read_32), + (b's8mk', read_mk), + ], + } + + def __init__(self, fobj): + """ + fobj is a file-like object as an icns resource + """ + # signature : (start, length) + self.dct = dct = {} + self.fobj = fobj + sig, filesize = nextheader(fobj) + if sig != b'icns': + raise SyntaxError('not an icns file') + i = HEADERSIZE + while i < filesize: + sig, blocksize = nextheader(fobj) + if blocksize <= 0: + raise SyntaxError('invalid block header') + i += HEADERSIZE + blocksize -= HEADERSIZE + dct[sig] = (i, blocksize) + fobj.seek(blocksize, 1) + i += blocksize + + def itersizes(self): + sizes = [] + for size, fmts in self.SIZES.items(): + for (fmt, reader) in fmts: + if fmt in self.dct: + sizes.append(size) + break + return sizes + + def bestsize(self): + sizes = self.itersizes() + if not sizes: + raise SyntaxError("No 32bit icon resources found") + return max(sizes) + + def dataforsize(self, size): + """ + Get an icon resource as {channel: array}. Note that + the arrays are bottom-up like windows bitmaps and will likely + need to be flipped or transposed in some way. + """ + dct = {} + for code, reader in self.SIZES[size]: + desc = self.dct.get(code) + if desc is not None: + dct.update(reader(self.fobj, desc, size)) + return dct + + def getimage(self, size=None): + if size is None: + size = self.bestsize() + if len(size) == 2: + size = (size[0], size[1], 1) + channels = self.dataforsize(size) + + im = channels.get('RGBA', None) + if im: + return im + + im = channels.get("RGB").copy() + try: + im.putalpha(channels["A"]) + except KeyError: + pass + return im + + +## +# Image plugin for Mac OS icons. + +class IcnsImageFile(ImageFile.ImageFile): + """ + PIL image support for Mac OS .icns files. + Chooses the best resolution, but will possibly load + a different size image if you mutate the size attribute + before calling 'load'. + + The info dictionary has a key 'sizes' that is a list + of sizes that the icns file has. + """ + + format = "ICNS" + format_description = "Mac OS icns resource" + + def _open(self): + self.icns = IcnsFile(self.fp) + self.mode = 'RGBA' + self.best_size = self.icns.bestsize() + self.size = (self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2]) + self.info['sizes'] = self.icns.itersizes() + # Just use this to see if it's loaded or not yet. + self.tile = ('',) + + def load(self): + if len(self.size) == 3: + self.best_size = self.size + self.size = (self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2]) + + Image.Image.load(self) + if not self.tile: + return + self.load_prepare() + # This is likely NOT the best way to do it, but whatever. + im = self.icns.getimage(self.best_size) + + # If this is a PNG or JPEG 2000, it won't be loaded yet + im.load() + + self.im = im.im + self.mode = im.mode + self.size = im.size + self.fp = None + self.icns = None + self.tile = () + self.load_end() + + +def _save(im, fp, filename): + """ + Saves the image as a series of PNG files, + that are then converted to a .icns file + using the macOS command line utility 'iconutil'. + + macOS only. + """ + if hasattr(fp, "flush"): + fp.flush() + + # create the temporary set of pngs + iconset = tempfile.mkdtemp('.iconset') + last_w = None + last_im = None + for w in [16, 32, 128, 256, 512]: + prefix = 'icon_{}x{}'.format(w, w) + + if last_w == w: + im_scaled = last_im + else: + im_scaled = im.resize((w, w), Image.LANCZOS) + im_scaled.save(os.path.join(iconset, prefix+'.png')) + + im_scaled = im.resize((w*2, w*2), Image.LANCZOS) + im_scaled.save(os.path.join(iconset, prefix+'@2x.png')) + last_im = im_scaled + + # iconutil -c icns -o {} {} + from subprocess import Popen, PIPE, CalledProcessError + + convert_cmd = ["iconutil", "-c", "icns", "-o", filename, iconset] + with open(os.devnull, 'wb') as devnull: + convert_proc = Popen(convert_cmd, stdout=PIPE, stderr=devnull) + + convert_proc.stdout.close() + + retcode = convert_proc.wait() + + # remove the temporary files + shutil.rmtree(iconset) + + if retcode: + raise CalledProcessError(retcode, convert_cmd) + +Image.register_open(IcnsImageFile.format, IcnsImageFile, + lambda x: x[:4] == b'icns') +Image.register_extension(IcnsImageFile.format, '.icns') + +if sys.platform == 'darwin': + Image.register_save(IcnsImageFile.format, _save) + + Image.register_mime(IcnsImageFile.format, "image/icns") + + +if __name__ == '__main__': + imf = IcnsImageFile(open(sys.argv[1], 'rb')) + for size in imf.info['sizes']: + imf.size = size + imf.load() + im = imf.im + im.save('out-%s-%s-%s.png' % size) + im = Image.open(open(sys.argv[1], "rb")) + im.save("out.png") + if sys.platform == 'windows': + os.startfile("out.png") diff --git a/ascii2img/src/PIL/IcoImagePlugin.py b/ascii2img/src/PIL/IcoImagePlugin.py new file mode 100644 index 0000000..428fdd4 --- /dev/null +++ b/ascii2img/src/PIL/IcoImagePlugin.py @@ -0,0 +1,284 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Icon support for PIL +# +# History: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis +# . +# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki +# +# Icon format references: +# * https://en.wikipedia.org/wiki/ICO_(file_format) +# * https://msdn.microsoft.com/en-us/library/ms997538.aspx + + +import struct +from io import BytesIO + +from . import Image, ImageFile, BmpImagePlugin, PngImagePlugin +from ._binary import i8, i16le as i16, i32le as i32 +from math import log, ceil + +__version__ = "0.1" + +# +# -------------------------------------------------------------------- + +_MAGIC = b"\0\0\1\0" + + +def _save(im, fp, filename): + fp.write(_MAGIC) # (2+2) + sizes = im.encoderinfo.get("sizes", + [(16, 16), (24, 24), (32, 32), (48, 48), + (64, 64), (128, 128), (256, 256)]) + width, height = im.size + sizes = filter(lambda x: False if (x[0] > width or x[1] > height or + x[0] > 256 or x[1] > 256) else True, + sizes) + sizes = list(sizes) + fp.write(struct.pack("=8bpp) + 'reserved': i8(s[3]), + 'planes': i16(s[4:]), + 'bpp': i16(s[6:]), + 'size': i32(s[8:]), + 'offset': i32(s[12:]) + } + + # See Wikipedia + for j in ('width', 'height'): + if not icon_header[j]: + icon_header[j] = 256 + + # See Wikipedia notes about color depth. + # We need this just to differ images with equal sizes + icon_header['color_depth'] = (icon_header['bpp'] or + (icon_header['nb_color'] != 0 and + ceil(log(icon_header['nb_color'], + 2))) or 256) + + icon_header['dim'] = (icon_header['width'], icon_header['height']) + icon_header['square'] = (icon_header['width'] * + icon_header['height']) + + self.entry.append(icon_header) + + self.entry = sorted(self.entry, key=lambda x: x['color_depth']) + # ICO images are usually squares + # self.entry = sorted(self.entry, key=lambda x: x['width']) + self.entry = sorted(self.entry, key=lambda x: x['square']) + self.entry.reverse() + + def sizes(self): + """ + Get a list of all available icon sizes and color depths. + """ + return {(h['width'], h['height']) for h in self.entry} + + def getimage(self, size, bpp=False): + """ + Get an image from the icon + """ + for (i, h) in enumerate(self.entry): + if size == h['dim'] and (bpp is False or bpp == h['color_depth']): + return self.frame(i) + return self.frame(0) + + def frame(self, idx): + """ + Get an image from frame idx + """ + + header = self.entry[idx] + + self.buf.seek(header['offset']) + data = self.buf.read(8) + self.buf.seek(header['offset']) + + if data[:8] == PngImagePlugin._MAGIC: + # png frame + im = PngImagePlugin.PngImageFile(self.buf) + else: + # XOR + AND mask bmp frame + im = BmpImagePlugin.DibImageFile(self.buf) + + # change tile dimension to only encompass XOR image + im.size = (im.size[0], int(im.size[1] / 2)) + d, e, o, a = im.tile[0] + im.tile[0] = d, (0, 0) + im.size, o, a + + # figure out where AND mask image starts + mode = a[0] + bpp = 8 + for k, v in BmpImagePlugin.BIT2MODE.items(): + if mode == v[1]: + bpp = k + break + + if 32 == bpp: + # 32-bit color depth icon image allows semitransparent areas + # PIL's DIB format ignores transparency bits, recover them. + # The DIB is packed in BGRX byte order where X is the alpha + # channel. + + # Back up to start of bmp data + self.buf.seek(o) + # extract every 4th byte (eg. 3,7,11,15,...) + alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] + + # convert to an 8bpp grayscale image + mask = Image.frombuffer( + 'L', # 8bpp + im.size, # (w, h) + alpha_bytes, # source chars + 'raw', # raw decoder + ('L', 0, -1) # 8bpp inverted, unpadded, reversed + ) + else: + # get AND image from end of bitmap + w = im.size[0] + if (w % 32) > 0: + # bitmap row data is aligned to word boundaries + w += 32 - (im.size[0] % 32) + + # the total mask data is + # padded row size * height / bits per char + + and_mask_offset = o + int(im.size[0] * im.size[1] * + (bpp / 8.0)) + total_bytes = int((w * im.size[1]) / 8) + + self.buf.seek(and_mask_offset) + mask_data = self.buf.read(total_bytes) + + # convert raw data to image + mask = Image.frombuffer( + '1', # 1 bpp + im.size, # (w, h) + mask_data, # source chars + 'raw', # raw decoder + ('1;I', int(w/8), -1) # 1bpp inverted, padded, reversed + ) + + # now we have two images, im is XOR image and mask is AND image + + # apply mask image as alpha channel + im = im.convert('RGBA') + im.putalpha(mask) + + return im + + +## +# Image plugin for Windows Icon files. + +class IcoImageFile(ImageFile.ImageFile): + """ + PIL read-only image support for Microsoft Windows .ico files. + + By default the largest resolution image in the file will be loaded. This + can be changed by altering the 'size' attribute before calling 'load'. + + The info dictionary has a key 'sizes' that is a list of the sizes available + in the icon file. + + Handles classic, XP and Vista icon formats. + + This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis + . + https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki + """ + format = "ICO" + format_description = "Windows Icon" + + def _open(self): + self.ico = IcoFile(self.fp) + self.info['sizes'] = self.ico.sizes() + self.size = self.ico.entry[0]['dim'] + self.load() + + def load(self): + im = self.ico.getimage(self.size) + # if tile is PNG, it won't really be loaded yet + im.load() + self.im = im.im + self.mode = im.mode + self.size = im.size + + def load_seek(self): + # Flag the ImageFile.Parser so that it + # just does all the decode at the end. + pass +# +# -------------------------------------------------------------------- + + +Image.register_open(IcoImageFile.format, IcoImageFile, _accept) +Image.register_save(IcoImageFile.format, _save) +Image.register_extension(IcoImageFile.format, ".ico") diff --git a/ascii2img/src/PIL/ImImagePlugin.py b/ascii2img/src/PIL/ImImagePlugin.py new file mode 100644 index 0000000..3a1fdfb --- /dev/null +++ b/ascii2img/src/PIL/ImImagePlugin.py @@ -0,0 +1,348 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IFUNC IM file handling for PIL +# +# history: +# 1995-09-01 fl Created. +# 1997-01-03 fl Save palette images +# 1997-01-08 fl Added sequence support +# 1997-01-23 fl Added P and RGB save support +# 1997-05-31 fl Read floating point images +# 1997-06-22 fl Save floating point images +# 1997-08-27 fl Read and save 1-bit images +# 1998-06-25 fl Added support for RGB+LUT images +# 1998-07-02 fl Added support for YCC images +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 1998-12-29 fl Added I;16 support +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# 2003-09-26 fl Added LA/PA support +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +import re +from . import Image, ImageFile, ImagePalette +from ._binary import i8 + +__version__ = "0.7" + + +# -------------------------------------------------------------------- +# Standard tags + +COMMENT = "Comment" +DATE = "Date" +EQUIPMENT = "Digitalization equipment" +FRAMES = "File size (no of images)" +LUT = "Lut" +NAME = "Name" +SCALE = "Scale (x,y)" +SIZE = "Image size (x*y)" +MODE = "Image type" + +TAGS = {COMMENT: 0, DATE: 0, EQUIPMENT: 0, FRAMES: 0, LUT: 0, NAME: 0, + SCALE: 0, SIZE: 0, MODE: 0} + +OPEN = { + # ifunc93/p3cfunc formats + "0 1 image": ("1", "1"), + "L 1 image": ("1", "1"), + "Greyscale image": ("L", "L"), + "Grayscale image": ("L", "L"), + "RGB image": ("RGB", "RGB;L"), + "RLB image": ("RGB", "RLB"), + "RYB image": ("RGB", "RLB"), + "B1 image": ("1", "1"), + "B2 image": ("P", "P;2"), + "B4 image": ("P", "P;4"), + "X 24 image": ("RGB", "RGB"), + "L 32 S image": ("I", "I;32"), + "L 32 F image": ("F", "F;32"), + # old p3cfunc formats + "RGB3 image": ("RGB", "RGB;T"), + "RYB3 image": ("RGB", "RYB;T"), + # extensions + "LA image": ("LA", "LA;L"), + "RGBA image": ("RGBA", "RGBA;L"), + "RGBX image": ("RGBX", "RGBX;L"), + "CMYK image": ("CMYK", "CMYK;L"), + "YCC image": ("YCbCr", "YCbCr;L"), +} + +# ifunc95 extensions +for i in ["8", "8S", "16", "16S", "32", "32F"]: + OPEN["L %s image" % i] = ("F", "F;%s" % i) + OPEN["L*%s image" % i] = ("F", "F;%s" % i) +for i in ["16", "16L", "16B"]: + OPEN["L %s image" % i] = ("I;%s" % i, "I;%s" % i) + OPEN["L*%s image" % i] = ("I;%s" % i, "I;%s" % i) +for i in ["32S"]: + OPEN["L %s image" % i] = ("I", "I;%s" % i) + OPEN["L*%s image" % i] = ("I", "I;%s" % i) +for i in range(2, 33): + OPEN["L*%s image" % i] = ("F", "F;%s" % i) + + +# -------------------------------------------------------------------- +# Read IM directory + +split = re.compile(br"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") + + +def number(s): + try: + return int(s) + except ValueError: + return float(s) + + +## +# Image plugin for the IFUNC IM file format. + +class ImImageFile(ImageFile.ImageFile): + + format = "IM" + format_description = "IFUNC Image Memory" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # Quick rejection: if there's not an LF among the first + # 100 bytes, this is (probably) not a text header. + + if b"\n" not in self.fp.read(100): + raise SyntaxError("not an IM file") + self.fp.seek(0) + + n = 0 + + # Default values + self.info[MODE] = "L" + self.info[SIZE] = (512, 512) + self.info[FRAMES] = 1 + + self.rawmode = "L" + + while True: + + s = self.fp.read(1) + + # Some versions of IFUNC uses \n\r instead of \r\n... + if s == b"\r": + continue + + if not s or s == b'\0' or s == b'\x1A': + break + + # FIXME: this may read whole file if not a text file + s = s + self.fp.readline() + + if len(s) > 100: + raise SyntaxError("not an IM file") + + if s[-2:] == b'\r\n': + s = s[:-2] + elif s[-1:] == b'\n': + s = s[:-1] + + try: + m = split.match(s) + except re.error as v: + raise SyntaxError("not an IM file") + + if m: + + k, v = m.group(1, 2) + + # Don't know if this is the correct encoding, + # but a decent guess (I guess) + k = k.decode('latin-1', 'replace') + v = v.decode('latin-1', 'replace') + + # Convert value as appropriate + if k in [FRAMES, SCALE, SIZE]: + v = v.replace("*", ",") + v = tuple(map(number, v.split(","))) + if len(v) == 1: + v = v[0] + elif k == MODE and v in OPEN: + v, self.rawmode = OPEN[v] + + # Add to dictionary. Note that COMMENT tags are + # combined into a list of strings. + if k == COMMENT: + if k in self.info: + self.info[k].append(v) + else: + self.info[k] = [v] + else: + self.info[k] = v + + if k in TAGS: + n += 1 + + else: + + raise SyntaxError("Syntax error in IM header: " + + s.decode('ascii', 'replace')) + + if not n: + raise SyntaxError("Not an IM file") + + # Basic attributes + self.size = self.info[SIZE] + self.mode = self.info[MODE] + + # Skip forward to start of image data + while s and s[0:1] != b'\x1A': + s = self.fp.read(1) + if not s: + raise SyntaxError("File truncated") + + if LUT in self.info: + # convert lookup table to palette or lut attribute + palette = self.fp.read(768) + greyscale = 1 # greyscale palette + linear = 1 # linear greyscale palette + for i in range(256): + if palette[i] == palette[i+256] == palette[i+512]: + if i8(palette[i]) != i: + linear = 0 + else: + greyscale = 0 + if self.mode == "L" or self.mode == "LA": + if greyscale: + if not linear: + self.lut = [i8(c) for c in palette[:256]] + else: + if self.mode == "L": + self.mode = self.rawmode = "P" + elif self.mode == "LA": + self.mode = self.rawmode = "PA" + self.palette = ImagePalette.raw("RGB;L", palette) + elif self.mode == "RGB": + if not greyscale or not linear: + self.lut = [i8(c) for c in palette] + + self.frame = 0 + + self.__offset = offs = self.fp.tell() + + self.__fp = self.fp # FIXME: hack + + if self.rawmode[:2] == "F;": + + # ifunc95 formats + try: + # use bit decoder (if necessary) + bits = int(self.rawmode[2:]) + if bits not in [8, 16, 32]: + self.tile = [("bit", (0, 0)+self.size, offs, + (bits, 8, 3, 0, -1))] + return + except ValueError: + pass + + if self.rawmode in ["RGB;T", "RYB;T"]: + # Old LabEye/3PC files. Would be very surprised if anyone + # ever stumbled upon such a file ;-) + size = self.size[0] * self.size[1] + self.tile = [("raw", (0, 0)+self.size, offs, ("G", 0, -1)), + ("raw", (0, 0)+self.size, offs+size, ("R", 0, -1)), + ("raw", (0, 0)+self.size, offs+2*size, ("B", 0, -1))] + else: + # LabEye/IFUNC files + self.tile = [("raw", (0, 0)+self.size, offs, + (self.rawmode, 0, -1))] + + @property + def n_frames(self): + return self.info[FRAMES] + + @property + def is_animated(self): + return self.info[FRAMES] > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + + self.frame = frame + + if self.mode == "1": + bits = 1 + else: + bits = 8 * len(self.mode) + + size = ((self.size[0] * bits + 7) // 8) * self.size[1] + offs = self.__offset + frame * size + + self.fp = self.__fp + + self.tile = [("raw", (0, 0)+self.size, offs, (self.rawmode, 0, -1))] + + def tell(self): + return self.frame + +# +# -------------------------------------------------------------------- +# Save IM files + +SAVE = { + # mode: (im type, raw mode) + "1": ("0 1", "1"), + "L": ("Greyscale", "L"), + "LA": ("LA", "LA;L"), + "P": ("Greyscale", "P"), + "PA": ("LA", "PA;L"), + "I": ("L 32S", "I;32S"), + "I;16": ("L 16", "I;16"), + "I;16L": ("L 16L", "I;16L"), + "I;16B": ("L 16B", "I;16B"), + "F": ("L 32F", "F;32F"), + "RGB": ("RGB", "RGB;L"), + "RGBA": ("RGBA", "RGBA;L"), + "RGBX": ("RGBX", "RGBX;L"), + "CMYK": ("CMYK", "CMYK;L"), + "YCbCr": ("YCC", "YCbCr;L") +} + + +def _save(im, fp, filename, check=0): + + try: + image_type, rawmode = SAVE[im.mode] + except KeyError: + raise ValueError("Cannot save %s images as IM" % im.mode) + + frames = im.encoderinfo.get("frames", 1) + + if check: + return check + + fp.write(("Image type: %s image\r\n" % image_type).encode('ascii')) + if filename: + fp.write(("Name: %s\r\n" % filename).encode('ascii')) + fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode('ascii')) + fp.write(("File size (no of images): %d\r\n" % frames).encode('ascii')) + if im.mode == "P": + fp.write(b"Lut: 1\r\n") + fp.write(b"\000" * (511-fp.tell()) + b"\032") + if im.mode == "P": + fp.write(im.im.getpalette("RGB", "RGB;L")) # 768 bytes + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, 0, -1))]) + +# +# -------------------------------------------------------------------- +# Registry + +Image.register_open(ImImageFile.format, ImImageFile) +Image.register_save(ImImageFile.format, _save) + +Image.register_extension(ImImageFile.format, ".im") diff --git a/ascii2img/src/PIL/Image.py b/ascii2img/src/PIL/Image.py new file mode 100644 index 0000000..70a8582 --- /dev/null +++ b/ascii2img/src/PIL/Image.py @@ -0,0 +1,2877 @@ +# +# The Python Imaging Library. +# $Id$ +# +# the Image class wrapper +# +# partial release history: +# 1995-09-09 fl Created +# 1996-03-11 fl PIL release 0.0 (proof of concept) +# 1996-04-30 fl PIL release 0.1b1 +# 1999-07-28 fl PIL release 1.0 final +# 2000-06-07 fl PIL release 1.1 +# 2000-10-20 fl PIL release 1.1.1 +# 2001-05-07 fl PIL release 1.1.2 +# 2002-03-15 fl PIL release 1.1.3 +# 2003-05-10 fl PIL release 1.1.4 +# 2005-03-28 fl PIL release 1.1.5 +# 2006-12-02 fl PIL release 1.1.6 +# 2009-11-15 fl PIL release 1.1.7 +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from . import VERSION, PILLOW_VERSION, _plugins + +import logging +import warnings +import math + +logger = logging.getLogger(__name__) + + +class DecompressionBombWarning(RuntimeWarning): + pass + + +class _imaging_not_installed(object): + # module placeholder + def __getattr__(self, id): + raise ImportError("The _imaging C module is not installed") + + +# Limit to around a quarter gigabyte for a 24 bit (3 bpp) image +MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 // 4 // 3) + + +try: + # If the _imaging C module is not present, Pillow will not load. + # Note that other modules should not refer to _imaging directly; + # import Image and use the Image.core variable instead. + # Also note that Image.core is not a publicly documented interface, + # and should be considered private and subject to change. + from . import _imaging as core + if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): + raise ImportError("The _imaging extension was built for another " + "version of Pillow or PIL:\n" + "Core version: %s\n" + "Pillow version: %s" % + (getattr(core, 'PILLOW_VERSION', None), + PILLOW_VERSION)) + +except ImportError as v: + core = _imaging_not_installed() + # Explanations for ways that we know we might have an import error + if str(v).startswith("Module use of python"): + # The _imaging C module is present, but not compiled for + # the right version (windows only). Print a warning, if + # possible. + warnings.warn( + "The _imaging extension was built for another version " + "of Python.", + RuntimeWarning + ) + elif str(v).startswith("The _imaging extension"): + warnings.warn(str(v), RuntimeWarning) + elif "Symbol not found: _PyUnicodeUCS2_" in str(v): + # should match _PyUnicodeUCS2_FromString and + # _PyUnicodeUCS2_AsLatin1String + warnings.warn( + "The _imaging extension was built for Python with UCS2 support; " + "recompile Pillow or build Python --without-wide-unicode. ", + RuntimeWarning + ) + elif "Symbol not found: _PyUnicodeUCS4_" in str(v): + # should match _PyUnicodeUCS4_FromString and + # _PyUnicodeUCS4_AsLatin1String + warnings.warn( + "The _imaging extension was built for Python with UCS4 support; " + "recompile Pillow or build Python --with-wide-unicode. ", + RuntimeWarning + ) + # Fail here anyway. Don't let people run with a mostly broken Pillow. + # see docs/porting.rst + raise + +try: + import builtins +except ImportError: + import __builtin__ + builtins = __builtin__ + +from . import ImageMode +from ._binary import i8 +from ._util import isPath, isStringType, deferred_error + +import os +import sys +import io +import struct +import atexit + +# type stuff +import collections +import numbers + +# works everywhere, win for pypy, not cpython +USE_CFFI_ACCESS = hasattr(sys, 'pypy_version_info') +try: + import cffi + HAS_CFFI = True +except ImportError: + HAS_CFFI = False + +try: + from pathlib import Path + HAS_PATHLIB = True +except ImportError: + try: + from pathlib2 import Path + HAS_PATHLIB = True + except ImportError: + HAS_PATHLIB = False + + +def isImageType(t): + """ + Checks if an object is an image object. + + .. warning:: + + This function is for internal use only. + + :param t: object to check if it's an image + :returns: True if the object is an image + """ + return hasattr(t, "im") + + +# +# Constants (also defined in _imagingmodule.c!) + +NONE = 0 + +# transpose +FLIP_LEFT_RIGHT = 0 +FLIP_TOP_BOTTOM = 1 +ROTATE_90 = 2 +ROTATE_180 = 3 +ROTATE_270 = 4 +TRANSPOSE = 5 +TRANSVERSE = 6 + +# transforms +AFFINE = 0 +EXTENT = 1 +PERSPECTIVE = 2 +QUAD = 3 +MESH = 4 + +# resampling filters +NEAREST = NONE = 0 +BOX = 4 +BILINEAR = LINEAR = 2 +HAMMING = 5 +BICUBIC = CUBIC = 3 +LANCZOS = ANTIALIAS = 1 + +# dithers +NEAREST = NONE = 0 +ORDERED = 1 # Not yet implemented +RASTERIZE = 2 # Not yet implemented +FLOYDSTEINBERG = 3 # default + +# palettes/quantizers +WEB = 0 +ADAPTIVE = 1 + +MEDIANCUT = 0 +MAXCOVERAGE = 1 +FASTOCTREE = 2 +LIBIMAGEQUANT = 3 + +# categories +NORMAL = 0 +SEQUENCE = 1 +CONTAINER = 2 + +if hasattr(core, 'DEFAULT_STRATEGY'): + DEFAULT_STRATEGY = core.DEFAULT_STRATEGY + FILTERED = core.FILTERED + HUFFMAN_ONLY = core.HUFFMAN_ONLY + RLE = core.RLE + FIXED = core.FIXED + + +# -------------------------------------------------------------------- +# Registries + +ID = [] +OPEN = {} +MIME = {} +SAVE = {} +SAVE_ALL = {} +EXTENSION = {} +DECODERS = {} +ENCODERS = {} + +# -------------------------------------------------------------------- +# Modes supported by this version + +_MODEINFO = { + # NOTE: this table will be removed in future versions. use + # getmode* functions or ImageMode descriptors instead. + + # official modes + "1": ("L", "L", ("1",)), + "L": ("L", "L", ("L",)), + "I": ("L", "I", ("I",)), + "F": ("L", "F", ("F",)), + "P": ("RGB", "L", ("P",)), + "RGB": ("RGB", "L", ("R", "G", "B")), + "RGBX": ("RGB", "L", ("R", "G", "B", "X")), + "RGBA": ("RGB", "L", ("R", "G", "B", "A")), + "CMYK": ("RGB", "L", ("C", "M", "Y", "K")), + "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr")), + "LAB": ("RGB", "L", ("L", "A", "B")), + "HSV": ("RGB", "L", ("H", "S", "V")), + + # Experimental modes include I;16, I;16L, I;16B, RGBa, BGR;15, and + # BGR;24. Use these modes only if you know exactly what you're + # doing... + +} + +if sys.byteorder == 'little': + _ENDIAN = '<' +else: + _ENDIAN = '>' + +_MODE_CONV = { + # official modes + "1": ('|b1', None), # Bits need to be extended to bytes + "L": ('|u1', None), + "LA": ('|u1', 2), + "I": (_ENDIAN + 'i4', None), + "F": (_ENDIAN + 'f4', None), + "P": ('|u1', None), + "RGB": ('|u1', 3), + "RGBX": ('|u1', 4), + "RGBA": ('|u1', 4), + "CMYK": ('|u1', 4), + "YCbCr": ('|u1', 3), + "LAB": ('|u1', 3), # UNDONE - unsigned |u1i1i1 + "HSV": ('|u1', 3), + # I;16 == I;16L, and I;32 == I;32L + "I;16": ('u2', None), + "I;16L": ('i2', None), + "I;16LS": ('u4', None), + "I;32L": ('i4', None), + "I;32LS": ('= 1: + return + + try: + from . import BmpImagePlugin + except ImportError: + pass + try: + from . import GifImagePlugin + except ImportError: + pass + try: + from . import JpegImagePlugin + except ImportError: + pass + try: + from . import PpmImagePlugin + except ImportError: + pass + try: + from . import PngImagePlugin + except ImportError: + pass +# try: +# import TiffImagePlugin +# except ImportError: +# pass + + _initialized = 1 + + +def init(): + """ + Explicitly initializes the Python Imaging Library. This function + loads all available file format drivers. + """ + + global _initialized + if _initialized >= 2: + return 0 + + for plugin in _plugins: + try: + logger.debug("Importing %s", plugin) + __import__("PIL.%s" % plugin, globals(), locals(), []) + except ImportError as e: + logger.debug("Image: failed to import %s: %s", plugin, e) + + if OPEN or SAVE: + _initialized = 2 + return 1 + + +# -------------------------------------------------------------------- +# Codec factories (used by tobytes/frombytes and ImageFile.load) + +def _getdecoder(mode, decoder_name, args, extra=()): + + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + decoder = DECODERS[decoder_name] + return decoder(mode, *args + extra) + except KeyError: + pass + try: + # get decoder + decoder = getattr(core, decoder_name + "_decoder") + # print(decoder, mode, args + extra) + return decoder(mode, *args + extra) + except AttributeError: + raise IOError("decoder %s not available" % decoder_name) + + +def _getencoder(mode, encoder_name, args, extra=()): + + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + encoder = ENCODERS[encoder_name] + return encoder(mode, *args + extra) + except KeyError: + pass + try: + # get encoder + encoder = getattr(core, encoder_name + "_encoder") + # print(encoder, mode, args + extra) + return encoder(mode, *args + extra) + except AttributeError: + raise IOError("encoder %s not available" % encoder_name) + + +# -------------------------------------------------------------------- +# Simple expression analyzer + +def coerce_e(value): + return value if isinstance(value, _E) else _E(value) + + +class _E(object): + def __init__(self, data): + self.data = data + + def __add__(self, other): + return _E((self.data, "__add__", coerce_e(other).data)) + + def __mul__(self, other): + return _E((self.data, "__mul__", coerce_e(other).data)) + + +def _getscaleoffset(expr): + stub = ["stub"] + data = expr(_E(stub)).data + try: + (a, b, c) = data # simplified syntax + if (a is stub and b == "__mul__" and isinstance(c, numbers.Number)): + return c, 0.0 + if a is stub and b == "__add__" and isinstance(c, numbers.Number): + return 1.0, c + except TypeError: + pass + try: + ((a, b, c), d, e) = data # full syntax + if (a is stub and b == "__mul__" and isinstance(c, numbers.Number) and + d == "__add__" and isinstance(e, numbers.Number)): + return c, e + except TypeError: + pass + raise ValueError("illegal expression") + + +# -------------------------------------------------------------------- +# Implementation wrapper + +class Image(object): + """ + This class represents an image object. To create + :py:class:`~PIL.Image.Image` objects, use the appropriate factory + functions. There's hardly ever any reason to call the Image constructor + directly. + + * :py:func:`~PIL.Image.open` + * :py:func:`~PIL.Image.new` + * :py:func:`~PIL.Image.frombytes` + """ + format = None + format_description = None + _close_exclusive_fp_after_loading = True + + def __init__(self): + # FIXME: take "new" parameters / other image? + # FIXME: turn mode and size into delegating properties? + self.im = None + self.mode = "" + self.size = (0, 0) + self.palette = None + self.info = {} + self.category = NORMAL + self.readonly = 0 + self.pyaccess = None + + @property + def width(self): + return self.size[0] + + @property + def height(self): + return self.size[1] + + def _new(self, im): + new = Image() + new.im = im + new.mode = im.mode + new.size = im.size + if im.mode in ('P', 'PA'): + if self.palette: + new.palette = self.palette.copy() + else: + from . import ImagePalette + new.palette = ImagePalette.ImagePalette() + new.info = self.info.copy() + return new + + # Context Manager Support + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + """ + Closes the file pointer, if possible. + + This operation will destroy the image core and release its memory. + The image data will be unusable afterward. + + This function is only required to close images that have not + had their file read and closed by the + :py:meth:`~PIL.Image.Image.load` method. + """ + try: + self.fp.close() + self.fp = None + except Exception as msg: + logger.debug("Error closing: %s", msg) + + if getattr(self, 'map', None): + self.map = None + + # Instead of simply setting to None, we're setting up a + # deferred error that will better explain that the core image + # object is gone. + self.im = deferred_error(ValueError("Operation on closed image")) + + if sys.version_info >= (3, 4, 0): + def __del__(self): + if (hasattr(self, 'fp') and hasattr(self, '_exclusive_fp') + and self.fp and self._exclusive_fp): + self.fp.close() + self.fp = None + + def _copy(self): + self.load() + self.im = self.im.copy() + self.pyaccess = None + self.readonly = 0 + + def _ensure_mutable(self): + if self.readonly: + self._copy() + else: + self.load() + + def _dump(self, file=None, format=None, **options): + import tempfile + + suffix = '' + if format: + suffix = '.'+format + + if not file: + f, filename = tempfile.mkstemp(suffix) + os.close(f) + else: + filename = file + if not filename.endswith(suffix): + filename = filename + suffix + + self.load() + + if not format or format == "PPM": + self.im.save_ppm(filename) + else: + self.save(filename, format, **options) + + return filename + + def __eq__(self, other): + return (isinstance(other, Image) and + self.__class__.__name__ == other.__class__.__name__ and + self.mode == other.mode and + self.size == other.size and + self.info == other.info and + self.category == other.category and + self.readonly == other.readonly and + self.getpalette() == other.getpalette() and + self.tobytes() == other.tobytes()) + + def __ne__(self, other): + eq = (self == other) + return not eq + + def __repr__(self): + return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( + self.__class__.__module__, self.__class__.__name__, + self.mode, self.size[0], self.size[1], + id(self) + ) + + def _repr_png_(self): + """ iPython display hook support + + :returns: png version of the image as bytes + """ + from io import BytesIO + b = BytesIO() + self.save(b, 'PNG') + return b.getvalue() + + @property + def __array_interface__(self): + # numpy array interface support + new = {} + shape, typestr = _conv_type_shape(self) + new['shape'] = shape + new['typestr'] = typestr + new['version'] = 3 + if self.mode == '1': + # Binary images need to be extended from bits to bytes + # See: https://github.com/python-pillow/Pillow/issues/350 + new['data'] = self.tobytes('raw', 'L') + else: + new['data'] = self.tobytes() + return new + + def __getstate__(self): + return [ + self.info, + self.mode, + self.size, + self.getpalette(), + self.tobytes()] + + def __setstate__(self, state): + Image.__init__(self) + self.tile = [] + info, mode, size, palette, data = state + self.info = info + self.mode = mode + self.size = size + self.im = core.new(mode, size) + if mode in ("L", "P") and palette: + self.putpalette(palette) + self.frombytes(data) + + def tobytes(self, encoder_name="raw", *args): + """ + Return image as a bytes object. + + .. warning:: + + This method returns the raw image data from the internal + storage. For compressed image data (e.g. PNG, JPEG) use + :meth:`~.save`, with a BytesIO parameter for in-memory + data. + + :param encoder_name: What encoder to use. The default is to + use the standard "raw" encoder. + :param args: Extra arguments to the encoder. + :rtype: A bytes object. + """ + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if encoder_name == "raw" and args == (): + args = self.mode + + self.load() + + # unpack data + e = _getencoder(self.mode, encoder_name, args) + e.setimage(self.im) + + bufsize = max(65536, self.size[0] * 4) # see RawEncode.c + + data = [] + while True: + l, s, d = e.encode(bufsize) + data.append(d) + if s: + break + if s < 0: + raise RuntimeError("encoder error %d in tobytes" % s) + + return b"".join(data) + + def tostring(self, *args, **kw): + raise NotImplementedError("tostring() has been removed. " + "Please call tobytes() instead.") + + def tobitmap(self, name="image"): + """ + Returns the image converted to an X11 bitmap. + + .. note:: This method only works for mode "1" images. + + :param name: The name prefix to use for the bitmap variables. + :returns: A string containing an X11 bitmap. + :raises ValueError: If the mode is not "1" + """ + + self.load() + if self.mode != "1": + raise ValueError("not a bitmap") + data = self.tobytes("xbm") + return b"".join([ + ("#define %s_width %d\n" % (name, self.size[0])).encode('ascii'), + ("#define %s_height %d\n" % (name, self.size[1])).encode('ascii'), + ("static char %s_bits[] = {\n" % name).encode('ascii'), data, b"};" + ]) + + def frombytes(self, data, decoder_name="raw", *args): + """ + Loads this image with pixel data from a bytes object. + + This method is similar to the :py:func:`~PIL.Image.frombytes` function, + but loads data into this image instead of creating a new image object. + """ + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + # default format + if decoder_name == "raw" and args == (): + args = self.mode + + # unpack data + d = _getdecoder(self.mode, decoder_name, args) + d.setimage(self.im) + s = d.decode(data) + + if s[0] >= 0: + raise ValueError("not enough image data") + if s[1] != 0: + raise ValueError("cannot decode image data") + + def fromstring(self, *args, **kw): + raise NotImplementedError("fromstring() has been removed. " + "Please call frombytes() instead.") + + def load(self): + """ + Allocates storage for the image and loads the pixel data. In + normal cases, you don't need to call this method, since the + Image class automatically loads an opened image when it is + accessed for the first time. This method will close the file + associated with the image. + + :returns: An image access object. + :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` + """ + if self.im and self.palette and self.palette.dirty: + # realize palette + self.im.putpalette(*self.palette.getdata()) + self.palette.dirty = 0 + self.palette.mode = "RGB" + self.palette.rawmode = None + if "transparency" in self.info: + if isinstance(self.info["transparency"], int): + self.im.putpalettealpha(self.info["transparency"], 0) + else: + self.im.putpalettealphas(self.info["transparency"]) + self.palette.mode = "RGBA" + + if self.im: + if HAS_CFFI and USE_CFFI_ACCESS: + if self.pyaccess: + return self.pyaccess + from . import PyAccess + self.pyaccess = PyAccess.new(self, self.readonly) + if self.pyaccess: + return self.pyaccess + return self.im.pixel_access(self.readonly) + + def verify(self): + """ + Verifies the contents of a file. For data read from a file, this + method attempts to determine if the file is broken, without + actually decoding the image data. If this method finds any + problems, it raises suitable exceptions. If you need to load + the image after using this method, you must reopen the image + file. + """ + pass + + def convert(self, mode=None, matrix=None, dither=None, + palette=WEB, colors=256): + """ + Returns a converted copy of this image. For the "P" mode, this + method translates pixels through the palette. If mode is + omitted, a mode is chosen so that all information in the image + and the palette can be represented without a palette. + + The current version supports all possible conversions between + "L", "RGB" and "CMYK." The **matrix** argument only supports "L" + and "RGB". + + When translating a color image to black and white (mode "L"), + the library uses the ITU-R 601-2 luma transform:: + + L = R * 299/1000 + G * 587/1000 + B * 114/1000 + + The default method of converting a greyscale ("L") or "RGB" + image into a bilevel (mode "1") image uses Floyd-Steinberg + dither to approximate the original image luminosity levels. If + dither is NONE, all non-zero values are set to 255 (white). To + use other thresholds, use the :py:meth:`~PIL.Image.Image.point` + method. + + :param mode: The requested mode. See: :ref:`concept-modes`. + :param matrix: An optional conversion matrix. If given, this + should be 4- or 12-tuple containing floating point values. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are NONE or FLOYDSTEINBERG (default). + :param palette: Palette to use when converting from mode "RGB" + to "P". Available palettes are WEB or ADAPTIVE. + :param colors: Number of colors to use for the ADAPTIVE palette. + Defaults to 256. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if not mode and self.mode == "P": + # determine default mode + if self.palette: + mode = self.palette.mode + else: + mode = "RGB" + if not mode or (mode == self.mode and not matrix): + return self.copy() + + if matrix: + # matrix conversion + if mode not in ("L", "RGB"): + raise ValueError("illegal conversion") + im = self.im.convert_matrix(mode, matrix) + return self._new(im) + + if mode == "P" and self.mode == "RGBA": + return self.quantize(colors) + + trns = None + delete_trns = False + # transparency handling + if "transparency" in self.info and \ + self.info['transparency'] is not None: + if self.mode in ('L', 'RGB') and mode == 'RGBA': + # Use transparent conversion to promote from transparent + # color to an alpha channel. + new_im = self._new(self.im.convert_transparent( + mode, self.info['transparency'])) + del(new_im.info['transparency']) + return new_im + elif self.mode in ('L', 'RGB', 'P') and mode in ('L', 'RGB', 'P'): + t = self.info['transparency'] + if isinstance(t, bytes): + # Dragons. This can't be represented by a single color + warnings.warn('Palette images with Transparency ' + + ' expressed in bytes should be converted ' + + 'to RGBA images') + delete_trns = True + else: + # get the new transparency color. + # use existing conversions + trns_im = Image()._new(core.new(self.mode, (1, 1))) + if self.mode == 'P': + trns_im.putpalette(self.palette) + if isinstance(t, tuple): + try: + t = trns_im.palette.getcolor(t) + except: + raise ValueError("Couldn't allocate a palette " + "color for transparency") + trns_im.putpixel((0, 0), t) + + if mode in ('L', 'RGB'): + trns_im = trns_im.convert(mode) + else: + # can't just retrieve the palette number, got to do it + # after quantization. + trns_im = trns_im.convert('RGB') + trns = trns_im.getpixel((0, 0)) + + elif self.mode == 'P' and mode == 'RGBA': + t = self.info['transparency'] + delete_trns = True + + if isinstance(t, bytes): + self.im.putpalettealphas(t) + elif isinstance(t, int): + self.im.putpalettealpha(t, 0) + else: + raise ValueError("Transparency for P mode should" + + " be bytes or int") + + if mode == "P" and palette == ADAPTIVE: + im = self.im.quantize(colors) + new = self._new(im) + from . import ImagePalette + new.palette = ImagePalette.raw("RGB", new.im.getpalette("RGB")) + if delete_trns: + # This could possibly happen if we requantize to fewer colors. + # The transparency would be totally off in that case. + del(new.info['transparency']) + if trns is not None: + try: + new.info['transparency'] = new.palette.getcolor(trns) + except: + # if we can't make a transparent color, don't leave the old + # transparency hanging around to mess us up. + del(new.info['transparency']) + warnings.warn("Couldn't allocate palette entry " + + "for transparency") + return new + + # colorspace conversion + if dither is None: + dither = FLOYDSTEINBERG + + try: + im = self.im.convert(mode, dither) + except ValueError: + try: + # normalize source image and try again + im = self.im.convert(getmodebase(self.mode)) + im = im.convert(mode, dither) + except KeyError: + raise ValueError("illegal conversion") + + new_im = self._new(im) + if delete_trns: + # crash fail if we leave a bytes transparency in an rgb/l mode. + del(new_im.info['transparency']) + if trns is not None: + if new_im.mode == 'P': + try: + new_im.info['transparency'] = new_im.palette.getcolor(trns) + except: + del(new_im.info['transparency']) + warnings.warn("Couldn't allocate palette entry " + + "for transparency") + else: + new_im.info['transparency'] = trns + return new_im + + def quantize(self, colors=256, method=None, kmeans=0, palette=None): + """ + Convert the image to 'P' mode with the specified number + of colors. + + :param colors: The desired number of colors, <= 256 + :param method: 0 = median cut + 1 = maximum coverage + 2 = fast octree + 3 = libimagequant + :param kmeans: Integer + :param palette: Quantize to the palette of given :py:class:`PIL.Image.Image`. + :returns: A new image + + """ + + self.load() + + if method is None: + # defaults: + method = 0 + if self.mode == 'RGBA': + method = 2 + + if self.mode == 'RGBA' and method not in (2, 3): + # Caller specified an invalid mode. + raise ValueError( + 'Fast Octree (method == 2) and libimagequant (method == 3) ' + + 'are the only valid methods for quantizing RGBA images') + + if palette: + # use palette from reference image + palette.load() + if palette.mode != "P": + raise ValueError("bad mode for palette image") + if self.mode != "RGB" and self.mode != "L": + raise ValueError( + "only RGB or L mode images can be quantized to a palette" + ) + im = self.im.convert("P", 1, palette.im) + return self._new(im) + + return self._new(self.im.quantize(colors, method, kmeans)) + + def copy(self): + """ + Copies this image. Use this method if you wish to paste things + into an image, but still retain the original. + + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + self.load() + return self._new(self.im.copy()) + + __copy__ = copy + + def crop(self, box=None): + """ + Returns a rectangular region from this image. The box is a + 4-tuple defining the left, upper, right, and lower pixel + coordinate. + + Note: Prior to Pillow 3.4.0, this was a lazy operation. + + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if box is None: + return self.copy() + + self.load() + return self._new(self._crop(self.im, box)) + + def _crop(self, im, box): + """ + Returns a rectangular region from the core image object im. + + This is equivalent to calling im.crop((x0, y0, x1, y1)), but + includes additional sanity checks. + + :param im: a core image object + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :returns: A core image object. + """ + + x0, y0, x1, y1 = map(int, map(round, box)) + + if x1 < x0: + x1 = x0 + if y1 < y0: + y1 = y0 + + _decompression_bomb_check((x1, y1)) + + return im.crop((x0, y0, x1, y1)) + + def draft(self, mode, size): + """ + Configures the image file loader so it returns a version of the + image that as closely as possible matches the given mode and + size. For example, you can use this method to convert a color + JPEG to greyscale while loading it, or to extract a 128x192 + version from a PCD file. + + Note that this method modifies the :py:class:`~PIL.Image.Image` object + in place. If the image has already been loaded, this method has no + effect. + + Note: This method is not implemented for most images. It is + currently implemented only for JPEG and PCD images. + + :param mode: The requested mode. + :param size: The requested size. + """ + pass + + def _expand(self, xmargin, ymargin=None): + if ymargin is None: + ymargin = xmargin + self.load() + return self._new(self.im.expand(xmargin, ymargin, 0)) + + def filter(self, filter): + """ + Filters this image using the given filter. For a list of + available filters, see the :py:mod:`~PIL.ImageFilter` module. + + :param filter: Filter kernel. + :returns: An :py:class:`~PIL.Image.Image` object. """ + + from . import ImageFilter + + self.load() + + if isinstance(filter, collections.Callable): + filter = filter() + if not hasattr(filter, "filter"): + raise TypeError("filter argument should be ImageFilter.Filter " + + "instance or class") + + multiband = isinstance(filter, ImageFilter.MultibandFilter) + if self.im.bands == 1 or multiband: + return self._new(filter.filter(self.im)) + + ims = [] + for c in range(self.im.bands): + ims.append(self._new(filter.filter(self.im.getband(c)))) + return merge(self.mode, ims) + + def getbands(self): + """ + Returns a tuple containing the name of each band in this image. + For example, **getbands** on an RGB image returns ("R", "G", "B"). + + :returns: A tuple containing band names. + :rtype: tuple + """ + return ImageMode.getmode(self.mode).bands + + def getbbox(self): + """ + Calculates the bounding box of the non-zero regions in the + image. + + :returns: The bounding box is returned as a 4-tuple defining the + left, upper, right, and lower pixel coordinate. If the image + is completely empty, this method returns None. + + """ + + self.load() + return self.im.getbbox() + + def getcolors(self, maxcolors=256): + """ + Returns a list of colors used in this image. + + :param maxcolors: Maximum number of colors. If this number is + exceeded, this method returns None. The default limit is + 256 colors. + :returns: An unsorted list of (count, pixel) values. + """ + + self.load() + if self.mode in ("1", "L", "P"): + h = self.im.histogram() + out = [] + for i in range(256): + if h[i]: + out.append((h[i], i)) + if len(out) > maxcolors: + return None + return out + return self.im.getcolors(maxcolors) + + def getdata(self, band=None): + """ + Returns the contents of this image as a sequence object + containing pixel values. The sequence object is flattened, so + that values for line one follow directly after the values of + line zero, and so on. + + Note that the sequence object returned by this method is an + internal PIL data type, which only supports certain sequence + operations. To convert it to an ordinary sequence (e.g. for + printing), use **list(im.getdata())**. + + :param band: What band to return. The default is to return + all bands. To return a single band, pass in the index + value (e.g. 0 to get the "R" band from an "RGB" image). + :returns: A sequence-like object. + """ + + self.load() + if band is not None: + return self.im.getband(band) + return self.im # could be abused + + def getextrema(self): + """ + Gets the the minimum and maximum pixel values for each band in + the image. + + :returns: For a single-band image, a 2-tuple containing the + minimum and maximum pixel value. For a multi-band image, + a tuple containing one 2-tuple for each band. + """ + + self.load() + if self.im.bands > 1: + extrema = [] + for i in range(self.im.bands): + extrema.append(self.im.getband(i).getextrema()) + return tuple(extrema) + return self.im.getextrema() + + def getim(self): + """ + Returns a capsule that points to the internal image memory. + + :returns: A capsule object. + """ + + self.load() + return self.im.ptr + + def getpalette(self): + """ + Returns the image palette as a list. + + :returns: A list of color values [r, g, b, ...], or None if the + image has no palette. + """ + + self.load() + try: + if bytes is str: + return [i8(c) for c in self.im.getpalette()] + else: + return list(self.im.getpalette()) + except ValueError: + return None # no palette + + def getpixel(self, xy): + """ + Returns the pixel value at a given position. + + :param xy: The coordinate, given as (x, y). + :returns: The pixel value. If the image is a multi-layer image, + this method returns a tuple. + """ + + self.load() + if self.pyaccess: + return self.pyaccess.getpixel(xy) + return self.im.getpixel(xy) + + def getprojection(self): + """ + Get projection to x and y axes + + :returns: Two sequences, indicating where there are non-zero + pixels along the X-axis and the Y-axis, respectively. + """ + + self.load() + x, y = self.im.getprojection() + return [i8(c) for c in x], [i8(c) for c in y] + + def histogram(self, mask=None, extrema=None): + """ + Returns a histogram for the image. The histogram is returned as + a list of pixel counts, one for each pixel value in the source + image. If the image has more than one band, the histograms for + all bands are concatenated (for example, the histogram for an + "RGB" image contains 768 values). + + A bilevel image (mode "1") is treated as a greyscale ("L") image + by this method. + + If a mask is provided, the method returns a histogram for those + parts of the image where the mask image is non-zero. The mask + image must have the same size as the image, and be either a + bi-level image (mode "1") or a greyscale image ("L"). + + :param mask: An optional mask. + :returns: A list containing pixel counts. + """ + self.load() + if mask: + mask.load() + return self.im.histogram((0, 0), mask.im) + if self.mode in ("I", "F"): + if extrema is None: + extrema = self.getextrema() + return self.im.histogram(extrema) + return self.im.histogram() + + def offset(self, xoffset, yoffset=None): + raise NotImplementedError("offset() has been removed. " + "Please call ImageChops.offset() instead.") + + def paste(self, im, box=None, mask=None): + """ + Pastes another image into this image. The box argument is either + a 2-tuple giving the upper left corner, a 4-tuple defining the + left, upper, right, and lower pixel coordinate, or None (same as + (0, 0)). If a 4-tuple is given, the size of the pasted image + must match the size of the region. + + If the modes don't match, the pasted image is converted to the mode of + this image (see the :py:meth:`~PIL.Image.Image.convert` method for + details). + + Instead of an image, the source can be a integer or tuple + containing pixel values. The method then fills the region + with the given color. When creating RGB images, you can + also use color strings as supported by the ImageColor module. + + If a mask is given, this method updates only the regions + indicated by the mask. You can use either "1", "L" or "RGBA" + images (in the latter case, the alpha band is used as mask). + Where the mask is 255, the given image is copied as is. Where + the mask is 0, the current value is preserved. Intermediate + values will mix the two images together, including their alpha + channels if they have them. + + See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to + combine images with respect to their alpha channels. + + :param im: Source image or pixel value (integer or tuple). + :param box: An optional 4-tuple giving the region to paste into. + If a 2-tuple is used instead, it's treated as the upper left + corner. If omitted or None, the source is pasted into the + upper left corner. + + If an image is given as the second argument and there is no + third, the box defaults to (0, 0), and the second argument + is interpreted as a mask image. + :param mask: An optional mask image. + """ + + if isImageType(box) and mask is None: + # abbreviated paste(im, mask) syntax + mask = box + box = None + + if box is None: + box = (0, 0) + + if len(box) == 2: + # upper left corner given; get size from image or mask + if isImageType(im): + size = im.size + elif isImageType(mask): + size = mask.size + else: + # FIXME: use self.size here? + raise ValueError( + "cannot determine region size; use 4-item box" + ) + box += (box[0]+size[0], box[1]+size[1]) + + if isStringType(im): + from . import ImageColor + im = ImageColor.getcolor(im, self.mode) + + elif isImageType(im): + im.load() + if self.mode != im.mode: + if self.mode != "RGB" or im.mode not in ("RGBA", "RGBa"): + # should use an adapter for this! + im = im.convert(self.mode) + im = im.im + + self._ensure_mutable() + + if mask: + mask.load() + self.im.paste(im, box, mask.im) + else: + self.im.paste(im, box) + + def alpha_composite(self, im, dest=(0,0), source=(0,0)): + """ 'In-place' analog of Image.alpha_composite. Composites an image + onto this image. + + :param im: image to composite over this one + :param dest: Optional 2 tuple (left, top) specifying the upper + left corner in this (destination) image. + :param source: Optional 2 (left, top) tuple for the upper left + corner in the overlay source image, or 4 tuple (left, top, right, + bottom) for the bounds of the source rectangle + + Performance Note: Not currently implemented in-place in the core layer. + """ + + if not isinstance(source, (list, tuple)): + raise ValueError("Source must be a tuple") + if not isinstance(dest, (list, tuple)): + raise ValueError("Destination must be a tuple") + if not len(source) in (2, 4): + raise ValueError("Source must be a 2 or 4-tuple") + if not len(dest) == 2: + raise ValueError("Destination must be a 2-tuple") + if min(source) < 0: + raise ValueError("Source must be non-negative") + if min(dest) < 0: + raise ValueError("Destination must be non-negative") + + if len(source) == 2: + source = source + im.size + + # over image, crop if it's not the whole thing. + if source == (0,0) + im.size: + overlay = im + else: + overlay = im.crop(source) + + # target for the paste + box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) + + # destination image. don't copy if we're using the whole image. + if box == (0,0) + self.size: + background = self + else: + background = self.crop(box) + + result = alpha_composite(background, overlay) + self.paste(result, box) + + def point(self, lut, mode=None): + """ + Maps this image through a lookup table or function. + + :param lut: A lookup table, containing 256 (or 65336 if + self.mode=="I" and mode == "L") values per band in the + image. A function can be used instead, it should take a + single argument. The function is called once for each + possible pixel value, and the resulting table is applied to + all bands of the image. + :param mode: Output mode (default is same as input). In the + current version, this can only be used if the source image + has mode "L" or "P", and the output has mode "1" or the + source image mode is "I" and the output mode is "L". + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if isinstance(lut, ImagePointHandler): + return lut.point(self) + + if callable(lut): + # if it isn't a list, it should be a function + if self.mode in ("I", "I;16", "F"): + # check if the function can be used with point_transform + # UNDONE wiredfool -- I think this prevents us from ever doing + # a gamma function point transform on > 8bit images. + scale, offset = _getscaleoffset(lut) + return self._new(self.im.point_transform(scale, offset)) + # for other modes, convert the function to a table + lut = [lut(i) for i in range(256)] * self.im.bands + + if self.mode == "F": + # FIXME: _imaging returns a confusing error message for this case + raise ValueError("point operation not supported for this mode") + + return self._new(self.im.point(lut, mode)) + + def putalpha(self, alpha): + """ + Adds or replaces the alpha layer in this image. If the image + does not have an alpha layer, it's converted to "LA" or "RGBA". + The new layer must be either "L" or "1". + + :param alpha: The new alpha layer. This can either be an "L" or "1" + image having the same size as this image, or an integer or + other color value. + """ + + self._ensure_mutable() + + if self.mode not in ("LA", "RGBA"): + # attempt to promote self to a matching alpha mode + try: + mode = getmodebase(self.mode) + "A" + try: + self.im.setmode(mode) + except (AttributeError, ValueError): + # do things the hard way + im = self.im.convert(mode) + if im.mode not in ("LA", "RGBA"): + raise ValueError # sanity check + self.im = im + self.pyaccess = None + self.mode = self.im.mode + except (KeyError, ValueError): + raise ValueError("illegal image mode") + + if self.mode == "LA": + band = 1 + else: + band = 3 + + if isImageType(alpha): + # alpha layer + if alpha.mode not in ("1", "L"): + raise ValueError("illegal image mode") + alpha.load() + if alpha.mode == "1": + alpha = alpha.convert("L") + else: + # constant alpha + try: + self.im.fillband(band, alpha) + except (AttributeError, ValueError): + # do things the hard way + alpha = new("L", self.size, alpha) + else: + return + + self.im.putband(alpha.im, band) + + def putdata(self, data, scale=1.0, offset=0.0): + """ + Copies pixel data to this image. This method copies data from a + sequence object into the image, starting at the upper left + corner (0, 0), and continuing until either the image or the + sequence ends. The scale and offset values are used to adjust + the sequence values: **pixel = value*scale + offset**. + + :param data: A sequence object. + :param scale: An optional scale value. The default is 1.0. + :param offset: An optional offset value. The default is 0.0. + """ + + self._ensure_mutable() + + self.im.putdata(data, scale, offset) + + def putpalette(self, data, rawmode="RGB"): + """ + Attaches a palette to this image. The image must be a "P" or + "L" image, and the palette sequence must contain 768 integer + values, where each group of three values represent the red, + green, and blue values for the corresponding pixel + index. Instead of an integer sequence, you can use an 8-bit + string. + + :param data: A palette sequence (either a list or a string). + :param rawmode: The raw mode of the palette. + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + raise ValueError("illegal image mode") + self.load() + if isinstance(data, ImagePalette.ImagePalette): + palette = ImagePalette.raw(data.rawmode, data.palette) + else: + if not isinstance(data, bytes): + if bytes is str: + data = "".join(chr(x) for x in data) + else: + data = bytes(data) + palette = ImagePalette.raw(rawmode, data) + self.mode = "P" + self.palette = palette + self.palette.mode = "RGB" + self.load() # install new palette + + def putpixel(self, xy, value): + """ + Modifies the pixel at the given position. The color is given as + a single numerical value for single-band images, and a tuple for + multi-band images. + + Note that this method is relatively slow. For more extensive changes, + use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` + module instead. + + See: + + * :py:meth:`~PIL.Image.Image.paste` + * :py:meth:`~PIL.Image.Image.putdata` + * :py:mod:`~PIL.ImageDraw` + + :param xy: The pixel coordinate, given as (x, y). + :param value: The pixel value. + """ + + if self.readonly: + self._copy() + self.load() + + if self.pyaccess: + return self.pyaccess.putpixel(xy, value) + return self.im.putpixel(xy, value) + + def remap_palette(self, dest_map, source_palette=None): + """ + Rewrites the image to reorder the palette. + + :param dest_map: A list of indexes into the original palette. + e.g. [1,0] would swap a two item palette, and list(range(255)) + is the identity transform. + :param source_palette: Bytes or None. + :returns: An :py:class:`~PIL.Image.Image` object. + + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + raise ValueError("illegal image mode") + + if source_palette is None: + if self.mode == "P": + real_source_palette = self.im.getpalette("RGB")[:768] + else: # L-mode + real_source_palette = bytearray(i//3 for i in range(768)) + else: + real_source_palette = source_palette + + palette_bytes = b"" + new_positions = [0]*256 + + # pick only the used colors from the palette + for i, oldPosition in enumerate(dest_map): + palette_bytes += real_source_palette[oldPosition*3:oldPosition*3+3] + new_positions[oldPosition] = i + + # replace the palette color id of all pixel with the new id + + # Palette images are [0..255], mapped through a 1 or 3 + # byte/color map. We need to remap the whole image + # from palette 1 to palette 2. New_positions is + # an array of indexes into palette 1. Palette 2 is + # palette 1 with any holes removed. + + # We're going to leverage the convert mechanism to use the + # C code to remap the image from palette 1 to palette 2, + # by forcing the source image into 'L' mode and adding a + # mapping 'L' mode palette, then converting back to 'L' + # sans palette thus converting the image bytes, then + # assigning the optimized RGB palette. + + # perf reference, 9500x4000 gif, w/~135 colors + # 14 sec prepatch, 1 sec postpatch with optimization forced. + + mapping_palette = bytearray(new_positions) + + m_im = self.copy() + m_im.mode = 'P' + + m_im.palette = ImagePalette.ImagePalette("RGB", + palette=mapping_palette*3, + size=768) + # possibly set palette dirty, then + # m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # or just force it. + # UNDONE -- this is part of the general issue with palettes + m_im.im.putpalette(*m_im.palette.getdata()) + + m_im = m_im.convert('L') + + # Internally, we require 768 bytes for a palette. + new_palette_bytes = (palette_bytes + + (768 - len(palette_bytes)) * b'\x00') + m_im.putpalette(new_palette_bytes) + m_im.palette = ImagePalette.ImagePalette("RGB", + palette=palette_bytes, + size=len(palette_bytes)) + + return m_im + + def resize(self, size, resample=NEAREST, box=None): + """ + Returns a resized copy of this image. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param resample: An optional resampling filter. This can be + one of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BOX`, + :py:attr:`PIL.Image.BILINEAR`, :py:attr:`PIL.Image.HAMMING`, + :py:attr:`PIL.Image.BICUBIC` or :py:attr:`PIL.Image.LANCZOS`. + If omitted, or if the image has mode "1" or "P", it is + set :py:attr:`PIL.Image.NEAREST`. + See: :ref:`concept-filters`. + :param box: An optional 4-tuple of floats giving the region + of the source image which should be scaled. + The values should be within (0, 0, width, height) rectangle. + If omitted or None, the entire source is used. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if resample not in ( + NEAREST, BILINEAR, BICUBIC, LANCZOS, BOX, HAMMING, + ): + raise ValueError("unknown resampling filter") + + size = tuple(size) + + if box is None: + box = (0, 0) + self.size + else: + box = tuple(box) + + if self.size == size and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ("1", "P"): + resample = NEAREST + + if self.mode == 'LA': + return self.convert('La').resize(size, resample, box).convert('LA') + + if self.mode == 'RGBA': + return self.convert('RGBa').resize(size, resample, box).convert('RGBA') + + self.load() + + return self._new(self.im.resize(size, resample, box)) + + def rotate(self, angle, resample=NEAREST, expand=0, center=None, + translate=None): + """ + Returns a rotated copy of this image. This method returns a + copy of this image, rotated the given number of degrees counter + clockwise around its centre. + + :param angle: In degrees counter clockwise. + :param resample: An optional resampling filter. This can be + one of :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), + :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:attr:`PIL.Image.BICUBIC` + (cubic spline interpolation in a 4x4 environment). + If omitted, or if the image has mode "1" or "P", it is + set :py:attr:`PIL.Image.NEAREST`. See :ref:`concept-filters`. + :param expand: Optional expansion flag. If true, expands the output + image to make it large enough to hold the entire rotated image. + If false or omitted, make the output image the same size as the + input image. Note that the expand flag assumes rotation around + the center and no translation. + :param center: Optional center of rotation (a 2-tuple). Origin is + the upper left corner. Default is the center of the image. + :param translate: An optional post-rotate translation (a 2-tuple). + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + angle = angle % 360.0 + + # Fast paths regardless of filter, as long as we're not + # translating or changing the center. + if not (center or translate): + if angle == 0: + return self.copy() + if angle == 180: + return self.transpose(ROTATE_180) + if angle == 90 and expand: + return self.transpose(ROTATE_90) + if angle == 270 and expand: + return self.transpose(ROTATE_270) + + # Calculate the affine matrix. Note that this is the reverse + # transformation (from destination image to source) because we + # want to interpolate the (discrete) destination pixel from + # the local area around the (floating) source pixel. + + # The matrix we actually want (note that it operates from the right): + # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) + # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) + # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) + + # The reverse matrix is thus: + # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) + # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) + # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) + + # In any case, the final translation may be updated at the end to + # compensate for the expand flag. + + w, h = self.size + + if translate is None: + post_trans = (0, 0) + else: + post_trans = translate + if center is None: + rotn_center = (w / 2.0, h / 2.0) # FIXME These should be rounded to ints? + else: + rotn_center = center + + angle = - math.radians(angle) + matrix = [ + round(math.cos(angle), 15), round(math.sin(angle), 15), 0.0, + round(-math.sin(angle), 15), round(math.cos(angle), 15), 0.0 + ] + + def transform(x, y, matrix): + (a, b, c, d, e, f) = matrix + return a*x + b*y + c, d*x + e*y + f + + matrix[2], matrix[5] = transform(-rotn_center[0] - post_trans[0], + -rotn_center[1] - post_trans[1], matrix) + matrix[2] += rotn_center[0] + matrix[5] += rotn_center[1] + + if expand: + # calculate output size + xx = [] + yy = [] + for x, y in ((0, 0), (w, 0), (w, h), (0, h)): + x, y = transform(x, y, matrix) + xx.append(x) + yy.append(y) + nw = int(math.ceil(max(xx)) - math.floor(min(xx))) + nh = int(math.ceil(max(yy)) - math.floor(min(yy))) + + # We multiply a translation matrix from the right. Because of its + # special form, this is the same as taking the image of the + # translation vector as new translation vector. + matrix[2], matrix[5] = transform(-(nw - w) / 2.0, + -(nh - h) / 2.0, + matrix) + w, h = nw, nh + + return self.transform((w, h), AFFINE, matrix, resample) + + def save(self, fp, format=None, **params): + """ + Saves this image under the given filename. If no format is + specified, the format to use is determined from the filename + extension, if possible. + + Keyword options can be used to provide additional instructions + to the writer. If a writer doesn't recognise an option, it is + silently ignored. The available options are described in the + :doc:`image format documentation + <../handbook/image-file-formats>` for each writer. + + You can use a file object instead of a filename. In this case, + you must always specify the format. The file object must + implement the ``seek``, ``tell``, and ``write`` + methods, and be opened in binary mode. + + :param fp: A filename (string), pathlib.Path object or file object. + :param format: Optional format override. If omitted, the + format to use is determined from the filename extension. + If a file object was used instead of a filename, this + parameter should always be used. + :param options: Extra parameters to the image writer. + :returns: None + :exception KeyError: If the output format could not be determined + from the file name. Use the format option to solve this. + :exception IOError: If the file could not be written. The file + may have been created, and may contain partial data. + """ + + filename = "" + open_fp = False + if isPath(fp): + filename = fp + open_fp = True + elif HAS_PATHLIB and isinstance(fp, Path): + filename = str(fp) + open_fp = True + if not filename and hasattr(fp, "name") and isPath(fp.name): + # only set the name for metadata purposes + filename = fp.name + + # may mutate self! + self.load() + + save_all = False + if 'save_all' in params: + save_all = params.pop('save_all') + self.encoderinfo = params + self.encoderconfig = () + + preinit() + + ext = os.path.splitext(filename)[1].lower() + + if not format: + if ext not in EXTENSION: + init() + try: + format = EXTENSION[ext] + except KeyError: + raise ValueError('unknown file extension: {}'.format(ext)) + + if format.upper() not in SAVE: + init() + if save_all: + save_handler = SAVE_ALL[format.upper()] + else: + save_handler = SAVE[format.upper()] + + if open_fp: + # Open also for reading ("+"), because TIFF save_all + # writer needs to go back and edit the written data. + fp = builtins.open(filename, "w+b") + + try: + save_handler(self, fp, filename) + finally: + # do what we can to clean up + if open_fp: + fp.close() + + def seek(self, frame): + """ + Seeks to the given frame in this sequence file. If you seek + beyond the end of the sequence, the method raises an + **EOFError** exception. When a sequence file is opened, the + library automatically seeks to frame 0. + + Note that in the current version of the library, most sequence + formats only allows you to seek to the next frame. + + See :py:meth:`~PIL.Image.Image.tell`. + + :param frame: Frame number, starting at 0. + :exception EOFError: If the call attempts to seek beyond the end + of the sequence. + """ + + # overridden by file handlers + if frame != 0: + raise EOFError + + def show(self, title=None, command=None): + """ + Displays this image. This method is mainly intended for + debugging purposes. + + On Unix platforms, this method saves the image to a temporary + PPM file, and calls either the **xv** utility or the **display** + utility, depending on which one can be found. + + On macOS, this method saves the image to a temporary BMP file, and + opens it with the native Preview application. + + On Windows, it saves the image to a temporary BMP file, and uses + the standard BMP display utility to show it (usually Paint). + + :param title: Optional title to use for the image window, + where possible. + :param command: command used to show the image + """ + + _show(self, title=title, command=command) + + def split(self): + """ + Split this image into individual bands. This method returns a + tuple of individual image bands from an image. For example, + splitting an "RGB" image creates three new images each + containing a copy of one of the original bands (red, green, + blue). + + If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` + method can be more convenient and faster. + + :returns: A tuple containing bands. + """ + + self.load() + if self.im.bands == 1: + ims = [self.copy()] + else: + ims = map(self._new, self.im.split()) + return tuple(ims) + + def getchannel(self, channel): + """ + Returns an image containing a single channel of the source image. + + :param channel: What channel to return. Could be index + (0 for "R" channel of "RGB") or channel name + ("A" for alpha channel of "RGBA"). + :returns: An image in "L" mode. + + .. versionadded:: 4.3.0 + """ + self.load() + + if isStringType(channel): + try: + channel = self.getbands().index(channel) + except ValueError: + raise ValueError( + 'The image has no channel "{}"'.format(channel)) + + return self._new(self.im.getband(channel)) + + def tell(self): + """ + Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. + + :returns: Frame number, starting with 0. + """ + return 0 + + def thumbnail(self, size, resample=BICUBIC): + """ + Make this image into a thumbnail. This method modifies the + image to contain a thumbnail version of itself, no larger than + the given size. This method calculates an appropriate thumbnail + size to preserve the aspect of the image, calls the + :py:meth:`~PIL.Image.Image.draft` method to configure the file reader + (where applicable), and finally resizes the image. + + Note that this function modifies the :py:class:`~PIL.Image.Image` + object in place. If you need to use the full resolution image as well, + apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original + image. + + :param size: Requested size. + :param resample: Optional resampling filter. This can be one + of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, + :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.LANCZOS`. + If omitted, it defaults to :py:attr:`PIL.Image.BICUBIC`. + (was :py:attr:`PIL.Image.NEAREST` prior to version 2.5.0) + :returns: None + """ + + # preserve aspect ratio + x, y = self.size + if x > size[0]: + y = int(max(y * size[0] / x, 1)) + x = int(size[0]) + if y > size[1]: + x = int(max(x * size[1] / y, 1)) + y = int(size[1]) + size = x, y + + if size == self.size: + return + + self.draft(None, size) + + im = self.resize(size, resample) + + self.im = im.im + self.mode = im.mode + self.size = size + + self.readonly = 0 + self.pyaccess = None + + # FIXME: the different transform methods need further explanation + # instead of bloating the method docs, add a separate chapter. + def transform(self, size, method, data=None, resample=NEAREST, fill=1): + """ + Transforms this image. This method creates a new image with the + given size, and the same mode as the original, and copies data + to the new image using the given transform. + + :param size: The output size. + :param method: The transformation method. This is one of + :py:attr:`PIL.Image.EXTENT` (cut out a rectangular subregion), + :py:attr:`PIL.Image.AFFINE` (affine transform), + :py:attr:`PIL.Image.PERSPECTIVE` (perspective transform), + :py:attr:`PIL.Image.QUAD` (map a quadrilateral to a rectangle), or + :py:attr:`PIL.Image.MESH` (map a number of source quadrilaterals + in one operation). + :param data: Extra data to the transformation method. + :param resample: Optional resampling filter. It can be one of + :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), + :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:attr:`PIL.Image.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image + has mode "1" or "P", it is set to :py:attr:`PIL.Image.NEAREST`. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if self.mode == 'LA': + return self.convert('La').transform( + size, method, data, resample, fill).convert('LA') + + if self.mode == 'RGBA': + return self.convert('RGBa').transform( + size, method, data, resample, fill).convert('RGBA') + + if isinstance(method, ImageTransformHandler): + return method.transform(size, self, resample=resample, fill=fill) + + if hasattr(method, "getdata"): + # compatibility w. old-style transform objects + method, data = method.getdata() + + if data is None: + raise ValueError("missing method data") + + im = new(self.mode, size, None) + if method == MESH: + # list of quads + for box, quad in data: + im.__transformer(box, self, QUAD, quad, resample, fill) + else: + im.__transformer((0, 0)+size, self, method, data, resample, fill) + + return im + + def __transformer(self, box, image, method, data, + resample=NEAREST, fill=1): + w = box[2] - box[0] + h = box[3] - box[1] + + if method == AFFINE: + data = data[0:6] + + elif method == EXTENT: + # convert extent to an affine transform + x0, y0, x1, y1 = data + xs = float(x1 - x0) / w + ys = float(y1 - y0) / h + method = AFFINE + data = (xs, 0, x0, 0, ys, y0) + + elif method == PERSPECTIVE: + data = data[0:8] + + elif method == QUAD: + # quadrilateral warp. data specifies the four corners + # given as NW, SW, SE, and NE. + nw = data[0:2] + sw = data[2:4] + se = data[4:6] + ne = data[6:8] + x0, y0 = nw + As = 1.0 / w + At = 1.0 / h + data = (x0, (ne[0]-x0)*As, (sw[0]-x0)*At, + (se[0]-sw[0]-ne[0]+x0)*As*At, + y0, (ne[1]-y0)*As, (sw[1]-y0)*At, + (se[1]-sw[1]-ne[1]+y0)*As*At) + + else: + raise ValueError("unknown transformation method") + + if resample not in (NEAREST, BILINEAR, BICUBIC): + raise ValueError("unknown resampling filter") + + image.load() + + self.load() + + if image.mode in ("1", "P"): + resample = NEAREST + + self.im.transform2(box, image.im, method, data, resample, fill) + + def transpose(self, method): + """ + Transpose image (flip or rotate in 90 degree steps) + + :param method: One of :py:attr:`PIL.Image.FLIP_LEFT_RIGHT`, + :py:attr:`PIL.Image.FLIP_TOP_BOTTOM`, :py:attr:`PIL.Image.ROTATE_90`, + :py:attr:`PIL.Image.ROTATE_180`, :py:attr:`PIL.Image.ROTATE_270`, + :py:attr:`PIL.Image.TRANSPOSE` or :py:attr:`PIL.Image.TRANSVERSE`. + :returns: Returns a flipped or rotated copy of this image. + """ + + self.load() + return self._new(self.im.transpose(method)) + + def effect_spread(self, distance): + """ + Randomly spread pixels in an image. + + :param distance: Distance to spread pixels. + """ + self.load() + return self._new(self.im.effect_spread(distance)) + + def toqimage(self): + """Returns a QImage copy of this image""" + from . import ImageQt + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.toqimage(self) + + def toqpixmap(self): + """Returns a QPixmap copy of this image""" + from . import ImageQt + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.toqpixmap(self) + + +# -------------------------------------------------------------------- +# Abstract handlers. + +class ImagePointHandler(object): + # used as a mixin by point transforms (for use with im.point) + pass + + +class ImageTransformHandler(object): + # used as a mixin by geometry transforms (for use with im.transform) + pass + + +# -------------------------------------------------------------------- +# Factories + +# +# Debugging + +def _wedge(): + "Create greyscale wedge (for debugging only)" + + return Image()._new(core.wedge("L")) + + +def _check_size(size): + """ + Common check to enforce type and sanity check on size tuples + + :param size: Should be a 2 tuple of (width, height) + :returns: True, or raises a ValueError + """ + + if not isinstance(size, (list, tuple)): + raise ValueError("Size must be a tuple") + if len(size) != 2: + raise ValueError("Size must be a tuple of length 2") + if size[0] < 0 or size[1] < 0: + raise ValueError("Width and height must be >= 0") + + return True + + +def new(mode, size, color=0): + """ + Creates a new image with the given mode and size. + + :param mode: The mode to use for the new image. See: + :ref:`concept-modes`. + :param size: A 2-tuple, containing (width, height) in pixels. + :param color: What color to use for the image. Default is black. + If given, this should be a single integer or floating point value + for single-band modes, and a tuple for multi-band modes (one value + per band). When creating RGB images, you can also use color + strings as supported by the ImageColor module. If the color is + None, the image is not initialised. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + if color is None: + # don't initialize + return Image()._new(core.new(mode, size)) + + if isStringType(color): + # css3-style specifier + + from . import ImageColor + color = ImageColor.getcolor(color, mode) + + return Image()._new(core.fill(mode, size, color)) + + +def frombytes(mode, size, data, decoder_name="raw", *args): + """ + Creates a copy of an image memory from pixel data in a buffer. + + In its simplest form, this function takes three arguments + (mode, size, and unpacked pixel data). + + You can also use any pixel decoder supported by PIL. For more + information on available decoders, see the section + :ref:`Writing Your Own File Decoder `. + + Note that this function decodes pixel data only, not entire images. + If you have an entire image in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load + it. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A byte buffer containing raw data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw" and args == (): + args = mode + + im = new(mode, size) + im.frombytes(data, decoder_name, args) + return im + + +def fromstring(*args, **kw): + raise NotImplementedError("fromstring() has been removed. " + + "Please call frombytes() instead.") + + +def frombuffer(mode, size, data, decoder_name="raw", *args): + """ + Creates an image memory referencing pixel data in a byte buffer. + + This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data + in the byte buffer, where possible. This means that changes to the + original buffer object are reflected in this image). Not all modes can + share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". + + Note that this function decodes pixel data only, not entire images. + If you have an entire image file in a string, wrap it in a + **BytesIO** object, and use :py:func:`~PIL.Image.open` to load it. + + In the current version, the default parameters used for the "raw" decoder + differs from that used for :py:func:`~PIL.Image.frombytes`. This is a + bug, and will probably be fixed in a future release. The current release + issues a warning if you do this; to disable the warning, you should provide + the full set of parameters. See below for details. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A bytes or other buffer object containing raw + data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. For the + default encoder ("raw"), it's recommended that you provide the + full set of parameters:: + + frombuffer(mode, size, data, "raw", mode, 0, 1) + + :returns: An :py:class:`~PIL.Image.Image` object. + + .. versionadded:: 1.1.4 + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw": + if args == (): + warnings.warn( + "the frombuffer defaults may change in a future release; " + "for portability, change the call to read:\n" + " frombuffer(mode, size, data, 'raw', mode, 0, 1)", + RuntimeWarning, stacklevel=2 + ) + args = mode, 0, -1 # may change to (mode, 0, 1) post-1.1.6 + if args[0] in _MAPMODES: + im = new(mode, (1, 1)) + im = im._new( + core.map_buffer(data, size, decoder_name, None, 0, args) + ) + im.readonly = 1 + return im + + return frombytes(mode, size, data, decoder_name, args) + + +def fromarray(obj, mode=None): + """ + Creates an image memory from an object exporting the array interface + (using the buffer protocol). + + If obj is not contiguous, then the tobytes method is called + and :py:func:`~PIL.Image.frombuffer` is used. + + :param obj: Object with array interface + :param mode: Mode to use (will be determined from type if None) + See: :ref:`concept-modes`. + :returns: An image object. + + .. versionadded:: 1.1.6 + """ + arr = obj.__array_interface__ + shape = arr['shape'] + ndim = len(shape) + strides = arr.get('strides', None) + if mode is None: + try: + typekey = (1, 1) + shape[2:], arr['typestr'] + mode, rawmode = _fromarray_typemap[typekey] + except KeyError: + # print(typekey) + raise TypeError("Cannot handle this data type") + else: + rawmode = mode + if mode in ["1", "L", "I", "P", "F"]: + ndmax = 2 + elif mode == "RGB": + ndmax = 3 + else: + ndmax = 4 + if ndim > ndmax: + raise ValueError("Too many dimensions: %d > %d." % (ndim, ndmax)) + + size = shape[1], shape[0] + if strides is not None: + if hasattr(obj, 'tobytes'): + obj = obj.tobytes() + else: + obj = obj.tostring() + + return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) + + +def fromqimage(im): + """Creates an image instance from a QImage image""" + from . import ImageQt + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.fromqimage(im) + + +def fromqpixmap(im): + """Creates an image instance from a QPixmap image""" + from . import ImageQt + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.fromqpixmap(im) + + +_fromarray_typemap = { + # (shape, typestr) => mode, rawmode + # first two members of shape are set to one + ((1, 1), "|b1"): ("1", "1;8"), + ((1, 1), "|u1"): ("L", "L"), + ((1, 1), "|i1"): ("I", "I;8"), + ((1, 1), "u2"): ("I", "I;16B"), + ((1, 1), "i2"): ("I", "I;16BS"), + ((1, 1), "u4"): ("I", "I;32B"), + ((1, 1), "i4"): ("I", "I;32BS"), + ((1, 1), "f4"): ("F", "F;32BF"), + ((1, 1), "f8"): ("F", "F;64BF"), + ((1, 1, 2), "|u1"): ("LA", "LA"), + ((1, 1, 3), "|u1"): ("RGB", "RGB"), + ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), + } + +# shortcuts +_fromarray_typemap[((1, 1), _ENDIAN + "i4")] = ("I", "I") +_fromarray_typemap[((1, 1), _ENDIAN + "f4")] = ("F", "F") + + +def _decompression_bomb_check(size): + if MAX_IMAGE_PIXELS is None: + return + + pixels = size[0] * size[1] + + if pixels > MAX_IMAGE_PIXELS: + warnings.warn( + "Image size (%d pixels) exceeds limit of %d pixels, " + "could be decompression bomb DOS attack." % + (pixels, MAX_IMAGE_PIXELS), + DecompressionBombWarning) + + +def open(fp, mode="r"): + """ + Opens and identifies the given image file. + + This is a lazy operation; this function identifies the file, but + the file remains open and the actual image data is not read from + the file until you try to process the data (or call the + :py:meth:`~PIL.Image.Image.load` method). See + :py:func:`~PIL.Image.new`. + + :param fp: A filename (string), pathlib.Path object or a file object. + The file object must implement :py:meth:`~file.read`, + :py:meth:`~file.seek`, and :py:meth:`~file.tell` methods, + and be opened in binary mode. + :param mode: The mode. If given, this argument must be "r". + :returns: An :py:class:`~PIL.Image.Image` object. + :exception IOError: If the file cannot be found, or the image cannot be + opened and identified. + """ + + if mode != "r": + raise ValueError("bad mode %r" % mode) + + exclusive_fp = False + filename = "" + if isPath(fp): + filename = fp + elif HAS_PATHLIB and isinstance(fp, Path): + filename = str(fp.resolve()) + + if filename: + fp = builtins.open(filename, "rb") + exclusive_fp = True + + try: + fp.seek(0) + except (AttributeError, io.UnsupportedOperation): + fp = io.BytesIO(fp.read()) + exclusive_fp = True + + prefix = fp.read(16) + + preinit() + + def _open_core(fp, filename, prefix): + for i in ID: + try: + factory, accept = OPEN[i] + if not accept or accept(prefix): + fp.seek(0) + im = factory(fp, filename) + _decompression_bomb_check(im.size) + return im + except (SyntaxError, IndexError, TypeError, struct.error): + # Leave disabled by default, spams the logs with image + # opening failures that are entirely expected. + # logger.debug("", exc_info=True) + continue + return None + + im = _open_core(fp, filename, prefix) + + if im is None: + if init(): + im = _open_core(fp, filename, prefix) + + if im: + im._exclusive_fp = exclusive_fp + return im + + if exclusive_fp: + fp.close() + raise IOError("cannot identify image file %r" + % (filename if filename else fp)) + +# +# Image processing. + + +def alpha_composite(im1, im2): + """ + Alpha composite im2 over im1. + + :param im1: The first image. Must have mode RGBA. + :param im2: The second image. Must have mode RGBA, and the same size as + the first image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.alpha_composite(im1.im, im2.im)) + + +def blend(im1, im2, alpha): + """ + Creates a new image by interpolating between two input images, using + a constant alpha.:: + + out = image1 * (1.0 - alpha) + image2 * alpha + + :param im1: The first image. + :param im2: The second image. Must have the same mode and size as + the first image. + :param alpha: The interpolation alpha factor. If alpha is 0.0, a + copy of the first image is returned. If alpha is 1.0, a copy of + the second image is returned. There are no restrictions on the + alpha value. If necessary, the result is clipped to fit into + the allowed output range. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.blend(im1.im, im2.im, alpha)) + + +def composite(image1, image2, mask): + """ + Create composite image by blending images using a transparency mask. + + :param image1: The first image. + :param image2: The second image. Must have the same mode and + size as the first image. + :param mask: A mask image. This image can have mode + "1", "L", or "RGBA", and must have the same size as the + other two images. + """ + + image = image2.copy() + image.paste(image1, None, mask) + return image + + +def eval(image, *args): + """ + Applies the function (which should take one argument) to each pixel + in the given image. If the image has more than one band, the same + function is applied to each band. Note that the function is + evaluated once for each possible pixel value, so you cannot use + random components or other generators. + + :param image: The input image. + :param function: A function object, taking one integer argument. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + return image.point(args[0]) + + +def merge(mode, bands): + """ + Merge a set of single band images into a new multiband image. + + :param mode: The mode to use for the output image. See: + :ref:`concept-modes`. + :param bands: A sequence containing one single-band image for + each band in the output image. All bands must have the + same size. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if getmodebands(mode) != len(bands) or "*" in mode: + raise ValueError("wrong number of bands") + for band in bands[1:]: + if band.mode != getmodetype(mode): + raise ValueError("mode mismatch") + if band.size != bands[0].size: + raise ValueError("size mismatch") + for band in bands: + band.load() + return bands[0]._new(core.merge(mode, *[b.im for b in bands])) + + +# -------------------------------------------------------------------- +# Plugin registry + +def register_open(id, factory, accept=None): + """ + Register an image file plugin. This function should not be used + in application code. + + :param id: An image format identifier. + :param factory: An image file factory method. + :param accept: An optional function that can be used to quickly + reject images having another format. + """ + id = id.upper() + ID.append(id) + OPEN[id] = factory, accept + + +def register_mime(id, mimetype): + """ + Registers an image MIME type. This function should not be used + in application code. + + :param id: An image format identifier. + :param mimetype: The image MIME type for this format. + """ + MIME[id.upper()] = mimetype + + +def register_save(id, driver): + """ + Registers an image save function. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE[id.upper()] = driver + + +def register_save_all(id, driver): + """ + Registers an image function to save all the frames + of a multiframe format. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE_ALL[id.upper()] = driver + + +def register_extension(id, extension): + """ + Registers an image extension. This function should not be + used in application code. + + :param id: An image format identifier. + :param extension: An extension used for this format. + """ + EXTENSION[extension.lower()] = id.upper() + +def register_extensions(id, extensions): + """ + Registers image extensions. This function should not be + used in application code. + + :param id: An image format identifier. + :param extensions: A list of extensions used for this format. + """ + for extension in extensions: + register_extension(id, extension) + +def registered_extensions(): + """ + Returns a dictionary containing all file extensions belonging + to registered plugins + """ + if not bool(EXTENSION): + init() + return EXTENSION + + +def register_decoder(name, decoder): + """ + Registers an image decoder. This function should not be + used in application code. + + :param name: The name of the decoder + :param decoder: A callable(mode, args) that returns an + ImageFile.PyDecoder object + + .. versionadded:: 4.1.0 + """ + DECODERS[name] = decoder + + +def register_encoder(name, encoder): + """ + Registers an image encoder. This function should not be + used in application code. + + :param name: The name of the encoder + :param encoder: A callable(mode, args) that returns an + ImageFile.PyEncoder object + + .. versionadded:: 4.1.0 + """ + ENCODERS[name] = encoder + + +# -------------------------------------------------------------------- +# Simple display support. User code may override this. + +def _show(image, **options): + # override me, as necessary + _showxv(image, **options) + + +def _showxv(image, title=None, **options): + from . import ImageShow + ImageShow.show(image, title, **options) + + +# -------------------------------------------------------------------- +# Effects + +def effect_mandelbrot(size, extent, quality): + """ + Generate a Mandelbrot set covering the given extent. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param extent: The extent to cover, as a 4-tuple: + (x0, y0, x1, y2). + :param quality: Quality. + """ + return Image()._new(core.effect_mandelbrot(size, extent, quality)) + + +def effect_noise(size, sigma): + """ + Generate Gaussian noise centered around 128. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param sigma: Standard deviation of noise. + """ + return Image()._new(core.effect_noise(size, sigma)) + + +def linear_gradient(mode): + """ + Generate 256x256 linear gradient from black to white, top to bottom. + + :param mode: Input mode. + """ + return Image()._new(core.linear_gradient(mode)) + + +def radial_gradient(mode): + """ + Generate 256x256 radial gradient from black to white, centre to edge. + + :param mode: Input mode. + """ + return Image()._new(core.radial_gradient(mode)) + + +# -------------------------------------------------------------------- +# Resources + +def _apply_env_variables(env=None): + if env is None: + env = os.environ + + for var_name, setter in [ + ('PILLOW_ALIGNMENT', core.set_alignment), + ('PILLOW_BLOCK_SIZE', core.set_block_size), + ('PILLOW_BLOCKS_MAX', core.set_blocks_max), + ]: + if var_name not in env: + continue + + var = env[var_name].lower() + + units = 1 + for postfix, mul in [('k', 1024), ('m', 1024*1024)]: + if var.endswith(postfix): + units = mul + var = var[:-len(postfix)] + + try: + var = int(var) * units + except ValueError: + warnings.warn("{0} is not int".format(var_name)) + continue + + try: + setter(var) + except ValueError as e: + warnings.warn("{0}: {1}".format(var_name, e)) + +_apply_env_variables() +atexit.register(core.clear_cache) diff --git a/ascii2img/src/PIL/Image.pyc b/ascii2img/src/PIL/Image.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc0d8e57a77c0c61cc1de0c8a6f7382394f5348b GIT binary patch literal 85265 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 imRnml5u using 'renderingIntent' -> proof + colorspace -> using 'proofRenderingIntent' -> output + colorspace + + Added LCMS FLAGS support. + Added FLAGS["SOFTPROOFING"] as default flag for + buildProofTransform (otherwise the proof profile/intent + would be ignored). + + 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms + + 0.0.2 alpha Jan 6, 2002 + + Added try/except statements around type() checks of + potential CObjects... Python won't let you use type() + on them, and raises a TypeError (stupid, if you ask + me!) + + Added buildProofTransformFromOpenProfiles() function. + Additional fixes in DLL, see DLL code for details. + + 0.0.1 alpha first public release, Dec. 26, 2002 + + Known to-do list with current version (of Python interface, not pyCMSdll): + + none + +""" + +VERSION = "1.0.0 pil" + +# --------------------------------------------------------------------. + +core = _imagingcms + +# +# intent/direction values + +INTENT_PERCEPTUAL = 0 +INTENT_RELATIVE_COLORIMETRIC = 1 +INTENT_SATURATION = 2 +INTENT_ABSOLUTE_COLORIMETRIC = 3 + +DIRECTION_INPUT = 0 +DIRECTION_OUTPUT = 1 +DIRECTION_PROOF = 2 + +# +# flags + +FLAGS = { + "MATRIXINPUT": 1, + "MATRIXOUTPUT": 2, + "MATRIXONLY": (1 | 2), + "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot + # Don't create prelinearization tables on precalculated transforms + # (internal use): + "NOPRELINEARIZATION": 16, + "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) + "NOTCACHE": 64, # Inhibit 1-pixel cache + "NOTPRECALC": 256, + "NULLTRANSFORM": 512, # Don't transform anyway + "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy + "LOWRESPRECALC": 2048, # Use less memory to minimize resources + "WHITEBLACKCOMPENSATION": 8192, + "BLACKPOINTCOMPENSATION": 8192, + "GAMUTCHECK": 4096, # Out of Gamut alarm + "SOFTPROOFING": 16384, # Do softproofing + "PRESERVEBLACK": 32768, # Black preservation + "NODEFAULTRESOURCEDEF": 16777216, # CRD special + "GRIDPOINTS": lambda n: ((n) & 0xFF) << 16 # Gridpoints +} + +_MAX_FLAG = 0 +for flag in FLAGS.values(): + if isinstance(flag, int): + _MAX_FLAG = _MAX_FLAG | flag + + +# --------------------------------------------------------------------. +# Experimental PIL-level API +# --------------------------------------------------------------------. + +## +# Profile. + +class ImageCmsProfile(object): + + def __init__(self, profile): + """ + :param profile: Either a string representing a filename, + a file like object containing a profile or a + low-level profile object + + """ + + if isStringType(profile): + self._set(core.profile_open(profile), profile) + elif hasattr(profile, "read"): + self._set(core.profile_frombytes(profile.read())) + elif isinstance(profile, _imagingcms.CmsProfile): + self._set(profile) + else: + raise TypeError("Invalid type for Profile") + + def _set(self, profile, filename=None): + self.profile = profile + self.filename = filename + if profile: + self.product_name = None # profile.product_name + self.product_info = None # profile.product_info + else: + self.product_name = None + self.product_info = None + + def tobytes(self): + """ + Returns the profile in a format suitable for embedding in + saved images. + + :returns: a bytes object containing the ICC profile. + """ + + return core.profile_tobytes(self.profile) + + +class ImageCmsTransform(Image.ImagePointHandler): + + """ + Transform. This can be used with the procedural API, or with the standard + Image.point() method. + + Will return the output profile in the output.info['icc_profile']. + """ + + def __init__(self, input, output, input_mode, output_mode, + intent=INTENT_PERCEPTUAL, proof=None, + proof_intent=INTENT_ABSOLUTE_COLORIMETRIC, flags=0): + if proof is None: + self.transform = core.buildTransform( + input.profile, output.profile, + input_mode, output_mode, + intent, + flags + ) + else: + self.transform = core.buildProofTransform( + input.profile, output.profile, proof.profile, + input_mode, output_mode, + intent, proof_intent, + flags + ) + # Note: inputMode and outputMode are for pyCMS compatibility only + self.input_mode = self.inputMode = input_mode + self.output_mode = self.outputMode = output_mode + + self.output_profile = output + + def point(self, im): + return self.apply(im) + + def apply(self, im, imOut=None): + im.load() + if imOut is None: + imOut = Image.new(self.output_mode, im.size, None) + self.transform.apply(im.im.id, imOut.im.id) + imOut.info['icc_profile'] = self.output_profile.tobytes() + return imOut + + def apply_in_place(self, im): + im.load() + if im.mode != self.output_mode: + raise ValueError("mode mismatch") # wrong output mode + self.transform.apply(im.im.id, im.im.id) + im.info['icc_profile'] = self.output_profile.tobytes() + return im + + +def get_display_profile(handle=None): + """ (experimental) Fetches the profile for the current display device. + :returns: None if the profile is not known. + """ + + if sys.platform == "win32": + from PIL import ImageWin + if isinstance(handle, ImageWin.HDC): + profile = core.get_display_profile_win32(handle, 1) + else: + profile = core.get_display_profile_win32(handle or 0) + else: + try: + get = _imagingcms.get_display_profile + except AttributeError: + return None + else: + profile = get() + return ImageCmsProfile(profile) + + +# --------------------------------------------------------------------. +# pyCMS compatible layer +# --------------------------------------------------------------------. + +class PyCMSError(Exception): + + """ (pyCMS) Exception class. + This is used for all errors in the pyCMS API. """ + pass + + +def profileToProfile( + im, inputProfile, outputProfile, renderingIntent=INTENT_PERCEPTUAL, + outputMode=None, inPlace=0, flags=0): + """ + (pyCMS) Applies an ICC transformation to a given image, mapping from + inputProfile to outputProfile. + + If the input or output profiles specified are not valid filenames, a + PyCMSError will be raised. If inPlace == TRUE and outputMode != im.mode, + a PyCMSError will be raised. If an error occurs during application of + the profiles, a PyCMSError will be raised. If outputMode is not a mode + supported by the outputProfile (or by pyCMS), a PyCMSError will be + raised. + + This function applies an ICC transformation to im from inputProfile's + color space to outputProfile's color space using the specified rendering + intent to decide how to handle out-of-gamut colors. + + OutputMode can be used to specify that a color mode conversion is to + be done using these profiles, but the specified profiles must be able + to handle that mode. I.e., if converting im from RGB to CMYK using + profiles, the input profile must handle RGB data, and the output + profile must handle CMYK data. + + :param im: An open PIL image object (i.e. Image.new(...) or + Image.open(...), etc.) + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this image, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this image, or a profile object + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param outputMode: A valid PIL mode for the output image (i.e. "RGB", + "CMYK", etc.). Note: if rendering the image "inPlace", outputMode + MUST be the same mode as the input, or omitted completely. If + omitted, the outputMode will be the same as the mode of the input + image (im.mode) + :param inPlace: Boolean (1 = True, None or 0 = False). If True, the + original image is modified in-place, and None is returned. If False + (default), a new Image object is returned with the transform applied. + :param flags: Integer (0-...) specifying additional flags + :returns: Either None or a new PIL image object, depending on value of + inPlace + :exception PyCMSError: + """ + + if outputMode is None: + outputMode = im.mode + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError( + "flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + transform = ImageCmsTransform( + inputProfile, outputProfile, im.mode, outputMode, + renderingIntent, flags=flags + ) + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + return imOut + + +def getOpenProfile(profileFilename): + """ + (pyCMS) Opens an ICC profile file. + + The PyCMSProfile object can be passed back into pyCMS for use in creating + transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). + + If profileFilename is not a vaild filename for an ICC profile, a PyCMSError + will be raised. + + :param profileFilename: String, as a valid filename path to the ICC profile + you wish to open, or a file-like object. + :returns: A CmsProfile class object. + :exception PyCMSError: + """ + + try: + return ImageCmsProfile(profileFilename) + except (IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def buildTransform( + inputProfile, outputProfile, inMode, outMode, + renderingIntent=INTENT_PERCEPTUAL, flags=0): + """ + (pyCMS) Builds an ICC transform mapping from the inputProfile to the + outputProfile. Use applyTransform to apply the transform to a given + image. + + If the input or output profiles specified are not valid filenames, a + PyCMSError will be raised. If an error occurs during creation of the + transform, a PyCMSError will be raised. + + If inMode or outMode are not a mode supported by the outputProfile (or + by pyCMS), a PyCMSError will be raised. + + This function builds and returns an ICC transform from the inputProfile + to the outputProfile using the renderingIntent to determine what to do + with out-of-gamut colors. It will ONLY work for converting images that + are in inMode to images that are in outMode color format (PIL mode, + i.e. "RGB", "RGBA", "CMYK", etc.). + + Building the transform is a fair part of the overhead in + ImageCms.profileToProfile(), so if you're planning on converting multiple + images using the same input/output settings, this can save you time. + Once you have a transform object, it can be used with + ImageCms.applyProfile() to convert images without the need to re-compute + the lookup table for the transform. + + The reason pyCMS returns a class object rather than a handle directly + to the transform is that it needs to keep track of the PIL input/output + modes that the transform is meant for. These attributes are stored in + the "inMode" and "outMode" attributes of the object (which can be + manually overridden if you really want to, but I don't know of any + time that would be of use, or would even work). + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError( + "flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + return ImageCmsTransform( + inputProfile, outputProfile, inMode, outMode, + renderingIntent, flags=flags) + except (IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def buildProofTransform( + inputProfile, outputProfile, proofProfile, inMode, outMode, + renderingIntent=INTENT_PERCEPTUAL, + proofRenderingIntent=INTENT_ABSOLUTE_COLORIMETRIC, + flags=FLAGS["SOFTPROOFING"]): + """ + (pyCMS) Builds an ICC transform mapping from the inputProfile to the + outputProfile, but tries to simulate the result that would be + obtained on the proofProfile device. + + If the input, output, or proof profiles specified are not valid + filenames, a PyCMSError will be raised. + + If an error occurs during creation of the transform, a PyCMSError will + be raised. + + If inMode or outMode are not a mode supported by the outputProfile + (or by pyCMS), a PyCMSError will be raised. + + This function builds and returns an ICC transform from the inputProfile + to the outputProfile, but tries to simulate the result that would be + obtained on the proofProfile device using renderingIntent and + proofRenderingIntent to determine what to do with out-of-gamut + colors. This is known as "soft-proofing". It will ONLY work for + converting images that are in inMode to images that are in outMode + color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). + + Usage of the resulting transform object is exactly the same as with + ImageCms.buildTransform(). + + Proof profiling is generally used when using an output device to get a + good idea of what the final printed/displayed image would look like on + the proofProfile device when it's quicker and easier to use the + output device for judging color. Generally, this means that the + output device is a monitor, or a dye-sub printer (etc.), and the simulated + device is something more expensive, complicated, or time consuming + (making it difficult to make a real print for color judgement purposes). + + Soft-proofing basically functions by adjusting the colors on the + output device to match the colors of the device being simulated. However, + when the simulated device has a much wider gamut than the output + device, you may obtain marginal results. + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + (monitor, usually) profile you wish to use for this transform, or a + profile object + :param proofProfile: String, as a valid filename path to the ICC proof + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the input->proof (simulated) transform + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param proofRenderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for proof->output transform + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError( + "flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + if not isinstance(proofProfile, ImageCmsProfile): + proofProfile = ImageCmsProfile(proofProfile) + return ImageCmsTransform( + inputProfile, outputProfile, inMode, outMode, renderingIntent, + proofProfile, proofRenderingIntent, flags) + except (IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + +buildTransformFromOpenProfiles = buildTransform +buildProofTransformFromOpenProfiles = buildProofTransform + + +def applyTransform(im, transform, inPlace=0): + """ + (pyCMS) Applies a transform to a given image. + + If im.mode != transform.inMode, a PyCMSError is raised. + + If inPlace == TRUE and transform.inMode != transform.outMode, a + PyCMSError is raised. + + If im.mode, transfer.inMode, or transfer.outMode is not supported by + pyCMSdll or the profiles you used for the transform, a PyCMSError is + raised. + + If an error occurs while the transform is being applied, a PyCMSError + is raised. + + This function applies a pre-calculated transform (from + ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) + to an image. The transform can be used for multiple images, saving + considerable calculation time if doing the same conversion multiple times. + + If you want to modify im in-place instead of receiving a new image as + the return value, set inPlace to TRUE. This can only be done if + transform.inMode and transform.outMode are the same, because we can't + change the mode in-place (the buffer sizes for some modes are + different). The default behavior is to return a new Image object of + the same dimensions in mode transform.outMode. + + :param im: A PIL Image object, and im.mode must be the same as the inMode + supported by the transform. + :param transform: A valid CmsTransform class object + :param inPlace: Bool (1 == True, 0 or None == False). If True, im is + modified in place and None is returned, if False, a new Image object + with the transform applied is returned (and im is not changed). The + default is False. + :returns: Either None, or a new PIL Image object, depending on the value of + inPlace. The profile will be returned in the image's + info['icc_profile']. + :exception PyCMSError: + """ + + try: + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (TypeError, ValueError) as v: + raise PyCMSError(v) + + return imOut + + +def createProfile(colorSpace, colorTemp=-1): + """ + (pyCMS) Creates a profile. + + If colorSpace not in ["LAB", "XYZ", "sRGB"], a PyCMSError is raised + + If using LAB and colorTemp != a positive integer, a PyCMSError is raised. + + If an error occurs while creating the profile, a PyCMSError is raised. + + Use this function to create common profiles on-the-fly instead of + having to supply a profile on disk and knowing the path to it. It + returns a normal CmsProfile object that can be passed to + ImageCms.buildTransformFromOpenProfiles() to create a transform to apply + to images. + + :param colorSpace: String, the color space of the profile you wish to + create. + Currently only "LAB", "XYZ", and "sRGB" are supported. + :param colorTemp: Positive integer for the white point for the profile, in + degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 + illuminant if omitted (5000k). colorTemp is ONLY applied to LAB + profiles, and is ignored for XYZ and sRGB. + :returns: A CmsProfile class object + :exception PyCMSError: + """ + + if colorSpace not in ["LAB", "XYZ", "sRGB"]: + raise PyCMSError( + "Color space not supported for on-the-fly profile creation (%s)" + % colorSpace) + + if colorSpace == "LAB": + try: + colorTemp = float(colorTemp) + except: + raise PyCMSError( + "Color temperature must be numeric, \"%s\" not valid" + % colorTemp) + + try: + return core.createProfile(colorSpace, colorTemp) + except (TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileName(profile): + """ + + (pyCMS) Gets the internal product name for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised If an error occurs while trying to obtain the + name tag, a PyCMSError is raised. + + Use this function to obtain the INTERNAL name of the profile (stored + in an ICC tag in the profile itself), usually the one used when the + profile was originally created. Sometimes this tag also contains + additional information supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal name of the profile as stored + in an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # do it in python, not c. + # // name was "%s - %s" (model, manufacturer) || Description , + # // but if the Model and Manufacturer were the same or the model + # // was long, Just the model, in 1.x + model = profile.profile.product_model + manufacturer = profile.profile.product_manufacturer + + if not (model or manufacturer): + return profile.profile.product_description + "\n" + if not manufacturer or len(model) > 30: + return model + "\n" + return "%s - %s\n" % (model, manufacturer) + + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileInfo(profile): + """ + (pyCMS) Gets the internal product information for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the info tag, a PyCMSError + is raised + + Use this function to obtain the information stored in the profile's + info tag. This often contains details about the profile, and how it + was created, as supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # add an extra newline to preserve pyCMS compatibility + # Python, not C. the white point bits weren't working well, + # so skipping. + # // info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint + description = profile.profile.product_description + cpright = profile.profile.product_copyright + arr = [] + for elt in (description, cpright): + if elt: + arr.append(elt) + return "\r\n\r\n".join(arr) + "\r\n\r\n" + + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileCopyright(profile): + """ + (pyCMS) Gets the copyright for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the copyright tag, a PyCMSError + is raised + + Use this function to obtain the information stored in the profile's + copyright tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.product_copyright + "\n" + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileManufacturer(profile): + """ + (pyCMS) Gets the manufacturer for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the manufacturer tag, a + PyCMSError is raised + + Use this function to obtain the information stored in the profile's + manufacturer tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.product_manufacturer + "\n" + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileModel(profile): + """ + (pyCMS) Gets the model for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the model tag, a PyCMSError + is raised + + Use this function to obtain the information stored in the profile's + model tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.product_model + "\n" + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileDescription(profile): + """ + (pyCMS) Gets the description for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the description tag, a PyCMSError + is raised + + Use this function to obtain the information stored in the profile's + description tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in an + ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.product_description + "\n" + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getDefaultIntent(profile): + """ + (pyCMS) Gets the default intent name for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the default intent, a + PyCMSError is raised. + + Use this function to determine the default (and usually best optimized) + rendering intent for this profile. Most profiles support multiple + rendering intents, but are intended mostly for one type of conversion. + If you wish to use a different intent than returned, use + ImageCms.isIntentSupported() to verify it will work first. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: Integer 0-3 specifying the default rendering intent for this + profile. + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.rendering_intent + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def isIntentSupported(profile, intent, direction): + """ + (pyCMS) Checks if a given intent is supported. + + Use this function to verify that you can use your desired + renderingIntent with profile, and that profile can be used for the + input/output/proof profile as you desire. + + Some profiles are created specifically for one "direction", can cannot + be used for others. Some profiles can only be used for certain + rendering intents... so it's best to either verify this before trying + to create a transform with them (using this function), or catch the + potential PyCMSError that will occur if they don't support the modes + you select. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :param intent: Integer (0-3) specifying the rendering intent you wish to + use with this profile + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param direction: Integer specifying if the profile is to be used for input, + output, or proof + + INPUT = 0 (or use ImageCms.DIRECTION_INPUT) + OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT) + PROOF = 2 (or use ImageCms.DIRECTION_PROOF) + + :returns: 1 if the intent/direction are supported, -1 if they are not. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # FIXME: I get different results for the same data w. different + # compilers. Bug in LittleCMS or in the binding? + if profile.profile.is_intent_supported(intent, direction): + return 1 + else: + return -1 + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def versions(): + """ + (pyCMS) Fetches versions. + """ + + return ( + VERSION, core.littlecms_version, + sys.version.split()[0], Image.VERSION + ) + +# -------------------------------------------------------------------- + +if __name__ == "__main__": + # create a cheap manual from the __doc__ strings for the functions above + + print(__doc__) + + for f in dir(sys.modules[__name__]): + doc = None + try: + exec("doc = %s.__doc__" % (f)) + if "pyCMS" in doc: + # so we don't get the __doc__ string for imported modules + print("=" * 80) + print("%s" % f) + print(doc) + except (AttributeError, TypeError): + pass diff --git a/ascii2img/src/PIL/ImageColor.py b/ascii2img/src/PIL/ImageColor.py new file mode 100644 index 0000000..1c7bc31 --- /dev/null +++ b/ascii2img/src/PIL/ImageColor.py @@ -0,0 +1,294 @@ +# +# The Python Imaging Library +# $Id$ +# +# map CSS3-style colour description strings to RGB +# +# History: +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-15 fl Added RGBA support +# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 +# 2004-07-19 fl Fixed gray/grey spelling issues +# 2009-03-05 fl Fixed rounding error in grayscale calculation +# +# Copyright (c) 2002-2004 by Secret Labs AB +# Copyright (c) 2002-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +import re + + +def getrgb(color): + """ + Convert a color string to an RGB tuple. If the string cannot be parsed, + this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(red, green, blue[, alpha])`` + """ + color = color.lower() + + rgb = colormap.get(color, None) + if rgb: + if isinstance(rgb, tuple): + return rgb + colormap[color] = rgb = getrgb(rgb) + return rgb + + # check for known string formats + if re.match('#[a-f0-9]{3}$', color): + return ( + int(color[1]*2, 16), + int(color[2]*2, 16), + int(color[3]*2, 16), + ) + + if re.match('#[a-f0-9]{4}$', color): + return ( + int(color[1]*2, 16), + int(color[2]*2, 16), + int(color[3]*2, 16), + int(color[4]*2, 16), + ) + + if re.match('#[a-f0-9]{6}$', color): + return ( + int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16), + ) + + if re.match('#[a-f0-9]{8}$', color): + return ( + int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16), + int(color[7:9], 16), + ) + + m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return ( + int(m.group(1)), + int(m.group(2)), + int(m.group(3)) + ) + + m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) + if m: + return ( + int((int(m.group(1)) * 255) / 100.0 + 0.5), + int((int(m.group(2)) * 255) / 100.0 + 0.5), + int((int(m.group(3)) * 255) / 100.0 + 0.5) + ) + + m = re.match(r"hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) + if m: + from colorsys import hls_to_rgb + rgb = hls_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(3)) / 100.0, + float(m.group(2)) / 100.0, + ) + return ( + int(rgb[0] * 255 + 0.5), + int(rgb[1] * 255 + 0.5), + int(rgb[2] * 255 + 0.5) + ) + + m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", + color) + if m: + return ( + int(m.group(1)), + int(m.group(2)), + int(m.group(3)), + int(m.group(4)) + ) + raise ValueError("unknown color specifier: %r" % color) + + +def getcolor(color, mode): + """ + Same as :py:func:`~PIL.ImageColor.getrgb`, but converts the RGB value to a + greyscale value if the mode is not color or a palette image. If the string + cannot be parsed, this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(graylevel [, alpha]) or (red, green, blue[, alpha])`` + """ + # same as getrgb, but converts the result to the given mode + color, alpha = getrgb(color), 255 + if len(color) == 4: + color, alpha = color[0:3], color[3] + + if Image.getmodebase(mode) == "L": + r, g, b = color + color = (r*299 + g*587 + b*114)//1000 + if mode[-1] == 'A': + return (color, alpha) + else: + if mode[-1] == 'A': + return color + (alpha,) + return color + +colormap = { + # X11 colour table from https://drafts.csswg.org/css-color-4/, with + # gray/grey spelling issues fixed. This is a superset of HTML 4.0 + # colour names used in CSS 1. + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgrey": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkslategrey": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dimgrey": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "grey": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgreen": "#90ee90", + "lightgray": "#d3d3d3", + "lightgrey": "#d3d3d3", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightslategrey": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370db", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#db7093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "rebeccapurple": "#663399", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "slategrey": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", +} diff --git a/ascii2img/src/PIL/ImageDraw.py b/ascii2img/src/PIL/ImageDraw.py new file mode 100644 index 0000000..89df273 --- /dev/null +++ b/ascii2img/src/PIL/ImageDraw.py @@ -0,0 +1,386 @@ +# +# The Python Imaging Library +# $Id$ +# +# drawing interface operations +# +# History: +# 1996-04-13 fl Created (experimental) +# 1996-08-07 fl Filled polygons, ellipses. +# 1996-08-13 fl Added text support +# 1998-06-28 fl Handle I and F images +# 1998-12-29 fl Added arc; use arc primitive to draw ellipses +# 1999-01-10 fl Added shape stuff (experimental) +# 1999-02-06 fl Added bitmap support +# 1999-02-11 fl Changed all primitives to take options +# 1999-02-20 fl Fixed backwards compatibility +# 2000-10-12 fl Copy on write, when necessary +# 2001-02-18 fl Use default ink for bitmap/text also in fill mode +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing +# 2002-12-11 fl Refactored low-level drawing API (work in progress) +# 2004-08-26 fl Made Draw() a factory function, added getdraw() support +# 2004-09-04 fl Added width support to line primitive +# 2004-09-10 fl Added font mode handling +# 2006-06-19 fl Added font bearing support (getmask2) +# +# Copyright (c) 1997-2006 by Secret Labs AB +# Copyright (c) 1996-2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import numbers + +from . import Image, ImageColor +from ._util import isStringType + +""" +A simple 2D drawing interface for PIL images. +

+Application code should use the Draw factory, instead of +directly. +""" + + +class ImageDraw(object): + + def __init__(self, im, mode=None): + """ + Create a drawing instance. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + im.load() + if im.readonly: + im._copy() # make it writeable + blend = 0 + if mode is None: + mode = im.mode + if mode != im.mode: + if mode == "RGBA" and im.mode == "RGB": + blend = 1 + else: + raise ValueError("mode mismatch") + if mode == "P": + self.palette = im.palette + else: + self.palette = None + self.im = im.im + self.draw = Image.core.draw(self.im, blend) + self.mode = mode + if mode in ("I", "F"): + self.ink = self.draw.draw_ink(1, mode) + else: + self.ink = self.draw.draw_ink(-1, mode) + if mode in ("1", "P", "I", "F"): + # FIXME: fix Fill2 to properly support matte for I+F images + self.fontmode = "1" + else: + self.fontmode = "L" # aliasing is okay for other modes + self.fill = 0 + self.font = None + + def getfont(self): + """ + Get the current default font. + + :returns: An image font.""" + if not self.font: + # FIXME: should add a font repository + from . import ImageFont + self.font = ImageFont.load_default() + return self.font + + def _getink(self, ink, fill=None): + if ink is None and fill is None: + if self.fill: + fill = self.ink + else: + ink = self.ink + else: + if ink is not None: + if isStringType(ink): + ink = ImageColor.getcolor(ink, self.mode) + if self.palette and not isinstance(ink, numbers.Number): + ink = self.palette.getcolor(ink) + ink = self.draw.draw_ink(ink, self.mode) + if fill is not None: + if isStringType(fill): + fill = ImageColor.getcolor(fill, self.mode) + if self.palette and not isinstance(fill, numbers.Number): + fill = self.palette.getcolor(fill) + fill = self.draw.draw_ink(fill, self.mode) + return ink, fill + + def arc(self, xy, start, end, fill=None): + """Draw an arc.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_arc(xy, start, end, ink) + + def bitmap(self, xy, bitmap, fill=None): + """Draw a bitmap.""" + bitmap.load() + ink, fill = self._getink(fill) + if ink is None: + ink = fill + if ink is not None: + self.draw.draw_bitmap(xy, bitmap.im, ink) + + def chord(self, xy, start, end, fill=None, outline=None): + """Draw a chord.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_chord(xy, start, end, fill, 1) + if ink is not None: + self.draw.draw_chord(xy, start, end, ink, 0) + + def ellipse(self, xy, fill=None, outline=None): + """Draw an ellipse.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_ellipse(xy, fill, 1) + if ink is not None: + self.draw.draw_ellipse(xy, ink, 0) + + def line(self, xy, fill=None, width=0): + """Draw a line, or a connected sequence of line segments.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_lines(xy, ink, width) + + def shape(self, shape, fill=None, outline=None): + """(Experimental) Draw a shape.""" + shape.close() + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_outline(shape, fill, 1) + if ink is not None: + self.draw.draw_outline(shape, ink, 0) + + def pieslice(self, xy, start, end, fill=None, outline=None): + """Draw a pieslice.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_pieslice(xy, start, end, fill, 1) + if ink is not None: + self.draw.draw_pieslice(xy, start, end, ink, 0) + + def point(self, xy, fill=None): + """Draw one or more individual pixels.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_points(xy, ink) + + def polygon(self, xy, fill=None, outline=None): + """Draw a polygon.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_polygon(xy, fill, 1) + if ink is not None: + self.draw.draw_polygon(xy, ink, 0) + + def rectangle(self, xy, fill=None, outline=None): + """Draw a rectangle.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_rectangle(xy, fill, 1) + if ink is not None: + self.draw.draw_rectangle(xy, ink, 0) + + def _multiline_check(self, text): + """Draw text.""" + split_character = "\n" if isinstance(text, str) else b"\n" + + return split_character in text + + def _multiline_split(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + + return text.split(split_character) + + def text(self, xy, text, fill=None, font=None, anchor=None, + *args, **kwargs): + if self._multiline_check(text): + return self.multiline_text(xy, text, fill, font, anchor, + *args, **kwargs) + ink, fill = self._getink(fill) + if font is None: + font = self.getfont() + if ink is None: + ink = fill + if ink is not None: + try: + mask, offset = font.getmask2(text, self.fontmode, *args, **kwargs) + xy = xy[0] + offset[0], xy[1] + offset[1] + except AttributeError: + try: + mask = font.getmask(text, self.fontmode, *args, **kwargs) + except TypeError: + mask = font.getmask(text) + self.draw.draw_bitmap(xy, mask, ink) + + def multiline_text(self, xy, text, fill=None, font=None, anchor=None, + spacing=4, align="left", direction=None, features=None): + widths = [] + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self.textsize('A', font=font)[1] + spacing + for line in lines: + line_width, line_height = self.textsize(line, font) + widths.append(line_width) + max_width = max(max_width, line_width) + left, top = xy + for idx, line in enumerate(lines): + if align == "left": + pass # left = x + elif align == "center": + left += (max_width - widths[idx]) / 2.0 + elif align == "right": + left += (max_width - widths[idx]) + else: + assert False, 'align must be "left", "center" or "right"' + self.text((left, top), line, fill, font, anchor, + direction=direction, features=features) + top += line_spacing + left = xy[0] + + def textsize(self, text, font=None, spacing=4, direction=None, + features=None): + """Get the size of a given string, in pixels.""" + if self._multiline_check(text): + return self.multiline_textsize(text, font, spacing, + direction, features) + + if font is None: + font = self.getfont() + return font.getsize(text, direction, features) + + def multiline_textsize(self, text, font=None, spacing=4, direction=None, + features=None): + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self.textsize('A', font=font)[1] + spacing + for line in lines: + line_width, line_height = self.textsize(line, font, spacing, + direction, features) + max_width = max(max_width, line_width) + return max_width, len(lines)*line_spacing + + +def Draw(im, mode=None): + """ + A simple 2D drawing interface for PIL images. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + try: + return im.getdraw(mode) + except AttributeError: + return ImageDraw(im, mode) + + +# experimental access to the outline API +try: + Outline = Image.core.outline +except AttributeError: + Outline = None + + +def getdraw(im=None, hints=None): + """ + (Experimental) A more advanced 2D drawing interface for PIL images, + based on the WCK interface. + + :param im: The image to draw in. + :param hints: An optional list of hints. + :returns: A (drawing context, drawing resource factory) tuple. + """ + # FIXME: this needs more work! + # FIXME: come up with a better 'hints' scheme. + handler = None + if not hints or "nicest" in hints: + try: + from . import _imagingagg as handler + except ImportError: + pass + if handler is None: + from . import ImageDraw2 as handler + if im: + im = handler.Draw(im) + return im, handler + + +def floodfill(image, xy, value, border=None, thresh=0): + """ + (experimental) Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of non- + homogeneous, but similar, colors. + """ + # based on an implementation by Eric S. Raymond + pixel = image.load() + x, y = xy + try: + background = pixel[x, y] + if _color_diff(value, background) <= thresh: + return # seed point already has fill color + pixel[x, y] = value + except (ValueError, IndexError): + return # seed point outside image + edge = [(x, y)] + if border is None: + while edge: + newedge = [] + for (x, y) in edge: + for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): + try: + p = pixel[s, t] + except IndexError: + pass + else: + if _color_diff(p, background) <= thresh: + pixel[s, t] = value + newedge.append((s, t)) + edge = newedge + else: + while edge: + newedge = [] + for (x, y) in edge: + for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): + try: + p = pixel[s, t] + except IndexError: + pass + else: + if p != value and p != border: + pixel[s, t] = value + newedge.append((s, t)) + edge = newedge + + +def _color_diff(rgb1, rgb2): + """ + Uses 1-norm distance to calculate difference between two rgb values. + """ + return abs(rgb1[0]-rgb2[0]) + abs(rgb1[1]-rgb2[1]) + abs(rgb1[2]-rgb2[2]) diff --git a/ascii2img/src/PIL/ImageDraw2.py b/ascii2img/src/PIL/ImageDraw2.py new file mode 100644 index 0000000..a176335 --- /dev/null +++ b/ascii2img/src/PIL/ImageDraw2.py @@ -0,0 +1,111 @@ +# +# The Python Imaging Library +# $Id$ +# +# WCK-style drawing interface operations +# +# History: +# 2003-12-07 fl created +# 2005-05-15 fl updated; added to PIL as ImageDraw2 +# 2005-05-15 fl added text support +# 2005-05-20 fl added arc/chord/pieslice support +# +# Copyright (c) 2003-2005 by Secret Labs AB +# Copyright (c) 2003-2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath + + +class Pen(object): + def __init__(self, color, width=1, opacity=255): + self.color = ImageColor.getrgb(color) + self.width = width + + +class Brush(object): + def __init__(self, color, opacity=255): + self.color = ImageColor.getrgb(color) + + +class Font(object): + def __init__(self, color, file, size=12): + # FIXME: add support for bitmap fonts + self.color = ImageColor.getrgb(color) + self.font = ImageFont.truetype(file, size) + + +class Draw(object): + + def __init__(self, image, size=None, color=None): + if not hasattr(image, "im"): + image = Image.new(image, size, color) + self.draw = ImageDraw.Draw(image) + self.image = image + self.transform = None + + def flush(self): + return self.image + + def render(self, op, xy, pen, brush=None): + # handle color arguments + outline = fill = None + width = 1 + if isinstance(pen, Pen): + outline = pen.color + width = pen.width + elif isinstance(brush, Pen): + outline = brush.color + width = brush.width + if isinstance(brush, Brush): + fill = brush.color + elif isinstance(pen, Brush): + fill = pen.color + # handle transformation + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + # render the item + if op == "line": + self.draw.line(xy, fill=outline, width=width) + else: + getattr(self.draw, op)(xy, fill=fill, outline=outline) + + def settransform(self, offset): + (xoffset, yoffset) = offset + self.transform = (1, 0, xoffset, 0, 1, yoffset) + + def arc(self, xy, start, end, *options): + self.render("arc", xy, start, end, *options) + + def chord(self, xy, start, end, *options): + self.render("chord", xy, start, end, *options) + + def ellipse(self, xy, *options): + self.render("ellipse", xy, *options) + + def line(self, xy, *options): + self.render("line", xy, *options) + + def pieslice(self, xy, start, end, *options): + self.render("pieslice", xy, start, end, *options) + + def polygon(self, xy, *options): + self.render("polygon", xy, *options) + + def rectangle(self, xy, *options): + self.render("rectangle", xy, *options) + + def symbol(self, xy, symbol, *options): + raise NotImplementedError("not in this version") + + def text(self, xy, text, font): + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + self.draw.text(xy, text, font=font.font, fill=font.color) + + def textsize(self, text, font): + return self.draw.textsize(text, font=font.font) diff --git a/ascii2img/src/PIL/ImageEnhance.py b/ascii2img/src/PIL/ImageEnhance.py new file mode 100644 index 0000000..11c9c3a --- /dev/null +++ b/ascii2img/src/PIL/ImageEnhance.py @@ -0,0 +1,100 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image enhancement classes +# +# For a background, see "Image Processing By Interpolation and +# Extrapolation", Paul Haeberli and Douglas Voorhies. Available +# at http://www.graficaobscura.com/interp/index.html +# +# History: +# 1996-03-23 fl Created +# 2009-06-16 fl Fixed mean calculation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFilter, ImageStat + + +class _Enhance(object): + + def enhance(self, factor): + """ + Returns an enhanced image. + + :param factor: A floating point value controlling the enhancement. + Factor 1.0 always returns a copy of the original image, + lower factors mean less color (brightness, contrast, + etc), and higher values more. There are no restrictions + on this value. + :rtype: :py:class:`~PIL.Image.Image` + """ + return Image.blend(self.degenerate, self.image, factor) + + +class Color(_Enhance): + """Adjust image color balance. + + This class can be used to adjust the colour balance of an image, in + a manner similar to the controls on a colour TV set. An enhancement + factor of 0.0 gives a black and white image. A factor of 1.0 gives + the original image. + """ + def __init__(self, image): + self.image = image + self.intermediate_mode = 'L' + if 'A' in image.getbands(): + self.intermediate_mode = 'LA' + + self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) + + +class Contrast(_Enhance): + """Adjust image contrast. + + This class can be used to control the contrast of an image, similar + to the contrast control on a TV set. An enhancement factor of 0.0 + gives a solid grey image. A factor of 1.0 gives the original image. + """ + def __init__(self, image): + self.image = image + mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5) + self.degenerate = Image.new("L", image.size, mean).convert(image.mode) + + if 'A' in image.getbands(): + self.degenerate.putalpha(image.getchannel('A')) + + +class Brightness(_Enhance): + """Adjust image brightness. + + This class can be used to control the brightness of an image. An + enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the + original image. + """ + def __init__(self, image): + self.image = image + self.degenerate = Image.new(image.mode, image.size, 0) + + if 'A' in image.getbands(): + self.degenerate.putalpha(image.getchannel('A')) + + +class Sharpness(_Enhance): + """Adjust image sharpness. + + This class can be used to adjust the sharpness of an image. An + enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the + original image, and a factor of 2.0 gives a sharpened image. + """ + def __init__(self, image): + self.image = image + self.degenerate = image.filter(ImageFilter.SMOOTH) + + if 'A' in image.getbands(): + self.degenerate.putalpha(image.getchannel('A')) diff --git a/ascii2img/src/PIL/ImageFile.py b/ascii2img/src/PIL/ImageFile.py new file mode 100644 index 0000000..b0d13a0 --- /dev/null +++ b/ascii2img/src/PIL/ImageFile.py @@ -0,0 +1,662 @@ +# +# The Python Imaging Library. +# $Id$ +# +# base class for image file handlers +# +# history: +# 1995-09-09 fl Created +# 1996-03-11 fl Fixed load mechanism. +# 1996-04-15 fl Added pcx/xbm decoders. +# 1996-04-30 fl Added encoders. +# 1996-12-14 fl Added load helpers +# 1997-01-11 fl Use encode_to_file where possible +# 1997-08-27 fl Flush output in _save +# 1998-03-05 fl Use memory mapping for some modes +# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" +# 1999-05-31 fl Added image parser +# 2000-10-12 fl Set readonly flag on memory-mapped images +# 2002-03-20 fl Use better messages for common decoder errors +# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available +# 2003-10-30 fl Added StubImageFile class +# 2004-02-25 fl Made incremental parser more robust +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._util import isPath +import io +import os +import sys +import struct + +MAXBLOCK = 65536 + +SAFEBLOCK = 1024*1024 + +LOAD_TRUNCATED_IMAGES = False + +ERRORS = { + -1: "image buffer overrun error", + -2: "decoding error", + -3: "unknown error", + -8: "bad configuration", + -9: "out of memory error" +} + + +def raise_ioerror(error): + try: + message = Image.core.getcodecstatus(error) + except AttributeError: + message = ERRORS.get(error) + if not message: + message = "decoder error %d" % error + raise IOError(message + " when reading image file") + + +# +# -------------------------------------------------------------------- +# Helpers + +def _tilesort(t): + # sort on offset + return t[2] + + +# +# -------------------------------------------------------------------- +# ImageFile base class + +class ImageFile(Image.Image): + "Base class for image file format handlers." + + def __init__(self, fp=None, filename=None): + Image.Image.__init__(self) + + self._min_frame = 0 + + self.tile = None + self.readonly = 1 # until we know better + + self.decoderconfig = () + self.decodermaxblock = MAXBLOCK + + if isPath(fp): + # filename + self.fp = open(fp, "rb") + self.filename = fp + self._exclusive_fp = True + else: + # stream + self.fp = fp + self.filename = filename + # can be overridden + self._exclusive_fp = None + + try: + self._open() + except (IndexError, # end of data + TypeError, # end of data (ord) + KeyError, # unsupported mode + EOFError, # got header but not the first frame + struct.error) as v: + # close the file only if we have opened it this constructor + if self._exclusive_fp: + self.fp.close() + raise SyntaxError(v) + + if not self.mode or self.size[0] <= 0: + raise SyntaxError("not identified by this driver") + + def draft(self, mode, size): + "Set draft mode" + + pass + + def verify(self): + "Check file integrity" + + # raise exception if something's wrong. must be called + # directly after open, and closes file when finished. + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def load(self): + "Load image data based on tile list" + + pixel = Image.Image.load(self) + + if self.tile is None: + raise IOError("cannot load this image") + if not self.tile: + return pixel + + self.map = None + use_mmap = self.filename and len(self.tile) == 1 + # As of pypy 2.1.0, memory mapping was failing here. + use_mmap = use_mmap and not hasattr(sys, 'pypy_version_info') + + readonly = 0 + + # look for read/seek overrides + try: + read = self.load_read + # don't use mmap if there are custom read/seek functions + use_mmap = False + except AttributeError: + read = self.fp.read + + try: + seek = self.load_seek + use_mmap = False + except AttributeError: + seek = self.fp.seek + + if use_mmap: + # try memory mapping + decoder_name, extents, offset, args = self.tile[0] + if decoder_name == "raw" and len(args) >= 3 and args[0] == self.mode \ + and args[0] in Image._MAPMODES: + try: + if hasattr(Image.core, "map"): + # use built-in mapper WIN32 only + self.map = Image.core.map(self.filename) + self.map.seek(offset) + self.im = self.map.readimage( + self.mode, self.size, args[1], args[2] + ) + else: + # use mmap, if possible + import mmap + fp = open(self.filename, "r") + size = os.path.getsize(self.filename) + self.map = mmap.mmap(fp.fileno(), size, access=mmap.ACCESS_READ) + self.im = Image.core.map_buffer( + self.map, self.size, decoder_name, extents, offset, args + ) + readonly = 1 + # After trashing self.im, we might need to reload the palette data. + if self.palette: + self.palette.dirty = 1 + except (AttributeError, EnvironmentError, ImportError): + self.map = None + + self.load_prepare() + err_code = -3 # initialize to unknown error + if not self.map: + # sort tiles in file order + self.tile.sort(key=_tilesort) + + try: + # FIXME: This is a hack to handle TIFF's JpegTables tag. + prefix = self.tile_prefix + except AttributeError: + prefix = b"" + + for decoder_name, extents, offset, args in self.tile: + decoder = Image._getdecoder(self.mode, decoder_name, + args, self.decoderconfig) + seek(offset) + decoder.setimage(self.im, extents) + if decoder.pulls_fd: + decoder.setfd(self.fp) + status, err_code = decoder.decode(b"") + else: + b = prefix + while True: + try: + s = read(self.decodermaxblock) + except (IndexError, struct.error): # truncated png/gif + if LOAD_TRUNCATED_IMAGES: + break + else: + raise IOError("image file is truncated") + + if not s: # truncated jpeg + self.tile = [] + + # JpegDecode needs to clean things up here either way + # If we don't destroy the decompressor, + # we have a memory leak. + decoder.cleanup() + + if LOAD_TRUNCATED_IMAGES: + break + else: + raise IOError("image file is truncated " + "(%d bytes not processed)" % len(b)) + + b = b + s + n, err_code = decoder.decode(b) + if n < 0: + break + b = b[n:] + + # Need to cleanup here to prevent leaks in PyPy + decoder.cleanup() + + self.tile = [] + self.readonly = readonly + + self.load_end() + + if self._exclusive_fp and self._close_exclusive_fp_after_loading: + self.fp.close() + self.fp = None + + if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: + # still raised if decoder fails to return anything + raise_ioerror(err_code) + + return Image.Image.load(self) + + def load_prepare(self): + # create image memory if necessary + if not self.im or\ + self.im.mode != self.mode or self.im.size != self.size: + self.im = Image.core.new(self.mode, self.size) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + def load_end(self): + # may be overridden + pass + + # may be defined for contained formats + # def load_seek(self, pos): + # pass + + # may be defined for blocked formats (e.g. PNG) + # def load_read(self, bytes): + # pass + + def _seek_check(self, frame): + if (frame < self._min_frame or + # Only check upper limit on frames if additional seek operations + # are not required to do so + (not (hasattr(self, "_n_frames") and self._n_frames is None) and + frame >= self.n_frames+self._min_frame)): + raise EOFError("attempt to seek outside sequence") + + return self.tell() != frame + + +class StubImageFile(ImageFile): + """ + Base class for stub image loaders. + + A stub loader is an image loader that can identify files of a + certain format, but relies on external code to load the file. + """ + + def _open(self): + raise NotImplementedError( + "StubImageFile subclass must implement _open" + ) + + def load(self): + loader = self._load() + if loader is None: + raise IOError("cannot find loader for this %s file" % self.format) + image = loader.load(self) + assert image is not None + # become the other object (!) + self.__class__ = image.__class__ + self.__dict__ = image.__dict__ + + def _load(self): + "(Hook) Find actual image loader." + raise NotImplementedError( + "StubImageFile subclass must implement _load" + ) + + +class Parser(object): + """ + Incremental image parser. This class implements the standard + feed/close consumer interface. + """ + incremental = None + image = None + data = None + decoder = None + offset = 0 + finished = 0 + + def reset(self): + """ + (Consumer) Reset the parser. Note that you can only call this + method immediately after you've created a parser; parser + instances cannot be reused. + """ + assert self.data is None, "cannot reuse parsers" + + def feed(self, data): + """ + (Consumer) Feed data to the parser. + + :param data: A string buffer. + :exception IOError: If the parser failed to parse the image file. + """ + # collect data + + if self.finished: + return + + if self.data is None: + self.data = data + else: + self.data = self.data + data + + # parse what we have + if self.decoder: + + if self.offset > 0: + # skip header + skip = min(len(self.data), self.offset) + self.data = self.data[skip:] + self.offset = self.offset - skip + if self.offset > 0 or not self.data: + return + + n, e = self.decoder.decode(self.data) + + if n < 0: + # end of stream + self.data = None + self.finished = 1 + if e < 0: + # decoding error + self.image = None + raise_ioerror(e) + else: + # end of image + return + self.data = self.data[n:] + + elif self.image: + + # if we end up here with no decoder, this file cannot + # be incrementally parsed. wait until we've gotten all + # available data + pass + + else: + + # attempt to open this file + try: + with io.BytesIO(self.data) as fp: + im = Image.open(fp) + except IOError: + # traceback.print_exc() + pass # not enough data + else: + flag = hasattr(im, "load_seek") or hasattr(im, "load_read") + if flag or len(im.tile) != 1: + # custom load code, or multiple tiles + self.decode = None + else: + # initialize decoder + im.load_prepare() + d, e, o, a = im.tile[0] + im.tile = [] + self.decoder = Image._getdecoder( + im.mode, d, a, im.decoderconfig + ) + self.decoder.setimage(im.im, e) + + # calculate decoder offset + self.offset = o + if self.offset <= len(self.data): + self.data = self.data[self.offset:] + self.offset = 0 + + self.image = im + + def close(self): + """ + (Consumer) Close the stream. + + :returns: An image object. + :exception IOError: If the parser failed to parse the image file either + because it cannot be identified or cannot be + decoded. + """ + # finish decoding + if self.decoder: + # get rid of what's left in the buffers + self.feed(b"") + self.data = self.decoder = None + if not self.finished: + raise IOError("image was incomplete") + if not self.image: + raise IOError("cannot parse this image") + if self.data: + # incremental parsing not possible; reopen the file + # not that we have all data + with io.BytesIO(self.data) as fp: + try: + self.image = Image.open(fp) + finally: + self.image.load() + return self.image + + +# -------------------------------------------------------------------- + +def _save(im, fp, tile, bufsize=0): + """Helper to save image based on tile list + + :param im: Image object. + :param fp: File object. + :param tile: Tile list. + :param bufsize: Optional buffer size + """ + + im.load() + if not hasattr(im, "encoderconfig"): + im.encoderconfig = () + tile.sort(key=_tilesort) + # FIXME: make MAXBLOCK a configuration parameter + # It would be great if we could have the encoder specify what it needs + # But, it would need at least the image size in most cases. RawEncode is + # a tricky case. + bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c + if fp == sys.stdout: + fp.flush() + return + try: + fh = fp.fileno() + fp.flush() + except (AttributeError, io.UnsupportedOperation): + # compress to Python file-compatible object + for e, b, o, a in tile: + e = Image._getencoder(im.mode, e, a, im.encoderconfig) + if o > 0: + fp.seek(o, 0) + e.setimage(im.im, b) + if e.pushes_fd: + e.setfd(fp) + l, s = e.encode_to_pyfd() + else: + while True: + l, s, d = e.encode(bufsize) + fp.write(d) + if s: + break + if s < 0: + raise IOError("encoder error %d when writing image file" % s) + e.cleanup() + else: + # slight speedup: compress to real file object + for e, b, o, a in tile: + e = Image._getencoder(im.mode, e, a, im.encoderconfig) + if o > 0: + fp.seek(o, 0) + e.setimage(im.im, b) + if e.pushes_fd: + e.setfd(fp) + l, s = e.encode_to_pyfd() + else: + s = e.encode_to_file(fh, bufsize) + if s < 0: + raise IOError("encoder error %d when writing image file" % s) + e.cleanup() + if hasattr(fp, "flush"): + fp.flush() + + +def _safe_read(fp, size): + """ + Reads large blocks in a safe way. Unlike fp.read(n), this function + doesn't trust the user. If the requested size is larger than + SAFEBLOCK, the file is read block by block. + + :param fp: File handle. Must implement a read method. + :param size: Number of bytes to read. + :returns: A string containing up to size bytes of data. + """ + if size <= 0: + return b"" + if size <= SAFEBLOCK: + return fp.read(size) + data = [] + while size > 0: + block = fp.read(min(size, SAFEBLOCK)) + if not block: + break + data.append(block) + size -= len(block) + return b"".join(data) + + +class PyCodecState(object): + def __init__(self): + self.xsize = 0 + self.ysize = 0 + self.xoff = 0 + self.yoff = 0 + + def extents(self): + return (self.xoff, self.yoff, + self.xoff+self.xsize, self.yoff+self.ysize) + + +class PyDecoder(object): + """ + Python implementation of a format decoder. Override this class and + add the decoding logic in the `decode` method. + + See :ref:`Writing Your Own File Decoder in Python` + """ + + _pulls_fd = False + + def __init__(self, mode, *args): + self.im = None + self.state = PyCodecState() + self.fd = None + self.mode = mode + self.init(args) + + def init(self, args): + """ + Override to perform decoder specific initialization + + :param args: Array of args items from the tile entry + :returns: None + """ + self.args = args + + @property + def pulls_fd(self): + return self._pulls_fd + + def decode(self, buffer): + """ + Override to perform the decoding process. + + :param buffer: A bytes object with the data to be decoded. If `handles_eof` + is set, then `buffer` will be empty and `self.fd` will be set. + :returns: A tuple of (bytes consumed, errcode). If finished with decoding + return <0 for the bytes consumed. Err codes are from `ERRORS` + """ + raise NotImplementedError() + + def cleanup(self): + """ + Override to perform decoder specific cleanup + + :returns: None + """ + pass + + def setfd(self, fd): + """ + Called from ImageFile to set the python file-like object + + :param fd: A python file-like object + :returns: None + """ + self.fd = fd + + def setimage(self, im, extents=None): + """ + Called from ImageFile to set the core output image for the decoder + + :param im: A core image object + :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle + for this tile + :returns: None + """ + + # following c code + self.im = im + + if extents: + (x0, y0, x1, y1) = extents + else: + (x0, y0, x1, y1) = (0, 0, 0, 0) + + if x0 == 0 and x1 == 0: + self.state.xsize, self.state.ysize = self.im.size + else: + self.state.xoff = x0 + self.state.yoff = y0 + self.state.xsize = x1 - x0 + self.state.ysize = y1 - y0 + + if self.state.xsize <= 0 or self.state.ysize <= 0: + raise ValueError("Size cannot be negative") + + if (self.state.xsize + self.state.xoff > self.im.size[0] or + self.state.ysize + self.state.yoff > self.im.size[1]): + raise ValueError("Tile cannot extend outside image") + + def set_as_raw(self, data, rawmode=None): + """ + Convenience method to set the internal image from a stream of raw data + + :param data: Bytes to be set + :param rawmode: The rawmode to be used for the decoder. If not specified, + it will default to the mode of the image + :returns: None + """ + + if not rawmode: + rawmode = self.mode + d = Image._getdecoder(self.mode, 'raw', (rawmode)) + d.setimage(self.im, self.state.extents()) + s = d.decode(data) + + if s[0] >= 0: + raise ValueError("not enough image data") + if s[1] != 0: + raise ValueError("cannot decode image data") diff --git a/ascii2img/src/PIL/ImageFilter.py b/ascii2img/src/PIL/ImageFilter.py new file mode 100644 index 0000000..100fea8 --- /dev/null +++ b/ascii2img/src/PIL/ImageFilter.py @@ -0,0 +1,299 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard filters +# +# History: +# 1995-11-27 fl Created +# 2002-06-08 fl Added rank and mode filters +# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2002 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +import functools + + +class Filter(object): + pass + + +class MultibandFilter(Filter): + pass + + +class Kernel(MultibandFilter): + """ + Create a convolution kernel. The current version only + supports 3x3 and 5x5 integer and floating point kernels. + + In the current version, kernels can only be applied to + "L" and "RGB" images. + + :param size: Kernel size, given as (width, height). In the current + version, this must be (3,3) or (5,5). + :param kernel: A sequence containing kernel weights. + :param scale: Scale factor. If given, the result for each pixel is + divided by this value. the default is the sum of the + kernel weights. + :param offset: Offset. If given, this value is added to the result, + after it has been divided by the scale factor. + """ + + def __init__(self, size, kernel, scale=None, offset=0): + if scale is None: + # default scale is sum of kernel + scale = functools.reduce(lambda a, b: a+b, kernel) + if size[0] * size[1] != len(kernel): + raise ValueError("not enough coefficients in kernel") + self.filterargs = size, scale, offset, kernel + + def filter(self, image): + if image.mode == "P": + raise ValueError("cannot filter palette images") + return image.filter(*self.filterargs) + + +class BuiltinFilter(Kernel): + def __init__(self): + pass + + +class RankFilter(Filter): + """ + Create a rank filter. The rank filter sorts all pixels in + a window of the given size, and returns the **rank**'th value. + + :param size: The kernel size, in pixels. + :param rank: What pixel value to pick. Use 0 for a min filter, + ``size * size / 2`` for a median filter, ``size * size - 1`` + for a max filter, etc. + """ + name = "Rank" + + def __init__(self, size, rank): + self.size = size + self.rank = rank + + def filter(self, image): + if image.mode == "P": + raise ValueError("cannot filter palette images") + image = image.expand(self.size//2, self.size//2) + return image.rankfilter(self.size, self.rank) + + +class MedianFilter(RankFilter): + """ + Create a median filter. Picks the median pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + name = "Median" + + def __init__(self, size=3): + self.size = size + self.rank = size*size//2 + + +class MinFilter(RankFilter): + """ + Create a min filter. Picks the lowest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + name = "Min" + + def __init__(self, size=3): + self.size = size + self.rank = 0 + + +class MaxFilter(RankFilter): + """ + Create a max filter. Picks the largest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + name = "Max" + + def __init__(self, size=3): + self.size = size + self.rank = size*size-1 + + +class ModeFilter(Filter): + """ + + Create a mode filter. Picks the most frequent pixel value in a box with the + given size. Pixel values that occur only once or twice are ignored; if no + pixel value occurs more than twice, the original pixel value is preserved. + + :param size: The kernel size, in pixels. + """ + name = "Mode" + + def __init__(self, size=3): + self.size = size + + def filter(self, image): + return image.modefilter(self.size) + + +class GaussianBlur(MultibandFilter): + """Gaussian blur filter. + + :param radius: Blur radius. + """ + name = "GaussianBlur" + + def __init__(self, radius=2): + self.radius = radius + + def filter(self, image): + return image.gaussian_blur(self.radius) + + +class BoxBlur(MultibandFilter): + """Blurs the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. + + :param radius: Size of the box in one direction. Radius 0 does not blur, + returns an identical image. Radius 1 takes 1 pixel + in each direction, i.e. 9 pixels in total. + """ + name = "BoxBlur" + + def __init__(self, radius): + self.radius = radius + + def filter(self, image): + return image.box_blur(self.radius) + + +class UnsharpMask(MultibandFilter): + """Unsharp mask filter. + + See Wikipedia's entry on `digital unsharp masking`_ for an explanation of + the parameters. + + :param radius: Blur Radius + :param percent: Unsharp strength, in percent + :param threshold: Threshold controls the minimum brightness change that + will be sharpened + + .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking + + """ + name = "UnsharpMask" + + def __init__(self, radius=2, percent=150, threshold=3): + self.radius = radius + self.percent = percent + self.threshold = threshold + + def filter(self, image): + return image.unsharp_mask(self.radius, self.percent, self.threshold) + + +class BLUR(BuiltinFilter): + name = "Blur" + filterargs = (5, 5), 16, 0, ( + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1 + ) + + +class CONTOUR(BuiltinFilter): + name = "Contour" + filterargs = (3, 3), 1, 255, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1 + ) + + +class DETAIL(BuiltinFilter): + name = "Detail" + filterargs = (3, 3), 6, 0, ( + 0, -1, 0, + -1, 10, -1, + 0, -1, 0 + ) + + +class EDGE_ENHANCE(BuiltinFilter): + name = "Edge-enhance" + filterargs = (3, 3), 2, 0, ( + -1, -1, -1, + -1, 10, -1, + -1, -1, -1 + ) + + +class EDGE_ENHANCE_MORE(BuiltinFilter): + name = "Edge-enhance More" + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 9, -1, + -1, -1, -1 + ) + + +class EMBOSS(BuiltinFilter): + name = "Emboss" + filterargs = (3, 3), 1, 128, ( + -1, 0, 0, + 0, 1, 0, + 0, 0, 0 + ) + + +class FIND_EDGES(BuiltinFilter): + name = "Find Edges" + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1 + ) + + +class SMOOTH(BuiltinFilter): + name = "Smooth" + filterargs = (3, 3), 13, 0, ( + 1, 1, 1, + 1, 5, 1, + 1, 1, 1 + ) + + +class SMOOTH_MORE(BuiltinFilter): + name = "Smooth More" + filterargs = (5, 5), 100, 0, ( + 1, 1, 1, 1, 1, + 1, 5, 5, 5, 1, + 1, 5, 44, 5, 1, + 1, 5, 5, 5, 1, + 1, 1, 1, 1, 1 + ) + + +class SHARPEN(BuiltinFilter): + name = "Sharpen" + filterargs = (3, 3), 16, 0, ( + -2, -2, -2, + -2, 32, -2, + -2, -2, -2 + ) diff --git a/ascii2img/src/PIL/ImageFont.py b/ascii2img/src/PIL/ImageFont.py new file mode 100644 index 0000000..19977b8 --- /dev/null +++ b/ascii2img/src/PIL/ImageFont.py @@ -0,0 +1,455 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIL raster font management +# +# History: +# 1996-08-07 fl created (experimental) +# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 +# 1999-02-06 fl rewrote most font management stuff in C +# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) +# 2001-02-17 fl added freetype support +# 2001-05-09 fl added TransposedFont wrapper class +# 2002-03-04 fl make sure we have a "L" or "1" font +# 2002-12-04 fl skip non-directory entries in the system path +# 2003-04-29 fl add embedded default font +# 2003-09-27 fl added support for truetype charmap encodings +# +# Todo: +# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._util import isDirectory, isPath +import os +import sys + + +class _imagingft_not_installed(object): + # module placeholder + def __getattr__(self, id): + raise ImportError("The _imagingft C module is not installed") + + +try: + from . import _imagingft as core +except ImportError: + core = _imagingft_not_installed() + +LAYOUT_BASIC = 0 +LAYOUT_RAQM = 1 + +# FIXME: add support for pilfont2 format (see FontFile.py) + +# -------------------------------------------------------------------- +# Font metrics format: +# "PILfont" LF +# fontdescriptor LF +# (optional) key=value... LF +# "DATA" LF +# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) +# +# To place a character, cut out srcbox and paste at dstbox, +# relative to the character position. Then move the character +# position according to dx, dy. +# -------------------------------------------------------------------- + + +class ImageFont(object): + "PIL font wrapper" + + def _load_pilfont(self, filename): + + with open(filename, "rb") as fp: + for ext in (".png", ".gif", ".pbm"): + try: + fullname = os.path.splitext(filename)[0] + ext + image = Image.open(fullname) + except: + pass + else: + if image and image.mode in ("1", "L"): + break + else: + raise IOError("cannot find glyph data file") + + self.file = fullname + + return self._load_pilfont_data(fp, image) + + def _load_pilfont_data(self, file, image): + + # read PILfont header + if file.readline() != b"PILfont\n": + raise SyntaxError("Not a PILfont file") + file.readline().split(b";") + self.info = [] # FIXME: should be a dictionary + while True: + s = file.readline() + if not s or s == b"DATA\n": + break + self.info.append(s) + + # read PILfont metrics + data = file.read(256*20) + + # check image + if image.mode not in ("1", "L"): + raise TypeError("invalid font image mode") + + image.load() + + self.font = Image.core.font(image.im, data) + + def getsize(self, text, *args, **kwargs): + return self.font.getsize(text) + + def getmask(self, text, mode="", *args, **kwargs): + return self.font.getmask(text, mode) + + +## +# Wrapper for FreeType fonts. Application code should use the +# truetype factory function to create font objects. + +class FreeTypeFont(object): + "FreeType font wrapper (requires _imagingft service)" + + def __init__(self, font=None, size=10, index=0, encoding="", + layout_engine=None): + # FIXME: use service provider instead + + self.path = font + self.size = size + self.index = index + self.encoding = encoding + + if layout_engine not in (LAYOUT_BASIC, LAYOUT_RAQM): + layout_engine = LAYOUT_BASIC + if core.HAVE_RAQM: + layout_engine = LAYOUT_RAQM + if layout_engine == LAYOUT_RAQM and not core.HAVE_RAQM: + layout_engine = LAYOUT_BASIC + + self.layout_engine = layout_engine + + if isPath(font): + self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine) + else: + self.font_bytes = font.read() + self.font = core.getfont( + "", size, index, encoding, self.font_bytes, layout_engine) + + def getname(self): + return self.font.family, self.font.style + + def getmetrics(self): + return self.font.ascent, self.font.descent + + def getsize(self, text, direction=None, features=None): + size, offset = self.font.getsize(text, direction, features) + return (size[0] + offset[0], size[1] + offset[1]) + + def getoffset(self, text): + return self.font.getsize(text)[1] + + def getmask(self, text, mode="", direction=None, features=None): + return self.getmask2(text, mode, direction=direction, features=features)[0] + + def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=None, *args, **kwargs): + size, offset = self.font.getsize(text, direction, features) + im = fill("L", size, 0) + self.font.render(text, im.id, mode == "1", direction, features) + return im, offset + + def font_variant(self, font=None, size=None, index=None, encoding=None, + layout_engine=None): + """ + Create a copy of this FreeTypeFont object, + using any specified arguments to override the settings. + + Parameters are identical to the parameters used to initialize this + object. + + :return: A FreeTypeFont object. + """ + return FreeTypeFont(font=self.path if font is None else font, + size=self.size if size is None else size, + index=self.index if index is None else index, + encoding=self.encoding if encoding is None else encoding, + layout_engine=self.layout_engine if layout_engine is None else layout_engine + ) + + +class TransposedFont(object): + "Wrapper for writing rotated or mirrored text" + + def __init__(self, font, orientation=None): + """ + Wrapper that creates a transposed font from any existing font + object. + + :param font: A font object. + :param orientation: An optional orientation. If given, this should + be one of Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM, + Image.ROTATE_90, Image.ROTATE_180, or Image.ROTATE_270. + """ + self.font = font + self.orientation = orientation # any 'transpose' argument, or None + + def getsize(self, text, *args, **kwargs): + w, h = self.font.getsize(text) + if self.orientation in (Image.ROTATE_90, Image.ROTATE_270): + return h, w + return w, h + + def getmask(self, text, mode="", *args, **kwargs): + im = self.font.getmask(text, mode, *args, **kwargs) + if self.orientation is not None: + return im.transpose(self.orientation) + return im + + +def load(filename): + """ + Load a font file. This function loads a font object from the given + bitmap font file, and returns the corresponding font object. + + :param filename: Name of font file. + :return: A font object. + :exception IOError: If the file could not be read. + """ + f = ImageFont() + f._load_pilfont(filename) + return f + + +def truetype(font=None, size=10, index=0, encoding="", + layout_engine=None): + """ + Load a TrueType or OpenType font file, and create a font object. + This function loads a font object from the given file, and creates + a font object for a font of the given size. + + This function requires the _imagingft service. + + :param font: A truetype font file. Under Windows, if the file + is not found in this filename, the loader also looks in + Windows :file:`fonts/` directory. + :param size: The requested size, in points. + :param index: Which font face to load (default is first available face). + :param encoding: Which font encoding to use (default is Unicode). Common + encodings are "unic" (Unicode), "symb" (Microsoft + Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), + and "armn" (Apple Roman). See the FreeType documentation + for more information. + :param layout_engine: Which layout engine to use, if available: + `ImageFont.LAYOUT_BASIC` or `ImageFont.LAYOUT_RAQM`. + :return: A font object. + :exception IOError: If the file could not be read. + """ + + try: + return FreeTypeFont(font, size, index, encoding, layout_engine) + except IOError: + ttf_filename = os.path.basename(font) + + dirs = [] + if sys.platform == "win32": + # check the windows font repository + # NOTE: must use uppercase WINDIR, to work around bugs in + # 1.5.2's os.environ.get() + windir = os.environ.get("WINDIR") + if windir: + dirs.append(os.path.join(windir, "fonts")) + elif sys.platform in ('linux', 'linux2'): + lindirs = os.environ.get("XDG_DATA_DIRS", "") + if not lindirs: + # According to the freedesktop spec, XDG_DATA_DIRS should + # default to /usr/share + lindirs = '/usr/share' + dirs += [os.path.join(lindir, "fonts") + for lindir in lindirs.split(":")] + elif sys.platform == 'darwin': + dirs += ['/Library/Fonts', '/System/Library/Fonts', + os.path.expanduser('~/Library/Fonts')] + + ext = os.path.splitext(ttf_filename)[1] + first_font_with_a_different_extension = None + for directory in dirs: + for walkroot, walkdir, walkfilenames in os.walk(directory): + for walkfilename in walkfilenames: + if ext and walkfilename == ttf_filename: + fontpath = os.path.join(walkroot, walkfilename) + return FreeTypeFont(fontpath, size, index, encoding, layout_engine) + elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: + fontpath = os.path.join(walkroot, walkfilename) + if os.path.splitext(fontpath)[1] == '.ttf': + return FreeTypeFont(fontpath, size, index, encoding, layout_engine) + if not ext and first_font_with_a_different_extension is None: + first_font_with_a_different_extension = fontpath + if first_font_with_a_different_extension: + return FreeTypeFont(first_font_with_a_different_extension, size, + index, encoding, layout_engine) + raise + + +def load_path(filename): + """ + Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a + bitmap font along the Python path. + + :param filename: Name of font file. + :return: A font object. + :exception IOError: If the file could not be read. + """ + for directory in sys.path: + if isDirectory(directory): + if not isinstance(filename, str): + if bytes is str: + filename = filename.encode("utf-8") + else: + filename = filename.decode("utf-8") + try: + return load(os.path.join(directory, filename)) + except IOError: + pass + raise IOError("cannot find font file") + + +def load_default(): + """Load a "better than nothing" default font. + + .. versionadded:: 1.1.4 + + :return: A font object. + """ + from io import BytesIO + import base64 + f = ImageFont() + f._load_pilfont_data( + # courB08 + BytesIO(base64.b64decode(b''' +UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA +BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL +AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA +AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB +ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A +BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB +//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA +AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH +AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA +ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv +AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ +/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 +AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA +AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG +AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA +BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA +AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA +2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF +AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// ++gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA +////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA +BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv +AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA +AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA +AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA +BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// +//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA +AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF +AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB +mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn +AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA +AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 +AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA +Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB +//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA +AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ +AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC +DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ +AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ ++wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 +AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ +///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG +AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA +BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA +Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC +eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG +AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// ++gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA +////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA +BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT +AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A +AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA +Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA +Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// +//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA +AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ +AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA +LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 +AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA +AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 +AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA +AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG +AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA +EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK +AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA +pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG +AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// ++QAGAAIAzgAKANUAEw== +''')), Image.open(BytesIO(base64.b64decode(b''' +iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u +Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 +M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g +LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F +IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA +Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 +NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx +in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 +SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY +AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt +y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG +ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY +lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H +/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 +AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 +c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ +/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw +pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv +oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR +evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA +AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// +Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR +w7IkEbzhVQAAAABJRU5ErkJggg== +''')))) + return f diff --git a/ascii2img/src/PIL/ImageGrab.py b/ascii2img/src/PIL/ImageGrab.py new file mode 100644 index 0000000..712b02c --- /dev/null +++ b/ascii2img/src/PIL/ImageGrab.py @@ -0,0 +1,80 @@ +# +# The Python Imaging Library +# $Id$ +# +# screen grabber (macOS and Windows only) +# +# History: +# 2001-04-26 fl created +# 2001-09-17 fl use builtin driver, if present +# 2002-11-19 fl added grabclipboard support +# +# Copyright (c) 2001-2002 by Secret Labs AB +# Copyright (c) 2001-2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image + +import sys +if sys.platform not in ["win32", "darwin"]: + raise ImportError("ImageGrab is macOS and Windows only") + +if sys.platform == "win32": + grabber = Image.core.grabscreen +elif sys.platform == "darwin": + import os + import tempfile + import subprocess + + +def grab(bbox=None): + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp('.png') + os.close(fh) + subprocess.call(['screencapture', '-x', filepath]) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + else: + size, data = grabber() + im = Image.frombytes( + "RGB", size, data, + # RGB, 32-bit line padding, origin lower left corner + "raw", "BGR", (size[0]*3 + 3) & -4, -1 + ) + if bbox: + im = im.crop(bbox) + return im + + +def grabclipboard(): + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp('.jpg') + os.close(fh) + commands = [ + "set theFile to (open for access POSIX file \""+filepath+"\" with write permission)", + "try", + "write (the clipboard as JPEG picture) to theFile", + "end try", + "close access theFile" + ] + script = ["osascript"] + for command in commands: + script += ["-e", command] + subprocess.call(script) + + im = None + if os.stat(filepath).st_size != 0: + im = Image.open(filepath) + im.load() + os.unlink(filepath) + return im + else: + data = Image.core.grabclipboard() + if isinstance(data, bytes): + from . import BmpImagePlugin + import io + return BmpImagePlugin.DibImageFile(io.BytesIO(data)) + return data diff --git a/ascii2img/src/PIL/ImageMath.py b/ascii2img/src/PIL/ImageMath.py new file mode 100644 index 0000000..2ccd189 --- /dev/null +++ b/ascii2img/src/PIL/ImageMath.py @@ -0,0 +1,269 @@ +# +# The Python Imaging Library +# $Id$ +# +# a simple math add-on for the Python Imaging Library +# +# History: +# 1999-02-15 fl Original PIL Plus release +# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 +# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 +# +# Copyright (c) 1999-2005 by Secret Labs AB +# Copyright (c) 2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, _imagingmath + +try: + import builtins +except ImportError: + import __builtin__ + builtins = __builtin__ + +VERBOSE = 0 + + +def _isconstant(v): + return isinstance(v, int) or isinstance(v, float) + + +class _Operand(object): + """Wraps an image operand, providing standard operators""" + + def __init__(self, im): + self.im = im + + def __fixup(self, im1): + # convert image to suitable mode + if isinstance(im1, _Operand): + # argument was an image. + if im1.im.mode in ("1", "L"): + return im1.im.convert("I") + elif im1.im.mode in ("I", "F"): + return im1.im + else: + raise ValueError("unsupported mode: %s" % im1.im.mode) + else: + # argument was a constant + if _isconstant(im1) and self.im.mode in ("1", "L", "I"): + return Image.new("I", self.im.size, im1) + else: + return Image.new("F", self.im.size, im1) + + def apply(self, op, im1, im2=None, mode=None): + im1 = self.__fixup(im1) + if im2 is None: + # unary operation + out = Image.new(mode or im1.mode, im1.size, None) + im1.load() + try: + op = getattr(_imagingmath, op+"_"+im1.mode) + except AttributeError: + raise TypeError("bad operand type for '%s'" % op) + _imagingmath.unop(op, out.im.id, im1.im.id) + else: + # binary operation + im2 = self.__fixup(im2) + if im1.mode != im2.mode: + # convert both arguments to floating point + if im1.mode != "F": + im1 = im1.convert("F") + if im2.mode != "F": + im2 = im2.convert("F") + if im1.mode != im2.mode: + raise ValueError("mode mismatch") + if im1.size != im2.size: + # crop both arguments to a common size + size = (min(im1.size[0], im2.size[0]), + min(im1.size[1], im2.size[1])) + if im1.size != size: + im1 = im1.crop((0, 0) + size) + if im2.size != size: + im2 = im2.crop((0, 0) + size) + out = Image.new(mode or im1.mode, size, None) + else: + out = Image.new(mode or im1.mode, im1.size, None) + im1.load() + im2.load() + try: + op = getattr(_imagingmath, op+"_"+im1.mode) + except AttributeError: + raise TypeError("bad operand type for '%s'" % op) + _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id) + return _Operand(out) + + # unary operators + def __bool__(self): + # an image is "true" if it contains at least one non-zero pixel + return self.im.getbbox() is not None + + if bytes is str: + # Provide __nonzero__ for pre-Py3k + __nonzero__ = __bool__ + del __bool__ + + def __abs__(self): + return self.apply("abs", self) + + def __pos__(self): + return self + + def __neg__(self): + return self.apply("neg", self) + + # binary operators + def __add__(self, other): + return self.apply("add", self, other) + + def __radd__(self, other): + return self.apply("add", other, self) + + def __sub__(self, other): + return self.apply("sub", self, other) + + def __rsub__(self, other): + return self.apply("sub", other, self) + + def __mul__(self, other): + return self.apply("mul", self, other) + + def __rmul__(self, other): + return self.apply("mul", other, self) + + def __truediv__(self, other): + return self.apply("div", self, other) + + def __rtruediv__(self, other): + return self.apply("div", other, self) + + def __mod__(self, other): + return self.apply("mod", self, other) + + def __rmod__(self, other): + return self.apply("mod", other, self) + + def __pow__(self, other): + return self.apply("pow", self, other) + + def __rpow__(self, other): + return self.apply("pow", other, self) + + if bytes is str: + # Provide __div__ and __rdiv__ for pre-Py3k + __div__ = __truediv__ + __rdiv__ = __rtruediv__ + del __truediv__ + del __rtruediv__ + + # bitwise + def __invert__(self): + return self.apply("invert", self) + + def __and__(self, other): + return self.apply("and", self, other) + + def __rand__(self, other): + return self.apply("and", other, self) + + def __or__(self, other): + return self.apply("or", self, other) + + def __ror__(self, other): + return self.apply("or", other, self) + + def __xor__(self, other): + return self.apply("xor", self, other) + + def __rxor__(self, other): + return self.apply("xor", other, self) + + def __lshift__(self, other): + return self.apply("lshift", self, other) + + def __rshift__(self, other): + return self.apply("rshift", self, other) + + # logical + def __eq__(self, other): + return self.apply("eq", self, other) + + def __ne__(self, other): + return self.apply("ne", self, other) + + def __lt__(self, other): + return self.apply("lt", self, other) + + def __le__(self, other): + return self.apply("le", self, other) + + def __gt__(self, other): + return self.apply("gt", self, other) + + def __ge__(self, other): + return self.apply("ge", self, other) + + +# conversions +def imagemath_int(self): + return _Operand(self.im.convert("I")) + + +def imagemath_float(self): + return _Operand(self.im.convert("F")) + + +# logical +def imagemath_equal(self, other): + return self.apply("eq", self, other, mode="I") + + +def imagemath_notequal(self, other): + return self.apply("ne", self, other, mode="I") + + +def imagemath_min(self, other): + return self.apply("min", self, other) + + +def imagemath_max(self, other): + return self.apply("max", self, other) + + +def imagemath_convert(self, mode): + return _Operand(self.im.convert(mode)) + +ops = {} +for k, v in list(globals().items()): + if k[:10] == "imagemath_": + ops[k[10:]] = v + + +def eval(expression, _dict={}, **kw): + """ + Evaluates an image expression. + + :param expression: A string containing a Python-style expression. + :param options: Values to add to the evaluation context. You + can either use a dictionary, or one or more keyword + arguments. + :return: The evaluated expression. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + """ + + # build execution namespace + args = ops.copy() + args.update(_dict) + args.update(kw) + for k, v in list(args.items()): + if hasattr(v, "im"): + args[k] = _Operand(v) + + out = builtins.eval(expression, args) + try: + return out.im + except AttributeError: + return out diff --git a/ascii2img/src/PIL/ImageMode.py b/ascii2img/src/PIL/ImageMode.py new file mode 100644 index 0000000..b227f21 --- /dev/null +++ b/ascii2img/src/PIL/ImageMode.py @@ -0,0 +1,55 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard mode descriptors +# +# History: +# 2006-03-20 fl Added +# +# Copyright (c) 2006 by Secret Labs AB. +# Copyright (c) 2006 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +# mode descriptor cache +_modes = None + + +class ModeDescriptor(object): + """Wrapper for mode strings.""" + + def __init__(self, mode, bands, basemode, basetype): + self.mode = mode + self.bands = bands + self.basemode = basemode + self.basetype = basetype + + def __str__(self): + return self.mode + + +def getmode(mode): + """Gets a mode descriptor for the given mode.""" + global _modes + if not _modes: + # initialize mode cache + + from . import Image + modes = {} + # core modes + for m, (basemode, basetype, bands) in Image._MODEINFO.items(): + modes[m] = ModeDescriptor(m, bands, basemode, basetype) + # extra experimental modes + modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L") + modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L") + modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L") + modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") + # mapping modes + modes["I;16"] = ModeDescriptor("I;16", "I", "L", "L") + modes["I;16L"] = ModeDescriptor("I;16L", "I", "L", "L") + modes["I;16B"] = ModeDescriptor("I;16B", "I", "L", "L") + # set global mode cache atomically + _modes = modes + return _modes[mode] diff --git a/ascii2img/src/PIL/ImageMorph.py b/ascii2img/src/PIL/ImageMorph.py new file mode 100644 index 0000000..d236773 --- /dev/null +++ b/ascii2img/src/PIL/ImageMorph.py @@ -0,0 +1,250 @@ +# A binary morphology add-on for the Python Imaging Library +# +# History: +# 2014-06-04 Initial version. +# +# Copyright (c) 2014 Dov Grobgeld + +from __future__ import print_function + +from . import Image, _imagingmorph +import re + +LUT_SIZE = 1 << 9 + + +class LutBuilder(object): + """A class for building a MorphLut from a descriptive language + + The input patterns is a list of a strings sequences like these:: + + 4:(... + .1. + 111)->1 + + (whitespaces including linebreaks are ignored). The option 4 + describes a series of symmetry operations (in this case a + 4-rotation), the pattern is described by: + + - . or X - Ignore + - 1 - Pixel is on + - 0 - Pixel is off + + The result of the operation is described after "->" string. + + The default is to return the current pixel value, which is + returned if no other match is found. + + Operations: + + - 4 - 4 way rotation + - N - Negate + - 1 - Dummy op for no other operation (an op must always be given) + - M - Mirroring + + Example:: + + lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) + lut = lb.build_lut() + + """ + def __init__(self, patterns=None, op_name=None): + if patterns is not None: + self.patterns = patterns + else: + self.patterns = [] + self.lut = None + if op_name is not None: + known_patterns = { + 'corner': ['1:(... ... ...)->0', + '4:(00. 01. ...)->1'], + 'dilation4': ['4:(... .0. .1.)->1'], + 'dilation8': ['4:(... .0. .1.)->1', + '4:(... .0. ..1)->1'], + 'erosion4': ['4:(... .1. .0.)->0'], + 'erosion8': ['4:(... .1. .0.)->0', + '4:(... .1. ..0)->0'], + 'edge': ['1:(... ... ...)->0', + '4:(.0. .1. ...)->1', + '4:(01. .1. ...)->1'] + } + if op_name not in known_patterns: + raise Exception('Unknown pattern '+op_name+'!') + + self.patterns = known_patterns[op_name] + + def add_patterns(self, patterns): + self.patterns += patterns + + def build_default_lut(self): + symbols = [0, 1] + m = 1 << 4 # pos of current pixel + self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) + + def get_lut(self): + return self.lut + + def _string_permute(self, pattern, permutation): + """string_permute takes a pattern and a permutation and returns the + string permuted according to the permutation list. + """ + assert(len(permutation) == 9) + return ''.join(pattern[p] for p in permutation) + + def _pattern_permute(self, basic_pattern, options, basic_result): + """pattern_permute takes a basic pattern and its result and clones + the pattern according to the modifications described in the $options + parameter. It returns a list of all cloned patterns.""" + patterns = [(basic_pattern, basic_result)] + + # rotations + if '4' in options: + res = patterns[-1][1] + for i in range(4): + patterns.append( + (self._string_permute(patterns[-1][0], [6, 3, 0, + 7, 4, 1, + 8, 5, 2]), res)) + # mirror + if 'M' in options: + n = len(patterns) + for pattern, res in patterns[0:n]: + patterns.append( + (self._string_permute(pattern, [2, 1, 0, + 5, 4, 3, + 8, 7, 6]), res)) + + # negate + if 'N' in options: + n = len(patterns) + for pattern, res in patterns[0:n]: + # Swap 0 and 1 + pattern = (pattern + .replace('0', 'Z') + .replace('1', '0') + .replace('Z', '1')) + res = 1-int(res) + patterns.append((pattern, res)) + + return patterns + + def build_lut(self): + """Compile all patterns into a morphology lut. + + TBD :Build based on (file) morphlut:modify_lut + """ + self.build_default_lut() + patterns = [] + + # Parse and create symmetries of the patterns strings + for p in self.patterns: + m = re.search( + r'(\w*):?\s*\((.+?)\)\s*->\s*(\d)', p.replace('\n', '')) + if not m: + raise Exception('Syntax error in pattern "'+p+'"') + options = m.group(1) + pattern = m.group(2) + result = int(m.group(3)) + + # Get rid of spaces + pattern = pattern.replace(' ', '').replace('\n', '') + + patterns += self._pattern_permute(pattern, options, result) + +# # Debugging +# for p, r in patterns: +# print(p, r) +# print('--') + + # compile the patterns into regular expressions for speed + for i, pattern in enumerate(patterns): + p = pattern[0].replace('.', 'X').replace('X', '[01]') + p = re.compile(p) + patterns[i] = (p, pattern[1]) + + # Step through table and find patterns that match. + # Note that all the patterns are searched. The last one + # caught overrides + for i in range(LUT_SIZE): + # Build the bit pattern + bitpattern = bin(i)[2:] + bitpattern = ('0'*(9-len(bitpattern)) + bitpattern)[::-1] + + for p, r in patterns: + if p.match(bitpattern): + self.lut[i] = [0, 1][r] + + return self.lut + + +class MorphOp(object): + """A class for binary morphological operators""" + + def __init__(self, + lut=None, + op_name=None, + patterns=None): + """Create a binary morphological operator""" + self.lut = lut + if op_name is not None: + self.lut = LutBuilder(op_name=op_name).build_lut() + elif patterns is not None: + self.lut = LutBuilder(patterns=patterns).build_lut() + + def apply(self, image): + """Run a single morphological operation on an image + + Returns a tuple of the number of changed pixels and the + morphed image""" + if self.lut is None: + raise Exception('No operator loaded') + + if image.mode != 'L': + raise Exception('Image must be binary, meaning it must use mode L') + outimage = Image.new(image.mode, image.size, None) + count = _imagingmorph.apply( + bytes(self.lut), image.im.id, outimage.im.id) + return count, outimage + + def match(self, image): + """Get a list of coordinates matching the morphological operation on + an image. + + Returns a list of tuples of (x,y) coordinates + of all matching pixels.""" + if self.lut is None: + raise Exception('No operator loaded') + + if image.mode != 'L': + raise Exception('Image must be binary, meaning it must use mode L') + return _imagingmorph.match(bytes(self.lut), image.im.id) + + def get_on_pixels(self, image): + """Get a list of all turned on pixels in a binary image + + Returns a list of tuples of (x,y) coordinates + of all matching pixels.""" + + if image.mode != 'L': + raise Exception('Image must be binary, meaning it must use mode L') + return _imagingmorph.get_on_pixels(image.im.id) + + def load_lut(self, filename): + """Load an operator from an mrl file""" + with open(filename, 'rb') as f: + self.lut = bytearray(f.read()) + + if len(self.lut) != LUT_SIZE: + self.lut = None + raise Exception('Wrong size operator file!') + + def save_lut(self, filename): + """Save an operator to an mrl file""" + if self.lut is None: + raise Exception('No operator loaded') + with open(filename, 'wb') as f: + f.write(self.lut) + + def set_lut(self, lut): + """Set the lut from an external source""" + self.lut = lut diff --git a/ascii2img/src/PIL/ImageOps.py b/ascii2img/src/PIL/ImageOps.py new file mode 100644 index 0000000..25d491a --- /dev/null +++ b/ascii2img/src/PIL/ImageOps.py @@ -0,0 +1,529 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard image operations +# +# History: +# 2001-10-20 fl Created +# 2001-10-23 fl Added autocontrast operator +# 2001-12-18 fl Added Kevin's fit operator +# 2004-03-14 fl Fixed potential division by zero in equalize +# 2005-05-05 fl Fixed equalize for low number of values +# +# Copyright (c) 2001-2004 by Secret Labs AB +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._util import isStringType +import operator +import functools +import warnings + + +# +# helpers + +def _border(border): + if isinstance(border, tuple): + if len(border) == 2: + left, top = right, bottom = border + elif len(border) == 4: + left, top, right, bottom = border + else: + left = top = right = bottom = border + return left, top, right, bottom + + +def _color(color, mode): + if isStringType(color): + from . import ImageColor + color = ImageColor.getcolor(color, mode) + return color + + +def _lut(image, lut): + if image.mode == "P": + # FIXME: apply to lookup table, not image data + raise NotImplementedError("mode P support coming soon") + elif image.mode in ("L", "RGB"): + if image.mode == "RGB" and len(lut) == 256: + lut = lut + lut + lut + return image.point(lut) + else: + raise IOError("not supported for this image mode") + +# +# actions + + +def autocontrast(image, cutoff=0, ignore=None): + """ + Maximize (normalize) image contrast. This function calculates a + histogram of the input image, removes **cutoff** percent of the + lightest and darkest pixels from the histogram, and remaps the image + so that the darkest pixel becomes black (0), and the lightest + becomes white (255). + + :param image: The image to process. + :param cutoff: How many percent to cut off from the histogram. + :param ignore: The background pixel value (use None for no background). + :return: An image. + """ + histogram = image.histogram() + lut = [] + for layer in range(0, len(histogram), 256): + h = histogram[layer:layer+256] + if ignore is not None: + # get rid of outliers + try: + h[ignore] = 0 + except TypeError: + # assume sequence + for ix in ignore: + h[ix] = 0 + if cutoff: + # cut off pixels from both ends of the histogram + # get number of pixels + n = 0 + for ix in range(256): + n = n + h[ix] + # remove cutoff% pixels from the low end + cut = n * cutoff // 100 + for lo in range(256): + if cut > h[lo]: + cut = cut - h[lo] + h[lo] = 0 + else: + h[lo] -= cut + cut = 0 + if cut <= 0: + break + # remove cutoff% samples from the hi end + cut = n * cutoff // 100 + for hi in range(255, -1, -1): + if cut > h[hi]: + cut = cut - h[hi] + h[hi] = 0 + else: + h[hi] -= cut + cut = 0 + if cut <= 0: + break + # find lowest/highest samples after preprocessing + for lo in range(256): + if h[lo]: + break + for hi in range(255, -1, -1): + if h[hi]: + break + if hi <= lo: + # don't bother + lut.extend(list(range(256))) + else: + scale = 255.0 / (hi - lo) + offset = -lo * scale + for ix in range(256): + ix = int(ix * scale + offset) + if ix < 0: + ix = 0 + elif ix > 255: + ix = 255 + lut.append(ix) + return _lut(image, lut) + + +def colorize(image, black, white): + """ + Colorize grayscale image. The **black** and **white** + arguments should be RGB tuples; this function calculates a color + wedge mapping all black pixels in the source image to the first + color, and all white pixels to the second color. + + :param image: The image to colorize. + :param black: The color to use for black input pixels. + :param white: The color to use for white input pixels. + :return: An image. + """ + assert image.mode == "L" + black = _color(black, "RGB") + white = _color(white, "RGB") + red = [] + green = [] + blue = [] + for i in range(256): + red.append(black[0]+i*(white[0]-black[0])//255) + green.append(black[1]+i*(white[1]-black[1])//255) + blue.append(black[2]+i*(white[2]-black[2])//255) + image = image.convert("RGB") + return _lut(image, red + green + blue) + + +def crop(image, border=0): + """ + Remove border from image. The same amount of pixels are removed + from all four sides. This function works on all image modes. + + .. seealso:: :py:meth:`~PIL.Image.Image.crop` + + :param image: The image to crop. + :param border: The number of pixels to remove. + :return: An image. + """ + left, top, right, bottom = _border(border) + return image.crop( + (left, top, image.size[0]-right, image.size[1]-bottom) + ) + + +def scale(image, factor, resample=Image.NEAREST): + """ + Returns a rescaled image by a specific factor given in parameter. + A factor greater than 1 expands the image, between 0 and 1 contracts the + image. + + :param image: The image to rescale. + :param factor: The expansion factor, as a float. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.resize function. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + if factor == 1: + return image.copy() + elif factor <= 0: + raise ValueError("the factor must be greater than 0") + else: + size = (int(round(factor * image.width)), + int(round(factor * image.height))) + return image.resize(size, resample) + + +def deform(image, deformer, resample=Image.BILINEAR): + """ + Deform the image. + + :param image: The image to deform. + :param deformer: A deformer object. Any object that implements a + **getmesh** method can be used. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.transform function. + :return: An image. + """ + return image.transform( + image.size, Image.MESH, deformer.getmesh(image), resample + ) + + +def equalize(image, mask=None): + """ + Equalize the image histogram. This function applies a non-linear + mapping to the input image, in order to create a uniform + distribution of grayscale values in the output image. + + :param image: The image to equalize. + :param mask: An optional mask. If given, only the pixels selected by + the mask are included in the analysis. + :return: An image. + """ + if image.mode == "P": + image = image.convert("RGB") + h = image.histogram(mask) + lut = [] + for b in range(0, len(h), 256): + histo = [_f for _f in h[b:b+256] if _f] + if len(histo) <= 1: + lut.extend(list(range(256))) + else: + step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 + if not step: + lut.extend(list(range(256))) + else: + n = step // 2 + for i in range(256): + lut.append(n // step) + n = n + h[i+b] + return _lut(image, lut) + + +def expand(image, border=0, fill=0): + """ + Add border to the image + + :param image: The image to expand. + :param border: Border width, in pixels. + :param fill: Pixel fill value (a color value). Default is 0 (black). + :return: An image. + """ + left, top, right, bottom = _border(border) + width = left + image.size[0] + right + height = top + image.size[1] + bottom + out = Image.new(image.mode, (width, height), _color(fill, image.mode)) + out.paste(image, (left, top)) + return out + + +def fit(image, size, method=Image.NEAREST, bleed=0.0, centering=(0.5, 0.5)): + """ + Returns a sized and cropped version of the image, cropped to the + requested aspect ratio and size. + + This function was contributed by Kevin Cazabon. + + :param image: The image to size and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: What resampling method to use. Default is + :py:attr:`PIL.Image.NEAREST`. + :param bleed: Remove a border around the outside of the image (from all + four edges. The value is a decimal percentage (use 0.01 for + one percent). The default value is 0 (no border). + :param centering: Control the cropping position. Use (0.5, 0.5) for + center cropping (e.g. if cropping the width, take 50% off + of the left side, and therefore 50% off the right side). + (0.0, 0.0) will crop from the top left corner (i.e. if + cropping the width, take all of the crop off of the right + side, and if cropping the height, take all of it off the + bottom). (1.0, 0.0) will crop from the bottom left + corner, etc. (i.e. if cropping the width, take all of the + crop off the left side, and if cropping the height take + none from the top, and therefore all off the bottom). + :return: An image. + """ + + # by Kevin Cazabon, Feb 17/2000 + # kevin@cazabon.com + # http://www.cazabon.com + + # ensure inputs are valid + if not isinstance(centering, list): + centering = [centering[0], centering[1]] + + if centering[0] > 1.0 or centering[0] < 0.0: + centering[0] = 0.50 + if centering[1] > 1.0 or centering[1] < 0.0: + centering[1] = 0.50 + + if bleed > 0.49999 or bleed < 0.0: + bleed = 0.0 + + # calculate the area to use for resizing and cropping, subtracting + # the 'bleed' around the edges + + # number of pixels to trim off on Top and Bottom, Left and Right + bleedPixels = ( + int((float(bleed) * float(image.size[0])) + 0.5), + int((float(bleed) * float(image.size[1])) + 0.5) + ) + + liveArea = (0, 0, image.size[0], image.size[1]) + if bleed > 0.0: + liveArea = ( + bleedPixels[0], bleedPixels[1], image.size[0] - bleedPixels[0] - 1, + image.size[1] - bleedPixels[1] - 1 + ) + + liveSize = (liveArea[2] - liveArea[0], liveArea[3] - liveArea[1]) + + # calculate the aspect ratio of the liveArea + liveAreaAspectRatio = float(liveSize[0])/float(liveSize[1]) + + # calculate the aspect ratio of the output image + aspectRatio = float(size[0]) / float(size[1]) + + # figure out if the sides or top/bottom will be cropped off + if liveAreaAspectRatio >= aspectRatio: + # liveArea is wider than what's needed, crop the sides + cropWidth = int((aspectRatio * float(liveSize[1])) + 0.5) + cropHeight = liveSize[1] + else: + # liveArea is taller than what's needed, crop the top and bottom + cropWidth = liveSize[0] + cropHeight = int((float(liveSize[0])/aspectRatio) + 0.5) + + # make the crop + leftSide = int(liveArea[0] + (float(liveSize[0]-cropWidth) * centering[0])) + if leftSide < 0: + leftSide = 0 + topSide = int(liveArea[1] + (float(liveSize[1]-cropHeight) * centering[1])) + if topSide < 0: + topSide = 0 + + out = image.crop( + (leftSide, topSide, leftSide + cropWidth, topSide + cropHeight) + ) + + # resize the image and return it + return out.resize(size, method) + + +def flip(image): + """ + Flip the image vertically (top to bottom). + + :param image: The image to flip. + :return: An image. + """ + return image.transpose(Image.FLIP_TOP_BOTTOM) + + +def grayscale(image): + """ + Convert the image to grayscale. + + :param image: The image to convert. + :return: An image. + """ + return image.convert("L") + + +def invert(image): + """ + Invert (negate) the image. + + :param image: The image to invert. + :return: An image. + """ + lut = [] + for i in range(256): + lut.append(255-i) + return _lut(image, lut) + + +def mirror(image): + """ + Flip image horizontally (left to right). + + :param image: The image to mirror. + :return: An image. + """ + return image.transpose(Image.FLIP_LEFT_RIGHT) + + +def posterize(image, bits): + """ + Reduce the number of bits for each color channel. + + :param image: The image to posterize. + :param bits: The number of bits to keep for each channel (1-8). + :return: An image. + """ + lut = [] + mask = ~(2**(8-bits)-1) + for i in range(256): + lut.append(i & mask) + return _lut(image, lut) + + +def solarize(image, threshold=128): + """ + Invert all pixel values above a threshold. + + :param image: The image to solarize. + :param threshold: All pixels above this greyscale level are inverted. + :return: An image. + """ + lut = [] + for i in range(256): + if i < threshold: + lut.append(i) + else: + lut.append(255-i) + return _lut(image, lut) + + +# -------------------------------------------------------------------- +# PIL USM components, from Kevin Cazabon. + +def gaussian_blur(im, radius=None): + """ PIL_usm.gblur(im, [radius])""" + + warnings.warn( + 'PIL.ImageOps.gaussian_blur is deprecated. ' + 'Use PIL.ImageFilter.GaussianBlur instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + if radius is None: + radius = 5.0 + + im.load() + + return im.im.gaussian_blur(radius) + + +def gblur(im, radius=None): + """ PIL_usm.gblur(im, [radius])""" + + warnings.warn( + 'PIL.ImageOps.gblur is deprecated. ' + 'Use PIL.ImageFilter.GaussianBlur instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + return gaussian_blur(im, radius) + + +def unsharp_mask(im, radius=None, percent=None, threshold=None): + """ PIL_usm.usm(im, [radius, percent, threshold])""" + + warnings.warn( + 'PIL.ImageOps.unsharp_mask is deprecated. ' + 'Use PIL.ImageFilter.UnsharpMask instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + if radius is None: + radius = 5.0 + if percent is None: + percent = 150 + if threshold is None: + threshold = 3 + + im.load() + + return im.im.unsharp_mask(radius, percent, threshold) + + +def usm(im, radius=None, percent=None, threshold=None): + """ PIL_usm.usm(im, [radius, percent, threshold])""" + + warnings.warn( + 'PIL.ImageOps.usm is deprecated. ' + 'Use PIL.ImageFilter.UnsharpMask instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + return unsharp_mask(im, radius, percent, threshold) + + +def box_blur(image, radius): + """ + Blur the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. + + :param image: The image to blur. + :param radius: Size of the box in one direction. Radius 0 does not blur, + returns an identical image. Radius 1 takes 1 pixel + in each direction, i.e. 9 pixels in total. + :return: An image. + """ + warnings.warn( + 'PIL.ImageOps.box_blur is deprecated. ' + 'Use PIL.ImageFilter.BoxBlur instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + image.load() + + return image._new(image.im.box_blur(radius)) diff --git a/ascii2img/src/PIL/ImagePalette.py b/ascii2img/src/PIL/ImagePalette.py new file mode 100644 index 0000000..cecc645 --- /dev/null +++ b/ascii2img/src/PIL/ImagePalette.py @@ -0,0 +1,216 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image palette object +# +# History: +# 1996-03-11 fl Rewritten. +# 1997-01-03 fl Up and running. +# 1997-08-23 fl Added load hack +# 2001-04-16 fl Fixed randint shadow bug in random() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import array +from . import ImageColor, GimpPaletteFile, GimpGradientFile, PaletteFile + + +class ImagePalette(object): + """ + Color palette for palette mapped images + + :param mode: The mode to use for the Palette. See: + :ref:`concept-modes`. Defaults to "RGB" + :param palette: An optional palette. If given, it must be a bytearray, + an array or a list of ints between 0-255 and of length ``size`` + times the number of colors in ``mode``. The list must be aligned + by channel (All R values must be contiguous in the list before G + and B values.) Defaults to 0 through 255 per channel. + :param size: An optional palette size. If given, it cannot be equal to + or greater than 256. Defaults to 0. + """ + + def __init__(self, mode="RGB", palette=None, size=0): + self.mode = mode + self.rawmode = None # if set, palette contains raw data + self.palette = palette or bytearray(range(256))*len(self.mode) + self.colors = {} + self.dirty = None + if ((size == 0 and len(self.mode)*256 != len(self.palette)) or + (size != 0 and size != len(self.palette))): + raise ValueError("wrong palette size") + + def copy(self): + new = ImagePalette() + + new.mode = self.mode + new.rawmode = self.rawmode + if self.palette is not None: + new.palette = self.palette[:] + new.colors = self.colors.copy() + new.dirty = self.dirty + + return new + + def getdata(self): + """ + Get palette contents in format suitable # for the low-level + ``im.putpalette`` primitive. + + .. warning:: This method is experimental. + """ + if self.rawmode: + return self.rawmode, self.palette + return self.mode + ";L", self.tobytes() + + def tobytes(self): + """Convert palette to bytes. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(self.palette, bytes): + return self.palette + arr = array.array("B", self.palette) + if hasattr(arr, 'tobytes'): + return arr.tobytes() + return arr.tostring() + + # Declare tostring as an alias for tobytes + tostring = tobytes + + def getcolor(self, color): + """Given an rgb tuple, allocate palette entry. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(color, tuple): + try: + return self.colors[color] + except KeyError: + # allocate new color slot + if isinstance(self.palette, bytes): + self.palette = bytearray(self.palette) + index = len(self.colors) + if index >= 256: + raise ValueError("cannot allocate more than 256 colors") + self.colors[color] = index + self.palette[index] = color[0] + self.palette[index+256] = color[1] + self.palette[index+512] = color[2] + self.dirty = 1 + return index + else: + raise ValueError("unknown color specifier: %r" % color) + + def save(self, fp): + """Save palette to text file. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(fp, str): + fp = open(fp, "w") + fp.write("# Palette\n") + fp.write("# Mode: %s\n" % self.mode) + for i in range(256): + fp.write("%d" % i) + for j in range(i*len(self.mode), (i+1)*len(self.mode)): + try: + fp.write(" %d" % self.palette[j]) + except IndexError: + fp.write(" 0") + fp.write("\n") + fp.close() + + +# -------------------------------------------------------------------- +# Internal + +def raw(rawmode, data): + palette = ImagePalette() + palette.rawmode = rawmode + palette.palette = data + palette.dirty = 1 + return palette + + +# -------------------------------------------------------------------- +# Factories + +def make_linear_lut(black, white): + lut = [] + if black == 0: + for i in range(256): + lut.append(white*i//255) + else: + raise NotImplementedError # FIXME + return lut + + +def make_gamma_lut(exp): + lut = [] + for i in range(256): + lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5)) + return lut + + +def negative(mode="RGB"): + palette = list(range(256)) + palette.reverse() + return ImagePalette(mode, palette * len(mode)) + + +def random(mode="RGB"): + from random import randint + palette = [] + for i in range(256*len(mode)): + palette.append(randint(0, 255)) + return ImagePalette(mode, palette) + + +def sepia(white="#fff0c0"): + r, g, b = ImageColor.getrgb(white) + r = make_linear_lut(0, r) + g = make_linear_lut(0, g) + b = make_linear_lut(0, b) + return ImagePalette("RGB", r + g + b) + + +def wedge(mode="RGB"): + return ImagePalette(mode, list(range(256)) * len(mode)) + + +def load(filename): + + # FIXME: supports GIMP gradients only + + with open(filename, "rb") as fp: + + for paletteHandler in [ + GimpPaletteFile.GimpPaletteFile, + GimpGradientFile.GimpGradientFile, + PaletteFile.PaletteFile + ]: + try: + fp.seek(0) + lut = paletteHandler(fp).getpalette() + if lut: + break + except (SyntaxError, ValueError): + # import traceback + # traceback.print_exc() + pass + else: + raise IOError("cannot load palette") + + return lut # data, rawmode diff --git a/ascii2img/src/PIL/ImagePath.py b/ascii2img/src/PIL/ImagePath.py new file mode 100644 index 0000000..1543508 --- /dev/null +++ b/ascii2img/src/PIL/ImagePath.py @@ -0,0 +1,60 @@ +# +# The Python Imaging Library +# $Id$ +# +# path interface +# +# History: +# 1996-11-04 fl Created +# 2002-04-14 fl Added documentation stub class +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +# the Python class below is overridden by the C implementation. + + +class Path(object): + + def __init__(self, xy): + pass + + def compact(self, distance=2): + """ + Compacts the path, by removing points that are close to each other. + This method modifies the path in place. + """ + pass + + def getbbox(self): + """Gets the bounding box.""" + pass + + def map(self, function): + """Maps the path through a function.""" + pass + + def tolist(self, flat=0): + """ + Converts the path to Python list. + # + @param flat By default, this function returns a list of 2-tuples + [(x, y), ...]. If this argument is true, it returns a flat list + [x, y, ...] instead. + @return A list of coordinates. + """ + pass + + def transform(self, matrix): + """Transforms the path.""" + pass + + +# override with C implementation +Path = Image.core.path diff --git a/ascii2img/src/PIL/ImageQt.py b/ascii2img/src/PIL/ImageQt.py new file mode 100644 index 0000000..36b4e1e --- /dev/null +++ b/ascii2img/src/PIL/ImageQt.py @@ -0,0 +1,203 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a simple Qt image interface. +# +# history: +# 2006-06-03 fl: created +# 2006-06-04 fl: inherit from QImage instead of wrapping it +# 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) +# +# Copyright (c) 2006 by Secret Labs AB +# Copyright (c) 2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._util import isPath +from io import BytesIO + +qt_is_installed = True +qt_version = None +try: + from PyQt5.QtGui import QImage, qRgba, QPixmap + from PyQt5.QtCore import QBuffer, QIODevice + qt_version = '5' +except (ImportError, RuntimeError): + try: + from PyQt4.QtGui import QImage, qRgba, QPixmap + from PyQt4.QtCore import QBuffer, QIODevice + qt_version = '4' + except (ImportError, RuntimeError): + try: + from PySide.QtGui import QImage, qRgba, QPixmap + from PySide.QtCore import QBuffer, QIODevice + qt_version = 'side' + except ImportError: + qt_is_installed = False + + +def rgb(r, g, b, a=255): + """(Internal) Turns an RGB color into a Qt compatible color integer.""" + # use qRgb to pack the colors, and then turn the resulting long + # into a negative integer with the same bitpattern. + return (qRgba(r, g, b, a) & 0xffffffff) + + +def fromqimage(im): + """ + :param im: A PIL Image object, or a file name + (given either as Python string or a PyQt string object) + """ + buffer = QBuffer() + buffer.open(QIODevice.ReadWrite) + # preserve alha channel with png + # otherwise ppm is more friendly with Image.open + if im.hasAlphaChannel(): + im.save(buffer, 'png') + else: + im.save(buffer, 'ppm') + + b = BytesIO() + try: + b.write(buffer.data()) + except TypeError: + # workaround for Python 2 + b.write(str(buffer.data())) + buffer.close() + b.seek(0) + + return Image.open(b) + + +def fromqpixmap(im): + return fromqimage(im) + # buffer = QBuffer() + # buffer.open(QIODevice.ReadWrite) + # # im.save(buffer) + # # What if png doesn't support some image features like animation? + # im.save(buffer, 'ppm') + # bytes_io = BytesIO() + # bytes_io.write(buffer.data()) + # buffer.close() + # bytes_io.seek(0) + # return Image.open(bytes_io) + + +def align8to32(bytes, width, mode): + """ + converts each scanline of data from 8 bit to 32 bit aligned + """ + + bits_per_pixel = { + '1': 1, + 'L': 8, + 'P': 8, + }[mode] + + # calculate bytes per line and the extra padding if needed + bits_per_line = bits_per_pixel * width + full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) + bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) + + extra_padding = -bytes_per_line % 4 + + # already 32 bit aligned by luck + if not extra_padding: + return bytes + + new_data = [] + for i in range(len(bytes) // bytes_per_line): + new_data.append(bytes[i*bytes_per_line:(i+1)*bytes_per_line] + b'\x00' * extra_padding) + + return b''.join(new_data) + + +def _toqclass_helper(im): + data = None + colortable = None + + # handle filename, if given instead of image name + if hasattr(im, "toUtf8"): + # FIXME - is this really the best way to do this? + if str is bytes: + im = unicode(im.toUtf8(), "utf-8") + else: + im = str(im.toUtf8(), "utf-8") + if isPath(im): + im = Image.open(im) + + if im.mode == "1": + format = QImage.Format_Mono + elif im.mode == "L": + format = QImage.Format_Indexed8 + colortable = [] + for i in range(256): + colortable.append(rgb(i, i, i)) + elif im.mode == "P": + format = QImage.Format_Indexed8 + colortable = [] + palette = im.getpalette() + for i in range(0, len(palette), 3): + colortable.append(rgb(*palette[i:i+3])) + elif im.mode == "RGB": + data = im.tobytes("raw", "BGRX") + format = QImage.Format_RGB32 + elif im.mode == "RGBA": + try: + data = im.tobytes("raw", "BGRA") + except SystemError: + # workaround for earlier versions + r, g, b, a = im.split() + im = Image.merge("RGBA", (b, g, r, a)) + format = QImage.Format_ARGB32 + else: + raise ValueError("unsupported image mode %r" % im.mode) + + __data = data or align8to32(im.tobytes(), im.size[0], im.mode) + return { + 'data': __data, 'im': im, 'format': format, 'colortable': colortable + } + +if qt_is_installed: + class ImageQt(QImage): + + def __init__(self, im): + """ + An PIL image wrapper for Qt. This is a subclass of PyQt's QImage + class. + + :param im: A PIL Image object, or a file name (given either as Python + string or a PyQt string object). + """ + im_data = _toqclass_helper(im) + # must keep a reference, or Qt will crash! + # All QImage constructors that take data operate on an existing + # buffer, so this buffer has to hang on for the life of the image. + # Fixes https://github.com/python-pillow/Pillow/issues/1370 + self.__data = im_data['data'] + QImage.__init__(self, + self.__data, im_data['im'].size[0], + im_data['im'].size[1], im_data['format']) + if im_data['colortable']: + self.setColorTable(im_data['colortable']) + + +def toqimage(im): + return ImageQt(im) + + +def toqpixmap(im): + # # This doesn't work. For now using a dumb approach. + # im_data = _toqclass_helper(im) + # result = QPixmap(im_data['im'].size[0], im_data['im'].size[1]) + # result.loadFromData(im_data['data']) + # Fix some strange bug that causes + if im.mode == 'RGB': + im = im.convert('RGBA') + + qimage = toqimage(im) + return QPixmap.fromImage(qimage) diff --git a/ascii2img/src/PIL/ImageSequence.py b/ascii2img/src/PIL/ImageSequence.py new file mode 100644 index 0000000..1fc6e5d --- /dev/null +++ b/ascii2img/src/PIL/ImageSequence.py @@ -0,0 +1,56 @@ +# +# The Python Imaging Library. +# $Id$ +# +# sequence support classes +# +# history: +# 1997-02-20 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## + + +class Iterator(object): + """ + This class implements an iterator object that can be used to loop + over an image sequence. + + You can use the ``[]`` operator to access elements by index. This operator + will raise an :py:exc:`IndexError` if you try to access a nonexistent + frame. + + :param im: An image object. + """ + + def __init__(self, im): + if not hasattr(im, "seek"): + raise AttributeError("im must have seek method") + self.im = im + self.position = 0 + + def __getitem__(self, ix): + try: + self.im.seek(ix) + return self.im + except EOFError: + raise IndexError # end of sequence + + def __iter__(self): + return self + + def __next__(self): + try: + self.im.seek(self.position) + self.position += 1 + return self.im + except EOFError: + raise StopIteration + + def next(self): + return self.__next__() diff --git a/ascii2img/src/PIL/ImageShow.py b/ascii2img/src/PIL/ImageShow.py new file mode 100644 index 0000000..f59ba9b --- /dev/null +++ b/ascii2img/src/PIL/ImageShow.py @@ -0,0 +1,181 @@ +# +# The Python Imaging Library. +# $Id$ +# +# im.show() drivers +# +# History: +# 2008-04-06 fl Created +# +# Copyright (c) Secret Labs AB 2008. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from PIL import Image +import os +import sys + +if sys.version_info >= (3, 3): + from shlex import quote +else: + from pipes import quote + +_viewers = [] + + +def register(viewer, order=1): + try: + if issubclass(viewer, Viewer): + viewer = viewer() + except TypeError: + pass # raised if viewer wasn't a class + if order > 0: + _viewers.append(viewer) + elif order < 0: + _viewers.insert(0, viewer) + + +def show(image, title=None, **options): + r""" + Display a given image. + + :param image: An image object. + :param title: Optional title. Not all viewers can display the title. + :param \**options: Additional viewer options. + :returns: True if a suitable viewer was found, false otherwise. + """ + for viewer in _viewers: + if viewer.show(image, title=title, **options): + return 1 + return 0 + + +class Viewer(object): + """Base class for viewers.""" + + # main api + + def show(self, image, **options): + + # save temporary image to disk + if image.mode[:4] == "I;16": + # @PIL88 @PIL101 + # "I;16" isn't an 'official' mode, but we still want to + # provide a simple way to show 16-bit images. + base = "L" + # FIXME: auto-contrast if max() > 255? + else: + base = Image.getmodebase(image.mode) + if base != image.mode and image.mode != "1" and image.mode != "RGBA": + image = image.convert(base) + + return self.show_image(image, **options) + + # hook methods + + format = None + options = {} + + def get_format(self, image): + """Return format name, or None to save as PGM/PPM""" + return self.format + + def get_command(self, file, **options): + raise NotImplementedError + + def save_image(self, image): + """Save to temporary file, and return filename""" + return image._dump(format=self.get_format(image), **self.options) + + def show_image(self, image, **options): + """Display given image""" + return self.show_file(self.save_image(image), **options) + + def show_file(self, file, **options): + """Display given file""" + os.system(self.get_command(file, **options)) + return 1 + +# -------------------------------------------------------------------- + +if sys.platform == "win32": + + class WindowsViewer(Viewer): + format = "BMP" + + def get_command(self, file, **options): + return ('start "Pillow" /WAIT "%s" ' + '&& ping -n 2 127.0.0.1 >NUL ' + '&& del /f "%s"' % (file, file)) + + register(WindowsViewer) + +elif sys.platform == "darwin": + + class MacViewer(Viewer): + format = "PNG" + options = {'compress_level': 1} + + def get_command(self, file, **options): + # on darwin open returns immediately resulting in the temp + # file removal while app is opening + command = "open -a /Applications/Preview.app" + command = "(%s %s; sleep 20; rm -f %s)&" % (command, quote(file), + quote(file)) + return command + + register(MacViewer) + +else: + + # unixoids + + def which(executable): + path = os.environ.get("PATH") + if not path: + return None + for dirname in path.split(os.pathsep): + filename = os.path.join(dirname, executable) + if os.path.isfile(filename) and os.access(filename, os.X_OK): + return filename + return None + + class UnixViewer(Viewer): + format = "PNG" + options = {'compress_level': 1} + + def show_file(self, file, **options): + command, executable = self.get_command_ex(file, **options) + command = "(%s %s; rm -f %s)&" % (command, quote(file), + quote(file)) + os.system(command) + return 1 + + # implementations + + class DisplayViewer(UnixViewer): + def get_command_ex(self, file, **options): + command = executable = "display" + return command, executable + + if which("display"): + register(DisplayViewer) + + class XVViewer(UnixViewer): + def get_command_ex(self, file, title=None, **options): + # note: xv is pretty outdated. most modern systems have + # imagemagick's display command instead. + command = executable = "xv" + if title: + command += " -name %s" % quote(title) + return command, executable + + if which("xv"): + register(XVViewer) + +if __name__ == "__main__": + # usage: python ImageShow.py imagefile [title] + print(show(Image.open(sys.argv[1]), *sys.argv[2:])) diff --git a/ascii2img/src/PIL/ImageStat.py b/ascii2img/src/PIL/ImageStat.py new file mode 100644 index 0000000..f3c138b --- /dev/null +++ b/ascii2img/src/PIL/ImageStat.py @@ -0,0 +1,147 @@ +# +# The Python Imaging Library. +# $Id$ +# +# global image statistics +# +# History: +# 1996-04-05 fl Created +# 1997-05-21 fl Added mask; added rms, var, stddev attributes +# 1997-08-05 fl Added median +# 1998-07-05 hk Fixed integer overflow error +# +# Notes: +# This class shows how to implement delayed evaluation of attributes. +# To get a certain value, simply access the corresponding attribute. +# The __getattr__ dispatcher takes care of the rest. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996-97. +# +# See the README file for information on usage and redistribution. +# + +import math +import operator +import functools + + +class Stat(object): + + def __init__(self, image_or_list, mask=None): + try: + if mask: + self.h = image_or_list.histogram(mask) + else: + self.h = image_or_list.histogram() + except AttributeError: + self.h = image_or_list # assume it to be a histogram list + if not isinstance(self.h, list): + raise TypeError("first argument must be image or list") + self.bands = list(range(len(self.h) // 256)) + + def __getattr__(self, id): + "Calculate missing attribute" + if id[:4] == "_get": + raise AttributeError(id) + # calculate missing attribute + v = getattr(self, "_get" + id)() + setattr(self, id, v) + return v + + def _getextrema(self): + "Get min/max values for each band in the image" + + def minmax(histogram): + n = 255 + x = 0 + for i in range(256): + if histogram[i]: + n = min(n, i) + x = max(x, i) + return n, x # returns (255, 0) if there's no data in the histogram + + v = [] + for i in range(0, len(self.h), 256): + v.append(minmax(self.h[i:])) + return v + + def _getcount(self): + "Get total number of pixels in each layer" + + v = [] + for i in range(0, len(self.h), 256): + v.append(functools.reduce(operator.add, self.h[i:i+256])) + return v + + def _getsum(self): + "Get sum of all pixels in each layer" + + v = [] + for i in range(0, len(self.h), 256): + layerSum = 0.0 + for j in range(256): + layerSum += j * self.h[i + j] + v.append(layerSum) + return v + + def _getsum2(self): + "Get squared sum of all pixels in each layer" + + v = [] + for i in range(0, len(self.h), 256): + sum2 = 0.0 + for j in range(256): + sum2 += (j ** 2) * float(self.h[i + j]) + v.append(sum2) + return v + + def _getmean(self): + "Get average pixel level for each layer" + + v = [] + for i in self.bands: + v.append(self.sum[i] / self.count[i]) + return v + + def _getmedian(self): + "Get median pixel level for each layer" + + v = [] + for i in self.bands: + s = 0 + l = self.count[i]//2 + b = i * 256 + for j in range(256): + s = s + self.h[b+j] + if s > l: + break + v.append(j) + return v + + def _getrms(self): + "Get RMS for each layer" + + v = [] + for i in self.bands: + v.append(math.sqrt(self.sum2[i] / self.count[i])) + return v + + def _getvar(self): + "Get variance for each layer" + + v = [] + for i in self.bands: + n = self.count[i] + v.append((self.sum2[i]-(self.sum[i]**2.0)/n)/n) + return v + + def _getstddev(self): + "Get standard deviation for each layer" + + v = [] + for i in self.bands: + v.append(math.sqrt(self.var[i])) + return v + +Global = Stat # compatibility diff --git a/ascii2img/src/PIL/ImageTransform.py b/ascii2img/src/PIL/ImageTransform.py new file mode 100644 index 0000000..dcfcdfa --- /dev/null +++ b/ascii2img/src/PIL/ImageTransform.py @@ -0,0 +1,98 @@ +# +# The Python Imaging Library. +# $Id$ +# +# transform wrappers +# +# History: +# 2002-04-08 fl Created +# +# Copyright (c) 2002 by Secret Labs AB +# Copyright (c) 2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +class Transform(Image.ImageTransformHandler): + def __init__(self, data): + self.data = data + + def getdata(self): + return self.method, self.data + + def transform(self, size, image, **options): + # can be overridden + method, data = self.getdata() + return image.transform(size, method, data, **options) + + +class AffineTransform(Transform): + """ + Define an affine image transform. + + This function takes a 6-tuple (a, b, c, d, e, f) which contain the first + two rows from an affine transform matrix. For each pixel (x, y) in the + output image, the new value is taken from a position (a x + b y + c, + d x + e y + f) in the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`~PIL.Image.Image.transform` + + :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows + from an affine transform matrix. + """ + method = Image.AFFINE + + +class ExtentTransform(Transform): + """ + Define a transform to extract a subregion from an image. + + Maps a rectangle (defined by two corners) from the image to a rectangle of + the given size. The resulting image will contain data sampled from between + the corners, such that (x0, y0) in the input image will end up at (0,0) in + the output image, and (x1, y1) at size. + + This method can be used to crop, stretch, shrink, or mirror an arbitrary + rectangle in the current image. It is slightly slower than crop, but about + as fast as a corresponding resize operation. + + See :py:meth:`~PIL.Image.Image.transform` + + :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the + input image's coordinate system. + """ + method = Image.EXTENT + + +class QuadTransform(Transform): + """ + Define a quad image transform. + + Maps a quadrilateral (a region defined by four corners) from the image to a + rectangle of the given size. + + See :py:meth:`~PIL.Image.Image.transform` + + :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, y3, y3) which contain the + upper left, lower left, lower right, and upper right corner of the + source quadrilateral. + """ + method = Image.QUAD + + +class MeshTransform(Transform): + """ + Define a mesh image transform. A mesh transform consists of one or more + individual quad transforms. + + See :py:meth:`~PIL.Image.Image.transform` + + :param data: A list of (bbox, quad) tuples. + """ + method = Image.MESH diff --git a/ascii2img/src/PIL/ImageWin.py b/ascii2img/src/PIL/ImageWin.py new file mode 100644 index 0000000..d8398e9 --- /dev/null +++ b/ascii2img/src/PIL/ImageWin.py @@ -0,0 +1,227 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Windows DIB display interface +# +# History: +# 1996-05-20 fl Created +# 1996-09-20 fl Fixed subregion exposure +# 1997-09-21 fl Added draw primitive (for tzPrint) +# 2003-05-21 fl Added experimental Window/ImageWindow classes +# 2003-09-05 fl Added fromstring/tostring methods +# +# Copyright (c) Secret Labs AB 1997-2003. +# Copyright (c) Fredrik Lundh 1996-2003. +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +class HDC(object): + """ + Wraps an HDC integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods. + """ + def __init__(self, dc): + self.dc = dc + + def __int__(self): + return self.dc + + +class HWND(object): + """ + Wraps an HWND integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods, instead of a DC. + """ + def __init__(self, wnd): + self.wnd = wnd + + def __int__(self): + return self.wnd + + +class Dib(object): + """ + A Windows bitmap with the given mode and size. The mode can be one of "1", + "L", "P", or "RGB". + + If the display requires a palette, this constructor creates a suitable + palette and associates it with the image. For an "L" image, 128 greylevels + are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together + with 20 greylevels. + + To make sure that palettes work properly under Windows, you must call the + **palette** method upon certain events from Windows. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. The mode can be one of "1", + "L", "P", or "RGB". + :param size: If the first argument is a mode string, this + defines the size of the image. + """ + + def __init__(self, image, size=None): + if hasattr(image, "mode") and hasattr(image, "size"): + mode = image.mode + size = image.size + else: + mode = image + image = None + if mode not in ["1", "L", "P", "RGB"]: + mode = Image.getmodebase(mode) + self.image = Image.core.display(mode, size) + self.mode = mode + self.size = size + if image: + self.paste(image) + + def expose(self, handle): + """ + Copy the bitmap contents to a device context. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. In PythonWin, you can use the + :py:meth:`CDC.GetHandleAttrib` to get a suitable handle. + """ + if isinstance(handle, HWND): + dc = self.image.getdc(handle) + try: + result = self.image.expose(dc) + finally: + self.image.releasedc(handle, dc) + else: + result = self.image.expose(handle) + return result + + def draw(self, handle, dst, src=None): + """ + Same as expose, but allows you to specify where to draw the image, and + what part of it to draw. + + The destination and source areas are given as 4-tuple rectangles. If + the source is omitted, the entire image is copied. If the source and + the destination have different sizes, the image is resized as + necessary. + """ + if not src: + src = (0, 0) + self.size + if isinstance(handle, HWND): + dc = self.image.getdc(handle) + try: + result = self.image.draw(dc, dst, src) + finally: + self.image.releasedc(handle, dc) + else: + result = self.image.draw(handle, dst, src) + return result + + def query_palette(self, handle): + """ + Installs the palette associated with the image in the given device + context. + + This method should be called upon **QUERYNEWPALETTE** and + **PALETTECHANGED** events from Windows. If this method returns a + non-zero value, one or more display palette entries were changed, and + the image should be redrawn. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. + :return: A true value if one or more entries were changed (this + indicates that the image should be redrawn). + """ + if isinstance(handle, HWND): + handle = self.image.getdc(handle) + try: + result = self.image.query_palette(handle) + finally: + self.image.releasedc(handle, handle) + else: + result = self.image.query_palette(handle) + return result + + def paste(self, im, box=None): + """ + Paste a PIL image into the bitmap image. + + :param im: A PIL image. The size must match the target region. + If the mode does not match, the image is converted to the + mode of the bitmap image. + :param box: A 4-tuple defining the left, upper, right, and + lower pixel coordinate. If None is given instead of a + tuple, all of the image is assumed. + """ + im.load() + if self.mode != im.mode: + im = im.convert(self.mode) + if box: + self.image.paste(im.im, box) + else: + self.image.paste(im.im) + + def frombytes(self, buffer): + """ + Load display memory contents from byte data. + + :param buffer: A buffer containing display data (usually + data returned from tobytes) + """ + return self.image.frombytes(buffer) + + def tobytes(self): + """ + Copy display memory contents to bytes object. + + :return: A bytes object containing display data. + """ + return self.image.tobytes() + + +class Window(object): + """Create a Window with the given title size.""" + + def __init__(self, title="PIL", width=None, height=None): + self.hwnd = Image.core.createwindow( + title, self.__dispatcher, width or 0, height or 0 + ) + + def __dispatcher(self, action, *args): + return getattr(self, "ui_handle_" + action)(*args) + + def ui_handle_clear(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_damage(self, x0, y0, x1, y1): + pass + + def ui_handle_destroy(self): + pass + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_resize(self, width, height): + pass + + def mainloop(self): + Image.core.eventloop() + + +class ImageWindow(Window): + """Create an image window which displays the given image.""" + + def __init__(self, image, title="PIL"): + if not isinstance(image, Dib): + image = Dib(image) + self.image = image + width, height = image.size + Window.__init__(self, title, width=width, height=height) + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/ascii2img/src/PIL/ImtImagePlugin.py b/ascii2img/src/PIL/ImtImagePlugin.py new file mode 100644 index 0000000..05e8cd3 --- /dev/null +++ b/ascii2img/src/PIL/ImtImagePlugin.py @@ -0,0 +1,95 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IM Tools support for PIL +# +# history: +# 1996-05-27 fl Created (read 8-bit images only) +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# + + +import re + +from . import Image, ImageFile + +__version__ = "0.2" + + +# +# -------------------------------------------------------------------- + +field = re.compile(br"([a-z]*) ([^ \r\n]*)") + + +## +# Image plugin for IM Tools images. + +class ImtImageFile(ImageFile.ImageFile): + + format = "IMT" + format_description = "IM Tools" + + def _open(self): + + # Quick rejection: if there's not a LF among the first + # 100 bytes, this is (probably) not a text header. + + if b"\n" not in self.fp.read(100): + raise SyntaxError("not an IM file") + self.fp.seek(0) + + xsize = ysize = 0 + + while True: + + s = self.fp.read(1) + if not s: + break + + if s == b'\x0C': + + # image data begins + self.tile = [("raw", (0, 0)+self.size, + self.fp.tell(), + (self.mode, 0, 1))] + + break + + else: + + # read key/value pair + # FIXME: dangerous, may read whole file + s = s + self.fp.readline() + if len(s) == 1 or len(s) > 100: + break + if s[0] == ord(b"*"): + continue # comment + + m = field.match(s) + if not m: + break + k, v = m.group(1, 2) + if k == "width": + xsize = int(v) + self.size = xsize, ysize + elif k == "height": + ysize = int(v) + self.size = xsize, ysize + elif k == "pixel" and v == "n8": + self.mode = "L" + + +# +# -------------------------------------------------------------------- + +Image.register_open(ImtImageFile.format, ImtImageFile) + +# +# no extension registered (".im" is simply too common) diff --git a/ascii2img/src/PIL/IptcImagePlugin.py b/ascii2img/src/PIL/IptcImagePlugin.py new file mode 100644 index 0000000..f5a8de1 --- /dev/null +++ b/ascii2img/src/PIL/IptcImagePlugin.py @@ -0,0 +1,257 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IPTC/NAA file handling +# +# history: +# 1995-10-01 fl Created +# 1998-03-09 fl Cleaned up and added to PIL +# 2002-06-18 fl Added getiptcinfo helper +# +# Copyright (c) Secret Labs AB 1997-2002. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from . import Image, ImageFile +from ._binary import i8, i16be as i16, i32be as i32, o8 +import os +import tempfile + +__version__ = "0.3" + +COMPRESSION = { + 1: "raw", + 5: "jpeg" +} + +PAD = o8(0) * 4 + + +# +# Helpers + +def i(c): + return i32((PAD + c)[-4:]) + + +def dump(c): + for i in c: + print("%02x" % i8(i), end=' ') + print() + + +## +# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields +# from TIFF and JPEG files, use the getiptcinfo function. + +class IptcImageFile(ImageFile.ImageFile): + + format = "IPTC" + format_description = "IPTC/NAA" + + def getint(self, key): + return i(self.info[key]) + + def field(self): + # + # get a IPTC field header + s = self.fp.read(5) + if not len(s): + return None, 0 + + tag = i8(s[1]), i8(s[2]) + + # syntax + if i8(s[0]) != 0x1C or tag[0] < 1 or tag[0] > 9: + raise SyntaxError("invalid IPTC/NAA file") + + # field size + size = i8(s[3]) + if size > 132: + raise IOError("illegal field length in IPTC/NAA file") + elif size == 128: + size = 0 + elif size > 128: + size = i(self.fp.read(size-128)) + else: + size = i16(s[3:]) + + return tag, size + + def _open(self): + + # load descriptive fields + while True: + offset = self.fp.tell() + tag, size = self.field() + if not tag or tag == (8, 10): + break + if size: + tagdata = self.fp.read(size) + else: + tagdata = None + if tag in self.info: + if isinstance(self.info[tag], list): + self.info[tag].append(tagdata) + else: + self.info[tag] = [self.info[tag], tagdata] + else: + self.info[tag] = tagdata + + # print(tag, self.info[tag]) + + # mode + layers = i8(self.info[(3, 60)][0]) + component = i8(self.info[(3, 60)][1]) + if (3, 65) in self.info: + id = i8(self.info[(3, 65)][0])-1 + else: + id = 0 + if layers == 1 and not component: + self.mode = "L" + elif layers == 3 and component: + self.mode = "RGB"[id] + elif layers == 4 and component: + self.mode = "CMYK"[id] + + # size + self.size = self.getint((3, 20)), self.getint((3, 30)) + + # compression + try: + compression = COMPRESSION[self.getint((3, 120))] + except KeyError: + raise IOError("Unknown IPTC image compression") + + # tile + if tag == (8, 10): + self.tile = [("iptc", (compression, offset), + (0, 0, self.size[0], self.size[1]))] + + def load(self): + + if len(self.tile) != 1 or self.tile[0][0] != "iptc": + return ImageFile.ImageFile.load(self) + + type, tile, box = self.tile[0] + + encoding, offset = tile + + self.fp.seek(offset) + + # Copy image data to temporary file + o_fd, outfile = tempfile.mkstemp(text=False) + o = os.fdopen(o_fd) + if encoding == "raw": + # To simplify access to the extracted file, + # prepend a PPM header + o.write("P5\n%d %d\n255\n" % self.size) + while True: + type, size = self.field() + if type != (8, 10): + break + while size > 0: + s = self.fp.read(min(size, 8192)) + if not s: + break + o.write(s) + size -= len(s) + o.close() + + try: + _im = Image.open(outfile) + _im.load() + self.im = _im.im + finally: + try: + os.unlink(outfile) + except OSError: + pass + + +Image.register_open(IptcImageFile.format, IptcImageFile) + +Image.register_extension(IptcImageFile.format, ".iim") + + +def getiptcinfo(im): + """ + Get IPTC information from TIFF, JPEG, or IPTC file. + + :param im: An image containing IPTC data. + :returns: A dictionary containing IPTC information, or None if + no IPTC information block was found. + """ + from . import TiffImagePlugin, JpegImagePlugin + import io + + data = None + + if isinstance(im, IptcImageFile): + # return info dictionary right away + return im.info + + elif isinstance(im, JpegImagePlugin.JpegImageFile): + # extract the IPTC/NAA resource + try: + app = im.app["APP13"] + if app[:14] == b"Photoshop 3.0\x00": + app = app[14:] + # parse the image resource block + offset = 0 + while app[offset:offset+4] == b"8BIM": + offset += 4 + # resource code + code = i16(app, offset) + offset += 2 + # resource name (usually empty) + name_len = i8(app[offset]) + # name = app[offset+1:offset+1+name_len] + offset = 1 + offset + name_len + if offset & 1: + offset += 1 + # resource data block + size = i32(app, offset) + offset += 4 + if code == 0x0404: + # 0x0404 contains IPTC/NAA data + data = app[offset:offset+size] + break + offset = offset + size + if offset & 1: + offset += 1 + except (AttributeError, KeyError): + pass + + elif isinstance(im, TiffImagePlugin.TiffImageFile): + # get raw data from the IPTC/NAA tag (PhotoShop tags the data + # as 4-byte integers, so we cannot use the get method...) + try: + data = im.tag.tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] + except (AttributeError, KeyError): + pass + + if data is None: + return None # no properties + + # create an IptcImagePlugin object without initializing it + class FakeImage(object): + pass + im = FakeImage() + im.__class__ = IptcImageFile + + # parse the IPTC information chunk + im.info = {} + im.fp = io.BytesIO(data) + + try: + im._open() + except (IndexError, KeyError): + pass # expected failure + + return im.info diff --git a/ascii2img/src/PIL/Jpeg2KImagePlugin.py b/ascii2img/src/PIL/Jpeg2KImagePlugin.py new file mode 100644 index 0000000..c67cc14 --- /dev/null +++ b/ascii2img/src/PIL/Jpeg2KImagePlugin.py @@ -0,0 +1,275 @@ +# +# The Python Imaging Library +# $Id$ +# +# JPEG2000 file handling +# +# History: +# 2014-03-12 ajh Created +# +# Copyright (c) 2014 Coriolis Systems Limited +# Copyright (c) 2014 Alastair Houghton +# +# See the README file for information on usage and redistribution. +# +from . import Image, ImageFile +import struct +import os +import io + +__version__ = "0.1" + + +def _parse_codestream(fp): + """Parse the JPEG 2000 codestream to extract the size and component + count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" + + hdr = fp.read(2) + lsiz = struct.unpack('>H', hdr)[0] + siz = hdr + fp.read(lsiz - 2) + lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, xtsiz, ytsiz, \ + xtosiz, ytosiz, csiz \ + = struct.unpack('>HHIIIIIIIIH', siz[:38]) + ssiz = [None]*csiz + xrsiz = [None]*csiz + yrsiz = [None]*csiz + for i in range(csiz): + ssiz[i], xrsiz[i], yrsiz[i] \ + = struct.unpack('>BBB', siz[36 + 3 * i:39 + 3 * i]) + + size = (xsiz - xosiz, ysiz - yosiz) + if csiz == 1: + if (yrsiz[0] & 0x7f) > 8: + mode = 'I;16' + else: + mode = 'L' + elif csiz == 2: + mode = 'LA' + elif csiz == 3: + mode = 'RGB' + elif csiz == 4: + mode = 'RGBA' + else: + mode = None + + return (size, mode) + + +def _parse_jp2_header(fp): + """Parse the JP2 header box to extract size, component count and + color space information, returning a PIL (size, mode) tuple.""" + + # Find the JP2 header box + header = None + while True: + lbox, tbox = struct.unpack('>I4s', fp.read(8)) + if lbox == 1: + lbox = struct.unpack('>Q', fp.read(8))[0] + hlen = 16 + else: + hlen = 8 + + if lbox < hlen: + raise SyntaxError('Invalid JP2 header length') + + if tbox == b'jp2h': + header = fp.read(lbox - hlen) + break + else: + fp.seek(lbox - hlen, os.SEEK_CUR) + + if header is None: + raise SyntaxError('could not find JP2 header') + + size = None + mode = None + bpc = None + nc = None + + hio = io.BytesIO(header) + while True: + lbox, tbox = struct.unpack('>I4s', hio.read(8)) + if lbox == 1: + lbox = struct.unpack('>Q', hio.read(8))[0] + hlen = 16 + else: + hlen = 8 + + content = hio.read(lbox - hlen) + + if tbox == b'ihdr': + height, width, nc, bpc, c, unkc, ipr \ + = struct.unpack('>IIHBBBB', content) + size = (width, height) + if unkc: + if nc == 1 and (bpc & 0x7f) > 8: + mode = 'I;16' + elif nc == 1: + mode = 'L' + elif nc == 2: + mode = 'LA' + elif nc == 3: + mode = 'RGB' + elif nc == 4: + mode = 'RGBA' + break + elif tbox == b'colr': + meth, prec, approx = struct.unpack('>BBB', content[:3]) + if meth == 1: + cs = struct.unpack('>I', content[3:7])[0] + if cs == 16: # sRGB + if nc == 1 and (bpc & 0x7f) > 8: + mode = 'I;16' + elif nc == 1: + mode = 'L' + elif nc == 3: + mode = 'RGB' + elif nc == 4: + mode = 'RGBA' + break + elif cs == 17: # grayscale + if nc == 1 and (bpc & 0x7f) > 8: + mode = 'I;16' + elif nc == 1: + mode = 'L' + elif nc == 2: + mode = 'LA' + break + elif cs == 18: # sYCC + if nc == 3: + mode = 'RGB' + elif nc == 4: + mode = 'RGBA' + break + + if size is None or mode is None: + raise SyntaxError("Malformed jp2 header") + + return (size, mode) + +## +# Image plugin for JPEG2000 images. + + +class Jpeg2KImageFile(ImageFile.ImageFile): + format = "JPEG2000" + format_description = "JPEG 2000 (ISO 15444)" + + def _open(self): + sig = self.fp.read(4) + if sig == b'\xff\x4f\xff\x51': + self.codec = "j2k" + self.size, self.mode = _parse_codestream(self.fp) + else: + sig = sig + self.fp.read(8) + + if sig == b'\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a': + self.codec = "jp2" + self.size, self.mode = _parse_jp2_header(self.fp) + else: + raise SyntaxError('not a JPEG 2000 file') + + if self.size is None or self.mode is None: + raise SyntaxError('unable to determine size/mode') + + self.reduce = 0 + self.layers = 0 + + fd = -1 + length = -1 + + try: + fd = self.fp.fileno() + length = os.fstat(fd).st_size + except: + fd = -1 + try: + pos = self.fp.tell() + self.fp.seek(0, 2) + length = self.fp.tell() + self.fp.seek(pos, 0) + except: + length = -1 + + self.tile = [('jpeg2k', (0, 0) + self.size, 0, + (self.codec, self.reduce, self.layers, fd, length, self.fp))] + + def load(self): + if self.reduce: + power = 1 << self.reduce + adjust = power >> 1 + self.size = (int((self.size[0] + adjust) / power), + int((self.size[1] + adjust) / power)) + + if self.tile: + # Update the reduce and layers settings + t = self.tile[0] + t3 = (t[3][0], self.reduce, self.layers, t[3][3], t[3][4]) + self.tile = [(t[0], (0, 0) + self.size, t[2], t3)] + + return ImageFile.ImageFile.load(self) + + +def _accept(prefix): + return (prefix[:4] == b'\xff\x4f\xff\x51' or + prefix[:12] == b'\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a') + + +# ------------------------------------------------------------ +# Save support + +def _save(im, fp, filename): + if filename.endswith('.j2k'): + kind = 'j2k' + else: + kind = 'jp2' + + # Get the keyword arguments + info = im.encoderinfo + + offset = info.get('offset', None) + tile_offset = info.get('tile_offset', None) + tile_size = info.get('tile_size', None) + quality_mode = info.get('quality_mode', 'rates') + quality_layers = info.get('quality_layers', None) + num_resolutions = info.get('num_resolutions', 0) + cblk_size = info.get('codeblock_size', None) + precinct_size = info.get('precinct_size', None) + irreversible = info.get('irreversible', False) + progression = info.get('progression', 'LRCP') + cinema_mode = info.get('cinema_mode', 'no') + fd = -1 + + if hasattr(fp, "fileno"): + try: + fd = fp.fileno() + except: + fd = -1 + + im.encoderconfig = ( + offset, + tile_offset, + tile_size, + quality_mode, + quality_layers, + num_resolutions, + cblk_size, + precinct_size, + irreversible, + progression, + cinema_mode, + fd + ) + + ImageFile._save(im, fp, [('jpeg2k', (0, 0)+im.size, 0, kind)]) + +# ------------------------------------------------------------ +# Registry stuff + +Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) +Image.register_save(Jpeg2KImageFile.format, _save) + +Image.register_extensions(Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"]) + +Image.register_mime(Jpeg2KImageFile.format, 'image/jp2') +Image.register_mime(Jpeg2KImageFile.format, 'image/jpx') diff --git a/ascii2img/src/PIL/JpegImagePlugin.py b/ascii2img/src/PIL/JpegImagePlugin.py new file mode 100644 index 0000000..d286f79 --- /dev/null +++ b/ascii2img/src/PIL/JpegImagePlugin.py @@ -0,0 +1,788 @@ +# +# The Python Imaging Library. +# $Id$ +# +# JPEG (JFIF) file handling +# +# See "Digital Compression and Coding of Continuous-Tone Still Images, +# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) +# +# History: +# 1995-09-09 fl Created +# 1995-09-13 fl Added full parser +# 1996-03-25 fl Added hack to use the IJG command line utilities +# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug +# 1996-05-28 fl Added draft support, JFIF version (0.1) +# 1996-12-30 fl Added encoder options, added progression property (0.2) +# 1997-08-27 fl Save mode 1 images as BW (0.3) +# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) +# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) +# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) +# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) +# 2003-04-25 fl Added experimental EXIF decoder (0.5) +# 2003-06-06 fl Added experimental EXIF GPSinfo decoder +# 2003-09-13 fl Extract COM markers +# 2009-09-06 fl Added icc_profile support (from Florian Hoech) +# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) +# 2009-03-08 fl Added subsampling support (from Justin Huff). +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +import array +import struct +import io +import warnings +from . import Image, ImageFile, TiffImagePlugin +from ._binary import i8, o8, i16be as i16 +from .JpegPresets import presets +from ._util import isStringType + +__version__ = "0.6" + + +# +# Parser + +def Skip(self, marker): + n = i16(self.fp.read(2))-2 + ImageFile._safe_read(self.fp, n) + + +def APP(self, marker): + # + # Application marker. Store these in the APP dictionary. + # Also look for well-known application markers. + + n = i16(self.fp.read(2))-2 + s = ImageFile._safe_read(self.fp, n) + + app = "APP%d" % (marker & 15) + + self.app[app] = s # compatibility + self.applist.append((app, s)) + + if marker == 0xFFE0 and s[:4] == b"JFIF": + # extract JFIF information + self.info["jfif"] = version = i16(s, 5) # version + self.info["jfif_version"] = divmod(version, 256) + # extract JFIF properties + try: + jfif_unit = i8(s[7]) + jfif_density = i16(s, 8), i16(s, 10) + except: + pass + else: + if jfif_unit == 1: + self.info["dpi"] = jfif_density + self.info["jfif_unit"] = jfif_unit + self.info["jfif_density"] = jfif_density + elif marker == 0xFFE1 and s[:5] == b"Exif\0": + # extract Exif information (incomplete) + self.info["exif"] = s # FIXME: value will change + elif marker == 0xFFE2 and s[:5] == b"FPXR\0": + # extract FlashPix information (incomplete) + self.info["flashpix"] = s # FIXME: value will change + elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": + # Since an ICC profile can be larger than the maximum size of + # a JPEG marker (64K), we need provisions to split it into + # multiple markers. The format defined by the ICC specifies + # one or more APP2 markers containing the following data: + # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) + # Marker sequence number 1, 2, etc (1 byte) + # Number of markers Total of APP2's used (1 byte) + # Profile data (remainder of APP2 data) + # Decoders should use the marker sequence numbers to + # reassemble the profile, rather than assuming that the APP2 + # markers appear in the correct sequence. + self.icclist.append(s) + elif marker == 0xFFEE and s[:5] == b"Adobe": + self.info["adobe"] = i16(s, 5) + # extract Adobe custom properties + try: + adobe_transform = i8(s[1]) + except: + pass + else: + self.info["adobe_transform"] = adobe_transform + elif marker == 0xFFE2 and s[:4] == b"MPF\0": + # extract MPO information + self.info["mp"] = s[4:] + # offset is current location minus buffer size + # plus constant header size + self.info["mpoffset"] = self.fp.tell() - n + 4 + + # If DPI isn't in JPEG header, fetch from EXIF + if "dpi" not in self.info and "exif" in self.info: + try: + exif = self._getexif() + resolution_unit = exif[0x0128] + x_resolution = exif[0x011A] + try: + dpi = x_resolution[0] / x_resolution[1] + except TypeError: + dpi = x_resolution + if resolution_unit == 3: # cm + # 1 dpcm = 2.54 dpi + dpi *= 2.54 + self.info["dpi"] = dpi, dpi + except (KeyError, SyntaxError, ZeroDivisionError): + # SyntaxError for invalid/unreadable exif + # KeyError for dpi not included + # ZeroDivisionError for invalid dpi rational value + self.info["dpi"] = 72, 72 + + +def COM(self, marker): + # + # Comment marker. Store these in the APP dictionary. + n = i16(self.fp.read(2))-2 + s = ImageFile._safe_read(self.fp, n) + + self.app["COM"] = s # compatibility + self.applist.append(("COM", s)) + + +def SOF(self, marker): + # + # Start of frame marker. Defines the size and mode of the + # image. JPEG is colour blind, so we use some simple + # heuristics to map the number of layers to an appropriate + # mode. Note that this could be made a bit brighter, by + # looking for JFIF and Adobe APP markers. + + n = i16(self.fp.read(2))-2 + s = ImageFile._safe_read(self.fp, n) + self.size = i16(s[3:]), i16(s[1:]) + + self.bits = i8(s[0]) + if self.bits != 8: + raise SyntaxError("cannot handle %d-bit layers" % self.bits) + + self.layers = i8(s[5]) + if self.layers == 1: + self.mode = "L" + elif self.layers == 3: + self.mode = "RGB" + elif self.layers == 4: + self.mode = "CMYK" + else: + raise SyntaxError("cannot handle %d-layer images" % self.layers) + + if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: + self.info["progressive"] = self.info["progression"] = 1 + + if self.icclist: + # fixup icc profile + self.icclist.sort() # sort by sequence number + if i8(self.icclist[0][13]) == len(self.icclist): + profile = [] + for p in self.icclist: + profile.append(p[14:]) + icc_profile = b"".join(profile) + else: + icc_profile = None # wrong number of fragments + self.info["icc_profile"] = icc_profile + self.icclist = None + + for i in range(6, len(s), 3): + t = s[i:i+3] + # 4-tuples: id, vsamp, hsamp, qtable + self.layer.append((t[0], i8(t[1])//16, i8(t[1]) & 15, i8(t[2]))) + + +def DQT(self, marker): + # + # Define quantization table. Support baseline 8-bit tables + # only. Note that there might be more than one table in + # each marker. + + # FIXME: The quantization tables can be used to estimate the + # compression quality. + + n = i16(self.fp.read(2))-2 + s = ImageFile._safe_read(self.fp, n) + while len(s): + if len(s) < 65: + raise SyntaxError("bad quantization table marker") + v = i8(s[0]) + if v//16 == 0: + self.quantization[v & 15] = array.array("B", s[1:65]) + s = s[65:] + else: + return # FIXME: add code to read 16-bit tables! + # raise SyntaxError, "bad quantization table element size" + + +# +# JPEG marker table + +MARKER = { + 0xFFC0: ("SOF0", "Baseline DCT", SOF), + 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), + 0xFFC2: ("SOF2", "Progressive DCT", SOF), + 0xFFC3: ("SOF3", "Spatial lossless", SOF), + 0xFFC4: ("DHT", "Define Huffman table", Skip), + 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), + 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), + 0xFFC7: ("SOF7", "Differential spatial", SOF), + 0xFFC8: ("JPG", "Extension", None), + 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), + 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), + 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), + 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), + 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), + 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), + 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), + 0xFFD0: ("RST0", "Restart 0", None), + 0xFFD1: ("RST1", "Restart 1", None), + 0xFFD2: ("RST2", "Restart 2", None), + 0xFFD3: ("RST3", "Restart 3", None), + 0xFFD4: ("RST4", "Restart 4", None), + 0xFFD5: ("RST5", "Restart 5", None), + 0xFFD6: ("RST6", "Restart 6", None), + 0xFFD7: ("RST7", "Restart 7", None), + 0xFFD8: ("SOI", "Start of image", None), + 0xFFD9: ("EOI", "End of image", None), + 0xFFDA: ("SOS", "Start of scan", Skip), + 0xFFDB: ("DQT", "Define quantization table", DQT), + 0xFFDC: ("DNL", "Define number of lines", Skip), + 0xFFDD: ("DRI", "Define restart interval", Skip), + 0xFFDE: ("DHP", "Define hierarchical progression", SOF), + 0xFFDF: ("EXP", "Expand reference component", Skip), + 0xFFE0: ("APP0", "Application segment 0", APP), + 0xFFE1: ("APP1", "Application segment 1", APP), + 0xFFE2: ("APP2", "Application segment 2", APP), + 0xFFE3: ("APP3", "Application segment 3", APP), + 0xFFE4: ("APP4", "Application segment 4", APP), + 0xFFE5: ("APP5", "Application segment 5", APP), + 0xFFE6: ("APP6", "Application segment 6", APP), + 0xFFE7: ("APP7", "Application segment 7", APP), + 0xFFE8: ("APP8", "Application segment 8", APP), + 0xFFE9: ("APP9", "Application segment 9", APP), + 0xFFEA: ("APP10", "Application segment 10", APP), + 0xFFEB: ("APP11", "Application segment 11", APP), + 0xFFEC: ("APP12", "Application segment 12", APP), + 0xFFED: ("APP13", "Application segment 13", APP), + 0xFFEE: ("APP14", "Application segment 14", APP), + 0xFFEF: ("APP15", "Application segment 15", APP), + 0xFFF0: ("JPG0", "Extension 0", None), + 0xFFF1: ("JPG1", "Extension 1", None), + 0xFFF2: ("JPG2", "Extension 2", None), + 0xFFF3: ("JPG3", "Extension 3", None), + 0xFFF4: ("JPG4", "Extension 4", None), + 0xFFF5: ("JPG5", "Extension 5", None), + 0xFFF6: ("JPG6", "Extension 6", None), + 0xFFF7: ("JPG7", "Extension 7", None), + 0xFFF8: ("JPG8", "Extension 8", None), + 0xFFF9: ("JPG9", "Extension 9", None), + 0xFFFA: ("JPG10", "Extension 10", None), + 0xFFFB: ("JPG11", "Extension 11", None), + 0xFFFC: ("JPG12", "Extension 12", None), + 0xFFFD: ("JPG13", "Extension 13", None), + 0xFFFE: ("COM", "Comment", COM) +} + + +def _accept(prefix): + return prefix[0:1] == b"\377" + + +## +# Image plugin for JPEG and JFIF images. + +class JpegImageFile(ImageFile.ImageFile): + + format = "JPEG" + format_description = "JPEG (ISO 10918)" + + def _open(self): + + s = self.fp.read(1) + + if i8(s) != 255: + raise SyntaxError("not a JPEG file") + + # Create attributes + self.bits = self.layers = 0 + + # JPEG specifics (internal) + self.layer = [] + self.huffman_dc = {} + self.huffman_ac = {} + self.quantization = {} + self.app = {} # compatibility + self.applist = [] + self.icclist = [] + + while True: + + i = i8(s) + if i == 0xFF: + s = s + self.fp.read(1) + i = i16(s) + else: + # Skip non-0xFF junk + s = self.fp.read(1) + continue + + if i in MARKER: + name, description, handler = MARKER[i] + # print(hex(i), name, description) + if handler is not None: + handler(self, i) + if i == 0xFFDA: # start of scan + rawmode = self.mode + if self.mode == "CMYK": + rawmode = "CMYK;I" # assume adobe conventions + self.tile = [("jpeg", (0, 0) + self.size, 0, + (rawmode, ""))] + # self.__offset = self.fp.tell() + break + s = self.fp.read(1) + elif i == 0 or i == 0xFFFF: + # padded marker or junk; move on + s = b"\xff" + elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) + s = self.fp.read(1) + else: + raise SyntaxError("no marker found") + + def draft(self, mode, size): + + if len(self.tile) != 1: + return + + # Protect from second call + if self.decoderconfig: + return + + d, e, o, a = self.tile[0] + scale = 0 + + if a[0] == "RGB" and mode in ["L", "YCbCr"]: + self.mode = mode + a = mode, "" + + if size: + scale = min(self.size[0] // size[0], self.size[1] // size[1]) + for s in [8, 4, 2, 1]: + if scale >= s: + break + e = e[0], e[1], (e[2]-e[0]+s-1)//s+e[0], (e[3]-e[1]+s-1)//s+e[1] + self.size = ((self.size[0]+s-1)//s, (self.size[1]+s-1)//s) + scale = s + + self.tile = [(d, e, o, a)] + self.decoderconfig = (scale, 0) + + return self + + def load_djpeg(self): + + # ALTERNATIVE: handle JPEGs via the IJG command line utilities + + import subprocess + import tempfile + import os + f, path = tempfile.mkstemp() + os.close(f) + if os.path.exists(self.filename): + subprocess.check_call(["djpeg", "-outfile", path, self.filename]) + else: + raise ValueError("Invalid Filename") + + try: + _im = Image.open(path) + _im.load() + self.im = _im.im + finally: + try: + os.unlink(path) + except OSError: + pass + + self.mode = self.im.mode + self.size = self.im.size + + self.tile = [] + + def _getexif(self): + return _getexif(self) + + def _getmp(self): + return _getmp(self) + + +def _fixup_dict(src_dict): + # Helper function for _getexif() + # returns a dict with any single item tuples/lists as individual values + def _fixup(value): + try: + if len(value) == 1 and not isinstance(value, dict): + return value[0] + except: + pass + return value + + return {k: _fixup(v) for k, v in src_dict.items()} + + +def _getexif(self): + # Extract EXIF information. This method is highly experimental, + # and is likely to be replaced with something better in a future + # version. + + # The EXIF record consists of a TIFF file embedded in a JPEG + # application marker (!). + try: + data = self.info["exif"] + except KeyError: + return None + file = io.BytesIO(data[6:]) + head = file.read(8) + # process dictionary + info = TiffImagePlugin.ImageFileDirectory_v1(head) + info.load(file) + exif = dict(_fixup_dict(info)) + # get exif extension + try: + # exif field 0x8769 is an offset pointer to the location + # of the nested embedded exif ifd. + # It should be a long, but may be corrupted. + file.seek(exif[0x8769]) + except (KeyError, TypeError): + pass + else: + info = TiffImagePlugin.ImageFileDirectory_v1(head) + info.load(file) + exif.update(_fixup_dict(info)) + # get gpsinfo extension + try: + # exif field 0x8825 is an offset pointer to the location + # of the nested embedded gps exif ifd. + # It should be a long, but may be corrupted. + file.seek(exif[0x8825]) + except (KeyError, TypeError): + pass + else: + info = TiffImagePlugin.ImageFileDirectory_v1(head) + info.load(file) + exif[0x8825] = _fixup_dict(info) + + return exif + + +def _getmp(self): + # Extract MP information. This method was inspired by the "highly + # experimental" _getexif version that's been in use for years now, + # itself based on the ImageFileDirectory class in the TIFF plug-in. + + # The MP record essentially consists of a TIFF file embedded in a JPEG + # application marker. + try: + data = self.info["mp"] + except KeyError: + return None + file_contents = io.BytesIO(data) + head = file_contents.read(8) + endianness = '>' if head[:4] == b'\x4d\x4d\x00\x2a' else '<' + # process dictionary + try: + info = TiffImagePlugin.ImageFileDirectory_v2(head) + info.load(file_contents) + mp = dict(info) + except: + raise SyntaxError("malformed MP Index (unreadable directory)") + # it's an error not to have a number of images + try: + quant = mp[0xB001] + except KeyError: + raise SyntaxError("malformed MP Index (no number of images)") + # get MP entries + mpentries = [] + try: + rawmpentries = mp[0xB002] + for entrynum in range(0, quant): + unpackedentry = struct.unpack_from( + '{}LLLHH'.format(endianness), rawmpentries, entrynum * 16) + labels = ('Attribute', 'Size', 'DataOffset', 'EntryNo1', + 'EntryNo2') + mpentry = dict(zip(labels, unpackedentry)) + mpentryattr = { + 'DependentParentImageFlag': bool(mpentry['Attribute'] & + (1 << 31)), + 'DependentChildImageFlag': bool(mpentry['Attribute'] & + (1 << 30)), + 'RepresentativeImageFlag': bool(mpentry['Attribute'] & + (1 << 29)), + 'Reserved': (mpentry['Attribute'] & (3 << 27)) >> 27, + 'ImageDataFormat': (mpentry['Attribute'] & (7 << 24)) >> 24, + 'MPType': mpentry['Attribute'] & 0x00FFFFFF + } + if mpentryattr['ImageDataFormat'] == 0: + mpentryattr['ImageDataFormat'] = 'JPEG' + else: + raise SyntaxError("unsupported picture format in MPO") + mptypemap = { + 0x000000: 'Undefined', + 0x010001: 'Large Thumbnail (VGA Equivalent)', + 0x010002: 'Large Thumbnail (Full HD Equivalent)', + 0x020001: 'Multi-Frame Image (Panorama)', + 0x020002: 'Multi-Frame Image: (Disparity)', + 0x020003: 'Multi-Frame Image: (Multi-Angle)', + 0x030000: 'Baseline MP Primary Image' + } + mpentryattr['MPType'] = mptypemap.get(mpentryattr['MPType'], + 'Unknown') + mpentry['Attribute'] = mpentryattr + mpentries.append(mpentry) + mp[0xB002] = mpentries + except KeyError: + raise SyntaxError("malformed MP Index (bad MP Entry)") + # Next we should try and parse the individual image unique ID list; + # we don't because I've never seen this actually used in a real MPO + # file and so can't test it. + return mp + + +# -------------------------------------------------------------------- +# stuff to save JPEG files + +RAWMODE = { + "1": "L", + "L": "L", + "RGB": "RGB", + "RGBX": "RGB", + "CMYK": "CMYK;I", # assume adobe conventions + "YCbCr": "YCbCr", +} + +zigzag_index = (0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63) + +samplings = {(1, 1, 1, 1, 1, 1): 0, + (2, 1, 1, 1, 1, 1): 1, + (2, 2, 1, 1, 1, 1): 2, + } + + +def convert_dict_qtables(qtables): + qtables = [qtables[key] for key in range(len(qtables)) if key in qtables] + for idx, table in enumerate(qtables): + qtables[idx] = [table[i] for i in zigzag_index] + return qtables + + +def get_sampling(im): + # There's no subsampling when image have only 1 layer + # (grayscale images) or when they are CMYK (4 layers), + # so set subsampling to default value. + # + # NOTE: currently Pillow can't encode JPEG to YCCK format. + # If YCCK support is added in the future, subsampling code will have + # to be updated (here and in JpegEncode.c) to deal with 4 layers. + if not hasattr(im, 'layers') or im.layers in (1, 4): + return -1 + sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] + return samplings.get(sampling, -1) + + +def _save(im, fp, filename): + + try: + rawmode = RAWMODE[im.mode] + except KeyError: + raise IOError("cannot write mode %s as JPEG" % im.mode) + + info = im.encoderinfo + + dpi = [int(round(x)) for x in info.get("dpi", (0, 0))] + + quality = info.get("quality", 0) + subsampling = info.get("subsampling", -1) + qtables = info.get("qtables") + + if quality == "keep": + quality = 0 + subsampling = "keep" + qtables = "keep" + elif quality in presets: + preset = presets[quality] + quality = 0 + subsampling = preset.get('subsampling', -1) + qtables = preset.get('quantization') + elif not isinstance(quality, int): + raise ValueError("Invalid quality setting") + else: + if subsampling in presets: + subsampling = presets[subsampling].get('subsampling', -1) + if isStringType(qtables) and qtables in presets: + qtables = presets[qtables].get('quantization') + + if subsampling == "4:4:4": + subsampling = 0 + elif subsampling == "4:2:2": + subsampling = 1 + elif subsampling == "4:2:0": + subsampling = 2 + elif subsampling == "4:1:1": + # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. + # Set 4:2:0 if someone is still using that value. + subsampling = 2 + elif subsampling == "keep": + if im.format != "JPEG": + raise ValueError( + "Cannot use 'keep' when original image is not a JPEG") + subsampling = get_sampling(im) + + def validate_qtables(qtables): + if qtables is None: + return qtables + if isStringType(qtables): + try: + lines = [int(num) for line in qtables.splitlines() + for num in line.split('#', 1)[0].split()] + except ValueError: + raise ValueError("Invalid quantization table") + else: + qtables = [lines[s:s+64] for s in range(0, len(lines), 64)] + if isinstance(qtables, (tuple, list, dict)): + if isinstance(qtables, dict): + qtables = convert_dict_qtables(qtables) + elif isinstance(qtables, tuple): + qtables = list(qtables) + if not (0 < len(qtables) < 5): + raise ValueError("None or too many quantization tables") + for idx, table in enumerate(qtables): + try: + if len(table) != 64: + raise + table = array.array('B', table) + except TypeError: + raise ValueError("Invalid quantization table") + else: + qtables[idx] = list(table) + return qtables + + if qtables == "keep": + if im.format != "JPEG": + raise ValueError( + "Cannot use 'keep' when original image is not a JPEG") + qtables = getattr(im, "quantization", None) + qtables = validate_qtables(qtables) + + extra = b"" + + icc_profile = info.get("icc_profile") + if icc_profile: + ICC_OVERHEAD_LEN = 14 + MAX_BYTES_IN_MARKER = 65533 + MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN + markers = [] + while icc_profile: + markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER]) + icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:] + i = 1 + for marker in markers: + size = struct.pack(">H", 2 + ICC_OVERHEAD_LEN + len(marker)) + extra += (b"\xFF\xE2" + size + b"ICC_PROFILE\0" + o8(i) + + o8(len(markers)) + marker) + i += 1 + + # "progressive" is the official name, but older documentation + # says "progression" + # FIXME: issue a warning if the wrong form is used (post-1.1.7) + progressive = (info.get("progressive", False) or + info.get("progression", False)) + + optimize = info.get("optimize", False) + + # get keyword arguments + im.encoderconfig = ( + quality, + progressive, + info.get("smooth", 0), + optimize, + info.get("streamtype", 0), + dpi[0], dpi[1], + subsampling, + qtables, + extra, + info.get("exif", b"") + ) + + # if we optimize, libjpeg needs a buffer big enough to hold the whole image + # in a shot. Guessing on the size, at im.size bytes. (raw pizel size is + # channels*size, this is a value that's been used in a django patch. + # https://github.com/matthewwithanm/django-imagekit/issues/50 + bufsize = 0 + if optimize or progressive: + # CMYK can be bigger + if im.mode == 'CMYK': + bufsize = 4 * im.size[0] * im.size[1] + # keep sets quality to 0, but the actual value may be high. + elif quality >= 95 or quality == 0: + bufsize = 2 * im.size[0] * im.size[1] + else: + bufsize = im.size[0] * im.size[1] + + # The exif info needs to be written as one block, + APP1, + one spare byte. + # Ensure that our buffer is big enough. Same with the icc_profile block. + bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif", b"")) + 5, + len(extra) + 1) + + ImageFile._save(im, fp, [("jpeg", (0, 0)+im.size, 0, rawmode)], bufsize) + + +def _save_cjpeg(im, fp, filename): + # ALTERNATIVE: handle JPEGs via the IJG command line utilities. + import os + import subprocess + tempfile = im._dump() + subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) + try: + os.unlink(tempfile) + except OSError: + pass + + +## +# Factory for making JPEG and MPO instances +def jpeg_factory(fp=None, filename=None): + im = JpegImageFile(fp, filename) + try: + mpheader = im._getmp() + if mpheader[45057] > 1: + # It's actually an MPO + from .MpoImagePlugin import MpoImageFile + im = MpoImageFile(fp, filename) + except (TypeError, IndexError): + # It is really a JPEG + pass + except SyntaxError: + warnings.warn("Image appears to be a malformed MPO file, it will be " + "interpreted as a base JPEG file") + return im + + +# -------------------------------------------------------------------q- +# Registry stuff + +Image.register_open(JpegImageFile.format, jpeg_factory, _accept) +Image.register_save(JpegImageFile.format, _save) + +Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) + +Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/ascii2img/src/PIL/JpegPresets.py b/ascii2img/src/PIL/JpegPresets.py new file mode 100644 index 0000000..5f01f0d --- /dev/null +++ b/ascii2img/src/PIL/JpegPresets.py @@ -0,0 +1,241 @@ +""" +JPEG quality settings equivalent to the Photoshop settings. + +More presets can be added to the presets dict if needed. + +Can be use when saving JPEG file. + +To apply the preset, specify:: + + quality="preset_name" + +To apply only the quantization table:: + + qtables="preset_name" + +To apply only the subsampling setting:: + + subsampling="preset_name" + +Example:: + + im.save("image_name.jpg", quality="web_high") + + +Subsampling +----------- + +Subsampling is the practice of encoding images by implementing less resolution +for chroma information than for luma information. +(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) + +Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and +4:2:0. + +You can get the subsampling of a JPEG with the +`JpegImagePlugin.get_subsampling(im)` function. + + +Quantization tables +------------------- + +They are values use by the DCT (Discrete cosine transform) to remove +*unnecessary* information from the image (the lossy part of the compression). +(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, +https://en.wikipedia.org/wiki/JPEG#Quantization) + +You can get the quantization tables of a JPEG with:: + + im.quantization + +This will return a dict with a number of arrays. You can pass this dict +directly as the qtables argument when saving a JPEG. + +The tables format between im.quantization and quantization in presets differ in +3 ways: + +1. The base container of the preset is a list with sublists instead of dict. + dict[0] -> list[0], dict[1] -> list[1], ... +2. Each table in a preset is a list instead of an array. +3. The zigzag order is remove in the preset (needed by libjpeg >= 6a). + +You can convert the dict format to the preset format with the +`JpegImagePlugin.convert_dict_qtables(dict_qtables)` function. + +Libjpeg ref.: https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html + +""" + +presets = { + 'web_low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [20, 16, 25, 39, 50, 46, 62, 68, + 16, 18, 23, 38, 38, 53, 65, 68, + 25, 23, 31, 38, 53, 65, 68, 68, + 39, 38, 38, 53, 65, 68, 68, 68, + 50, 38, 53, 65, 68, 68, 68, 68, + 46, 53, 65, 68, 68, 68, 68, 68, + 62, 65, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68], + [21, 25, 32, 38, 54, 68, 68, 68, + 25, 28, 24, 38, 54, 68, 68, 68, + 32, 24, 32, 43, 66, 68, 68, 68, + 38, 38, 43, 53, 68, 68, 68, 68, + 54, 54, 66, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68] + ]}, + 'web_medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [16, 11, 11, 16, 23, 27, 31, 30, + 11, 12, 12, 15, 20, 23, 23, 30, + 11, 12, 13, 16, 23, 26, 35, 47, + 16, 15, 16, 23, 26, 37, 47, 64, + 23, 20, 23, 26, 39, 51, 64, 64, + 27, 23, 26, 37, 51, 64, 64, 64, + 31, 23, 35, 47, 64, 64, 64, 64, + 30, 30, 47, 64, 64, 64, 64, 64], + [17, 15, 17, 21, 20, 26, 38, 48, + 15, 19, 18, 17, 20, 26, 35, 43, + 17, 18, 20, 22, 26, 30, 46, 53, + 21, 17, 22, 28, 30, 39, 53, 64, + 20, 20, 26, 30, 39, 48, 64, 64, + 26, 26, 30, 39, 48, 63, 64, 64, + 38, 35, 46, 53, 64, 64, 64, 64, + 48, 43, 53, 64, 64, 64, 64, 64] + ]}, + 'web_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 14, 19, + 6, 6, 6, 11, 12, 15, 19, 28, + 9, 8, 10, 12, 16, 20, 27, 31, + 11, 10, 12, 15, 20, 27, 31, 31, + 12, 12, 14, 19, 27, 31, 31, 31, + 16, 12, 19, 28, 31, 31, 31, 31], + [7, 7, 13, 24, 26, 31, 31, 31, + 7, 12, 16, 21, 31, 31, 31, 31, + 13, 16, 17, 31, 31, 31, 31, 31, + 24, 21, 31, 31, 31, 31, 31, 31, + 26, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31] + ]}, + 'web_very_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 11, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 11, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'web_maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 2, 2, 3, + 1, 1, 1, 1, 2, 2, 3, 3, + 1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 2, 2, 3, 3, 3, 3], + [1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 1, 2, 3, 3, 3, 3, + 1, 1, 1, 3, 3, 3, 3, 3, + 2, 2, 3, 3, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3] + ]}, + 'low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [18, 14, 14, 21, 30, 35, 34, 17, + 14, 16, 16, 19, 26, 23, 12, 12, + 14, 16, 17, 21, 23, 12, 12, 12, + 21, 19, 21, 23, 12, 12, 12, 12, + 30, 26, 23, 12, 12, 12, 12, 12, + 35, 23, 12, 12, 12, 12, 12, 12, + 34, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [20, 19, 22, 27, 20, 20, 17, 17, + 19, 25, 23, 14, 14, 12, 12, 12, + 22, 23, 14, 14, 12, 12, 12, 12, + 27, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [12, 8, 8, 12, 17, 21, 24, 17, + 8, 9, 9, 11, 15, 19, 12, 12, + 8, 9, 10, 12, 19, 12, 12, 12, + 12, 11, 12, 21, 12, 12, 12, 12, + 17, 15, 19, 12, 12, 12, 12, 12, + 21, 19, 12, 12, 12, 12, 12, 12, + 24, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [13, 11, 13, 16, 20, 20, 17, 17, + 11, 14, 14, 14, 14, 12, 12, 12, + 13, 14, 14, 14, 12, 12, 12, 12, + 16, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 12, 12, + 6, 6, 6, 11, 12, 12, 12, 12, + 9, 8, 10, 12, 12, 12, 12, 12, + 11, 10, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 16, 12, 12, 12, 12, 12, 12, 12], + [7, 7, 13, 24, 20, 20, 17, 17, + 7, 12, 16, 14, 14, 12, 12, 12, + 13, 16, 14, 14, 12, 12, 12, 12, + 24, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 10, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 10, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, +} diff --git a/ascii2img/src/PIL/McIdasImagePlugin.py b/ascii2img/src/PIL/McIdasImagePlugin.py new file mode 100644 index 0000000..06da33f --- /dev/null +++ b/ascii2img/src/PIL/McIdasImagePlugin.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Basic McIdas support for PIL +# +# History: +# 1997-05-05 fl Created (8-bit images only) +# 2009-03-08 fl Added 16/32-bit support. +# +# Thanks to Richard Jones and Craig Swank for specs and samples. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +import struct +from . import Image, ImageFile + +__version__ = "0.2" + + +def _accept(s): + return s[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" + + +## +# Image plugin for McIdas area images. + +class McIdasImageFile(ImageFile.ImageFile): + + format = "MCIDAS" + format_description = "McIdas area file" + + def _open(self): + + # parse area file directory + s = self.fp.read(256) + if not _accept(s) or len(s) != 256: + raise SyntaxError("not an McIdas area file") + + self.area_descriptor_raw = s + self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) + + # get mode + if w[11] == 1: + mode = rawmode = "L" + elif w[11] == 2: + # FIXME: add memory map support + mode = "I" + rawmode = "I;16B" + elif w[11] == 4: + # FIXME: add memory map support + mode = "I" + rawmode = "I;32B" + else: + raise SyntaxError("unsupported McIdas format") + + self.mode = mode + self.size = w[10], w[9] + + offset = w[34] + w[15] + stride = w[15] + w[10]*w[11]*w[14] + + self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] + + +# -------------------------------------------------------------------- +# registry + +Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) + +# no default extension diff --git a/ascii2img/src/PIL/MicImagePlugin.py b/ascii2img/src/PIL/MicImagePlugin.py new file mode 100644 index 0000000..1dbb6a5 --- /dev/null +++ b/ascii2img/src/PIL/MicImagePlugin.py @@ -0,0 +1,107 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Microsoft Image Composer support for PIL +# +# Notes: +# uses TiffImagePlugin.py to read the actual image streams +# +# History: +# 97-01-20 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, TiffImagePlugin + +import olefile + +__version__ = "0.1" + + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for Microsoft's Image Composer file format. + +class MicImageFile(TiffImagePlugin.TiffImageFile): + + format = "MIC" + format_description = "Microsoft Image Composer" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # read the OLE directory and see if this is a likely + # to be a Microsoft Image Composer file + + try: + self.ole = olefile.OleFileIO(self.fp) + except IOError: + raise SyntaxError("not an MIC file; invalid OLE file") + + # find ACI subfiles with Image members (maybe not the + # best way to identify MIC files, but what the... ;-) + + self.images = [] + for path in self.ole.listdir(): + if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image": + self.images.append(path) + + # if we didn't find any images, this is probably not + # an MIC file. + if not self.images: + raise SyntaxError("not an MIC file; no image entries") + + self.__fp = self.fp + self.frame = None + + if len(self.images) > 1: + self.category = Image.CONTAINER + + self.seek(0) + + @property + def n_frames(self): + return len(self.images) + + @property + def is_animated(self): + return len(self.images) > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + try: + filename = self.images[frame] + except IndexError: + raise EOFError("no such frame") + + self.fp = self.ole.openstream(filename) + + TiffImagePlugin.TiffImageFile._open(self) + + self.frame = frame + + def tell(self): + + return self.frame + + +# +# -------------------------------------------------------------------- + +Image.register_open(MicImageFile.format, MicImageFile, _accept) + +Image.register_extension(MicImageFile.format, ".mic") diff --git a/ascii2img/src/PIL/MpegImagePlugin.py b/ascii2img/src/PIL/MpegImagePlugin.py new file mode 100644 index 0000000..fca7f9d --- /dev/null +++ b/ascii2img/src/PIL/MpegImagePlugin.py @@ -0,0 +1,85 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPEG file handling +# +# History: +# 95-09-09 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8 + +__version__ = "0.1" + + +# +# Bitstream parser + +class BitStream(object): + + def __init__(self, fp): + self.fp = fp + self.bits = 0 + self.bitbuffer = 0 + + def next(self): + return i8(self.fp.read(1)) + + def peek(self, bits): + while self.bits < bits: + c = self.next() + if c < 0: + self.bits = 0 + continue + self.bitbuffer = (self.bitbuffer << 8) + c + self.bits += 8 + return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 + + def skip(self, bits): + while self.bits < bits: + self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) + self.bits += 8 + self.bits = self.bits - bits + + def read(self, bits): + v = self.peek(bits) + self.bits = self.bits - bits + return v + + +## +# Image plugin for MPEG streams. This plugin can identify a stream, +# but it cannot read it. + +class MpegImageFile(ImageFile.ImageFile): + + format = "MPEG" + format_description = "MPEG" + + def _open(self): + + s = BitStream(self.fp) + + if s.read(32) != 0x1B3: + raise SyntaxError("not an MPEG file") + + self.mode = "RGB" + self.size = s.read(12), s.read(12) + + +# -------------------------------------------------------------------- +# Registry stuff + +Image.register_open(MpegImageFile.format, MpegImageFile) + +Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) + +Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/ascii2img/src/PIL/MpoImagePlugin.py b/ascii2img/src/PIL/MpoImagePlugin.py new file mode 100644 index 0000000..8ad27b9 --- /dev/null +++ b/ascii2img/src/PIL/MpoImagePlugin.py @@ -0,0 +1,99 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPO file handling +# +# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the +# Camera & Imaging Products Association) +# +# The multi-picture object combines multiple JPEG images (with a modified EXIF +# data format) into a single file. While it can theoretically be used much like +# a GIF animation, it is commonly used to represent 3D photographs and is (as +# of this writing) the most commonly used format by 3D cameras. +# +# History: +# 2014-03-13 Feneric Created +# +# See the README file for information on usage and redistribution. +# + +from . import Image, JpegImagePlugin + +__version__ = "0.1" + + +def _accept(prefix): + return JpegImagePlugin._accept(prefix) + + +def _save(im, fp, filename): + # Note that we can only save the current frame at present + return JpegImagePlugin._save(im, fp, filename) + + +## +# Image plugin for MPO images. + +class MpoImageFile(JpegImagePlugin.JpegImageFile): + + format = "MPO" + format_description = "MPO (CIPA DC-007)" + _close_exclusive_fp_after_loading = False + + def _open(self): + self.fp.seek(0) # prep the fp in order to pass the JPEG test + JpegImagePlugin.JpegImageFile._open(self) + self.mpinfo = self._getmp() + self.__framecount = self.mpinfo[0xB001] + self.__mpoffsets = [mpent['DataOffset'] + self.info['mpoffset'] + for mpent in self.mpinfo[0xB002]] + self.__mpoffsets[0] = 0 + # Note that the following assertion will only be invalid if something + # gets broken within JpegImagePlugin. + assert self.__framecount == len(self.__mpoffsets) + del self.info['mpoffset'] # no longer needed + self.__fp = self.fp # FIXME: hack + self.__fp.seek(self.__mpoffsets[0]) # get ready to read first frame + self.__frame = 0 + self.offset = 0 + # for now we can only handle reading and individual frame extraction + self.readonly = 1 + + def load_seek(self, pos): + self.__fp.seek(pos) + + @property + def n_frames(self): + return self.__framecount + + @property + def is_animated(self): + return self.__framecount > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + self.fp = self.__fp + self.offset = self.__mpoffsets[frame] + self.tile = [ + ("jpeg", (0, 0) + self.size, self.offset, (self.mode, "")) + ] + self.__frame = frame + + def tell(self): + return self.__frame + + +# -------------------------------------------------------------------q- +# Registry stuff + +# Note that since MPO shares a factory with JPEG, we do not need to do a +# separate registration for it here. +# Image.register_open(MpoImageFile.format, +# JpegImagePlugin.jpeg_factory, _accept) +Image.register_save(MpoImageFile.format, _save) + +Image.register_extension(MpoImageFile.format, ".mpo") + +Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/ascii2img/src/PIL/MspImagePlugin.py b/ascii2img/src/PIL/MspImagePlugin.py new file mode 100644 index 0000000..5ea3c1c --- /dev/null +++ b/ascii2img/src/PIL/MspImagePlugin.py @@ -0,0 +1,192 @@ +# +# The Python Imaging Library. +# +# MSP file handling +# +# This is the format used by the Paint program in Windows 1 and 2. +# +# History: +# 95-09-05 fl Created +# 97-01-03 fl Read/write MSP images +# 17-02-21 es Fixed RLE interpretation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-97. +# Copyright (c) Eric Soroos 2017. +# +# See the README file for information on usage and redistribution. +# +# More info on this format: https://archive.org/details/gg243631 +# Page 313: +# Figure 205. Windows Paint Version 1: "DanM" Format +# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 +# +# See also: http://www.fileformat.info/format/mspaint/egff.htm + +from . import Image, ImageFile +from ._binary import i16le as i16, o16le as o16, i8 +import struct +import io + +__version__ = "0.1" + + +# +# read MSP files + + +def _accept(prefix): + return prefix[:4] in [b"DanM", b"LinS"] + + +## +# Image plugin for Windows MSP images. This plugin supports both +# uncompressed (Windows 1.0). + +class MspImageFile(ImageFile.ImageFile): + + format = "MSP" + format_description = "Windows Paint" + + def _open(self): + + # Header + s = self.fp.read(32) + if s[:4] not in [b"DanM", b"LinS"]: + raise SyntaxError("not an MSP file") + + # Header checksum + checksum = 0 + for i in range(0, 32, 2): + checksum = checksum ^ i16(s[i:i+2]) + if checksum != 0: + raise SyntaxError("bad MSP checksum") + + self.mode = "1" + self.size = i16(s[4:]), i16(s[6:]) + + if s[:4] == b"DanM": + self.tile = [("raw", (0, 0)+self.size, 32, ("1", 0, 1))] + else: + self.tile = [("MSP", (0, 0)+self.size, 32, None)] + + +class MspDecoder(ImageFile.PyDecoder): + # The algo for the MSP decoder is from + # http://www.fileformat.info/format/mspaint/egff.htm + # cc-by-attribution -- That page references is taken from the + # Encyclopedia of Graphics File Formats and is licensed by + # O'Reilly under the Creative Common/Attribution license + # + # For RLE encoded files, the 32byte header is followed by a scan + # line map, encoded as one 16bit word of encoded byte length per + # line. + # + # NOTE: the encoded length of the line can be 0. This was not + # handled in the previous version of this encoder, and there's no + # mention of how to handle it in the documentation. From the few + # examples I've seen, I've assumed that it is a fill of the + # background color, in this case, white. + # + # + # Pseudocode of the decoder: + # Read a BYTE value as the RunType + # If the RunType value is zero + # Read next byte as the RunCount + # Read the next byte as the RunValue + # Write the RunValue byte RunCount times + # If the RunType value is non-zero + # Use this value as the RunCount + # Read and write the next RunCount bytes literally + # + # e.g.: + # 0x00 03 ff 05 00 01 02 03 04 + # would yield the bytes: + # 0xff ff ff 00 01 02 03 04 + # + # which are then interpreted as a bit packed mode '1' image + + _pulls_fd = True + + def decode(self, buffer): + + img = io.BytesIO() + blank_line = bytearray((0xff,)*((self.state.xsize+7)//8)) + try: + self.fd.seek(32) + rowmap = struct.unpack_from("<%dH" % (self.state.ysize), + self.fd.read(self.state.ysize*2)) + except struct.error: + raise IOError("Truncated MSP file in row map") + + for x, rowlen in enumerate(rowmap): + try: + if rowlen == 0: + img.write(blank_line) + continue + row = self.fd.read(rowlen) + if len(row) != rowlen: + raise IOError("Truncated MSP file, expected %d bytes on row %s", + (rowlen, x)) + idx = 0 + while idx < rowlen: + runtype = i8(row[idx]) + idx += 1 + if runtype == 0: + (runcount, runval) = struct.unpack("Bc", row[idx:idx+2]) + img.write(runval * runcount) + idx += 2 + else: + runcount = runtype + img.write(row[idx:idx+runcount]) + idx += runcount + + except struct.error: + raise IOError("Corrupted MSP file in row %d" % x) + + self.set_as_raw(img.getvalue(), ("1", 0, 1)) + + return 0, 0 + + +Image.register_decoder('MSP', MspDecoder) + + +# +# write MSP files (uncompressed only) + + +def _save(im, fp, filename): + + if im.mode != "1": + raise IOError("cannot write mode %s as MSP" % im.mode) + + # create MSP header + header = [0] * 16 + + header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 + header[2], header[3] = im.size + header[4], header[5] = 1, 1 + header[6], header[7] = 1, 1 + header[8], header[9] = im.size + + checksum = 0 + for h in header: + checksum = checksum ^ h + header[12] = checksum # FIXME: is this the right field? + + # header + for h in header: + fp.write(o16(h)) + + # image body + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 32, ("1", 0, 1))]) + + +# +# registry + +Image.register_open(MspImageFile.format, MspImageFile, _accept) +Image.register_save(MspImageFile.format, _save) + +Image.register_extension(MspImageFile.format, ".msp") diff --git a/ascii2img/src/PIL/OleFileIO.py b/ascii2img/src/PIL/OleFileIO.py new file mode 100644 index 0000000..2d6aeb8 --- /dev/null +++ b/ascii2img/src/PIL/OleFileIO.py @@ -0,0 +1,12 @@ +import warnings + +warnings.warn( + 'PIL.OleFileIO is deprecated. Use the olefile Python package ' + 'instead. This module will be removed in a future version.', + DeprecationWarning +) + +import olefile +import sys + +sys.modules[__name__] = olefile diff --git a/ascii2img/src/PIL/PSDraw.py b/ascii2img/src/PIL/PSDraw.py new file mode 100644 index 0000000..fe08238 --- /dev/null +++ b/ascii2img/src/PIL/PSDraw.py @@ -0,0 +1,235 @@ +# +# The Python Imaging Library +# $Id$ +# +# simple postscript graphics interface +# +# History: +# 1996-04-20 fl Created +# 1999-01-10 fl Added gsave/grestore to image method +# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) +# +# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from . import EpsImagePlugin +import sys + +## +# Simple Postscript graphics interface. + + +class PSDraw(object): + """ + Sets up printing to the given file. If **file** is omitted, + :py:attr:`sys.stdout` is assumed. + """ + + def __init__(self, fp=None): + if not fp: + fp = sys.stdout + self.fp = fp + + def _fp_write(self, to_write): + if bytes is str or self.fp == sys.stdout: + self.fp.write(to_write) + else: + self.fp.write(bytes(to_write, 'UTF-8')) + + def begin_document(self, id=None): + """Set up printing of a document. (Write Postscript DSC header.)""" + # FIXME: incomplete + self._fp_write("%!PS-Adobe-3.0\n" + "save\n" + "/showpage { } def\n" + "%%EndComments\n" + "%%BeginDocument\n") + # self._fp_write(ERROR_PS) # debugging! + self._fp_write(EDROFF_PS) + self._fp_write(VDI_PS) + self._fp_write("%%EndProlog\n") + self.isofont = {} + + def end_document(self): + """Ends printing. (Write Postscript DSC footer.)""" + self._fp_write("%%EndDocument\n" + "restore showpage\n" + "%%End\n") + if hasattr(self.fp, "flush"): + self.fp.flush() + + def setfont(self, font, size): + """ + Selects which font to use. + + :param font: A Postscript font name + :param size: Size in points. + """ + if font not in self.isofont: + # reencode font + self._fp_write("/PSDraw-%s ISOLatin1Encoding /%s E\n" % + (font, font)) + self.isofont[font] = 1 + # rough + self._fp_write("/F0 %d /PSDraw-%s F\n" % (size, font)) + + def line(self, xy0, xy1): + """ + Draws a line between the two points. Coordinates are given in + Postscript point coordinates (72 points per inch, (0, 0) is the lower + left corner of the page). + """ + xy = xy0 + xy1 + self._fp_write("%d %d %d %d Vl\n" % xy) + + def rectangle(self, box): + """ + Draws a rectangle. + + :param box: A 4-tuple of integers whose order and function is currently + undocumented. + + Hint: the tuple is passed into this format string: + + .. code-block:: python + + %d %d M %d %d 0 Vr\n + """ + self._fp_write("%d %d M %d %d 0 Vr\n" % box) + + def text(self, xy, text): + """ + Draws text at the given position. You must use + :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. + """ + text = "\\(".join(text.split("(")) + text = "\\)".join(text.split(")")) + xy = xy + (text,) + self._fp_write("%d %d M (%s) S\n" % xy) + + def image(self, box, im, dpi=None): + """Draw a PIL image, centered in the given box.""" + # default resolution depends on mode + if not dpi: + if im.mode == "1": + dpi = 200 # fax + else: + dpi = 100 # greyscale + # image size (on paper) + x = float(im.size[0] * 72) / dpi + y = float(im.size[1] * 72) / dpi + # max allowed size + xmax = float(box[2] - box[0]) + ymax = float(box[3] - box[1]) + if x > xmax: + y = y * xmax / x + x = xmax + if y > ymax: + x = x * ymax / y + y = ymax + dx = (xmax - x) / 2 + box[0] + dy = (ymax - y) / 2 + box[1] + self._fp_write("gsave\n%f %f translate\n" % (dx, dy)) + if (x, y) != im.size: + # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) + sx = x / im.size[0] + sy = y / im.size[1] + self._fp_write("%f %f scale\n" % (sx, sy)) + EpsImagePlugin._save(im, self.fp, None, 0) + self._fp_write("\ngrestore\n") + +# -------------------------------------------------------------------- +# Postscript driver + +# +# EDROFF.PS -- Postscript driver for Edroff 2 +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + +EDROFF_PS = """\ +/S { show } bind def +/P { moveto show } bind def +/M { moveto } bind def +/X { 0 rmoveto } bind def +/Y { 0 exch rmoveto } bind def +/E { findfont + dup maxlength dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /Encoding exch def + dup /FontName exch def + currentdict end definefont pop +} bind def +/F { findfont exch scalefont dup setfont + [ exch /setfont cvx ] cvx bind def +} bind def +""" + +# +# VDI.PS -- Postscript driver for VDI meta commands +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + +VDI_PS = """\ +/Vm { moveto } bind def +/Va { newpath arcn stroke } bind def +/Vl { moveto lineto stroke } bind def +/Vc { newpath 0 360 arc closepath } bind def +/Vr { exch dup 0 rlineto + exch dup neg 0 exch rlineto + exch neg 0 rlineto + 0 exch rlineto + 100 div setgray fill 0 setgray } bind def +/Tm matrix def +/Ve { Tm currentmatrix pop + translate scale newpath 0 0 .5 0 360 arc closepath + Tm setmatrix +} bind def +/Vf { currentgray exch setgray fill setgray } bind def +""" + +# +# ERROR.PS -- Error handler +# +# History: +# 89-11-21 fl: created (pslist 1.10) +# + +ERROR_PS = """\ +/landscape false def +/errorBUF 200 string def +/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def +errordict begin /handleerror { + initmatrix /Courier findfont 10 scalefont setfont + newpath 72 720 moveto $error begin /newerror false def + (PostScript Error) show errorNL errorNL + (Error: ) show + /errorname load errorBUF cvs show errorNL errorNL + (Command: ) show + /command load dup type /stringtype ne { errorBUF cvs } if show + errorNL errorNL + (VMstatus: ) show + vmstatus errorBUF cvs show ( bytes available, ) show + errorBUF cvs show ( bytes used at level ) show + errorBUF cvs show errorNL errorNL + (Operand stargck: ) show errorNL /ostargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall errorNL + (Execution stargck: ) show errorNL /estargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall + end showpage +} def end +""" diff --git a/ascii2img/src/PIL/PaletteFile.py b/ascii2img/src/PIL/PaletteFile.py new file mode 100644 index 0000000..9ed69d6 --- /dev/null +++ b/ascii2img/src/PIL/PaletteFile.py @@ -0,0 +1,55 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read simple, teragon-style palette files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from ._binary import o8 + + +## +# File handler for Teragon-style palette files. + +class PaletteFile(object): + + rawmode = "RGB" + + def __init__(self, fp): + + self.palette = [(i, i, i) for i in range(256)] + + while True: + + s = fp.readline() + + if not s: + break + if s[0:1] == b"#": + continue + if len(s) > 100: + raise SyntaxError("bad palette file") + + v = [int(x) for x in s.split()] + try: + [i, r, g, b] = v + except ValueError: + [i, r] = v + g = b = r + + if 0 <= i <= 255: + self.palette[i] = o8(r) + o8(g) + o8(b) + + self.palette = b"".join(self.palette) + + def getpalette(self): + + return self.palette, self.rawmode diff --git a/ascii2img/src/PIL/PalmImagePlugin.py b/ascii2img/src/PIL/PalmImagePlugin.py new file mode 100644 index 0000000..cb4e491 --- /dev/null +++ b/ascii2img/src/PIL/PalmImagePlugin.py @@ -0,0 +1,238 @@ +# +# The Python Imaging Library. +# $Id$ +# + +## +# Image plugin for Palm pixmap images (output only). +## + +from . import Image, ImageFile +from ._binary import o8, o16be as o16b + +__version__ = "1.0" + +_Palm8BitColormapValues = ( + (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), + (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), + (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), + (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), + (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), + (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), + (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), + (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), + (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), + (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), + (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), + (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), + (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), + (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), + (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), + (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), + (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), + (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), + (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), + (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), + (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), + (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), + (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), + (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), + (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), + (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), + (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), + (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), + (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), + (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), + (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), + (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), + (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), + (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), + (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), + (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), + (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), + (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), + (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), + (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), + (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), + (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), + (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), + (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), + (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), + (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), + (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), + (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), + (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), + (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), + (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), + (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), + (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), + (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), + (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), + (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), + (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), + (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) + + +# so build a prototype image to be used for palette resampling +def build_prototype_image(): + image = Image.new("L", (1, len(_Palm8BitColormapValues))) + image.putdata(list(range(len(_Palm8BitColormapValues)))) + palettedata = () + for colormapValue in _Palm8BitColormapValues: + palettedata += colormapValue + palettedata += (0, 0, 0)*(256 - len(_Palm8BitColormapValues)) + image.putpalette(palettedata) + return image + +Palm8BitColormapImage = build_prototype_image() + +# OK, we now have in Palm8BitColormapImage, +# a "P"-mode image with the right palette +# +# -------------------------------------------------------------------- + +_FLAGS = { + "custom-colormap": 0x4000, + "is-compressed": 0x8000, + "has-transparent": 0x2000, + } + +_COMPRESSION_TYPES = { + "none": 0xFF, + "rle": 0x01, + "scanline": 0x00, + } + + +# +# -------------------------------------------------------------------- + +## +# (Internal) Image save plugin for the Palm format. + +def _save(im, fp, filename, check=0): + + if im.mode == "P": + + # we assume this is a color Palm image with the standard colormap, + # unless the "info" dict has a "custom-colormap" field + + rawmode = "P" + bpp = 8 + version = 1 + + elif (im.mode == "L" and + "bpp" in im.encoderinfo and + im.encoderinfo["bpp"] in (1, 2, 4)): + + # this is 8-bit grayscale, so we shift it to get the high-order bits, + # and invert it because + # Palm does greyscale from white (0) to black (1) + bpp = im.encoderinfo["bpp"] + im = im.point( + lambda x, shift=8-bpp, maxval=(1 << bpp)-1: maxval - (x >> shift)) + # we ignore the palette here + im.mode = "P" + rawmode = "P;" + str(bpp) + version = 1 + + elif im.mode == "L" and "bpp" in im.info and im.info["bpp"] in (1, 2, 4): + + # here we assume that even though the inherent mode is 8-bit grayscale, + # only the lower bpp bits are significant. + # We invert them to match the Palm. + bpp = im.info["bpp"] + im = im.point(lambda x, maxval=(1 << bpp)-1: maxval - (x & maxval)) + # we ignore the palette here + im.mode = "P" + rawmode = "P;" + str(bpp) + version = 1 + + elif im.mode == "1": + + # monochrome -- write it inverted, as is the Palm standard + rawmode = "1;I" + bpp = 1 + version = 0 + + else: + + raise IOError("cannot write mode %s as Palm" % im.mode) + + if check: + return check + + # + # make sure image data is available + im.load() + + # write header + + cols = im.size[0] + rows = im.size[1] + + rowbytes = int((cols + (16//bpp - 1)) / (16 // bpp)) * 2 + transparent_index = 0 + compression_type = _COMPRESSION_TYPES["none"] + + flags = 0 + if im.mode == "P" and "custom-colormap" in im.info: + flags = flags & _FLAGS["custom-colormap"] + colormapsize = 4 * 256 + 2 + colormapmode = im.palette.mode + colormap = im.getdata().getpalette() + else: + colormapsize = 0 + + if "offset" in im.info: + offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 + else: + offset = 0 + + fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) + fp.write(o8(bpp)) + fp.write(o8(version)) + fp.write(o16b(offset)) + fp.write(o8(transparent_index)) + fp.write(o8(compression_type)) + fp.write(o16b(0)) # reserved by Palm + + # now write colormap if necessary + + if colormapsize > 0: + fp.write(o16b(256)) + for i in range(256): + fp.write(o8(i)) + if colormapmode == 'RGB': + fp.write( + o8(colormap[3 * i]) + + o8(colormap[3 * i + 1]) + + o8(colormap[3 * i + 2])) + elif colormapmode == 'RGBA': + fp.write( + o8(colormap[4 * i]) + + o8(colormap[4 * i + 1]) + + o8(colormap[4 * i + 2])) + + # now convert data to raw form + ImageFile._save( + im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, rowbytes, 1))]) + + if hasattr(fp, "flush"): + fp.flush() + + +# +# -------------------------------------------------------------------- + +Image.register_save("Palm", _save) + +Image.register_extension("Palm", ".palm") + +Image.register_mime("Palm", "image/palm") diff --git a/ascii2img/src/PIL/PcdImagePlugin.py b/ascii2img/src/PIL/PcdImagePlugin.py new file mode 100644 index 0000000..fa95b50 --- /dev/null +++ b/ascii2img/src/PIL/PcdImagePlugin.py @@ -0,0 +1,66 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCD file handling +# +# History: +# 96-05-10 fl Created +# 96-05-27 fl Added draft mode (128x192, 256x384) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8 + +__version__ = "0.1" + + +## +# Image plugin for PhotoCD images. This plugin only reads the 768x512 +# image from the file; higher resolutions are encoded in a proprietary +# encoding. + +class PcdImageFile(ImageFile.ImageFile): + + format = "PCD" + format_description = "Kodak PhotoCD" + + def _open(self): + + # rough + self.fp.seek(2048) + s = self.fp.read(2048) + + if s[:4] != b"PCD_": + raise SyntaxError("not a PCD file") + + orientation = i8(s[1538]) & 3 + self.tile_post_rotate = None + if orientation == 1: + self.tile_post_rotate = 90 + elif orientation == 3: + self.tile_post_rotate = -90 + + self.mode = "RGB" + self.size = 768, 512 # FIXME: not correct for rotated images! + self.tile = [("pcd", (0, 0)+self.size, 96*2048, None)] + + def load_end(self): + if self.tile_post_rotate: + # Handle rotated PCDs + self.im = self.im.rotate(self.tile_post_rotate) + self.size = self.im.size + + +# +# registry + +Image.register_open(PcdImageFile.format, PcdImageFile) + +Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/ascii2img/src/PIL/PcfFontFile.py b/ascii2img/src/PIL/PcfFontFile.py new file mode 100644 index 0000000..eba85fe --- /dev/null +++ b/ascii2img/src/PIL/PcfFontFile.py @@ -0,0 +1,245 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library +# $Id$ +# +# portable compiled font file parser +# +# history: +# 1997-08-19 fl created +# 2003-09-13 fl fixed loading of unicode fonts +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from . import Image, FontFile +from ._binary import i8, i16le as l16, i32le as l32, i16be as b16, i32be as b32 + +# -------------------------------------------------------------------- +# declarations + +PCF_MAGIC = 0x70636601 # "\x01fcp" + +PCF_PROPERTIES = (1 << 0) +PCF_ACCELERATORS = (1 << 1) +PCF_METRICS = (1 << 2) +PCF_BITMAPS = (1 << 3) +PCF_INK_METRICS = (1 << 4) +PCF_BDF_ENCODINGS = (1 << 5) +PCF_SWIDTHS = (1 << 6) +PCF_GLYPH_NAMES = (1 << 7) +PCF_BDF_ACCELERATORS = (1 << 8) + +BYTES_PER_ROW = [ + lambda bits: ((bits+7) >> 3), + lambda bits: ((bits+15) >> 3) & ~1, + lambda bits: ((bits+31) >> 3) & ~3, + lambda bits: ((bits+63) >> 3) & ~7, +] + + +def sz(s, o): + return s[o:s.index(b"\0", o)] + + +## +# Font file plugin for the X11 PCF format. + +class PcfFontFile(FontFile.FontFile): + + name = "name" + + def __init__(self, fp): + + magic = l32(fp.read(4)) + if magic != PCF_MAGIC: + raise SyntaxError("not a PCF file") + + FontFile.FontFile.__init__(self) + + count = l32(fp.read(4)) + self.toc = {} + for i in range(count): + type = l32(fp.read(4)) + self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) + + self.fp = fp + + self.info = self._load_properties() + + metrics = self._load_metrics() + bitmaps = self._load_bitmaps(metrics) + encoding = self._load_encoding() + + # + # create glyph structure + + for ch in range(256): + ix = encoding[ch] + if ix is not None: + x, y, l, r, w, a, d, f = metrics[ix] + glyph = (w, 0), (l, d-y, x+l, d), (0, 0, x, y), bitmaps[ix] + self.glyph[ch] = glyph + + def _getformat(self, tag): + + format, size, offset = self.toc[tag] + + fp = self.fp + fp.seek(offset) + + format = l32(fp.read(4)) + + if format & 4: + i16, i32 = b16, b32 + else: + i16, i32 = l16, l32 + + return fp, format, i16, i32 + + def _load_properties(self): + + # + # font properties + + properties = {} + + fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) + + nprops = i32(fp.read(4)) + + # read property description + p = [] + for i in range(nprops): + p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4)))) + if nprops & 3: + fp.seek(4 - (nprops & 3), 1) # pad + + data = fp.read(i32(fp.read(4))) + + for k, s, v in p: + k = sz(data, k) + if s: + v = sz(data, v) + properties[k] = v + + return properties + + def _load_metrics(self): + + # + # font metrics + + metrics = [] + + fp, format, i16, i32 = self._getformat(PCF_METRICS) + + append = metrics.append + + if (format & 0xff00) == 0x100: + + # "compressed" metrics + for i in range(i16(fp.read(2))): + left = i8(fp.read(1)) - 128 + right = i8(fp.read(1)) - 128 + width = i8(fp.read(1)) - 128 + ascent = i8(fp.read(1)) - 128 + descent = i8(fp.read(1)) - 128 + xsize = right - left + ysize = ascent + descent + append( + (xsize, ysize, left, right, width, + ascent, descent, 0) + ) + + else: + + # "jumbo" metrics + for i in range(i32(fp.read(4))): + left = i16(fp.read(2)) + right = i16(fp.read(2)) + width = i16(fp.read(2)) + ascent = i16(fp.read(2)) + descent = i16(fp.read(2)) + attributes = i16(fp.read(2)) + xsize = right - left + ysize = ascent + descent + append( + (xsize, ysize, left, right, width, + ascent, descent, attributes) + ) + + return metrics + + def _load_bitmaps(self, metrics): + + # + # bitmap data + + bitmaps = [] + + fp, format, i16, i32 = self._getformat(PCF_BITMAPS) + + nbitmaps = i32(fp.read(4)) + + if nbitmaps != len(metrics): + raise IOError("Wrong number of bitmaps") + + offsets = [] + for i in range(nbitmaps): + offsets.append(i32(fp.read(4))) + + bitmapSizes = [] + for i in range(4): + bitmapSizes.append(i32(fp.read(4))) + + # byteorder = format & 4 # non-zero => MSB + bitorder = format & 8 # non-zero => MSB + padindex = format & 3 + + bitmapsize = bitmapSizes[padindex] + offsets.append(bitmapsize) + + data = fp.read(bitmapsize) + + pad = BYTES_PER_ROW[padindex] + mode = "1;R" + if bitorder: + mode = "1" + + for i in range(nbitmaps): + x, y, l, r, w, a, d, f = metrics[i] + b, e = offsets[i], offsets[i+1] + bitmaps.append( + Image.frombytes("1", (x, y), data[b:e], "raw", mode, pad(x)) + ) + + return bitmaps + + def _load_encoding(self): + + # map character code to bitmap index + encoding = [None] * 256 + + fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) + + firstCol, lastCol = i16(fp.read(2)), i16(fp.read(2)) + firstRow, lastRow = i16(fp.read(2)), i16(fp.read(2)) + + default = i16(fp.read(2)) + + nencoding = (lastCol - firstCol + 1) * (lastRow - firstRow + 1) + + for i in range(nencoding): + encodingOffset = i16(fp.read(2)) + if encodingOffset != 0xFFFF: + try: + encoding[i+firstCol] = encodingOffset + except IndexError: + break # only load ISO-8859-1 glyphs + + return encoding diff --git a/ascii2img/src/PIL/PcxImagePlugin.py b/ascii2img/src/PIL/PcxImagePlugin.py new file mode 100644 index 0000000..ef89a19 --- /dev/null +++ b/ascii2img/src/PIL/PcxImagePlugin.py @@ -0,0 +1,180 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCX file handling +# +# This format was originally used by ZSoft's popular PaintBrush +# program for the IBM PC. It is also supported by many MS-DOS and +# Windows applications, including the Windows PaintBrush program in +# Windows 3. +# +# history: +# 1995-09-01 fl Created +# 1996-05-20 fl Fixed RGB support +# 1997-01-03 fl Fixed 2-bit and 4-bit support +# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) +# 1999-02-07 fl Added write support +# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust +# 2002-07-30 fl Seek from to current position, not beginning of file +# 2003-06-03 fl Extract DPI settings (info["dpi"]) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +import logging +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, o8, o16le as o16 + +logger = logging.getLogger(__name__) + +__version__ = "0.6" + + +def _accept(prefix): + return i8(prefix[0]) == 10 and i8(prefix[1]) in [0, 2, 3, 5] + + +## +# Image plugin for Paintbrush images. + +class PcxImageFile(ImageFile.ImageFile): + + format = "PCX" + format_description = "Paintbrush" + + def _open(self): + + # header + s = self.fp.read(128) + if not _accept(s): + raise SyntaxError("not a PCX file") + + # image + bbox = i16(s, 4), i16(s, 6), i16(s, 8)+1, i16(s, 10)+1 + if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: + raise SyntaxError("bad PCX image size") + logger.debug("BBox: %s %s %s %s", *bbox) + + # format + version = i8(s[1]) + bits = i8(s[3]) + planes = i8(s[65]) + stride = i16(s, 66) + logger.debug("PCX version %s, bits %s, planes %s, stride %s", + version, bits, planes, stride) + + self.info["dpi"] = i16(s, 12), i16(s, 14) + + if bits == 1 and planes == 1: + mode = rawmode = "1" + + elif bits == 1 and planes in (2, 4): + mode = "P" + rawmode = "P;%dL" % planes + self.palette = ImagePalette.raw("RGB", s[16:64]) + + elif version == 5 and bits == 8 and planes == 1: + mode = rawmode = "L" + # FIXME: hey, this doesn't work with the incremental loader !!! + self.fp.seek(-769, 2) + s = self.fp.read(769) + if len(s) == 769 and i8(s[0]) == 12: + # check if the palette is linear greyscale + for i in range(256): + if s[i*3+1:i*3+4] != o8(i)*3: + mode = rawmode = "P" + break + if mode == "P": + self.palette = ImagePalette.raw("RGB", s[1:]) + self.fp.seek(128) + + elif version == 5 and bits == 8 and planes == 3: + mode = "RGB" + rawmode = "RGB;L" + + else: + raise IOError("unknown PCX mode") + + self.mode = mode + self.size = bbox[2]-bbox[0], bbox[3]-bbox[1] + + bbox = (0, 0) + self.size + logger.debug("size: %sx%s", *self.size) + + self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] + +# -------------------------------------------------------------------- +# save PCX files + +SAVE = { + # mode: (version, bits, planes, raw mode) + "1": (2, 1, 1, "1"), + "L": (5, 8, 1, "L"), + "P": (5, 8, 1, "P"), + "RGB": (5, 8, 3, "RGB;L"), +} + + +def _save(im, fp, filename, check=0): + + try: + version, bits, planes, rawmode = SAVE[im.mode] + except KeyError: + raise ValueError("Cannot save %s images as PCX" % im.mode) + + if check: + return check + + # bytes per plane + stride = (im.size[0] * bits + 7) // 8 + # stride should be even + stride += stride % 2 + # Stride needs to be kept in sync with the PcxEncode.c version. + # Ideally it should be passed in in the state, but the bytes value + # gets overwritten. + + logger.debug("PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", + im.size[0], bits, stride) + + # under windows, we could determine the current screen size with + # "Image.core.display_mode()[1]", but I think that's overkill... + + screen = im.size + + dpi = 100, 100 + + # PCX header + fp.write( + o8(10) + o8(version) + o8(1) + o8(bits) + o16(0) + + o16(0) + o16(im.size[0]-1) + o16(im.size[1]-1) + o16(dpi[0]) + + o16(dpi[1]) + b"\0"*24 + b"\xFF"*24 + b"\0" + o8(planes) + + o16(stride) + o16(1) + o16(screen[0]) + o16(screen[1]) + + b"\0"*54 + ) + + assert fp.tell() == 128 + + ImageFile._save(im, fp, [("pcx", (0, 0)+im.size, 0, + (rawmode, bits*planes))]) + + if im.mode == "P": + # colour palette + fp.write(o8(12)) + fp.write(im.im.getpalette("RGB", "RGB")) # 768 bytes + elif im.mode == "L": + # greyscale palette + fp.write(o8(12)) + for i in range(256): + fp.write(o8(i)*3) + +# -------------------------------------------------------------------- +# registry + +Image.register_open(PcxImageFile.format, PcxImageFile, _accept) +Image.register_save(PcxImageFile.format, _save) + +Image.register_extension(PcxImageFile.format, ".pcx") diff --git a/ascii2img/src/PIL/PdfImagePlugin.py b/ascii2img/src/PIL/PdfImagePlugin.py new file mode 100644 index 0000000..e41a594 --- /dev/null +++ b/ascii2img/src/PIL/PdfImagePlugin.py @@ -0,0 +1,271 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PDF (Acrobat) file handling +# +# History: +# 1996-07-16 fl Created +# 1997-01-18 fl Fixed header +# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. +# 2004-02-24 fl Fixes for 1 and P images. +# +# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996-1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## +# Image plugin for PDF images (output only). +## + +from . import Image, ImageFile, ImageSequence +from ._binary import i8 +import io + +__version__ = "0.4" + + +# +# -------------------------------------------------------------------- + +# object ids: +# 1. catalogue +# 2. pages +# 3. image +# 4. page +# 5. page contents + +def _obj(fp, obj, **dictionary): + fp.write("%d 0 obj\n" % obj) + if dictionary: + fp.write("<<\n") + for k, v in dictionary.items(): + if v is not None: + fp.write("/%s %s\n" % (k, v)) + fp.write(">>\n") + + +def _endobj(fp): + fp.write("endobj\n") + + +def _save_all(im, fp, filename): + _save(im, fp, filename, save_all=True) + + +## +# (Internal) Image save plugin for the PDF format. + +def _save(im, fp, filename, save_all=False): + resolution = im.encoderinfo.get("resolution", 72.0) + + # + # make sure image data is available + im.load() + + xref = [0] + + class TextWriter(object): + def __init__(self, fp): + self.fp = fp + + def __getattr__(self, name): + return getattr(self.fp, name) + + def write(self, value): + self.fp.write(value.encode('latin-1')) + + fp = TextWriter(fp) + + fp.write("%PDF-1.2\n") + fp.write("% created by PIL PDF driver " + __version__ + "\n") + + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits) + # or LZWDecode (tiff/lzw compression). Note that PDF 1.2 also supports + # Flatedecode (zip compression). + + bits = 8 + params = None + + if im.mode == "1": + filter = "/ASCIIHexDecode" + colorspace = "/DeviceGray" + procset = "/ImageB" # grayscale + bits = 1 + elif im.mode == "L": + filter = "/DCTDecode" + # params = "<< /Predictor 15 /Columns %d >>" % (width-2) + colorspace = "/DeviceGray" + procset = "/ImageB" # grayscale + elif im.mode == "P": + filter = "/ASCIIHexDecode" + colorspace = "[ /Indexed /DeviceRGB 255 <" + palette = im.im.getpalette("RGB") + for i in range(256): + r = i8(palette[i*3]) + g = i8(palette[i*3+1]) + b = i8(palette[i*3+2]) + colorspace += "%02x%02x%02x " % (r, g, b) + colorspace += "> ]" + procset = "/ImageI" # indexed color + elif im.mode == "RGB": + filter = "/DCTDecode" + colorspace = "/DeviceRGB" + procset = "/ImageC" # color images + elif im.mode == "CMYK": + filter = "/DCTDecode" + colorspace = "/DeviceCMYK" + procset = "/ImageC" # color images + else: + raise ValueError("cannot save mode %s" % im.mode) + + # + # catalogue + + xref.append(fp.tell()) + _obj( + fp, 1, + Type="/Catalog", + Pages="2 0 R") + _endobj(fp) + + # + # pages + ims = [im] + if save_all: + append_images = im.encoderinfo.get("append_images", []) + for append_im in append_images: + if append_im.mode != im.mode: + append_im = append_im.convert(im.mode) + append_im.encoderinfo = im.encoderinfo.copy() + ims.append(append_im) + numberOfPages = 0 + for im in ims: + im_numberOfPages = 1 + if save_all: + try: + im_numberOfPages = im.n_frames + except AttributeError: + # Image format does not have n_frames. It is a single frame image + pass + numberOfPages += im_numberOfPages + pages = [str(pageNumber*3+4)+" 0 R" + for pageNumber in range(0, numberOfPages)] + + xref.append(fp.tell()) + _obj( + fp, 2, + Type="/Pages", + Count=len(pages), + Kids="["+"\n".join(pages)+"]") + _endobj(fp) + + pageNumber = 0 + for imSequence in ims: + for im in ImageSequence.Iterator(imSequence): + # + # image + + op = io.BytesIO() + + if filter == "/ASCIIHexDecode": + if bits == 1: + # FIXME: the hex encoder doesn't support packed 1-bit + # images; do things the hard way... + data = im.tobytes("raw", "1") + im = Image.new("L", (len(data), 1), None) + im.putdata(data) + ImageFile._save(im, op, [("hex", (0, 0)+im.size, 0, im.mode)]) + elif filter == "/DCTDecode": + Image.SAVE["JPEG"](im, op, filename) + elif filter == "/FlateDecode": + ImageFile._save(im, op, [("zip", (0, 0)+im.size, 0, im.mode)]) + elif filter == "/RunLengthDecode": + ImageFile._save(im, op, [("packbits", (0, 0)+im.size, 0, im.mode)]) + else: + raise ValueError("unsupported PDF filter (%s)" % filter) + + # + # Get image characteristics + + width, height = im.size + + xref.append(fp.tell()) + _obj( + fp, pageNumber*3+3, + Type="/XObject", + Subtype="/Image", + Width=width, # * 72.0 / resolution, + Height=height, # * 72.0 / resolution, + Length=len(op.getvalue()), + Filter=filter, + BitsPerComponent=bits, + DecodeParams=params, + ColorSpace=colorspace) + + fp.write("stream\n") + fp.fp.write(op.getvalue()) + fp.write("\nendstream\n") + + _endobj(fp) + + # + # page + + xref.append(fp.tell()) + _obj(fp, pageNumber*3+4) + fp.write( + "<<\n/Type /Page\n/Parent 2 0 R\n" + "/Resources <<\n/ProcSet [ /PDF %s ]\n" + "/XObject << /image %d 0 R >>\n>>\n" + "/MediaBox [ 0 0 %d %d ]\n/Contents %d 0 R\n>>\n" % ( + procset, + pageNumber*3+3, + int(width * 72.0 / resolution), + int(height * 72.0 / resolution), + pageNumber*3+5)) + _endobj(fp) + + # + # page contents + + op = TextWriter(io.BytesIO()) + + op.write( + "q %d 0 0 %d 0 0 cm /image Do Q\n" % ( + int(width * 72.0 / resolution), + int(height * 72.0 / resolution))) + + xref.append(fp.tell()) + _obj(fp, pageNumber*3+5, Length=len(op.fp.getvalue())) + + fp.write("stream\n") + fp.fp.write(op.fp.getvalue()) + fp.write("\nendstream\n") + + _endobj(fp) + + pageNumber += 1 + + # + # trailer + startxref = fp.tell() + fp.write("xref\n0 %d\n0000000000 65535 f \n" % len(xref)) + for x in xref[1:]: + fp.write("%010d 00000 n \n" % x) + fp.write("trailer\n<<\n/Size %d\n/Root 1 0 R\n>>\n" % len(xref)) + fp.write("startxref\n%d\n%%%%EOF\n" % startxref) + if hasattr(fp, "flush"): + fp.flush() + +# +# -------------------------------------------------------------------- + +Image.register_save("PDF", _save) +Image.register_save_all("PDF", _save_all) + +Image.register_extension("PDF", ".pdf") + +Image.register_mime("PDF", "application/pdf") diff --git a/ascii2img/src/PIL/PixarImagePlugin.py b/ascii2img/src/PIL/PixarImagePlugin.py new file mode 100644 index 0000000..220577c --- /dev/null +++ b/ascii2img/src/PIL/PixarImagePlugin.py @@ -0,0 +1,71 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIXAR raster support for PIL +# +# history: +# 97-01-29 fl Created +# +# notes: +# This is incomplete; it is based on a few samples created with +# Photoshop 2.5 and 3.0, and a summary description provided by +# Greg Coats . Hopefully, "L" and +# "RGBA" support will be added in future versions. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile +from ._binary import i16le as i16 + +__version__ = "0.1" + + +# +# helpers + +def _accept(prefix): + return prefix[:4] == b"\200\350\000\000" + + +## +# Image plugin for PIXAR raster images. + +class PixarImageFile(ImageFile.ImageFile): + + format = "PIXAR" + format_description = "PIXAR raster image" + + def _open(self): + + # assuming a 4-byte magic label + s = self.fp.read(4) + if s != b"\200\350\000\000": + raise SyntaxError("not a PIXAR file") + + # read rest of header + s = s + self.fp.read(508) + + self.size = i16(s[418:420]), i16(s[416:418]) + + # get channel/depth descriptions + mode = i16(s[424:426]), i16(s[426:428]) + + if mode == (14, 2): + self.mode = "RGB" + # FIXME: to be continued... + + # create tile descriptor (assuming "dumped") + self.tile = [("raw", (0, 0)+self.size, 1024, (self.mode, 0, 1))] + + +# +# -------------------------------------------------------------------- + +Image.register_open(PixarImageFile.format, PixarImageFile, _accept) + +Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/ascii2img/src/PIL/PngImagePlugin.py b/ascii2img/src/PIL/PngImagePlugin.py new file mode 100644 index 0000000..409d7f3 --- /dev/null +++ b/ascii2img/src/PIL/PngImagePlugin.py @@ -0,0 +1,845 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PNG support code +# +# See "PNG (Portable Network Graphics) Specification, version 1.0; +# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). +# +# history: +# 1996-05-06 fl Created (couldn't resist it) +# 1996-12-14 fl Upgraded, added read and verify support (0.2) +# 1996-12-15 fl Separate PNG stream parser +# 1996-12-29 fl Added write support, added getchunks +# 1996-12-30 fl Eliminated circular references in decoder (0.3) +# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) +# 2001-02-08 fl Added transparency support (from Zircon) (0.5) +# 2001-04-16 fl Don't close data source in "open" method (0.6) +# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) +# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) +# 2004-09-20 fl Added PngInfo chunk container +# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) +# 2008-08-13 fl Added tRNS support for RGB images +# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) +# 2009-03-08 fl Added zTXT support (from Lowell Alleman) +# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) +# +# Copyright (c) 1997-2009 by Secret Labs AB +# Copyright (c) 1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import logging +import re +import zlib +import struct + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16be as i16, i32be as i32, o16be as o16, o32be as o32 + +__version__ = "0.9" + +logger = logging.getLogger(__name__) + +is_cid = re.compile(br"\w\w\w\w").match + + +_MAGIC = b"\211PNG\r\n\032\n" + + +_MODES = { + # supported bits/color combinations, and corresponding modes/rawmodes + (1, 0): ("1", "1"), + (2, 0): ("L", "L;2"), + (4, 0): ("L", "L;4"), + (8, 0): ("L", "L"), + (16, 0): ("I", "I;16B"), + (8, 2): ("RGB", "RGB"), + (16, 2): ("RGB", "RGB;16B"), + (1, 3): ("P", "P;1"), + (2, 3): ("P", "P;2"), + (4, 3): ("P", "P;4"), + (8, 3): ("P", "P"), + (8, 4): ("LA", "LA"), + (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available + (8, 6): ("RGBA", "RGBA"), + (16, 6): ("RGBA", "RGBA;16B"), +} + + +_simple_palette = re.compile(b'^\xff*\x00\xff*$') + +# Maximum decompressed size for a iTXt or zTXt chunk. +# Eliminates decompression bombs where compressed chunks can expand 1000x +MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK +# Set the maximum total text chunk size. +MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK + + +def _safe_zlib_decompress(s): + dobj = zlib.decompressobj() + plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) + if dobj.unconsumed_tail: + raise ValueError("Decompressed Data Too Large") + return plaintext + + +# -------------------------------------------------------------------- +# Support classes. Suitable for PNG and related formats like MNG etc. + +class ChunkStream(object): + + def __init__(self, fp): + + self.fp = fp + self.queue = [] + + if not hasattr(Image.core, "crc32"): + self.crc = self.crc_skip + + def read(self): + "Fetch a new chunk. Returns header information." + cid = None + + if self.queue: + cid, pos, length = self.queue.pop() + self.fp.seek(pos) + else: + s = self.fp.read(8) + cid = s[4:] + pos = self.fp.tell() + length = i32(s) + + if not is_cid(cid): + if not ImageFile.LOAD_TRUNCATED_IMAGES: + raise SyntaxError("broken PNG file (chunk %s)" % repr(cid)) + + return cid, pos, length + + def close(self): + self.queue = self.crc = self.fp = None + + def push(self, cid, pos, length): + + self.queue.append((cid, pos, length)) + + def call(self, cid, pos, length): + "Call the appropriate chunk handler" + + logger.debug("STREAM %r %s %s", cid, pos, length) + return getattr(self, "chunk_" + cid.decode('ascii'))(pos, length) + + def crc(self, cid, data): + "Read and verify checksum" + + # Skip CRC checks for ancillary chunks if allowed to load truncated images + # 5th byte of first char is 1 [specs, section 5.4] + if ImageFile.LOAD_TRUNCATED_IMAGES and (i8(cid[0]) >> 5 & 1): + self.crc_skip(cid, data) + return + + try: + crc1 = Image.core.crc32(data, Image.core.crc32(cid)) + crc2 = i16(self.fp.read(2)), i16(self.fp.read(2)) + if crc1 != crc2: + raise SyntaxError("broken PNG file (bad header checksum in %r)" + % cid) + except struct.error: + raise SyntaxError("broken PNG file (incomplete checksum in %r)" + % cid) + + def crc_skip(self, cid, data): + "Read checksum. Used if the C module is not present" + + self.fp.read(4) + + def verify(self, endchunk=b"IEND"): + + # Simple approach; just calculate checksum for all remaining + # blocks. Must be called directly after open. + + cids = [] + + while True: + try: + cid, pos, length = self.read() + except struct.error: + raise IOError("truncated PNG file") + + if cid == endchunk: + break + self.crc(cid, ImageFile._safe_read(self.fp, length)) + cids.append(cid) + + return cids + + +class iTXt(str): + """ + Subclass of string to allow iTXt chunks to look like strings while + keeping their extra information + + """ + @staticmethod + def __new__(cls, text, lang, tkey): + """ + :param cls: the class to use when creating the instance + :param text: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + """ + + self = str.__new__(cls, text) + self.lang = lang + self.tkey = tkey + return self + + +class PngInfo(object): + """ + PNG chunk container (for use with save(pnginfo=)) + + """ + + def __init__(self): + self.chunks = [] + + def add(self, cid, data): + """Appends an arbitrary chunk. Use with caution. + + :param cid: a byte string, 4 bytes long. + :param data: a byte string of the encoded data + + """ + + self.chunks.append((cid, data)) + + def add_itxt(self, key, value, lang="", tkey="", zip=False): + """Appends an iTXt chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + :param zip: compression flag + + """ + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + if not isinstance(value, bytes): + value = value.encode("utf-8", "strict") + if not isinstance(lang, bytes): + lang = lang.encode("utf-8", "strict") + if not isinstance(tkey, bytes): + tkey = tkey.encode("utf-8", "strict") + + if zip: + self.add(b"iTXt", key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + + zlib.compress(value)) + else: + self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + + value) + + def add_text(self, key, value, zip=0): + """Appends a text chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key, text or an + :py:class:`PIL.PngImagePlugin.iTXt` instance + :param zip: compression flag + + """ + if isinstance(value, iTXt): + return self.add_itxt(key, value, value.lang, value.tkey, bool(zip)) + + # The tEXt chunk stores latin-1 text + if not isinstance(value, bytes): + try: + value = value.encode('latin-1', 'strict') + except UnicodeError: + return self.add_itxt(key, value, zip=bool(zip)) + + if not isinstance(key, bytes): + key = key.encode('latin-1', 'strict') + + if zip: + self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) + else: + self.add(b"tEXt", key + b"\0" + value) + + +# -------------------------------------------------------------------- +# PNG image stream (IHDR/IEND) + +class PngStream(ChunkStream): + + def __init__(self, fp): + + ChunkStream.__init__(self, fp) + + # local copies of Image attributes + self.im_info = {} + self.im_text = {} + self.im_size = (0, 0) + self.im_mode = None + self.im_tile = None + self.im_palette = None + + self.text_memory = 0 + + def check_text_memory(self, chunklen): + self.text_memory += chunklen + if self.text_memory > MAX_TEXT_MEMORY: + raise ValueError("Too much memory used in text chunks: %s>MAX_TEXT_MEMORY" % + self.text_memory) + + def chunk_iCCP(self, pos, length): + + # ICC profile + s = ImageFile._safe_read(self.fp, length) + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + i = s.find(b"\0") + logger.debug("iCCP profile name %r", s[:i]) + logger.debug("Compression method %s", i8(s[i])) + comp_method = i8(s[i]) + if comp_method != 0: + raise SyntaxError("Unknown compression method %s in iCCP chunk" % + comp_method) + try: + icc_profile = _safe_zlib_decompress(s[i+2:]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + icc_profile = None + else: + raise + except zlib.error: + icc_profile = None # FIXME + self.im_info["icc_profile"] = icc_profile + return s + + def chunk_IHDR(self, pos, length): + + # image header + s = ImageFile._safe_read(self.fp, length) + self.im_size = i32(s), i32(s[4:]) + try: + self.im_mode, self.im_rawmode = _MODES[(i8(s[8]), i8(s[9]))] + except: + pass + if i8(s[12]): + self.im_info["interlace"] = 1 + if i8(s[11]): + raise SyntaxError("unknown filter category") + return s + + def chunk_IDAT(self, pos, length): + + # image data + self.im_tile = [("zip", (0, 0)+self.im_size, pos, self.im_rawmode)] + self.im_idat = length + raise EOFError + + def chunk_IEND(self, pos, length): + + # end of PNG image + raise EOFError + + def chunk_PLTE(self, pos, length): + + # palette + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + self.im_palette = "RGB", s + return s + + def chunk_tRNS(self, pos, length): + + # transparency + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + if _simple_palette.match(s): + # tRNS contains only one full-transparent entry, + # other entries are full opaque + i = s.find(b"\0") + if i >= 0: + self.im_info["transparency"] = i + else: + # otherwise, we have a byte string with one alpha value + # for each palette entry + self.im_info["transparency"] = s + elif self.im_mode == "L": + self.im_info["transparency"] = i16(s) + elif self.im_mode == "RGB": + self.im_info["transparency"] = i16(s), i16(s[2:]), i16(s[4:]) + return s + + def chunk_gAMA(self, pos, length): + + # gamma setting + s = ImageFile._safe_read(self.fp, length) + self.im_info["gamma"] = i32(s) / 100000.0 + return s + + def chunk_pHYs(self, pos, length): + + # pixels per unit + s = ImageFile._safe_read(self.fp, length) + px, py = i32(s), i32(s[4:]) + unit = i8(s[8]) + if unit == 1: # meter + dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5) + self.im_info["dpi"] = dpi + elif unit == 0: + self.im_info["aspect"] = px, py + return s + + def chunk_tEXt(self, pos, length): + + # text + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + # fallback for broken tEXt tags + k = s + v = b"" + if k: + if bytes is not str: + k = k.decode('latin-1', 'strict') + v = v.decode('latin-1', 'replace') + + self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + + return s + + def chunk_zTXt(self, pos, length): + + # compressed text + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + k = s + v = b"" + if v: + comp_method = i8(v[0]) + else: + comp_method = 0 + if comp_method != 0: + raise SyntaxError("Unknown compression method %s in zTXt chunk" % + comp_method) + try: + v = _safe_zlib_decompress(v[1:]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + v = b"" + else: + raise + except zlib.error: + v = b"" + + if k: + if bytes is not str: + k = k.decode('latin-1', 'strict') + v = v.decode('latin-1', 'replace') + + self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + + return s + + def chunk_iTXt(self, pos, length): + + # international text + r = s = ImageFile._safe_read(self.fp, length) + try: + k, r = r.split(b"\0", 1) + except ValueError: + return s + if len(r) < 2: + return s + cf, cm, r = i8(r[0]), i8(r[1]), r[2:] + try: + lang, tk, v = r.split(b"\0", 2) + except ValueError: + return s + if cf != 0: + if cm == 0: + try: + v = _safe_zlib_decompress(v) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + else: + raise + except zlib.error: + return s + else: + return s + if bytes is not str: + try: + k = k.decode("latin-1", "strict") + lang = lang.decode("utf-8", "strict") + tk = tk.decode("utf-8", "strict") + v = v.decode("utf-8", "strict") + except UnicodeError: + return s + + self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) + self.check_text_memory(len(v)) + + return s + + +# -------------------------------------------------------------------- +# PNG reader + +def _accept(prefix): + return prefix[:8] == _MAGIC + + +## +# Image plugin for PNG images. + +class PngImageFile(ImageFile.ImageFile): + + format = "PNG" + format_description = "Portable network graphics" + + def _open(self): + + if self.fp.read(8) != _MAGIC: + raise SyntaxError("not a PNG file") + + # + # Parse headers up to the first IDAT chunk + + self.png = PngStream(self.fp) + + while True: + + # + # get next chunk + + cid, pos, length = self.png.read() + + try: + s = self.png.call(cid, pos, length) + except EOFError: + break + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + + self.png.crc(cid, s) + + # + # Copy relevant attributes from the PngStream. An alternative + # would be to let the PngStream class modify these attributes + # directly, but that introduces circular references which are + # difficult to break if things go wrong in the decoder... + # (believe me, I've tried ;-) + + self.mode = self.png.im_mode + self.size = self.png.im_size + self.info = self.png.im_info + self.text = self.png.im_text # experimental + self.tile = self.png.im_tile + + if self.png.im_palette: + rawmode, data = self.png.im_palette + self.palette = ImagePalette.raw(rawmode, data) + + self.__idat = length # used by load_read() + + def verify(self): + "Verify PNG file" + + if self.fp is None: + raise RuntimeError("verify must be called directly after open") + + # back up to beginning of IDAT block + self.fp.seek(self.tile[0][2] - 8) + + self.png.verify() + self.png.close() + + self.fp = None + + def load_prepare(self): + "internal: prepare to read PNG file" + + if self.info.get("interlace"): + self.decoderconfig = self.decoderconfig + (1,) + + ImageFile.ImageFile.load_prepare(self) + + def load_read(self, read_bytes): + "internal: read more image data" + + while self.__idat == 0: + # end of chunk, skip forward to next one + + self.fp.read(4) # CRC + + cid, pos, length = self.png.read() + + if cid not in [b"IDAT", b"DDAT"]: + self.png.push(cid, pos, length) + return b"" + + self.__idat = length # empty chunks are allowed + + # read more data from this chunk + if read_bytes <= 0: + read_bytes = self.__idat + else: + read_bytes = min(read_bytes, self.__idat) + + self.__idat = self.__idat - read_bytes + + return self.fp.read(read_bytes) + + def load_end(self): + "internal: finished reading image data" + + self.png.close() + self.png = None + + +# -------------------------------------------------------------------- +# PNG writer + +_OUTMODES = { + # supported PIL modes, and corresponding rawmodes/bits/color combinations + "1": ("1", b'\x01\x00'), + "L;1": ("L;1", b'\x01\x00'), + "L;2": ("L;2", b'\x02\x00'), + "L;4": ("L;4", b'\x04\x00'), + "L": ("L", b'\x08\x00'), + "LA": ("LA", b'\x08\x04'), + "I": ("I;16B", b'\x10\x00'), + "P;1": ("P;1", b'\x01\x03'), + "P;2": ("P;2", b'\x02\x03'), + "P;4": ("P;4", b'\x04\x03'), + "P": ("P", b'\x08\x03'), + "RGB": ("RGB", b'\x08\x02'), + "RGBA": ("RGBA", b'\x08\x06'), +} + + +def putchunk(fp, cid, *data): + "Write a PNG chunk (including CRC field)" + + data = b"".join(data) + + fp.write(o32(len(data)) + cid) + fp.write(data) + hi, lo = Image.core.crc32(data, Image.core.crc32(cid)) + fp.write(o16(hi) + o16(lo)) + + +class _idat(object): + # wrap output from the encoder in IDAT chunks + + def __init__(self, fp, chunk): + self.fp = fp + self.chunk = chunk + + def write(self, data): + self.chunk(self.fp, b"IDAT", data) + + +def _save(im, fp, filename, chunk=putchunk, check=0): + # save an image to disk (called by the save method) + + mode = im.mode + + if mode == "P": + + # + # attempt to minimize storage requirements for palette images + if "bits" in im.encoderinfo: + # number of bits specified by user + colors = 1 << im.encoderinfo["bits"] + else: + # check palette contents + if im.palette: + colors = max(min(len(im.palette.getdata()[1])//3, 256), 2) + else: + colors = 256 + + if colors <= 2: + bits = 1 + elif colors <= 4: + bits = 2 + elif colors <= 16: + bits = 4 + else: + bits = 8 + if bits != 8: + mode = "%s;%d" % (mode, bits) + + # encoder options + im.encoderconfig = (im.encoderinfo.get("optimize", False), + im.encoderinfo.get("compress_level", -1), + im.encoderinfo.get("compress_type", -1), + im.encoderinfo.get("dictionary", b"")) + + # get the corresponding PNG mode + try: + rawmode, mode = _OUTMODES[mode] + except KeyError: + raise IOError("cannot write mode %s as PNG" % mode) + + if check: + return check + + # + # write minimal PNG file + + fp.write(_MAGIC) + + chunk(fp, b"IHDR", + o32(im.size[0]), o32(im.size[1]), # 0: size + mode, # 8: depth/type + b'\0', # 10: compression + b'\0', # 11: filter category + b'\0') # 12: interlace flag + + chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] + + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + # ICC profile + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + name = b"ICC Profile" + data = name + b"\0\0" + zlib.compress(icc) + chunk(fp, b"iCCP", data) + else: + chunks.remove(b"sRGB") + + info = im.encoderinfo.get("pnginfo") + if info: + chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] + for cid, data in info.chunks: + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + elif cid in chunks_multiple_allowed: + chunk(fp, cid, data) + + if im.mode == "P": + palette_byte_number = (2 ** bits) * 3 + palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] + while len(palette_bytes) < palette_byte_number: + palette_bytes += b'\0' + chunk(fp, b"PLTE", palette_bytes) + + transparency = im.encoderinfo.get('transparency', + im.info.get('transparency', None)) + + if transparency or transparency == 0: + if im.mode == "P": + # limit to actual palette size + alpha_bytes = 2**bits + if isinstance(transparency, bytes): + chunk(fp, b"tRNS", transparency[:alpha_bytes]) + else: + transparency = max(0, min(255, transparency)) + alpha = b'\xFF' * transparency + b'\0' + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + elif im.mode == "L": + transparency = max(0, min(65535, transparency)) + chunk(fp, b"tRNS", o16(transparency)) + elif im.mode == "RGB": + red, green, blue = transparency + chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) + else: + if "transparency" in im.encoderinfo: + # don't bother with transparency if it's an RGBA + # and it's in the info dict. It's probably just stale. + raise IOError("cannot use transparency for this mode") + else: + if im.mode == "P" and im.im.getpalettemode() == "RGBA": + alpha = im.im.getpalette("RGBA", "A") + alpha_bytes = 2**bits + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + + dpi = im.encoderinfo.get("dpi") + if dpi: + chunk(fp, b"pHYs", + o32(int(dpi[0] / 0.0254 + 0.5)), + o32(int(dpi[1] / 0.0254 + 0.5)), + b'\x01') + + info = im.encoderinfo.get("pnginfo") + if info: + chunks = [b"bKGD", b"hIST"] + for cid, data in info.chunks: + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + + ImageFile._save(im, _idat(fp, chunk), + [("zip", (0, 0)+im.size, 0, rawmode)]) + + chunk(fp, b"IEND", b"") + + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- +# PNG chunk converter + +def getchunks(im, **params): + """Return a list of PNG chunks representing this image.""" + + class collector(object): + data = [] + + def write(self, data): + pass + + def append(self, chunk): + self.data.append(chunk) + + def append(fp, cid, *data): + data = b"".join(data) + hi, lo = Image.core.crc32(data, Image.core.crc32(cid)) + crc = o16(hi) + o16(lo) + fp.append((cid, data, crc)) + + fp = collector() + + try: + im.encoderinfo = params + _save(im, fp, None, append) + finally: + del im.encoderinfo + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(PngImageFile.format, PngImageFile, _accept) +Image.register_save(PngImageFile.format, _save) + +Image.register_extension(PngImageFile.format, ".png") + +Image.register_mime(PngImageFile.format, "image/png") diff --git a/ascii2img/src/PIL/PpmImagePlugin.py b/ascii2img/src/PIL/PpmImagePlugin.py new file mode 100644 index 0000000..bd1b7a3 --- /dev/null +++ b/ascii2img/src/PIL/PpmImagePlugin.py @@ -0,0 +1,167 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PPM support for PIL +# +# History: +# 96-03-24 fl Created +# 98-03-06 fl Write RGBA images (as RGB, that is) +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + + +import string + +from . import Image, ImageFile + +__version__ = "0.2" + +# +# -------------------------------------------------------------------- + +b_whitespace = string.whitespace +try: + import locale + locale_lang, locale_enc = locale.getlocale() + if locale_enc is None: + locale_lang, locale_enc = locale.getdefaultlocale() + b_whitespace = b_whitespace.decode(locale_enc) +except: + pass +b_whitespace = b_whitespace.encode('ascii', 'ignore') + +MODES = { + # standard + b"P4": "1", + b"P5": "L", + b"P6": "RGB", + # extensions + b"P0CMYK": "CMYK", + # PIL extensions (for test purposes only) + b"PyP": "P", + b"PyRGBA": "RGBA", + b"PyCMYK": "CMYK" +} + + +def _accept(prefix): + return prefix[0:1] == b"P" and prefix[1] in b"0456y" + + +## +# Image plugin for PBM, PGM, and PPM images. + +class PpmImageFile(ImageFile.ImageFile): + + format = "PPM" + format_description = "Pbmplus image" + + def _token(self, s=b""): + while True: # read until next whitespace + c = self.fp.read(1) + if not c or c in b_whitespace: + break + if c > b'\x79': + raise ValueError("Expected ASCII value, found binary") + s = s + c + if (len(s) > 9): + raise ValueError("Expected int, got > 9 digits") + return s + + def _open(self): + + # check magic + s = self.fp.read(1) + if s != b"P": + raise SyntaxError("not a PPM file") + mode = MODES[self._token(s)] + + if mode == "1": + self.mode = "1" + rawmode = "1;I" + else: + self.mode = rawmode = mode + + for ix in range(3): + while True: + while True: + s = self.fp.read(1) + if s not in b_whitespace: + break + if s == b"": + raise ValueError("File does not extend beyond magic number") + if s != b"#": + break + s = self.fp.readline() + s = int(self._token(s)) + if ix == 0: + xsize = s + elif ix == 1: + ysize = s + if mode == "1": + break + elif ix == 2: + # maxgrey + if s > 255: + if not mode == 'L': + raise ValueError("Too many colors for band: %s" % s) + if s < 2**16: + self.mode = 'I' + rawmode = 'I;16B' + else: + self.mode = 'I' + rawmode = 'I;32B' + + self.size = xsize, ysize + self.tile = [("raw", + (0, 0, xsize, ysize), + self.fp.tell(), + (rawmode, 0, 1))] + + +# +# -------------------------------------------------------------------- + +def _save(im, fp, filename): + if im.mode == "1": + rawmode, head = "1;I", b"P4" + elif im.mode == "L": + rawmode, head = "L", b"P5" + elif im.mode == "I": + if im.getextrema()[1] < 2**16: + rawmode, head = "I;16B", b"P5" + else: + rawmode, head = "I;32B", b"P5" + elif im.mode == "RGB": + rawmode, head = "RGB", b"P6" + elif im.mode == "RGBA": + rawmode, head = "RGB", b"P6" + else: + raise IOError("cannot write mode %s as PPM" % im.mode) + fp.write(head + ("\n%d %d\n" % im.size).encode('ascii')) + if head == b"P6": + fp.write(b"255\n") + if head == b"P5": + if rawmode == "L": + fp.write(b"255\n") + elif rawmode == "I;16B": + fp.write(b"65535\n") + elif rawmode == "I;32B": + fp.write(b"2147483648\n") + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, 0, 1))]) + + # ALTERNATIVE: save via builtin debug function + # im._dump(filename) + +# +# -------------------------------------------------------------------- + +Image.register_open(PpmImageFile.format, PpmImageFile, _accept) +Image.register_save(PpmImageFile.format, _save) + +Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm"]) diff --git a/ascii2img/src/PIL/PsdImagePlugin.py b/ascii2img/src/PIL/PsdImagePlugin.py new file mode 100644 index 0000000..ee80327 --- /dev/null +++ b/ascii2img/src/PIL/PsdImagePlugin.py @@ -0,0 +1,306 @@ +# +# The Python Imaging Library +# $Id$ +# +# Adobe PSD 2.5/3.0 file handling +# +# History: +# 1995-09-01 fl Created +# 1997-01-03 fl Read most PSD images +# 1997-01-18 fl Fixed P and CMYK support +# 2001-10-21 fl Added seek/tell support (for layers) +# +# Copyright (c) 1997-2001 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +__version__ = "0.4" + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16be as i16, i32be as i32 + +MODES = { + # (photoshop mode, bits) -> (pil mode, required channels) + (0, 1): ("1", 1), + (0, 8): ("L", 1), + (1, 8): ("L", 1), + (2, 8): ("P", 1), + (3, 8): ("RGB", 3), + (4, 8): ("CMYK", 4), + (7, 8): ("L", 1), # FIXME: multilayer + (8, 8): ("L", 1), # duotone + (9, 8): ("LAB", 3) +} + + +# --------------------------------------------------------------------. +# read PSD images + +def _accept(prefix): + return prefix[:4] == b"8BPS" + + +## +# Image plugin for Photoshop images. + +class PsdImageFile(ImageFile.ImageFile): + + format = "PSD" + format_description = "Adobe Photoshop" + + def _open(self): + + read = self.fp.read + + # + # header + + s = read(26) + if s[:4] != b"8BPS" or i16(s[4:]) != 1: + raise SyntaxError("not a PSD file") + + psd_bits = i16(s[22:]) + psd_channels = i16(s[12:]) + psd_mode = i16(s[24:]) + + mode, channels = MODES[(psd_mode, psd_bits)] + + if channels > psd_channels: + raise IOError("not enough channels") + + self.mode = mode + self.size = i32(s[18:]), i32(s[14:]) + + # + # color mode data + + size = i32(read(4)) + if size: + data = read(size) + if mode == "P" and size == 768: + self.palette = ImagePalette.raw("RGB;L", data) + + # + # image resources + + self.resources = [] + + size = i32(read(4)) + if size: + # load resources + end = self.fp.tell() + size + while self.fp.tell() < end: + signature = read(4) + id = i16(read(2)) + name = read(i8(read(1))) + if not (len(name) & 1): + read(1) # padding + data = read(i32(read(4))) + if (len(data) & 1): + read(1) # padding + self.resources.append((id, name, data)) + if id == 1039: # ICC profile + self.info["icc_profile"] = data + + # + # layer and mask information + + self.layers = [] + + size = i32(read(4)) + if size: + end = self.fp.tell() + size + size = i32(read(4)) + if size: + self.layers = _layerinfo(self.fp) + self.fp.seek(end) + + # + # image descriptor + + self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) + + # keep the file open + self._fp = self.fp + self.frame = 1 + self._min_frame = 1 + + @property + def n_frames(self): + return len(self.layers) + + @property + def is_animated(self): + return len(self.layers) > 1 + + def seek(self, layer): + if not self._seek_check(layer): + return + + # seek to given layer (1..max) + try: + name, mode, bbox, tile = self.layers[layer-1] + self.mode = mode + self.tile = tile + self.frame = layer + self.fp = self._fp + return name, bbox + except IndexError: + raise EOFError("no such layer") + + def tell(self): + # return layer number (0=image, 1..max=layers) + return self.frame + + def load_prepare(self): + # create image memory if necessary + if not self.im or\ + self.im.mode != self.mode or self.im.size != self.size: + self.im = Image.core.fill(self.mode, self.size, 0) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + +def _layerinfo(file): + # read layerinfo block + layers = [] + read = file.read + for i in range(abs(i16(read(2)))): + + # bounding box + y0 = i32(read(4)) + x0 = i32(read(4)) + y1 = i32(read(4)) + x1 = i32(read(4)) + + # image info + info = [] + mode = [] + types = list(range(i16(read(2)))) + if len(types) > 4: + continue + + for i in types: + type = i16(read(2)) + + if type == 65535: + m = "A" + else: + m = "RGBA"[type] + + mode.append(m) + size = i32(read(4)) + info.append((m, size)) + + # figure out the image mode + mode.sort() + if mode == ["R"]: + mode = "L" + elif mode == ["B", "G", "R"]: + mode = "RGB" + elif mode == ["A", "B", "G", "R"]: + mode = "RGBA" + else: + mode = None # unknown + + # skip over blend flags and extra information + filler = read(12) + name = "" + size = i32(read(4)) + combined = 0 + if size: + length = i32(read(4)) + if length: + mask_y = i32(read(4)) + mask_x = i32(read(4)) + mask_h = i32(read(4)) - mask_y + mask_w = i32(read(4)) - mask_x + file.seek(length - 16, 1) + combined += length + 4 + + length = i32(read(4)) + if length: + file.seek(length, 1) + combined += length + 4 + + length = i8(read(1)) + if length: + # Don't know the proper encoding, + # Latin-1 should be a good guess + name = read(length).decode('latin-1', 'replace') + combined += length + 1 + + file.seek(size - combined, 1) + layers.append((name, mode, (x0, y0, x1, y1))) + + # get tiles + i = 0 + for name, mode, bbox in layers: + tile = [] + for m in mode: + t = _maketile(file, m, bbox, 1) + if t: + tile.extend(t) + layers[i] = name, mode, bbox, tile + i += 1 + + return layers + + +def _maketile(file, mode, bbox, channels): + + tile = None + read = file.read + + compression = i16(read(2)) + + xsize = bbox[2] - bbox[0] + ysize = bbox[3] - bbox[1] + + offset = file.tell() + + if compression == 0: + # + # raw compression + tile = [] + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tile.append(("raw", bbox, offset, layer)) + offset = offset + xsize*ysize + + elif compression == 1: + # + # packbits compression + i = 0 + tile = [] + bytecount = read(channels * ysize * 2) + offset = file.tell() + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tile.append( + ("packbits", bbox, offset, layer) + ) + for y in range(ysize): + offset = offset + i16(bytecount[i:i+2]) + i += 2 + + file.seek(offset) + + if offset & 1: + read(1) # padding + + return tile + +# -------------------------------------------------------------------- +# registry + +Image.register_open(PsdImageFile.format, PsdImageFile, _accept) + +Image.register_extension(PsdImageFile.format, ".psd") diff --git a/ascii2img/src/PIL/PyAccess.py b/ascii2img/src/PIL/PyAccess.py new file mode 100644 index 0000000..7eec1b1 --- /dev/null +++ b/ascii2img/src/PIL/PyAccess.py @@ -0,0 +1,317 @@ +# +# The Python Imaging Library +# Pillow fork +# +# Python implementation of the PixelAccess Object +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# Copyright (c) 2013 Eric Soroos +# +# See the README file for information on usage and redistribution +# + +# Notes: +# +# * Implements the pixel access object following Access. +# * Does not implement the line functions, as they don't appear to be used +# * Taking only the tuple form, which is used from python. +# * Fill.c uses the integer form, but it's still going to use the old +# Access.c implementation. +# + +import logging +import sys + +from cffi import FFI + + +logger = logging.getLogger(__name__) + + +defs = """ +struct Pixel_RGBA { + unsigned char r,g,b,a; +}; +struct Pixel_I16 { + unsigned char l,r; +}; +""" +ffi = FFI() +ffi.cdef(defs) + + +class PyAccess(object): + + def __init__(self, img, readonly=False): + vals = dict(img.im.unsafe_ptrs) + self.readonly = readonly + self.image8 = ffi.cast('unsigned char **', vals['image8']) + self.image32 = ffi.cast('int **', vals['image32']) + self.image = ffi.cast('unsigned char **', vals['image']) + self.xsize, self.ysize = img.im.size + + # Keep pointer to im object to prevent dereferencing. + self._im = img.im + + # Debugging is polluting test traces, only useful here + # when hacking on PyAccess + # logger.debug("%s", vals) + self._post_init() + + def _post_init(self): + pass + + def __setitem__(self, xy, color): + """ + Modifies the pixel at x,y. The color is given as a single + numerical value for single band images, and a tuple for + multi-band images + + :param xy: The pixel coordinate, given as (x, y). + :param color: The pixel value. + """ + if self.readonly: + raise ValueError('Attempt to putpixel a read only image') + (x, y) = self.check_xy(xy) + return self.set_pixel(x, y, color) + + def __getitem__(self, xy): + """ + Returns the pixel at x,y. The pixel is returned as a single + value for single band images or a tuple for multiple band + images + + :param xy: The pixel coordinate, given as (x, y). + :returns: a pixel value for single band images, a tuple of + pixel values for multiband images. + """ + + (x, y) = self.check_xy(xy) + return self.get_pixel(x, y) + + putpixel = __setitem__ + getpixel = __getitem__ + + def check_xy(self, xy): + (x, y) = xy + if not (0 <= x < self.xsize and 0 <= y < self.ysize): + raise ValueError('pixel location out of range') + return xy + + +class _PyAccess32_2(PyAccess): + """ PA, LA, stored in first and last bytes of a 32 bit word """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.a) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.a = min(color[1], 255) + + +class _PyAccess32_3(PyAccess): + """ RGB and friends, stored in the first three bytes of a 32 bit word """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.g, pixel.b) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.g = min(color[1], 255) + pixel.b = min(color[2], 255) + pixel.a = 255 + + +class _PyAccess32_4(PyAccess): + """ RGBA etc, all 4 bytes of a 32 bit word """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.g, pixel.b, pixel.a) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.g = min(color[1], 255) + pixel.b = min(color[2], 255) + pixel.a = min(color[3], 255) + + +class _PyAccess8(PyAccess): + """ 1, L, P, 8 bit images stored as uint8 """ + def _post_init(self, *args, **kwargs): + self.pixels = self.image8 + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # integer + self.pixels[y][x] = min(color, 255) + except TypeError: + # tuple + self.pixels[y][x] = min(color[0], 255) + + +class _PyAccessI16_N(PyAccess): + """ I;16 access, native bitendian without conversion """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast('unsigned short **', self.image) + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # integer + self.pixels[y][x] = min(color, 65535) + except TypeError: + # tuple + self.pixels[y][x] = min(color[0], 65535) + + +class _PyAccessI16_L(PyAccess): + """ I;16L access, with conversion """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast('struct Pixel_I16 **', self.image) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return pixel.l + pixel.r * 256 + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + try: + color = min(color, 65535) + except TypeError: + color = min(color[0], 65535) + + pixel.l = color & 0xFF + pixel.r = color >> 8 + + +class _PyAccessI16_B(PyAccess): + """ I;16B access, with conversion """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast('struct Pixel_I16 **', self.image) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return pixel.l * 256 + pixel.r + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + try: + color = min(color, 65535) + except: + color = min(color[0], 65535) + + pixel.l = color >> 8 + pixel.r = color & 0xFF + + +class _PyAccessI32_N(PyAccess): + """ Signed Int32 access, native endian """ + def _post_init(self, *args, **kwargs): + self.pixels = self.image32 + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + self.pixels[y][x] = color + + +class _PyAccessI32_Swap(PyAccess): + """ I;32L/B access, with byteswapping conversion """ + def _post_init(self, *args, **kwargs): + self.pixels = self.image32 + + def reverse(self, i): + orig = ffi.new('int *', i) + chars = ffi.cast('unsigned char *', orig) + chars[0], chars[1], chars[2], chars[3] = chars[3], chars[2], \ + chars[1], chars[0] + return ffi.cast('int *', chars)[0] + + def get_pixel(self, x, y): + return self.reverse(self.pixels[y][x]) + + def set_pixel(self, x, y, color): + self.pixels[y][x] = self.reverse(color) + + +class _PyAccessF(PyAccess): + """ 32 bit float access """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast('float **', self.image32) + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # not a tuple + self.pixels[y][x] = color + except TypeError: + # tuple + self.pixels[y][x] = color[0] + + +mode_map = {'1': _PyAccess8, + 'L': _PyAccess8, + 'P': _PyAccess8, + 'LA': _PyAccess32_2, + 'La': _PyAccess32_2, + 'PA': _PyAccess32_2, + 'RGB': _PyAccess32_3, + 'LAB': _PyAccess32_3, + 'HSV': _PyAccess32_3, + 'YCbCr': _PyAccess32_3, + 'RGBA': _PyAccess32_4, + 'RGBa': _PyAccess32_4, + 'RGBX': _PyAccess32_4, + 'CMYK': _PyAccess32_4, + 'F': _PyAccessF, + 'I': _PyAccessI32_N, + } + +if sys.byteorder == 'little': + mode_map['I;16'] = _PyAccessI16_N + mode_map['I;16L'] = _PyAccessI16_N + mode_map['I;16B'] = _PyAccessI16_B + + mode_map['I;32L'] = _PyAccessI32_N + mode_map['I;32B'] = _PyAccessI32_Swap +else: + mode_map['I;16'] = _PyAccessI16_L + mode_map['I;16L'] = _PyAccessI16_L + mode_map['I;16B'] = _PyAccessI16_N + + mode_map['I;32L'] = _PyAccessI32_Swap + mode_map['I;32B'] = _PyAccessI32_N + + +def new(img, readonly=False): + access_type = mode_map.get(img.mode, None) + if not access_type: + logger.debug("PyAccess Not Implemented: %s", img.mode) + return None + return access_type(img, readonly) diff --git a/ascii2img/src/PIL/SgiImagePlugin.py b/ascii2img/src/PIL/SgiImagePlugin.py new file mode 100644 index 0000000..768f755 --- /dev/null +++ b/ascii2img/src/PIL/SgiImagePlugin.py @@ -0,0 +1,226 @@ +# +# The Python Imaging Library. +# $Id$ +# +# SGI image file handling +# +# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. +# +# +# +# History: +# 2017-22-07 mb Add RLE decompression +# 2016-16-10 mb Add save method without compression +# 1995-09-10 fl Created +# +# Copyright (c) 2016 by Mickael Bonfill. +# Copyright (c) 2008 by Karsten Hiddemann. +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1995 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8, o8, i16be as i16, o16be as o16 +import struct +import os +import sys + + +__version__ = "0.3" + + +def _accept(prefix): + return len(prefix) >= 2 and i16(prefix) == 474 + + +MODES = { + (1, 1, 1): "L", + (1, 2, 1): "L", + (2, 1, 1): "L;16B", + (2, 2, 1): "L;16B", + (1, 3, 3): "RGB", + (2, 3, 3): "RGB;16B", + (1, 3, 4): "RGBA", + (2, 3, 4): "RGBA;16B" +} + + +## +# Image plugin for SGI images. +class SgiImageFile(ImageFile.ImageFile): + + format = "SGI" + format_description = "SGI Image File Format" + + def _open(self): + + # HEAD + headlen = 512 + s = self.fp.read(headlen) + + # magic number : 474 + if i16(s) != 474: + raise ValueError("Not an SGI image file") + + # compression : verbatim or RLE + compression = i8(s[2]) + + # bpc : 1 or 2 bytes (8bits or 16bits) + bpc = i8(s[3]) + + # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) + dimension = i16(s[4:]) + + # xsize : width + xsize = i16(s[6:]) + + # ysize : height + ysize = i16(s[8:]) + + # zsize : channels count + zsize = i16(s[10:]) + + # layout + layout = bpc, dimension, zsize + + # determine mode from bits/zsize + rawmode = "" + try: + rawmode = MODES[layout] + except KeyError: + pass + + if rawmode == "": + raise ValueError("Unsupported SGI image mode") + + self.size = xsize, ysize + self.mode = rawmode.split(";")[0] + + # orientation -1 : scanlines begins at the bottom-left corner + orientation = -1 + + # decoder info + if compression == 0: + pagesize = xsize * ysize * bpc + if bpc == 2: + self.tile = [("SGI16", (0, 0) + self.size, + headlen, (self.mode, 0, orientation))] + else: + self.tile = [] + offset = headlen + for layer in self.mode: + self.tile.append( + ("raw", (0, 0) + self.size, + offset, (layer, 0, orientation))) + offset += pagesize + elif compression == 1: + self.tile = [("sgi_rle", (0, 0) + self.size, + headlen, (rawmode, orientation, bpc))] + + +def _save(im, fp, filename): + if im.mode != "RGB" and im.mode != "RGBA" and im.mode != "L": + raise ValueError("Unsupported SGI image mode") + + # Get the keyword arguments + info = im.encoderinfo + + # Byte-per-pixel precision, 1 = 8bits per pixel + bpc = info.get("bpc", 1) + + if bpc not in (1, 2): + raise ValueError("Unsupported number of bytes per pixel") + + # Flip the image, since the origin of SGI file is the bottom-left corner + orientation = -1 + # Define the file as SGI File Format + magicNumber = 474 + # Run-Length Encoding Compression - Unsupported at this time + rle = 0 + + # Number of dimensions (x,y,z) + dim = 3 + # X Dimension = width / Y Dimension = height + x, y = im.size + if im.mode == "L" and y == 1: + dim = 1 + elif im.mode == "L": + dim = 2 + # Z Dimension: Number of channels + z = len(im.mode) + + if dim == 1 or dim == 2: + z = 1 + + # assert we've got the right number of bands. + if len(im.getbands()) != z: + raise ValueError("incorrect number of bands in SGI write: %s vs %s" % + (z, len(im.getbands()))) + + # Minimum Byte value + pinmin = 0 + # Maximum Byte value (255 = 8bits per pixel) + pinmax = 255 + # Image name (79 characters max, truncated below in write) + imgName = os.path.splitext(os.path.basename(filename))[0] + if str is not bytes: + imgName = imgName.encode('ascii', 'ignore') + # Standard representation of pixel in the file + colormap = 0 + fp.write(struct.pack('>h', magicNumber)) + fp.write(o8(rle)) + fp.write(o8(bpc)) + fp.write(struct.pack('>H', dim)) + fp.write(struct.pack('>H', x)) + fp.write(struct.pack('>H', y)) + fp.write(struct.pack('>H', z)) + fp.write(struct.pack('>l', pinmin)) + fp.write(struct.pack('>l', pinmax)) + fp.write(struct.pack('4s', b'')) # dummy + fp.write(struct.pack('79s', imgName)) # truncates to 79 chars + fp.write(struct.pack('s', b'')) # force null byte after imgname + fp.write(struct.pack('>l', colormap)) + fp.write(struct.pack('404s', b'')) # dummy + + rawmode = 'L' + if bpc == 2: + rawmode = 'L;16B' + + for channel in im.split(): + fp.write(channel.tobytes('raw', rawmode, 0, orientation)) + + fp.close() + +class SGI16Decoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer): + rawmode, stride, orientation = self.args + pagesize = self.state.xsize * self.state.ysize + zsize = len(self.mode) + self.fd.seek(512) + + for band in range(zsize): + channel = Image.new('L', (self.state.xsize, self.state.ysize)) + channel.frombytes(self.fd.read(2 * pagesize), 'raw', + 'L;16B', stride, orientation) + self.im.putband(channel.im, band) + + return -1, 0 + +# +# registry + + +Image.register_decoder("SGI16", SGI16Decoder) +Image.register_open(SgiImageFile.format, SgiImageFile, _accept) +Image.register_save(SgiImageFile.format, _save) +Image.register_mime(SgiImageFile.format, "image/sgi") +Image.register_mime(SgiImageFile.format, "image/rgb") + +Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) + +# End of file diff --git a/ascii2img/src/PIL/SpiderImagePlugin.py b/ascii2img/src/PIL/SpiderImagePlugin.py new file mode 100644 index 0000000..5e5dde5 --- /dev/null +++ b/ascii2img/src/PIL/SpiderImagePlugin.py @@ -0,0 +1,316 @@ +# +# The Python Imaging Library. +# +# SPIDER image file handling +# +# History: +# 2004-08-02 Created BB +# 2006-03-02 added save method +# 2006-03-13 added support for stack images +# +# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. +# Copyright (c) 2004 by William Baxter. +# Copyright (c) 2004 by Secret Labs AB. +# Copyright (c) 2004 by Fredrik Lundh. +# + +## +# Image plugin for the Spider image format. This format is is used +# by the SPIDER software, in processing image data from electron +# microscopy and tomography. +## + +# +# SpiderImagePlugin.py +# +# The Spider image format is used by SPIDER software, in processing +# image data from electron microscopy and tomography. +# +# Spider home page: +# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html +# +# Details about the Spider image format: +# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html +# + +from __future__ import print_function + +from PIL import Image, ImageFile +import os +import struct +import sys + + +def isInt(f): + try: + i = int(f) + if f-i == 0: + return 1 + else: + return 0 + except ValueError: + return 0 + except OverflowError: + return 0 + +iforms = [1, 3, -11, -12, -21, -22] + + +# There is no magic number to identify Spider files, so just check a +# series of header locations to see if they have reasonable values. +# Returns no. of bytes in the header, if it is a valid Spider header, +# otherwise returns 0 + +def isSpiderHeader(t): + h = (99,) + t # add 1 value so can use spider header index start=1 + # header values 1,2,5,12,13,22,23 should be integers + for i in [1, 2, 5, 12, 13, 22, 23]: + if not isInt(h[i]): + return 0 + # check iform + iform = int(h[5]) + if iform not in iforms: + return 0 + # check other header values + labrec = int(h[13]) # no. records in file header + labbyt = int(h[22]) # total no. of bytes in header + lenbyt = int(h[23]) # record length in bytes + # print("labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt)) + if labbyt != (labrec * lenbyt): + return 0 + # looks like a valid header + return labbyt + + +def isSpiderImage(filename): + with open(filename, 'rb') as fp: + f = fp.read(92) # read 23 * 4 bytes + t = struct.unpack('>23f', f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + t = struct.unpack('<23f', f) # little-endian + hdrlen = isSpiderHeader(t) + return hdrlen + + +class SpiderImageFile(ImageFile.ImageFile): + + format = "SPIDER" + format_description = "Spider 2D image" + _close_exclusive_fp_after_loading = False + + def _open(self): + # check header + n = 27 * 4 # read 27 float values + f = self.fp.read(n) + + try: + self.bigendian = 1 + t = struct.unpack('>27f', f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + self.bigendian = 0 + t = struct.unpack('<27f', f) # little-endian + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + raise SyntaxError("not a valid Spider file") + except struct.error: + raise SyntaxError("not a valid Spider file") + + h = (99,) + t # add 1 value : spider header index starts at 1 + iform = int(h[5]) + if iform != 1: + raise SyntaxError("not a Spider 2D image") + + self.size = int(h[12]), int(h[2]) # size in pixels (width, height) + self.istack = int(h[24]) + self.imgnumber = int(h[27]) + + if self.istack == 0 and self.imgnumber == 0: + # stk=0, img=0: a regular 2D image + offset = hdrlen + self._nimages = 1 + elif self.istack > 0 and self.imgnumber == 0: + # stk>0, img=0: Opening the stack for the first time + self.imgbytes = int(h[12]) * int(h[2]) * 4 + self.hdrlen = hdrlen + self._nimages = int(h[26]) + # Point to the first image in the stack + offset = hdrlen * 2 + self.imgnumber = 1 + elif self.istack == 0 and self.imgnumber > 0: + # stk=0, img>0: an image within the stack + offset = hdrlen + self.stkoffset + self.istack = 2 # So Image knows it's still a stack + else: + raise SyntaxError("inconsistent stack header values") + + if self.bigendian: + self.rawmode = "F;32BF" + else: + self.rawmode = "F;32F" + self.mode = "F" + + self.tile = [ + ("raw", (0, 0) + self.size, offset, + (self.rawmode, 0, 1))] + self.__fp = self.fp # FIXME: hack + + @property + def n_frames(self): + return self._nimages + + @property + def is_animated(self): + return self._nimages > 1 + + # 1st image index is zero (although SPIDER imgnumber starts at 1) + def tell(self): + if self.imgnumber < 1: + return 0 + else: + return self.imgnumber - 1 + + def seek(self, frame): + if self.istack == 0: + raise EOFError("attempt to seek in a non-stack file") + if not self._seek_check(frame): + return + self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) + self.fp = self.__fp + self.fp.seek(self.stkoffset) + self._open() + + # returns a byte image after rescaling to 0..255 + def convert2byte(self, depth=255): + (minimum, maximum) = self.getextrema() + m = 1 + if maximum != minimum: + m = depth / (maximum-minimum) + b = -m * minimum + return self.point(lambda i, m=m, b=b: i * m + b).convert("L") + + # returns a ImageTk.PhotoImage object, after rescaling to 0..255 + def tkPhotoImage(self): + from PIL import ImageTk + return ImageTk.PhotoImage(self.convert2byte(), palette=256) + + +# -------------------------------------------------------------------- +# Image series + +# given a list of filenames, return a list of images +def loadImageSeries(filelist=None): + " create a list of Image.images for use in montage " + if filelist is None or len(filelist) < 1: + return + + imglist = [] + for img in filelist: + if not os.path.exists(img): + print("unable to find %s" % img) + continue + try: + im = Image.open(img).convert2byte() + except: + if not isSpiderImage(img): + print(img + " is not a Spider image file") + continue + im.info['filename'] = img + imglist.append(im) + return imglist + + +# -------------------------------------------------------------------- +# For saving images in Spider format + +def makeSpiderHeader(im): + nsam, nrow = im.size + lenbyt = nsam * 4 # There are labrec records in the header + labrec = 1024 / lenbyt + if 1024 % lenbyt != 0: + labrec += 1 + labbyt = labrec * lenbyt + hdr = [] + nvalues = int(labbyt / 4) + for i in range(nvalues): + hdr.append(0.0) + + if len(hdr) < 23: + return [] + + # NB these are Fortran indices + hdr[1] = 1.0 # nslice (=1 for an image) + hdr[2] = float(nrow) # number of rows per slice + hdr[5] = 1.0 # iform for 2D image + hdr[12] = float(nsam) # number of pixels per line + hdr[13] = float(labrec) # number of records in file header + hdr[22] = float(labbyt) # total number of bytes in header + hdr[23] = float(lenbyt) # record length in bytes + + # adjust for Fortran indexing + hdr = hdr[1:] + hdr.append(0.0) + # pack binary data into a string + hdrstr = [] + for v in hdr: + hdrstr.append(struct.pack('f', v)) + return hdrstr + + +def _save(im, fp, filename): + if im.mode[0] != "F": + im = im.convert('F') + + hdr = makeSpiderHeader(im) + if len(hdr) < 256: + raise IOError("Error creating Spider header") + + # write the SPIDER header + fp.writelines(hdr) + + rawmode = "F;32NF" # 32-bit native floating point + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, 0, 1))]) + + +def _save_spider(im, fp, filename): + # get the filename extension and register it with Image + ext = os.path.splitext(filename)[1] + Image.register_extension(SpiderImageFile.format, ext) + _save(im, fp, filename) + +# -------------------------------------------------------------------- + +Image.register_open(SpiderImageFile.format, SpiderImageFile) +Image.register_save(SpiderImageFile.format, _save_spider) + +if __name__ == "__main__": + + if not sys.argv[1:]: + print("Syntax: python SpiderImagePlugin.py [infile] [outfile]") + sys.exit() + + filename = sys.argv[1] + if not isSpiderImage(filename): + print("input image must be in Spider format") + sys.exit() + + outfile = "" + if len(sys.argv[1:]) > 1: + outfile = sys.argv[2] + + im = Image.open(filename) + print("image: " + str(im)) + print("format: " + str(im.format)) + print("size: " + str(im.size)) + print("mode: " + str(im.mode)) + print("max, min: ", end=' ') + print(im.getextrema()) + + if outfile != "": + # perform some image operation + im = im.transpose(Image.FLIP_LEFT_RIGHT) + print( + "saving a flipped version of %s as %s " % + (os.path.basename(filename), outfile)) + im.save(outfile, SpiderImageFile.format) diff --git a/ascii2img/src/PIL/SunImagePlugin.py b/ascii2img/src/PIL/SunImagePlugin.py new file mode 100644 index 0000000..afee7d1 --- /dev/null +++ b/ascii2img/src/PIL/SunImagePlugin.py @@ -0,0 +1,135 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Sun image file handling +# +# History: +# 1995-09-10 fl Created +# 1996-05-28 fl Fixed 32-bit alignment +# 1998-12-29 fl Import ImagePalette module +# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995-1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i32be as i32 + +__version__ = "0.3" + + +def _accept(prefix): + return len(prefix) >= 4 and i32(prefix) == 0x59a66a95 + + +## +# Image plugin for Sun raster files. + +class SunImageFile(ImageFile.ImageFile): + + format = "SUN" + format_description = "Sun Raster File" + + def _open(self): + + # The Sun Raster file header is 32 bytes in length + # and has the following format: + + # typedef struct _SunRaster + # { + # DWORD MagicNumber; /* Magic (identification) number */ + # DWORD Width; /* Width of image in pixels */ + # DWORD Height; /* Height of image in pixels */ + # DWORD Depth; /* Number of bits per pixel */ + # DWORD Length; /* Size of image data in bytes */ + # DWORD Type; /* Type of raster file */ + # DWORD ColorMapType; /* Type of color map */ + # DWORD ColorMapLength; /* Size of the color map in bytes */ + # } SUNRASTER; + + # HEAD + s = self.fp.read(32) + if i32(s) != 0x59a66a95: + raise SyntaxError("not an SUN raster file") + + offset = 32 + + self.size = i32(s[4:8]), i32(s[8:12]) + + depth = i32(s[12:16]) + data_length = i32(s[16:20]) # unreliable, ignore. + file_type = i32(s[20:24]) + palette_type = i32(s[24:28]) # 0: None, 1: RGB, 2: Raw/arbitrary + palette_length = i32(s[28:32]) + + if depth == 1: + self.mode, rawmode = "1", "1;I" + elif depth == 4: + self.mode, rawmode = "L", "L;4" + elif depth == 8: + self.mode = rawmode = "L" + elif depth == 24: + if file_type == 3: + self.mode, rawmode = "RGB", "RGB" + else: + self.mode, rawmode = "RGB", "BGR" + elif depth == 32: + if file_type == 3: + self.mode, rawmode = 'RGB', 'RGBX' + else: + self.mode, rawmode = 'RGB', 'BGRX' + else: + raise SyntaxError("Unsupported Mode/Bit Depth") + + if palette_length: + if palette_length > 1024: + raise SyntaxError("Unsupported Color Palette Length") + + if palette_type != 1: + raise SyntaxError("Unsupported Palette Type") + + offset = offset + palette_length + self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) + if self.mode == "L": + self.mode = "P" + rawmode = rawmode.replace('L', 'P') + + # 16 bit boundaries on stride + stride = ((self.size[0] * depth + 15) // 16) * 2 + + # file type: Type is the version (or flavor) of the bitmap + # file. The following values are typically found in the Type + # field: + # 0000h Old + # 0001h Standard + # 0002h Byte-encoded + # 0003h RGB format + # 0004h TIFF format + # 0005h IFF format + # FFFFh Experimental + + # Old and standard are the same, except for the length tag. + # byte-encoded is run-length-encoded + # RGB looks similar to standard, but RGB byte order + # TIFF and IFF mean that they were converted from T/IFF + # Experimental means that it's something else. + # (https://www.fileformat.info/format/sunraster/egff.htm) + + if file_type in (0, 1, 3, 4, 5): + self.tile = [("raw", (0, 0)+self.size, offset, (rawmode, stride))] + elif file_type == 2: + self.tile = [("sun_rle", (0, 0)+self.size, offset, rawmode)] + else: + raise SyntaxError('Unsupported Sun Raster file type') + +# +# registry + +Image.register_open(SunImageFile.format, SunImageFile, _accept) + +Image.register_extension(SunImageFile.format, ".ras") diff --git a/ascii2img/src/PIL/TarIO.py b/ascii2img/src/PIL/TarIO.py new file mode 100644 index 0000000..0e949ff --- /dev/null +++ b/ascii2img/src/PIL/TarIO.py @@ -0,0 +1,56 @@ +# +# The Python Imaging Library. +# $Id$ +# +# read files from within a tar file +# +# History: +# 95-06-18 fl Created +# 96-05-28 fl Open files in binary mode +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-96. +# +# See the README file for information on usage and redistribution. +# + +from . import ContainerIO + + +## +# A file object that provides read access to a given member of a TAR +# file. + +class TarIO(ContainerIO.ContainerIO): + + def __init__(self, tarfile, file): + """ + Create file object. + + :param tarfile: Name of TAR file. + :param file: Name of member file. + """ + fh = open(tarfile, "rb") + + while True: + + s = fh.read(512) + if len(s) != 512: + raise IOError("unexpected end of tar file") + + name = s[:100].decode('utf-8') + i = name.find('\0') + if i == 0: + raise IOError("cannot find subfile") + if i > 0: + name = name[:i] + + size = int(s[124:135], 8) + + if file == name: + break + + fh.seek((size + 511) & (~511), 1) + + # Open region + ContainerIO.ContainerIO.__init__(self, fh, fh.tell(), size) diff --git a/ascii2img/src/PIL/TgaImagePlugin.py b/ascii2img/src/PIL/TgaImagePlugin.py new file mode 100644 index 0000000..a9596bd --- /dev/null +++ b/ascii2img/src/PIL/TgaImagePlugin.py @@ -0,0 +1,192 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TGA file handling +# +# History: +# 95-09-01 fl created (reads 24-bit files only) +# 97-01-04 fl support more TGA versions, including compressed images +# 98-07-04 fl fixed orientation and alpha layer bugs +# 98-09-11 fl fixed orientation for runlength decoder +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, o8, o16le as o16 + +__version__ = "0.3" + + +# +# -------------------------------------------------------------------- +# Read RGA file + + +MODES = { + # map imagetype/depth to rawmode + (1, 8): "P", + (3, 1): "1", + (3, 8): "L", + (2, 16): "BGR;5", + (2, 24): "BGR", + (2, 32): "BGRA", +} + + +## +# Image plugin for Targa files. + +class TgaImageFile(ImageFile.ImageFile): + + format = "TGA" + format_description = "Targa" + + def _open(self): + + # process header + s = self.fp.read(18) + + idlen = i8(s[0]) + + colormaptype = i8(s[1]) + imagetype = i8(s[2]) + + depth = i8(s[16]) + + flags = i8(s[17]) + + self.size = i16(s[12:]), i16(s[14:]) + + # validate header fields + if colormaptype not in (0, 1) or\ + self.size[0] <= 0 or self.size[1] <= 0 or\ + depth not in (1, 8, 16, 24, 32): + raise SyntaxError("not a TGA file") + + # image mode + if imagetype in (3, 11): + self.mode = "L" + if depth == 1: + self.mode = "1" # ??? + elif imagetype in (1, 9): + self.mode = "P" + elif imagetype in (2, 10): + self.mode = "RGB" + if depth == 32: + self.mode = "RGBA" + else: + raise SyntaxError("unknown TGA mode") + + # orientation + orientation = flags & 0x30 + if orientation == 0x20: + orientation = 1 + elif not orientation: + orientation = -1 + else: + raise SyntaxError("unknown TGA orientation") + + self.info["orientation"] = orientation + + if imagetype & 8: + self.info["compression"] = "tga_rle" + + if idlen: + self.info["id_section"] = self.fp.read(idlen) + + if colormaptype: + # read palette + start, size, mapdepth = i16(s[3:]), i16(s[5:]), i16(s[7:]) + if mapdepth == 16: + self.palette = ImagePalette.raw( + "BGR;16", b"\0"*2*start + self.fp.read(2*size)) + elif mapdepth == 24: + self.palette = ImagePalette.raw( + "BGR", b"\0"*3*start + self.fp.read(3*size)) + elif mapdepth == 32: + self.palette = ImagePalette.raw( + "BGRA", b"\0"*4*start + self.fp.read(4*size)) + + # setup tile descriptor + try: + rawmode = MODES[(imagetype & 7, depth)] + if imagetype & 8: + # compressed + self.tile = [("tga_rle", (0, 0)+self.size, + self.fp.tell(), (rawmode, orientation, depth))] + else: + self.tile = [("raw", (0, 0)+self.size, + self.fp.tell(), (rawmode, 0, orientation))] + except KeyError: + pass # cannot decode + +# +# -------------------------------------------------------------------- +# Write TGA file + +SAVE = { + "1": ("1", 1, 0, 3), + "L": ("L", 8, 0, 3), + "P": ("P", 8, 1, 1), + "RGB": ("BGR", 24, 0, 2), + "RGBA": ("BGRA", 32, 0, 2), +} + + +def _save(im, fp, filename): + + try: + rawmode, bits, colormaptype, imagetype = SAVE[im.mode] + except KeyError: + raise IOError("cannot write mode %s as TGA" % im.mode) + + if colormaptype: + colormapfirst, colormaplength, colormapentry = 0, 256, 24 + else: + colormapfirst, colormaplength, colormapentry = 0, 0, 0 + + if im.mode == "RGBA": + flags = 8 + else: + flags = 0 + + orientation = im.info.get("orientation", -1) + if orientation > 0: + flags = flags | 0x20 + + fp.write(b"\000" + + o8(colormaptype) + + o8(imagetype) + + o16(colormapfirst) + + o16(colormaplength) + + o8(colormapentry) + + o16(0) + + o16(0) + + o16(im.size[0]) + + o16(im.size[1]) + + o8(bits) + + o8(flags)) + + if colormaptype: + fp.write(im.im.getpalette("RGB", "BGR")) + + ImageFile._save( + im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))]) + + # write targa version 2 footer + fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") + +# +# -------------------------------------------------------------------- +# Registry + +Image.register_open(TgaImageFile.format, TgaImageFile) +Image.register_save(TgaImageFile.format, _save) + +Image.register_extension(TgaImageFile.format, ".tga") diff --git a/ascii2img/src/PIL/TiffImagePlugin.py b/ascii2img/src/PIL/TiffImagePlugin.py new file mode 100644 index 0000000..07fb97d --- /dev/null +++ b/ascii2img/src/PIL/TiffImagePlugin.py @@ -0,0 +1,1821 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF file handling +# +# TIFF is a flexible, if somewhat aged, image file format originally +# defined by Aldus. Although TIFF supports a wide variety of pixel +# layouts and compression methods, the name doesn't really stand for +# "thousands of incompatible file formats," it just feels that way. +# +# To read TIFF data from a stream, the stream must be seekable. For +# progressive decoding, make sure to use TIFF files where the tag +# directory is placed first in the file. +# +# History: +# 1995-09-01 fl Created +# 1996-05-04 fl Handle JPEGTABLES tag +# 1996-05-18 fl Fixed COLORMAP support +# 1997-01-05 fl Fixed PREDICTOR support +# 1997-08-27 fl Added support for rational tags (from Perry Stoll) +# 1998-01-10 fl Fixed seek/tell (from Jan Blom) +# 1998-07-15 fl Use private names for internal variables +# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) +# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) +# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) +# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) +# 2001-12-18 fl Added workaround for broken Matrox library +# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) +# 2003-05-19 fl Check FILLORDER tag +# 2003-09-26 fl Added RGBa support +# 2004-02-24 fl Added DPI support; fixed rational write support +# 2005-02-07 fl Added workaround for broken Corel Draw 10 files +# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) +# +# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import division, print_function + +from . import Image, ImageFile, ImagePalette, TiffTags +from ._binary import i8, o8 + +import collections +from fractions import Fraction +from numbers import Number, Rational + +import io +import itertools +import os +import struct +import sys +import warnings + +from .TiffTags import TYPES + + +__version__ = "1.3.5" +DEBUG = False # Needs to be merged with the new logging approach. + +# Set these to true to force use of libtiff for reading or writing. +READ_LIBTIFF = False +WRITE_LIBTIFF = False +IFD_LEGACY_API = True + +II = b"II" # little-endian (Intel style) +MM = b"MM" # big-endian (Motorola style) + +# +# -------------------------------------------------------------------- +# Read TIFF files + +# a few tag names, just to make the code below a bit more readable +IMAGEWIDTH = 256 +IMAGELENGTH = 257 +BITSPERSAMPLE = 258 +COMPRESSION = 259 +PHOTOMETRIC_INTERPRETATION = 262 +FILLORDER = 266 +IMAGEDESCRIPTION = 270 +STRIPOFFSETS = 273 +SAMPLESPERPIXEL = 277 +ROWSPERSTRIP = 278 +STRIPBYTECOUNTS = 279 +X_RESOLUTION = 282 +Y_RESOLUTION = 283 +PLANAR_CONFIGURATION = 284 +RESOLUTION_UNIT = 296 +SOFTWARE = 305 +DATE_TIME = 306 +ARTIST = 315 +PREDICTOR = 317 +COLORMAP = 320 +TILEOFFSETS = 324 +EXTRASAMPLES = 338 +SAMPLEFORMAT = 339 +JPEGTABLES = 347 +COPYRIGHT = 33432 +IPTC_NAA_CHUNK = 33723 # newsphoto properties +PHOTOSHOP_CHUNK = 34377 # photoshop properties +ICCPROFILE = 34675 +EXIFIFD = 34665 +XMP = 700 + +# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java +IMAGEJ_META_DATA_BYTE_COUNTS = 50838 +IMAGEJ_META_DATA = 50839 + +COMPRESSION_INFO = { + # Compression => pil compression name + 1: "raw", + 2: "tiff_ccitt", + 3: "group3", + 4: "group4", + 5: "tiff_lzw", + 6: "tiff_jpeg", # obsolete + 7: "jpeg", + 8: "tiff_adobe_deflate", + 32771: "tiff_raw_16", # 16-bit padding + 32773: "packbits", + 32809: "tiff_thunderscan", + 32946: "tiff_deflate", + 34676: "tiff_sgilog", + 34677: "tiff_sgilog24", +} + +COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} + +OPEN_INFO = { + # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, + # ExtraSamples) => mode, rawmode + (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (II, 1, (1,), 1, (1,), ()): ("1", "1"), + (MM, 1, (1,), 1, (1,), ()): ("1", "1"), + (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), + + (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + + (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + + (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (II, 1, (1,), 1, (8,), ()): ("L", "L"), + (MM, 1, (1,), 1, (8,), ()): ("L", "L"), + (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), + + (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), + + (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), + (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), + (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), + (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), + + (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), + (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), + (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), + (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), + + (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + + (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + + (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), + (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), + + (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (II, 3, (1,), 1, (8,), ()): ("P", "P"), + (MM, 3, (1,), 1, (8,), ()): ("P", "P"), + (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), + + (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + + (II, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), + (MM, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), + + (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), + (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), +} + +PREFIXES = [ + b"MM\x00\x2A", # Valid TIFF header with big-endian byte order + b"II\x2A\x00", # Valid TIFF header with little-endian byte order + b"MM\x2A\x00", # Invalid TIFF header, assume big-endian + b"II\x00\x2A", # Invalid TIFF header, assume little-endian +] + + +def _accept(prefix): + return prefix[:4] in PREFIXES + + +def _limit_rational(val, max_val): + inv = abs(val) > 1 + n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) + return n_d[::-1] if inv else n_d + + +## +# Wrapper for TIFF IFDs. + +_load_dispatch = {} +_write_dispatch = {} + + +class IFDRational(Rational): + """ Implements a rational class where 0/0 is a legal value to match + the in the wild use of exif rationals. + + e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used + """ + + """ If the denominator is 0, store this as a float('nan'), otherwise store + as a fractions.Fraction(). Delegate as appropriate + + """ + + __slots__ = ('_numerator', '_denominator', '_val') + + def __init__(self, value, denominator=1): + """ + :param value: either an integer numerator, a + float/rational/other number, or an IFDRational + :param denominator: Optional integer denominator + """ + self._denominator = denominator + self._numerator = value + self._val = float(1) + + if isinstance(value, Fraction): + self._numerator = value.numerator + self._denominator = value.denominator + self._val = value + + if isinstance(value, IFDRational): + self._denominator = value.denominator + self._numerator = value.numerator + self._val = value._val + return + + if denominator == 0: + self._val = float('nan') + return + + elif denominator == 1: + self._val = Fraction(value) + else: + self._val = Fraction(value, denominator) + + @property + def numerator(a): + return a._numerator + + @property + def denominator(a): + return a._denominator + + def limit_rational(self, max_denominator): + """ + + :param max_denominator: Integer, the maximum denominator value + :returns: Tuple of (numerator, denominator) + """ + + if self.denominator == 0: + return (self.numerator, self.denominator) + + f = self._val.limit_denominator(max_denominator) + return (f.numerator, f.denominator) + + def __repr__(self): + return str(float(self._val)) + + def __hash__(self): + return self._val.__hash__() + + def __eq__(self, other): + return self._val == other + + def _delegate(op): + def delegate(self, *args): + return getattr(self._val, op)(*args) + return delegate + + """ a = ['add','radd', 'sub', 'rsub','div', 'rdiv', 'mul', 'rmul', + 'truediv', 'rtruediv', 'floordiv', + 'rfloordiv','mod','rmod', 'pow','rpow', 'pos', 'neg', + 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'nonzero', + 'ceil', 'floor', 'round'] + print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) + """ + + __add__ = _delegate('__add__') + __radd__ = _delegate('__radd__') + __sub__ = _delegate('__sub__') + __rsub__ = _delegate('__rsub__') + __div__ = _delegate('__div__') + __rdiv__ = _delegate('__rdiv__') + __mul__ = _delegate('__mul__') + __rmul__ = _delegate('__rmul__') + __truediv__ = _delegate('__truediv__') + __rtruediv__ = _delegate('__rtruediv__') + __floordiv__ = _delegate('__floordiv__') + __rfloordiv__ = _delegate('__rfloordiv__') + __mod__ = _delegate('__mod__') + __rmod__ = _delegate('__rmod__') + __pow__ = _delegate('__pow__') + __rpow__ = _delegate('__rpow__') + __pos__ = _delegate('__pos__') + __neg__ = _delegate('__neg__') + __abs__ = _delegate('__abs__') + __trunc__ = _delegate('__trunc__') + __lt__ = _delegate('__lt__') + __gt__ = _delegate('__gt__') + __le__ = _delegate('__le__') + __ge__ = _delegate('__ge__') + __nonzero__ = _delegate('__nonzero__') + __ceil__ = _delegate('__ceil__') + __floor__ = _delegate('__floor__') + __round__ = _delegate('__round__') + + +class ImageFileDirectory_v2(collections.MutableMapping): + """This class represents a TIFF tag directory. To speed things up, we + don't decode tags unless they're asked for. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v2() + ifd[key] = 'Some Data' + ifd.tagtype[key] = 2 + print(ifd[key]) + 'Some Data' + + Individual values are returned as the strings or numbers, sequences are + returned as tuples of the values. + + The tiff metadata type of each item is stored in a dictionary of + tag types in + `~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types + are read from a tiff file, guessed from the type added, or added + manually. + + Data Structures: + + * self.tagtype = {} + + * Key: numerical tiff tag number + * Value: integer corresponding to the data type from `~PIL.TiffTags.TYPES` + + .. versionadded:: 3.0.0 + """ + """ + Documentation: + + 'internal' data structures: + * self._tags_v2 = {} Key: numerical tiff tag number + Value: decoded data, as tuple for multiple values + * self._tagdata = {} Key: numerical tiff tag number + Value: undecoded byte string from file + * self._tags_v1 = {} Key: numerical tiff tag number + Value: decoded data in the v1 format + + Tags will be found in the private attributes self._tagdata, and in + self._tags_v2 once decoded. + + Self.legacy_api is a value for internal use, and shouldn't be + changed from outside code. In cooperation with the + ImageFileDirectory_v1 class, if legacy_api is true, then decoded + tags will be populated into both _tags_v1 and _tags_v2. _Tags_v2 + will be used if this IFD is used in the TIFF save routine. Tags + should be read from tags_v1 if legacy_api == true. + + """ + + def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None): + """Initialize an ImageFileDirectory. + + To construct an ImageFileDirectory from a real file, pass the 8-byte + magic header to the constructor. To only set the endianness, pass it + as the 'prefix' keyword argument. + + :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets + endianness. + :param prefix: Override the endianness of the file. + """ + if ifh[:4] not in PREFIXES: + raise SyntaxError("not a TIFF file (header %r not valid)" % ifh) + self._prefix = prefix if prefix is not None else ifh[:2] + if self._prefix == MM: + self._endian = ">" + elif self._prefix == II: + self._endian = "<" + else: + raise SyntaxError("not a TIFF IFD") + self.reset() + self.next, = self._unpack("L", ifh[4:]) + self._legacy_api = False + + prefix = property(lambda self: self._prefix) + offset = property(lambda self: self._offset) + legacy_api = property(lambda self: self._legacy_api) + + @legacy_api.setter + def legacy_api(self, value): + raise Exception("Not allowing setting of legacy api") + + def reset(self): + self._tags_v1 = {} # will remain empty if legacy_api is false + self._tags_v2 = {} # main tag storage + self._tagdata = {} + self.tagtype = {} # added 2008-06-05 by Florian Hoech + self._next = None + self._offset = None + + def __str__(self): + return str(dict(self)) + + def named(self): + """ + :returns: dict of name|key: value + + Returns the complete tag dictionary, with named tags where possible. + """ + return dict((TiffTags.lookup(code).name, value) + for code, value in self.items()) + + def __len__(self): + return len(set(self._tagdata) | set(self._tags_v2)) + + def __getitem__(self, tag): + if tag not in self._tags_v2: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + self[tag] = handler(self, data, self.legacy_api) # check type + val = self._tags_v2[tag] + if self.legacy_api and not isinstance(val, (tuple, bytes)): + val = val, + return val + + def __contains__(self, tag): + return tag in self._tags_v2 or tag in self._tagdata + + if bytes is str: + def has_key(self, tag): + return tag in self + + def __setitem__(self, tag, value): + self._setitem(tag, value, self.legacy_api) + + def _setitem(self, tag, value, legacy_api): + basetypes = (Number, bytes, str) + if bytes is str: + basetypes += unicode, + + info = TiffTags.lookup(tag) + values = [value] if isinstance(value, basetypes) else value + + if tag not in self.tagtype: + if info.type: + self.tagtype[tag] = info.type + else: + self.tagtype[tag] = 7 + if all(isinstance(v, IFDRational) for v in values): + self.tagtype[tag] = 5 + elif all(isinstance(v, int) for v in values): + if all(v < 2 ** 16 for v in values): + self.tagtype[tag] = 3 + else: + self.tagtype[tag] = 4 + elif all(isinstance(v, float) for v in values): + self.tagtype[tag] = 12 + else: + if bytes is str: + # Never treat data as binary by default on Python 2. + self.tagtype[tag] = 2 + else: + if all(isinstance(v, str) for v in values): + self.tagtype[tag] = 2 + + if self.tagtype[tag] == 7 and bytes is not str: + values = [value.encode("ascii", 'replace') if isinstance( + value, str) else value] + + values = tuple(info.cvt_enum(value) for value in values) + + dest = self._tags_v1 if legacy_api else self._tags_v2 + + # Three branches: + # Spec'd length == 1, Actual length 1, store as element + # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. + # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. + # Don't mess with the legacy api, since it's frozen. + if ((info.length == 1) or + (info.length is None and len(values) == 1 and not legacy_api)): + # Don't mess with the legacy api, since it's frozen. + if legacy_api and self.tagtype[tag] in [5, 10]: # rationals + values = values, + try: + dest[tag], = values + except ValueError: + # We've got a builtin tag with 1 expected entry + warnings.warn( + "Metadata Warning, tag %s had too many entries: %s, expected 1" % ( + tag, len(values))) + dest[tag] = values[0] + + else: + # Spec'd length > 1 or undefined + # Unspec'd, and length > 1 + dest[tag] = values + + def __delitem__(self, tag): + self._tags_v2.pop(tag, None) + self._tags_v1.pop(tag, None) + self._tagdata.pop(tag, None) + + def __iter__(self): + return iter(set(self._tagdata) | set(self._tags_v2)) + + def _unpack(self, fmt, data): + return struct.unpack(self._endian + fmt, data) + + def _pack(self, fmt, *values): + return struct.pack(self._endian + fmt, *values) + + def _register_loader(idx, size): + def decorator(func): + from .TiffTags import TYPES + if func.__name__.startswith("load_"): + TYPES[idx] = func.__name__[5:].replace("_", " ") + _load_dispatch[idx] = size, func + return func + return decorator + + def _register_writer(idx): + def decorator(func): + _write_dispatch[idx] = func + return func + return decorator + + def _register_basic(idx_fmt_name): + from .TiffTags import TYPES + idx, fmt, name = idx_fmt_name + TYPES[idx] = name + size = struct.calcsize("=" + fmt) + _load_dispatch[idx] = size, lambda self, data, legacy_api=True: ( + self._unpack("{}{}".format(len(data) // size, fmt), data)) + _write_dispatch[idx] = lambda self, *values: ( + b"".join(self._pack(fmt, value) for value in values)) + + list(map(_register_basic, + [(3, "H", "short"), + (4, "L", "long"), + (6, "b", "signed byte"), + (8, "h", "signed short"), + (9, "l", "signed long"), + (11, "f", "float"), + (12, "d", "double")])) + + @_register_loader(1, 1) # Basic type, except for the legacy API. + def load_byte(self, data, legacy_api=True): + return data + + @_register_writer(1) # Basic type, except for the legacy API. + def write_byte(self, data): + return data + + @_register_loader(2, 1) + def load_string(self, data, legacy_api=True): + if data.endswith(b"\0"): + data = data[:-1] + return data.decode("latin-1", "replace") + + @_register_writer(2) + def write_string(self, value): + # remerge of https://github.com/python-pillow/Pillow/pull/1416 + if sys.version_info[0] == 2: + value = value.decode('ascii', 'replace') + return b"" + value.encode('ascii', 'replace') + b"\0" + + @_register_loader(5, 8) + def load_rational(self, data, legacy_api=True): + vals = self._unpack("{}L".format(len(data) // 4), data) + + def combine(a, b): return (a, b) if legacy_api else IFDRational(a, b) + return tuple(combine(num, denom) + for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(5) + def write_rational(self, *values): + return b"".join(self._pack("2L", *_limit_rational(frac, 2 ** 31)) + for frac in values) + + @_register_loader(7, 1) + def load_undefined(self, data, legacy_api=True): + return data + + @_register_writer(7) + def write_undefined(self, value): + return value + + @_register_loader(10, 8) + def load_signed_rational(self, data, legacy_api=True): + vals = self._unpack("{}l".format(len(data) // 4), data) + + def combine(a, b): return (a, b) if legacy_api else IFDRational(a, b) + return tuple(combine(num, denom) + for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(10) + def write_signed_rational(self, *values): + return b"".join(self._pack("2L", *_limit_rational(frac, 2 ** 30)) + for frac in values) + + def _ensure_read(self, fp, size): + ret = fp.read(size) + if len(ret) != size: + raise IOError("Corrupt EXIF data. " + + "Expecting to read %d bytes but only got %d. " % + (size, len(ret))) + return ret + + def load(self, fp): + + self.reset() + self._offset = fp.tell() + + try: + for i in range(self._unpack("H", self._ensure_read(fp, 2))[0]): + tag, typ, count, data = self._unpack("HHL4s", + self._ensure_read(fp, 12)) + if DEBUG: + tagname = TiffTags.lookup(tag).name + typname = TYPES.get(typ, "unknown") + print("tag: %s (%d) - type: %s (%d)" % + (tagname, tag, typname, typ), end=" ") + + try: + unit_size, handler = self._load_dispatch[typ] + except KeyError: + if DEBUG: + print("- unsupported type", typ) + continue # ignore unsupported type + size = count * unit_size + if size > 4: + here = fp.tell() + offset, = self._unpack("L", data) + if DEBUG: + print("Tag Location: %s - Data Location: %s" % + (here, offset), end=" ") + fp.seek(offset) + data = ImageFile._safe_read(fp, size) + fp.seek(here) + else: + data = data[:size] + + if len(data) != size: + warnings.warn("Possibly corrupt EXIF data. " + "Expecting to read %d bytes but only got %d." + " Skipping tag %s" % (size, len(data), tag)) + continue + + if not data: + continue + + self._tagdata[tag] = data + self.tagtype[tag] = typ + + if DEBUG: + if size > 32: + print("- value: " % size) + else: + print("- value:", self[tag]) + + self.next, = self._unpack("L", self._ensure_read(fp, 4)) + except IOError as msg: + warnings.warn(str(msg)) + return + + def save(self, fp): + + if fp.tell() == 0: # skip TIFF header on subsequent pages + # tiff header -- PIL always starts the first IFD at offset 8 + fp.write(self._prefix + self._pack("HL", 42, 8)) + + # FIXME What about tagdata? + fp.write(self._pack("H", len(self._tags_v2))) + + entries = [] + offset = fp.tell() + len(self._tags_v2) * 12 + 4 + stripoffsets = None + + # pass 1: convert tags to binary format + # always write tags in ascending order + for tag, value in sorted(self._tags_v2.items()): + if tag == STRIPOFFSETS: + stripoffsets = len(entries) + typ = self.tagtype.get(tag) + if DEBUG: + print("Tag %s, Type: %s, Value: %s" % (tag, typ, value)) + values = value if isinstance(value, tuple) else (value,) + data = self._write_dispatch[typ](self, *values) + if DEBUG: + tagname = TiffTags.lookup(tag).name + typname = TYPES.get(typ, "unknown") + print("save: %s (%d) - type: %s (%d)" % + (tagname, tag, typname, typ), end=" ") + if len(data) >= 16: + print("- value: " % len(data)) + else: + print("- value:", values) + + # count is sum of lengths for string and arbitrary data + count = len(data) if typ in [2, 7] else len(values) + # figure out if data fits into the entry + if len(data) <= 4: + entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) + else: + entries.append((tag, typ, count, self._pack("L", offset), + data)) + offset += (len(data) + 1) // 2 * 2 # pad to word + + # update strip offset data to point beyond auxiliary data + if stripoffsets is not None: + tag, typ, count, value, data = entries[stripoffsets] + if data: + raise NotImplementedError( + "multistrip support not yet implemented") + value = self._pack("L", self._unpack("L", value)[0] + offset) + entries[stripoffsets] = tag, typ, count, value, data + + # pass 2: write entries to file + for tag, typ, count, value, data in entries: + if DEBUG > 1: + print(tag, typ, count, repr(value), repr(data)) + fp.write(self._pack("HHL4s", tag, typ, count, value)) + + # -- overwrite here for multi-page -- + fp.write(b"\0\0\0\0") # end of entries + + # pass 3: write auxiliary data to file + for tag, typ, count, value, data in entries: + fp.write(data) + if len(data) & 1: + fp.write(b"\0") + + return offset + + +ImageFileDirectory_v2._load_dispatch = _load_dispatch +ImageFileDirectory_v2._write_dispatch = _write_dispatch +for idx, name in TYPES.items(): + name = name.replace(" ", "_") + setattr(ImageFileDirectory_v2, "load_" + name, _load_dispatch[idx][1]) + setattr(ImageFileDirectory_v2, "write_" + name, _write_dispatch[idx]) +del _load_dispatch, _write_dispatch, idx, name + + +# Legacy ImageFileDirectory support. +class ImageFileDirectory_v1(ImageFileDirectory_v2): + """This class represents the **legacy** interface to a TIFF tag directory. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v1() + ifd[key] = 'Some Data' + ifd.tagtype[key] = 2 + print(ifd[key]) + ('Some Data',) + + Also contains a dictionary of tag types as read from the tiff image file, + `~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. + + Values are returned as a tuple. + + .. deprecated:: 3.0.0 + """ + def __init__(self, *args, **kwargs): + ImageFileDirectory_v2.__init__(self, *args, **kwargs) + self._legacy_api = True + + tags = property(lambda self: self._tags_v1) + tagdata = property(lambda self: self._tagdata) + + @classmethod + def from_v2(cls, original): + """ Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + + """ + + ifd = cls(prefix=original.prefix) + ifd._tagdata = original._tagdata + ifd.tagtype = original.tagtype + ifd.next = original.next # an indicator for multipage tiffs + return ifd + + def to_v2(self): + """ Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + + """ + + ifd = ImageFileDirectory_v2(prefix=self.prefix) + ifd._tagdata = dict(self._tagdata) + ifd.tagtype = dict(self.tagtype) + ifd._tags_v2 = dict(self._tags_v2) + return ifd + + def __contains__(self, tag): + return tag in self._tags_v1 or tag in self._tagdata + + def __len__(self): + return len(set(self._tagdata) | set(self._tags_v1)) + + def __iter__(self): + return iter(set(self._tagdata) | set(self._tags_v1)) + + def __setitem__(self, tag, value): + for legacy_api in (False, True): + self._setitem(tag, value, legacy_api) + + def __getitem__(self, tag): + if tag not in self._tags_v1: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + for legacy in (False, True): + self._setitem(tag, handler(self, data, legacy), legacy) + val = self._tags_v1[tag] + if not isinstance(val, (tuple, bytes)): + val = val, + return val + + +# undone -- switch this pointer when IFD_LEGACY_API == False +ImageFileDirectory = ImageFileDirectory_v1 + + +## +# Image plugin for TIFF files. + +class TiffImageFile(ImageFile.ImageFile): + + format = "TIFF" + format_description = "Adobe TIFF" + _close_exclusive_fp_after_loading = False + + def _open(self): + "Open the first image in a TIFF file" + + # Header + ifh = self.fp.read(8) + + # image file directory (tag dictionary) + self.tag_v2 = ImageFileDirectory_v2(ifh) + + # legacy tag/ifd entries will be filled in later + self.tag = self.ifd = None + + # setup frame pointers + self.__first = self.__next = self.tag_v2.next + self.__frame = -1 + self.__fp = self.fp + self._frame_pos = [] + self._n_frames = None + self._is_animated = None + + if DEBUG: + print("*** TiffImageFile._open ***") + print("- __first:", self.__first) + print("- ifh: ", ifh) + + # and load the first frame + self._seek(0) + + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + try: + while True: + self._seek(self.tell() + 1) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + @property + def is_animated(self): + if self._is_animated is None: + if self._n_frames is not None: + self._is_animated = self._n_frames != 1 + else: + current = self.tell() + + try: + self.seek(1) + self._is_animated = True + except EOFError: + self._is_animated = False + + self.seek(current) + return self._is_animated + + def seek(self, frame): + "Select a given frame as current image" + if not self._seek_check(frame): + return + self._seek(frame) + # Create a new core image object on second and + # subsequent frames in the image. Image may be + # different size/mode. + Image._decompression_bomb_check(self.size) + self.im = Image.core.new(self.mode, self.size) + + def _seek(self, frame): + self.fp = self.__fp + while len(self._frame_pos) <= frame: + if not self.__next: + raise EOFError("no more images in TIFF file") + if DEBUG: + print("Seeking to frame %s, on frame %s, " + "__next %s, location: %s" % + (frame, self.__frame, self.__next, self.fp.tell())) + # reset python3 buffered io handle in case fp + # was passed to libtiff, invalidating the buffer + self.fp.tell() + self.fp.seek(self.__next) + self._frame_pos.append(self.__next) + if DEBUG: + print("Loading tags, location: %s" % self.fp.tell()) + self.tag_v2.load(self.fp) + self.__next = self.tag_v2.next + self.__frame += 1 + self.fp.seek(self._frame_pos[frame]) + self.tag_v2.load(self.fp) + self.__next = self.tag_v2.next + # fill the legacy tag/ifd entries + self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) + self.__frame = frame + self._setup() + + def tell(self): + "Return the current frame number" + return self.__frame + + def _decoder(self, rawmode, layer, tile=None): + "Setup decoder contexts" + + args = None + if rawmode == "RGB" and self._planar_configuration == 2: + rawmode = rawmode[layer] + compression = self._compression + if compression == "raw": + args = (rawmode, 0, 1) + elif compression == "jpeg": + args = rawmode, "" + if JPEGTABLES in self.tag_v2: + # Hack to handle abbreviated JPEG headers + # Definition of JPEGTABLES is that the count + # is the number of bytes in the tables datastream + # so, it should always be 1 in our tag info + self.tile_prefix = self.tag_v2[JPEGTABLES] + elif compression == "packbits": + args = rawmode + elif compression == "tiff_lzw": + args = rawmode + if PREDICTOR in self.tag_v2: + # Section 14: Differencing Predictor + self.decoderconfig = (self.tag_v2[PREDICTOR],) + + return args + + def load(self): + if self.use_load_libtiff: + return self._load_libtiff() + return super(TiffImageFile, self).load() + + def load_end(self): + # allow closing if we're on the first frame, there's no next + # This is the ImageFile.load path only, libtiff specific below. + if self.__frame == 0 and not self.__next: + self._close_exclusive_fp_after_loading = True + + def _load_libtiff(self): + """ Overload method triggered when we detect a compressed tiff + Calls out to libtiff """ + + pixel = Image.Image.load(self) + + if self.tile is None: + raise IOError("cannot load this image") + if not self.tile: + return pixel + + self.load_prepare() + + if not len(self.tile) == 1: + raise IOError("Not exactly one tile") + + # (self._compression, (extents tuple), + # 0, (rawmode, self._compression, fp)) + extents = self.tile[0][1] + args = list(self.tile[0][3]) + [self.tag_v2.offset] + + # To be nice on memory footprint, if there's a + # file descriptor, use that instead of reading + # into a string in python. + # libtiff closes the file descriptor, so pass in a dup. + try: + fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno()) + # flush the file descriptor, prevents error on pypy 2.4+ + # should also eliminate the need for fp.tell for py3 + # in _seek + if hasattr(self.fp, "flush"): + self.fp.flush() + except IOError: + # io.BytesIO have a fileno, but returns an IOError if + # it doesn't use a file descriptor. + fp = False + + if fp: + args[2] = fp + + decoder = Image._getdecoder(self.mode, 'libtiff', tuple(args), + self.decoderconfig) + try: + decoder.setimage(self.im, extents) + except ValueError: + raise IOError("Couldn't set the image") + + if hasattr(self.fp, "getvalue"): + # We've got a stringio like thing passed in. Yay for all in memory. + # The decoder needs the entire file in one shot, so there's not + # a lot we can do here other than give it the entire file. + # unless we could do something like get the address of the + # underlying string for stringio. + # + # Rearranging for supporting byteio items, since they have a fileno + # that returns an IOError if there's no underlying fp. Easier to + # deal with here by reordering. + if DEBUG: + print("have getvalue. just sending in a string from getvalue") + n, err = decoder.decode(self.fp.getvalue()) + elif hasattr(self.fp, "fileno"): + # we've got a actual file on disk, pass in the fp. + if DEBUG: + print("have fileno, calling fileno version of the decoder.") + self.fp.seek(0) + # 4 bytes, otherwise the trace might error out + n, err = decoder.decode(b"fpfp") + else: + # we have something else. + if DEBUG: + print("don't have fileno or getvalue. just reading") + # UNDONE -- so much for that buffer size thing. + n, err = decoder.decode(self.fp.read()) + + self.tile = [] + self.readonly = 0 + # libtiff closed the fp in a, we need to close self.fp, if possible + if self._exclusive_fp: + if self.__frame == 0 and not self.__next: + self.fp.close() + self.fp = None # might be shared + + if err < 0: + raise IOError(err) + + return Image.Image.load(self) + + def _setup(self): + "Setup this image object based on current tags" + + if 0xBC01 in self.tag_v2: + raise IOError("Windows Media Photo files not yet supported") + + # extract relevant tags + self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] + self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) + + # photometric is a required tag, but not everyone is reading + # the specification + photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) + + fillorder = self.tag_v2.get(FILLORDER, 1) + + if DEBUG: + print("*** Summary ***") + print("- compression:", self._compression) + print("- photometric_interpretation:", photo) + print("- planar_configuration:", self._planar_configuration) + print("- fill_order:", fillorder) + + # size + xsize = self.tag_v2.get(IMAGEWIDTH) + ysize = self.tag_v2.get(IMAGELENGTH) + self.size = xsize, ysize + + if DEBUG: + print("- size:", self.size) + + sampleFormat = self.tag_v2.get(SAMPLEFORMAT, (1,)) + if (len(sampleFormat) > 1 + and max(sampleFormat) == min(sampleFormat) == 1): + # SAMPLEFORMAT is properly per band, so an RGB image will + # be (1,1,1). But, we don't support per band pixel types, + # and anything more than one band is a uint8. So, just + # take the first element. Revisit this if adding support + # for more exotic images. + sampleFormat = (1,) + + # mode: check photometric interpretation and bits per pixel + key = ( + self.tag_v2.prefix, photo, sampleFormat, fillorder, + self.tag_v2.get(BITSPERSAMPLE, (1,)), + self.tag_v2.get(EXTRASAMPLES, ()) + ) + if DEBUG: + print("format key:", key) + try: + self.mode, rawmode = OPEN_INFO[key] + except KeyError: + if DEBUG: + print("- unsupported format") + raise SyntaxError("unknown pixel mode") + + if DEBUG: + print("- raw mode:", rawmode) + print("- pil mode:", self.mode) + + self.info["compression"] = self._compression + + xres = self.tag_v2.get(X_RESOLUTION, 1) + yres = self.tag_v2.get(Y_RESOLUTION, 1) + + if xres and yres: + resunit = self.tag_v2.get(RESOLUTION_UNIT) + if resunit == 2: # dots per inch + self.info["dpi"] = xres, yres + elif resunit == 3: # dots per centimeter. convert to dpi + self.info["dpi"] = xres * 2.54, yres * 2.54 + elif resunit is None: # used to default to 1, but now 2) + self.info["dpi"] = xres, yres + # For backward compatibility, + # we also preserve the old behavior + self.info["resolution"] = xres, yres + else: # No absolute unit of measurement + self.info["resolution"] = xres, yres + + # build tile descriptors + x = y = l = 0 + self.tile = [] + self.use_load_libtiff = False + if STRIPOFFSETS in self.tag_v2: + # striped image + offsets = self.tag_v2[STRIPOFFSETS] + h = self.tag_v2.get(ROWSPERSTRIP, ysize) + w = self.size[0] + if READ_LIBTIFF or self._compression in ["tiff_ccitt", "group3", + "group4", "tiff_jpeg", + "tiff_adobe_deflate", + "tiff_thunderscan", + "tiff_deflate", + "tiff_sgilog", + "tiff_sgilog24", + "tiff_raw_16"]: + # if DEBUG: + # print("Activating g4 compression for whole file") + + # Decoder expects entire file as one tile. + # There's a buffer size limit in load (64k) + # so large g4 images will fail if we use that + # function. + # + # Setup the one tile for the whole image, then + # use the _load_libtiff function. + + self.use_load_libtiff = True + + # libtiff handles the fillmode for us, so 1;IR should + # actually be 1;I. Including the R double reverses the + # bits, so stripes of the image are reversed. See + # https://github.com/python-pillow/Pillow/issues/279 + if fillorder == 2: + key = ( + self.tag_v2.prefix, photo, sampleFormat, 1, + self.tag_v2.get(BITSPERSAMPLE, (1,)), + self.tag_v2.get(EXTRASAMPLES, ()) + ) + if DEBUG: + print("format key:", key) + # this should always work, since all the + # fillorder==2 modes have a corresponding + # fillorder=1 mode + self.mode, rawmode = OPEN_INFO[key] + # libtiff always returns the bytes in native order. + # we're expecting image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if self.mode in ('I;16B', 'I;16') and 'I;16' in rawmode: + rawmode = 'I;16N' + + # Offset in the tile tuple is 0, we go from 0,0 to + # w,h, and we only do this once -- eds + a = (rawmode, self._compression, False) + self.tile.append( + (self._compression, + (0, 0, w, ysize), + 0, a)) + a = None + + else: + for i, offset in enumerate(offsets): + a = self._decoder(rawmode, l, i) + self.tile.append( + (self._compression, + (0, min(y, ysize), w, min(y+h, ysize)), + offset, a)) + if DEBUG: + print("tiles: ", self.tile) + y = y + h + if y >= self.size[1]: + x = y = 0 + l += 1 + a = None + elif TILEOFFSETS in self.tag_v2: + # tiled image + w = self.tag_v2.get(322) + h = self.tag_v2.get(323) + a = None + for o in self.tag_v2[TILEOFFSETS]: + if not a: + a = self._decoder(rawmode, l) + # FIXME: this doesn't work if the image size + # is not a multiple of the tile size... + self.tile.append( + (self._compression, + (x, y, x+w, y+h), + o, a)) + x = x + w + if x >= self.size[0]: + x, y = 0, y + h + if y >= self.size[1]: + x = y = 0 + l += 1 + a = None + else: + if DEBUG: + print("- unsupported data organization") + raise SyntaxError("unknown data organization") + + # Fix up info. + if ICCPROFILE in self.tag_v2: + self.info['icc_profile'] = self.tag_v2[ICCPROFILE] + + # fixup palette descriptor + + if self.mode == "P": + palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] + self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) + + +# +# -------------------------------------------------------------------- +# Write TIFF files + +# little endian is default except for image modes with +# explicit big endian byte-order + +SAVE_INFO = { + # mode => rawmode, byteorder, photometrics, + # sampleformat, bitspersample, extra + "1": ("1", II, 1, 1, (1,), None), + "L": ("L", II, 1, 1, (8,), None), + "LA": ("LA", II, 1, 1, (8, 8), 2), + "P": ("P", II, 3, 1, (8,), None), + "PA": ("PA", II, 3, 1, (8, 8), 2), + "I": ("I;32S", II, 1, 2, (32,), None), + "I;16": ("I;16", II, 1, 1, (16,), None), + "I;16S": ("I;16S", II, 1, 2, (16,), None), + "F": ("F;32F", II, 1, 3, (32,), None), + "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), + "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), + "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), + "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), + "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), + "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), + + "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), + "I;16B": ("I;16B", MM, 1, 1, (16,), None), + "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), + "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), +} + + +def _save(im, fp, filename): + + try: + rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] + except KeyError: + raise IOError("cannot write mode %s as TIFF" % im.mode) + + ifd = ImageFileDirectory_v2(prefix=prefix) + + compression = im.encoderinfo.get('compression', + im.info.get('compression', 'raw')) + + libtiff = WRITE_LIBTIFF or compression != 'raw' + + # required for color libtiff images + ifd[PLANAR_CONFIGURATION] = getattr(im, '_planar_configuration', 1) + + ifd[IMAGEWIDTH] = im.size[0] + ifd[IMAGELENGTH] = im.size[1] + + # write any arbitrary tags passed in as an ImageFileDirectory + info = im.encoderinfo.get("tiffinfo", {}) + if DEBUG: + print("Tiffinfo Keys: %s" % list(info)) + if isinstance(info, ImageFileDirectory_v1): + info = info.to_v2() + for key in info: + ifd[key] = info.get(key) + try: + ifd.tagtype[key] = info.tagtype[key] + except: + pass # might not be an IFD, Might not have populated type + + # additions written by Greg Couch, gregc@cgl.ucsf.edu + # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com + if hasattr(im, 'tag_v2'): + # preserve tags from original TIFF image file + for key in (RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION, + IPTC_NAA_CHUNK, PHOTOSHOP_CHUNK, XMP): + if key in im.tag_v2: + ifd[key] = im.tag_v2[key] + ifd.tagtype[key] = im.tag_v2.tagtype[key] + + # preserve ICC profile (should also work when saving other formats + # which support profiles as TIFF) -- 2008-06-06 Florian Hoech + if "icc_profile" in im.info: + ifd[ICCPROFILE] = im.info["icc_profile"] + + for key, name in [(IMAGEDESCRIPTION, "description"), + (X_RESOLUTION, "resolution"), + (Y_RESOLUTION, "resolution"), + (X_RESOLUTION, "x_resolution"), + (Y_RESOLUTION, "y_resolution"), + (RESOLUTION_UNIT, "resolution_unit"), + (SOFTWARE, "software"), + (DATE_TIME, "date_time"), + (ARTIST, "artist"), + (COPYRIGHT, "copyright")]: + if name in im.encoderinfo: + ifd[key] = im.encoderinfo[name] + + dpi = im.encoderinfo.get("dpi") + if dpi: + ifd[RESOLUTION_UNIT] = 2 + ifd[X_RESOLUTION] = dpi[0] + ifd[Y_RESOLUTION] = dpi[1] + + if bits != (1,): + ifd[BITSPERSAMPLE] = bits + if len(bits) != 1: + ifd[SAMPLESPERPIXEL] = len(bits) + if extra is not None: + ifd[EXTRASAMPLES] = extra + if format != 1: + ifd[SAMPLEFORMAT] = format + + ifd[PHOTOMETRIC_INTERPRETATION] = photo + + if im.mode == "P": + lut = im.im.getpalette("RGB", "RGB;L") + ifd[COLORMAP] = tuple(i8(v) * 256 for v in lut) + # data orientation + stride = len(bits) * ((im.size[0]*bits[0]+7)//8) + ifd[ROWSPERSTRIP] = im.size[1] + ifd[STRIPBYTECOUNTS] = stride * im.size[1] + ifd[STRIPOFFSETS] = 0 # this is adjusted by IFD writer + # no compression by default: + ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) + + if libtiff: + if DEBUG: + print("Saving using libtiff encoder") + print("Items: %s" % sorted(ifd.items())) + _fp = 0 + if hasattr(fp, "fileno"): + try: + fp.seek(0) + _fp = os.dup(fp.fileno()) + except io.UnsupportedOperation: + pass + + # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library + # based on the data in the strip. + blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS] + atts = {} + # bits per sample is a single short in the tiff directory, not a list. + atts[BITSPERSAMPLE] = bits[0] + # Merge the ones that we have with (optional) more bits from + # the original file, e.g x,y resolution so that we can + # save(load('')) == original file. + legacy_ifd = {} + if hasattr(im, 'tag'): + legacy_ifd = im.tag.to_v2() + for tag, value in itertools.chain(ifd.items(), + getattr(im, 'tag_v2', {}).items(), + legacy_ifd.items()): + # Libtiff can only process certain core items without adding + # them to the custom dictionary. It will segfault if it attempts + # to add a custom tag without the dictionary entry + # + # UNDONE -- add code for the custom dictionary + if tag not in TiffTags.LIBTIFF_CORE: + continue + if tag not in atts and tag not in blocklist: + if isinstance(value, unicode if bytes is str else str): + atts[tag] = value.encode('ascii', 'replace') + b"\0" + elif isinstance(value, IFDRational): + atts[tag] = float(value) + else: + atts[tag] = value + + if DEBUG: + print("Converted items: %s" % sorted(atts.items())) + + # libtiff always expects the bytes in native order. + # we're storing image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if im.mode in ('I;16B', 'I;16'): + rawmode = 'I;16N' + + a = (rawmode, compression, _fp, filename, atts) + # print(im.mode, compression, a, im.encoderconfig) + e = Image._getencoder(im.mode, 'libtiff', a, im.encoderconfig) + e.setimage(im.im, (0, 0)+im.size) + while True: + # undone, change to self.decodermaxblock: + l, s, d = e.encode(16*1024) + if not _fp: + fp.write(d) + if s: + break + if s < 0: + raise IOError("encoder error %d when writing image file" % s) + + else: + offset = ifd.save(fp) + + ImageFile._save(im, fp, [ + ("raw", (0, 0)+im.size, offset, (rawmode, stride, 1)) + ]) + + # -- helper for multi-page save -- + if "_debug_multipage" in im.encoderinfo: + # just to access o32 and o16 (using correct byte order) + im._debug_multipage = ifd + + +class AppendingTiffWriter: + fieldSizes = [ + 0, # None + 1, # byte + 1, # ascii + 2, # short + 4, # long + 8, # rational + 1, # sbyte + 1, # undefined + 2, # sshort + 4, # slong + 8, # srational + 4, # float + 8, # double + ] + + # StripOffsets = 273 + # FreeOffsets = 288 + # TileOffsets = 324 + # JPEGQTables = 519 + # JPEGDCTables = 520 + # JPEGACTables = 521 + Tags = {273, 288, 324, 519, 520, 521} + + def __init__(self, fn, new=False): + if hasattr(fn, 'read'): + self.f = fn + self.close_fp = False + else: + self.name = fn + self.close_fp = True + try: + self.f = io.open(fn, "w+b" if new else "r+b") + except IOError: + self.f = io.open(fn, "w+b") + self.beginning = self.f.tell() + self.setup() + + def setup(self): + # Reset everything. + self.f.seek(self.beginning, os.SEEK_SET) + + self.whereToWriteNewIFDOffset = None + self.offsetOfNewPage = 0 + + self.IIMM = IIMM = self.f.read(4) + if not IIMM: + # empty file - first page + self.isFirst = True + return + + self.isFirst = False + if IIMM == b"II\x2a\x00": + self.setEndian("<") + elif IIMM == b"MM\x00\x2a": + self.setEndian(">") + else: + raise RuntimeError("Invalid TIFF file header") + + self.skipIFDs() + self.goToEnd() + + def finalize(self): + if self.isFirst: + return + + # fix offsets + self.f.seek(self.offsetOfNewPage) + + IIMM = self.f.read(4) + if not IIMM: + # raise RuntimeError("nothing written into new page") + # Make it easy to finish a frame without committing to a new one. + return + + if IIMM != self.IIMM: + raise RuntimeError("IIMM of new page doesn't match IIMM of " + "first page") + + IFDoffset = self.readLong() + IFDoffset += self.offsetOfNewPage + self.f.seek(self.whereToWriteNewIFDOffset) + self.writeLong(IFDoffset) + self.f.seek(IFDoffset) + self.fixIFD() + + def newFrame(self): + # Call this to finish a frame. + self.finalize() + self.setup() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.close_fp: + self.close() + return False + + def tell(self): + return self.f.tell() - self.offsetOfNewPage + + def seek(self, offset, whence): + if whence == os.SEEK_SET: + offset += self.offsetOfNewPage + + self.f.seek(offset, whence) + return self.tell() + + def goToEnd(self): + self.f.seek(0, os.SEEK_END) + pos = self.f.tell() + + # pad to 16 byte boundary + padBytes = 16 - pos % 16 + if 0 < padBytes < 16: + self.f.write(bytes(bytearray(padBytes))) + self.offsetOfNewPage = self.f.tell() + + def setEndian(self, endian): + self.endian = endian + self.longFmt = self.endian + "L" + self.shortFmt = self.endian + "H" + self.tagFormat = self.endian + "HHL" + + def skipIFDs(self): + while True: + IFDoffset = self.readLong() + if IFDoffset == 0: + self.whereToWriteNewIFDOffset = self.f.tell() - 4 + break + + self.f.seek(IFDoffset) + numTags = self.readShort() + self.f.seek(numTags * 12, os.SEEK_CUR) + + def write(self, data): + return self.f.write(data) + + def readShort(self): + value, = struct.unpack(self.shortFmt, self.f.read(2)) + return value + + def readLong(self): + value, = struct.unpack(self.longFmt, self.f.read(4)) + return value + + def rewriteLastShortToLong(self, value): + self.f.seek(-2, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % + bytesWritten) + + def rewriteLastShort(self, value): + self.f.seek(-2, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.shortFmt, value)) + if bytesWritten is not None and bytesWritten != 2: + raise RuntimeError("wrote only %u bytes but wanted 2" % + bytesWritten) + + def rewriteLastLong(self, value): + self.f.seek(-4, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % + bytesWritten) + + def writeShort(self, value): + bytesWritten = self.f.write(struct.pack(self.shortFmt, value)) + if bytesWritten is not None and bytesWritten != 2: + raise RuntimeError("wrote only %u bytes but wanted 2" % + bytesWritten) + + def writeLong(self, value): + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % + bytesWritten) + + def close(self): + self.finalize() + self.f.close() + + def fixIFD(self): + numTags = self.readShort() + + for i in range(numTags): + tag, fieldType, count = struct.unpack(self.tagFormat, + self.f.read(8)) + + fieldSize = self.fieldSizes[fieldType] + totalSize = fieldSize * count + isLocal = (totalSize <= 4) + if not isLocal: + offset = self.readLong() + offset += self.offsetOfNewPage + self.rewriteLastLong(offset) + + if tag in self.Tags: + curPos = self.f.tell() + + if isLocal: + self.fixOffsets(count, isShort=(fieldSize == 2), + isLong=(fieldSize == 4)) + self.f.seek(curPos + 4) + else: + self.f.seek(offset) + self.fixOffsets(count, isShort=(fieldSize == 2), + isLong=(fieldSize == 4)) + self.f.seek(curPos) + + offset = curPos = None + + elif isLocal: + # skip the locally stored value that is not an offset + self.f.seek(4, os.SEEK_CUR) + + def fixOffsets(self, count, isShort=False, isLong=False): + if not isShort and not isLong: + raise RuntimeError("offset is neither short nor long") + + for i in range(count): + offset = self.readShort() if isShort else self.readLong() + offset += self.offsetOfNewPage + if isShort and offset >= 65536: + # offset is now too large - we must convert shorts to longs + if count != 1: + raise RuntimeError("not implemented") # XXX TODO + + # simple case - the offset is just one and therefore it is + # local (not referenced with another offset) + self.rewriteLastShortToLong(offset) + self.f.seek(-10, os.SEEK_CUR) + self.writeShort(4) # rewrite the type to LONG + self.f.seek(8, os.SEEK_CUR) + elif isShort: + self.rewriteLastShort(offset) + else: + self.rewriteLastLong(offset) + + +def _save_all(im, fp, filename): + encoderinfo = im.encoderinfo.copy() + encoderconfig = im.encoderconfig + append_images = encoderinfo.get("append_images", []) + if not hasattr(im, "n_frames") and not len(append_images): + return _save(im, fp, filename) + + cur_idx = im.tell() + try: + with AppendingTiffWriter(fp) as tf: + for ims in [im]+append_images: + ims.encoderinfo = encoderinfo + ims.encoderconfig = encoderconfig + if not hasattr(ims, "n_frames"): + nfr = 1 + else: + nfr = ims.n_frames + + for idx in range(nfr): + ims.seek(idx) + ims.load() + _save(ims, tf, filename) + tf.newFrame() + finally: + im.seek(cur_idx) + + +# +# -------------------------------------------------------------------- +# Register + +Image.register_open(TiffImageFile.format, TiffImageFile, _accept) +Image.register_save(TiffImageFile.format, _save) +Image.register_save_all(TiffImageFile.format, _save_all) + +Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) + +Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/ascii2img/src/PIL/TiffTags.py b/ascii2img/src/PIL/TiffTags.py new file mode 100644 index 0000000..eba88ef --- /dev/null +++ b/ascii2img/src/PIL/TiffTags.py @@ -0,0 +1,447 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF tags +# +# This module provides clear-text names for various well-known +# TIFF tags. the TIFF codec works just fine without it. +# +# Copyright (c) Secret Labs AB 1999. +# +# See the README file for information on usage and redistribution. +# + +## +# This module provides constants and clear-text names for various +# well-known TIFF tags. +## + +from collections import namedtuple + + +class TagInfo(namedtuple("_TagInfo", "value name type length enum")): + __slots__ = [] + + def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): + return super(TagInfo, cls).__new__( + cls, value, name, type, length, enum or {}) + + def cvt_enum(self, value): + return self.enum.get(value, value) + + +def lookup(tag): + """ + :param tag: Integer tag number + :returns: Taginfo namedtuple, From the TAGS_V2 info if possible, + otherwise just populating the value and name from TAGS. + If the tag is not recognized, "unknown" is returned for the name + + """ + + return TAGS_V2.get(tag, TagInfo(tag, TAGS.get(tag, 'unknown'))) + + +## +# Map tag numbers to tag info. +# +# id: (Name, Type, Length, enum_values) +# +# The length here differs from the length in the tiff spec. For +# numbers, the tiff spec is for the number of fields returned. We +# agree here. For string-like types, the tiff spec uses the length of +# field in bytes. In Pillow, we are using the number of expected +# fields, in general 1 for string-like types. + + +BYTE = 1 +ASCII = 2 +SHORT = 3 +LONG = 4 +RATIONAL = 5 +UNDEFINED = 7 +SIGNED_RATIONAL = 10 +DOUBLE = 12 + +TAGS_V2 = { + + 254: ("NewSubfileType", LONG, 1), + 255: ("SubfileType", SHORT, 1), + 256: ("ImageWidth", LONG, 1), + 257: ("ImageLength", LONG, 1), + 258: ("BitsPerSample", SHORT, 0), + 259: ("Compression", SHORT, 1, + {"Uncompressed": 1, "CCITT 1d": 2, "Group 3 Fax": 3, "Group 4 Fax": 4, + "LZW": 5, "JPEG": 6, "PackBits": 32773}), + + 262: ("PhotometricInterpretation", SHORT, 1, + {"WhiteIsZero": 0, "BlackIsZero": 1, "RGB": 2, "RGB Palette": 3, + "Transparency Mask": 4, "CMYK": 5, "YCbCr": 6, "CieLAB": 8, + "CFA": 32803, # TIFF/EP, Adobe DNG + "LinearRaw": 32892}), # Adobe DNG + 263: ("Threshholding", SHORT, 1), + 264: ("CellWidth", SHORT, 1), + 265: ("CellLength", SHORT, 1), + 266: ("FillOrder", SHORT, 1), + 269: ("DocumentName", ASCII, 1), + + 270: ("ImageDescription", ASCII, 1), + 271: ("Make", ASCII, 1), + 272: ("Model", ASCII, 1), + 273: ("StripOffsets", LONG, 0), + 274: ("Orientation", SHORT, 1), + 277: ("SamplesPerPixel", SHORT, 1), + 278: ("RowsPerStrip", LONG, 1), + 279: ("StripByteCounts", LONG, 0), + + 280: ("MinSampleValue", LONG, 0), + 281: ("MaxSampleValue", SHORT, 0), + 282: ("XResolution", RATIONAL, 1), + 283: ("YResolution", RATIONAL, 1), + 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), + 285: ("PageName", ASCII, 1), + 286: ("XPosition", RATIONAL, 1), + 287: ("YPosition", RATIONAL, 1), + 288: ("FreeOffsets", LONG, 1), + 289: ("FreeByteCounts", LONG, 1), + + 290: ("GrayResponseUnit", SHORT, 1), + 291: ("GrayResponseCurve", SHORT, 0), + 292: ("T4Options", LONG, 1), + 293: ("T6Options", LONG, 1), + 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), + 297: ("PageNumber", SHORT, 2), + + 301: ("TransferFunction", SHORT, 0), + 305: ("Software", ASCII, 1), + 306: ("DateTime", ASCII, 1), + + 315: ("Artist", ASCII, 1), + 316: ("HostComputer", ASCII, 1), + 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), + 318: ("WhitePoint", RATIONAL, 2), + 319: ("PrimaryChromaticities", SHORT, 6), + + 320: ("ColorMap", SHORT, 0), + 321: ("HalftoneHints", SHORT, 2), + 322: ("TileWidth", LONG, 1), + 323: ("TileLength", LONG, 1), + 324: ("TileOffsets", LONG, 0), + 325: ("TileByteCounts", LONG, 0), + + 332: ("InkSet", SHORT, 1), + 333: ("InkNames", ASCII, 1), + 334: ("NumberOfInks", SHORT, 1), + 336: ("DotRange", SHORT, 0), + 337: ("TargetPrinter", ASCII, 1), + 338: ("ExtraSamples", SHORT, 0), + 339: ("SampleFormat", SHORT, 0), + + 340: ("SMinSampleValue", DOUBLE, 0), + 341: ("SMaxSampleValue", DOUBLE, 0), + 342: ("TransferRange", SHORT, 6), + + 347: ("JPEGTables", UNDEFINED, 1), + + # obsolete JPEG tags + 512: ("JPEGProc", SHORT, 1), + 513: ("JPEGInterchangeFormat", LONG, 1), + 514: ("JPEGInterchangeFormatLength", LONG, 1), + 515: ("JPEGRestartInterval", SHORT, 1), + 517: ("JPEGLosslessPredictors", SHORT, 0), + 518: ("JPEGPointTransforms", SHORT, 0), + 519: ("JPEGQTables", LONG, 0), + 520: ("JPEGDCTables", LONG, 0), + 521: ("JPEGACTables", LONG, 0), + + 529: ("YCbCrCoefficients", RATIONAL, 3), + 530: ("YCbCrSubSampling", SHORT, 2), + 531: ("YCbCrPositioning", SHORT, 1), + 532: ("ReferenceBlackWhite", LONG, 0), + + 700: ('XMP', BYTE, 1), + + 33432: ("Copyright", ASCII, 1), + 34377: ('PhotoshopInfo', BYTE, 1), + + # FIXME add more tags here + 34665: ("ExifIFD", SHORT, 1), + 34675: ('ICCProfile', UNDEFINED, 1), + 34853: ('GPSInfoIFD', BYTE, 1), + + # MPInfo + 45056: ("MPFVersion", UNDEFINED, 1), + 45057: ("NumberOfImages", LONG, 1), + 45058: ("MPEntry", UNDEFINED, 1), + 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check + 45060: ("TotalFrames", LONG, 1), + 45313: ("MPIndividualNum", LONG, 1), + 45569: ("PanOrientation", LONG, 1), + 45570: ("PanOverlap_H", RATIONAL, 1), + 45571: ("PanOverlap_V", RATIONAL, 1), + 45572: ("BaseViewpointNum", LONG, 1), + 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), + 45574: ("BaselineLength", RATIONAL, 1), + 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), + 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), + 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), + 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), + 45579: ("YawAngle", SIGNED_RATIONAL, 1), + 45580: ("PitchAngle", SIGNED_RATIONAL, 1), + 45581: ("RollAngle", SIGNED_RATIONAL, 1), + + 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), + 50780: ("BestQualityScale", RATIONAL, 1), + 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one + 50839: ("ImageJMetaData", UNDEFINED, 1) # see Issue #2006 +} + +# Legacy Tags structure +# these tags aren't included above, but were in the previous versions +TAGS = {347: 'JPEGTables', + 700: 'XMP', + + # Additional Exif Info + 32932: 'Wang Annotation', + 33434: 'ExposureTime', + 33437: 'FNumber', + 33445: 'MD FileTag', + 33446: 'MD ScalePixel', + 33447: 'MD ColorTable', + 33448: 'MD LabName', + 33449: 'MD SampleInfo', + 33450: 'MD PrepDate', + 33451: 'MD PrepTime', + 33452: 'MD FileUnits', + 33550: 'ModelPixelScaleTag', + 33723: 'IptcNaaInfo', + 33918: 'INGR Packet Data Tag', + 33919: 'INGR Flag Registers', + 33920: 'IrasB Transformation Matrix', + 33922: 'ModelTiepointTag', + 34264: 'ModelTransformationTag', + 34377: 'PhotoshopInfo', + 34735: 'GeoKeyDirectoryTag', + 34736: 'GeoDoubleParamsTag', + 34737: 'GeoAsciiParamsTag', + 34850: 'ExposureProgram', + 34852: 'SpectralSensitivity', + 34855: 'ISOSpeedRatings', + 34856: 'OECF', + 34864: 'SensitivityType', + 34865: 'StandardOutputSensitivity', + 34866: 'RecommendedExposureIndex', + 34867: 'ISOSpeed', + 34868: 'ISOSpeedLatitudeyyy', + 34869: 'ISOSpeedLatitudezzz', + 34908: 'HylaFAX FaxRecvParams', + 34909: 'HylaFAX FaxSubAddress', + 34910: 'HylaFAX FaxRecvTime', + 36864: 'ExifVersion', + 36867: 'DateTimeOriginal', + 36868: 'DateTImeDigitized', + 37121: 'ComponentsConfiguration', + 37122: 'CompressedBitsPerPixel', + 37724: 'ImageSourceData', + 37377: 'ShutterSpeedValue', + 37378: 'ApertureValue', + 37379: 'BrightnessValue', + 37380: 'ExposureBiasValue', + 37381: 'MaxApertureValue', + 37382: 'SubjectDistance', + 37383: 'MeteringMode', + 37384: 'LightSource', + 37385: 'Flash', + 37386: 'FocalLength', + 37396: 'SubjectArea', + 37500: 'MakerNote', + 37510: 'UserComment', + 37520: 'SubSec', + 37521: 'SubSecTimeOriginal', + 37522: 'SubsecTimeDigitized', + 40960: 'FlashPixVersion', + 40961: 'ColorSpace', + 40962: 'PixelXDimension', + 40963: 'PixelYDimension', + 40964: 'RelatedSoundFile', + 40965: 'InteroperabilityIFD', + 41483: 'FlashEnergy', + 41484: 'SpatialFrequencyResponse', + 41486: 'FocalPlaneXResolution', + 41487: 'FocalPlaneYResolution', + 41488: 'FocalPlaneResolutionUnit', + 41492: 'SubjectLocation', + 41493: 'ExposureIndex', + 41495: 'SensingMethod', + 41728: 'FileSource', + 41729: 'SceneType', + 41730: 'CFAPattern', + 41985: 'CustomRendered', + 41986: 'ExposureMode', + 41987: 'WhiteBalance', + 41988: 'DigitalZoomRatio', + 41989: 'FocalLengthIn35mmFilm', + 41990: 'SceneCaptureType', + 41991: 'GainControl', + 41992: 'Contrast', + 41993: 'Saturation', + 41994: 'Sharpness', + 41995: 'DeviceSettingDescription', + 41996: 'SubjectDistanceRange', + 42016: 'ImageUniqueID', + 42032: 'CameraOwnerName', + 42033: 'BodySerialNumber', + 42034: 'LensSpecification', + 42035: 'LensMake', + 42036: 'LensModel', + 42037: 'LensSerialNumber', + 42112: 'GDAL_METADATA', + 42113: 'GDAL_NODATA', + 42240: 'Gamma', + 50215: 'Oce Scanjob Description', + 50216: 'Oce Application Selector', + 50217: 'Oce Identification Number', + 50218: 'Oce ImageLogic Characteristics', + + # Adobe DNG + 50706: 'DNGVersion', + 50707: 'DNGBackwardVersion', + 50708: 'UniqueCameraModel', + 50709: 'LocalizedCameraModel', + 50710: 'CFAPlaneColor', + 50711: 'CFALayout', + 50712: 'LinearizationTable', + 50713: 'BlackLevelRepeatDim', + 50714: 'BlackLevel', + 50715: 'BlackLevelDeltaH', + 50716: 'BlackLevelDeltaV', + 50717: 'WhiteLevel', + 50718: 'DefaultScale', + 50719: 'DefaultCropOrigin', + 50720: 'DefaultCropSize', + 50721: 'ColorMatrix1', + 50722: 'ColorMatrix2', + 50723: 'CameraCalibration1', + 50724: 'CameraCalibration2', + 50725: 'ReductionMatrix1', + 50726: 'ReductionMatrix2', + 50727: 'AnalogBalance', + 50728: 'AsShotNeutral', + 50729: 'AsShotWhiteXY', + 50730: 'BaselineExposure', + 50731: 'BaselineNoise', + 50732: 'BaselineSharpness', + 50733: 'BayerGreenSplit', + 50734: 'LinearResponseLimit', + 50735: 'CameraSerialNumber', + 50736: 'LensInfo', + 50737: 'ChromaBlurRadius', + 50738: 'AntiAliasStrength', + 50740: 'DNGPrivateData', + 50778: 'CalibrationIlluminant1', + 50779: 'CalibrationIlluminant2', + 50784: 'Alias Layer Metadata' + } + + +def _populate(): + for k, v in TAGS_V2.items(): + # Populate legacy structure. + TAGS[k] = v[0] + if len(v) == 4: + for sk, sv in v[3].items(): + TAGS[(k, sv)] = sk + + TAGS_V2[k] = TagInfo(k, *v) + +_populate() +## +# Map type numbers to type names -- defined in ImageFileDirectory. + +TYPES = {} + +# was: +# TYPES = { +# 1: "byte", +# 2: "ascii", +# 3: "short", +# 4: "long", +# 5: "rational", +# 6: "signed byte", +# 7: "undefined", +# 8: "signed short", +# 9: "signed long", +# 10: "signed rational", +# 11: "float", +# 12: "double", +# } + +# +# These tags are handled by default in libtiff, without +# adding to the custom dictionary. From tif_dir.c, searching for +# case TIFFTAG in the _TIFFVSetField function: +# Line: item. +# 148: case TIFFTAG_SUBFILETYPE: +# 151: case TIFFTAG_IMAGEWIDTH: +# 154: case TIFFTAG_IMAGELENGTH: +# 157: case TIFFTAG_BITSPERSAMPLE: +# 181: case TIFFTAG_COMPRESSION: +# 202: case TIFFTAG_PHOTOMETRIC: +# 205: case TIFFTAG_THRESHHOLDING: +# 208: case TIFFTAG_FILLORDER: +# 214: case TIFFTAG_ORIENTATION: +# 221: case TIFFTAG_SAMPLESPERPIXEL: +# 228: case TIFFTAG_ROWSPERSTRIP: +# 238: case TIFFTAG_MINSAMPLEVALUE: +# 241: case TIFFTAG_MAXSAMPLEVALUE: +# 244: case TIFFTAG_SMINSAMPLEVALUE: +# 247: case TIFFTAG_SMAXSAMPLEVALUE: +# 250: case TIFFTAG_XRESOLUTION: +# 256: case TIFFTAG_YRESOLUTION: +# 262: case TIFFTAG_PLANARCONFIG: +# 268: case TIFFTAG_XPOSITION: +# 271: case TIFFTAG_YPOSITION: +# 274: case TIFFTAG_RESOLUTIONUNIT: +# 280: case TIFFTAG_PAGENUMBER: +# 284: case TIFFTAG_HALFTONEHINTS: +# 288: case TIFFTAG_COLORMAP: +# 294: case TIFFTAG_EXTRASAMPLES: +# 298: case TIFFTAG_MATTEING: +# 305: case TIFFTAG_TILEWIDTH: +# 316: case TIFFTAG_TILELENGTH: +# 327: case TIFFTAG_TILEDEPTH: +# 333: case TIFFTAG_DATATYPE: +# 344: case TIFFTAG_SAMPLEFORMAT: +# 361: case TIFFTAG_IMAGEDEPTH: +# 364: case TIFFTAG_SUBIFD: +# 376: case TIFFTAG_YCBCRPOSITIONING: +# 379: case TIFFTAG_YCBCRSUBSAMPLING: +# 383: case TIFFTAG_TRANSFERFUNCTION: +# 389: case TIFFTAG_REFERENCEBLACKWHITE: +# 393: case TIFFTAG_INKNAMES: + +# some of these are not in our TAGS_V2 dict and were included from tiff.h + +LIBTIFF_CORE = {255, 256, 257, 258, 259, 262, 263, 266, 274, 277, + 278, 280, 281, 340, 341, 282, 283, 284, 286, 287, + 296, 297, 321, 320, 338, 32995, 322, 323, 32998, + 32996, 339, 32997, 330, 531, 530, 301, 532, 333, + # as above + 269 # this has been in our tests forever, and works + } + +LIBTIFF_CORE.remove(320) # Array of short, crashes +LIBTIFF_CORE.remove(301) # Array of short, crashes +LIBTIFF_CORE.remove(532) # Array of long, crashes + +LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes +LIBTIFF_CORE.remove(322) # We don't have support for tiled images in libtiff +LIBTIFF_CORE.remove(323) # Tiled images +LIBTIFF_CORE.remove(333) # Ink Names either + +# Note to advanced users: There may be combinations of these +# parameters and values that when added properly, will work and +# produce valid tiff images that may work in your application. +# It is safe to add and remove tags from this set from Pillow's point +# of view so long as you test against libtiff. diff --git a/ascii2img/src/PIL/WalImageFile.py b/ascii2img/src/PIL/WalImageFile.py new file mode 100644 index 0000000..69964f7 --- /dev/null +++ b/ascii2img/src/PIL/WalImageFile.py @@ -0,0 +1,127 @@ +# encoding: utf-8 +# +# The Python Imaging Library. +# $Id$ +# +# WAL file handling +# +# History: +# 2003-04-23 fl created +# +# Copyright (c) 2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +# NOTE: This format cannot be automatically recognized, so the reader +# is not registered for use with Image.open(). To open a WAL file, use +# the WalImageFile.open() function instead. + +# This reader is based on the specification available from: +# https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml +# and has been tested with a few sample files found using google. + +from . import Image +from ._binary import i32le as i32 + +try: + import builtins +except ImportError: + import __builtin__ + builtins = __builtin__ + + +def open(filename): + """ + Load texture from a Quake2 WAL texture file. + + By default, a Quake2 standard palette is attached to the texture. + To override the palette, use the putpalette method. + + :param filename: WAL file name, or an opened file handle. + :returns: An image instance. + """ + # FIXME: modify to return a WalImageFile instance instead of + # plain Image object ? + + def imopen(fp): + # read header fields + header = fp.read(32+24+32+12) + size = i32(header, 32), i32(header, 36) + offset = i32(header, 40) + + # load pixel data + fp.seek(offset) + + Image._decompression_bomb_check(size) + im = Image.frombytes("P", size, fp.read(size[0] * size[1])) + im.putpalette(quake2palette) + + im.format = "WAL" + im.format_description = "Quake2 Texture" + + # strings are null-terminated + im.info["name"] = header[:32].split(b"\0", 1)[0] + next_name = header[56:56+32].split(b"\0", 1)[0] + if next_name: + im.info["next_name"] = next_name + + return im + + if hasattr(filename, "read"): + return imopen(filename) + else: + with builtins.open(filename, "rb") as fp: + return imopen(fp) + +quake2palette = ( + # default palette taken from piffo 0.93 by Hans Häggström + b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" + b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" + b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" + b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" + b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" + b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" + b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" + b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" + b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" + b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" + b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" + b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" + b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" + b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" + b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" + b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" + b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" + b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" + b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" + b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" + b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" + b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" + b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" + b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" + b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" + b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" + b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" + b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" + b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" + b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" + b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" + b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" + b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" + b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" + b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" + b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" + b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" + b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" + b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" + b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" + b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" + b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" + b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" + b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" + b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" + b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" + b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" + b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" +) diff --git a/ascii2img/src/PIL/WebPImagePlugin.py b/ascii2img/src/PIL/WebPImagePlugin.py new file mode 100644 index 0000000..b93e0d3 --- /dev/null +++ b/ascii2img/src/PIL/WebPImagePlugin.py @@ -0,0 +1,78 @@ +from . import Image, ImageFile, _webp +from io import BytesIO + + +_VALID_WEBP_MODES = { + "RGB": True, + "RGBA": True, + } + +_VP8_MODES_BY_IDENTIFIER = { + b"VP8 ": "RGB", + b"VP8X": "RGBA", + b"VP8L": "RGBA", # lossless + } + + +def _accept(prefix): + is_riff_file_format = prefix[:4] == b"RIFF" + is_webp_file = prefix[8:12] == b"WEBP" + is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER + + return is_riff_file_format and is_webp_file and is_valid_vp8_mode + + +class WebPImageFile(ImageFile.ImageFile): + + format = "WEBP" + format_description = "WebP image" + + def _open(self): + data, width, height, self.mode, icc_profile, exif = \ + _webp.WebPDecode(self.fp.read()) + + if icc_profile: + self.info["icc_profile"] = icc_profile + if exif: + self.info["exif"] = exif + + self.size = width, height + self.fp = BytesIO(data) + self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] + + def _getexif(self): + from .JpegImagePlugin import _getexif + return _getexif(self) + + +def _save(im, fp, filename): + image_mode = im.mode + if im.mode not in _VALID_WEBP_MODES: + raise IOError("cannot write mode %s as WEBP" % image_mode) + + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + icc_profile = im.encoderinfo.get("icc_profile", "") + exif = im.encoderinfo.get("exif", "") + + data = _webp.WebPEncode( + im.tobytes(), + im.size[0], + im.size[1], + lossless, + float(quality), + im.mode, + icc_profile, + exif + ) + if data is None: + raise IOError("cannot write file as WEBP (encoder returned None)") + + fp.write(data) + + +Image.register_open(WebPImageFile.format, WebPImageFile, _accept) +Image.register_save(WebPImageFile.format, _save) + +Image.register_extension(WebPImageFile.format, ".webp") +Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/ascii2img/src/PIL/WmfImagePlugin.py b/ascii2img/src/PIL/WmfImagePlugin.py new file mode 100644 index 0000000..fea436b --- /dev/null +++ b/ascii2img/src/PIL/WmfImagePlugin.py @@ -0,0 +1,167 @@ +# +# The Python Imaging Library +# $Id$ +# +# WMF stub codec +# +# history: +# 1996-12-14 fl Created +# 2004-02-22 fl Turned into a stub driver +# 2004-02-23 fl Added EMF support +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +# WMF/EMF reference documentation: +# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf +# http://wvware.sourceforge.net/caolan/index.html +# http://wvware.sourceforge.net/caolan/ora-wmf.html + +from __future__ import print_function + +from . import Image, ImageFile +from ._binary import i16le as word, si16le as short, i32le as dword, si32le as _long + + +__version__ = "0.2" + +_handler = None + +if str != bytes: + long = int + + +def register_handler(handler): + """ + Install application-specific WMF image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + +if hasattr(Image.core, "drawwmf"): + # install default handler (windows only) + + class WmfHandler(object): + + def open(self, im): + im.mode = "RGB" + self.bbox = im.info["wmf_bbox"] + + def load(self, im): + im.fp.seek(0) # rewind + return Image.frombytes( + "RGB", im.size, + Image.core.drawwmf(im.fp.read(), im.size, self.bbox), + "raw", "BGR", (im.size[0]*3 + 3) & -4, -1 + ) + + register_handler(WmfHandler()) + +# +# -------------------------------------------------------------------- +# Read WMF file + + +def _accept(prefix): + return ( + prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or + prefix[:4] == b"\x01\x00\x00\x00" + ) + + +## +# Image plugin for Windows metafiles. + +class WmfStubImageFile(ImageFile.StubImageFile): + + format = "WMF" + format_description = "Windows Metafile" + + def _open(self): + + # check placable header + s = self.fp.read(80) + + if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": + + # placeable windows metafile + + # get units per inch + inch = word(s, 14) + + # get bounding box + x0 = short(s, 6) + y0 = short(s, 8) + x1 = short(s, 10) + y1 = short(s, 12) + + # normalize size to 72 dots per inch + size = (x1 - x0) * 72 // inch, (y1 - y0) * 72 // inch + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + self.info["dpi"] = 72 + + # print(self.mode, self.size, self.info) + + # sanity check (standard metafile header) + if s[22:26] != b"\x01\x00\t\x00": + raise SyntaxError("Unsupported WMF file format") + + elif dword(s) == 1 and s[40:44] == b" EMF": + # enhanced metafile + + # get bounding box + x0 = _long(s, 8) + y0 = _long(s, 12) + x1 = _long(s, 16) + y1 = _long(s, 20) + + # get frame (in 0.01 millimeter units) + frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) + + # normalize size to 72 dots per inch + size = x1 - x0, y1 - y0 + + # calculate dots per inch from bbox and frame + xdpi = 2540 * (x1 - y0) // (frame[2] - frame[0]) + ydpi = 2540 * (y1 - y0) // (frame[3] - frame[1]) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + if xdpi == ydpi: + self.info["dpi"] = xdpi + else: + self.info["dpi"] = xdpi, ydpi + + else: + raise SyntaxError("Unsupported file format") + + self.mode = "RGB" + self.size = size + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr(_handler, "save"): + raise IOError("WMF save handler not installed") + _handler.save(im, fp, filename) + +# +# -------------------------------------------------------------------- +# Registry stuff + +Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) +Image.register_save(WmfStubImageFile.format, _save) + +Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/ascii2img/src/PIL/XVThumbImagePlugin.py b/ascii2img/src/PIL/XVThumbImagePlugin.py new file mode 100644 index 0000000..a7d39ed --- /dev/null +++ b/ascii2img/src/PIL/XVThumbImagePlugin.py @@ -0,0 +1,80 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XV Thumbnail file handler by Charles E. "Gene" Cash +# (gcash@magicnet.net) +# +# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, +# available from ftp://ftp.cis.upenn.edu/pub/xv/ +# +# history: +# 98-08-15 cec created (b/w only) +# 98-12-09 cec added color palette +# 98-12-28 fl added to PIL (with only a few very minor modifications) +# +# To do: +# FIXME: make save work (this requires quantization support) +# + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, o8 + +__version__ = "0.1" + +_MAGIC = b"P7 332" + +# standard color palette for thumbnails (RGB332) +PALETTE = b"" +for r in range(8): + for g in range(8): + for b in range(4): + PALETTE = PALETTE + (o8((r*255)//7)+o8((g*255)//7)+o8((b*255)//3)) + + +def _accept(prefix): + return prefix[:6] == _MAGIC + + +## +# Image plugin for XV thumbnail images. + +class XVThumbImageFile(ImageFile.ImageFile): + + format = "XVThumb" + format_description = "XV thumbnail image" + + def _open(self): + + # check magic + if not _accept(self.fp.read(6)): + raise SyntaxError("not an XV thumbnail file") + + # Skip to beginning of next line + self.fp.readline() + + # skip info comments + while True: + s = self.fp.readline() + if not s: + raise SyntaxError("Unexpected EOF reading XV thumbnail file") + if i8(s[0]) != 35: # ie. when not a comment: '#' + break + + # parse header line (already read) + s = s.strip().split() + + self.mode = "P" + self.size = int(s[0]), int(s[1]) + + self.palette = ImagePalette.raw("RGB", PALETTE) + + self.tile = [ + ("raw", (0, 0)+self.size, + self.fp.tell(), (self.mode, 0, 1) + )] + + +# -------------------------------------------------------------------- + +Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/ascii2img/src/PIL/XbmImagePlugin.py b/ascii2img/src/PIL/XbmImagePlugin.py new file mode 100644 index 0000000..b43fbef --- /dev/null +++ b/ascii2img/src/PIL/XbmImagePlugin.py @@ -0,0 +1,96 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XBM File handling +# +# History: +# 1995-09-08 fl Created +# 1996-11-01 fl Added save support +# 1997-07-07 fl Made header parser more tolerant +# 1997-07-22 fl Fixed yet another parser bug +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) +# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) +# 2004-02-24 fl Allow some whitespace before first #define +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import re +from . import Image, ImageFile + +__version__ = "0.6" + +# XBM header +xbm_head = re.compile( + br"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" + b"(?P" + b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" + b")?" + b"[\\000-\\377]*_bits\\[\\]" +) + + +def _accept(prefix): + return prefix.lstrip()[:7] == b"#define" + + +## +# Image plugin for X11 bitmaps. + +class XbmImageFile(ImageFile.ImageFile): + + format = "XBM" + format_description = "X11 Bitmap" + + def _open(self): + + m = xbm_head.match(self.fp.read(512)) + + if m: + + xsize = int(m.group("width")) + ysize = int(m.group("height")) + + if m.group("hotspot"): + self.info["hotspot"] = ( + int(m.group("xhot")), int(m.group("yhot")) + ) + + self.mode = "1" + self.size = xsize, ysize + + self.tile = [("xbm", (0, 0)+self.size, m.end(), None)] + + +def _save(im, fp, filename): + + if im.mode != "1": + raise IOError("cannot write mode %s as XBM" % im.mode) + + fp.write(("#define im_width %d\n" % im.size[0]).encode('ascii')) + fp.write(("#define im_height %d\n" % im.size[1]).encode('ascii')) + + hotspot = im.encoderinfo.get("hotspot") + if hotspot: + fp.write(("#define im_x_hot %d\n" % hotspot[0]).encode('ascii')) + fp.write(("#define im_y_hot %d\n" % hotspot[1]).encode('ascii')) + + fp.write(b"static char im_bits[] = {\n") + + ImageFile._save(im, fp, [("xbm", (0, 0)+im.size, 0, None)]) + + fp.write(b"};\n") + + +Image.register_open(XbmImageFile.format, XbmImageFile, _accept) +Image.register_save(XbmImageFile.format, _save) + +Image.register_extension(XbmImageFile.format, ".xbm") + +Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/ascii2img/src/PIL/XpmImagePlugin.py b/ascii2img/src/PIL/XpmImagePlugin.py new file mode 100644 index 0000000..b6e6980 --- /dev/null +++ b/ascii2img/src/PIL/XpmImagePlugin.py @@ -0,0 +1,128 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XPM File handling +# +# History: +# 1996-12-29 fl Created +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# + + +import re +from . import Image, ImageFile, ImagePalette +from ._binary import i8, o8 + +__version__ = "0.2" + +# XPM header +xpm_head = re.compile(b"\"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)") + + +def _accept(prefix): + return prefix[:9] == b"/* XPM */" + + +## +# Image plugin for X11 pixel maps. + +class XpmImageFile(ImageFile.ImageFile): + + format = "XPM" + format_description = "X11 Pixel Map" + + def _open(self): + + if not _accept(self.fp.read(9)): + raise SyntaxError("not an XPM file") + + # skip forward to next string + while True: + s = self.fp.readline() + if not s: + raise SyntaxError("broken XPM file") + m = xpm_head.match(s) + if m: + break + + self.size = int(m.group(1)), int(m.group(2)) + + pal = int(m.group(3)) + bpp = int(m.group(4)) + + if pal > 256 or bpp != 1: + raise ValueError("cannot read this XPM file") + + # + # load palette description + + palette = [b"\0\0\0"] * 256 + + for i in range(pal): + + s = self.fp.readline() + if s[-2:] == b'\r\n': + s = s[:-2] + elif s[-1:] in b'\r\n': + s = s[:-1] + + c = i8(s[1]) + s = s[2:-2].split() + + for i in range(0, len(s), 2): + + if s[i] == b"c": + + # process colour key + rgb = s[i+1] + if rgb == b"None": + self.info["transparency"] = c + elif rgb[0:1] == b"#": + # FIXME: handle colour names (see ImagePalette.py) + rgb = int(rgb[1:], 16) + palette[c] = (o8((rgb >> 16) & 255) + + o8((rgb >> 8) & 255) + + o8(rgb & 255)) + else: + # unknown colour + raise ValueError("cannot read this XPM file") + break + + else: + + # missing colour key + raise ValueError("cannot read this XPM file") + + self.mode = "P" + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + self.tile = [("raw", (0, 0)+self.size, self.fp.tell(), ("P", 0, 1))] + + def load_read(self, bytes): + + # + # load all image data in one chunk + + xsize, ysize = self.size + + s = [None] * ysize + + for i in range(ysize): + s[i] = self.fp.readline()[1:xsize+1].ljust(xsize) + + return b"".join(s) + +# +# Registry + +Image.register_open(XpmImageFile.format, XpmImageFile, _accept) + +Image.register_extension(XpmImageFile.format, ".xpm") + +Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/ascii2img/src/PIL/__init__.py b/ascii2img/src/PIL/__init__.py new file mode 100644 index 0000000..5603bb0 --- /dev/null +++ b/ascii2img/src/PIL/__init__.py @@ -0,0 +1,64 @@ +# +# The Python Imaging Library. +# $Id$ +# +# package placeholder +# +# Copyright (c) 1999 by Secret Labs AB. +# +# See the README file for information on usage and redistribution. +# + +# ;-) + +from . import version + +VERSION = '1.1.7' # PIL Version +PILLOW_VERSION = version.__version__ + +__version__ = PILLOW_VERSION + +_plugins = ['BmpImagePlugin', + 'BufrStubImagePlugin', + 'CurImagePlugin', + 'DcxImagePlugin', + 'DdsImagePlugin', + 'EpsImagePlugin', + 'FitsStubImagePlugin', + 'FliImagePlugin', + 'FpxImagePlugin', + 'FtexImagePlugin', + 'GbrImagePlugin', + 'GifImagePlugin', + 'GribStubImagePlugin', + 'Hdf5StubImagePlugin', + 'IcnsImagePlugin', + 'IcoImagePlugin', + 'ImImagePlugin', + 'ImtImagePlugin', + 'IptcImagePlugin', + 'JpegImagePlugin', + 'Jpeg2KImagePlugin', + 'McIdasImagePlugin', + 'MicImagePlugin', + 'MpegImagePlugin', + 'MpoImagePlugin', + 'MspImagePlugin', + 'PalmImagePlugin', + 'PcdImagePlugin', + 'PcxImagePlugin', + 'PdfImagePlugin', + 'PixarImagePlugin', + 'PngImagePlugin', + 'PpmImagePlugin', + 'PsdImagePlugin', + 'SgiImagePlugin', + 'SpiderImagePlugin', + 'SunImagePlugin', + 'TgaImagePlugin', + 'TiffImagePlugin', + 'WebPImagePlugin', + 'WmfImagePlugin', + 'XbmImagePlugin', + 'XpmImagePlugin', + 'XVThumbImagePlugin'] diff --git a/ascii2img/src/PIL/__init__.pyc b/ascii2img/src/PIL/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f21f54bdc21633c97dea7c9775a836012da5ce09 GIT binary patch literal 1361 zcmcJOS#Q%&5QUGEG~Gy>wrpkJ2~ZMR3Gspu0-7|?v{qBKRUWVsAIDr2yH;$Y^1J%e z_ygRritxfKu|2Ur&CEID>s$U+Td3@u4{TigHuV2{eTC;bP@e`SfM;M}z+ef35*!2H z%NSJPR4^!m`mBI6U=^GN=fHVz0bB$xfi-XmTn6jl3b+ccftSH6;8pM%cpY2^Z-6(! zTi|W*4tN*52i^xCfDge(;A8L!_!Mk_&%o#43vdH`2{z$wV4w}O&~LobzLlXvLqasG z!w+W~s#8Cl(f6Cp&E}hEN#A|&g044o9di=9%8%9r#p7u|ibrWKsUPEM9(}UU3W#AI zZ3h`78f_JY|I%nrRKB_$WHgqgI&v~h+;v6;cO5lOHxu2?RE_ew!gn}+o#&#|wf&5D zQR>>K>9#dNUYaCHUX(^juOPDX>~r9_X||%93ETRTr#-vNVZlpJ6It7J( z?C1R+y2CV*Ne|UHV_4X+Gcwb8V(!?>qzO7175tuLM_84tqr-2pm)=5qjjHC6zHlHR z*^@`x2mS8;UbLuzWnJu0%Sv{p+1=gUKeqm)%t=a+?9#9y4gQ93T|W*(TdA$UcU!u! mWm(Esk!3Z5pOI9)^-dX2oOd!o_*I8`scOuZs-?2=KaSrr%w7@z literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/__pycache__/Image.cpython-36.pyc b/ascii2img/src/PIL/__pycache__/Image.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8929e9ef9fc07f5660f9d2baa522e5fa17dcacaa GIT binary patch literal 78378 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 O>V(g}Qt4TR?Ee8(HIqyL literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/__pycache__/ImageColor.cpython-36.pyc b/ascii2img/src/PIL/__pycache__/ImageColor.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbdb37beaf013c7f1885940b5da253ea6b932e7e GIT binary patch literal 6070 zcmeHLTbCQf5uVX)C9QTb#<2lAL?(Tv

>L%S_^x5+sYFX? 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 literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/__pycache__/ImageDraw.cpython-36.pyc b/ascii2img/src/PIL/__pycache__/ImageDraw.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4aaf5da526ae37e22f4228e8912d381519d7729 GIT binary patch literal 9924 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 VVqVQ%_(0oqmlQ``(_MDI`agn69gzS4 literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/__pycache__/ImageFont.cpython-36.pyc b/ascii2img/src/PIL/__pycache__/ImageFont.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bec7b055627745670bca09a2303e280adb51990a GIT binary patch literal 18142 zcmeHvOKjtKnxCkbW!kQCS3jz|cXlHbW`Xv)*7CD#*Y-?`lw?V^BujpjZKVflS)?e+ zvM7_(!-71AsX1n|lK=q%WRU5P~}AfqyMS)jf!E-$>NM*Q3cLE_}$GrSLA>KmHAiOYod;JaT5fd4@ysD$tf zrBmkc8-{AkDB2hM`7C5pTlgvjX}qe0Ergkl2U8p|3nQ^fe+w|1k8b5L;CHH(7U@MzZz)l&dEc%_m5N3)6`G}>xwCTg_}9E zWzQ+|4B6j+D-(S7d_!z3V0;lO;RpN$7U*K$B2Ga8iFxASSss$BMBO&a?0=Gb`Xh_z zNJwXr_#L46zGDfFMK^e^x4M<4t~hGUoFzA*>OM@I5%SU~VyYFTskhY8!s&g>uJj#g zhFI34px&w(qcGV)OBn@euK6Q8do+J`-&S40lf+$>s2ZjUO#t?AG`A}umc03USYeVE z841uO(uqfcHvbL=-{Q0gxG%6ML|C+b{`CvX0Wly75eRwkqwf(htJ>I9gMdOxdW@6( zD5T_T2xO8l93c-Tkgpic!O2MN{k5m%&a!|=x(1b=qRURFMWgPvDH zDomxZ2v_c}1>M-aqc&477t8SC7nEg?hUrQ){G;Mer2k69mH~LI)YlN z+10D+O8z@0me6OORmt7cLBDf2*=PJC+zbU+tPc*^R~Ci=T>b2(1H+IVv_myNEPm4t zK7{OWgYH5PA&i9JEe@z>(T87*4ntTOvFAxA%_c@f!1V)Oa2QgAKc>-z)(d!(#dqX^ zmS~3JcW3w-O9%&Hn!}zW07;LQnw5K_W0%zyatzfG{1fv_V2s!gC5Mx3DQbTdQCn3* zK^ihz%t}|s=VxVEI?cpK3vTN~D(1`$EGx~YrMJm4xBo8MCYcr63|Tl^khw z?`_p`y}dK|h89V5k?F!PW|f%o1ihu(9bV;eUU4}_Q%_{RT0x)@XhBr4FmFMQ9DrYL@H;riUi91G+*sW6GRuJ2@j;Ypjk z)o5PfJXtqd2<&Rb?!eN_H#8D9YBdYU&oY)F{8Nluj4Z)67%g5I5F>_4( zjJLkTY9~p*iI~eEQ)m&H*q5OlMca=yd@i@w(GH*u56ta1Xa~_|e~kGBv_oiz6#pNG zNW2wfhdwdt9&sc`wi>NOt48}iYSf~39ec8ARf-zd4eTRdj+b;SIN@lebsx3bYE`f4 zsuD%Y(Yb{`u%fmRHM(G`uBd>eMqxlU=38sx7(k(7!Y|pXX<;4qfC?7s)k>4r(vtRM zykh}4y2)AUNDc=CRJX>U9Nea0zcy7^aO-tc`VbLoAsbF#D0ShkN)5^->IC zPw@UYCA{Ce{*gwE7CFvzE2ds)+5ZYFIUDgUJVS_}e}gZk`MowhdnJ@Ne@f3HGvwF^ z>&)k|2ciTCH=#ToD^DL~O6J!z|9~!Ox@73WsZx&aIA0>a!2#1GlQT(gO%zL}6`EC> z6DeZIJx+_Ph!QEEAR>{91jHcDz-M8fz)Y)RczgtK_Xel+5|^2zN~EF+5+&?#sicCW zYJt-$0cjP*y2a6xGqcjN+6EMW0_Nc5g|n|kZe(JQ3w3}Jng%xe&=7Rp>QpcwZ9y)a zAE&Z}0udS~G&rnIr9ld%)&9!mv_W`}vFjB(T4n2innvw0HcoO@GmTre0kyANj0=fv ztX}WyB`YXD!Of{@Ot{Qz&PX2WRDzOe%f$a=QEMxKNgl&(4l>6GJB$&dQVH zGwCc@-e33DxE&jN=mGO*W^L}SPiPwNSr(?Shx$$o=me5^WHGF`|BfWaAyy0vgXgpA zFv*`txO9*QC1G>;Aj^i|bN5bewgA6rW6z6|vfZ%x2gqfE6eh@5dKp%D5+6*)jNp&v z#|#*W?k%XCP9rA!osrNR3H8Smk?s8_oNiQD7M@{~IQZ-lRfr3eIyjj;QA5WJW$Wnh zC>tU#90vXweEmN_fd;*P#dkArzC>9D`F#Ub0nkQ1A3H}k?y=z$U8DK2M$eEzp>IOV z2Ll|z_|G_9Qa(dbWATHe@Wv3&c6W1g-|wT?Gcj(HU^?+VMLg`Uya$r+5tkxilX}Og zD@ln?Hgl>g*r<;@VCRh8vybW_L*7AGP^ficUlzN6m^IrWRd`@fXB7EromQ31ElTA9 zGW;n^jk3{Ggkr;ETf5eg7PTjEUcxCTQ6~r?7-BAp3&<$jMvL|?)8O2w>W$0TU9QD-syHF$l$j6`OfWxj(l27R`0 zBmPP-|H7#z+Ne3A5CtJUgf!nn*bbrmBw*Wljgh$q<$A)y+;GnP%VD@N&$Gqh9Ex1% z7ksS}&;JDG{HN}G6ieUvA0oqu^$R6}-!K1AS+AC z6NbI0Jbfo<0h+;W+OP`B@)y2`dF7)AvHu^3Vbn|i{lh~4uQ2{($Pj<_ufGXAEIuqf zJn8?-;S-Gi>BH0EJZSuC_;iRZG~F>Yakw~q3han0%U!Atp=;SatK;!spRx`_~!;qrs{E8pGUT=?$(JI?=tq94iO-(ux> z6HmDO!souT_z14!(@FRQ?CbH^1GvXDu69?2?KRUTO;Vl~BV8-&|4#I8lpX#)|x zK!w8SSudmd#O7uqF-1~7-1i+dqXRFYLkHRCxD{rKr?xDY(wB6t!0AH1X;NK2tX>RD8P?y;-@2x2a*`$_y~CbTb3b>m-=S^JhSw zw{#SH03{kXZf}k6VSoq0*+;zSV9|@{SKiu}(HGYJ?KOIGdet;6qc+LUJbCc%DP|eX z70j0s$1>(iiUB`)YQvRROvM?HljDJ8AMaP}mDxmT43Yf*i;8*MqWSGM_;F&~R$3tC zRCTsQUbY`aEt7Xmoa=p9#+2>eBCmy%aC^%$XIMK^J@feMbVi+$n#*6-&aseQfB13V zPRhd5MYeCr*xw(c65F>fHj{nV-&S-gg?f5xYqJ!-$mA25lTnBjd=x_2ztbOu`De4V zbeTw%>7_y$b51#P8i=uuWyY*Jc9%050&SvBaay#qqcEKB$t6!TH^FDS!mOS`0c6tvpy?xaE^yjl3Tsm?J zU4!77ZPyUVON95|BO0DMTiM^GjtMo9>x$*P)CySl)+o|$R%}wQ(VW`q>LyBI0i>el zAJVFC=(38-NL2f6Xg6%tG=GOWg1t)fX62*r-3XT!flk@WZ14^Rj-nI>t+*-8Ib5{N z7XVfIeRd*c5^=ew+x2p#tmw6xiV_V5f1y(T(>w ztF$=XEJX-5y%BsQw^76s5WOF_XuItD0xxgyZ_ytV#30pkDam~z1Oq{2?ay!@7MA^} z@8XU|mNB+0{2s2K;rAK-Q6(5@QUkDNG?3mMb8=+kre7o7L%Q${v=ADIih9IG=5FKd zn)S7fx;*MPo5TfB6uyk z;JhJp-scbg7n?pub7BccSU4xjIxAN6b^HD`CBd)1{W;#?txfy^x&3cnMz1?I!eqs) z*6~7uyiUoMY1kY8Ce zuOSqt>Jz}-NYqj3!nY2ssyYf-wmAy%yMj@e6?E8=HRC8$puBUKuvgHWOjoYg0R8~RLxzFm31 zy93+@ntrHJ0NWlE2PvcGSGst2|4yJ6IBpx+EdTRkOGJg1@IYrxs6<~}qf&>&1BH(k zZ58U+uDpnPVV?Npig0Z$iUJ>*V?|L^<@M|6#@fc(wo~8xKkZVyTJoGsuUs<6dFv~< z5%E0P%$08UJBnoN9uF)!`?-X5bdo$cFBT2yw>iY$X7X>E`vb7w#G&`cf8g2sJo!yM z|G#;5#R$e?dy-Tf<0?y1QW9m2I?}OKO-k?(PsmB=PjR~zdnHL{u~^X=M?dCy0BO3XT)a;UVjp3lIx~StxG-5WtvbX$jT(i3vxB`yD-mP#m5W<2*s{xr*p%Hm%55xWrFA3`ysKA)N$(pBv~Dj9>yCV0%#EON3a0cGBAUJ#>N2K7?MoZCr`?* z?Hz&7tlbU|T?`o`n-*m)_8Q#bU`S}h!Awc&dH|;}%o4x^NPHh)A4^3k2YX<5GmT+_ z?PZ<&ACa7geM<>+z7J5`BsB8S8_$1@d6=lt&NUS2EfM-eR6-njT zQ$!C#;#s1Li?r`yi2JesD)2a1GQm*v#JoyUDJCD0Obe1^%`&tNyq&_35Gc|mS?~bD zYp~v6q9i8>;0Zs8+N2&(8wPlRmJIib{zm{$Xi<{Y#*G0E&9opxW2X~EoOswIIYjx$ zQ*1QYmeD7jl42*xHhCc$2r6u&NjXaZ&oX349)^$uJgk(w$A}Dv=$Re?A=bpDvns`a zyXTrB*P)HzB!h{Q3}A$i6;lpt0{-rW80I@FoJK2ro96& zB>*D1}BWMixLAyd{@?fXkG3a6GJhi4o}n03Tzh9n>)*mpp*56fXu~0Rx1Y zO=0NxEBTrpc!^*$0SFAysT~Xmpwgp2b_Fuo_SovNfB_;FzYnmcVc8WT4+CVy1`mm; zDfXheV*%g+1GJpTd_@|N!eggMc6o^4DoG{uGsaT@wbWaT$l|R>Gg`z%7ITU8CIy~M zVd#)38$@yi{WC6`gpz7OH6+=bL}o`3iKGfS#1weq0Ax#X0a~Po*X-w@hZ76|ECrJx zR!r*+V@Pmtq+vxfB$Fb`eF9irpCK8*fTEVp(}WGIbo9t2nMhLTk}gdEvZX*_lkz5y zua7N7l)7Zh(Ai>|BAC48hI-sjY)_#8mewbx2U~_vkc-IM#1a)G;Foyzw|4vh?6+s- z4?O#UXYX-<{281hIYiE3$ylW{^0O(2$bK#ltSvDWlBV5 z94Y-ccc3jB()N9+&Hx*e)Bz5WHy~1+lN%i|U=l~+V6hKa?Pcx=U=~!(kX*p-L1%#X z#2Z8{9OG;$o}+eyh2>y~{U|V_Epujz03L%kEC3a<&95h;wq& zK+^2y#FXrTW(YycuvEP59w2yOPnK>-NQWdk7hsw;orrPk@iUru0}3D%;u&q3F$URd zhsS8e&v|oC0Hg_qP09ie&nFlCYjvZE&P5?CNgw+N(@WW?2*Lz@61_C1cHaS8h&0K~jWq~CX>8W&X>Gq94Mz!*Xp zgxnEMDPDKeB?m*-)C@AcBe2BDo(Mw%$a>ZwDYeh10fM6pkk}D#L7d!Xl3jpp$`6j9 zhZBIb4*<`kIPcExpooumD%uh2AvR~T0EwbI;^EPT2axvxK#{WExJ?sGYZ^n43;{|< zP#+XxicW^;kPJ1U`4&kz3*M46i9|>f0I4_5*^T7^L{A|GfV3)$s)7_BcsxWS76Zxn zl`O(Adj_7lDJYo=86p;}6Fcmx>%Ukiusy;sdr9M4EG$oLTprr%l(=M(T}}XcBt!O+ z)VY~1F1aLUX@eWz)m)O%U<`r0D0Lt>DT@s8eSmv}VHevEM=^8mm}2#_zJhq4}#RE^)Ppckp%dHUx#E!)1|qOAt?u*I2d}0NDB@K z!#-lbM6q2xq&4iS+Ktm;vYt z0ri0+DRCnuCqjXg86bIDLn`#}dYC$pjAdls?G-A>tX5$@C<6fFtPu7*0qg%t&u!NRzwdVyn`Vj zXioujy#s=FT#Kh4VaNdCK#wE@Q_(|lVk&V&Aw#-(EM?;1Aqv7;{9*>6Ta!dQITEEq zpg0jT6p`w%anu|Q{F4e39zxS87lF6{u<4P^itXy5*d{TfSm9teO>*2KfY=T?B(vJM zik;07z*ioI3=jx`XYe${#9Y$Fa0;N7fbTP;dltE;hY(5;t`7M@TuaQDo`_@wV$Mhd z0+>ISlD(h&M6~`AZ~sL7t$cjaTR%!^pckdA)AM@rT*Dn~9>+QRU-zJ{-`w5U-;cHWo#LxwWnau~Z^d>7o0--9)_%#p zO~}1mF&R&s6ninXm?;|d!^?hKj_2PdUlrq&I+B+4T&y%Hd*9fwW4%nicek#ISv6le z?-^z%zfopwOZHA~wRe5fT< zHC2FyN{NkpE-^StCw8U$g}K!{kCHk3;DLfTUc zX;sb~(VLBp*xpu48MKZom;J3>#Ml|E?h^fr)x;LFP?4V)Hl=Z|yd34_@W#ExcbLvyA0)w6nnhZQnf98rhQeHYIC2 zg>LMu+pg}_dnvhbl{%CXjda44dWC`1=*H4w?4q_+7{q(_pxR5{%Gy<`+Pf|d_Il|` z9G_h!j(fR8aW5Cg$Z>q@V)wSaT3hd}_R_~!{o}3U)T+9*`>Jl`N{yQ>_D&T2u5RPG zt4(RUmysppon-PVehisf2u`*N-!qT&I_5q_SK4v0ATIllHD-v3@sJ*pv(Q zV36*`71NnL zwR_yFp5CR-*#P*#vb?vUpZ3IdGP$w4UNp6xT;}RtN#FI9MDZjCu2$co7|2hA5Vrff zjeR6giPl~*2L5GbqoPZ_UanD4x;YS$+c@ir#-V|21rFldodM-vRr+e-qS7uxts>W3H zVpr}J8au1SRH=@DV?jSWg}sBa;_=#DGI!bR)^mk(1VMk*+296%O1;F1*xSwA zB(Decx6Ew$@Z@|aY2F-anuY+j62V{B8|EE8T^WVx1GHD$&gbX!cig4<>sQX_yUh+n-*Q@ui_qmO0&qH(zxHK9MIP^%b4YxqpxZ3C%FFbH_M+d3MPGQ^`XC{ z`jkHxbp8{7P`P94O_RQ|;XfF5zLujeg79~s{1H9DKiic5{!hZb64Wr1{&VMuVQ~Jvb>&Lh(;v2Gv5D6@Y=_|A+{1sa8 U+4BB!a`|^7Pw;nF$;k8n4Gtn5q5uE@ literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/__pycache__/ImageMode.cpython-36.pyc b/ascii2img/src/PIL/__pycache__/ImageMode.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6de62a8cde9e13075d8689c85efb9402b5feff5a GIT binary patch literal 1222 zcmZWo&2AGh5VpPE&5sh=rfsTLfEIBIhg5*Xg$lK$5F({NDu+r@k+qH8uu=YMZxM|) zr}kwy^9~$&0AD%r3Y?hnhBOizd1mr?#xvvj{IXmw@(l3O!E*#N>d_8%0SZ8 z1IbbjGOLds)wtz&lJzg5p)@vs5gFwGXC*gdRr4)3s(-2RT*E`n7a|_Ui4Ys$Y4RWl4cu?Cfj;*Q*8h2SD0;z%8kcJa zW*H0zO&3vM>k9%iYpiw+mcg>}l(T%`uz5=ugnO=~pI{`!{6G%% z>3~fsB{7+@ul1DnydJ+L2jo+D&ZgeEH|0}*8YDhUF@PERw;ZPG?U1YRj3hqrZdK-G z0Z|DkAVs+*3p1qXkdj=VBPEBFWpy4^cF2-kp8G60WMu(aaY$tWsq6r|BIqI|n>d<{ z$+Lz^Oc-Shm2>(!)+V1-*p0uaq1&zh#_Ot4>pR9+e%jcNEIqZfVd=i5k@Wzvv}IXq z&(b|mk!2@fo=kZ2_48MjHYYwBtxWCLxURsFdKCrEL9b&5rjdMlbHSeB_(n23umR3q z8B6psptc|mj}P88kKP|!KTg!ZxIxx(*+W2=wx0#i!TpoSUdTN)GCp=yg04>>$URHq zajyjI*rHWdq3)My#;JY^UeL&6EFu_P^i(Htsoll`;an1Tetsuo?VA-$fX|bA%jLf- CZ3Vpm literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/__pycache__/__init__.cpython-36.pyc b/ascii2img/src/PIL/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5bd39330b64905db28d458fa7121641d2d3401a GIT binary patch literal 1141 zcmcIj%Wl&^6tx}aLEDU*hF5u&Hv~dLix3-xP@!oJO>5z(iM+sad>k_w5VJeX3hBdZ)<#T-J+~c`(pVaG1`rbF^OGQz>E7H|2-d`3^dQt=^P^U_y zI;yHbbF@JHSaS40cSxj!U?VE4Yel z*uZt%z)jr3ZQQ|K+{1me@Bk0d#v^pXwo^veR$7mLsD*)+IIouh^s;~u zYFp;H#fo~>H^*rU5@#pF+zB^D~A zw1ORyHa2X*5l~4xkBO;4=*id^@Ck8c41=*HXRu*J64+==O^v9@wb9YwLmtV8_@Gsp zD~VQ2!Mu93^UgL851eJ!{WA`(>oCjQ-#;9>e?Qh-aXJ#|S0yPI%TB}3buaZf-x6`y oE%Ljr%VVCoZby8c*Pcf+@;h@?UYQG~>yM6DtudZ?mGQQ|SdCD>@~R08D& zeTY_lfu8#|zV?(?=%t<6kjOwvNe-xvyfay^zt8h|cE*KN%82d#C~FDEezM4+qQ8Tu z{}l&dz#Hs@m-&fORyea&J9ey#=b(Uk$;ukUKtmgMGZ4R;Npxo55$KS-97o=kU}pBCZu5uJp&#?2FB4FfhRBlljx1Y6ig#(3T9vyZ5rkvi*^j=VF7Ih77tkN zX&ax9<&-eqbWf|+aTue~;xvl~Sq0BsJbfL9fVJ2K#~XPm$3xWI5Y{yo5=^p;qC+gecREZ;sr?)0h|W3^ zMCVAd&Va(RQ1LdV(00KI;u?4_gc-cjVjo$+QU7#{9Y~@q+MH4n6fH`TtW>N<)%Pov zP<7lO$AyL$Zg9#7W^w+C^cr6;m^3cv26M=zaLAJ+9v*77v%vNdexwgP#W0U&7hdXy z|H+cnQY%^zpi(W?;w=u!Ec>iv*#)MR3@LX0%`oxU_1sUk2z;|@=3hus^V!f0PyTqdM|)ncfE#$FQ(-R@*(9iFVacWi{VR81+0f2>c@Y_$|@RT-k%~`ZpfNv1K)_K(-6{BE%SCgep$Ut}Li` z%H|-b5DMDzg3?=NnV^>~=#>Z(PEdG)9wJg#slf{QWub4Kc+hOv+tkVZB^)w}&UMvL Pbye4l?h!LIJx0Gj#E0E7 literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/__pycache__/_util.cpython-36.pyc b/ascii2img/src/PIL/__pycache__/_util.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3778f68004fd8ef62da25800adac2d6166245e9c GIT binary patch literal 1169 zcmb7D%We}f6tz8%OeaYx1+`Meirs8l3APAT0tt{%RH>|HV@<|RaG1^n+mQ&$iu7k# z^EckI;ulzPuP14fkOf$}57~FlxvzQN@2BD0A9=vCA8GsT*(2C?lQpr9g z`l(mw1bZaVFaNW=lWL~n>lMfaA7u8fyK-VyYgWW8U2Nd_fF0|#vY z@(RSHpe$JsOP35{=^$e+RYuju7Ii6IIxLJdR;zlPQAh1}q9gd^_eo(&rJhae@x|4< z_ZNI-Rdqg{yPh)FKKjFaDzPd9r2?n!fd1zcG=8KpNhBS4%2vg2=VE293i}Zu*YF46 z{~x>ypsb8)Omc_7CySj~p>F|Wyl>qhIBn}J8?kl!0-w8!hI1>8MiAgg!0d8h#(j`| z99X{Rcnl75ENOFW>4Z%J^xHv&8X+8Oj0>mG4i_mS6qdAy&UKY}t+Xs{qvyx>wE6+~ zCCJ@D?n@B!1e7E>6(nbZ3g%Z3mJnA^M36)54uu>^t)<|g8(reJc+jHw8n6cox*!}D zyUmCCn zWBqv`E4xeE<$Nq{VXfx;Y=imiFXp?jK^9@Qb#Ws(cPZyLjhI#F_c;GNE2{QIKLR+7 zmyJnAO^Q9p-JFxvPAdrwTlYd=oizE-OtU%&2R!E^}+jaUGkz$=Ownq Q;Kn8l;nN@qk|+uP0Kg}W*c@fVz`*brh~a<{$Z`PUVh$jY!Vtxf!Whh;$yCK^qGzmU;HSxWi#tBP zEVZaOGe0jrekDT@6HpzP_$858oSd0yRFIdhAK>Yu4^^aBPH", c[o:o+2])[0] + + +def i32be(c, o=0): + return unpack(">I", c[o:o+4])[0] + + +# Output, le = little endian, be = big endian +def o16le(i): + return pack("H", i) + + +def o32be(i): + return pack(">I", i) diff --git a/ascii2img/src/PIL/_imaging.cpython-35m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_imaging.cpython-35m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..389f1aaa33e05b851dcac5454ea6cbd741bd91f1 GIT binary patch literal 357688 zcmeFad3aOR_WyqhMFOIUic%CcV%2~HErJ#mO(#gPKxEK5CZ!Fe(jj(`q9ReKwpO(2 zRjXb#&ULO6R0zdyf+Cp~Aq&N}b2 zhqZ^ZPiWT`m(CfHkzw&R(mK{cEBccrZaUFiJBp4h%WdUZqv7XX)}G3D=uFZjc`$A_ zeU|r@k=^`5UA0VZB&&8EA~*4J6QM+e+!Z_}2Q z348qXQdZ?YoBVi>zPNe6YOKU#Z>uJ9zkUzpX7Qe{I{~g!>C~tHk3Svcv54-Mu3Q{b zwIlB-J1TGE;nYa@%w4e5YWU`x-FCR=>Q76Hw;%EBYL zydH6ma<=tZg_CWgu5wOxhEH&gzkOHFg#BE$3%%~5_{7%hN^4>#mw_3#B(46$rx)n#<;9-rY9pa+~;&#w#>;bHm9TBF+TH(&dR>A zQ|8#_T$g8E;GdZ>(JBptXF;Y_)K>IP`0OkD+?iopFO*$|D{FCHrsd5X;kS)&WM%|M zShr`65080b3dG4V`;8bs!qMrt#Tq@@HgC_}tsSDy5tcL4kx_2le8J9>Cwca*wC!#= ztP2a4S?+z`%G%NMtSxg_>-H(mf?b~(yZGb<5nIH{$#|%vd4%m0cShl@i?GO&8;E=;w*Q2>X}d^D^1I>xF|?;PWbcUW3o; z@cB1<%d) zIegM>Ukr2NOJH9a{A)V?2KI3}-UR#2bj-VN`M}tJXB__k$3Mb{h7EP*XZZPxI{N#M zUkPoc{ovnStlx+CxpDg%HgwLMv*$Y0C;Dg)Vu-}J{owVN%_LJ#&f7oZ! zvA!bp=Yep}1)nMKIT${Nz~@l-90s4^wrK{>rQ_+ep8@-s@Hv9)BVnHhpQFe&^^P8f z@%dxu-0UG(w2pG14UpSdqH&Yeuhr^5a;IzAotXTZk?A3rhk`f^~)3|)s`xW=&S=r{!Xv*@^<_6@Y>dp45YWbm`$c$HzJZ?mxZ`qjkGf&ICL&v|gX#<0=< ze6ZKTCk&qpjB^*#@j8R8r{flbp~l6+M#ftkoNE{7F9myp!7hX2%i+^O>`LR@RdD0SPqJ@>{Y}O>JbyFT5y5T|Hu~Xq+c5lgVt3O1F4*4< zpL@v0>+Xf)``~jwu?LKEc>Y0QcMBVR9vX%r$L$e1_bBW)4&!&1yLnpGZB-4o9C!DY zx^-jT{+4qi>x(PT+x<9u+~4)$pA|RX9&Ng8kKcCR+5OOa zXS}#+N_V1Q{#lb(ZQp0@xnErK=gxorcJuZl%l>;_u72G ze)Aqb$M{;F!RS_ z&iY}+MXvtDqn&3g^i)5x%Xdf4AJu2u>wzDyKHl$hU6Wbn5PRl>FL$_t($$ zJ@WX~w|;i`E(d&?^V3&fUSHL4!7D9yKfa%LXWzQ&&13#``Uv}^CEYhxe09QqemcHv z`Mn@8Ld!Ji! z#w+E=?z6k=i+68`Uj2{XZn`fLID5+bpZ)ma3)x%m=-lh$$433(df@)qxBYnaf5z6` zF=F-7OKT22ZEo#1$F|p4=hmE(6FocQ>C)%UeeICxEsuUXBLBfrfeHJ)yXltA|6P0A zm(`oMHSTfe6L&qlu47jAIT!hVS^dG~hp+IxT)lbjuNT*x{{HiKOdB_M?$(93cwbxk z(~G-Zu*ac0^}X@Y{DXdb^+r!a#nTJ!efp28Ki96D{8_^{Cm;04&#O8LT2`!?b?&T^ z%l>MLzEHMs-Q_C}n()Dw-N#Qpd#}Sk{rJFHS&zVVAO7>28IMd^+?v=l<@WtA&0JE^ za^aV2cE0edo?_C z-LxYgef+4~pL}iY(V;ybns{BYZ~YUS-uYqY$Ng_+E-F}CQL*>A7q5ErlF7f#dHJb3 zdY`^`)+PN#Pi**c=lu_8db;G6f4}z5i`xdCm|bH4Ghxb{Csj(yFSH_2mL^xz4XyngTAH{7vmWb>y7PIzkN+KZoc%?js3IAfBiRm!{Uq9R?Ny+@%TIE6h2t8^o?B)+NHSq_``oaI&jZV(T5&7 zqxPXut8TsO;k&L`3T$kK`-{8JiaxT>l7C!wL&e;W&lo@D{k^`}^@9f&J#hc%th`UB zWG;HpUby-68|Q4gX^&%i+{Zn%V-r=<`Honq*$4>5t{^zpC_de^Z`wQNB@6r1X zTb*}M;h(i%|Fv+R6}wMa`SPLfTy@NGw>RE2YPWrF-*EnKzwULxzYluy`OB_({NcVe z-@RPwsIGbNlp`;CXw&Ai9=mx_@XrJGpF4Nd;V=HrqYMAM{>^909(`@|vtIje7mYh1 z_bdA^Qx3dq)h*8+?1+EWljZy8F*VOG-0||#(N%M=KIp@2+Lnw>_v`S7VU z>1j`sFFS}2m!2Ldx8e8~Y5Ye(f`&_H=9uAis>cuS-<&3$f2Aq6&-NHz2j>vOrN1l9 zeGg1izZ=u|PfJq{ucq<;Jx%#+*?su*zY7&QTzMAnJbb?9?=n2UI!*lJGr@4>^KBZP z32FR$(v;ieH06_%rW_tfQ@?>U<=K=bU(3_ncX1m2Ynu4+r|BOir%C@BsITG5^P@EF zu_H~r-<75x=t!d{V!)fvh3%SGQYb@~L;_A*cI=Ch@T={HBqyJbM z|K(}Q?f5i2FHL^erSTsPnHnx%-=}FuZ>Gub>NM@^iZuRX)1>p{H2u}@Y09lIP5V72 zO?q5=4xisM)1>n{+wk@1OVf|x8ticO9!bOh0quP_|4-7~_oy`Wh|mAS=`2l?uc9>l z$;>qE@xwIbe@UA3*QLqtD{1QYmNeygXPWs~dz!etD^35oTbgoPlSb#7H06*7`EtTX zZbfPQKT8vbr=>~HDQWx*)3leH)A(PRraTux!Y9kbBLkh`;^#l3hv%24Dd%^=ABMKS zZFlZAe7pO1n)I(slm0bn;xI?G>v2}!>o5?&wuw^kxk~3aD|QiF2;04s`I#y`8gYD+r~Kd6{znln+y~1!%Nnew_r%1v!R6>5rp0iqKioo4&d5XcIz9JM`d34_ zA&(rS@B5K~lpd{SS$~eB`<|)Ghu@Q3 zG*R<`yR;5;%W8X!%AxNA&8O?+S_9C(sr%9*IGAdiyOZW&T5NuZxJC8leOTYOhIj_F zJEe2C7T!glwtS>BfD6m8@fz;gS=v8(pH7dB{FhU{qPXY{+jZ)vW#v%%V^oj4E|~{z zc;B4Sx@7qM=~t`gafr7C`o2e#zDvbF-27n8=Mz7l(&ME?a!$|l;HK_N zad-&%zd&&q&C)t|QDgp)%AxxnT|O5>+~Bqb;zj8^uM=2C>3o;UCv>OQsn_mSGsNvK z)&wh3t>e>4{9bA=ZhRpC8?Jrh_7>?ozts2rOUqfSp;+*~&iys#__x70h5A;F*5`OQ z5dsPQ`zTKK)ACj)wIgS>)`=4@AEo^xN9pp%cQLqq1s~LRl75b&mh~9KIqLgoYyV@3 zpFs8K_(3O}-{t;B`5g#o;RN|#L-pmS7bYCHS5tl?R4^c`whHcNDzpy2Uwn)6wOZ%v zUr>LzZKpU4P1NZ;LSt(y)q8kn&CB#<)(({Zj&F7PIbY|}eLLtS45xE4blO-B-ivg4 zPA2^(YF`7VXkMy!)?XAS*0ow+*BZR8AGHU8((_rV8Fd?V{s6%>z)5 zxV=C;ME%J*8e2zFKk21U|LAZ9Rr%*PyQ3BJR=lu&`i|UOmW-2 zzZRg|S{;<0oIA7*^Hm&I)NfE&Thplg!*A()L0GD70rit18fWJc|CIWx7>%bN5znCh zFtk+bd_eqGiXSKS+uR>cp!DR>{DJk4s4JokCOk6a5-`>jqg{`1rw=WLO*K%N67ytDmRPzu^)(kN9{4k zuG8}_rE@RxcjCeYY%dV+<@R;7uE*C&=QNIUF%MZs^&X{qUqb$eQ~M3kc;RGD@f^$5 z={b?|wHuYQ|8~vsJ0-Y%M)}S8LML#u#@2gOK7N|dK=RaPr*`4IUhCXIycaH4?Q4wY zR}lY_bQ}w`KKECDP&|aDXnzVj>lgBm(11Cc(z%Mp!DzYG*`M@Zq4Eh)e-7DK+c8w0 z7L{in@fM1!7=7u3`-dR(lQ<7?(>#jfa4#xnH+DF%;d(c2Hk!|O)42anXt%f>MeV|| zpHAoJ8e0caxkahmU|OZN^EjOgbvXoymr=etsNVHi_%0c>Q)iVia*r;p}84-Z)2JOqMSnhzo+CP_Jr75riHnFmvS7wq4_1`-%j=7qPM1v9&Yh*P?mOT;e|B12kToNbM+}bS!Fj^T_`ZirWayAGn{t zg~}&P>q2uW{SQ)mkNl{Gw^6yBN%i8T`SXpWe+dL0rr)CH5w6G2s6UTUf8Iv^GeH*p zBjdDi2c`c|(#d&3^F8UlyR*(3U0{=_-F-~yckHA=EtTiv)b9FdTzHA}tEeB2hPC?TGLBaGOKzE_8!V$h8_<-%)uw{;By~O3wq7&H-9KxtsjG;D-6_CVfbr+AgB{ z>K>zY)=~Oj;e36hc|N75o%*YsA2mOnboQiiIYx0io%qd^&H?HNP9vVl^MpDr%=cZw z^*&eYuOa{MccuD$P$!UvbE}Zbt^0B9kKcL3?F~w2-*1}F*4XNxd_{0U3ARJY|2XQ$ zBJjT(aQmJ3M-=C7YVQlwS@>Ql-8WpUb#|ljxsK{RO6wjck^di{hvn~lMGL=0d`B9; zLceK&o1mYHJjhtly~Jb!^uDT%HrCUk%gvOWl}dr~WEL{S`H9Yb}+3>_M&5 zOZxjjN2=0)q~`llI=|)iPWR>YoKX}fIa{>A3*>(vwJ!(FbLJ3#7-UgDEY`7qwLl7IoTT$2rKf}X zE4W;3ukWq(qsQoY_OU;YM^wL)iSI-C?Ov{LNW*}&3z%3w?j3c$D7n_*q~nDDLWSGe z6u9dt9{gfm+o|aJvi;e`^HYz>7j1Unn615iJGq<|CcB} zyJ`M#H1QoNJsmXfDkc6I#bMt)Iw8Ei^at_Ky_!QcscjaRDn0l`0@$Fs)z(Dy>!;@( zDhBIgns2yi9rzaVKa}#-P4kC1-Jl-wh4cTInE!vz{eVN);|0|4_MrJsl-_szNH;!_ z>M^HQmk%w&S@%)Ab<^|Few3c8Nhe0-b2@Qcf5rSdPu2OooYFasbfUB_1mUN)8>v5W zX6tl*PduOIQBmrzzJYd&+a)yKg{hpOd)J%Kx1y%5*4NNjUf<~RS-z^;sz%GV9Cntk zWXXJAWuQK=qN<@WP`_k;VRcVQ5s{25S67`Au)M2%1x;1el_!>0 zH=$Kn9%^W+4)_)XR)JMoSG&SDr@pRcaRWH}8cl@fz+PHgRZ&+N&|Z!8RSM?Uukd-x z>l*?~nnIWw@9Kri&J0vEDp?=qredY9BDm7Gyu7N~Dyb=70oN4;mX|kGH|Ey|YRmBw z-vY?a;>P->ibi%>Tz+=I>zxm`EpD#xsWcbY*Vok}sIT`e4m5&4CV?d9RMl24tqsB5 z0`<(i<<)`4#z0X3b^!q~*T$t@eW7=C!Rp39gOSDj+RDYc^z@nh26^A=>VopxN~@u< zzM>|?nuT?>X9wyVOKQE<uiklnj12yH~P*7J_tujE>wm5KBQ=qmY;42IUDprC6 zRglV7g}#?}b<%52c>`Adoa(yrMqhqIQC$;883jmw1BqfC6jleyReeAOEm<83==z~T zT~c3O+pxT@z9#ij6%*IR1wqRE|l*%^?_uCkgs>Ox4bdvn^Rp5;ZnZ+j{L{?l~ zT@`8=(g0K#tgEjyuPdl(tSL`M174M1pR7_PTvt__40Z&IpoYt9S3p^FBLV2Gt6seV zs@*`PRkbNDCskDjOr|44)lFe}MG&j5sEXPn9a71q26Ew|!o#QYjiBfY3hJ7%(3%>n z;f@dqbi^*0W=0$?7zJ<*?tCQ;i<_1;YM_G&dlw2P$`9P8u&%nUz5y;GWVA~-EP#fP zY#+tTmqQsX4%G+BlVuG)MOF2U$(8_#E~suw_5e$38-nHaq50(vNtL}Ks{lXt(w$O zeW)IYOx1>=8ykvsMM8B$U{PITd1GMukvV)X4RZ4Yn3c5WK;v0b7b>W0Y^+N*UWBEA z<&BFl;Yq3T+Ld#vs*Q}C&{SUAh`li-(2I>|sHZV0yDVJ3ydjX3gt`f&N)|VVu=l1* z3+wBWjkd5ZG*tMyJJ;DShZ;yKQvWi)97dz&q>OflF#!f`>>{b_@xq9eyb{t;y{Nph zs=Rt`J?sokJcCWTyk4HsO<+M?)ldy+G#@e%s9siImz19$s9%vRC{*Oc6;ua?GMrx> z3YHhv)j*wA!5EorhS1)rNN{|{-oBu`vZNO30%jA1FlewEDoj)Bsk{gl)h`DfU&&sGNroWkQWBzLJG{ ze4zn{tP~gBdulg2p%L_%sxxYsU!JUHtvbJ|p{BgCBFKe66e2A}Mq^_lL-LT>@*12v zkqrfEM7+LAkF>t!b+wJY#z1qUue?FcMxYdUQbt{G>LdlaEt_W<8DvLlFSO>ae^x)KFYIj6d`%!}`yyTAq#% ztK$hY59^QlOnYKjr6tgXm!7j~*o#W5mf`9D?cA`MIC))G)z~oXh2DzFG<^6hc`KTS zy~(2T;S&vfSpUTS=>~c?$nYM<>^k9Evp$;4fwDLfWR8oANa8T^UFiY zend?NbsK=_<2ew46@f-ylX%of1}3+FWCSxvh9ZMx3^GUt8G~e;B!LbPv!$iP45SsO z(uNg~u%_pv9|UoT|~?vmV``d&lW1pxQbd@pL~5 zeKXEBu)^udQhU#V=bG|lXP4}J`1VkHzv+Z2OjqhXK?Vg|`5{Ttvc8P9C0lc&BD zOM~vt(|!H?s-6Ol53I(?wmMd0QL+>%ko2W0!r++?pR=InSI=2IU!)O5PagRs-JC?Q zG^+yD$!S%JHfIQWc6hL@u3Mp2BXraAErMtDa+uratoBo6B;Lo+L4^XrCY&g|Ay|2JkngOOY6lPEzP(3aQK;bSk&R&Y8sr>Ryy;KR79 zp8mb77c|u@3)I6zY-mMhF+Pf_XKlDz8(0Cgm4F+H@o|kV;z#}DQ$5#{j$bI8KnT|p zVA=|ghz+nDu{?xx)8%SCBG8O0PgJFPa8Jz&&sjWm^;PG#e0jqN8aEv7bn8V^vbrt8N{Shq0>ii(KWnc#5>ayv8w zCaxaCz4d_*JUDR7nx~eAD*t{Fgh@et-KvJ6r#SNxs*d`)rlF}kC0-?bI%I)wg*l{a zt(rg$J`J7KP*>k*Ro0iU%2PiNpI*OWSvehA4QIhgSiY&WpmDMa&fKBbvX-x^#|MSw zb)i7*5i_ji6{^Mfe4xzBSVTP8uzWPTBc4kHq|ey^PNqTXoV375eeZ$ zr)C9;#CKK`G(%WX(aCEHDQ#aPE;c7i1(&E(ucQJ@g(z34*LvyF^2$oQ0Y1m5)oXo| zDtrL)h3a9c4~iZi8j>xmVxnrd{^;^ZDla{J)bn(?yz_N9~!mwD@1Z($=K3FDbfrDE5^WpIBVF*gW>-mwG+* zcuA!f4q#QHx>_LB)hRDZg?>GQ%~wA?!BOrJrKXV_v$U(xG?UlnCWnnA%9jkT8wUN& zP2Hb!nY?4}5vd5gW{7kF$_Lh@o&nKF$p%=$AN!D$GB~-g@NXdBs;XTMFCYTE$2qu< zjba#$p(n-j$fx_*;=SRpSTEH;H(Cy_h|dKzZc!wCY+#$tlXLr?ATRADtP zwkG9HgcRwg6+EdjnR4Nr>ZXQdM>#YB&f4x66jxw%7!Gm?jgA2xJ61Fyrf@XdfbCVvqx9O*aW`X{}$Ry$4b z{WrdhM{6Yf`rb_adw%&B`6^HRf#-13@5{|2eI=5S>g;Is6aDy}w&Yb>1ApS3_zE}x zTho#7JB~BeKcu*gAzf|ZPxKs02lJ8OHwv!STPEFMC>?lSrwxB`?*IGu|4QKhuM*Jl zw1@gXb^5zbO?y_sH%~@c9$>iPoqmMxIN|q+o$&d5`@bPDGp!}b^P{W->3Tn$zv7B( z;F~97EI+Y-DBEVOB)f4U>W{Y0CVPBU6?`*k2kSzz_5DYt+FYXH$IqG%((ean?j>&Rae#7Q{=q8U9&Lhuu~2h|;9>gzlv#qaj#KdVbG433 z@B!5q!2fF&oOSX9Ur67VbPFEK&^?n!aMtk(e(ZTVJ!OJ-Q@;FyvrbU(M~~GyA;DRv zS#Z_~3;qP@v3(=It1r_wNr2h{)YzGB7(C{ zm*AYQZo&Pe(<3$b!9aF5xkppvIJ)xr{EFNaS3kyrSp{|IP2sIei!Mu1^1GUM{w5h3eN4lOz;lU z@e9s6LBYBI2?@?R&4RN|Sn!{yUu_jUO5;U`;H=XrIFA<*!5vOLE_VseI^BYg@alT+ z5j;9Z>qG_T^6V9y+i9QR+)n!iXPubf+)m?yb2}XnoOK2T=XPrCnHv9nRPQ#yS;rwb zx6>@axt%%%XC0T|+)i@@=XRPWIP16t=X&%Ap0iE2FR$RNQzrQL6o-Dn-J}x~oOMEi zbGv93oZCfMaMo!RoZCf*;M^`c1!tXz;M^{{1m||qEjX7$kKn8y6}+3ur&n+;hd#l% zUGxji?II>P>%;};b}=A0w~Il+IsMjNsqxS8Y!jU0*&#UVWC_mk>=c~i*(EsVD@SmS z=RCnVp5218jz@5gAFtpXKV^cmj$d$&pP=9zKOw>SzRiMjzQTg*H9^a26`XZC1n2Va z6r6P;g0oJS;GExX!C9wAa4v_a;2ej&f;&g*@uE*~*6A0V%O@r{|6Yx_;5<$Z2+lf# zf_KyZW3wiuiGRVj(7J>}@Epolmf-B~6r9_aOYj)!T>o7&i-D( zS-(th=P0e?7o5`{6#PRPFG7NI`7{g8{$asczg2K9pANy&FG>`Wg_N{Rai-{91db#{U52%O*Jc zI|OI_EW!O0KTg3p4qbxtc#$Kxo6?gfIG2xGaMtk%&N^PfIbUUhvyNZzFr_CfIFIA4 zX?UmLkrMq*DIz%QbP4_xtxNX^K0rEA!C9wQ@GbLnyXY6(Jx`}6COGTF1&>mC1_kdR z9c!P|xMCff;K}$AJVrWB!P(!HhUW?Hr{6c=7MyiFg1<=lDihpYs>{bOIO_xjf0cBa z1rL!*)KJISjQ$f=Qm4mZeLEpS;r+f$8($ozt{PEhbMq|+>Tlyt&^vrenvJCjbQ;1-p0L~z#W5}f0?M{thksNk&AD>%n< zzu+9tF~M0UE;z^Ypx_+O*5owtBlzR=T$v?!4z&xX;JhB?O2hL6=XT*1oOL{cbA6Qw zo{S&CStls?ZX7>?C*wzO9$#A1@J_)wUlGAsr%UiGN>7jA+}@*tvrezz+}`^I=k^{G zoOR-Yb9)~YoZGv#e`@@&j!p37_$9bS?bIna>$n6@j$eYiNyjZX>v#m`c3LJlw^P61 ztP>QR+iA1l+)l%Svrenv+)g_M=XM$qoOQYce~Q{^kKo)+qk{7~TW=cPFF40@OmNnT z3w}9|UxJ5dT(+`P>?7f!)h$0hiIq?0E&*SlMA*6|4LBAqh9x!(PP zvrbU((+c!+ZnNNA?_t4Nr&aJ@X`bIHIM;hba9+>sO2c~u=YAt9IP3HZK9$O+UvQou z#sp`bxZu-CXHamCL+gOl_+cHJ;H?ygS%R~UQ*hRC3C{JECwMY`1ZN$O;IlY>1W(3~ z;H(oA{12-4X2Fy3BltFceowr zCoVYmtAm1b`B(?0#t*O0+tTnX!MR;H1!ojVYQr1$2{f^+$V1?P3<)-=3RaBg1_!C9wEa9-!^5j+Qf@hWUl!C9wQ@MF3E5qyAj zVuG_yT<{|9e+1`zSqG)Y53k4C((o+7S;r|j>$n6zp5sSw&X-$o*6|2_0_l_q>+<>MBdzX#<>!^;F`9lzlGJ*Z$B z-Yj^S;wK_Fug`a-;XQ);|4aRb;H=XtIKRK>7u^4`)`-0nfXPqv=uOyuw!Tn!oov7ff(<^u<>GTWk#Xm3tTTF1) zi3|Qu(is%Ik94f5sqw=)HoPe z9>3tM6BPVDN>8)kv9EQ$!h*9-tKi+F(PE7E3Xg(iL!v_WTQu$a1r^XNK*aYYIaan?Qkd9OEXCC^)wZ>yXs=;rD~KG(1aijzg#5tm6`#-!tY3&T;4# zoYy}+X?U67F)C-j;H(oAoZo*n3*NVx;zw}SX%+lA?tcW&`Bv*h1ZSNt!FxG=1ou*U zqJpzdui$;8(=Ryxy@HtFtP>YJxo#{t|2;|T(A4;09h>0&l%6cX`R_701!o|Yf4Y2;QV(*B7(C{ zm*C%#PLJSRK2gD0r&n-Zm+lwbN#lD=aMpyVv-=lra7B7(C{m*D(9w@2{MuUaQ6IP3HZK917UFL(#_8!^FICoXvMdl!Ny z`=6XN@gw+dl%6cX`R~9u1?Tj*1mBBv@&xC+}lF{aC-?9EUN% zStl-d3Dx_c;2ek6^wjua9h>0%{gy1jIS!qI^Zd;vIFHwPg7b5eTX5F#2+q$m z;W5EkCoVWY7Yqu{&jr@usqw=)Ho^J1AWLvgk5h2gai!sTf^++F3(h(o!TGtMOmH5T z{erVjQ1AuRzM2J3j$eYaPOIQ2kxr-J$?;2Y*69+QpHq4S=jW8D;H=XtI6tTK3(n6e zF~M0UE;v7@3<}QADb|cM@gq1tr(_Av&nZs9IXy1HljE1*$?;2Y*6|3Q9KQrlj$eYa zPEhdV_$7F9{1TjXS_S9tYjp~q9KQtT@BehA;XQ(L`-%$AI=zDP_qF;3kI=j&COGTF z1?TT;4GPZf)S8(ZKdfUDoWHM?B{!S+|BbJ!C9wE@JiC@5j;dXQNdZKSMVU|^a~y#otWUP z6BqnS{@$SAeWYU@ks3ez{U}=+o+UWXTbzQkj!SU(O5!~^I)`B$m2LOM>tS;r+fe=jIcaO+QV;}QH^N>7>K ze$w#^&N@NC%V>SRS@0<7gav1vR>3c%^mGc|M>-L~S*J_zHqz-4JVrWE!C9wQ@Z|Rf z1^50%@gq3v#0CF~-pdaP9wi-XR+{(`{4$Oo!E?6h^f(3Q^tc4Snso96kC2XAaMtk% z&fkYD6TF*r{DSlM4})oVv*6rsgav1vR>5!J_z^rx>4^x=I$eU_%<&`m0O>>pXPsWb zZzr98!JXSFegtQoxZrn_&Y<8Oq+=bG8b7RK6Z}Ea$r7A@pR-eN)^Q2`80q8*9-`k1 z?G~JMJc2((I%R^#NXIWY>jVXVj&zy@A0VBu;H=Xs_$#E-DY%tE>xY7~PM6?skWP=_ zVbX~T&N{tiIKO>zi!L5-xJx;+nJubn& zA)P$I9i-zHoOL{c^Y@?21b32-UvSn53jRH%r&;g_>4XJmomRp5d(@qRJ2NSM1ZSNt z!GEFj^a!3qI#Iz{r&sVlNT*-$KGKN^&N^|yN37B59~3-9?_sTDQsal`OSUvTOK=B$ zAHXR%&vRU9c%I;_;})F1kL^jr%LHc~zu=s&py0{*kKk^auZ9KZ^t1}jI-P>EPDF4n zpDw{!r$=xH&z}Y7eDw-GhU&dv@DS;^k4vrhj{S9@{b7~A^*7GPV%?SNzL!= z5yst>>`vtd(bvy(Gcawiu z@KNO7DtLFH){h9jH^pa{;Lau5KPvb*((e_#dl&5=6MPTyj|=Xm^jMzM^8cKE-u;53Mf2-h*v06VO_;KXl zC3xsq?H?7~L;k&j56ss7F~Jv;e_U|)3EJN(NiF|V$loS-_!#Z)6ugrBU4q9lwZB{N zI`a1jJ}^T2`vtFEK=Chl>;UZ_7QEc8{aXdMrfUC);HxM-U4lC(JyF3gB>!H){TW(6 zCU^(=#|3v#d0O*Q%fFNSZG!i~-%G*GDR_kZU4rKvt^M7C-%0)+!TsCxc;^@VKKgwH zLBV6>9~S&U(r*aV6 z|4Z_>2_F7k>pKPih5TKDJGlG>&zM8~kKi3g>Gb#o-=EUh0A zd@A{O3GN{OsNi|z-z#`Wp4N{EUPS(J!3U0{@-Iy-|M}!^6WmMwPQgzlf0y8WM`(Sw z;48`BBe<9R{ep+dKPY(LOsyXlyp8-@1^1GFMDQ!fzf17G8CpLo`1R!9E4Y*VV}f^) ze_Zg;;Z*+fQ_KG`^0x`zH(mQX1%HP8U4r|`-!1s-wJ^2(%gNs+c+T$H-zj(<`MU&n(EQdf_)K~p2@38!S?h-dpF;kv zf``hqf4|_(l%4^>!{fDojyE;G-Sphsd_pQ;PdXif_mPfgQL2B0;yY_`D(@hj9KkIr z&$!@RUOh`vb^b{@eS&vWdTdKm{rNe+Rd9Y@?G&7!^Lbr?|1R6zRQ?`XZ(#19uglXf z_!C^ef=5fKeg*#@u3y1p$7}zH;4hGWm*9T#j|$#P{=I_d%+vZY!TEVPE_m|!_oUQv zexLMhg8P?geW&1`lfO%Fce(a=3;sR%djt%yDN2iVuDX4|G40sU#l#&{Er}io8azht?v}Pko;YOhnuy( zTW~M=djxj}w7*~Qa`F!fK0y9q!OtT9R>5Oyw0=bJ3&_7q@Yr(g9~Jyc^6wQqv_kvG z1iy*=H7tLgZzVnJFB#Q zSnyBCzg6%U`9}o*p8UH651py?qk?ZE|6aj!R%-v4;A46HP4LLs+TS`Qwfy(s^*6!8 zr0*1bGOxc0K0x|z!4Kp0H^I9v(&_OFK8yT=f=Bn${$at7BmY*xLzA_CMDPXV-zB)a zMEget_mh9G;8BnEj|pBw{&B(mEC1P_tFQ}Ewr>-4w;&mn)e;0f~g2tGjT?S8@cruDR-;5oehCipmB ze-k`R>p2m@7v}5qcM0zBQuzyhDwn_DZYqE4^wjeFi{9_p1n)jg>t_kxb-YfGU+^7> z2L+Fwp>@K7??nEsf``dJBKYp)-z9jI(is(eAM)=N+|BtqBefi|$v;Q%4xdhcTyW0+ zpx_qWFXBtpzo?YzQSiPRt=}Vf4z2TB{#2a~(yDdK~4c<>s%~`n`f%bbY_z zTz}zZsX8yy`bMkZ(e;#m!T09=Q*g(H+CM7zWb*G7yqo;9DpJ#P2>Is--rb`07uf}g_a6x`dc?;8``PyTVi`!3P`Rv=J#3Pa)p#Sbzm*9?rH18I?W2)vog7+P*c~o#W>GujAIZ*re37#`e z^M1j@M`#`s-0jjlF1VBQ2Lun1|DfPGxmw4nNv)S_=>P9n^nIQkU^=S50juYwHiM6) zsVeRq2H(-(Sq6X9;7)^g>Z(;|T?T*3@Xs;$z6Q@TxYOVsgJ&DuYjB-&eX`8p2O9o< zgP&)lGidPp4Bl+;*@jNo;BJF=82m(ocN)CX;9Ul%rEqn&+u#j`e~-ZrG13_|_*%oi z*Wl|6-e>TO4IVRiyTRQQZ+OdV;YXOxWw~{!j|SUFj^#8sMW(vKWpF){)IvE1A4S@@ z%QHB}E^lswuwgHJSgufg{;c%Q-dGI+ni zCmB3u@VyNlH~2mVA29fS1|Kx|WP@AzLvg#m!EFXV$lwlxy9}OX@F@m&8hon3T?Rkc z;5i0A#Nc@bKh)rEgCAyakHM!I+-vY0gO?dR*WiAGPd9kb;D;MLWbhdVZ#MW$gNF@% zguz=4ex$)W44!B3PJ_=fc*NjG8NAEjM;pA`;Kvxe$Kb~rJZkXc4Bl(-e1rEHyujf7 z1}`*t%-}@^j~l$$-~$GqWAH(P&o#JJFckkDgWC*VVsMAS=NUZ9;Kv)>Y4B2my9_?x z;5i0gVDLPHFEqH@;9i4!41R*ay#`-o@G^rhHn`v5OAH<~_)>$141SWqn+;xO@UX#8 zHh8PSPce9h!A~`Kr@>D%c*NkR8@$WlXBfQO;68)*7~F60sKLt(-fQq>2JbU?g~9s` z9x!;!;L8mjH~0#J4;VaX@IixD8QdxyivKeWZZr5wgF6gfZSX9E*BIPs@LGer3|?pO z9D|1po@em04DL2~y}>;OZ#1~q;7tZEGx*sC_Zxhb!Gi{GHh9S3s}0_4@N*0vHu$*) zZ#DRN2JbNV8iRKl{CtB)3?4Rkm%%SEc(=hXG^;#Qg?5LscSReg{)w=%$D)l>{zORGBha>??N|2iko4dfw7tsSg7#Rn-OApC z_Ks-hDEo7?$D!?1_D5*%gtkN3Z==04+Lp3kMca<{z%~E}Jcl+;?GrI&KZ!O@=@Wg* zei&_>$|s`Az6Wib!Y8_weJk2Hbx%Z;eLdPZWlwY{`%1KNs-6fd`x3Nqik=85`$DvF zYM$^b`y8}!N}lj4yB=+viYMI4J`-)6f+up6y$o%fdMBL9J_T)@awi{?1_QDF#iQ;JJF6Q`zW;cL%UDe)6t%cc2wC@(cT~JZe>qKI~(nYviC$AgEP^g z>|N155bdzC$D)l>^F&D5BhYrC?N|2ii@=_OwpZC((4LC6TiKh?#;JEAN7Nwje)o#<2c!)W6aIuTX&J!s?9 zInk}`ThYcTb0VVb>(R!ka-u`oSE7wm=b(*K;e=P& z^=RW1IN?_InP}tGH<6?4WoYA+H{n$FDQM3|+o9}5Xyep3VJUka+BoG+4E&+$A8j|< zF=Zcxc0SsD%ASsP0oqYzPer>B?QUgHMjNNNiHNfIM7tR64rT9(_8hds${ve0PGu7z zWsgAHgSKDUzn=hh3EEy|Z$Wz=+HPfULK~;5i5z8rj&>>9PGx_D_I$J*%6=Q|1!!B! zeiiM7Xb=3Z>K|>Kf+k|heiCh*dM5gm{V>`%eQ8u(B^f8>eK6 zkg_jC8>eCkzp~Fk8>e6iud?gW#;I4rt?V<=#wk}KN7>8J#;I1qsq9nGUW2wn*?X2| zTgyAZR-0$T?6%d})>6-gQ5V48Gi%V(_EqCVm@-T~UQZczI(>U=`C;~b*DL?ipT}9k zkPX+D;B^~j7ATo1+u(Z7v)e{`+6Fw&#*g!4yySUnTVoaoUO|H6P%xcdc=j03v6`lN z*3GVi3m|2Xo^hV`*$*$ww&Js)hT!yZF|~J za(F5V#(OFjWqIrmJ_r8bWu$-Iw+>JHTu14KolZJ=B;;eKO&;9M+^lx9)vn#^+8)X) zZFlG7M&qwStAROGmR7=Rp$sa@Mq2IOtoG3O+-RZ;JUD-z_O)<+=0l*C`*va<7;!}T z!TH2is2IwJ(yM58B=(2kwC`)-^@)?9qo(tVJ#Bw@+O~pZ7bXx=U+HPjJOIZ_Pg_y8 zEjQ}fup~S4<)Z9NESC7UkQSKt8J@N>N1GSwr!?DE z={bCyl4=?UIdq)*{PK?6=;klu7jI48U*G%tx$53ie?+mFcTFj zPZp#H=bOp;*4IBXbp7!|*Y|tW^^h#Me*gdN`pbr{-*M>rPIY~ry8KI(WOthTpFVW` zYf#Qm9!Em@%kcV_-8lEcy%YB@yRm4Y8b;lUXV+O7sriBO`F?pvN<6t#9(TX+^lU4o zZnCg$O0yxwx2N zl)yIcBu{%|b{5px3|(j7^@5Ar1Eeb!fAbftx0HAvil3q-Y2v5t^Y}(6e7N~^Py4yh zI%Z_Y4}h;Z0@x4A;rh8$4yh3{7VZua1NZ$pev-Ox7&EpMZV1u3d*f+v)rOhB7OR`O zhAS9bDU?nomX0GnQzgK@ekXX)xZpg9WtdRgTM`*i6B}l?VgVfv1qKCVU%v@q`)S!W z&jydHIQNy}+_ydLiycs05Y$k1r5mnSSL=SlzHz#J<2f16er?Oxw&58I9sw@cwtX## zFWlOeYu{Ku0?v*c_Uu`ia2h`6j2iy54NmOl!{bVOyVl;;wt5_#vK84k z7L0+*i!xp++Hld(-Sh1W2ineZfXi5P*)grlcsvbKXYQ2$Y|NIQ5zpVyg);dU4C0-N z>y)~0WsO|0IDQ|84sHn~3Z1ZMw?}L?xVLVBP@qQS_r=I>i zgxWVnDrnsEA!yq3;?AG8Z-@ALGro08vOgM%=Nk)EXgP-qEog3#iuk7xml!foQXp6e zq3w367{cKY!fYJA@>*N{vbAV#LHJwye-u@nx%LFVJRlsHkXm9xk%3>j(o_`vZvwdTJ#@7DC zRG1K`awq#>wxOh-pn6zcpi2A6e8>|-+rtB@9&X@y#Hf??`D!|Ur8=KzR!VTis9E}a zC7rL==gZ)Hd=4CIos{}guEW;XsL#)bRN!c#s!a{;_yeLZJ`tJ$M)4I~wCkFkmVNyt z%7g;MD1}Ob@jbq62^1>T51!Y>YTFPR4FV+tx!ZA~R`F~6z#mj+TGI9ccJYOd(zb6r z?PbpRJ`gBRVnuq|UiPeeezd3U6Rdzz)n4^fp|ma5G(TDB9mTm{ZvI5gTSiUESLJDQ zkF~8puEQD^D~CdABX27@hsT!{Ann-t%Xn`!_IeL)WBfOfaU>_I~xZr zoZaBKbvlGI6hNa3?)RCSqXq_xq5ftUNIVQ&G{1s)_%wd)_e1S#sjjiV^u%T3aVinR zj$hQtoCA#$tLJ((E}ah1T?uv4_GxL`*YRf{XL#-z97`C}@&LEs5onS-R2w*Bzao%Z!Nf&~rp(_=>_&me}O3Y{Pq@xAuVz!J5ue-ha8 z4n(cc$USYvILBXe+)x=0_36o$3H^HhY5Au=Ka?MJe+VnO{~^#?;Ql_oKb-mL&ZhN= z@!Vc@DxMq-H;;#)RbdaUx(&+64{e1GNO4OgT<|3JZ_nV;B&KrFEAR+3pLJlGu3F}O z-$KhY=5LE(uF?xDP{}^^R7gtNK2=TS;;pJy8;d-U7-)Se`XEsuM||7MI{cX5{uM+h9%Xsj zo{#r~;c58~^ump080^qypgh0vv^^KUam)y-q`ep)QC7}_jI<@-T)TICQM((aqw#Iu z!If>FLc5O_Zo&S%yYIa+0`_(Te{)?G6;wS&4{1Z#s zwqmvAx4n*I^LrRdP`Cw-r=A;OKMC>&H-yMlgRmFRJJnCO z`gw@@>4Bf4&VV%yZ!UD{rP*%mOOA;jgY~}dg&gc*W1s_F%6L3}0gmmhcf!wg@e$Bo z>=$1T#~!$y(}o8y=I3}eG-f-Y|H^@B;1gKG@mg4KP@(d?ef^cnttcCY!ZpxKg&b#Q zfVk7U7=F6EMKGuzQiO+akPWS3Mm%>UOdeo11%ZZPH~DMS`mS+46xlVixP6|Moi{X; z9s%win7ZTmk12yv+@2`MvP`ZYDZT?FB~gML*B73QAEat43{*WYLV3RfEe3>*l?_*J zw0({ZRN+Yw9?Om5MqA0^0Tj*Ir>+|u*?1y$Du>uFdqlwz_VxHhdpKclxegAXz0b&l zQi4LVaJay4r9(|Z-eG8`MG$+-PuPmqy^yD}v>xT5pqJWyy%3v6hP|auNoF*@Xus?! zbqKfF5tZInH_CxSxY27z8aKk=SoeEI)0H?_I9o@0o*lHc7G~r|m$wy;@U->wd=l!s zWdQEdexd{1?d$&w*FmNyVN+T6JKSe4OdG__cnmTpM$jaTpe%^=C2&K?4D=%3QW4EP}pN%(3=}=+1|S2`8!{*9Z3)VurGL7C9&mg zz`q;#xz@rF;QuS&Z3cd+wGfv7`V;rVGasg+3{tV&e%Poyh)Z}xUf&0r*rdTnwQBn= zJ0?JY`qxoE9--Q6<`K}`ps`N<3W5kjblVCu$uRjJd zsDily4xWUvvl3Il6T|ZaAU%pauSy{dCoLTRaPTvpO8aJ{={MU)9R_oM3}VPR1SQ6= z3tO^Ya>I&+0eLDV`Fa??u$#+@H-Dxx;f2=gX+Kpx@MOiGgE;Y2EFKS&nfAggSnBn3 zmd=XVFP#T7T$pD-w};au%si~s0$FJL^#W|iP)!FxE}+U(I_jJdsykf`Gi(gi`@vy; z%a`Y$1#w)G@ojN#H20N!)mAp!X?!Vk=}YY!CqPg~bAR1ppZeSu`^nF4v6n$sw%8Bp zgN8FsHyl{#d8_UHdF`1|ck2wBr=k#-NpRs{?G7cdf&fi&-OCxJv%YD%%hP^n&J65j zi*X^LQFXI3)RfWF7Pq(Dhj~}MEl#M1##czfe;@;=WxMQ`6k?pU%!Z$sg$H1OE6)9H z^O$71OWQu1*M3aSybX{L#NWE3E?j>9NF^B+Fm>KWQpY`q9w-PlfX5CO* zGhdz#)2-XFfwe#<15f^=AT3Y^2l!#C4EL_gcG@p_7Yfea@&^2b6nzJ@8dC%dZa{l< zq1rFI7~3M$H;!O9HW%k^-@HVR`!JEnTF`#TAkKw4Au%v;w?x;L>59amwLP=9pmjzL z79pe<%4}dQELuOCfx~zkIFvv^&Y$(CeLemMUUO1&$Ab3izp_x*&AR7zp_z+$R-NH9 zklF2PuR=HpVB1TZFXr|NC27CxO-Qaxx9{)i_QSOh2pGl?6ch|m$i}??>ufao%q(25 zvatCEXs?*Y!O!_VD&a%7QkhwMCHlOZ^hur`NHnQR4P)uYM?$0Wtb<9Mz2yScIq*a- zQ4eOa|57eZy9~|q___JJ#EIb70r7EH4#dZLY>gBjUqKDD7vd}*`V%--9Se@jI5V1| z!xE|$xz!{3QN9tnRC(jA03dnS&D+XjKCRZR5Li zNW2Ik5nnqRV*{c-84dU#iHV1(n}PY}sqVG&+RytdYjY<|ZdT{0@h3J7I?eBJ1nT+( zdhurU4hA~|sDJ41AiP6vFK{>)ND8v zFN7nAR~Q*!LJgB@e1-KUL`u46YxN=kD*N;J6vz>F+m}OiwP$8~+D~`1M4M}mE*!t6 z3dY4uFv^cE%vy6=>4r*}4na4MF;WUwJ_zf*5GL?c3{iv!u(0(RgbFSV!IXA8z9AU( z>S5T+>P{AyEOaN^hK3VAJ7I3^99XHIJL|MD?ziNH3H(mt?$@T#`qs7>r&~Mnq zJzmv=7=)fvcO?!yh#&hYX0@>ZLPw2i`UyfUC42!(ahQbzJ@D9{8P9~`6zj|Q{wHO9 zIsWEgV7OU|!gt~NW(O8g&Ql-WRRa&WL6%hlPY{|MVVqapl+Sa$W+G>lh z7870pvilf(L@b0Z zpUYDqre#GIKl45AaTG zS^c`i}3W$Aejh?mZbm9L5t(KF6vj~k4=-7%N;jt1jF?~uT3LVnfwoqr=kj%C_Wr(TSR{R@Y z>3EZ0v0gOr2dM`C7#EXBDMm{eV8FyWfm;{Ruy4vyZsj~Ejkwa_WrtX--9>1m0gj0trAw z-@hm!`~#NL{F1D1cFc#;QsqLbbT8jed#CQNz5UexS|QEoKO>&-Wq%dAZf>ry6!;@Z zZS8l-;AEo2uwAFIf*POC^o5xttrISGn*XlSH$zP525jTM+ybXU`IfttWq0R>Zx(c; z=x%0ZWnE3IwjUO0T>*arMf@q31Oq?rKOOk%w%0fVs^JDqVFG6OFr}tr1SCSImJw+D z&YSeQe*A^g&VpXQ>Yt<+#%4MOAbQg}%(H-iSM&Qz#rWVCDi|(P!i8_Sdb5Iyxf%HA zC{ujUR)*UzOcmXv3@+{gf&O(#wP}jpwoHDX_QTSgprF7!M#qW*iCW_#=7z6wIqrZc zC`_WjEaqHl^%xj-*&FV#D;do_WyxV@u7ZR!RxPWfMttxJncNufRUi$nebxB6$Qwmx|CIdrIjKHo?a-Q^AFck9eOkL#U)i zLEG^*mZy~p&2V0MeV%WB7qvMhFMyKo6outyf~jz zSTSplr_WQ|J|zZ_VV)jh!IXTPkIZJkbLZ_0czJr%GSSy>w8WnYLKC1i(?yfCUVKTz7!^CKkz_FN zx!M_}GFI4Kg3!h0Xrkni)(a<0lXbrz3e??wv2VG|jywYPMzag}lk1~I8(AM!w{jPY zw}T%lRj9MoDpo`=`eB*_&=M&QSOFb-;QD$}a8q0_t0Pc$a;Lv(4}75UpU4(xj;yAk zi~6PQM_C#RRCUob2JS7c=qB~?}3AAlOu}<_A0cL6x&VcXJ$4Hq_M;E98 zIjqDCr!V1w8=te#fBdq90q{l4kpD0_Wcw4WVT`wDzg6-I;74#dZzq!QBVk`iDHLt20`o8&W1yAa4?q@EyMOUSZ zUb97|<{VpeR=VgpTjVpR*`n{Ii~eAX%1p5>Iyqf*t1T)tdxV_CCDKJ#N>S5d!XRsP z>8eJ!H2t6p{>v=>KRKog{#}0#zGrF@0WTB*m&lo>tn#aITN6bZAY(4qMJ$@@0BN6{zmx5)kc^!*~ae>iy`%l}C~SKjWjdTg#a4LWrh zUpjvD?$N5qvJE61qs@0pDX`u;+=k0-(5Sjpv{tih0Jvp{Pgdn_7@baNlsc-*Vs)j& z(&F9-Yauy-c`cz_{O0@xN2m3#h>;r$3xNquky1I@Xyc9fL8%-cJoG5w6#H+vPAZFC zy9~e2mKV6?m)i0NO%)eZYNlh6C-UdX4HWA07s#$92{fA5xGWy>EnelF&w`S)G$(lfl38SuvII-B;+ zyrD9(D$IP^_n$`sa4zr`|L^eriFcsWg)TgAw|9Z}7F&L)TmFJAf7sl~g}_^;dl;f0 zX90_HFn`-5T0ZOpoQSlc=*tS;^ap*Cl3tx7hE1U;X9OwYW3z;f!qUogXxhlB%sE8s6~N3v+|n%PSM0TX*Vxk+!E zxqN#ED?0@IOG=XPXKAFt0zWD=Jzr3Fg4B%nrKD>d!lrlMRYa;oO>TwQ{RO9ZE2=WI9g;7b*q!E=rP zl&W0~ea!2q5|Mk!6JRR-8A5eYDN(=lD{Jg47o}eLll#hJ_Lb2^Vu@;){3^1N$XzaS zT8^Qt>gr-=PB9lma9axH!RQiaP97KHwz|%?Tfka z<6qEm+Px%4IdlHZxMc;qSx)|K+U*VB?#vJQ$kZR>%LlIC9>KIUAB%!K_ZnX>7%~C% z64%hUEAKx&T?iO_FqTv_ zG?6(}9`p7 zU;zQFhx8q>BTAXIN+qG#j0VfXup}7~hDTg67)qr|KeP5j3r^p-8C9rxw=7JX`vg*S) zA|_uT^bXZ`j1nVTm2*~jGw^O3AR77L9G!yGv zQ7i+^_4s2qh}QhNScrvtVFFNGJWg5q*sAtO@@sR&C{A1MN9; zBwttMK;RcSxL0`LL=lFQXg*H!LTmPKAP3)t;vYa~`bf;6*%ZCuzdwCj`L7tLg}-hC zp=@m%tBfqG{g%IdredLee@NE*(9&myyG6&@BC+?jBnAQbT;X@0Ims>eq{>x3Hp|$M z51+|*D{Row^1eG3;Abq00F42Zx&wGoD_Q-KHRj(_PsdE<9d3(rsBC`MnzTbC?-m+f z(#;HujVz8VcjkNwGTG`Fs$U+8jVKA+9o)4i5Ph@llkZf0?%dZ_u-b{Z`zKl!Qj=v$ zC;mJakWO?bnp1crsXE`Hq;Zt$u77YTs#EymwnJ0=p{jEkWzgZ!!-PNVHWM+{`ssR= z6Ok{fsNR%yD)iy&NqxA1_nbKbhw_2!9}qtHN0vT}9OlY=N*}I+z#YF&+FQ{7P)mQH zQu@E7`sI2^MSm&!drbvMOkARmt5t@*=3IFc;!%p9tbRLPo)6;r+$>o3(nV7Lj0TFt zq4rhit^A;CXsR#2e2LN>${wh7eFwz7$or7CL|%PU=(=Em0GS!@*zf#IqLy6+XF`@U zAOlR;BOODhe}Dl`ks@` zSEA40tLFup9_Hgl0k-RW41c|nqKum8l`1dP@2>*^>K;h3RG~c|~m4C69#Z$t28Z4Oy@u7zh zPc?@lPt2gqbL0!K!52MaHeL(VvP%Q+iAhoe1Nd`WIzCf7hZ-C1&dssA($e;<+W#7# znFTQ2Y;TkpbCbpguC(lg1eyc|p)R z3x3T^iui3G?T`RP#(HEI2OM6{F)a{}QRAOoR1_Os61%Qg@O|lhjM~!R4DohYPsJ>V zz9&Fkkx$dSa-2-yRox-fxRv-Fk{`Xv^y(45XJzvp?pYRmZqSA>HrUstB$I&g=!bA<8QyVSj>pl$i6A{jZ_|h^L=y4^Mc1L z`iVd1CdAZQ0`4E5UY}4v;u;c^FclW=3$o!pBn|hOUD4_sWYK!OfV^>EH^NICxkMRX z=uUpnbKT(8{XY^+OhSFq{@9LnsypCUF#CP6@ifCi_WZovCUVwpF4g|WXgIQ1r{=Kq zpAknfr}f-_AhZ96EtR|39|8Jzdg^~gtL=Z|S2F(p+W%9}_B?(GaHhupU;4iTzU(&s z7hZD5f8hR4>$(3xX8#W#tX$sn_?E(T^mOCFS}9Gy9){r&$Ok`@7lZD2NB@t-#_m@ApcyW{buPq!B2|>K9l(QxYz#q_q?9^ zf1C7Z>Hqix_rLX-9{IN*v;QmpOaHIJf8ECadrmIU@$WkD_MOrwE)9JV`}#bX_RRUfcDz6h1TTi)V7R!yfDlF%UO_ z8ga%>!DOR(uUHjLdk(Vu=yV%P;I$2pHiWN#^bot>Ic>?!`wgUI6C4;SZz3Fb&<*`T z5bI)n&k++*OuDTZi%PQu4<_#^kH$B#M8<#7bx2M`;<#YZS|ezX*y!Teb*yZ?Z%($o zb<9or86S8MC-yH2KJg=tV(?fmPg+03-1E36r{nIFKVuI02lvtR{Y_7MauU~Dmxq4L z)em!jMaKO@+>cG)cRaxT@YFq#PCqxM`6)qpbq0N>ir>?dVB5gPM)M1#0}`{&qLYvA z$3Lb~P}y#3cL+)*DwS>Af;|PUaisWDd(zQPyXe=XV(Dke-SfnlHh*zd<(I;K%-jm1!+YfK}v~dSjYzn~EuWTqvvf_fuZ#z>7|+^>I(z1K z@F2LGA$}e!2AvH@vHR({;oy}s3ka=`;LHsXHh2x59aZ#PkRm-`L`vmE4&nwOc`+m} zhPu5tkQhtFnu?vK@J@zASBKWbCgGp7n=@m%Ikk}wZ#)9dyoctKaf3)_cx6rOCq*^U z4eEVrE+~26Nam|1M6MJ` z-WwJs(Jj5_Jr19qZ}p6%&f4jRkv%USn2W}~FMgAoV|>KWEXthbTh(EeO~j<65g|5@ zXp`^Ls@eA#_0V~jZ50;0S6L?|Hco`hOgL<@aF{OZC^jovM{#7Q6( z6PxZL%NzULvPZDU2D;_`=(3s?Z>}7<6RcVkekV~zbql+u8ZeUQWs`a040+B%UoSi4 zM1hR|1qR(yeBqD#GxU@C>`zEdH+`0GB`*A#4EI3#>@2!gZ1>dv7hlm-kNQ-mFQ4r^ zJzwVK+Md7KB0c~2`LZ3Nr0n;k{yfe0_dn=Qt1tij7ajiTsxRGufoi>?qupV?1E4!$4Fpv&7 zwZA8F*lync)KVowaev!Y+(~-{xZX97JlX?(z9N4cW&6YvI&99jyQ#>0i-s?vOnIH+=F(&tb3|=4w??v8qo0@`XrJMF^K+4= z_~2QDi>RT6Vj>)2VHzDIsb9CGN+3itZp;AI5M<~dcF54P7ULx|KbhH@vJa$*)Y^Q< zvob#{Gj~0b!bfs_FFByqdzDKkhvKs3AUZ?Be^Z3y88Nc)2z2}gLVKSUjEY~wzbn0= zD9a+B_{XxM#sEe|H<;1Lg5>>$$D0<=AB>M+PQ`YP55Ar*s7EE~SpF2%`Nu-7uLWUEi|de6-EV>|j*bdN_e#E+arRkGZU01&6Y`Bu+n7i5 z*5sr~tA|xIqir-k_=cJNa0(yk`TPAniisZiRdc2alvS}eP<9X{X@HmszzBTg>kuTB zIdCK=L5%5xkykaMAUswwVt@^L)|Cb#YZ}7Bc`}Rw^PM*=aeFEJS(5fs%hzI$cq`U) zyqv+`Z)kismS3^^1l@d9ZtjAA2w=DDIzbG}4?N8J7?y1hsbTrBoeyI9KefgCb~8?j z|7?qAn;W@E@eed}^Rd3bKFwkS36-)5?<%Ova8F_rmd_0BZz)iluoTF!@_RFa63J)Y zY>uFZtQ%j?dU;a1w8YQ`!eT5a0lHvlh(q%&>2jH}+94v59c zi*|cO=A%k^gmh-qs+LD(S&srD;ZUZ*S8jeY(~55BW5L-NRXxR)HDurBWTI`e1XB2a zgE`{QnfP+~Gv~{m`BO=6Q=`l`Fcv^{S$|m;0VmLF)kl_I8El!o{&N4Hq~EOhS@gaz z=<)Op(krtVlo&*c`7}dRx9SuMV@i$(zXkG}BBr_6!Z#fR=+cm?KvOC3S#x}nJSpKt zpC#KA*7MPj(196XsdP1K!WX%+r_l-+yi=k)gkNNu;BlGHKD*yiXP}?`(Xv6U0-QBHi~cKf^@DvA6=eQc#Z@CBV z0Y~`VSV|TK0MhQ~jI-S@-DJ5?IKkyYIlr|`{lkyVUH7N)6VHGCAa`myM5ZS9Tt$53 zW9d)OvOp81W&9wlNe=tXw1?8?fy9rwMp{Z9r}WA8{csf2x1tZ$k$%KO%mU=Cj^HYs z;i9}uWY=d7VYKwB%IbZX#?Go$mvF4dEV)Hv`U0^q9Q3xipLi?m<1`auq$2%PtU-Sj zN}fJm88daP5PoZwZOLTrNWYjzV~OyX#eH*gE}THNU?V(n*ES|jcZHngw`BhEmB5jm za#Zd1vc5)UiWzYIqsn49xsh|Ict&A`}`25eI5p(~;wCEDIi+)HPLQw|28HZ~RoW{FZ+CuCB z=;<}%VQ&UM1ay#4HH{r-L*M=EgdCGIL(Yb4kbKO+(to!cgzy<)SPtH<7CdZn?V2{; z1=e%K9s}0B_o^AQ#Nx|bgwIFi`DP){!H?oOKW^W-cbk1@slKDk+hu%i{U6) z+kgFd{#2Cex7v5fRy%p2GjQAVaQHgjc{#c_x|F&D7E2VPah0?$awqfW z-1i8V9OmA~hyMLD;v$6_3(0gPoQNdY!ArOki{_#yAC`I_e$BgY!hh^Hz(g^x%l%S~ z9~P2F7I`oQ&4pX&nG{i70I>E=e4?+EC(DJ5Wef_KFI>ZkQz6;EfAUhU#`pr;or{f> z+2e-}o#HFy$u`OwuyEeEIXCAjB2pY*1WCzHAbYU=N29qe{gG%tU&R{Z|0k0vnpD4& zllC7H#~?u|{h;RLRx_9nC?t%GJw9~P7RKXcJeq)IF1(xSDf>_O+g<-(Nj>BukfjvF z#zoDJ+q1&6|3?qU0pv&IJMk-2jP)9)@jBOLY&+)@5(CHXu!(MB+iOjB@X2@ z>-jPy8N%a(2WZHI~+8rQ~v@ATWVmTd0IvY<+`Wf+>NDjvb!KSdz#mqJc4Owe# zfvWbI8^r~q1R-LNo|!kswSV6cwaa;AOs^*IE^cJzmoN}!QZiEfJy06Rv_rO`Bj%;_dxrl_4521=4O4c8tF1Q5h@x7_5Szp?+wv9W0I6$4 zA5z(CzmR8=z2-!&&|*nlW0~m9tc>zaiqXMC66h(-Ub|J1?KDe1chA{tt@f4PsaMW( zUy(dUUb%?GHK*lqZv0hKP!n_R=Q6V1X}L=up(dO;w{tm)zorzK}K%>ce@u4d}Nmeim_E35N{ov z-Ckd@#ccjP3CJ94T)=5W4GR~*AQ+yT&EEi3#V-$oomqr^gBwL}P8QK%@ob(wJnByN zg~Fg)SzYXim{X)sojlpQFS8#}k(7qibT!%;Mup`XRiqno2KV}z;QNith*B$a?=uJE^PuS9Mx^$hCHZ4YY)~4q{c1?E(X4CS#^h4U~Y5jv3;z^(w zX(q1Wb^Rvs4Wh%anDY!$D zdeay=aO-yP0&IXZ-k!MTMiFkBrZ^@R!-3_Tvcx7jd&&}0jMg4D4NA=VAW4a=&?kv5 zx>m0GNNnAH022!o^SvY)+-OV=9wg}#%l~`>&BO=4jd>(9@5!(a!uYtIhs-^5bZYp5 zANBtP?XvR%_BesVGfO*HMVG>h4{uQEhwTzaBF(A!pB?TWWX31b^#Aeu%75iq^NAbb z(nEGj%>A?^bR(9R6N}B_FEa_}Au}1^R+VBU3LT3(M;FC@t)*)k&WepL1Ds*_0J`n@ zc9AYBWrPhX!B089yQ{BRS1~8SAsvtC_+*_0rCDf>=b5O?j=#!tF!G$)8W$vVnI8oi znB3swpg?>k_yDZ&=Ca$R-*Je4!DP6yi-z6(YZzljgc z|3*lS@|!}5sJIx&;Q5xXQC;&ulk(7_h8x5qaSp96Y`A_r*$^-kW{>zt;njABXj_D-)uRzl&dhqx#6b$`F=bBT0H={i16$9+5?Gf)r-_!*GJ~Q*@ZHzc)GzKcved>-PbPq@=FB zBL)@kDgVaAK7oI)0vr*)PR`r-A=g5^G(132X(OytsGkLj@*eY{C?K)g_$_jObw!qY z8z;kHkeF*f!HXIWbv9gP6_HPTr&6;?2}OL8^T0T(Lz6W$Bcov=Se*J&wIKCaF)0{% z1z8i@TVQgH`s;V6`bFzVIH{WyJ(!1_W+E#B#nE#L_$i5=gF3(@VV)gi=UEBVR7!lw zW_xtpoAxI=URS>6`ycNro@R(S1fI^0xq+G^xk$+?_$jmanMu7Y{D^JK(9yc6Um2tz zK@g-XBg!P7As`~KqVE8-plMI98*WY|dp+4O0X_5Cdg-5~I8zFBs2!P0?TSuwC@!ra z<4BP4&)LGDiiiR}U8IUx@R6nHP?3aCt(-hs9Uk;3{55z1YAk$zdOYmgdPm27ygTl5 zZqso;W8dSA>6>$N5?858R5`!f#n-y^`d)})!PjB>o}L$OK8_~kQ-l)OFW6^cKLpr& z%L#74E;0naCh>V1?feh;bU99^Ky#nPkbVzD*eK)6K@Asxsy^;lgBr%eQ&V0VQVmb7 zkUVh8IE}jRd-$h92L&g|OocF07fg;+Ov<=j{&^tDKkoe>llNk#x%hehZN<+3u{^-f z_7=tKLuNS_Df}bie5ItC zM_L8G5!vwdvG5_!`Dd>K_mU@|FbE-tg_^E=Fm1MthO z$e_zFZ%OL5rAHTjxtXE5{Bqc*|1-bz%76!UoMxM6-$}gh#hU;uKKL1S@47z7QMQZ2 zLCsUcUDRNCyLw5sI@_COP_OyAA`iz%Gyhc{l>f{h;9Led0VuZbN)3|ptTTmT9`G^9 zL3ZloxY_*qBV0hb$ws$)ob?@VnTge^8c@Xwm+WerZ0PSgXb3ql*bHyNa9mDU_HDAm{-EVn#L#nKKF&9N9FfP z@jBvzZ!b*A?}fH+mES+PC_140hOG0_&3P3ANv&K>MoP~gZ@{Tw;ioUH6{+~H1xV(P zaoLFY4<#VN4@$(msBc z)GXDS=16@sY!Y2yJC^WM7_BRo3TcB`rmLImbY=O*nSZeTtlP4%&zXOY`%$-L;Ul*#%E4?O-a^OghEo5p;xVU-Czuh4iPO9U zVt%24n83=mJ$ccQ1Y-7>JOEW4I&6G{o?pyV^}hsRzIru@?o2Z@e7+UMxe|XF01R32 zm+$ky+9+#asCYzu)6Ozzu>}MPwyUoIqB6@{N?VM8TNPA z_)GG9Sa*%ktW=^S7+n^*kb9d1tmLmoa1WcM;;G*!mEHY?W)&SN%2@vU3y2MonTlgr zUnPjNn+87GqkB2SIMjL{RauN zmfplK-wRs_J}?;Dxa}x&@h0_Vx%GBW2fx=z*r$}?5Ky?QQC>uIrP*KdP2B}5^$nrX*M~6nX1f1ZP=3++1bnqhyYB8Qt zhWPF}86qfq8g>vrx>SQod?92U9un%i^GD_Gx@e|-9+vMO>K-y{pEK_F%y)qDe~f4S z=0@p_cvj3_{C|sQT|q}y&${ufzLK6H@vM6(5vA|Ov%cO!JZqVdPmuS&#%YabuCo;CA)fUZBiwI1D>i!;J)nCBs^*N}P%7V7m^rm#xkMo~_Sg=EqDwDg zzl@XSD=7CA&tJe)=i54z?NHpy_c?;m*JzKef-+O!_{UH$7j-#9S*ZahG(+I$Q3`Jm?HG{}5MB-2GGwIH*< zE&t0iX}`x{g~+AaY}P--Zd-3=-;mNrE`C3M{lM_0@Czc-{>(+HLK?;a=`0(h61fUw zLwY@90J+}-(yPz4kh-3jdNHNlP0cL-<*n<}@X}9-?MLnH9}3_cmMS^#vevxF9Blhi zd;2aID+jc3xDdmH&#P4O^i*!17{6QWk+qXvj@n0obH<|B)j`7uTBY`QYIYb{qBd!DP zvrv+nleLf%ch#cCr|O;uW3&WFUs`8WxYR;Ke}z7Z|e;)92*5f*vh z{9d?Iz9GES+z(}H;**3djG{aK;ub3*WY2m$ z|M-7fe{H;aVZrDK&e9q&2`8=8%>IQOyFNlZvNDiRtQxx}5S?5eomv@+{&6=WjL!Q) z{?^G!H1%*{q=XRkEV+52{;v&Y6+arQt)C)aI`?R6S+ia9Upw$Dw)nVLkBYh=H#Od9sON< zmXinMdu|)dA{gN8c<~9rrp2CM)4u9J{hDaaZ*v-srA88x@amDV86TB&tVz%R`tc@V z8vSq+OcQ8Ay%sbrswOK2`={caPm9TAI1)dgHtS1(8c z+mjPNlYoNHkHy%;QN?|7PpgiL{4)ZTb|p z&T!Bs%Sv1gdIOCbklC$T71<;=dov`l<4NWxszW3d;&xRuGkAd{0?T!!q@?lGyz(;{ zB1Mc>nbVvh*pw%MsMlxug*!WS)j$dh%+N0=6h0?07OmqnS7_6Mc7(55)(=kBc$(9~ zIj`{Muu}M%jPnNHc%A=QQ#ETJ)o+qF{~JM(k7;*0b1sFE?YaTG)+GPGMg&S7L^Q89$FpGDt5}#^M5WNRJ#b{xY*WI(diV0s-_h*9BZqdq*bS( zSHCeYDB7LoUesQ|%pj6!@*y#J)7jxOo{`AcIFOvKx$vO$^^uSP8Sm8)__G*&uhwXk9*tCgWrRKA%HD{qzq>dF-j2-zpf+T)M z9#9>YzmM9YYM|cPSkEEfwqURu# zk^mww={hfaZzNlq^J^bbB1f3509iVWP&vEhWh?N1 zn!=k%N*M#maX&(yBS_jU*yj7N(ZyzqBHl%aU}GZPCcb8@sW`zdvkbU9R$BivMUm?S z<1R%e0;7KDQFewv71q&Rx{MMS=rTe-!=m04H8v!ECinz@z)xmW#<(;&!e0=GzAD-> zmOuU9I;us>?WkUcMCnmY*H-d>ZtFCxuyr2Esxy{4rh!K?Z^$N+%zOs*Le+&i25}PC zF-udBULi_?MaYd{Qn)e41Q`p4;RTS}%KJyKVlV0z*Mk);QDL0yH19T^X zpik{$CL4i<^^@$aExb;;7AMICD&u22bwkpq`c-@+F+O882NM&>Az`JhpvJQ@0^g)5b@ymY|OL=&!;J2pZC4k>y0>=xz{3)G1?sW(cg? zReZlQzlb9*dhuJWXI{hx_!LE z!rz68B~~3S3e<1!xL@!~j5<)iv*Xt;eo4+)JUPYs$<{adMj z$Gd-RlGS)IafX=2p8^RkuQ12iV(K%Y@V)Y7mR-d7mwaiqYqUCZekI~qKhanC9N^Eq z+rMjf)mrEFiPRZY-x`pI^54v$^VHfv|FwZL@kyQAzm}JzQOVY>Hb1m2x4fy3YkYO0 zU|JrPJHFFX$+=$6?P6cRq?$YN{Bwe0-Y+%vKXld6?`?Upgo+DA7s>h50hG}I(!DA} z?4HqixiSzRvi%C=OU$aKg?!@*P1F{MUW*obD{N#+1*l{GA|`6I{R-zAHdb@=?07lB z9A{_}Nq>{|sigl+(<`3M5>H5Prg9_L=f?WW+>4cDj(SX}d#{ovLz_*NLEf_Xk5pl; zHI?57;LaQ@0bZGw1^k#@qD%^0_&-U*kM`IbHiy>;lHL>_<8 zSDyK*ukKlF_0<`dWyU+vT%A-)$shIG{;Bor-1-MopIYmvrSRwf-IibGmVZ*O<1^1 z4P!ZEq#RDbEJ}na`ZnS-tdyD6oP%)6iX8I_n{CC`p7)k8X?}&kp_6`A3cs8a7LYm2 z)gP=YZ@x5BzTL%=hk&2vJ1$ps;hx`OTYl>wwq-pJ3-0Nv4^{t6mGS=<`^DU8TV}tv zZVtn$VT%|pN^es30smUJ6PboZGr2a4#8=g3vHDKeJ-*u${GTq={=2PzYEo6wh*Bk# z+=Sjwlu(J;14Af6N4t=*_eytP$`&^C4S#X%`J00HSqpLNGf9MJ8V+oo)`)Nl-y6&g zKj{JA)fV3U+I!|F3YYAU&&F4fFOz_;vom@>0KRrj%I;szTdZGAE0U{x8^EP`lt9q) zlIJByt7Pt9uV`g#lexc6?iVlwoyHe6 z^frF&QJ9&8s-(Z%HNT2Ev}jQVe+6PUpeBd*!p=Zw8#=@bRYY5q0Zg^e%h z;*rcsdp)>1@-JA>I3>`wkppM^MOQdw>-e`S;8~H<7gQ;g&kyqa)9ubB8@D?@W|wH$ z>pY)?=3d1$JEhCMpllOmpL6{V|5k>VUIduGY0b@fPV`#hbtO5Fx_xwrNdW#TTC?Sc z^`rFn-7n;IM5wx(I>0v4sH?Csp2^1KG;62U(itoa%;k^NavCb(fG&hvK1!J@BhRsI54tGrmZn?HrV?aqX^ z`L}GlGyY}%ku`%`8DRVD1VoCzM7nvrkbgLU6jg(~h2g&g#TMRY#}>W+XL@c!1wpTl zqBQ^6LjLASpbP)E$o%wTaa0c-wk=e3dC|=GVEqw)OA21rVJg!ZZ?)Znmzv+`a3@_g z;6mSagiKkHLuImytZ95UJyhladUQuPK@Ok*Y8g;911hR!#EeSDlR1|EBu=9xn3Bbl zPV<`|i-=X{r1!7snO0($-Mv7mTA4-FGEwp@Hkq4{O`*}#AV1i2a}g1bAG6O>_N|EK zDyi5Kil10CpBRBXL5f+m!J)$nx(2iY z1Ska0!K$AXHBP2tp88+3^&GYpZLom|P)CJah!!qUtr+8RizI5M&*( zo6nMP5jp}Em&6IQuw7vv2{d&h)STUE&O;e zIuQ~ZK^Qy8`KBL9U>qn5X#L*|86J1OULcNu!rk$-@E7ynf6R9; zO6l{YKjzvLKm3>S+W!49TFWuL00^~xy?9JwLar;GJlq@Gsj-1sBb zG*3$EYmLq>l#tku6nGBOl^7K@tJXFWOQ{uB@vb$O0U|GlU)|3UxtTti9Fg0=xRXAb zjMF?bo(5DNqKg|}tymw5pL*~!d~e}cmwzOzsBo-+cNB)I9~U(~jC#W#T1$F~eAZZC z$rUQ*7AP~Dp;8&JS`*Ano#s6TE4`)VN&UOn%o0;C{mcA#)rDE}<8$BeBL6v~+39{m zIbJx&NVR)RlWm!xDvRvt^-yy(U1Z!>tT(-rPo!tD2PJhtG&-k^e8=2F+d$Yb9GlM` zJ0L7+#t1$+g)%<$!q=HtPXs6?+T*xCNA52WV(=D|gM7VWGQ6)FfXFvmj31cZM~LPV zpN6UNyrO^;ScUyR?UX>(%7Am;=Nxyy;Trlm=&Cmxj|}9EDAC=JAqg!nO`H#8aOtd*7P<2BQ-=B)Gzj9RrhqR3=(J%f++v&u!9kn>* z?;?Na6qp+s8XWkWR%d?euC)SirhmeBARk9h#0T#ciO2pv2g0bg*YP?^WZz?2Smzd= znkszO<&(%xF)5~<#s`EOPvg>p5g+>RzvUvWMc#5@k8;Z%iDQM$;YWd{=QKT2*6;J9(rm2U z1jjVIJ2*ZcAUsPQlc(6HbSXn^OlPt zP^JM>^H2JSE@TtgnrVLtkmOm;hiBw_Msi)|Y3R@Avz~rbF?l+IqVdq!8RmU~Eavqk zSVTzT1;4daoIa%Nee>kkxMiR`?QfY5ZW*i7d^(Sr9nauL{VZlws5nuYXD1`$_e+PG zzH%iTKvhTH=rnil;|I1`%JsWkC*-q5=KH`xJIVRg#wBn0R9xT;oZBT{&>qkKp5#$t z#wrDzW)e8quLa`(TjX4EhJpX$F?!#8God*h55TkfW=?Vk5$TIDC#h=rz`>}LL>`{8 z$PZOh%Mz>s9xZ_giEN%MZHWoS5*Hr`4#iF^c?3wrpOwdDa#hlCK`OreaVT2sGc_vE zA<_oIBZINCS&4YdF7$Yu<`SSai{LtpnbsWv=VXo0Z$F!v`D<*3cGd%zvc~Xb!zqAO za&D}6TQD}gAXK$E{3kw?Ty%DklxI|@YWNNR&UThW9@g=F6=>@?E9Chqu==Zjxb1;x zSs-@1u9l}}c668%`IQX)mc@eftmTDjMm&XG`1X{sweu~O3qXk+dr&Rw&*j0kPxFHH z?+BWo-RtrQW=&45=R<;f!TMJk`&F!&t3&kj!N1?iTSp;y(0C{;+(kmYsQk3 zMvlxD&`zwL{DOomy14p4e5TGlF5KT}C*oYl8RYG%p`X5h!f2aCAcv&~q6LZhsrT)Q zRYVRBP`>z3dF2}*QC?ArOL9k1#}#ziEP(O-Jsn$krfWi_m|~GI#gp{8Kc=v7ceVD! zsvcGKk<+{n(basl_swL`33Fr6aekpd6q^Qf5B|x6B0#&G$TTo5j5NF`jVDjXL#ii( z@e!VL<1@ZSO5Tz|n0o+;%7^v}u@acLlwP!+c}-~6f*4u2boiZu#w=0U@<4Y{nIQ8d zpem{RDGgOl&dZjQh8gC5#Cd<{aOKSv6~+%J=f=kD;B0>@D}S)Ek~zdRioL?L^-4Ss zWe}(XU+s&)N@wDAnz8U9#Al(SEFU(E>xP(H0WOUgmP7SDbBMmva6?9Y4s=09nDf&w zV9X}IC%i;FF@v@DJeFkb!PFJj#tg8FdIw}}{rH>2?>NB?NfF)rxZB(=^D)Gd=JwI& z|0XHFQ9@Ven2sO0GO~tu(ee-c8HzG(?*M7iqynzf}C5RE!T^ zC1!y|uDmvp*Amy*8U?n-GO0n4Uy7zkb4PIH(id}T2d%V99kfx8DUC#Pj8{k4P%XYr zfjMcX0?nMGdYT*_dCVD4Kb8VejzOJF#CJ2p-Tus1^i7AA4+tsLBYEFE0uGq&IVXn2 za01Uorq*f>(G}3PK;(bT#GJ1+%47D^eZ9V|@*@&>KK93xVaX`f=ZmBqaz zg{=w93*>oM+o(*2{S_Ng?!F&Gd&a$gqeiBEmTsSN4h<=9@npwaMzFrL#_HnM;Va!`DRg(HI zyIeaQp6kpXnkr3=V+APX_T}SmUkJi;MNWUGNJ}&Ab(VBkXMeJakBoZGG{)sL%V%|3Ao(9t67&;mM# z=e78|@^@0cqcao8iemKB`am;rE3 zAK(tW6;g`UVfE)!zo@2(q6Oo9PNWj}Xw;vfZxaRxMW0AoY_v zo;9_h_w`U08xkwr6Bpi#@%;4RSC`erxr`Ovbr*)KD#v4-$ z%mvbgJOvkzSzJ6VNv63$Ua&nPIthsN z3-C;w$Ye27<&#lW!#FbVLhkt1(U}*JlqG(o`}xWTPJtsLtpSFI6n>D484c-rn=^m0l;-KT-fi3^n>shMn61wf59k%2lv(Vlsj4Sg=xNoI;;m-A z(uH3L)aEZEXO4B4W!D~#E!+1nEH!@fH~v|k4qSahp|}i8&a-m(uWNo5Wy`6x?0S|< z#^t|9OVY-}_T5!C@KoRB=|ou@T1Y$0x@mf6zki?m{uRmh1Jc@5_wM@d(ZVWP>U)yb zo51z>zQ@~ZmQp6>A8W7kcakON_LS0uIp$Rw7J@iz1206tgDA(N~Vll&OZ#SDCnhdAtIM2g&99wHk4=sPv>!n0_uP%*`Oh4P+k>=f6Tz|at% zgbCU<<<(ZKk&q+_HKAC)N;^LX>sQ4Ze(Q}99|&Rtw{6Um1cu-7b}%-IMWwCFL!P}J z5*mlt^ZbN9f%;{9`bLs4$ZYi90b0)9UBxM|@i(;{yz zq5Hdp(E?3g4xp~O42h25FEC{Y7M4FGSD*!-z^jRMPNX-;=&oYn1gC68$NhepAS>4M zRi1xC?-S>e*dpkG+V9BegTK8Hgg`?`%1Q{xNa#*~W zEErDVPU2v75(lEcvv5G#_@Nq4NsphiZj2jIPmt;0czD+UP2YNHnSL|sOMk|BC`UzrLE-jGG ziL}Irb+QIS62+j1mnU-C^I~guownUZ)! z+i0Sie&6Ukk0uRuI^Z-K^X;GCrmc+K(W3v-AjUmMP1{3SZ6OxeDbue^sj@ zeZ4Rp$K@7sCe~7Kuxe-cF@IBgE}`B+!ZQUP)@Ey}W^jCDgxG*GU8xy^eJK!0FgVF{ zM_HyLxg&KxqjDO2wnF%FWya~f$wc{5PoK0NOIJ}gRrXW`sY^{a_0uRkX~=(o~MBS)L05Oa)73oajY z$BXcy#Y;^RFUpKVlgvoIE>hU$sjcGVteL-)eG4AIl`Sp>9wH)s-Mesy1eg8IbhZ@h}Y*Y z=u=@@k`Zv+!5~_d)zAX-#1Az@LadSIcp#0=R^@x~YF@-fW<2>f%j->xrKyEk{u@2# zPon2*hx6hw7gLQVYp+M!v0P8z^dzt^o_;;$eFsuAJcVJ z$19!XKB@0{tIswzs{t)m2Hn$|!d~bzt3VLtvY0O!E*8Fv8Q6qXZWGnCSH>_7g+cgx znG9w^-#^;+7_3y|Iias++g7o(rIjzHfD_DlL9jx_Rf!rXCG_CT@?}Z$jm@(#!kZV! zaox#{XuNV_%{^?wWfKF}(+lu925@oAc_>ctm8NoY>KQ;G+G85%fZZ?o06;>%Y5?3v zZ*Oro!x!M{Rn}}@16`k7f6DfNGk{dPt(*m3bm~S-@++JR-sj=TtF}7}R~$se|3EAj zddI3Z#0VwFZ-A$jUM>@9u3yHL?>UAsGk}%|?D{-V#nJ15TvYc&-vF4?r$@&#XmC~F zJoS~`UzBGq2R*KJSm!h!!3*&rM<+KQ1=58aA}PBfBB%(ECrL*zkTXYiF7Tx9Kww6q zD@D}!)y#T^4+^1fiN)=O42HYORv+`MmDy*K8r(E7Q4T&onOB7?d(j;DBJ+^D8hNE` z11~GjPLy@-ccj(_SktI@!`u09==FHY2CQYVBe*2G6qF39df7Q|oj6o={mHNeK>0r1 z0J0s4`#W=FO9pT(uZa)%zCXG%7~PtlKLkFyghj|hC?Gz1@>0L7RyY$Cit+jN+9NQQ z_&b%mRK^ai-CbMtCD1Jk|69~zd3-eP&T1CGR@wD@+T8-tCB@`h64>npn%Xq{%7O`N zBYVT|#?SXujq&*!2jQ181Igj&^(*?nNzClkKy*7vLA3T3t<4f_2ioN?GTci3A(BhRS@d44oUpkTNU0Zdkz7mKM!hmt*rjDBq zlI>>r>ddw(0tV~2R#xFe7 z*Edhs%v1R=pbWtr&>HpLCJqHFzYX7|ULj0BP?DiU`WIin4*Yki7G9^{zYw_%M!&K4 z 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

;s;e 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

  • V*o7^1ZBZg*C<}}}`4y$Y;CMAss zv3W$Be4kd$zQ?GC&bw@@u;9JQIw`SnB4lR5VT*;sbXiBSS5a2hwL}(Y0c`r~beAil%zhr!sx{ zZ0G6uGB4Nm{M8oe`M=MX?GPnpzbEzQX|})rL4R6(`RBjr@K0BL=>`l`>-|&`i;&D; zC?pd#qr+8`VkoF5A^!FzbC$wU({p@hj5XAHgvai%5O1egVj4xJuLXwnpqp6PMWus* zbik?oJ(0t9^ZuunDjACV+pgkH+AF~Iu6g9q9`N%O`P(SlC!Ww@bH3e8Mdn*Hd=V`t zBDC!4cbNs!^tAbia$W~HQ}My~2$G}kL)T==>l8PaCd-&3YNNR|lD!)J#QZ?}4A+~V zi!{Xt&mvqz4J{NC;Rp-U=pae`x+PTtA)0Yx2C#-8L;tWthMu(;FPZtt%+{2BAWfv! z<~yF1`C*y4>yZ>blIwfP0j=JvTsk=vmn{d;84~`RA|%g7<2Ml6`?O$G{2KmU z=?z6$7Wu?KmK8MyFejf!D)Ckw1tcha!dr6b zlRu^Mr=R>Okw3-qr>M?97HWMh2y0qghn(tu6KrvGR4BSv^3{y9&vI(}CxV=iZ+zOu zJes#ACrw&CtfCohqw&Ev%zeTRhv`$VG~OpqZPG^#%5678^*YludY7L0yJ>5}UAmW@vv)f!c(nK!%myn-P>q zKJ#XC1U)3@^;G-6*-!fiXSP3zt=z)?ADREw{<9Bew(sV@9mhDc;O`zvb#2FC=647P zWBMKxln^(2sj$C_&HbcHNbgr_?=T+xHOPkkG+*1sb3ZaaNcRsvN%G?pyOf!#vjC`+ z+fDYmR3`!**NZJQ;K z!v7o05r59am&>0yU-rzON_v|bWxj#20IJLS%d!YKfnKXVvh>Pe%k1@+`~M{UX3fu{ z_k}@^r+1KEnZ=;QAX3by8KSyXr%)JEay0t$66GQMBGUwq%X}v1 z&oORUhm<&LAm;Vi{gyfd{p^pH4QdtOtm#?wUzw}_y1_SiKk$j@i&=!HICwh8)yRI! zJ#Y^=!tcgXvM>OUc0XsF?SAPd%Z0)TE*HxAt!3&Ter)c#KaHPw{__X9Q_~?bHM!?1 z;v*kRe}a|;nkX&f2VqTe*l(sils*q6e#|w}Qt~*ZPqy!eqoBSOeXx%7BOYQFAa8X9 zSK$m7;TVWrknGhot>8D~1 z`m0d#^zq7=sbhukTdQnKCUZyn#XK5IgvTuIo11gt1hNGi;fcGpF>$&p^Ovs# zj_j19YPXm5H8NAwi1w_BO(EATCVZ{^j4v|t#Gi6IgUkKnYNMamMoo>_dvBW;4#~~A z_>zuhrd%Ww{*9Vle@M|s>=83ga1hNCOEeHWD^Z}u&5Th-$##_3+&^*&bucG-3z5#q zaemvnL)Tr`B%(-t=6p{5{6B1Egz>@We-4e9`yZx7m$+T@L*fvMGU&}XTzlX&-p$e$ zVh=!1uNe<}Gx#B(gM_MS>^K|x?q?_Dn4B4MHe7?`V-A-7yX7E+&j7=6@OHJ}VUugu zwDB&mo+I`cuQ3waKH6wmo_`_8@F>^n>K9cA7w<8$l(*w&xr z*8ko9>&Nq_N+szg`VG1(;M8nmK>efvpqtp`P0_F0R9Q5AIyn%#Mq(VvSzZ@%Qd1(h zEYt}@jyD-!v3!SfaxL4;uERIVod0!ar0(r5wYd-{*UI*8L}e_M3*?WNKZ8Hsinc(4 z2AJjdr6owtTef6z<{XLYMo|}#WHP4@*S0yf1{XO4+nm{w=Yicb##ihNTWDI0Lsjx5gN4VrL_dY)K@1GGDDb!dwQu4ReWg5EE@UiYP{4fQ8cv)F$^QM5mvS}67ufDx zY^2N{KXm96Unx(vQPzNk^Ty4&Iad*p;`ky+N`3;_gY7>W&2{OIMEm(F))@aknM~27 z`kkD#|ByHa2}4!F)g=VPx#_p_{fa9xvn31T1sm-BeH6f5PAH`u|GmAs2xx zr64vg3csA;BgF2RRph8xm0#)V`a!~}<>osGkIb=7Gma4A^1wwn1pf zT5Ahbwa?rrE*K>U5qtE^yfLo*`;Mqx&Ld-bHFc-x(m?bFN#hGuwZI%PFQwlz{BL3iHL+`$vNK$5wNXYC)k=ogB#zmZuP_Hl zT_gIC%3k}0Jd^A-Cvt@rOX?cSL~mwgly6du4jz&~Pigkrt%_`?S@OAi&R%P^uk=p6 za-RE&6ab*BibF8a0{_^}!DyhKlM$+V(sBJ3O7D0*|Uhz5&i^X%bK zcd{=O2Hnc)Vn@WBB8BSY$=-dL{fHv}k`6llV4U9yp3uH&`ADmi$G|^&qO_Ylh|Ore zpjm8*sn#5n;I>)qs%o<3mN$%Z=6fo3#zvPmw>BIu`Fe5hEIB?buVGOcMa`|@EvUBJ zG52wZ-;#l$ZGd`_IqKJPlgV^!vkRxzSJsnPH10Pk`X=Q!BR_sGjMbwajOWj0%a{m4 zxnQJJ6iYeXm+4rXX5y@>^h$*eWya%<2d8tn(|jm}Iwrp;bw+ihowwX^`SThUy94`F z((Oyk(>DNyn`NIbEz>A^vK=1j2SIbp`Rw_S19f~d^fF-S=gjZbj5LaTaXt*GgO|<~ ztGQon*bvd!v61B!YeLa)NX)PCwAR(+4IAWPNAt)^zb9dK5V8nGJEa+O!!L4k#$U*r zg&5R9ZQkFs#1k7ffV1%X1?!jOT@9>WI^*0k2A}{3!h@4F~YMpJrA;Lxwx(aSgBQH;Hc$9frl6fAA)d-Q88l{2oa=;3xHM{Y$eLRKn*{Hr@XkYo2t|C&+^u z;z`{}Fn~+JOinUuLo|-Cf{mrw^L#ZFQf#Iu8O3C&bfuT`Nw$FynbuC^QLGr7V%Svi zKrytNB|lpX@cyf#qpRWF!sy7#=yf&yw?{`0k^Kf*KDyeo;>@~Y=MFhvF-8Fv`XVm# zM%Tzblslf4$JfApPbAr@bLQQ2|Il(<` zoq5rl#>jzNw}Tg81Elfx#5FgHaMLu!F|im9Ea#LZHqqHrmXKn!_ONMCV%7&qN@RsT zNp#V*a@9v->-GbfSfH5iCCT7MV{-5yNuOB$=No7yKKO0SBbj+mhJ6sm$L&01?wO-g z!x#Lh|0igdofojj2^^kT+PNya6kdFIgGxVampBq>PR;-9aQ`4PK9Q#XkKb4RE6nteELUTONL}hmTRi1;9=gii)Afe0r zD9FI%1|J6n;xoYqV2wAI-7fv!G|60KFQ!RYjpez_1G8c`P43~ToRM`p*tYOpFq-&H zd}#hRLTZ%X6iP(J#Xttnw|tH2ng^PchZZ&5ARdWxXmu(7%K2B#zdHU+Voi5T_ zb?qH7sCZBLHzxK8{CgGPi1>AK-o_8P7V4$p0g6f+VVy$#EKrp9m=8q(iPgq$k^8GF zvfSG^83u#IT>A-L)NrV?;WDd;eBwKmnoUY5;**>Q##tSjtf3hh4HLoQ)R(FSsmF>* z!N@Dfn%Ld~lWWvpzdO}0T1Uc3-K6NjJmfSJSrI6Xo>Rb2N%S1l0VWCa>>xYON}#4v z;!8H$qvPJRKiToR@-^T8cvtZ>L(C!Ybau=Q)Evo0N?yTFnZ?gc>Sf_aY+Hto)E$%YB&na|cs|18CsQm8}i$XseybecnP zX$2Waf{cI876w&B6!7UHRm_5qEJcTkB!p_^!rD`Q0wQ)~(m~LKF+W4%7Gaym0ezG%24Vl)!$$J`4LH zz}{O`z(g^dmzF_8D9=+xByi3alabWFdm+o^3srM zcxr{@fm6n5)P3K>KNUJCI7wzIgqgZva-?EX#_jUY14;gI@Bf&*7c4|&c%dmXr!JOPDq*raF=kY?m-tY;nSj@doTFN(hptg+VPWNCB6 zgb};hL*-^7Tx&x(@;!o=B)(-H#p|`;+jA@IgbEtP9W>`KI8c0r$Q;jT^rliX_$3V$ z3*Il}(vB%}Ru#Pe04`!;wexD1Spq%%i?zxxFUU~fmxaHCP3B^k&Np{)nN6SHVNM)? zUv5PPU4D5>QnxKVy70@*4AteA!#@3=`K4C|Jh0<5+dTVD;(agP1Yq&O&#-&f^+ArZ zT^tT-o*M3=2Fu&kOS0A3-ZX=H&DRxqI7XWJukxV$XZ`@^GRO%)v3*x+kep|oDHQX7 zk3kNyQzysG=FcDD0@6)3y5-}n?|9oB5$THmTMj6%vI^!6MmM-NIa7gGr+^N47>F-< zNfenGng&|!wzMQ~q6DCS0JO_4%yrH3B0B^W{r@B{mo)EBUfMo5Fn&|;3*0IAPqFY{ zX(#BLcczfezNk#3pJ3rX3;4}s;78J}`J`3>GLP#N9k$<*WW_J;YU+yr-@SVv_|2^_ zX_EgXhr4I~2Y#3TfAzEd@kBR$*{d5ozc`>gX7EE2pUMI2;VrAMnQu}8 zm}i5`Q?9Yd6cqysBWpln{A`@2g>Ad@qQgqNt9zMfB{x|04*KL>Gvd}XKI!+lFBCm0 zzfX$S5g&YeVM=~4w0*1m{>eqr0p&MjotJLTs~AXXvHig`BDlTouL>J!CWyw|S7@d?CS<>xrvG8btY?4VS-0#@KAw1w z*4Ph`WsqP1i$&*>Pc0A`&wrg?_Q5K4e$jLPN!KsUahksYyq5y_>}JT0Bx^d&lAB;& zWZH&Rk(UxD!X5-21{2TwW;IpCwOJ<*8NbZ$qQ71cKGGQ{o_P88DOf z@w236sn#?{>Z4(k=mOiZgrCA_U9nV18_Y6Y-DIaL%Qw#agY9SCmW6%J{Bzuox-API z!HxS#w`Jjj`820~(5;#wIFYll8JQA}UoDhjJc$Z5B4+`v4B+Gf;W2yx-AV1vZx!nk z*HX(o2#{(=x$zONk}5MkbJA-{q8>IWIPeZTny7w&p`_xQ_6ucqQJchAhQ zzq`g?lIO#^YlLQ{5*@+lvdD$p+azEme>H-8*en%K{XVJe?k_Z}=txn<^50)TY>3QM z9K-rjIUfGC_ZU~fTs{PYYjQrglu!*RZJ)5_M8Jkb{SP(5U%yHci%y)OP2IRkUX|}Z zNSL+sCVu%|*h=t$!Pv%aN12N^sW;25w|hGHy-vbDr3{CF!d;E>BAP4B{*rI%E>Nle zVirkjZ_fp@Z;6nP~V+DDtFgKGwt)ReD_fIkXiejaldE21C;+` zJnJ_%N^iuoV)o+yTRiIuIY-8)bUxvmbqP#>D;u zWj}<__6)BcVrBU+gZKF0d*719A<2D5un?G&z_@72&W@+e!3;kuUMBI4+HaI34HDn@ z=}wuB-S~#acJFb+s(*&vn3 zRUjME>lp*c{T`5BeXfPn^~BVRDeZ1*X8A8~U7v=ReoAaVYH$Bg0Ozn&$$6Kx=0)aU z+n3tgcez+OpuOGO(x;my&hS2kebrnQ8&+?)C>302z*6Tixk<%IBwAA5Q|Pu#R2)TUVE8^O zye_)p^gulZuzL>5xiFSBNdsU=?9X;F%5!A%Yl{CKmFMPx2C2HJZ5T6$i+#5NA9$ntR0WAp3BPuZ|lDOi9fl`Vbm% z9dMt8lGL26g_O9f7BxOq_dFP*B@lEB1a0=s;#Mg;NpA(Z%!?XdgO*OyzcaMReWlqa zct}^4nEvg)+j$nEU1`Yl79=(;o+RuMW)=4(*<5H&*rWIkM%$g{OL%J5JezcM#ygSQ zz_Rc{9ZT}2KqG8UOC{BWwJ<~sKLG!10sCP=yx z83U}`fHz&(kgsk{^syGTzM&AYhimwbJWJNX;EM7PIkZ!$65_+R4FzNr-SHQPEINxU|GLBS|_YO2-fGP(k=%K!I$H%TKRtrP)F;kx#tI+*5I3#S`!IHcRP_k z3Y@nr7P@6_HcC5trJ2s&w=Do9A8qL9 z@7lARJRsk5+h7*K0B6UGPY5uRR`+VL~DMV({L;`l8}T~kBrUusH9^}dj8js zHwn||hnrxUKojb)O?@JkkPFqGM&pv5_fQ$(kI$V zD2B_h*%aAvMoMT6yMMw$<=`?r8{yzzP3`PVa%{)1_z+t{b3yBOn}F?zSUjpO;HtWM zK@!-WocN)1U;kAS9?olMI7VuQ^h`(Qq}R;pR1QTi^G!{BpUUPD06~xwPsp3G{8eoV z$ek`Ay)ytw9AshrtF1Ca{12q5(tIc*eF&xB4K3$Tk{m~(i5g}ePm=mKTfa`EJ@jkS zr?7Q~gEm=K;%d+vXw-nrZq=&DCb`+0A&DJNGCxrrBB>C!tD>2~3nUR(t}7)aji=_7 zpUDs@V!X0ufu;GcIx#h|PKw(GmZQ zFVlX)Q@Qjy&7vyhRMR6Y1L^nB>UdVMQ=Xpxa{-~+MHt7$wx)_srzli4t)SspTlFNZ zIt{)0jd?-Q?lkwJ_5x-GkxY{hiNTxB4xjOiM83v>5AYUC`1b4D z!}$94Q$Z57_#|lfP4S4ok!HXON4m3DlXO39_p89BP4p@?pIxmv3#B4;te|4-$k!1h z@iX#(>ahHM)D~3(_0Gn64*4dhd}I;DGAD8;a5KG4%hZ?h-OF7j2jGB0KfPOOt_2o7 z2ceV%5P?b8dD(j-+0vX}`-l=b!fXY|(qSxDI4aO&Jjy}2lG8#0St_w5zixrb*)1v--nGZHd_?&EOZ`kyI^ zTqhWJDKZfl^+S)cGX$!zj_%TBl)ylj5&9Vx^`@w?A@MW8C-?(?GNUrarO6TgfHpSIEn03z^)e(%k7~NMlK*pCr(uPy^GH^mvD7gQJd$}sHj!lJGpHA;F3d5A zlemsqnu7ESQ4%adZUmFUjX5UBSTGDPfZSdVsA;I-pvs2Rh|(MslO>COzXJe$G>$c#NF%ddD?VVUSO`(Oes# zI}rqZY8Nxv2sEspWN&TZb<(vsNiI+sAKR%Ll1A09;vj&ztdK6dP#kS2>PCn868gD|2_8T&Is zVBN0b`?n9aAfgAT=Mu5nCf}S zLUtd|;j-_m|OLE<5m5a-uUw* ze-mBlG)u089uZh;NyFt5dGm6FN#lv3dZkttYB>Tpq@etXCLf?s0Pf%=^tzjpCUa_&;|D!q1zrzNgt&>8vTDz8oLlTDsL zC<_4Z^6JHqm5zowAQ5#5h zQJ}rL2vlLfSKH87lk5^y$PhR8rdeu8L-?SwB>mu$F8L`!2691<0yQ+M`^h!++~8TN z>Puq@RSt?!43a1Jp=rM&#dmJ}V)at!e9NbQq{j?WH~Z%Cz^W+n48$FFz4Lx*(3I-m zO8qfHXdyd;fEwsy7op>4V4O?_PB zs}lv&@~GVLot{e0^>S_(`vNA_+==I(6BP4)sj2^=tB!te%ZnvcTqwFo&ZiEbj0TYI zRT*OUjLyrIf%uT^S0GPV?y0~l{6XJY^n_Mmc@Uh z3Tv&Y{5}A8=3oi%%Cs!t$LtbiQsBb>Ng95%$KJ3>oXI<)XBl6q9!SJ7K$#~13E>JF zDwFyUZ_J(y#QCW4q2`}*!VsYBcsSgr*3()O1#2BewC8WzfcoP+AbA4amE!EJL;oc5 z_=CRk%vXJN&tj{u&bTZy-ihYwq*_Y;sNeQatzYNXKbZQ|T1PE~KmYHx{4%%vlX@+G zK2?5;E#E2LBc8zuTYh({{6<^;FSq=0TYe+urjhG3u4P;@pSs`nJ4HHVe;41E%aAG9 zRs?Do%ONA>Z~|sgB23Y@5uahD%&g`dgi}`Jm{-_rE4KE$w}eUaD+CUm^s`d<<(#m9 z%wewnU|o6hrJ3^WE|xq5{50QjxvC5I{1)5tTmP^v>v>pkPgi}Y`e&+)|G(HT=1$u( z`@MB@7*-8i#Bfo1ld=!^*Sej^G%T9QwOJ&-sy2(&ce?KJ-Jan8bfNa&ZT(Y|s**;O zDxu^i^nRj*O3WS@LJ>OJg^aydy8BYLu%U1Gi)+u{6vWS3h+CgYB0SS@VC%F-gj4w5 zU~c$H5BRRO@b1^%Ge1$dWPf}%zJh$21bm&H(fa}LwQEv#|8m}9{c2i~T;v#CKGQ9L6!2C^XZq9R}*AlNQ$$`}EqeDyr@K@2A zEkCRurN8ffA+IAs)!ozqwvk3%g^lq{HYTT8JGCbN+NrftxVqe&0IGx$WojLV?#Cu6NePyfi7rrQv4;-&Etjq!vUnI8sseu{~ai{@IE`X=>0#_a~moM zdUX_~`Og;eH%|gx_`gNwrx%N(dg!oip{mP^X1)jOkN8_s@Ujk5na+5t?H;_;{6>d6 z>8b%2`nDrv%8DE+lU-y@T@?K>p~*<`lQRCK>>ErN*Iodc_D19ahja zpcNoMA$Sf}{j8{QG8OaG|Dvtuu&ro=P1I1dXk-DGtYMoQp$9@uBqw|eqYxiDWp0ND zL4(XQ9kjP~>6mrLf2toV7 z{Su4B_XLT!n1rsy=4<+zk59^XTx6k?)307c4wS=pIE}~T3R&WzBk&eguffhRw=jhu z>xkWamV}GY5wO5SurLuFG3I6dErJi&Wk1mCyY>h$QhbC4X_}V8FGY&2BML-R0#$9{ z$Ai&{kk|;q*g?)W{YV1iKv_WR{~lmJ1=D1^E9@5k9vxbyV_aRe0Zj;DpcnE(D` zzI#zhpC|n>*QWU4zm(VZ?~l=1j_CzJsO{^;V-h1m_)iz`J)P#v2@*S9tluK_v_j{` zAF-x+Qc_=QbatVH#D1i}bC9mYsHj=Bwvkv$t+0xBt+@;kc{%**evZh^^wH#q+y=&- z^wDIT=9%#{pz;u1-1ut6`cVATgP-Ah3&*79HcJ&QdksRN?XIc?-S<{sJx!iM44 zeD>G@VM#Ma@X0BZ@u3&K&cu2mKrzuC$Nf2Se}NE#x0oE{>lKsXecb>=zR_a*!1O*s zG@tl1OpWIi1)RVt?Eh(}1gcgBobx{CxC0K?(9c0vz1etVAa6v8?uHCWXnASkd>|v= zhS);Y>VR|Z>R@zLu>ZD>wP?>Y{&Z%d%@KjB8;bb;RD}JNs~R|@ZCr_d@i*E|C!X!7 z#UXze`8%h;+{n=2z~8hw^ILbV6@WAS6TSoaIC>&Jc&|u2_V+muM!mg`*HI$-9@D}) zxA4?d;j=EEM0ScvG3_)yAl!Hwmlllp(0~6e7ilf>mJ557TlPpCE3~%yz_awmS9CD3 z{0+7buiMA+aiaDuocg_THK4_ikB!9;%Ls&sB~PFMC+ckC1g#A}3N$^Z>6x;ApC6TG zW923|7TPuK7VI00jri6a%0`cjHB?fJl&eLb|}MDCFib-}R_N+p}O zTnvFS4VapL(noY5o5oQM6e?Fh}^rMQ&(-9PnhsMq@?+aux zuP?zOLJ}|dt)=4hA!YBIC%?um1LbLd%XDzdSe@q6dCcs120!X&F{47oiPAhf85zG{ zI@I))E8zgDI`T%RxqBZ!u+37g-{m?XpDi-q2Nv2%&aXBudCRBb0%zddF7bl)c>eb! zj}kLhDd04dz`=ek7zfxQ=ZZ57{1=bW`{tVo&FOdmp4B&Vk~@e7g~9=Mb>hA$gV z0j!d9W5wHovFQb&s?Fg)@uB3Rvx}rWqdHZ?Z}@k%vn2Acj_<2LTgO=;&sTxfUj@W% z4@AoXvDcztY&RV$EC~qMr}`{Z{5u?Y zZ&$1$a&Un1#fQo(-vEj7ib`CPJBm84pwngnjPLL1*upbi6Dq|Ni-akjq|f~^g@wDT zwI^2fsH%^g=6#5+=BvGLCWB6x8-tGX3k9OsG?;tvPaYHj+T}#1foWl+;YDdYc{(0a zJsFIT@SGc;@ikKNmJGt&14vXpv{#6gz{I8WqV>#cLbDdc$ik(=?-VpZg%2S<3ms+ouwh&`#M}ySX~eJ`s_&UY^qqzqGU{`n3o62# zpMC*jHt{{-CE|%0ti9*4Bx?_*uCO*{fL+u(AZzQ#-z0v=32sP==;p`W=60EnA(k|^ zk3Ro5N%@Tux;n>n{K%D&HN1wnSq3S7J}BPel2p;`gLt zeDEqU3oLTwwTZlzxW?8fur-!R4T}6yG)0;_f-9H4m{U7wrB&*nje1OJB${KqI>Lr( z@pTH!Njnv2<{Z`2SQ9mn;Gu*XTG9uI;?y^NTD9d`{ogFz;w?! zF)W4?crG%vR&$81fVKr9Up(&k1NKzM{bt;GDfqEa%1G^CX(Es}Xcgudk&;aN6uYe~ z?jENNO_AVJKi#a^`$kQodSW> zc-C8fMbwju*8pF-90;BH2XSb8bfJWIJ*#ZZY9t*YZQD@f+3f)U04edT>fSy_qx4Rrq@}RD%XkIfcD&lWr$vw4 zZy7FwhS8KB8RdSh;K?p`;qTG_n{RVl1YCb!%kVs!t4_9;S)W4bk(wUat*bBaH&tKg z8Dj)Wk7(iFvhXM0M{#3FdfH4wV<5VB!9j%*@DaZ@`nk-YZ6D-&R#q%^=I3%y&!^FC zFRULq`LyVcT^swqwz|XfT3d%V?!73wBkpbOzsMhbmx#mbuaJ}xH8=zLqhf=+a^#eQ zT`Fk={m&Kd4j&n8`zU{8+&chkA!!V79_IRv1qkz(_lYp~eey{;n)>r#)I`_m+LN{S zo<;oasRTE3wLktug2;+bF{vF7^eC5yf%u@mvD_xB-c2)$asjS>TperniBo`%7GZ}L z&^bJ>#ov{`lkz3)3v1AtFh#n3kj*oTY0c;1*ctMp1<@hCK8vQiV04JX9?`X|;M~Rx zfOGl)ci^p%QnU`MKd1UdHBA&P81Hi;mB2@%{tSJaFhD3e4bvfjtwkm_ClvBW^wI#S zpVaZJsSUlahq~C1Sm7o|+a5ZT8n}I!j8lt3xPHb648Xju%kx$C`PKI(pUW2_sQ;Wk zAN(h@Y$)Dmum0q3vY?)*jZdZV0FCoeP4QcTj^-u^hPquesy zm|9>ikS^pYxOmLs;%QOp@u4d)&%gr>3m&Md`PlKk4`{8y@7P+8YpwBuEo$;PE;&CB zwfk4C)#puH>oZAK1{2f}+!mSl>>yUI?K0w}@*Jo!bH$yB53Qs9Op2HX?VGXGn=Wo| zx6c#5@6uv}eSU}wXDI68cA|a0plkga`+S4u4GZnu`UC9q|8#vW`NzQdV%O*U?8qPK z`uszAu1sMY#%at9%cb-yU#;ymx>io9x)p1aT!vK~{r7x^{#X{kc|Z$z+A3DF#MitA z{jp5-$F7ahW&KyJHlBrTpP)Z}6kQQVfAFE+{JWNk757@8ZBu^0vk2=rKM)&KR8x6S zxWse>MSIv7gj2g#LnFwmyACjywGabP%kvLAY z*~yGcBqcs{OS3YnG91&>^$n@?s*V{@FqUw^> zmN`FD`yaqbTEopOh##(C<^ z=+d^23!>ZmFZ^litelxS{`jE7D%Mau=8oK5J85rBOK#I=v;6&+QhBZO)GEL86laId zA96>n^VDbjdviqm-eYpA@n4*$cKPGKIZUpH$Ny0-zctZqZH6op{yP2^Z?q=5R`2=C zeNEI8UB$hJKYE+1)jivs`HQ7APrvnU<1X3MxtYameV%wgulS_QVoyy~J;_2(tELoh zHS3iw{6e5Me;GM*tivq3_Hb<3zK3C{@teQ#&+>HO>Kh8hWnglimBW8s^Rp;hPOW9v zvs^MR|2we9``q`hNWLGC)~335*ME-|R?$-5 zleFFhuE+O1-d?kmGBN*Hd!4_NEIGHQRR2YN3{P3ASVql0KH9X`6WVA+;L`Dl*o=z4 zDs!10u@{Vf8GX$kT^S;_sM8j?4$)#?Mo0xWSqxip^vp{SlK?~}v3!iTnJ)+Mxnd5< z{1~*!xpyVPxU!h!$9OJg;A=d@VJ{<6D%S8@Z;bdr5F5B{W1b{1{EoMSu~954ZCxJn z?Dde)IK-akC-e!_FXPiUl7vBKqxTNba`x^jPJtc2EWCky$L0Q}*4!PqtcTQkwg;OQ zd20#X-zAI|X!3FZb=74^bOe8aDMPTZ{2{plE%*dpO{{Ywy+KBI6$>XgWh*-F_saxX zv7WE;{2O|oIG4m0K@Ze^M@}Cs7BwM5hBdaa0+)42dk4f5dEEn1JcG1)p$yJ{G4^09RD^uet3JuwP$e6D&BxLuv_c-9DI0C zI=`+ZIlOpgocO+9b5QTVO|j9qG=IZuugIGni!FWdXI?O~&lahj1wbh^?VjiO<*4X? z;In{ik}SuHC{!yVi`z74Dj7HDKS)lO%WS?Rvq|!8irGHUn~A<+PpdFm84T7>5X*9D zfpku!B|fZ^H5ig821UF)k<*?RTRWVUnP7c;sGhJ=O{`y2O>9gPY~?EnwtbMts>jci z#3SO~qX>Azg6G8gm4g3TXjQg?z;^6r<+hRWF@4Z}1i_o7M`*K5SuR%iY6j0$D9`z; zS{3Q*h3Pmhw~#ZjmU@F#JHwCpo7!^;^%fGIDe$m1TT?ZI<0B))29)Va%^2)Ufk=YE zNv1o>G9Aessq-0?)8Mle!e?do<;s?v5`ildEy8z6c*V~RkyTZqj40veqPX|0Aks(V zeqK#%P*ZGTlh>KkNE^zVf%^90aqstGQ35;*=Z>mhO;maPIq^Zim2Mh2+9ZXTV`N%z z`Jg*qgcmJdYLa+SW*nMiM)Gx$!ZuHB6(?uS{GIGu@BprCaVhW+5%KHZg*zm`oOp}L zK=nzAAKQ$lS~B;noI#XgISTzR9Zf$N9Ob`*G2HMi?)$9aN=SEYVW!Oivz9@; zK7T=<3e%E|fa4AZ(W_(K--}oCA~rJP$-h}%Z(1x(EzI)Y z=sAB9JzqPV7mvA^YCKtcJ=%`tditg(fqn7x>nZO$kecBsoKww0!uJgxL{nMiZ}GOm2jF^ri3v_xRn=YcAYUJvA=x+nSuz??okI-Ws; zs{-e#uk8M!JaakdajnBTr}+q8hz~hBx%nuNF60nN*%c8%MSwg>I)Z_mIkIzsCw&J3 zGZI}XqQq87{Jqj7guvjDcruIJP47Kkn>Cf}04ZZFW(rr}o> zOjsM)8-6!_zNc!8&(}BzzmyqB4o9zF(f>_iX0HaK+er$dwYO+(mS8*3E`O2XR`MSg zhPP22=aF4840;F}lT{elwJb0%I`NlYn8Ak@uSAIth!+0RiCpj6s#EoqK$H*$j4L;F z+;os^H^WzFwp9@@SpNszUgVSBsO0Nm_nYPstx22(AI`-VC-w9)^1&;Xi>C&WRPQr> z;i101dAeqv%7+1E2vM(uac0Z9n)>teXjGnRR;IQL&YMAPa0V!-G!vKC#{025 z;4)vysQUFXeYteQUg{mJUxBz1U|fS`dY9K9^WG&*{)r}ou?xxqdBEmr=kSKooO5H| zqjVk#)UVR{yUmMhR9xgdb^bojn^n8Ro7=uQTtjiSygRn6*0a%>UkEvij|$ee$!yh9 zm|I(QZt=`t3NS@}tjOA`D{xo7FJp(y)h2q6oyx~&OyzfCoS=UvXH4a;Jw=MTKNc>C z>7&F`U1uvZ=+>NX+v^Y@& zY0!}hcOYJv7sx}LwH7L5uGstH`g-w1563X|I#2EPd-gi>XB_U~(({#E5n&y3cpkUT zQw#l`ul(d$SN$iv*x$D2aDUrZhx5O`ZSUa_C|Lh;pneCAL&#%7o0S}dk z5J2ktd7LQXPe@KnA!eE&lG-s(+?>4{2g|=NdV=V0&FN$Fq%?{CaBS54uZ7?Ax9vW>trIM-!bA*tHikSKocV`2^J(H`X}<_RB5#VXq-|qK?^RL4 z8dVpALfIP*_R0l&<^HPSpidT^603=Kkr%`kxsK-racvU+isfJ4qKMN8P*@s#1+uVL z?vIUCe@aew1$&ig?5P~U;33p*AQP3A#a+&h*PNP@!r%}XdT|ni8&epBWd(zqlRT~5 zoWy3oqg+)b*N^kJYIlqExMqElhUrip0uVMq^gsPV;j2-Ur z0VGXHaJVG85?!AiK$s>I0E}g4fuO8~F$+wUSzx@m>UZ2W-6XSsI5f4fOG;{G`}Mn^ z8(oB$lyHSBfffr!-*fdk({7RM4JfINjbq~tQ*Yeco7o^22TlAI-|X0w+4wCpcr_F| z_0(UooKe4Scsz7sj?4~(7LxikvL#r*w-FIw78n&9Ud9KJbt(vW)+zrd=Ye3XnANW0 zGwf7QQ?)F-$<77rttKqB&_iK4yX4ExiFr#}iYsfY#ud-}BWNxXuf+$di>%i&0v;dg z&IaSnO}`b!#u~_&4IY!(pxdr@sZ~-F3lNlC9$v@?xBO%?>0Hnb-gGY5YUhH7kd!kc zDk+l$ci?b}{Dwd{bCoML^*jZ#Nn(cZRP-=v8u1aSs>7xU%!{nyd&1%XLej}h9hJ@; z3Hy-f#3Eq3=Vcn!jY@u&T3t<4ZSg9cC2}ibsDSI2i>+p1t4$r)o@^z?oflMwLb0hL zuto8H5rH>QPukzr9*(5S4aBczO0VWo8QZgmtP#%J?`o0$(*ADHA0oeU-xilSIxY2@}8oQ*?@$DdP5(P6ndE zWZfBSd11%xg0oF_lDM%+DOfF-0MT|Xk71;8O=Hzcvf9{)Vj-Jsm4R&Hya(n%G(MZA zRKxt11lV9~oKVakpV9}R`Y=hX%DM6-oalChzVTWm)9`rlL(-uv=M;qUXi)-EDi8#r zlzxHO_{vf73n531kZ56TtU!`3lK zP+*`I)kW%$45iX9Gw%kS9AdRqSAxV#?Br0L6rgJG7w}h!0PPe6zQCj)2z%O24uM-0 zVRZsO2%9XwF1Jq-tW5@Mb&55A>;}ae$$=oPI*Bxw)740F=IrKm7jGgsMIjLu&&%i} zmPk_=g!bh!TYsXRA)&+L{r)LEhd>+{WOF|k0mU4qX(rF}38Km%{2h#6#GWTRe}hkd z>|pR2jCmIanRbPfOLUU>oGbavhurA|p*;OY_>~NHPO);xvztI@$g{`J!9iI)RvfdK zv$23R^WG@4L(@}3P1RHoei{guVHUx)bxEw(f%VB2>ypousL@%1-RpZfqJ!*(y9a7g zkA**Deh5ZizF@RJ`bG4OP;`;sF8?-tIvz(M5Nr0$6%?UXiio`O2`T=_S}6F-avcH{ ztz;lIuSARZtF9>_kjxb`#Ydu6$Z^z<8gc~5+clCOgyn1Q*(yBYmt4vsw4tgUzsya^ zjL2%7>S40=Xk?+-W^bFH>Kk$x!Z=>2mCxG0Nhk3c7y_yq>q+p!rrlB#JDpu^2kmCZ z?Lqq*OKYOr<@;cEp9HaiSn(VJ$$WaEsy$jfC%gsMqd>vxwL%L>`ozg>F%`d5$Y= zB_VKtS)`vElh$urH7y>W=~K+L&Hggg>& zE}Z7Ef^kV-@%jYlY5}@Dx=ub|^Ra4<&Q+2q`3k3}Son@l!B?VJq>)O>o;!aN_WIKu zxjC}`zc#TXEqBYLI(O&%cF>aCW15C+_qG|rgNi_Y%y(%|z75pR1tr>}O|_57D$ckKI^JGs|)sP7TG6IhXV$mh?w#!^qx~@647( zhETlkJ#m6-%y!<}LY`Hf8)RN38RFF&k53Gp<3hkXecNMrlWgeok2WWXf^A}l@LX1W zX0D@UpV5~8`VmJnJScWjyw5MF-?1_|-guuo<$gi>{wH$(WcvOVxxX)UKXmi$9R2WV z9O9&+7390gdhc2Ao=x~AOFniUi@8oDk7tpc(J!4AS$iSHyK0*==NrbSi&Ka3tmzw1 z_z>WIj)P2coEpQTt*q6?hh9WSW=9{Fv7e-rB5_$C5cJf)YmGx!ALFCSLQ`ze>X3&m z2cPqS*fLga-;9kej$iwAWG7Q2Vehk&{N&6(A6NB8V(KgLl5kv$+BO%VaeL#k-ndQw z?rYmz(tGc)XmNqGG5zbRT{D+gy?OJ|N_l5~l|8z^OEAaZGNh>Ly5gCihf=hCe_?P3Y8r1iCC5XmVueCZ2p zM;Q?|VS-v9|{Zi3-tSHEe56N+i5AGYw&6!!;(dgQH!!*`WQ?;RSibXV@ z6I+&+pyYR%UlzK`uUGg@*~wqwC+ia@VB(Tgd@Xh}V_8yQVh2&Rsw4ba2MdJN^tQ!3 z8ndADvARrMruc%sbmuhRD+J$7IOHY;alMdJPgjbKVxjOg5~J~agG3rg9f}QE9f*y> zs}Bk#<+{jT7s_>sy)IrY)H&zt$a3Nq;A_qj{$4THnP2BcCMOjH>OUtcAv=BiZ66AS zYkF^#f^F{aJ|35F9WDL=?|dmmd#ELq-5Q^}zhApG{n6rbs_vAkd$X%RjY6QK}!EQ^D!t_OY8x&y1Hc$=Os`5+TSv$h~IDc zB|~azC%=bPjVzwI#*fWgQ*{x1_#pZ!2F>{{;7_3EK{447;cN;Q#Rba z#+niHkI(}=@1Gu7cyGMM@|TPEx-7hJw0M^+hC1-Bzug$?I$re0 z{>Piie_3O9=G-Sd=jsLJJ93*c_->OO|Jw|5Jmc42#=nX2zn$j0@s{s4F@CK9-{~)W zr!{5#U`hCHyyd%8RrpS;!gtB46-iV%cW`_~C+Ip^KSLk8gUy`6#1sLE;I{^M@X6T=9vLU)6XF6F}9u1>u8hV#AAT&KyzPaCBlU zl`NjneWPYGk36WaRp-RcEjjbNlJL8zuZC-y_GZlpt5_%Rh-bIti5L@3E0#3{m$?EeYRxwUVB}i_1xC8p7ktV&^aUW>xi)i9${=q zuU?lUy^gIu+ehki^2cD^ugz_hbschB3%1g|`e~u+&BdpouX!x=cG3Us(Rumhu6TG0 zcAEOp#dxtuPjK?V>d(5uKQF)G1Tx0|P(cINhxR!BkJi*j6}*9C_M^bDir4=Bx}x7d z53g0;kjP|lyo!FB(1UV5q*?TfraBJ?OQw;>z`$%w#bqfxnl}#pOoda2hw&V2I^#B9 zt+`!oK}3yhJ*b$qn+1=`%u@!D5f_LQKqnbH^Dnmu{KZX%uHUaiWlc=Upfa=8zZ_5v(xGNXD}sU|0jwAJBi?`VHF61eOy!>MR zOq(dy&a+V1AN)bZH-vvy7BoEP+-a)%)vrUb=CmB|@1^#y$@FMlf$UujgY@j4-aC=A zkj)k zpnp35Jr;)zJK_D(_5ZM9&~8$HP;iyAm~H(=@wtV9_l?XzMl@I;tK-`#l7uWLnxo&b z`ztGLplkP@PTRdN=m&3E)WGw0mPg%h0B=S?=gXsGIQuuIGddqrZ~gS*ei~!2`Zc!V z1pc}FnKX>?#NYSivh%loQjYyIJpO(`?g=wL>aWXhcnxc*|K5UzA6d`BjF!lGK6c$< zg?G8c%Y49Mw4k^Jx8lu)H>;07Ly;ecu(0Onxf^jb&Wx^b=eFwFvp7(<>Smnn6E+=? z_h+)GtwmpbQ0xi%>I3Kb(Vit{_;!P^pD)GFWXI2C$1h~*xmyi$i;=rAerCw(_av7Q z$@l8HTg-T*%9|NKlVe0eUf1dasvff)3s$y~8`sSQPeb_RHgaDwVs6n>GD;##z1d7? zi($5qPtR>xqWe3Ih~XWgJ^Cv$%!uXRqW|ePzy9^F8Om@OkJe{)=-r35AC7?WGh!9x z8R_?2J(gdYejUc^?DT6MulJ>2M^N|7^y_6p85x`_#n|1MXo_bx?azw3o6TA0o6Z!< zxh}Qlcbr;kr-M*MO1W*8aby^-?c9c{yLN9sqs#w$7^nh7t_)@vW}e}~5~cqcT|Z2W z__X3)X?Y_2N~bgUyXnea&FluFqc5IU+#c7%2N}DzzI|qFeD0K1_N#LNhKGhmmc}ND ziyCmN!QUq~M!f`L_l(HU9xZ_d8L?^K{?pj9fAAWvw+*wW`;hK?L*IVXaGi}G&ZLsd zu?AcgaJ{d)cB001AHp+6_wCfTA0eUp5HIl~nFf<~h3?y>Z~w?}ov_R0cOUZY+Wt}U zbrhf;J~Nj0_pY5%3l6wDw;z!jC@yn8+P8hX<=SeOy^+Y@nru~rn?koPjltkM70!8MGKnru4% z>-7wp*oJ00-4cAt^b3a4O|6&t_8Y}6m zzlx2-FS;N@$QmuN^XzpUvg-{W1%4z;g7h|xUlgA!3xXlfm4F?PzOP;Ppf_6YtlpB5(byo_J!2VFV{Uu8fTJgvJ@|zC2%(#^`U6$t z%KkMzYS-9g*VwW=dxTWTpNz(SHHn;#mX6UEA#3FvOTgUBQI^F~za->A zKAd7pHeg;TGuxu29&TS&X1~|yAWmhwwKcK^RvU>AkBlz#N{GET^;pHoK3}WJ`teFO z2u)0mRo?yldzVFJt2nG1-j*3L_h)qfOZ8JQ(3V$k4dGhwoE+5RQ`4Cot?50fx5}Gf zgDbopwjm1OkNHJ8v-uqheciRS>8!i<8H0@b`S-5!$8>eMy7ZptFG$7 zI9t#Yid7PR2(T|A;P} zw_zeJ02eJRK|ZZ_lnzpYeRo*MM1`pEcFc{2F7KIZhCH+rq@4q_(;oD-8m=C@A?*?I zr{o!hAIoz~z%=Y5-^V^;a1Yw%w|{r(|2Q`2ng> z!wP86hOX*eVwjYE@uS!j!;Q$~I4PA9!@|~A_TKEk#4NI;Lg_E$kZaDp) z5v{oV{0y_gqq12;$iVq#I@B>kd$wX&?-IV{*i9W4T}AOFCEw%(m^jY~XX_`~n!OU) zuDB&y>dk`8ntF!H25qGf&@uyTHRzLf8V~nsk1fqXE00aS^E;Way4GN|`yYd@V}1LZ z&S>~=sc*Ab4Asb{Eqj$Q9Y=pLeh`InznjgRpxNwg1Z9G;X77IaCD(kRZ}hIw*jQUc z0?Y@Md>NXr#KXTr{!P@vRl}sv{E{U8izQ-nNpHsHk_-Gh&p*J8!xef$mA4Y}yLXxj z94Ch+=8K`ZjuX8Y8{SUHc_Q-M>%YsR#bgI2H1!#8BfnbsA;DVn*!2XSw|-6v*P3c; zzB808_~!>b*g|_X>Fct+LosENW&VWWI;(USiZqodhiA4D~}J zg>o63Y$R~+$4fc7<_j=pU%(@O3gyql#IHW4`Bcx9QwaM`?<6wlall{iS^0;wJQ3$Y z@arixb^VO_IhO;c)th97`;oYsp5GHdG`9FyDE4R7c{L{0^$TjJH87{534E51lqM7<;N#AEl-)Buse0WNNF{Jxvb|6T5vXGh1w|ZhORig)A)zw^dTRtN)1EDPqJ&%bGTM62mzB4=~tKDrKVb7%t(F zweW*#j`piLlFd^!v|ZWu&}5oqGy^6`jgj%C#^yT2A~a+&y#DiaNNe7!Ir9{IkZ~Sm zWEW3T76S#1p3h=()jjTNMhQRl!X;<#XkrF#3~KhCvSuaw`*;5{{T=7@7neTs?PO;z z+3RcQ92XJgs3mzaCjjvzvOb~P(H^JUKeX1tMHDGK;QqfMg%LvEiVhyQ%!aS@_oEj; zQH;K6a!AwxS{obePi!pN_@C^`3s$!33cTiB;2(@}#u!pwCe!^pY7=fkz_w%M5*P&! zmwvoQ_Urk2_aMf@z6>r~>@SH5b`iqpMaQ-`G zL~9KC_G;_D#I|BdV;>s1+NQ_L#n1vPQ6nC3%Yl}r)=b34j9%jC)E=eaPjuIDVP%C9 zQ3rln=Hqzls1r5BigI-b$AL~cFx8V4d=iS2fWsd1IIDJukR5lIP$1_ucEr!RSyW=r zYC52G?q8DITp@d`y8n2soXOi*N3W$3wj|>h+@aX`-A(Vg%6xC>+J^E>yf$$Ne~pRa zwKgl7=Vj3|QEAFZzy;_eub9V;*thyR_ctY6;Uj?Dqc!)zytQZTy<9{4m&Aj)F9`eU zJebQ#a64H({{!7npNFf@=J8|(`5+md_@oT-fxZu=@9Mm;Zk_>NyUiZJY-k&1xb;|& zE*WNA-m*=%a?bA4HrzVI+}L?YkL6|Pod@JIl8&=Saoz|y95CBEKQOm3$c^t(?6x80vCvF*JebcU*c38k&FD3*17tIL%Rq^DxuoL`71gO{7Jd(H&~`;w`nZ{kgsdOma>fclJI4IF=7El{>-AW&Ef02E4w^z(~5U@vR zRNo-X-64X*YHQx`<^)_Ha{7jmZ_G<E=<=~6!_O*eJtki-y@pa&cJwto?&rb=z(#>P$M>>{^=mIeS4dFB2nx9eMTph9? zbhX9%h9tgxqOXq=12eICzLqF5vPj+^aeE9&qggHhOGMR;cC90iU5*>Pa8uq_hVY~BvI`c zuv8YWr80pVW1MLCd+dl@y6+`xi_%pa>4SovWPY8@*dcCaW7HdUKS!lG7F&DltK^Faj%@jjdifQEoJVOD-sH| zu-wbT$HMDH&wGxK)XRCap(3XkvGy-mbShmBp5oB{4_Ckq>2x99{*C;bscl%6qiv{U zDZk;~?55sK6lK7^kZv~hf@eE5RX$B)d3;(8jN-evv}_y4u~8Q)cxmbe=EoI!+)Y#{dtf~(QQsN z--|RO(wNWEeY<6UdI;hU$+ibu6kMzmZW1@B2j7uW*CoegsUMbLZX?_MqLm?>tyBMwTV>1vQ18 z7xAF{whIkTDiq@Iq?_lH@D{o(vSgb`|VEIkt7--1lgg^Od{P3K@jPf-Fe z!1|BEhwVF(V%fKS8y}uMh}-#{J+2mvS^^)g8&VuPC-`J2HtjLE&xa3S+uPvwDEJWG zUPW2tkiWH4@pN+2W4n{|J3q(Vp71668m@q_q;Il{Uy$YWiSC`Jn|;!^@I8w3CV8zp zaWN9QO?K}Y+KuI19d)nkOi1^JNcV13-GfL}_a3EtBb@H}ch{8jy5U=FIhIo=#M{iU z892?$c1{X3E^9wMPklGH(|HL5dNlFv!d(*T-twr4u3b$akUOm3ItPLWSu;z z@{6JuUd&p{`d1~5@GyN|{MGRp3;xC$hl*qKA)(#o1Tzk4)wp$bozSsmXKVwmRp1=Q zy~U!q$B30=#?Q+7TCog{EMcD>-FepB-gJNih#lJcXPyu>!gV@#TS>%zmbBmZOOt0w z`-784laf_lYx3oT9HvTEAkQo!IGbGibHm>Th_tn0|^?M~_ z8>vCyc3^2H%rP?ww;-vh^-~&de?qYV&h$wOmjMrE{dW`;qQ|M4m7KMkWg$Cl&i)}} zjX!^Eh0@Cih(GO7>r;TtOk6KgeuqdULJF9+;b0@LC=vo*w$#_&i$b6PzgR3S(qa?n zVa?$!iC;1uc_Pq-xBf~EB)ec>e}eSqxjuH8EKRMpvlI6Z=x-6*j_nUVG`6jCT)L=-sKKO7nX>1vB%sR-dB5f zQ$r3+Yb~^cOS2IxV})_%)7oS8l3*__qqnm$)uPsv7+0}Fn==Y)Mj&z6nBj~IuSMcc zfq#P*`8>tiO7lS(e%$gSdpp{i-wRPizlsgG#@o|$*cFK0J_URzi&c$w=}qruvN&c^ zKGfyWzpGq^3IqT3~#Ba zB@S+RbOzoJ!qt?=bEtZ5UagC2HJ^k#pwzy;l!wPg_Lo2! zNt4xNsmE%8_S#BwpjkVLuqDhc-CvxJYDS3@5)yM34mvHhLvg1q%%~Y+T~{sZ)%8~@ z*IWCl6UQ6(-C$FFVMgs+Xng%XI`^HlMdwQNp{fUN1e1voM`@*+nsl^ct4e`KXBu8%=}#qF^Ir;3W=zOH@T z&902DO((VS+an{p{wyL*+y@&P#chOLer}Vn4&NkwYcV(%Q=hQ=)zS3b3RZ;59aHtm z?%SB{^?rhJRQEa^$n#4Fz61rU4oKtjZ+o%>(ySiIpXz_GqG5}Ukn8#<@h7giL*{p( z@*}RD2g28kztpVOPP)`|)_yu#ngdqkFq<-&S6X}T?vFp#IbPupOs{_-URnzaIG}@v zm^QaG-`s4iI^YtmHjQtx?}-6MZh`oixjvV;19Vgl_m477%6q21LD;`q<>0TwETtxH zjx%xP_QcJXi3=8=CPsS7gW7f*)3x%~0aIk8e_2KS-{JEE`u`4>BNwU++ zexUv*;Ld)V4PX2<#Yb4+n2DF3mGn?{rjX__C>$qs zaq$=s@8lBWxeqNw&B~_qc*N&gX61R*F3yarx#>3^<&SS4A6LHIYM$)*so_LUVH$q@ z<^#99NWRw}tf-$Ksy+}fU*%|3{^#(*naOWqnd{W*!_pd-jKgKsJA?P_5LhzCLc?`f zk6*Ypes-wgJG{D8GS&W4-|Y5g;Oa+x4ZlmyptiP3$TvOob++Tt>kDoZ2LS@bt59_+ zNJw5{87h|=xG->MB7ebS3LOVLbaKiGBT3mFHhs+ z7no0ngDRX8`Zm776i`h<|Lj({b!stOKkT26*TD7eAx2{ZyC&A5WI@Nd`{fuN?1o97oIV( zc}LAKy>Z&-GqfMJcJGbgs$`?wJGKjY5PwV?-5h(H>d&_Z_9w^b&wX}(zG@Q|lgP|{ zB3_Mg`ZG=(*`+^tCvKxBIT^LX`5B&3qWy4l_uCv9&`??Z^D7$OOkzmGubnPYzv|E1 zjRW9QCkrOvlkU&HLGZ!9R`~9vW?}3s@9*=uI1-DL&i17b>49R7rmv2{xcV z{RlB9aYPnQbmev%G`9g7TOa*IxZqc<=IPTZxG;RC3UQh_DM!E|uyFjr;pyvBuxJ!| z96%U3iEsYTwV$Jpo0R+CwvUD|Ha3GLVZ~6Fnpeb>Z2C0T_W?_}f5U$^GOMrl1IO=; z{5RV9hotg5dBvf#dv|2k`N*sbky-3!p4dFAudnv4ll|i>Q-0#$@|%ZdY~~2$=2>6` zb*So|P)+ZWrr+!ze~a?PgUd?+DrlsFM*5uUN3sX|s36JzDF4~PazoMax2H9ZX3U_A(m3{W#V=??ZQKa*l>3c(i-nU+)ulY7jFS6hfi11Pn*@s;cyy{ zXpwoY$h=JHOqu_NlO`gf_RI(TxU9M~)Ar*BaH+Wzpe z#}0~cn9cu&w0LCj{EoNtC*hTXRjN7Fz76R8(%nJr8LE89#z)!{tGG2%fzPo``+Uzuv{-eWYFgra|Ku zdZ6A}>R!(D{D6j=-SPcH;|DXBtUkCuYsuJ*m2#+jVQhA-K1w~#QM9-G22M6}|E40^-Kg|W$qh&6n z-?$Dp9d5K)Q)}cQ2C(qLpfoia+*6wpjV6(s3CbJ!x&Vmnur?v3{}@Ey+M4I!cC=|L zOXcXf9N zG~O9BAK=Ru?eZ7lixf~8BM%D7^59@iM(s{jlNhqZq9^cFhq<0-ewj{1w(u{39}bw} zXUw#+jf(F8Gm3kUoF*|`a#&4{mH0Syw6A`o&RG-R4t@1Gd*xzmH*E0z-xRc=`rnn* zd>u}6n!(|dRs;9+&9ky>sDXtc|7%+K3yjHzJn;J5V0a_HT~{fwjUeh~oGoy++V>pz z)E5rU-)~YRl(FQQle8UM{bI12eMPh>y4Vx(IMfMhJ(y_@`K#Q zd{~;c*Gu&Gdewe@*v&Mh_929c!YSQDV3Tf4g2d|bchoAqfms_Me{Z6^@Z;D*;m1ZA z&xo!ks!OfIkO4<*mCw=kwn02Q2vzMX38#^|MQ)k}Qp-@d0@LmGaX{Gir~p zdymBWSh2A9-Jks8a!SsQY$^ifXtz z(#mP~?imrc^3E(LnD`3=@Nbb*zy3mJ`B%A{EzZI!gLd3pV3R2>o)s=>rpiS#Zbu6a z+`n(RtqB{hy)J}<-hD8Bc*u-MeyWkbNFzdj-vHkF^HO&x2GpJPEbBa3b0|J7;TX%= zUUSK618?v3B{U;ru*c-$7~}eq%==rG+btcSrO2Y*$f668Md#&H7Lyk8@2dT^;y=jL z!Rw2g?fNd#cm7)U?D>Pqw-gCn=f?6z+xAWH(?-u$78M{2;|5=G#F>Hr zEC|YjJ@y%J;cc6VFkkyJK8-(e;{_W%hB0*^<=;A@Oqen_;XqPSrP-^jO@3n3josmI(+L{h1MPERza_ok{_S~Vs z^@oq4fPYwEUCT%4P+L#T>7)D5+XPv-l*8;0)9hYC_J9wqTG1iaT>IslpobjPo3aO? zeh<5MMMU40aM6%kYYT+~e&QUnX4s#CNc- zriy)#axs~$k__b;`jj(c9(rSJInXytoI&}O#zW_pa zv&0-y@`YI9t=1@M+Cc_xaRqs3#=1$@QjESG!?bhHZN z9xD{IXSIJi+$coBIiSc+g6 z{z9>o*(x!iZgX|-1uvTm`1}Hf4U#!eLm6%TgW?C%yol!)R2wI>=5gdAcX*+ylzXbS zhoY?oCaG?(`&{h6)4GB?L}*x1KNrq6w8n z>kG@GD~Lg{Q6jNofepsy4K0f{aH3<9T+7kcw^N^bSHa3%;xxzoQB+}d(`RS?x``su z=$5Vzx8bFtUd<%xm3VLg;NbudpPf|GPsxWMhgFG&L6{5hD)AAclkZohzH`iq(=Una zQB1DcCi{(5D)grvw2gpzS~!0=-MT3Hrvo3so6PP#)?PLN1>Vo8`R=HdQz4GS!FYPt zi4TxE%0y!)|E=aKk}_vQ^Dr&dp-57m$pyeUpx7i}PNrW_&Yt?j=ec1N)3}=V<#-Xx zNyHo`60Z}Y_9Z&8;7XDwgzNeWUUZ4tQfAI7RH@*KlrdkkbBE`+z+n4JB!@5JOZ^vq ziD#X^L0mjkzE~YTZheU#ak`VHl{=VIn~8tF3K}cqX>$OhPjnF3~57k-z%}%E)EHya|Wx$)1u-^nO;8mI(@I=b?@c0e4c9; z=hw~JQ!}{8$+eY17RG9B$cTj|XSiPD4i|G(4{es|p{cS>ja2y|}rmR;~#u7Md&4(|PG1h^s`6W_b zD7`581aN-gRy(;+TR+G3!Yupc3SKf_n2|1!WwZEi$k=1kzd=`?hkL=!xZq3+HwsU0 zp)VI~55-cv1cjGdlhggb;W|84Ew9s0N3x7Xaw_SA2kbAA1K3Z6*IK_xmP5K^cJH-b z=9{gj#cp_5#`~s9D6y%YAoL6*v2KP7rWP+3vGxjJq@xwM583?0<^ylRMQx^H({=ba z?12jhX`boIu#T!$8yOczZI0;XCdAUqnV-$zlAUj|Q@OOm6BNF&m~3hJ^u1J-1jXk| zDzvmGp-n?`z@rh_xhAGMjC`7l|I8+lO?neIJVhtrs7J`8=(Kp>PKngt@Rs#evMNGO zlYWYS2(jwsot*u;6Hjw^2}e>4PTvK@b&*qdli9fN#m5(_Va;9(HCHVWK=M=_t)P7bG;d2UQI%-EL zLVHf(j3W=Sx_67(psuZsO|Ps@&P8J3Uy{?HHGhZJ6&D7zG8_gxdauKPQ9U)%6>m=i zR%>?4eE;rCQgW^e@G}w#DY4aIGPqZY9zcj_83w=x$cniJqvHu~YlmkqQu(oFZsC7@ zT?>=)X!Ti{e&zPT9#8jf+kZiu$K8YNzO6)AxqL<}?@L_vkZZWk1Y&u^_(92@5#c<5 zW9rkV*5{X+Ro9)PP=Dd;E;swH1wN?cESdzbDA3?nSNX zhnYQ7q`xVA3@?SZS=G{T?1n1o=uyR0rq_QB26%3|B64dqnFe?0XH*mbA&3g0>eJS2 z1l*`$f)2#TYr<;ZoU!k$&B}5W*Fk?F}ssbWgG}nlHy6`XO{NtlqIYCGF-J! z6Vz7pih{%pqKc~14}9x-GKqh36fiKg9x}e&nML}2pdYYa{-Ogc>&rkO@mpTGqeKPe z8Uevdqy)RUhV?{T|2Fob_!(0K>wjJZSb`H$f9Y2fu=NiZmUW>)*G>&5HL zM#O`Hw1@uS%1BIL^eBkd7iByz8;X6F~nD%NvN2^Gl|Ks=8f|3wL2Q^Xpt zD89tL@af=+FUo~ays8VI#vY%jE_~XfE_@>2VJ>~Lxb&&$B?@d}LCCthsFll~Hmb#7 zvp`K&N^9C#k;!UbLP@E66MMz0#dwtKI!@ZYcC7rT2v&KzZcO5LtTZbS`Enpqk42$g zuvKC(xPw!xkO#44t_TNv#Eu~H7Q4fDxtO`;Wo`WxvPPBh+%s8?ae9Rsqi574I?u&T zTy(W~#IY~S^IhuK9&ZtLfeLQmo6uula;1E;x!mf2jFll3?PjcdR2iU81n3D_rGJUvg0UYf0&Z=m({#JiwF zeWrENS-0ttFX-S#Dt%u%U2w)uFU_GWi~w3BIl z*GWIQky!uMH+i%9lP&?0w#$82W-sFA0taZ|x@mhNppmE!XRSl_mn0ED0pR=q>I7Mf2XZ~$We1o)Dmy&AxF(UQJbf&Uxb=#_X|Dx zO2?KVCXNNRi6eXiBqRFobq-evncGhOo38z+P5TEnLf;5z8#w3Fr-if0Cro7lzud|_ z`YmB4qqO~fecii>#jufoU5ME-E%18rX#>g~Bj;9ff+o`q87C$`<0wd*wdTWWsu5uJ zs`G_nkSm~c%J1_gI#I@D?NzEXzpOMQ=t8eM6 ziJ6VFm1D1pmZOihMHe6er?nBeL?pF{rJTNwXnDR=6y7pBn*TxlH8Gtr7?0rIVPs@X z{ZuXc#N$-B6}gX07`EYGRnYLCw$kCHmt8kuUxXV>briHxNlppAfL@&g`t8=I8S0c#SMP|M&%T@B=ui#z&>nIy9%!<$M_?dVH-Va zzs@Xs_DU1)$yvZr6Pcu$Oj7-4ijSyungrmj-YHg|=(G-2{NTIZ_qzZ7f(De@E>6xLVGc9P5@KA zD^8q)$h`BxsVnJAxR$~9V}t1d+q)j=cag8Vo$)VZkkdd`eE~7*Z<@kGMJRU9V{RaE zgBO{H(7k5NG?JC$ggqY&Zw1m-g6gfGz`wa!1j`E5W-!i~v$Pi{Jtz?=W-Os|gj8I@ z5VRM!7%q!JK8ee-;Yy&L5(aq0>NAdkq8-+S_uUR7aw9@Q1>HqN5cNnLRq(&7PkQCe zYr$7#QKk`@mvVRs`9ILY-{?2=jThZt?%+GfJ{Z%nK4KCB6mq4K;>WUR`0djUBid9` z!eXB|t6+HIG^v8M6K()&qYswIftElSBCmvC=yJqms`m746&OhpV?Z~_nXhuPyhtH8 zH%8Rnc@ch79)Rqqe>thgU>#v0$3<<`FWJP?8my*jSx>aE$QJ_I*Y(pBJs0;Sd=rEW zH+8K`G;Hm)tp@4&w#AIx-eS+6)g_Nli5w~?+5+ewN`h>#rFG4!nhBM9Sd3%ujV*^b(3(Mt;H=|Q-W{5xlIdp7{2#m zM_TZhZoWoD!o*h21S(_XOB@_hGmv^9d^5HrIqj@6c= zCr56oxBV-q((oT!^{cLbu;G`85`mmR4P7tV?=(-u{L)`??CL)feeL~ujpEy=U_;q6 zK@~i@MVrw6kcNlLgt+#j76*RMfxUhG_R|;KmOOt(6y8OiAfcyYd7qCyROmlmKPk3y z!c~CA{BB{*&8wwg)frE zhYNfioCv{6@MXDqF!tvujg%o{smnYU@5+%22rtAf4|!T5U)I)d(Vjk=%tffqRG#`w zv^wqSw%8LnQi1KE*AZEgDXt{Q^W^>$!wSi;X8E@@%n6^ayJhM_`KxXZZ>jqN=g17A z9r@!N=Gwy7v0N1tj4mqj9p^+GP6X_#wO}qLdUh~t8qr3!T6eeg;)P|ymxwgmxGp39 z@YBVo!&@HyL)ZIu`o;XXZnm@^poN*VUncF}O8b-KqN(Z~b{7QZsvF0H+={lcAWgtr z?*w`Jw;87Uk@^!SH>TQsR<-*=*N4e=?O&OWV*o@=#|QGTjR5-mVnmD_;dkmh?9rzs zftlRQZxRlh>A-RSar;~>lh`mN=8o}QY{NuW1{@vYOz}=I%l!s4u4DgTHd(s#=vaw4 zzGRCLp0?`vv?23k>YA*^rlXDN@v!#}Y{kooQ%@bZDd=XW&b;G>5m_dC@)zuMO!4V- zHjwAD)OfnXMdnO8tR2%giL`6-^d-cG_vw3l>$n36R9 zPhC{7O7OoZjsKCni39N8cidjIF1SsLsC`F<`X`j)3@suj-#D9GE~l%*Z;HaarG7F< z6^iAHxf&ep#>M?wXP!>ijS#xa;ZS*aD4FFvC9#fmxd$&P>G5aMRroio3GDV%zg_~Kq6Hq+wUEgfkR?4IOo0|VM*d**0qTBxc68||w5rfG85TCw zzIEnq!zaMd*2op*GQV}X0!M+zXYIbf?IS9-%e9+P82F*Q)vxO%LKpSBL(zwdLe+;u z)$h-Xj{j&@Bs4ao%b{yUH$7B+i99M&MiRbiUaWs6=YaJc_~Do}1VbiZ))hFY%v$6f zg%rdc0nYY;eHqAWykR$jzz(o)ufzNx2z2+Oq--Zt#hJdUJkjs;Ivm`t)$S~5){eY zr)X~I4X5 zq@;tKA2Q;uM&dQsEtUEIdP(zV#dr_(WhSvxVR$hWi{ZJ zNej9nEGi{gI+RY%jMT|MNoVuRNsrVyepoh{?h-O>?l($^+F5^f?^Yro;*;I=tHBTQ z62%Mh8w2^x7E(8N>q3Cq8o4?PNEqg;jGg=FHpPz=Cz{(_Z^kUKBsto zRgX1$8-WVXAInNbkFAzhOxk+WM~$SMXFi0xORB);yWqk@f(y$-(FdkD2obt*vUp!g99;zrB|`QVD!-{cC^o{PR_M!qJn`ar&(AMiEuHFds$ zd9NEv801p{;V2v#6}kj`IAkmyh$uE+wE2eOTbkK{MOgTTdKDNd#<5dD@^QI4PXfI7 z;))%Zm|*@^P_mi%-#}8JDA2@MmE_m|@8L-dGJ)qR1?!98slH}LR$UsNha#&KJkcD6 zULT_S01?i<(J$eueh{i(IRpF5?J9*n_B_Y z`hZ+68Ou}lZt>ivJoM%j{&Foib+zEsXoSGTQ1#xq(J}i1X5MgzKc+>~t4T6JG?mzV z;OjI9A9(*_;VAU%6`Z{m`|Z_2&eZ<^`lura%+OD<^w5uf;_{V#4fL0LTC*71L79~7 zdz=y4vQJyHgm1R|v)fCJ2gc8MQo_Lu{VOegf>@0AYucv&0dns@h59ck_q4}rXg@8? z*ug}YDY|vW|2Oq#kf>`-btlb_Y&j(hLBjugs zTXPfN@i%;_FzB~xe#qH(ie^xzb?W{FV zRe0|fPZZ`Q7#%isu_yX) z!OGA3&o#^z2aoF)=YZv6PnX4?82C40%rE0A%*FZ`0(Qhn8tHx}SbdC!S6xZOxhqKV z7|)!iSn3-V$DA_GO#CmF=TEaa=mZ`9K=WaohYfiWTb}QgFpM6ph!pN!V%>#BxG9l& zQmY^P)HPVIs`qVANIY#WVlIn?Hs#PC+$4)WwC;z{Z2rX>HGAR=_7e=vlYKo8TG2VJ z=$Ka2u2qmWVe^V2IjTU((<;jtww|;FJq+mBNv(C;5M8Ul(Xw)zw(vE879b1?dko{_ z+9QwC1Rt_Hv7f1u+jzLB@=0VCH%zmPNHgvL-YHz z$dgR1KJ`u%LkY{^Z*3T2ZYFN_3Fax1C&uxqf&5h~K$_)(G_iVcMk{~A-_h{ZvgoQJ zU#l!zYP?Hvk7XyN0w)4ix1e^RTyW}{o#nn(U_D>+;o8GeTl3w+ZJ;#(U5uB768%tt zem)Q-2Y>kv45&!(qUog^@KI})`x6B+ZXlyI#f07}*hcY8Kl~|nmjvp2u2$PQ?7mcG zzcos2uN|Ydc6O1vm#8VYLH5_w9H;{8RHg+zvgve;4X15GmI#2@q9fjbGY?C&MX%5z z`!aE@sV3Fx;w}w!y;$voSu=;Gc z&pe@-?R;RXrHvoCpG0j5rTTkvV|lckn4eq*i*KE;SE`hYlEH_vtZ7&$b|g&tE>rCZ zL~9FVF2l2=sh{visdDOSDSHh6>yN!o+9cSw$TORt?h@9eZpL}d4p4DQZ1C*T2usB^ zD$P<8!=F=3No>p$wdO7|a zVBh=gKOQirVOKC1xs%@1S|~x2A9Gl%;;Zmi!{3bwf>@$+yJ4?%t1qDo+{B>~J@atQaHGOKp!V!%dWp798a#NK5Wk18Yc5EK$3ksQ z1iHt{AT~mARj=ZEVkuhwkX^iB{DUmv2pvE|5=T8vBDDB1aJuFP z7~=UIwN`%lIO3nK<>NY%bXW?EHWSFg8`)|r`jCHYyA>TXw2C)%Z9?aYv5LP2*k}%D z3qGR!xV?&?a11 z@g>R~TSDbWsQjc<{!u_Hy1+wgkFf1F>F@Nz_;1siyi_GfeTf!1jyL{TcwgOO|D6T( z75-ffIC5+^PZ0S+>{RRM!PEu$tEPgnUo_aA3vi^>@NWx6%LQXk__>`d-@kH<&>1UO z__zPWEOXlT>QAKY1;M5`;`3!K+zFRTGM`_f?TV59D6Z}b5fkt6q?k{zAM=rVh5JnO zZ-oE&Un4@E7CIxEWzfvu43Y>XXyJ$9Io1)ycuH8iZ50EPVeZn*HKY;D?{R)o_$;0e zK;wo}`Su)7KLpRU_x&rgKhT&`nK${f8;DkX%%2IpE3Oh2tU$bvPYV(!LfW{u`LysY zUKhQM3N-$t1s>v0h+6`{|4>z_YgH|FRjN|zdlLyU;oJ(J&C&%Q$i3hrsc$c}fDj@= zT6wJ8$kRexH5R=Dm+!FNRV##y;vLqv`t$pwy%S0qX))Z>j(&1fU=6txDpKJB60bK= z2#|&O7kL%26iU}17j4az0>S&K*5;?RJlWGS_jgHtDwm$7`RU)`f0@=#&x_HVZ6tW< zy@p&p?x?4-#ms#Ye{k3k(a-Qh)tbLVVS{+#+WME|RufPBqXK0`&|_ce)1KapXKy9G zIlgW=u#Jx)OFUM*9@g8OWZT4|`Xk-k%+F~(7H$-!lKZ=5UG4V90*WzCTg)ds7c4#2qk+n*H`puLMZ70!S8MJo3NWC0!? zFi-q`1LhkEpHQ86nqwYxh3MmBs7Pirs6<3R`j2M%D?LP;X_)ALxq%(N>+3EhC4!=rm)Kgl zHZmzBy3opBMk_}tcSJ<;TT(0kIe357`;LTQF9>W8c_%s|0_@j(f`Xr8p(i3jE8;CF z9r!8)Kz40S7QCBlBSlWwkxN8%KOkejzQS9HgV;`{Swsg81tLA>is%qg@yFq^9W8D+ zp2Q2sYFO=o@`B!cs!NZ>u+7P-lk8^#pRSEU&435 z;FNso($;(qUMu^W^L}H?r(hz$laf#O4w6qwH0l0VxkDGl82rfJD1u2sLzT&*dZnnU z_bB1i$fz^8RYW$XbaRVlKFPP@)7De`^pj7mfww9ihUa_#VcB++WmI5Rc&@{s$S-Iw}_{cws=y= zr^M5HQswSTi6>m}7HtxrGm8Tcj(o5_MO&%y^pj8DKA4hE09Rlw#9GK-Sv>ply@`fj zi-79Vit@eEFOublJlYxw&1~IE&9;bI&Xb6!VB$Cbo)l4ck+v==m2~r!1-G#+=Ii8K zo5VTReWzGmvKfvcLo{;GcB1gSriLOY_=46vLu8t^-i6Fr7K~>9=KN;l#*oX;i$_OTon`Je3?h;xFpY1YE2Y8;oL`jN@_mCF2uueFi_TYV& zwZ0{5{r!A9g>m7yc<%0^(B!MKrGg5cs}7R(I>vyV0-M8119jkP_?gGrp@x5{x2|Tk zTv>qSaHXK>VRei{!HZD;z)3;vOy6y+=76CA@-;F)+`+-?O0_aS%15VOnBeM7LQjME zARQa~b74^&=ao@DZjVyT7<6#LVS8jPf)I>szl;o%hVn^H$jC5dcy74atwzRkl{hww znd221*#RpX+E(k%fcX*I7;4&(rso6`?gOw*e^$i9EdyEUH%>`OY<&U6%G%3}slQbN zv(3&5bsQiZPLA0gu)qY|!BR1j(n)xlzfh%RmuIE*Yq*`G-w9b)!B#-B?1l+Y@`UV_ z^3#-wMnsh8@jc4VL(xV~;y*wkrF+>x)|z+2br{VJ9H^IHFom2;6_s1sgr$ngv1)0L z-U=fSs!URO(EP2s0ED#uB#vi2PQc^Np%o`-n;g*hxC%wASWIOO4D&s%t#Fut>Kiyc z?jCQAqTWhOvNEB+%n>q&kaJWrbl@4gk##O_#Qo=O`hVP@-nfQPr4=ela9iTxmV^(d zx`q5`m7@Y&4)KAiYYL4*won>&N?H)QPg7dyFC0pvS`SQ)k10x1c^yhq%@y(Wl@z_b z;?Ub8a-oLU$5h31b}>VOt=!FD#Foug>glJ5FKq(cT>BoUIy1DeZu5l-4imyUbykuS zI?bK3UHE9TWPk$&wMRb-Zm8x<_$$HXuO?y1I!Z zwtT~%&>sIMUJdhp4}MZwcm#lL1H<_{bBz2bpq7~TyUm?|pL{vN>UU%g9$QHx#Lkb} z=wClQP5OmYqWgDg;oUrNf7ePayp1PC>KN{Xy9JT5ja2Ul2#!MkS-mIj`F}*gv#v$W zQ1B9THFxz?ik!+}tJ%rqA$w#OpRr0YLsEXO6K#B#NGI-j-+HpKpCi zy`pcy9I}^=W09aXLTI^B@q}P;oAoYjab7n2`==ZPaSl04|A2hD{Wh^(Q7ikMZ0F@8WN%nlP!zEM=DBVjksQj9`|{{?sb=-fjOe$Q-Y}64t>v6e{!wh=NIx4+SDwR4j+Dg)u*14qvW?hc;c{-e& zvDkwO!I*D$K(Adn*}R3SzpbkFx2?R<)IH|IR4FP|8`bhxS5=y~xJ^CBJZZfL52r+) zc}srR7U_|IT&9~F$xXeW%_Z|}KJ4+ev8)=0rEDBKD{8v+F+-FW&J4(z+&VSor3Gz6q!Q_f4?nJj=rH5BrQ{8| zk?uk180>sJSrTtk1J5?brT;XmiQ9FV%gko7}4Bw7c?pr)_DnO-}yHVpR=TqHYL& z({oX{8FPB5LsaE&Nbh8N26s=cp-J=s!>0B=YYS)V962ifp-SiG)`4ht>G99tDW2Ph zunpoJi9Z$g=9;Vd^5(J6WJLRYNb1vk`g;mRbGr`NcIW~1ou(9qqFg1uRgGwf9$eQU z^lTsH0@Nv@U466di`n0%P}loT|CINb`Koila0|fb=eOMK6)Kj}EE;M;tQK-Z(Xp#3 zk6KAM4BtuLPIGr|qIR*~m(LY9!RX_vM9K$Q3peD#kXCP!ijx|Y+IL6m>LHD;j-bkV zs?-_duec9+?DnJd@3_-HTvJR-dm3-3qb(T0VD(4eHC*ioZ*X_Q{uA0Q3GK00SP@X6 z2qMV`?;n+Sj!5?jc2>smx|kzU6ElY6tY zw$tuosa-@)nu!*>pUk4a??pPP%;Q_klW3}3o`Nq}!1b!(+7>WRa*~mo*9{*o(H&|N z?q)KJt!)|`oreD6uzM*RE@ss;k-ixcu^;|D+VR*T351D=A4$Pw~Ng%KHoXzEgYr?#dakBQC`fg6nK&!BsY=%yc5+O{wR<=mdxOKU`*pSHq5uNeb{k^PzyVBn_Ra)XAwMpR?t671n zB;!Pxt=rkgJ4 z%HZzX2z^5qw3r=WsszkOMQR}d)}lm+jW5<~3Jlc4l(Dw_twK2~qEZ`Wd;(IEe{Mf+ zQ5^LNg)t7UNY&IUt{ktX>K4qgUZR$DAf3X!XB6&P4axST-hgQZe4HFT%JvW>A`~K$ zE*>!Bbb7wjtovj)ZXBDJs@GgJX}!wO)AmQfb;zyCdym>zT4&dbGp(wZDkTC*P*uzI zyF$HowbsCDL)J|SqKvnK$W`#rL7c=s*P6oQu^<06OvVbAeG?4cdIXiy*7vE`QVdOT zHWmy6nA(aP1&`8rzxh;ue7FSO)4~ng&(gw4M~|fbGs*hT()oe>)~-KIA4~eze<}K) z{^{SA`YY4*$EAKbC94F?U@5TT^Mgn!(`n(o1fJ3@n@0#h zZHbwL9D-xQJ4qpF157GZ1bWS6VtxxFYGsg$5!r+-yvrtRsWxu?TTgnv1;3McD0qi# zQHmTvYva1_BK-R=K)|{|@Yg4oGHvngbSO*}yd;HHtI27kVpYye@&O@vrxXm}l7zoY zHCLj_rRh+}F4a%S@Dk)Vmx9V-fRl*f^|Fao2=Czd>PoR0U@FPM`dW~9{m05;aF195 z$%bBA$joq4r-SkBPrVLM|va57T-ch9nVK9@6nCw$p8c zTEAral_ysr;sImlmXdZ&=3de$D|Mi;78JK6bw*rsY&vJ4mE1`~OsKJCbS)4qw(f-E z@X;P0>EC~^pMEPRxMmvuZx+=5C;R@tX5U|%duIV7YWQDDpO#@Yz2piox8|9CW5|&~ zAGB6bx5~$|vTFnQWBb=gtgxizU7eJ+p~wAl0+leD>Uv)&I(ZR2A#j}eF+l{i@E`fs zbb-D6U9t4*#P zX8?YQY8lJttZ0inIxKocbXt~xAJ?U&T)Sz0RO64;68!8)F#cY4SXAAN3L`2OZ;LjQ!$uC7+1Ox|8{An{zt$F5Ow{~?ymq! z=0kBn4o3B0i0B6=bb+J>!y z11Eab>i8jaloY+fc{n=Q9xW><=M0zG;UZQ+>n%n!m=7Ot9S@ni5{o&GBtuo}M#&Eg zDwzL`jBjKldfx>*n>H26WZM04z8B8_hKp=P^Ar2}Wic2B<)zPjEX0O1;u(COQhA?F z{vOi`8-jWK#q6HQ+)RErd9&Qb1t`>)@!zFe;~ylC^2}1^ z`SDx)XIFjEe_Rl$E`Q}0&1FK(wRaAnWV6m~E|Ve6ls|Lw6tD5zv5{hR!Ub00%z1PN zB)PQOxJ(ea(YKHYYMFf<%^O}ZI5>SAT|HDDNbdN zmkDOPI9bSe`O8v@zg(cm-+R1r*&_RIiL;v=IG}9?n*8+#;sBVVq1P*q0}C`IA6u_ukwiec?+!C$-kE|x5mU6o5U&mO~#l+ zkkbPZgszTbgm+krn1}ofeP*?>;yk|oWc=%;C>nqKqw(q;D1SXGKx4ZI+^8!Wg#ADiqpno25t?-7X~iuV5)T!BPr= za*oc&^CWL#UaNzun?MN;s8i!4FMpQGh7~9$jj4hlp)^N@+M2NB#h`$r>r8jZdy>A0VR}A-X!KzG#BHQd@H437G~u+h=FgBvkLKvn`TVPM z`?uD*dG_ehWqJNyd0v*!k`TA^$vyc$eeZ(e+Mx{S9I{_T#bIdhVFb&f14g8C_T)8$2sKee+S0 z!Q&jTvQe-}?8(E)_V`|m#>2XH@^~F3c-*Sw6+rXM5D6&juBuFVy|q9dZ_SaFUXS*e z9MF-+v)W@sp~%3uSX=XNGS@_M(an!#$-w5|d7KV<2`zIJcPIK-WWEfF;;BbfYIl<# z92pYdTY6;>BO9@JI5>XdWzm@gcYSv*Ap$fNaD>(5QDP5b<{_w7Kp~0vaZ~fVN+e2? zcS1Jf4)C>d4goBy-Sly>4UwS*KS-9vos^L!HV90VEwEFXVMkVCdZ`L&Wl*Irn8)OHoMS)kKBq_A z%zqr`Do!Zg4E72_g*bi`9wzc0-6w?1x9{Op{;GYJdANW4oz3o?jIO_=#hs20560fMM z>>OA^Jo#|9aW>#E;*)*EG&}nUx5~blOqG0}Fya);kO%)6h+ea^6GI>v7T#PX%+=3{ z8SDnC;|rU#X4!cxll6F%WkGW#Zvxq3ep!PPL>fCno~n&g$mQk-<`}Q;dJ888eftId zf3x;B@KIHF{(mMJAYk+kHfm~P8@sVhDAJ(V%}8o9Fu@5-5DRFKXz4GmYin(7Nm?ut z&?K6>!yv!iZP)I$`|q~hU3a(Lx?5}QgKZMz*@pl=Aou`^I%9l5tPoM*|NeaMy)zR) z>+b*WOEUMKd(QcO&pF?x^F8N$&!MN}vm=U>2QPJbxd!bCvSYxO;U5T3eI>LJcLHmd z1kIoJt|}V-nxFrBEu5i0)KJ|lYnOAf%!Avi%V(#;b+ZU8SlZRav8Hdwq8K?{OD!tF zR<`#{NLN~ChTg(OQ`)RG_jSWpd3-{@;?t+GiPX%xIVEN1sc)m# zm2*tB?&4Hgs_RBNwlg}vqU#3h)>oPd_{DJpg{vlbg*+5x|DFop>4uuv;#A(%7WCtA zAN|mz;?v)Xo28m*jD(kpDH5Q|~d*l=D*shYK z`_XuGR>jJXajmz12XO(4_lY`1O&MH-ZSYF$&X)(q; z36Q(}onS|26y7qv_B64vhksLU|)&1 z&O4L1a~w)jWS*>PJcW>(UD8mM8R=!)Y01)g@#)LUZ{pZCd^`QRikt419brRPz#;6F z1lIF8`iF3+_W|lH_bXM9oY=eeVqFp(DArZYJUB z;P1|xh}48Drh)*0^+5F}#II#0g6?p&&qw(@V+-u7QdJJDX@9f`r|&??z{quY47%i7u~L`H%qq=N- zV|$0c7xdH23v8}KNWqRdsil~^`+5&{b+2WdjQT(7=W}1>L>qfI86PT>cMPGrG8^l@ zA2kgrK5RRc^719MT=CD2I%}w2>j9!?AD^iQ19Zmu=scTs$d$QcMc#ida?V^%LV}ae z9pe{ghv^dP@xm@@H;E|an_u*G`JmI2AdN#Ji9dw=|EwRHQ!{GVPk~$Kp@j4EL)fjb z&?a3Ll{oZbvr8?T5~0WJ`36+U4Hf*W;a@%f68vM!;tkjGZ&@?WJe73slG$km?$R?>g)e*ZFE_uXer$GE?I(?PjPT?1Zh`xfuF2a1eNo_r_hL+DezV*koDV^g1>Wv# zj9Vv057Wb6@P}!A$4c3xoUHo8Dn^{(Hbx!LYm@uVRL(H|{6(MM((_l5v!C!%@zAq2 zMbWyoGX+}~JMvQO#cj7_aJuy;}u(W_^+Y6p#228%ZGBSIaY@B9=!1)0uo(_jlbk! z;yPdR^bv*d(`u1e*^5bsY2@_IXVU|?)C8dcBK)%nY7ikzNP*_pxAj-WDZe28&YE#1lKM8Z|Cr@_GBo+kDWvYtYg4HyJo zd%3WK&O4O_l;UOt7tiHr_b~T9=`y$tozHj*?=w^BbjcG0T@CW8C8Y(cvPg?8#&mg& za<^}9Nrk!isVpKn_838d>vVy~96~M4EN@ATPrCh~4CX^JbkvH4hL~C7c1)A zuG5^{+UoQ!gdR}Iijh;y5XRG25-I*Q>08EC?NBQ+qT2Q&E$thL5}qzITX1%I+IpJH z_WvIJAaCYl&6ZDKG9R?>Jc0(OdCk#voqN3IT}+HFE6)8{Ry=o4C7~MC-r1?LiQGv( zQHO}~?Il$=gij3G`#GKPZ64TDGL<{t1NciRKZj_v(=LKvLmAqC3Whd8VRP-Dotieb zuWW25COtvNq0)GCDJI~D=>r>3sp>cbs@5yugvNpBnXhzBB_3`2a`v8qqdUSG_P0h9 zw6caUoT2?}9%Gdx72e2zu)3q;LY>=E%gYJhJTs49vV9KamxJS$*{Pcz9>IQUQ5*d# z8l1!(ghgk*F`&U}-`v>OP#T?IzH%erXH4C^HrYO(wL$gK^72bk$!%0XaD@?Kfrbu* zI0k&rO;JXh3L%fsCW+fSILwqP-$q5nodarc^iAh>qG_V&An4yc0YSS@OZk1Vjg|Dx zwvC~&$i|7uE<(v0@@zAY?1z?Kb#A|sHI5wdRPd7hJ%8X=>%hk$cX0$hoMgJv_<=X( zVzz+CLSQMK>W!D^Y8lyuGgkZZI%YuV%s+2VmyH$Or3jbVA9m+)9 zImy%+b5hfE&0_mdELHZ`IhOFXdWP=$WFqxB%LH*Sm4PN$he_W44uchNf?IZL=kpA* zcVtZVFh+%@qEaTXS}9DR*=Ct-TJqK(b^f0CG~oS1_@RYx6?Mtf(mG}%E$u^KzZIB| z5f)^Oof905e`;wtTK*GrQVoxhYwOg0=xHcb_IJmk&n+`uHFHvB z$asi`#ink~+biOSWc%Xsq`L)j-UK=C6fLu}(WBn>?H8w#-+M=#RsMMNLF&1sbE{9q zYc7Q57>L`6;(rv%fH0oVwI_QOiO}nuatXDa^n;C(hKq4xw6fnMjrrYjC<=S&peP#p zGeXRMpEp9u%Cqn&9FZNiof60apFa9Ygrr5v*+mL#lN~t16Xvgh=lORQ}JEK z#iP0SWccgXP+t*OkJQ_^F*9>|UW1XkN5W3ezevlq6UB5-ajLvHh8T#sfT1JXZcj z*RZgR_eJV0zwU!##thwmc``t!AYa(XiF-?+9K3mYSKm>+=#6lsj?a; zJuBd6T0L8=bcrh3WvSMVJ<6?mws6RpQrq=xi%~D~WvkT}v?r9uN5ME)`yvO+T92D= z);g>8Y1MC_LSZh54VCbnRVe?mL46bK55Ge)OJfDe_^EmK5a(3e3<`gk)m~QFoJBA2 zg>ySJi7&i!zRP=eraa5zRt8KbUY+7c{>J<#&DlAWv|mc3{&Cu98V^v zTlXQbt~M~Rry@3f(BE|E>5l@MJbQviljq0o#Ujho!j@( zqR$w4JXx5XRZR+ys2Y|fTVE3JTz-%4jYP*9wc0>`)M|O8Ah!)>Ms;ZX_X=s%;Zdhy zBHl5Aw}sIl$09@6%LZM*JygNMB})-O6+-*G9E~n0HX>!KW-iO39R|wsX%KTAVHL4M z+s8#2jA<6BbUs~OR9sBb=%$}(jod1PM8n!r+`8Xr}Y`Xo;>zyl`-CEe)JfRjq5}bAa;Pyc(g^U z+OL7F&Jfrq-d_#gohdA6w>}`wJL~S9qd9Mf&v~zKuG8rb8RwmLJDHqrg<*m72p`?g zijA1>SyHe^#EzC2QQ}J^dh)!beRK1`-V&YBDowO6TrelqaWbyZ1{QfnO;+Py^Ymo_ z|9%mj#2`ne$Nn&if0r8nUT6Gk`xPRKjeqAG|IVpUnVDkXmL{Yekd&d#jZOlO~S`F_3_+0?c*uI$Gj%mh$adbXriC7H8Wst=!H7=wX{E;Q$%s& z?afW;FNn7fHl@E+tYHv;!!3m1=6dXw_Jexa!%G|%XUHDcA4$uc0@%Z-$4@uvA>t7E zjKeossuhte4RSAnXj(-`qeyF#<@WfSh(**P{x_E@H6Cgs&bFQ+HdFRIyL!$it7$gyajRbkmwg-IHz z#OHEV2)$F)Ba3#8O1Cl?POXoyjl|FGS7$}6yHwSad^9lDxt^eq9(t000Y6UKWYrZD zp@G~Iab8u{mw~_tw3-G{AWV2IQdQa#^15Hpud3vPRh?&8p@n?~8PJ1?9j~e!w(2mo zFFUH@kkznP7{c*+iENlol%hrj`^ipgU?Ug_#zT2(nrPK*3#!S99jnH~j;isJ+2jHW zCL=}3l4juTc%TvnlF+$f-HtSG$PKFO!BO%1js{9G%w3_;!%w z{S+6;+PgF5k37C4F?P-?I}l^G-s>3<3gL^_M7;fm(|wq&^T@hQWOBM+;01}bE)Zk= z+1>h#yd7(E*PFS~pMA+o4D5{x3v7ZRtO$3dW{>|0Qyjprm>CR8{1?n` z%>msZ`?}m59m!PX08@<9Mp!R9jYSb|S1Kuxfw~{a4Eucf0re3R`vt`^C^qvCnx3Q- zlrDWsZ366eG}IQ)PIWXtiJF`-pnOB(nWa4>$xA0_)HcG{F=4aS;GiK-=E;k zm)e=^UC)x7=c7v4H0?`lJilhGZSu5n%07F5`CshU^44XOww*nWiXf_>zkc29KB6hy z8-Bo%U<#LTy-*toS7DU23#4E=cRe9ZSQEzOt~*AS@d@{P>W0$H0zPyvFP!I{`YM#! zv-&Lg%)(wx%Mz(XJxk&VcXjnD(9(IswfqWy;*T;3OQf2a4X*Z1aIM*RHruP1A2RLJ zZv{WBko?4sSq(3;c_Gn}m>7P7Ng7Yg41XHY%#gg^e%?fwiQfd~h_l`1tUnJDoKzJ1Va`fm7eFUIje1WxvS}xR$@cbh2cBGSyKs!u6viG(K6v z+NgJ!hzk<;r;6Q@)C{f|A#kNTGpyQ^?FmJ2Vm0#fa80VQJl|Gl&Cx2=>jmMs4;2l! zMjGq9PS@i!dz1m+SZ|MzS){SS9&7a2XpfYLG{)_bZ;{4?J@PHmn6yW}MH=VXBi|y8 ziqIOV*Pk2A_PEw;k0myDXf@kop4lFp2_}!iTt$`%^bHJSh(w)qfca_^hFp($@Zsaq#M%Y z$4R-6>w@m-_^{>`yAd_~^tZIzOc?!i^~86GtAr=>B>41c@`c_Z{!&XjJCqigB6xuG z4Y*nLvgjF$S>ma_4NBlFa4V-V6-q_9Iy}WgP{UEFQPU&$7pA5=$8ie@isEX|41Pe5 zo{r#{mpA)G`18zezGb8+HK!d2NJ>GgRkN0Sx?1Gn@W`liT-;ZmW%hwWQ!pT^oG7z@XCA1?j4OjG%H#&0)fBmPGtLQZ2P!@8!-d`lSgW9f0Aq-$1k_&eL7=gP3L9+L z$eF+x8eq1S`RI^N8gM#BJ<4UN33?W-a?{KLcnu2 zlznEtuBrq)|3NUA8R&z6=Rf4Yio`wohH`X=McX*xL=2<6Q^(RP$5}EGDDM^0wG(aQ zR6p^TM}4rQ1?cpfK1U$7d*b6jKBvQMBZ9@8rH*s%^`NiBLSDvN}GrR zSNB0V-S^5%{oz%D3|5Xi95#tqEvH;_tN=Aa!-KHec`MN}pyz_Xq9(m{S+U$JtdUo)t z2V`~PliRcORJ!%XO`1zTj5&eAk|(UAx=Qh<(BXp$>rvr`f1xg9`(0IDnMXG|>5pJ% zk+G_!{n=Rh%OR<)v&|hQis9T)JYDt!pvsPB7CmE(pyHv%cO5473@Yd`Q(*WPOo3f7 zo^Z>>fTCId+wc#u!^ZkXXvGg}4 z==v_Vqq>jZH7i1QPkKm|qa?|^sW4f&&k{^&>`|F96+DHlYI6Ol{GYY<9|zNX z7NcNV=Hp>n_v#zU{20I*&X4B+2e^}H8ap=%P_7g;o>rtMvL)YJ%BosDJr+n`qpt~G zdc!f}HvG>dQ~p zW^h{yc!AFsf|aqd{IXgYplUVrS@JMbv`@bAfk4eC2c(PtBmkQ$VkwOxgila=zKn*# z?1CpP2kR}lB7B-Avw%Qfln7QaUa%5^U~)O1uDVb0(h<`6bmgC-em05C!c1VV(h!vq zbYL6t17s-Gx!h3Tr^ zQJWV?Esf6qX%FnRq~~oRUk>=DP-|cc`GRX)2u$MR)CGi~rJ(2f1Wy6-Z4V)kOBd!J z69UAAC`?y=GeHTEr*!`1SW#s@C*%}{C1(iPeZ-}fD#$sjM;Lw1gCNMG(tRsQkaOw2 zH6*Cg1IALUrpX#QZC`((H8kjX!MtU(MwvEKP97wO(_P04*3j#X&OHYQUMR&PI-8W7 zziYpj9wEItmyW%Jr=TQ}Ze=>}`5lt%8)5GVyEIl;uR>!tw_mRNR705?E@v+Z({;Hl zyu?P_1PwUMaEPR)RU8*-GJ6pvJorpr3q2CqFLCLG{BtL;$Noz$4Bsmd`>pR5SW<1K zOM|SK8hb?W1y)*IkBAd&n}i-cE6pq~&q{;111rreFUpeFY$wX{$k+u|8p9S0W=>oCU@SEtC57*Z@Wd;E$XJhL4+3HR9hGJ z%`^W}V6O4VU7F=)vSE{X zCfWv~Cd&|vr5BHPT+#LAIi?@YE=+Mc$n=q z(X_4j&HGLT&jxIuJY+UQ%{12dcSthR&&-9rxr~%zI_lMkwI^00DR1%d@*Jr-bwI72 znI>4d)L43HF(Cu^nUJ7$b%Du7ZVWXbtJ5$RsZF3+op{!%(MqP7oLoDm*jt|QqKsx< zJiuo{%i4AV4h9~yD)KuA3cdu25F3u|2nUWS2T~;-ZYK%1s#totd@(X9YgDodyBMJO zWhnf*6$Zte+_NSei=e;kNKz+rj)~Wmi%T$1dX9ORQhh_GGDHv2CBGiK| zd_p{o8u*TH?1aeVM2hOCf5vM(lu_}j!*9F*;9?a2ptR@i0U{P{B7OKmp4qo?<0;Izq9X56F#vu1m zNZZt*5P@qo=KE<~Kf`J+1~cUg`@!Z9#BVEXu3-4)JN8n(8wBGFuLn8`)0Ln315)>y z!enK4jvM}Qnh%?u&xi?Z4jb!<8?2OiKbNlRZPpOSW-Ca~4L^QTV9N{Qm&s3URGZC} zyw(>}mpNgX0%0Kf7$+9|Aw2QIzAx&V;`LnwV zCouQtCNR%A-Oihuz?>B#htqxZk2ZmMBR_%JPl~N`YF^`cc|Syn{QhEjfAjO2C&?bn zH#DyyqLH@(nthAQEHvNnCO6(3hK1YuSn6WtFPGH&=5c~pmVKDhT8i}-X`MBV%t4^t zeSw#i&CmepAsZ8wcCNcfrph+40pLMPNR@Hn)`AG@q-~KA4DtvQtFJ^N^ryF@pii^a zSg0=+0yZ0Nwe0Jxxmw!~@6)8=*ZPyIKbBr72Q6m+WKFXMxZTb>GB~HPasNU3nCKZ1 zK5b5>zit2`qy~C-=EkoGmk1=K?d5cDv zY`H}?D}Sq_X6HR6$-er>DzUwmCMRZH36K z@u?_#a}2A=Dy7aB);m?FZL^{O>W=-QEuN%L8=&F0N&y}XJbJuE z@?tjmNv7qg`r9e6dvCfcK98uPZfHGk$J4rO8TZQ{1M*P z3ePw3_4@35Z(n0e`s*bL7`Xy|E7AjTI0zp=c!PkS2NJ2W>by_H+mEqIx&0~&_h@7{ zzUuoi(%&fiwPG6FtNkVdpn9{nJnhS`-)i&5y?8c?vVTjF9DgS$7v#>D&(03Y*}+PL2pqb>AceL-f^~=Ftn$p_`i1E8gvX@!igF^wEwM4$Xb) z4i3#te*iu9aeA>`d^yT#(9E)Ce7=9}A@C@8ZxzJ{Y59f>70JG+LR;-+RW{h#}nH^>$ zYiQGF55G=I@8#MUqb)zV)2lkS-s~P+IG+<7$@G^w%Jnky*%{*~IhKLY=oMKFAXv`1 zWyxi(cN@c>h2iG(m1Fssjz`|<9y!IiZ3AC94F2;i^g(<0)wQ}W? z!?)x+F_xNJsRJ}$q1srgOJR9pzt$;FpH6hhj|21lI{(?ruB-AvXU%i$QsGGWC2B`# zPm1ORNy_!#R_o7$G#Urzrp!GYosUJYs$97zOJ`D2G;!rP4boWtEG!*(t~A7z zp!YP57wrs%c5#WA$s*E z+a@B`=LFW6lt|ADaU9O+=^`U%uo)a&d1b?w7K|Tv4${WkSF@{|J#~na;$-NF?h!g) z_a)s)S2fdo&e5MjSKUcZMV;PX(Th4XM4ay8VkouaFFDSs(TIlzKww6wsfW8?`fvP^ zLZWYor^8bXMvZok-!lW}*k)kl2KnEB;|=oXyg@Dt2KlZ44#6-1)A>EIgkom=7Y+95 zmp)TJwv25~(~V+Xb)3_)8+jc|&8pOCJ$WHHYN$SAcRaU>3|9p5I(GA55#1Q89c+qT zR@vpglWagOQP8RGLAZ*F58l7Z>6s6<2k&p}#Fsg@BGwlle{}e9jVDnqXr4kF z)ZEMO(NPD88#x<31Tlz_ou2dQ(B^IqKtmDE?Xxwulvbe=mG;`1NZ*L8#z2doGLqC#^-XoHbyknSp6egr;>h7t#hd)Q7z4pWo_Ctb3ztCU= z8YIP|!XJ|zw&eKQx)4s|Btj4GbPwZ+ESX?*h;*w6JpnZ?yQC@9KO)RW?e)a)Uoqasd-2-!p;yvvCleFjx&1f5bsvKGP?3#N zCdJA24e72BFB?H6-rEET_;OQLx-J#e zg zGJYGKUv*q`M<|;#P~is#)_r_Pl2Qj|~v#Y#BE?CpU22j52o` z{;J~?)m7?&7!(NLAIZ+5X0F%yJqeU504eHF|GcrzXBcA^X8-$F#P`s?oL=TJHP^!O;75clRN`J4dAqW;x#t1CN8({+%?c(3-{8Pj%-4yjS{|5Nj z+8W`Bkb4t9#=o%yDM5<7)*rxAV70S${GGw0=%j51qfUR98PtS9y&(@(@ws>Cduu(Q z_V7=jxdvbnx3#rCr!T^1C;y1c)q2ictGx9Yo-GtwfX`L;b2rA5IlR{9`KPcy_JQBY z=X?06KlZBr#u~%VaB4MNZ>T2>*h@;CNARuIEdL(R+Y%bT=u!Ud<)7jXD$biQSo9`Y zHuCQg%Lc}+x-R2+{wb^OwtIwsv|!>H)^Eq)r&t72hQ2k6zuUgmNC=1_{%t0n)3oSi zMM0wIZ4D^ zo5YlC$~vceDTxB)-1a4&h__T>-!(NPd8^Z{i{C_uv%iB{(jE2-2@kgpJD#7d^T{*h z-1dpE@+cs^D!SK7OxD(adiJV1_d%jE$I}UdWlS34@ID0x_034yY1^_a65~RyHRCCk zXnzv};tj4mPNq(G`sNBHZfITes8m$@>)a7l+>)+759!=DgKtr+w+X;bw(o2nc&_-8 z^t3Y-Z5~s==_~fiu4F^;Y&H?=m=_r)ParN6LV8&_x5SpDXBI?M#dNfJHV=t*uA+{wD`isAP)BgsH)askwL*WVkw*2i zoJhEyV?)&c9D!&(5N&{JWvxYMv?)Gp+aCU~U)i~WgD65Uhrn|HMjW(qi>CcP?{30? zbo%a-&f?ydHTbInENnSA%&Jh$PQ$?PXb>Jx3y(7J7zQxcqyiU6zy)OMYh-vvFFL^4 zmK7#X@SWMebw|(@!(fmB6K-s?-&eZ_ik-f53=evv((rhN-Wayc>Se;?3E|ODVZ9(c zp3ze|c)S5z?h`k#cBohG;v_j97$dmyNV3xhMFg1U*IdURl>XNDgNm)I)z46y@+~+Ni`8GxweUS z#Qqg;G0*&*R111AhR(9Vtv>TPi!;WoD4QKN@Pi~ATRPF_F5>F2b5SNBlVaC2eg z+&JQ$XBhr?Ax+VhmOATEz_=Ik`QJ*lyR##qzBAL83`>Kv5 ztyQ5BBnh8jjK~H1JXm{F1nKd{H?97DlR}t7cL&lS`--KWNPauFwIU&olZP`&^u$?Y-pT zLFM6$IK(7@c$*cmyA26=gFqAw?d={8#nN++LWGkZOOBF?h={glB^5cqvfISN8_f`c zgyJbqpX8)u;(ytf%?adMb9(alCS4u>E@|=T0q6D}J)}QRUu-AbtpwjhZd+B5pS~=g zq6ZLug`_tXu}FBC;$>&3_?qtkgX5ob(+#>Mp{OPFR_b~#chJA;YA!L8_;z37@8)>z zOR;qM0%G(d&bim~rP`O`wa>5a2YZau~1AkE9%^@9sfA9z16a4Fi;E^}p$xHAPczZ`7 zIeoe=&)Tl|T5Lg4Dcm2sO(CbsN@u0QkyLrzjMTJxcN3SKq{B06DUIXV?XTTbJ5;+R zq*vI=bdLEid6xw!2}GFNMYeXLj!*(GV$YffCF#VkTM%@lBdOaS(v1{6%Tgt8+W`}J zs#^A|s?sl(nEld@$peA$F?6M4(Fb;%!HOF->&}a z6UjIAldSJ^&t09DZ$rR-Px-bk`!UJXwJKEM)o=1G?A8BX^6kOY2a<1yl0Rne(tN7> zCANxh$7HdaIN-}{yWr;Lw;+Dd?7jWYZ8wA^%FND^)i-6(>AupEro8UlHoxE_6gFjx z)2($O@IP${NaZBkpl9iAk)=nS4_F@Vmy1{bkQ6HVIBqJ*x-2tDlDtU5oQx#LPZU&% z-#dx&DOuo~eb66$i&iD z(s={QHPn<|fnOqCy&s1i8Sd8eNLFU1N583A6Bmlh3li&$6EYiiyw=IqpL5as^IBJarWp((ZQB z&6cIDdZgLioe1q>J%m|1`_lM(rutR89=JJduy#wjd|oY-IBC1PC0;vNJBTnKzlH5a z+_KR^q1?S?7;+6Am$I!O1@mg#vZe9qU#(biz1m>Qaso#XuHr=K@GRyrvTqOyw#%TyV-{#+_XmXj z>@mSJHLrhS6@h-Nk+5gMVbWmR}c z!ZkdV*U=H>6@lQ5*V3j*T(#s&-grpwg2umA!n3~i3h(Hkf_KP1lS`o6?S8buLy6{E`Hq0`S(4mjPbVG*7lcWxQv zX~Q^_`2b;L=SH0LE#jWG>N}IE%jyZ{><%sa5LS)o_BFm}%<)wXB~lUk;3v)PZ!zf1 zfLyIpiPnkq+3XHM&h9BlQIYo4R}$_vB~+1sBT@JJe#!){{3ss(Y#3)AS;Js;7u>Tr zZ%X@j9jyYof!{;u!(=*Koc$+2`f?wQGT1jR`x(;&ac(r4Y&^(LPIzom_U|nx>2ZRz zdCYlmb~=1s_Q&?2v1nGh@&{h}?qq0J_UA!<1QQDo>F{9oB&s%fea^KeguQ#?7ns1; zcIZNTx1RwueQ?&TCa-h%$4ejVJdwS-4tes!>@GQ=%-%<`om1q&F}wO@@A(+JI;VGj zi2)MW)$gNs5WBfAX0p?9-p{ z6i>}HLqpa9SZU_3%R9mQta%^<8A6k77!{iDf0tz_MhMJQyvlpiq+mDZZGFsrDAxTd zGyWMk+d8Uo6HVGhoHSLTEWC=Uw=Rn`w{M6cW!HQGK#a*c;#Mb8MNZ%UBYYsxHJ{*N z7GdDjvX=G(bJN7Gqs9zt2z_7XTXYBUA6epJXRoIZ+Yii6Pp*r(k6VB_1pSE9_a&?C zZD&mlIjQYFueQT;)069^3-*&;Zg?*DlJ!f*l{6@yaXZ|BFs`mv;9Ok$S87qChL$KI z((bssr#6!g&y3f?+>`cj{aWpw+MV&*=VGDty=HV`TA9pYs$z|&157Fe@A?jRGqLZx zRZBkHEU;z;4^oW#@cyD!;JW>kmUKcg;wS)vYKf)EbqM4NMAKxhtSUq#GYSz6YJkRY z0UDs}MK%F-eYf}Ymx#HTb=G82^+c=d+sm(y3uwseo1qGYFf&~6fqNL#fJSv4NQEO1 z|2uKRfS&mjFVxS4ZhPpY+MOl(Sc@MZXR5wYfYN?Y^4`H&Le3J>i;82>C!94+!U@g# z*#IX>9+hJ3SGN#p5)473%$_oa5P!-e{Hf$-55{FrEFF${;(Np}B5f1ba>hb~NMO6- zVo|>Y?ub>ZG^FyPkJ|#kL*Ip>>A^NyY6kQXexJ57B>s_yHt3(5Rqzk- z3;oNqwqH$qcR1ZYrbRrRm10`y-0}m)-#pP9E+&kIJ1$Pc_9au_tZ$M8-)|CJF8XvO z8JpYJ!9ASZV6nTu1SWF&I;jngE^oraw7Qf$v(n+TClCAKq9QR+%+DhSTly!wFi$kw zvNEFkz(=%F*VmA%h)kF85+fIrN&=xqbhUf$(PbZrr@jiH*PQgv`93Q>*=MjwOyO}uueHx?se9B*)JEcV7i8$H%hU(s*gPDwgZf}?YnwOU? zpFX!@#W#&u0Ti&yhEj&Vt*8X}$%q0F@RyXUYf230CL;(qQ2LyS)y`V}Ko9o|peRrn z1Y9Eo@?7I%WC^{1t9f(TGFehw#Q^VuLck>(M1jYk03u&0K*8h(Op?POM777Uh~ST6 zkz7JAV!h_bvZd3ns#x*W06yBsxO77W&^n4r*sW901M!*?cYp1WwZ9)=BkoY`ex{PI zb4_#s?6*}3?*heG>H42V3f&-o?qS|X!~>##er32I`b?Sr4PuFnc7%bM}VLc6juCz%+zZ zMfOpPlCnzqV(A#J-t2dSxGB0{bwl=Z6!G*kD8HHgE;FqByz}Mk0W_=sj#V!+=SM+# zMQdhzMMiaJug}9F+N#p`Tl$al>FCjOi@K%Mxy}a1*2~`W-qC(9>3@1Ua=|ZGnEuZe z`n|Xv`FOwA1KC?g3g>@aY>PlW%kod;;&hYn)T(9 ziInV}ma$P9-5*b>-|S5QxB6%J`F%l^{rqwH%>u~2bw~vob?3abtl&dsUuJXrFf% zLG}{)9M;m&x%HPNOz@8LH_jo^X#chtPbcsn~#wykNxKP4?Iw zR>Itkvd3!7-I&GQ7*98gXP@xAje#)+owN=6-bPJ;6Yb`0WDO>f`i#>j__hYKjc=@@ z&=aRHKd|)`G{^0KO>+9nII9WRTRkP_ZqYKa(^q1}wrlytypVI#(@xjY%Ruq6Q{=tW zKB8p%TglK7R0DoR8CV!s?CSW8h?9TJb>+}YmtR_Y0IYZ6?!(bn%ak`8Ixxz$h`p-C zS#$46SbOgXXSo_J!Rea`n&w@*(3+^}sk!z_RTkk~O$hL5n&g(9%A4n0JOFIZw|Kxk z04jogjBD}r0??An!Mj{z_U?NYwZ0OI;#vHUoM(~1OTK6EPl7-EUf|y<06zlw;9cPD z-8_qIY4h6tQ3GzB8+aD?(d22RG}~smQd8l2lmbd|25tp9b(6aZr7%=`z*7o)sF{D> zi3>gxbl(KHx?1AP9|!X;V&T?+Nt>MY_zYY3@%u2pFY*te--a@1Q+@akwLoIOe7E0+ zJcYn?Ozd%T$8Ayw|Hzvu1aBGjee^-1Ju7m|e#M`c7Wx@KZfTzW(BfeB6P93n4aOU@ zF`IP;??VDzo-27>i^U7|AFie5slZZWnS-z zZ!R^Vg+=%ylkJD$;_L+mAJ2pLeTnxSipa^od5j)5DM{!!n`ANzo$d`VVrwc-Czyqv zX=9H3`(~(UJ_J)R4b^>kkb^%Bjp>aUu{zI|S+InGv)!9|dMnPzgdyr+$+<}r&!>^( zxCk}(>}9FC&gs*=F41kynxFEU^wv&hrz=lqTjpSB+3EW7_khusfpplWoQco|R&76m zPmG__$;J94n~|^Jz|R#qUzpP;YKuj;b*)7C%tQgCG$$1&pm-FkjGNG7X zn6uRD%*F78j3hh*qQQlun zyg1QkrDgZ%^PJXi8-04~e`p=bAW;kbA=bqrwUaxIK5hMvVR$e9IHR&I`xj7z(dWpG zR;SVDJ`dJ=(dW-Pto}bupO0h@i3iu3nP(>@LaZYg4brN7d;kBV#|uGi;V}gHpQ8w} zaWp|*R+l44(clRQ@~Ip_4)#LB6;9uc zuoCceX%|l0;NmOu)Hr!CSoI0^vjp^*{(7*kEo`$b0e$7@aWMOl96jEdAD^WA6lV5E z`IPsYZ89O{t=HVW?0xBR#Wy}UJzf*gMvn`;`rnHl&+_X3AoMs=K#%FlUb?!7 zp~*@vo^U^rbK6}Eq=tcUx=QOcNXH*ol8m~)Dfoz^PX4)7B*BDd-SzeNwhVu2c_!~P zZF<`gy}^t!khZfZ1Ed|J7iM-yIy!6qf{eIUe_&X*uZwe-UPlO;((NI(?WVhkiKw*` zZlbV-6PAiw+K*;`Np^p}gq@3XZuRq|q$hs|)gS|rGetE>8&)coeJD7ix#>MqSBkTf;P(m55n(K|Fd*Mc1bja#AQK|Kzium<;vf>yaH3 zju`#wLLkvF|Ku-k+l5b@S0-TEku!O4MqhXwF7g%MPNwF1o|R3@BKXGftgN_9j`97; z&?X$?NfwPlgT1@)bvy3IX$vY}SE!@^0(wunZ_ZAa*JaPLT7w?E>36RQ z_3Hls@_l#qP5_LW?=)g*AE)m>MWRQHXY<737sL$7qnH^-Q8kwm8ddN5DpZZnnsF;o z`MnJn2xW<3uf--JtRr9 zi~m^c^F7Hd_LWz~+-*~LYbiyZVf?ZW0+4OHY4HV1^js;$oQ0VKH#*M?37i^(KQRh@ z8Rg1nVwCHw;XYBWo582H#6v+@A+q(FfyfFktAcPVOj@(hGn#O%U3tO{W}fo4W8V1g zz7Ap;=3baGe%A3QuQgKpxigZ^;nTmJ*IAgm!uh zkOd9v#ikkEFk{K{;?pmySTQ-TN7gZ=z}3Y0uZofr>JoUeZI=vqI!JQ^sF4*P-_e88 z@%P^b{1r>j#D8O>mTfY%?%6+#m+wEY@v`0C-oD40UD-j)xJrZ7><+S!m7Q!U@L|Fo z!0ai4E%SP2338Oy7+)k!(7&hMbJ|xvxSm-e#tYgb{vNr(;F!MI=fQk0{{Go@ACSKv z@nYJqRaiPnTW|QX4MBT7->$|xdlG3me4u4dIE$9EpY~8KkW=fjcPp)Me?iWkmwj_Q zf0O9*H%}+9=O>UXt#z2&jF07Re}3m1^mWP^a5t-$Tqtea%@XGE-0d0kIvVB)FM7-IBthD1}3)GJY-Lsl@6)#f zR2cEESxj0OmeTpaMpLlOxIllT7oi|`3p+a|mK&b}d+AdQt7pIeEI%IH*TeQbodL?z z@f}FcfR1}ifWIdlw;+^0*gE4n@BSgtZ@pK)(Qma^|DMtFSL++HUhvAbADDhiMV7MP z+04suWWQqX{&~U3sPlqc>8bOA=O=oJ6!T`srxM(j&258R1^R9o7Z&$-ewZ7dqD|$U zrCfg$ZK~*)n)%6BIV?Etnzfm&JlGjN&Iy*CQv-E4y@&bBQJ09skwlNl2VF7R?C#4P zW|dqg0MEN#1sB#NxV!U<1o&o|WsT1LFx_Vy3H?aOs6p?#yoSNlLf!6EttC)h71xNe z7(&9IuB{V;P!ki#zOpkwapeoPP#Fg$r^_j7%>0E}DqcLMWb0A}TVYD_1+%T=M-19WmGF(H4SX0TGs zF~Sq}`JelJ{^@+5y9kut{+N4z=b6WJ`+1pj>9pZe`X@8rx{tGyxqk1wG3aw`Han)@ zU&!3@s`~v<<~P?JIcnYA6^*B_#pYT?r?YQhemyIUTz#u0J#H7(jav=$e-oz#7b?Ej zrp#Ipi%0*WVkItsLz!EsM@{|~ypmZsUQK44y?stTm0dfE%33`tyMPvRz_R09T1=#M zRrPmt7*zHVozaa&XO(wy*z97|=d6m3PiHQqYlp{V+SS9X+O^W&N}tZO50o}vTi~}! zx(Ac)(ad*V;S0Am&eP7PL}mkr_nN!AYM91d#=XO`St^94eA6e)CQiX z>3K{Msy~{no`zxG$cIKJeHGckU>a`6O9n}Wy+RBEfxO2%9{FL*(A-a<%j&@ck zKgWPbE61|u=#4642Z`pOT2U&~MQzi#MO(K<3aE_#ibFe?2XJVM@J-ZHr?eV~)uTu1 zi?HviH0JK+W2vDM-74tQbuwwqDrx~JEkXP&t|IbQn|F8Gop*K*fz4Cv4f zb`h3{&p5Nu6dmTu#?o~7q^|Sh>G+tUWa!xd9HZq>0&#yc8d;==z=N`sr z=U(+5m%4JEjN809!FQKBSgk6JPv@#_XLSV+i&DK`+5Fk=8usC_+Rq>*!ScAYd!ww=UD!~`Mvo+ zJDUITO%(9|e>2kJ|2z2oAMpQ`#}L%}@;_sIhL^uwj4vKQ+?M*A#Ezk+_h)|TyQcIP zIZyhiOWc*Y>tpWLSd^gjbDxCi0kp;^CQ%VPH3)$qUT5js*!|EDbQBNm#2Au0OmeX# zB=)!4Q;q+(!vD|{WW-D_$>5`6Jb5GjXPuu5T#fsY0=Oum8@aM}YUgtTRobi+Ho~_= z2Rr{uy=inc{p#xSCU>v1dZwrf=GQfv?7)A@S)Dy0RsA@iss`tF?o#yG|16xGV*g@N z{)g;8|CrJGQ|y1T^3$EivH!E`vttJAJ=vcc%A3+(D%DX-$(=Ymf96UyGfXKB69EI8 zQ(xr{$|qzsRk3htgQ5c#4BEK-pmD6aLYzS%hrP>8Jml{%3gKTmN6}@jpMu^8d>B=KtqM^Z)H7keoTOzK@Q~=$jVmeAY;(I~!{59xQE&J|TXe z<*R#$iNo&lON)U(aT>iq+X>JjT579qd^#<4R$t^Xex*k*T; zYPK1Jbu-U)Z>-%2omu?uyM_LDg-_wuB(A(2W&8Ux%&Gotr#3&^`G+I#iucbrW~%e) z%nUsH*!|b>bL{+5mKt_{g=hEMx!i;s%rF0buQ$Kkew7L~)iCo*5L)1?Quv!01+7ry zH23YaW*t_Z#%}HTn8j=rBb-WtdC&i7zNu6E3oE+5CTPR|>G3Uu`-NocdM2BT>v9m0 z&xD?!Zm!l{UlhRWvy_YB7HJ>~Cj=tsukIqS~R^DiBMKJonPv^}Hb?<~+X`^)K(Q#g>ne{IhnT>f50 zenq3p$=~$vC4Wh(j|MV0`UV@CBa+0t)6ZECFOWqKOPc)kqO6Fu ziIPaJI$!=0&y^}Fn$lk`MI(=;s)%Hi#~`s_EeMue%;g;fe46iXP`@9&;yW-Iuns;?w(99*Vp_h{E=f(6QyoBiF{p_wd97=Er zjC`hEc;N%P3t7yptFp;`DQ9=(C2_=AydM| zW*oFJ{4I}8yI0f{IXzm(iKUuK$#o7zIv?d_o>g*$FLo#SzuQBo^EaNInjZ5{_d#n= zMV0!srFS3O0?RroTY6vVI3wx4ki`4Ak~QDneps~3>3IVjGFM$8nSN6>j-~S(d?(Nl z^&*6p6*z(9*AQNb^q2=8_knc&fTTK5{d0O*sOsj%p068HwDkfW@Idx{SYNr2opW+0 z7j2?!ddyo7^5ZlO7_Qm*WGJY=ArmyBH_8_u#tsG~2jimwjA!Xj!T6=V`Y@7v4aRBv z3Sns2ef^YlUq#N-H97-Ombq`&D7pG71~}a#J}is7ulH_uA9E7>+0dWZ*#udYGp_YW zs3g7!8T&l)7e_%ubl6FkfDYmP5ACQW4#b`k?(M6t(q3CLf7RH!bof(bE>mEoDiO32 z8(A}|UZSUno?7)(QNVv(%^1U|oyUGST@nawJ3r5At-54#9Z3z*ffZjjtCui9AHQZT z^tOqSZEjysJx_h}eO?lwM+uyRg;LfrE13#ojAY$isw$$fuZSIe95Q30Ggt2{QF0ZY zYTiI5cJwhm{fE_-uch-hiEf(3+?6&FZByNbiMzWmlepWH{YO@3M30R7 zz;FGb%_=&NKOW+e*D@Ra_%16#pgjCNGG=laKSM?mF5eZDJjY8oJ(r{0OIY6@HYgKjMr5P z`>y3l%P{oOOcqC{41U|`JelA572h7~^yo$_xR1aus6x#ptE7cQB@xoN%85{)PR~Aa z`COR=H!U1RkQRJn7K<7+*-TlIsfKuN^u$oUZYp961k5T?11UTB5Md;Q|Zn&Ct z&WBkkA!7QJC!Aa72_})gudC4C_9_mXuy3BnIW>BGM6h@1&-QCLE~scity}bmrGTJ{ zlc_@IR1Vg%RHd*Ln>i8hZlutp{j6Up`=VFDc|h%Ym*iGEwQ`i#1@BPnlxLh7jUH2WI=8MSRYle*w@yrG<7e>kYyL+%RDm)I z%jrBUKwEX}ks5vqw927_d1%{)qV%KKuA@hMOV=a1tt9dV4MKgLjX|E_unhAu+vwX{Fvd}kmQ z-QawG@a%1g_D2sr+6UAb>Eu~O$#mHK1w`nZK$yNVdx^UT4s8z&Hn(q7=*>nL*QE23 z7I)(+mO`*8k$kgLlk1({^96JIwCWX~C#_X%>=Ho{^VA(07~yO=5uF(Ru0L}h8aNW^ zJ-F;lv`Kwec?&Zfg;%+Q1+)FE(2nhELier@v8oU$fk_k5*E;V*Ak>s#KsR@9EDhmw zPU81K*4~J$%{HJ5O|D^rsGU&e<@1o3&;R1+(fKI4d70^)2|%4!Nh~ibQ1ky(iek9= zehI$E0v@&KfWjme~HsG4V3cwEA#fH z*fzId{P$=W3Rwr?h(VdTaEGzZn7^8Xq)N4@p2ej$#yquGHKkU-QHypOJ~rUI?cvi& zP|9Mc&UT)*LpO_NQnpo_r}#Y4cyHp>)uova&-3YnLcGg)Cm>`H!Bp`m3ET55)M8|l z0nOCkT6d-hwzS1A?a_q#L|1_s!HBCL+p&Eqx-vKE;JzTxws@ds|v*4B*ByWu$7mEmC z7l^$fo^xZw>txM}aA6-OX&a%!&WuGL>pHEOL4|;}Ym#05I0RJe6A+zHl8C;^&zy?R zUnqDYkBcFlEWhnlPHzX))8anhDeG~Uc*=Swx-(dBDX(sBA3-~ZUQ3GAl2Ac?yl+7@ zf`DFSjwkY{CF~nLZ5pl=Ja~h0GlyP&7ng=g(bx63yR8_VUn9?h*ZEbV9I&GEBiVN` z&SCLk~vA98O4n)ohJN-|~oT(M)Kib&dqx z%o->CX|k*PB7|%Zi?Dg{Has4#XJ=@z(uvTwKFoN%4#Q83P46sUaZ+@nd!8~omk^b5 zFl=?VZgn?xYPwzFQ@soadJ=)*3AomlJOPs!;9Fw^`=*n=4~|RSZ3G*qnpSol$hdR9 z(;tsEaA@WG>tbiGBZSwXM`xrLTmZqAt*7_+jYlv+A56GUK-OLoZuttX`M%YU7`#Md z#Jsq6B+34<7WeTM_a!2jK+sL@lf$2}^-j_AK2-DM{fSg%P3MKg`B^rhDf$hZUyUG! zI1}x~s+x(R*7G$92h`m+H+qb)Ph~oG$9@kvvcaT57Er5fLIiV?ac{JKs4?nGB8)_R zNSRs&=NafNlYWVDgbwCu-szE>7E#EC`AR2BBxS!$-GTfu4%cyrR715p60hA4>nLtL zb;} z5VyGZXWw|+x6|ppR_$D!H#A=j+E0SD>B^Z^`%+ZYa zUWH(OCM(J==GQ<_UXqurNM4Bm3S`Fsy*ZFVH#6-vhRPgzfqIxcBsiZ)%PLTKrEKAC zPR&5wqA1t=tBicUEMW^o=o#~~w=d{rdsO-9edXgkU%^P{aCRm6kaENS7>~ZW;(Mtw zranY3;Q(#HsKdS*by$&j;~I0(LM!9lyBU0$<6$$LJrIoi1(*un-hyPhEfNxcu+&r{ z9wD+zxi|3CsHO(Qgu(Dwg3z!mDTr|%XmPVG?o-3l5~&!pV7xOVGoo`k+b_jCm%=-} zU?PpL5o@e!iN5RfY)48O^Kg{fN~%!DuGnwrMY`j-fkXB(Fz|s5oQ)BZy1d%PE%W&o zbAv@j8!Sd8$2IX(d39FQkskp3seY_UG5 zIXi>z@~1v{KVF84<|9Y5H(`gQH1}jY>EP0=1I3BZmdsAybaIiXje9aOzthmudDmut zagcdi3$KQ_84DGelhG_<25D}Oh-#=TlHJNh6xeBuaI*bD^*hlNOEi#;1x!89v~*}w zQvLtD!YYbQWA2kNrtfR|c@C__=2R06tt@qVenhGaJ12byPwM1(Lb}nDQP;|ZSt86^ zS#c`K9C_XoN7o9!C2B`2lDL$xJk#TN9rk;+;3v%%Jlj1yaF|)#vWh4nzq?LNrY`kZ znEeRb#lj^pY`6qLP6U>U=IGAOKQI(E@sg`qQ&}Gh!4q;&jN|>mXl)u0+hjkF7Q?R|NT%C|_&l?+fy^TD~RZtIH0* z;nzpEVx4BbQIJpa7ZF0fitJwp`RbIfA~U-npErbc$#>1#?!(3NS!btL`zn?J9Q1MrW1Aeog73l_l!g>TyM^ak2WcLj521@Sn<7_+bAO`^q?c(c9m3Ng{PQF5GprGMNew zstIxGH~gD=%lZn@|IIPzKY`%uIK@N%D$w8Uezh$6HGCAqEB`Tj5vXuvTR)l4J}W;? z!Tf^Nv1a#?`E0Xfhb2tOw!lRD<>fe)jvb%O7b%-)pI;$S^I~Sc-ny5|*{V5EYNK@9MN{0zZz5F`dubWX*} z|H@vW-hF0|?jQ8u6+z$$_b{~EBg-eAx}*Z4!{5bA>XOoCcYpU=cz|_Y z(pmE}61(5R5Bw8ebz?;Dhj@Tvk4y~}{d$aA?mqU$zc{_`=rJ{$t<#+59`F2WYS-dK z>htw6PJ+9KlIhQvwxlb!5SllUZX3_0Eex_m>eQ}UY}7M{C-NSB*h#*HDP5c-tp2Ia zuO>uaUootA_aRa`Uu}sJ+Gl$QqH?fwc+fp`P0X$1-?C!slEv$$_Aj>iR`2G{j%4a` z;lX;bbI*Cs8g{;OJh2(y!XQgkt>DuPE}GC89$k}(F>>ZG2cbmg0Um4;*#;i>1bBp) z0Hq;|vQ_g=Zo?iojpnym2f00)lY35OIY9HDmt6x>6(uBc2)aT#2Q z;8WHa$KZh;-qtZOB{W{vOv6LtHM+y;`F9EjX#Byar$p*of}2R4&XLavUG0L(E~HY9 z8=%=9Vg!IjY1C5eOxg6!7nR7>q@;Ha zC!$9>$^fB?hwr0mV&G0JwUN-%yzt_6?x9#;U94|e$R8ixUE(Dz3;XYR|LwaA=f~VX z!tnK@IGwv%x{sjxF)y7p-_!&oecGXGxDSiRqTiMV{T7QpdDHpWE5)hGTY7hQ?w4jq zq@VAJbf>pnCA;sh&-+HQmo^?bx;EVy>fN2b4!t_GIlf4_LqAB`FEd7m8 z$7iVlT{1wsD4T4JdMFhsFF&(_6}K`fuF$6(K-W#HO#PxT!CWXE>)XS^HSS zL>P7*KoD+U8&AbbB|y%I9`4}W8F#OJjlFMs!ZUDf7qMwo+uFJZBGFx)j}pb7#n~|P zVysK#AE4DVX(9Err-j@S8cH>l;mvb;E|i-hG@?-A+WkXBrmlbCT8e~wAl6q;CanbX z|MaE`x2eoYzb$xBkwX12-F4RB&}L$H;qW#akJOy%R0%;kd~j~6zOkst(7{Zy_PX2L z`IS5NFe7tkR?%AVeQK#TPvV<%UmyN6tH-&gE=FvCxI4dM#|z_^MzEyaIkve+v&ZNb zrs~YpoHcDgkEiB~TUTy{1vy_&g_Mq`FXMt6;*0zh@9xryVbn+*x!V44QnxK}=Mrw7 z%+DC!c*%;gX16~MbH&{iWloPok>*>aDQ-9lZOZAMS7r)Lue_K*t2iVu>s-rXd z7EG^qe$_Lx9%|>L)k8>?QsBgHep~gq8~bL~t(?-_zO^a3tFPxI6->>Xe2v>PM+G{^ zcOO29xhB=>GLyJ#xWh?sP~4p}*-8H`pFGwX9*dm;r?AfuMkM(=xr`vZab#SmxG4Ls@8?msuKqD8@xD2ADTu78Qt;sy(TB6< zWNY|xK8cI7%NR6||2+C!SV*6PD`Osga&Z!cjYf4t6*TJfwn9AbO*F%UKD`<}URIN% zMRs+Cv&%u2uHD$AO*2}>sPHT$3wUphTT3>kj85;1WX&$%&-;;m_EM_((-f+MY}~do z!jHkrevcjo3EusLJ`&)ZA{Z`-7VS(Hv@eLB%Tqx7>!=^ebo z9hahO8v8nm%d93E7+IVBH--UfE;K7->0ug*_%^mHH+}@Z}sAYxN%NoSj-8PTX4r zFjmT>h$69#ySkcq@oPR|UoNpL)6VpAg%#nkG?~8OWX=zD z9|?c!ZFhe&m%$}<8QfatZSmC1`qXt1yS^&!UR_;-nV61^Z$hFoG3Q2(|70OCwRD<0 zvmDX?X7|WA_d0fyZ=w4Cm$i3+ud2H8_;bSrf?hpQqsAI*)U-`1brMC*Rj9de6V8Pj zMR|xttv1%`Xr~r(MJo_!63m(71=?!sJlf8G+G*{yGjyh%)JN5XR{*VsL>^)Vq*~7< zBB+(8A^-1hpL3HNv^w+o|M`5#J&%3%W39EP#P`ouxad$e4yPrRd^I9db=wy7%t_07quE~bQJ|moGP69TA^WApu0^fVV z^Vb4AuQhH%i>g=;1`jlbLT8F(5dd;ysNV z7Cb@pcWUMc0>co$Co-??o+9#s4mtniL#tJ$O+$*_RP{;_>EaPh6ks>h)UQTU8=Ch+ z9eT1l4qoaSYT3)2T4sPN}r$6Q# zL>{r0MOkZo${82y-4#D^67s;9=EI{A3F43{aXlG?A&&9c`7oS5HUkgnBi_IdEPbI$SJ{lx|_G)jDS_sjX;nv5`^qwL+EU+0@oauaX>QEnb~6)FYIJ= zOj&)LyQ*Qd69&L}%(1MNf2Kc4=a~4y*ji^FNUx240C#{dEdPlD@wykm7h>s!1HEsK z>Cf_pPxHA!KkPe)FTlS)h9_hggD}n}tHF5Vmp&QWE3@+l{vFJp84UUp=1=NpX6_hQ zTknJ(Gl7gFSLzXXbEX|)(2UN^6IboAmaigyu;w(p!)o0DZ-Rq}egs}pJpw_)3uMUh z?)n2x&`d*3at^d!h^p;3TR9nF*-Zi1vl74|Z?mSTKjIvt)0sJ_d4C}9T z`g?b!r;LfaK!40y`li`&S0U5PTGnVt6#je3Fc@1cJLy&~oaY(dJ2bQ8ks~+{@!o|R zUv|Cx>%3QdUc(l#8BHzo-)uNRo!sYT9zk$1>u;&}+4Y0?us<0eq}v4K1}AaZz`c9B z4NlBHwbg3zGU4pYd|H4OUNVMe7pvI-QU*+8*5-g`CWLE9aGXD{htc5;9|xba^<@qn z`sa23m+;Bb7^7LGu zEUqHRY#ijtIxzpqkoiSUd%=1)1fOw`Q_lNg>s{aX4SaIqD_QN9SwDSIa_TtfG0>K( zHRD8{`pu*Ppua$V{)J$H#Bex}*^ZPtNN8i@NLy@wVDRxq_{C&D!ic2DSh&Vot)GPl zWEMf&ti+ioAiO{hg9m2*$d(%c9hk^nvU|jq93Gs=wJ-(_eGQm-+`B7xg>+V#B{G>M z(2MN`yMRyWcKUu~rxF0-+*i;xqafmA!5M}GlSv08V0#P}#vM@DMj?&kiGVWrlx^WR79xU80t z=CD?*ICrxFre$nFmM7B1G=qU2w-E zqcsv1kfzHsWw37a9u}ejHHyAEwG~&Tyg&4Z zxp+gssqTYGWh(yybHOfXEpxbvD_DiZub6u#)LNd7p8=(I9LHHE6*g65h{J==P~>FlhXN1LxZ=Pi^G}cX)s+E;(Q^4rE82wG!t`1TP-@T1Mt(=j>-JHDZa<} z;DL!P3e-pE1`dmG1BK|uK=yv zm&W01i_WXD+8Ojt?}u+2WWSv00o=h#mYEB*f@{9b6w&!X`q3WcvN;UTY$Q1^`UiWC z=`6rsY-e-A+58m6Q8?c!$gE&&={h0=w9gEsr*tnqJjQzP=R9lPQ^_#fbc!d@z?S^+d+TOh9^2|X|C3P4hS&l+b)iJbxW9(mUQ=#G^jr2a<2?aPi=VVUj!mK~q z;pl%xlg?k;fxGwEYL$BXNu+q@C&u*Ep32(|3#VbJd?pWt#hFy#EiuI=6{-vP+Tq0j zy$GMiN8>}gf`-LT1oP(1>`|*l@pzRWYqH`nk#J~oabty7@)dJ+59&O= zo!@Fdt zI!@k=MG(`h@~hoQeicVU0)C0-2wn=O%WYwb8wpwM<4>_&8<>R;vr&ifKiZRe1#5Ca zeRK`ydYpZxFW&p-3k-B1E7@x|%AEtN$zU6tJEyJU0Gw5Go?0ep2h7xe5Xl%+I z&_3^n)RQxoA5)FSLih2K^hbhtuVDo132iK5p~2|s-c!hFPJ+pfKNY%0H{X_#&)e4K-c}-=Wjm7o|6N5)46npZCFebZ}|_Y<72! zsDxrSsiT=tGCdLdSkZcIhtuPseRui^A6{hJ?zF-w>G5Y};cc~7DKG^6d>3GUv)^uR zc~=Chn`7pNT>#xc3A};u8P4I<`ub>h5*tK|&L3)MeLwQ?n%moeJ`(EkAbnWNaDQSu z+R#YSZKxz6odK+&7q*mR&Ui*~$md^nuyt&eUqSo|%$HCX%~Twd;< z%n{Erke2z0L;;N&M|Nh^q#}8OwWN9KK2R(P@Y`I*-Sgw_--c_WZ&~TN`XD>%g4&8V zG}r{`b2&-X;Scqs%gV_|sHutz#pl`*t*MKjc2Gt{5fG1Mr?$UKfj?=Am*?&h}PQ$g16!5web3TF4v`eM72nflY1 z#CR#cyP(*vc-IcS&{bok7u(^5Q>ia1@TlErclpL0=bmcYDdceteEKcEy~^m+_L45K zSntrYT5MXlR6Z7!8fwqz-8uQx@fNvXY}%P$&M_Kuo-uvW^?JgNkSge^3%W9^)OJrF zdGh)2_d59Y)y4c)+Rm)3Mikd#wPCs5_mIx@;TLHMV zXv}6#7>v62gf%g?(X7@aL(`@1_ml_IcAB-lt2jDiIilh;%fhQSGyW*%4vxYuiP{J;xAFjaoM!vJGsv%XO13bO ze&$iCPNZ)x^`<_>QBbF@6zEsN*q*$P7tefA5Ky?or7Fj(OT{LgrH^svy$pI2>2?DS zwa+U9y{;PHbkfO#!S;+193EBbeVc}Ya@p<0%B&=#v9}1@d3FW)29FKWA7FJVGab~J z)qgY|J3Sj>5TNYBs7;^*Z6Dj|JF5HYHNFBl0vE^JMOfbJIFGUN{%NrhbqIn91i@Lz zf%h8II}X+3F}=@16s*(fef)*%Dd0liD8(l~ASkvY6cj9N|rKg#I%`q21*z++GL z2m6$=jR)%pT_~iy@MN{#JNR6F%sai?!I}IE-Vr~#ftLoYMw+qOPw{1(n2~X;Rw?BM zi(NHxj_@fUD0=OfpzH~fhpbiw(hADnGFaA)71NPLCv?Sb(=#V_hbiJtBP3;GQP*N0 z@XWNui+SyT25d?H8tNNkiW+#+?QdDX6L-M)U2~Vvx0(@z+aLn)Kw?DY+i=wp{y7a9?cdowKU$uqw|n=pYTO$DsG&@ zqxmYurU!FNZOzRN6poaa;nW;tAekdQ;p%KbN}Zo=&y+eAfL`!19XKoJv!B-lP0G{r zB~#MxDgt$02JxM)UixhcA?16!eZ3QHwm3dcXp?~h+^rrYkh1JfDfQ(7v_vf-_NVrad9*E}KapFVw6c3Cj&ewNsM z>FO1Mwo#Mi@1=nlk46W7uY|wn1^m6h`*pj|85e_iVpNK%;H>BkP=po*sGz+0&`8_) z{(60b`ycDc_q(~a9@IfkLMVLmDuC4xUSfyV5A4!Pmc-u2w(jrCW>X-6s4&eNLo*5Z z$29tW4xN5d9ytLE-Is7$Oi}LwV3kP!w#+nzRB@Vyr!K|1TFUm*rv3#iRL{%xrQfeO zXHmIP$JA$*B?(>=i=8El`No}C;w)(~7nRM2Z~${C*LAYJ zevPX|<_4zv3f3Zwr#F@rJo6e=*zWfZsg?8t)4X^8NBsJGeyj9TliHND-FY?Wbd4#y zp;;Yw=h!B4)VK-)`@NNjzI5+MXLHP9f17Gahmv%5+wM~uigz-gLUpv=e=;L;SE%+8 zkExbq=ucXutCJPGue`&yokx8@nG%jE;rq{+ahSd!8SqvHM)^-lr z?8XjED_6q>!HTfMPTx1p>j0%%68;JPWZv4Y>Gg%Ev&@JZ>Bs~SHuJ)GWE$`@bEbLk z3lPFS$Y26Xt|=! z=T2VecBlD1es6ca_bq;c&$ZZDE#HS(&?7Ui@%pz~TWG-hIlcE!0qp&4{{SMBV+h9p zz$YtuWc$?MSLgnP5v5}z!2|Kgmd>KufM^8V%#VOscAd@rG)tzhf1L6S|BrPww^2-$!>S+du-ZFtjgC1cZL{f2 zGW}H!WWMPo0T^af7*odmx{Rq-%WD7wDsA2S_-%Y|UG24QXgaxXRu&$!DxKBNHfKl7 zh}xaIMmZTO0+8vVZ+ow*r{AF@B!6 zfXvkUnQAJ@%6nZ)1PH;bYso{wRYpdEK;F|*4FV_hQzlrd=a$C0zOAp|YHZkjTc7Dt zi=HIK;E`Fxe{E`tLxc1FyMG|__q6Q8NwCd>0y4)?+y>|G(9C%Xy3N!7!8tS=QFL$) zWqxNqtKqfi@3`+YoWJs2lhG6T#z&8n$xaoNuuAWX|4EM=`b;NVsDx_LC%sY48kC-J z{y0=0w5`|^>Q?M=$q`Q$@yFCq)!}_dq>>(a<_a3y+Yk6yWY$T_F&veVz~>ajhIwe@77lv6U#hb zGEX3x4@@tIq2tWT5M`f*wQJuq{Uw@B;PzmW^&TR;#G-jLHNFgwQ;Y=Dt83cE=flL@ z>Erl_pnsDh3%Z*Z=H;gzawp+MY@giRF*8pN#mMc%fu-udd2~>-thz+q8czhL8x^Hm}3_mx8}}#`*Atm z8N+@SFzNCd1K-FqdKGx(_^#dc1<`k`v^;X~nX{IeKykICN=y{=VU2@+sSL1lnr$5D)8NINRC)vFouY3?>M#L1)JjT%tF$((wE*tyojI2n@+3cN1%}S_g2gM zg6RX{{A79|g2LB$9Cv@H?kS1zLzfy%cUvtd>qT_qg0HdG;%w{Ims!h;c_zPXZRTUK zV__}qJ8zI)dBTBoYZ<}X^Zbvj<-57I+FMR9hhN$ahoOVE_=IxncMs1jhhUTiZG)CV zr@k!f)VsB9W@!`V`{(4e+kEWAwuevB$L`FM+ntB&^;O(4-EAty?KgE=`s$FGg1x() z`UtGanOW%6mOMcZ^D_5o&JXGXP|by!vCV7Bb1djX@AV?9l@7UhgYQ%%Lx`mT_9jX( z>N^Xew}G}96F8hUvm~=kh<8$DI8bq=)%+tWSxj$~UTeY2ZMCJ@?m-1w1+4akrI{Dt z4S{2CDzr!f7D5N|cl}YX9aEzNGMCqH}%_xv;(ONBWDA8Rg8`&~UOl$}4 zd!1u2F#{PabYD3AVxk|3E-}khvp!WP8nDk6u@*#Lpe|8>n0ghn=L(s*_^-4~2l)0h z{!a~K_v*6RzlEu<@PQ(3c5*}FyU!o2!mxNlH~*jG|55(WDSMA>F#4!~yBD%ISR-#( z&;LoKJeeNh&x@)H6XXrY_&=|lC#(IZvp4fgR=(L&ORS4_^E+uQfBwM#wet$Ci%!3- zh~Pm^*E~8k_DD@zv}(Y*=rz4LX-dwU!!>R9hxBTfUXA>loL7f`q6#zj*_ z*7AG^fmw@FD5o-(zXS>cY0%I?W_rZL8%Nf3=NG}=>)0aocCeNi_^*K`;_g>D2J!l$ z^#HC%(0`H|Wp+L12bF@psVDBY}va(8!)e% z(ZUlhneZYDTah?Wo8!MN3~6OMwCGQMB@3TI zpesa=DKZOo)j;1#L-2MZ-;TbpFzj?WFX*6+Jweklm1#bfKQ+y^#4ROJ*nPOQ#u zB&wWNr?eIHEvwqVaja`-$9whPhFh$`)j;FC>C(WQqf89%dB@Hv#H1Kn$ z&p;!&EYWbds>csW+5*@q>)M<>c~?7aZa50M;7*Y!4Obo96l;rAMyJncG6}rQIov07 z2z0T&%dCcTOAZu&)q3blOhllRCTq?V6a*v{^}B?>fYtKfYEq=J!`sbcHnG^?Wv8L| z9}cq4ZNvvYR>6)?_yo=~#R-)I`Taxe;GtN>=1GQdTKDqQBNLU`r)<2R4T?p#O1@yA z)9M@kI5`~|TXjGYFS7I9S+5Evro(3>hgqBElcZj_aMu}~Jj5H1FU_xx>eX1>z zuP)J_=sQho<<2n0Mwv3^9cecf zoezDoREz?=HF@MerU_veFy#XeJGv#cM`QQlOZf|O%Lj$mu}A5Da7-U$^nqwy^?%kc zKbhnAftz(Sp;c;Jo5PZFZuZOpPac=v;_d)9)_^qoG zAFP`^kVi-4{IFd^8N_E*?)L`&rVAe)K(-67#0`BM|2<>R zLQnk%Y&k&8_95r{ubB3eKKz*rL*HMIdQ*4ITDhv(Tg+6{!5Wghw|&ik<-?B+nEc1i zDqM|2-ECh3UN5HpeHgrIY3F~qWbP6`GiOv^JpC| zVtRNi*{}fu4sNd=h`vnqqf6%24|>SYbn@H3b!AUu0$ zNop?|b+Bh}F$GkcyV(l-~al@H=OC`58+?IUnrP2RZ%+bml|laUV1> z%aZh>t0cER-q#;n03oh;WuYnKO9e)0d2-JQ!(;0AJvv`}hAjuyH~Q+K|H0my;G=zO#qAIR&ra(H@A(S z#v>OS5ee})wYW)Q*sz0r^-^(0-cH5!4X-zzti2lSx9*HW{8rB(ugAzKZoCxR?V5ri zO)G~TvwvhQlcT|h-8+$*-^0E0XBb*tHzPs=of@(;PAIp)m2%o1yq;5MUwZk<9vL2w(Elpn>v?(rP{;E3_iVL$R5Gv*!-&1egDShr}D{ z0Pbz^C1dzs!2i+f;!92d8iQIR8+7YYnA)!iw%gaImRaqS*>3M!Iw#Y7w0~eu=7(gJ z9yZ^m)1P&p#k8S3TE?{TtU8vSHrh_xe{=habrbXR*5M^8>&d!_ALN<1HBXfbA62hV zQ?0Wt=4?lb7}S4W!~~&Rkqb37yxW$n91YByJ2}X9pr&ns?((T_$zhCC6ga>s(aO<; z^ru9uc~vpTZ1f`aTa1gBELpvRTCh8sN8hp2E0$xAv(s&(ff?<8xPO~ceP*!;+DBi# zQckze3dml60N+wT|3tI;=XAYi|C`-qynWPRX`FF>GII~Z6IL9*KQ8_E0^f=E*#c_R z{YY=tBf=1Vy!Bj|@3Z{bpLfss+G_XA>CSsg{s2eUnY;Sg4a9V)frx zRvg=O7|Z_H*rp?xKb{4>L?FDotT6Lkns>Hb$PT-;@<4Q}^^oEpUC1^LlQ$mWVNWdD zK{#}4nYN9bRlJJuFtkM`>W6e93=1t!I%4UfQRbU5vPv)eHE&|1hNyVEmWtz{12HmV zJoGqED?Cbvx?@h`Nf=nW;?`uMz2YLc8rI?dM3a0 zyS8FSPQMB8q|dhTnF-!#r(4P@h41vkWtD7sbmj40lMhG7?$kR>0PUre_MIXzKf%DD zV5{X#24;3q>!Rb^=D)7J(^3pUB~^RbHdEsJxI4O{)BF|?-X@+N`v+|2d2wsyYZa@^ z<1u_v>}-jr$8FXdYvsGO=^v@`iq)~uUmO7QUb^H}z2cVn5a$H9v&$LuUrpabea%(Jf2(K`Qm@`LHPd2ZusSUjq zYhGKrq+h#ksYi2%X_8u09nelHsR&E7=~B9|iQW6LJStJl!gATFAd-c*#NZd5hw_PF zTD;J%C#!jc z>#fopm!;A;8a5I&bcLP=eD4Y21aio~-La7eyHjr~lA8C0_i;g3KOm;k0*-usaiQ%# z=<|+_#&ZoXfytlt9jfm#b*tQvygQ^@Nv_SY&o;kh=kSVn84&@Db?l2{)C@Ur|6;XV z%r&w}3>*{z?8VfK^-{8n^J2yNI2P9V)0izx-_}!Ek!ryc8FIU=)-ZQ5NOcy|U+uAGZIJBaZiFn?(4%~ktkz`3bR$Dc2a9fNFRHS@6w<}ymd+?fg z#WDEIH9K1O-fzXh%VM4$eAO9SR<)P1#S;}bms$RHbSv?x*D1tSEzp!R@Urn-(6rUk zOjAt#lb(xhWA^ zRn?OSbtavx++dDnjHyNKJhiqha+;1}M0=Yu=!+OL_7issw5jo-a{xIVWHna@YfJ}c z5;RAri5jr_3c>WU6oi?GrdG>eAfrK48RYwNufdaX0s=uJNYIvpphsn21v~64gjdyv zHdS@hhq{A#58TF~1VxB5y1n9EYvo2B6ossnThb4mV$ij*b5B8NW7{~R!9-X4c#4bv zktGTeHJDmLCt5&mKzdog2jjYf1Oqm4-SLbS4Gtfd9H1CIlkpu9yl|pm9!O`b`Kl1w z6d+3V%Am8@f8@uj;bA$|Dq*=sUn-Sa_^7_zZc8(4HYU zTsMNTSI3>hL<2+DM~5Z)F>;;^QWcx5mG4+9kEDNp`C>Zd9P50$Aau-m&uYJ?zwN#c z`0&2|zgps0+kO2if#u_)>S(*~7;o$V2KiGohvha*%+W`l7aQ5AXK*#O_j`kCMGbVYVz$XnfK9zN}@c^k(m9WC>9kE~ zS29Fb{WR%HQ!fS*I^cbM8S&Gix0Mw)t;;B%@`{h)$R{hs zCk=p@h7ez5RWh`dnMiypCF!uD>|)}o1FFOzh6w#j!z3r#{BC) zXq$z_Y!(F9{o$AWZM?t^^^q@+weg~T7NqteZk#`PpsfzvthSclVaTitGFu=LJCEB8 z%07w#dC17wSdV~Isi^pZNxge-xp*g=WcgYC=|BYyJ@xL4%|tsj{IlMTyhO(BEs4;P zs-F7L%fxi_`Ih0E1u-}LotP8;ZooG8h;7=?60Ec7KQg7XZ5RXaAI=W4cjbfhl7ojV zHxSLhPY9+jXSrfAhhco-D)EI8Fm=UC98u!OC7c8sJPqVTpAZu=96_hR3`h81aD)3l zksI9qvE1OBAI}Y>TP&BZphZ)Rzy#TlNN)oFd$S0u?oaw>4rwu*u=Z3`5PJ?mtb#u;nXO1PkS-Rg#?zu- zLde>u;5*T8!Pnp53UjyPv*h?RUm>6Rv?BVSa>ccYyMTSv0-OikFQt5`uOGfm0zaQN{LH-bbm_?p9= zG2HpJM#sxSF~q!s+pLx~tjosFr2==Pzu|j%rzpq+Kzp5oI)P~QXGP*DH)<(D*bi1& z-|eX8bYF*-tn`HUvj!0|>c~sbmWYy$E1{9U*m+;g!1qLbM3^<}dpQfz4`~L-b|f2! zY0NvTWv^M?yx1^K1WF^VFDByUXGgdG2&K! zZQhWy)h+#}R>z6@Xi1&wd&IOS&P6|w%maaoEMuJe0ENh0vxmuCi}_M=7tlPoEwjc* zU5r_fVmmGv_}!k?emRvRk&S;sh-RxFl#kcf-m4EHlPMLU%ytTELM*cX2Wd>J87K@B z;*+&#tF>}xeZy|Mp^rHKRj>HTcYJxnfP)S2PvfJ&{9GOKfnqy*NH*zxaVf!$qC1;j z9^?;3MDqUpWK@_q-WIlsc4)D4oPIvP#RHkWGEV_L$)g@Rq^)!516n zEDQnC#^)lf8(c|N4zC(45B$cpL7^6EO~rngwg6$RT$g@0e=z_Gq~*3UD-e@k)D}lA z+Q_ntHT{LShs2l7D1vY?h(v}`2a)jRpFb7}vw>2UE=!XQP@;rRg}rOM0mm`$LZo<^ z#Nyx^dJL%1C;)(dj6gn?6>STrfJ3hWdgyU62OJv1_)22V$C+ex)7u(AEc)W2Ii}OU zODM(yewme8K@|!lj58N>&PCO){N z?1N3n8LU{6io@Or#;jq4Gh#!St-TfWsW&eM{TYxks<;Nne zWL3Sh?f*BtX{%F!so2KM{Z-CbzpAn7EHIpLysQ+{xhCr!{yaxGdWZ}-F&(*#HKbuf zy<4(g>az24-^oKZAbp1mPcU=e@h7ge?5jbQeI4FE{%H`1a}OKgrQigFm){IMp2K5r z#A0Lla^9)2+ShfyU1+s$=IX$m9SR3|XHVYD&*fFEx^rD#-W&Z@-9zy!V$ObND^|fy zuds7pVNEqE*BYz+g+@!&SnWL(-Tn?>_4-BvOm1K!rDDBy_^LW$)rT7Y#B}bU3`-KSO0*~uj>&^IeL?dh>HMkQEqjYp02dl7(Y3{Pmqr9Lx1Ewb zbl-Ni+gAK2GFIdH>c%-%dt-TJth#Y*<$Pk?n(p;Io3#h1*abW-MzTq8@2O6H zG*&Qg6mjC6Z-&hdFUxaZA9SD-4g`TPhtdHC0ps0;7?B22aV|_$l+y#gd#;zafMpkl zS!XBt2%6WRFz%akQ)bTtxh{#`FEwVrj>g}6Kjg0Oe{%du*l~H^=~aVX=t|_G0%s3H zTWhs%>D*h$)!yDiy+?ZceS!~&f3HvUR{Pf8BUKb#-Pu>zd&p{k#ed&>G${RwU#^Oz z8PQh*V5*YBcoTtEAp%YoM*TTTRt5i1C~zfvlr(*5X^n5!4e?%q!sTbu-YTvEC1Q z``c!dvh0?ss-Bv*J1&kpcT`KQBrS8dA#coixY2eu7O-!}a`;Yh!U=B?r?>IiO1G8QHDx}-yA=$yFt2fBtT|j3GVX?%lX>j5ek<4~9Hu`K z>%(@6%B&ViBXT5g!)5XGorEV^6Y4@IVo1b>kG^I*U(}(UNHT3B@9XT>VE@<{$4XgN z>-&r8YyPW@LNvh!YTAfpgaL*AW3rY&WUQ5H(Q9PDreoC#1?DkYxn2T`h>{*_VO69h2gP_T4({nPcM{-wG8 zm*5%%nzm@ud*gmHFQ+*1H}b5O9jJpc?j@Q(7?DD(^y^Y{NY#g82jBeWU9#604Z@7^ zz`cBq*+9)`{*3fq51yzo|4EN|g3-oX&y{A?Kb!FkYNA%_=cQLKStE$#K-F0rbQ68g z?cP-M@$tU!PSniwKQe!$*-2J#3qBMK9%XyWV0mx$kZ^Zbv&M)#7_2VJYbhd7%x=@ zlssa&V`@e&4V&uz868;0E!MJ6)rLy+`z7eBM2?qV%I9JfGcpgi$nA6T_^8yCfylY_@js$=ms44{10_fH}~1;mNE{om>ZH+hWGl|jhEd+*ntZOD~T!QEdnrl z*N7<|v@SjVWQKVMJM&L#%!oiMSG69fhxW23 zPm*wvYOAH4w+1g5n&2G!lNIZ2_O0VrUL>dKZ!5L2I?A>pSt12Yg3hop2S97c8gl|B z)fr{?BpkNJHuPOEB<}~=p=|WV3Nk6H!p~FT+^Ex$fWZ?6%xa%V=dYvlo6tAp7qP+g zzbCXl)EzxE?}T`Euw4n%u>VxsbU&I>7q_MWsy^ z8$OBv_qz$iq`P?89a;kkyuvrX^_dgM{}+ZT_5&-@#JSH*94P){r^m>D>NeTivr}aB zakF6L1H<0W7|k>pHor!GDJZ~H8EvLYBHEE^lL?9`@jMr223MNJ|- z*~}H&$epCbp7 zt5@LX%EWZ`#K?D!uPb{H_)CKlJW`D7ZcnVDGo(YUQu;&P&JmRQm=k{lrFm6ts5=?m zVeV4DlhG)mt+O~OFKgl<@=rIfAqv(;;vqrYNoOqiu^7zjNdR3fd{t`x(f=5+-s;ns zeHw2_I=!){m?A^+fxHblAjCqRaJ;?~RwUg#l4TK3k^ob+TyIU!B@D*+Bk^eH-bH?l=A`!JQioO(iweQoH4+URSkbkZGLmU$8$WcXmTw{de{_pmiByOvq4 zm1v%sOZXE@e`6qXso`79+W8maP!n*K49;$l6T7=!-aSftyU#oH4NhJ69m+n=aI43! z@oQEgZ>zb=T^`p4PehCU^7xyebgB0Xu6$AKW$J`Na_L@}?K0Z;~6H?U=jMU;9=<{25lYWcGHc^%?n{w*V9{>;QGxlt0(A8|NPwvNVGnBF!cm# zmeq2#>6b6#up%rm9W$cNznEU|d9JAA?8%jayo)P%A8c&^a;xQ_G5dAIopoLv9Ygk6 zi`0W@%>>K3gvO@03)bfK?GW84V9AMO%S7K^r^Zl38Vja$g>{UNUXMeuNFFW5d;|>+ zkUp`E1^(G-dIwXwLv!FBuXJwzfd34jS9+&#D;pOvAy~uaNWc)gy3R-%%qj7u*~zq@ z*joFPw>(*>3e$^l_84~xjh@19ApvYoVcTKcsXV}3HttLw6r$CW=TiT4QEV=nS8*2O zNO@|N-KE$#c=KrHQ9yqg!?YT^E2bqEBLOe{P;ItzZB5*{)kYJuZI(Zd_cIk+%G&ga zTj~7@WM%L5nR`!x_bAVr;m@3Ce-#)TJoC=05rWeXm$jJYb|jsHpi4LU=Uqo^S?vkw zK_CO;Gsrwk^2hcjX@1CLi|D8G<;nC<%XU#zIM%QJ>Du!z&Gr7^y0&U>wnp#h-aOnPS>yPcY`DK)_CK^5>1}_sfK{H|e}DIft(7Vih5knfJGM`RwN_ z=J!qSOZ-YizRuhq^gcz@UsZCQrVm3d%@P3D#Q`mFSr|OlO8HQkI0k}xB+!8W>uAB==fEBNC9NH@TDKJFV|T$H#Q3b18O$@zt#bHVn~PS< zRNXu4`o{SD16jy+!|(EK>Msdr!3${BGhQh7?YoCZq<%+F$0oY`P=9D?i7sXjIPI#d z5s5=}L}RnPQ7~{n&H-deR(rAVbbz9?FA)fD1Pbx7FV;AF5R<>AM%_%)YbhtXxh3cy zz(>0t@S0&SB9hb0^6)Ezez!Kx+1rSY>}|!7qOfna{3);^^)yZl}64&XGKj`XW&eM4_wslN_vXq+>}32(BUDV#CxtY>={ z`MKqfEXW6H#)UBO79`#L)K)DR6DhdGcIHxWUEk(s#l1~Rs3+lyd6}Of%R1e75_dMe zo>|6?>L(D`Kylx{LR>z4ux}0Y{oWjS{yt3r6K&Mh@(qzpjurq`V<%#w2&@9>>61_$qV*%xc9mUkgtMMz@jm`G*&yyr+s zE(+@5IgC?SL{|Cgo8mYVF5(B)a*OxKIXu=}0+wS{+@gLXp#x5qm|L{I)acJW(qN~F zut`}TUy3R~AayhwBz~3=5GSho8#^tnV*sO!0Kd)6|v60Ueao4R(4Q1jO7*k6Y5X2s7^*oK}++`+Y6)teDd| z_YN($_tmH4<6zCnlW{S_wuqM8cUHnBMRW(M!f{_*CcQI)-U;iA`Q6zOukcJ?(3sJi zH-z?w)}wchj5`}4aaLqI^`+mXDjG zpEl6HWr&<)SR`G`z`#}a5}<$u9I{I~;>r@|#S?LYD)7Eyy2bj>uh#po^pO*QTJka% zO08%qGgYD*)I0mtR5dgl=U9Pv0|f)h?fbF!0Hgeny?-FEU%rQ~;S-+xImkokY&Ek- zNGgU67oc|dGJ~Gnr$Y#)zc_4pbH6HHv<_!g+1q}qWj}rCgxAeH8O4wH%}+sAA5=a&tov_ z#b74m*_t+l0q&pUzLV=)xn9k62iISrq5|-BE!tZ$eH(U-^cSwcm@h{+)K!1qk=Xv2 z=ZWHmb_FVd(A_ATcW7#O{S1RTZkyzUpV2lgFK*=~cb>-q6kv4S#NBLb5Y8U>pbM=OL=X-S5g{Yhs~Y-aM(uzHse zE0g|{PL@e~1fgBbXasC}(08uEE9GvKlq|cNGwB0K#29!F02?tY;_+(EqN0yG*RZf| ztRVG5{3tGF$`C@@+-KAk-~}80sR*M!L)}DXV3! z82~&~2@uoYq-R4muJf^R%`3}XLy@c;XtJaqUuJH#;YUjeqm$)F@rsSXu4Ki_bU_Sh z6#+irNcd>eLGh$xsg?BS#=+5zI*VzmFe=zXfS{xrdd09`WsWeFI~bJYt0hc1F^2hC z1N0Dt6rdV_24b5rM?t5V<0-92z*eVyB)zxkZ~- z-U#CVGCzjxKYg_S;$e`Gu0zm&-{fhv9xN8=TJ2{NdBq&OU`r+t%kSa)!HjrGg{XOq>kf{GuX#^}J8KAq%8RBpLX&#w!ff7WWB z9-N@;PMyWgU@T$$3nnR+uz{NsoDov+`Xm9WOhEf?z#(F;9tcZ&Kzq#mQJo zpp?VfELc8UZ=3-$e?=lC*yaw4!^$6wfH9zuU}D~RK+K=kvdwX@fR|htXRi`A-_<%2 z;-~nG7e2lkB?4q@ohSHF)z^-&Ol3(w3){AC?BEd z;dM152HK|Ow@nMR6{dEur$$nWjj5-J<|i*fCb)=TY6nKD<_}1G#RIrPn7T}SIvx_D z`~x^US6ECsv;shH|9+#toSx5zh)fsYd+B|jbRvD^Y^X8t+aeivHGiNFZ>lnlurv>O zG+M1+pb_@xhPyLL660}t!Vf%ZjH|}3+gErO(oEko4BmhLq>pbyD$^mAgWIiE#p4Ae zr9jP2-$N3ePeGtQ^a$fpVxX7(Uhr!W{OZz?D+~}w+E6%TFULR0ZrF$p2h&T_$u5qK z(`>Vis=bc@gwz`YJA&}aO=&boFW6^c*gdbu&WqA*97ze{Q`;0(VI8{$61=r-6PCA zNV+xUGHelK=?FvwAYyLBA;m=@(Uq#B(~ERqZo6!`@#vi5rpJwBB7wKS`_7kyX|CXA zV|5&4b}0tn^z_k9pUI4bs003lK#Rx9mk|_(F24K*baC)$B;Waz)r&o|{aU`FTGA8hRbYz>%%Z>w za^MZ5yvzlr+l+fy?OB?IQe)P`Ym6I?gDNqvm^J+M*o++7ZGmOQZh&@UU&?$DlS_8~ zWvloYvX8Qb7@MO{Z$y~PIum_ZdM|Xj&jsZ^q8^<#8RAcWz1+E` zJ$KZFqjTeL4Y|=d{nMYVVX$(Fah~^j#SJ9H5}5C&Jg(}1XAugm^#Bpk*dyEPTxde0 zwZ0yA=3!t>tRc5>L2Ww8QO-$`$+$UBOeaq#-O#!7ABY+G#>qI7@Nej1r;9y--ZzOv z8+WFclFF1f4;1$P+36(TnetaU?>O^{RUi|0CYAKQ>2$`Osb#%yc1^FOcC5j{+^2* zcs_oK|8Imm4WnJt=ht(v*7QK0C?{o`U)y*gdjuQ`F8U|!;J}W(PQ6Q?^!KbEPpZd+ z9MJsTXd3d=7d*YN!TEvS0)IYtbV$TWT=qKl0U**)U7?}HP+hShxsaml5B1N;Z_ZZV zKa6O2I#coiL2sPx%uqaBZ~{ZMSnCzh3*cl7#22ve;GR(C7Q~}_tfdpUt-xOa^%em> zDX1a$*viR9M(wM^EDrH_^oX_e%E5v~6f_4AD2R?=Oy^e@P;eYUsFz-0>PJhi*ho2p zGRl?nx=dvwR2osk{~<{U_E=)dp=_Cki&?$md{?7;DLRc5qjTdV;?4B0*|blVB`H*? zLeA>mK0S~Tr?A(fouWZ`gZ9c~R~zGh$kK)DJ0F(jeptx4ySC(|M(VHP(` z3Ghp&*IC=UR}ad2J$PGE`vF+Y*JaN?((6)sS>)`{5RJzfkIH&?>lAhQ7+k0J^zPR8 z#bb;v)cdwxjP3pNnEjad7AN?&8jB4ky{lDEAs%b))#mf7`MUQ_eOfZ+kh7DeyLTV& z#*)SKkpF2NUyfhzA!*?|b<}DVYe_o$>zzNNtzw!g4N+q$`SZ%G*0XuXqe?xhR4zWN zRnc)}z|x}{9>uNJheR$&c+`@eH27atY^rq^l>j|s%tbCP$y`IhicN-A+?qlj2`jdM zOBeA0J0j|_9$ZV;{9}pu_BzzDqg_{ zr$g3-Ih(DBE9{^UHRyI6TE3f1--s{1b0p!sgOeJ#$xAvfCJFxd2KF4bvAu=-qA@mi zV)ZTp=o5ilxI5-vyRCwNG}rF3E2gpecdf^-?)US{-ru!{_$^Ja@%?KfAfcay{ji#x z&RA18XSMe~oHj7)n|C%X$kW{EpytK=U*+P?JQyDhCrRRBF^J+14I=vTLXwb#ouNS> z4v$^u%P(*a#(}M|+&e26%YR{JO1RhMv=nzR+I8a9^m6LO<2uUmV>wi=_D-ayIsC(Z z9D2~dCanZ^#d^c$_D^5%cXXvHG06Rr(T@3Zu#IwJEnt2eP}0#g?}X`w12YvGFC;hD ze*ki`iQV}I#?w9CQ+f?o#HrvSZA6PR{+wrXAg!!dHh999A@|AP{Pp?U0pA`bmL~f} zA?C9c5QpuIFN3p0Wc5O~W(G2D&Wz zE^k$RJvs9m#*SHPH!z9AP_Yq_w{RVnxO(S^ zY(v%c*3}2=EASRG=in>7|B*21F09nHH`3{i{6RpTt9%^wni9_vR5TsN9ercK-1Sz=KAQeTgZ?qIP*V3NoukQ$_ok*J-<7{R#9PsmNRNBo8y_^B z;A!hX(+Z4}iyojb)$|b|8O9gvi()kJ2I`?5$mtA1qHQ8xtwJ6I1eQKN{R~_3aDKjIMCmNQh_cGiJ+|0Z| z$LOL}Or9@#*O2&_t>$ue8p3kL^b7&;2{Rh0hczoOm=$Ao2i4aIdZ2o;ekoSzP2ftz zaB1+Q#(QpR*1Lyj5YWnj%qGw^IG>S_Hp@-joIo%Vd}IDVw+sqGJB)cvf!Np1IXC(F zg!CZSpC4ngbI4jMm2)P7{p+yvFWj+>Dck&3wdR4ds(H8N&Ul2-B#ki&^f;?bstQ@S zd)~FK-QI`A2fd6{{C0w!Q(}X&T`xDzFXh3@^Z%^J^S{jB=jM$L?ZT3h9+_hseWU>{0wJD)T;=)<1w%oib?g5+o>7Xv!!XB-ce{eLqles-UV; zsw$x>Re})2-$7^q8G|y_0yN^tu#pzmBjd-UqSM!H1 z&?Im(%UaT{G@BZa=o?>;Pq-Jw+~jU~yr2@2vgM_=)wk|#{3ara9%2iLz;p4FtBa6u7Xhar zHn3TYYF0wS+KaP_)jAjOXg{z3`JKNu0#%{as=O2;SzMTMGaF<|_)>I}a6Vn{j4O*Z zPmYB8ew$F%N9d8>Fck&{7=cf#LH7m_S=6P2rW@)_#OtwTB%qmk=kno=7ttG_PHEWJe&9)(eC+$AENiJkin)mg4q<^*0{6z&0&Z;>#F~JTQ z(X0hnBCqXyhAs?j+D8%w??q-_A1g>sd`H9!6qM=DO7ugV@b2~r0yVSos-$yEq3zsJ z?2}JdO{prxQOXE{&(8L53QqKYjpXm8rx<#&oe`Ym8kWz==zY&j#`yT=htJalX|A^z zXkgfePKyoM987_=+PvXp^Qpf32kE`(?>OE?>>fiQ26`Zt2yjJ6%ROIXoEp43n40Jz zk#LL3Abq^Ws1;wGa2ZY?>1h$%!b~e$nrkC)+I>dfGp!w0CCiQXSRJ*|(y&02Sv|%a ztJ?ya0EY@JPvP_5X_oksB|;jj2!6whVR7L zr*liX#U@HLUjx)~h{eF2WNKm|DKCc6H6BeB+=~`po7cB~u;&3>j*pLO|KHm`TkV@T zm2iOJ&1X#WSEdT)jW*41Sn)~i2lFxL#+U8prqVo4My4AZJ@O=W6Z=T|octY1# zkr(?2#pUy-rdbfJSUyOf3fEzJ66(M?NS;wcm^(RenL5FCPot74PLW66HA9dLit|oN zz83QCn4~S2x=6^UtWm-TebBNsM7IPS$Yu1az3*zwD~!EOlj|=`E**sYkTRRghls++ zF!pO0w_}IsJ7q=F&9-}Df-`_nD>Xc47!ZD0`vL|;|Mxb23FHs1A9{y?Q!8tw78EfG z9w0{j%S3|H!7uz_j5c`GI56ihjv`;fJ$v~412Up4K(oK^AG~LPghoFkPm|yy;PcJc0Ea@fg6{xlV9w`-!&%F9VuINTVvd*92z?R3AjqCuy4E|*>qVT zj9hd)X5TOasYTLUQ(#*2dmh*g^)$=RbJu&8`C;ctnO~K;?{&|7Qx0hZPv0JTmDf@u z2w)CQ?#yTrdo z+{XDO4a(4bhPm{=OKknU_1aG_{c49yn=x*(pl8&&qk(bvrk16X;jZ8|9y^Nik z>gXS!zFiPv)3@py{+w)hKblb$SEt9nui~m|QRNhO#ufB}g{8IQ{(p?8Q*`S@6-zX1 z;XI@7cIl4W)b~(8m(JULOORBuaa*aLBNitd2W)opz6_+`cS+~49M|)nD4@x{m#D<& zFM^2xf}KRfErb^%XSv@15|`s*6J6W50KVAV~EM^fkZUG29|q>8*v{XDka$TpiJ zxb>)hja5z``WU__oqgwq`ZgW48(u*I*by7R$+clKwv2SdjHIbU#rsCzzQXjU-YFw2 z;76XHj3esFMz~y(VvJOAOjYYaona@epYMGajfste;~6})8+rp37{iU^@B%NxdkMX_ zvM*$KW396gVfgEj1pe!sRnC;C(f}UNA8dy+=PXDyAY_ywU9EyXyv)RSwiqC4YIrv> zeP~)piYxxA~CN>7~u$@2DH@s!=ON2*vUiG3It2ohT);IDu zHLp{IyP`9Q5XPo$di-~sBb|HB4ISBZgorM|n`3%Y^xgFM6EMVm#QOo>M>jV8TD98^ z4`5`x2K&SK!+zxJv>m!~YKb$IGW*16+7JrX}Ya>kN@KFqF7eXka zz?`SSJPYQBj|!c4X0@@F{Q?wdJ#^k^;a4J?umkZ$Y%;TgJOIxiDCR^LGMpDwSE>7&zRnB_UQ2DDO}GP?~f zYcPg-AB8i{ufs;vxg1R5TeLNce}6sSgZn$7RWIHZBz@7^3{l1b~9S+f_W@79&T zR+g>jvdhn4Y0jn*{lxFQ$&UPwyv2RB-g!PfO{pL)dljQ2Cs?fW*a*U%;dr+4So3S4 ziq3dCmLE^w5NbXeYP`4kXnyK|ds759Xy&W44LUeR%dHCE(R>Uv{TDQbweh^#sAnxN zp_%3v*a=tz$oJ;Q+8WD_DV|zeyleo_rcR2jBYLgQG*Bc&#bTNdjiQRKT9bS;=z8Im zwPZ9t#&b7SI--^Xf-C1vOSs>vRs^Y%I4CMcHZ3A9kVI5Wfk{*pVxAK?2zTIx)dOgP zZf$jQZK1Dcch!p1VXQ2|9IY?-*lNeBOGRDCYP_QZbe=~vKr+z5k+z%xnwpPYWwq?% zwW0C`qQQsrF+FqmpyhNv1`w$QOOD8J+jO7tLLp~d9!HYP7@|h15o_LIpHiYxzcJoY7#Z94hm43FkxzoqI}1S4_*1+%;joGJ_G?j#YZ7zE&E6M@F5HkIJk|p znRF)eEk<+u3UD$(y|tFtQcrEPuj#9?Hq?;-F(xa!;q%nFXo`@=x!0AkY8m)8w!yV@Y*>gT36Kcrth+Ib8*wt!{W8X-K&c^4E~Lqk$ZC5`^Lw%H~Ev>>(6bkUp+YHKY_gI!7=sV*})z>;>VF;ytYfaHr#!_ z2juC4=~vR73{xK*H&Rk}9KgzD>Q*Av4dNqr{4pS12LQ%o0npFgLt``ndE$4-e-d=a z0Lg#Cj)H&`7jAx;?W46^=gx=WC+VKxgnspd7M*;Qyze#Brw@WU1<3Wz51PQv*0Iox@ToVd2}H}2E|+)+2fJX$xTEEIq% zYYTaB8xI;MDwhI6sqxEL#Ygh`KJtBag5B2J6h1+b7s=Hodtc)@DXi zE&KriAsbIqF0r+~OKj_Qx@$~V3O=*`Ql#6A7aNCWHmH164}*Sr0DY-xcKN&_5HPFZqATdl&eqs%!CoCYdCY5I6y&riwaf)C{764ax}C44Hu$2@(YrU&S~{ zAT=a0nE_M?*d#U6VUSw1_F>Cywb$BOY-{mRTazFJ@D->iVpX(0W(-0AB_Tla|E_(` zOeQ?4z4!j^|MU6%1}1aPKKtyw_S$Q&z4qE`uhleQASQk{?@z$u`)XG~wgp7y-*&3P zsQ>cNOxXn>iN9>b63|U++)3w1P`5gQy0HZ$U4_2q!{PjfulV`j=-5l8k<3>pZsLB( zZ(vZ-rEF}7zLO4JM(qGQRlH%|tgr#Ud3FkkgUy3);#uTrx}x)U$ot_d{=!NkX67cX zSjuxYqB(de%N5m(9MueZa!=&+2XR6oay8Fj%hj&X%t_d%q*M31=_j#2sD& zR10&Q1jkY>hH6|RV6Vo_%V2=f(~WCv4$x!q)O&wz!;3 z@)EP?9o?MpxUD=wfTpM2-S^uv9s2Z>ch`*wt>{yfXYEN$OfcdV;~j7l?N@-@5Xu%#y%~SX_*$v zPX^?zD+OM@@9fuZ${s!d?M*xOYr{u!BtTB8^#^HbAL+pj44{Hgdjoh@sz6_3&tz@g@SuTPF21(4VFGCOA{yEy5iuh)t1x``S|O><4y zu;5aNx-$y9IPWjWZjU_x9>Z6R<{BQfC^oG)=R`yL6Uo*2QTa+29u6Cn0IKsRScQiv z+q|7}vv^p$oABs&JGQyC8GBuhS6y1shi=Cw+VWE93cyg;(F_~NA7c<<^#Fh!-%SmG$2DAhyubY%u}wZA0$l9FqS*I*`!-1wyIH=PF|& z56a>6l0~^yl7|ICyPQT-^oUuRlx7#w6-1!cpAIt(6`F&@y>?evfz2>!4=(d zun_GzbXw`ckpOSV;V?Cr#ThalcL|Y;)PW`fE2aB{WOX{l+rv7c)9#BDon{H0<^=u@ ziB`(#kK33G>KBORhlE=|lH2dpvaIsQav%Qa@%0M7_iYKjj^)dbhzov-cG2bq!xSCH z`Mq{gtM+mI~p10R|qHi_!Rny5OREY zs)K0l!$$;PU;IPXAgU2RihfIxk^)BsK8tnrS`ebx5L&{Wl%+bPVNni8PvlS!*o3iU zNqeRT*JCNQ%!$QFtV8*Q83}#NU}2)Ia2d=fiv`hGSMXzA6@4HrV~s>+DO~ZS;vye5 z1m4z9lA7MBXA_mag$RTL;fwR1&LD>j=vv+wE6<9B)Z{Kte9aN?rk(Ywh?YE6J-xU| z%u2Id=6{+an7Js=*ZHjyWg$(*9(|n`ctzHM!6S28TPkTtR;KE&e{;PCFhnMJK3U-{_S_L@T)&5Lb17_d#R- zoc%a-btvtaF|DB~mZDI30b{gDyj)<#sjZnZc0h@PMx(VSIXESsNIx4wg~%kD`%Ne6 zKMSukzrZW)h1rk-KT5%Z&kvX5p8TbAb>$s`FS?aMkpmy*R2KR>i5iHSFdsQ5c_s$a zg!JZ|A&SdI*P_5&GM(~Za@eC%6$YtGIcU}9w7+FkLw>2I{>QLAtBNWZ8Q6d?UkPvY z-~_ShPSDW#0{u&_qxE6JUqgi>0iR6$pfy;S6}^;8#~#U z*c52_B$PKE}oHGhtYyt1zhy?h3ahJGEl7Rp?a8Z6bdJXX68G3 z>z}scinz%9DN5$Z6;KVSovUN?imFoj2wJx*6L!Pao=&s&(Bjw@l=Is$d-j>x!BiR< z9M99xv>1|*|LCCT`6RYaQEw`wcK*&2T3R5x%4yN0^JFJYR+@?Xi}&_H(r0P+i&i%# zwyBLo(H{HuDkW$UuI^I>_V{$nENs?u;v-r{^1up0)LFz~e8ur6d)8o9SVk%HSY>RjbB#2>p(?wLLk6()CS}Kzt zj$X_%B1VewTIAPuIb-&b!iL(^@oF;;M{Yacz(*ne>guFFW)`z#TRcpHfS=dUYY9M| zg|NqzpD!F`YADFTsJ zL|f=ZC8x!(JBCa#>^A*^CM{cn1N?71U&5szd@H{a*DJu0a*^+1NIwSKO5%Yx8{Tr9DaNes(g?_0_eTqqI`cAN7KU!egZTTU0^* zyD8gjBzg6uxg>qLLeF)nUR{%DcCurRpd3_s;d}Eu5v^!*OwV{7@swsVALBQa*|l!PZ535GK!pai zWf|-tTBz65YxL-6=jc6Zhp-s*0lVroCt%r$pxG{GpyM4U_vs8F`i@I=c4Z%A^{j{7 zLXUcn&s6UQ^d7%nzY*P%(c>}}g=zf2cBFsyz)*+ww$!pzy1NNJ9M^X}cN_0V7ht`v zk3-?rD!wX=+a@G++xQ}b>R=OeSBpxq}%&O zR)bN(GKB8Q3glo}53tV2&nUwKb_%NBh93B=ddqi#-)mxN~u%GG)UT+OfGwdK~81-UM+^%+sBQ3y*9f&g+Q4)OTALKdk zZ$Cqa1%%`%v=7pMPxW{jCYbzFINlmMcYVz$({+dnGsnGSv_HgrSB$RYQ0dS^!mi|g zlKR>IRwP#x%#>}!$a0}yQ3y@(=x#fj-eFHEmmPJmOlZz=E#p3Ckwjx*FMKf4yv1ez zr!!<05@A!515z#)Nt|Pu@xBy_VEAs>pWGk85<^Os(hT1M&AjjR;nwy8i#Pdd53UQX zULSrE#b-fMzo&bLXB1|fQHf*e^?jkOc~urwm=u^>oes2~nfsRF!?(pOK|jBp<7BfD zN8j50Vtaye{7-NpS}|KXaqy`#MW<|1C>oB+%9eijHq?W6`mHtlwq(X~rs z`oEbT-@;jtB#z=s^+C|9V~inP;9unNO~dJWJv1lAEdC(J_+~aZV3!q0zxt3$j6f#@nBk6n{zaqvi_4tRUy$<`B~VrkqSxx5j$LrZLt4;oYl+VrZ9 z9ly$poUCxgJUox`JhHxpH7@!N;{YxZS;K`V{H#flE}GrQ&-Fg`FOmQ|u`Uhy$D1@1E%`rkf`eQMTWky8fU65mK)D8pXcq#66tb?B{5?k6WciU(5PP8zjVm;XfR2J@GbZJea+wi0 zC#^Lup{S|hOpH(uP4{goO2$G&q`nm)YGQd?3@e_U9XhD|SO!%{K0oEa1LONr$<-)(c zzUkPTP2uGD_1U81X0T4$h*4vnyf;RUN>ZaVe~i<7U6xZqO^1I%`J%y)QWaH3AEqQa zYDx}Gat7U5Q8{ih8TGMXJ)xt~02*c@@H5q>;P$J-vkH@hA8F4Z)k)Ou3|j4F2Whuz zEvI*BFcFHc3R?=JsfxEOlXAtBDj5<7>u$oUtdNj9f@%(72uiXHY={QT72MMB!BV!F zfHTftK{4oBRO1ORlAr{|=HO<8xdHlC%6ybqUCVm=1N(@eM1UXVja6Ion%BJ1$@~7( z#lv^J!W7C2T&GtSSS=`0XX1cFeNbLQH zZ?YmAvc#NUH}_)-V7l1+pjG>>F5lb@*B;HzSq9oRCb3UBQQqq@Z}GH7llOam8=a#lOz4yHhBR$m zngK_U{cSKKdtOaqr-z9i2VDk9I_ty&(f^4o5m9;KQ>zgik(T5~?k~)Ag|9WEzC-Ut zT(L=6j<@Qwv6?g6+X|ZfxkH>mywStb+davJVlX7`t`NP~CxdQmecK~f($BKdkr{1{ z(UB`S8c%f@hiP*3NfMRX?kJelJU`HT%BC^idn&}h0R6#lDl=11pH8kU8B8h9q< z=<@Ud-ONFWNE2k*$qQZ2vV!AuXoOBvhBI2T_$h0jqNYu!VPDwvjyrUow&Dw(h$Ape zF;VKnS8}7zfG1Tx)P+UiE_Zl|GGV*lM_#Y5J`+ZAF`Oq~yI(d-y~*_)iw+P>ZyRBp zVS+{GBQASqyxaU~r0XQKijE^oi98!`vBy`Gizo6|UBM5!x0qj!iho=w2a+?( zdmt>*GhEn3{FTm^k<*m9X&!_#Awg6jT~ZWH4N8U%P!rQy5pItA9NSX*UUJCldP-LG zAc8OC^hhE(F}_6K{)Hehd{s|)GEO5;{>~%py6x<72VZvDi4Vta4X%lJFx4DvZ8@0M z(3`e!L~yIum;FGId22tr%gcBjvG0Z?b4#-pY=y0o%^U2HTW*4_GJ}vL_ulX#y%;lb zUob>63jK;l_#bQONh8pL{yJ~^3*r1$-S$ZFxuRg3mzg2>R;Mmk4BYE+Xqi;xeWD39 zvr=fM!~lka zZx$Sw+~#+h(*z0R;V5@^hbOp2U{=Ypq}(oZje6V2dRM$SNnjcpDF3T-G^epEd%7nq zg|z9VIy#!of|iIiI+bpZ^-FNG95e?ne^GeCgMo1$jNQ8(0DBM!f^Sinpe12FB>0gX z4ud{sLLkAPCJ=~DAK%vL<8ADagB!cI58x+8Bc_f{9X-MAkObbHppWkDk|-3iT_}V^ zJwcQT2T2E`O9)D)oC zX^YVVD-s&MIq*Kq)|CTv({L1Bty1?#>*oYNc}L*~i?a9t8jPQAB%nBkvJ*y8Ts|0t zr|u5W6vs;(Q{4k;I zO5RJrXX6R*S3fFz6`VP5uHv;B$Z%7OgC*R-5b7!e$dk;u{kYl z2}}8&@ZDzeN}AiTy_w}lR=RFEmuLjm1 zk6uu{o5EKq@Sion$56#-Z|(H06!=F8{Pj+vL&aE1M^W&7)q=kRSW9<@{>&Sm$?!Lx z=?|LInBg8A+>jQRV^eoWb5d}#e?mi4H3W`!JuR6duj@@|p())Rfn`O(9i7k1yn}OQ z2O{$O@?K!0G-H_*EA-yNuYrHz2X7P0$@$#iekh6QKaSfU=sBp>Logmz(ndec1gm^?+=v_O{OI`1q9eoJ;>`jo;@jC-L55eI%8{Tc!F)e!CfP({qmQ;2edIFw zNM>DW9CGwXDI&3-v?f2JOWOFyIG?A#2oj+8*9$kt`s-Nw!^AUuRUc!=E&Q=hns>p# z_+@3R(V~WSC?8e!X0*NpE+)(plgp*>1DxS=pj%+$c}v6+r2j1DjbKD3us{p*3z-Mz zlg)w6N6jboerQLpzwOxi8$K|q$ANCJjoQr{-413rC-uuXRQ1a^lo8VswGcTx<66--=_Y{W9^sb(=8Uk z(XlvqLE+%-L>z2L7(exQ8SSV3pRY3NSIkT5KW_VB=hFUyf%fBm7+d(H6C>dng#;8= z2}o$6C$P}ERLObxGS}r&j7HmqDI^6uf?Ha5T3bKJO5d2?AsnLhL!7e(rylk?dIE3i zl*IdmtfFw#BZ1?w2LuhnK!Y1X*lBh0vMYU~c&cPojc$O$0R*aR-I*iaDJ}O4llS5d zX;UIT&P?S0*es@YZ;dnmje*@Fr47(0_1no`6i&IF&DGenA@X%LOnYs1R{T{pZ%BL3 z7+n6WDV#Vn=9Z0tJpxI>{s{R;4$hxFB_Vs4j)g>cj+URFcpzc=KU#i{em(g)daV2$ zO_ZPIWtpjS z^YJlr@zH#rajeh5oH0Mn94xH<5t)B+%CE}@YW{7D&%cV$676N^-Y8X~KTc(c=fOWSD=vRi{!9hm(8<`M z=m<4;4Lqm4lrQjt)OHJ1ahpAy2J0=?o2`-rgTP+o*f5x1>-Z}If9Aa__42NlX;~FG z7=K3+5n$j?TOsm0Fgl-W%9@N0VAg$>MEI@-Ace~fEMqAareQU=1~)eBJc}R*%q3Q* z9m%A{+5G`?|G|vbo)mdx?{IF3IL(Z)h{e@B6)ze`=Ovd&E4p@aGu+zWoH{tMPtp*?Pf)O6|#P?X}_;Q3N3BZ@!@~URA$T^@LQV%QNx$ zswlBN!f%z(e$;$*c!1v?JZiqWngyEwdntNU82mc6BJ&?L-CcA1`AX;agWkV}`j1yY zLjA^k84c|pToM8Q75lV!+53D}`=Q!(+xIR*3DChGW)5Z9u)jS!8&>PY)B0pnt zyF~;ZQd`W^Q6GJrI6q>4HdBvXzzefB$ZM4wk`V(+H>7BdOqr%&2SC_6a4FH$g4>mJ z732kLpdG=8Jcy_VPM!=^PdJ&d12upZ3veF0>^s$Se`f48*05QvALOLJ?Mi<;eIpXd zeFj|qvtl4?O|mC;G}s@A#(!Pw$Hv6$Z2c%J{WDkkhm(WZ_lYuBr;p>!PlmqsIQU8Z z_wbXwL7^u}p~s@z;r%b82Z*(%J5Gq6l_$UtDy)BvAI5N;eDHDHWTEG!KT?xH(P{KW znn6Ou1KubkWawE2(NA`&;3riM&6lQf@K@{<|4-v54e}9~bn+2!t?nLHHOyRS5&JBXV(si$1yNuX^h!!lsxFj)dXRhh$N!3PIHv4RR^yXaQJ znJ88^=?{@+Nix;~td#@L9?K8vCn|Uq|K5Ocv_$v02Ih}1StbA`4A_=P{nzxUzj3B3 zOP*ubv%s&HH!vSj9-Ghld}JLc?|N0<^$F!2{QBjowS*uwp}Zq%ZNe0zPYNE#3CcTH zwO1d~Vr8^UMsg@SRofg?dLK?m8+sp?=(COf9B7ZeKGLVxgzEeBrBPz_dVij%zV5BZ zuTNh;&XV=hKGsjrkG^!$si&`@WtmPs{UWfayFQQO%|Lwpc%DvwQ*?VB^}dJ$Nf4P% zYbyIEIwjD)6XzeG%{K!^e(Y`Fi@fF1^#i~M3C5Rq=vpz8g0#_rU=3y7Sk4Mj?nOTW zA(fwN(o|xf)6ucG4cjw+iU5LsE>+%bBQN_a>fMg=V494FqxEg6OmO?P zGDXZg)h@F7jCB<;TJJ>N?&4s(L)xayIwthcbx+`(Bc1DeSg~XU#L&|PueGR zDD9JW3O!oBx_yQJ%k}+zw`yN>;^6*N{w5OoTk)TS{arLmsrauT^pu2s8g7Y?^hAD@ zn4j@|ocygZeszNWlr@GvN3T_{8`IOVV;neuWw>bgn4gbNI+4$%sk*%M->FZ=%-5-J z(SNJH!93vW)Mx!4s_*Nz@8Mko`1~sRIRU<>9KV0Rl1CU}&y4=Y)ztAgdr#*8d?%>C z@V`($UBO6>6B`Z|j#v3TRGu(?PEh~9X#c`%Ahl({c8jkCz{T``^mXdg+AukGsDfpLdVlUq9=p{cqWi zkGEiB;Pa#HIgX#-Xu;RcZ?xd({OmDCn^h<2^RF2@?yb=Ur0DAtjHD!?Ol4tY>h{sy zPH`{cp#;Iy2I*hc*!jB9PoKO;8t8Yzb5zuXWtIkMsX5?Sf@ltBBEDHXjWF1 zGkA)(^`n%lLM~g5yp~|VJHS4a{b>j5Q^u$B`l9d|WA362*I^oR&OKa61k!?JZqLnL zVj|XC_`=MEVm5R}N&x+)d9U+XQGe=o9E=Z%J^tbt7Xu)Pi~N~R?ZxbCwHJ%rChbK_ zq09UkCfP1?R3iA9yEx`IRM&)}+}wzh+HsqjT3pQ+*AI!QE?a`FvRG=KVXn`-w^wQ+ zX9rQqS+F)wP1-OunfPv7(`6CzIHN>fWub{oF{q9v09d2yhMLoD3S~ zo2G!CJ6z_yZu6I95%d)D$1>Sz-lj03tq>|3zzU}rnm%vVmR{4;(tLxteoh=SG#@NO zvm2D=gQYiE@SnyiIJpsp-1R6dH>8<1Of?geqmwgLoRHQJW5)2~y!VJ86zy>YtOq}% z_@)0r-d`K~3eF)er4ammB((jkf&?EQZ(KL?c{!ZVSw8(7z@TNWI6UM$fHiV6hpyDI zGO=>=5GvcI&Iv@$am!(G<&aA35pme$eEzJa&TE{{QSHF_92~`pf7a0SY>CF!DE9W^ zSBLZ2mNrhWD3`5c+VID1j7N{}b$TM-T4auDYcX3pVBg>*nnY{=S-5E)*X6SJIJVc{ zjUn6@!LHW6vz*1rO=`8zf4uj7y_4QbjWF8RgP zl7}YMKP-NVvr&O~@sa|*_4B<+xab;cDl)%Ko3ypx3idjKeRhu3y~P19)wJGmZ7zGS zV@Lf(H0>pEKP?U8jMrX>DHNy3$kA6*aJABrenLLW4q|syu^-Gy&ARwy=o9F_` zsOvSulYcQOWx=rURWFWfA%k|G7`U@-8J@f{>g19K!415$Y1zS4t#CthqI$JJeB6N~ zt*IXzM?3gqly|c_Y!YKu#Am@jz2KX80Zb8k2nYR$GMr!L2INL3`z+hVXfP&MFZ?ydIWOYO{OIwizj%CIVZXfUo6^oO> z@l0rx2AK#oX5Jc}Jg%W_wB~KYQVRs)4NMD*XF55qX*CWnE9V)pqx|vtLl~fV;vD}# z8CvZAr4yoJzrIqM=L`{RhyxWpv;g^jMKcdnD-5VrOWME}_^-byJUOjttHPHKhUZ~1 z3VKd(R~{UKcTe`j1y!;o0j6YAqPb8<6!`Xpr=@V@#L=;|iK;Vj3!sW663^0Kt42su zqq}L6P6s@QE>kopGcCk2I6lZ5auA--fu2xR0Y|Jep|PW+&HHqQjNh*td1(X^oeViPKy*@wO6r@L@8Ge?-BE@B?2PE>Fzup(e4j@&uPqB|!kp zUG|QkyC8D%J0c5e%@?w#779xiq=w+;3$810Y|-w&Oj567??7wZMI~Z|_^r^)v0{7I z&?c6CZDM)nlq0Z?eM`?#^>K0&8PwP7vTwj}mgCjTlH&?Y`3|zwe-L_58iNN)oUuqK zdWvouXEB+Q@4-zO5ixv!78r!NBuku(c6`7wj+WxFEaveIPtF58=8+a>`b+M{kJ_80 z+4Av({<@MMt?9?e3=)CC6TD{v^b>57WWpl}B0r^@1c}iH$fWmI!xEEO`(7#zm+rkM zpMK-~u7?}JX{6@u!~LPce5x(-ag4J+vgX~x_*BF$o#T@@a9zzUqK8q3)~NBKic=`X ziQm*-PGSv!7}>dl{NW`wh+4TBYIolTY(%_s&oh2&Nc2 z7Cwd#o2C|n%M(jcTtE2!EEy2l>%?nOcxWa+AB8WK=&yNg zU;+}y7|SlVX!jLDblTbsRv5uLO7dmik3Wq54?@!*11C-`g$!DS4AjB>aVdDMlA+L< zVT=QDuo3$6N|GRiVFew#p@od_oh%f^vT@^*_gqAjz5gRBS8}uW|fTY&)C;W06e5qr^7_D1H1&dBm&o9i%8oTc_(wXv^i2_k$?DcgR~{ zqP*~(f)>s5TI)e}t%I*KzG0T5pmH5E>b#{6pTY}xM2rD9AV#p_czwwSZgKY~=h``; znJtlgb2@DbKlmrU|GS_@NfqYT-Hxt;W`}ma@&gcTxqunT6M9f^hd?KBjaejRW)OwK zyoD-QEv+4ygdpk;zH0Aso8Lxc{jm#A9UXQYxa_d+>weD}&cD+ce8bs#7%RlRu5lka zTMwS)vVZ6r_nOQ8nxljA(zO*bF>~aZ_=XyWdJGI#9F!H}3ZKE1En#VMqC;qd;00e` zU_}f$j?h4&OIOLS7I|U<0 z(ma3+m1`@eLxYe6HjKhEn@e-ESPV`N9`*+JxPt3DEi2(aUf(mqY`nhpUMArQ9y7h# zE)F1yh52Y}@GB@xr%jzdN5~<62l-)u)c8UTOl!Cp{Ia8|ml{-jlT?U7)+)$q{-^XmO4(_@I=nHJ%2%Md1sVkX;`SzFtP} z)!ZU({MCeDMPa|-He`8LAI#6mkdXoH3fD;B6vks0+=^g^1Wti9Gj<|Xpj)c0%hDb} zwm6{uyv>SB_%>X-gu+sBA`pQPJ|vyNm!iMoah(3cDRydQ!QNIK=OoVVNq>YruV*5H z@HpNtJzyh1Z&;dz$G9}sonGInTC?O3n|#9r*om5+q1De?d(Ue9>`ydNIpHLN}87LM{T~ASdM0?{HeJ)Wc<`j4u{<4y$nfy#e_t+wNYEY`A$YNDk zgL+I3RaoNrM_pc4G2n2NBi?t!pN~g`W$~6XNSFah@IWO*H@ylj@2xjx*j_7L6sn&P z8Afe5mdFp!hFm3(WTZ%73BE55Y2=i;Eiy5d&}f8!M<|P&H;}j*DAjrP$nb&0$4QhK zx^J6NT4U~0Mn2-1NutQ+a^Br0QFpTB{61c68grkOTnHzt+HhQ?t!ho*JRNyV|BcD+_6??Fxs)n4m@Lw4Z|DWp zC}Xs?fDKs(SiDHbw~@{Cw{-r<-8{LIi<;PlO)f+N&65iz;XsP4K?qiiSc$`senJ|- zXgL?adK`$MtEcXujPNbFw(rzDr}5JBRw?3HsiRnMznc1+T5h^gYyLIUxtG$i#C;Rx zfGm)5|5B3iRHVdvFOGg}CIu~ywkJ60tOCgjKq6{A%Cslin6bJx=0W_}(_#w}Ao1{e zk^;nto|Rjmpy@mteT8x+BtZOh%i(@<5w}7rlT3KVOULcQyEW$tjiR{s(Gv|<vkxqOaJH^irP=@2S)^yr5%`{h&OPf!v%)+Cf!O z_$m(PdV0jGj=9INZApuB;`IEbHxJO8f_rn3uhsq;6Ee&2NyDZ6LKc%jZj$*e+LCSF z(r@pL6+fBtc-q=tqb<^9Jx;} zNqr(1wyd}OJ&b(Tj*dQ7N zUvrJyD#|(g)^U67dkHu_!O8^+K}4n)H!@5j z4&!FE+>9}9q{Aa;aU(UgBjM}QbOCk6=}uk{&S4DlMsck#(&8*6fM}h{31@mgvKVJC$%qzZ-a%wmAV0-!g6#9>y6rtEncEYuqS2oXU+f%CENjPCgY~GXrz+a6U1;A6r&1znc{K~jd06fHvV(5`c zfS@belaSZ+PWi2>T3`PKyP{8kEsz?&e}H@OmUN9#qKv|b%eYY$UuN8>iboqas^T-a zkrodKh2PTKsfKGb6O`-yXL!F{NL`X&$&BgHvf`)FhsYOCu7Erger3I-%XhN&z}@Z8 z$demso}nr*WI4$-z@HEce(W=uP`l~v8`r{R!t8nAlo`->c%xF&zslN^AOcSMH00(jk7rE%OugeiPfURR@gKa6?c6VvF6DegN(y8~z^*re| z-^_fEqiylcp_y5ZnIo4LL_g#W;!&zdvaB^x447FMT5fAwK3P?mu}| zBF=IWnc_E5RYOmI;Avy+Cuu1_Ja{X@SYP6xLp)h={y$036CVE-*hCYs3Nr2=e|^p< zZm#&#ZJgm9KaQLJ@i+6gDEL|b`0sNOnND5O&1!v~8Pqj#b|9rO7!zVv_7Ua<$ zd4HWihkI6LFEyzON$MV)UzCv-xmws&kR#{GkgKXKOVTM;rU-ur*gExd{c@Rv`~Na9#dGhj?G)YEB3|ZL ztkAthvXqhVtsehnnw`Khn!PCZHqAaOw??!7EO!~%HT$DVqSEZY%U!MRpH{+{X4mKL zLCau?j2K>?yOVq#%qKz&APTp7!bQ0@b}VS2iDjHcFeeXSY>RA>mtF!~S$DCp$=2<% zt)6>d5?I$oF5{s=FN4wn7+K>fvQ=U;|p^=~pw_|(B&6#M=o+SkD0i!-kE^&@gKkV1W5YA~f zgr-ZRJQ}*?7Qxcu+(kS{$-Gc9eS2egR=Qb;3`5B=t>TR~*e;6zv%P}@c^xnL;Z+hv&eDT513gjXqUKE6 ziq0{(q5d2fuM>9cF7wslqI7d-rYcukdzmc7#V72+z&7V{SOv0_Q_&Yp>_-`<6QQLxeZUIM8PFZ1GroeVxKnSuTg60($f!Bf=;monq&Fe*E zX_S6pbA|QXWzOJ!^9FexA7QMqT;?6xn*F%=3OAw)QRO?Eo&D1tuLfQRQzP-}v3QD; zgDw*Hm^FTyeK%kN@-4*H+TgOk=Q3}{<1onZ?NtsN)~uuXJ0^!4bByBffkd3xu}fNt zCYIvmx6w*hH&}AbAxo~>rq)*6#e|^7X4K07iObJmbtEHx#W04LtUGKTlntwCh#-*3 z|80DC46%?4(TOl_s9>^<{>dUyS_WBOdT#Fb~NG!UdFnav(;t3WuIL$q*8pG9^Jx=>RxA{$#mh285Cg~HWeTUmD`yBX{HgDF} z&R{XRW}6xG%)ln(N^Q-T=3bOfnHb5e+2#r!!rwiN5WU5k?cr6IE4+M`<7~d>aAA1W z=z-fKlf$dd8@TNYuOjX&U83@0RaKNbTWdNK&Oq5Ch1@vo9UcL8zyXmWM&{xJ$^5bt zU-V?Kd6IQqOmL(T7l$|I5&Kiw0E?|4$Lw%_Jw$qqrVJNlQrQ0#N0`p!wo1~iJXdwsAT^Q(SYyR#GuR1xNctlTplf>+JBKiZ#*%4lKN<58l%Y-&) z$^knrS}al7a$E$w^JvTWLo%Yey-hgbY!`p>6rFHP`2wZ@A+6bHTgLJAivP50l7wN{ zn5x2y8x9A%Xzaz>S{%gjN3;$%B+Cee(-W3qyBS8<;j(XcnRlx}=rnJj2xqc%{g(_b zp`c*93u>{yH97qBMFOxHSL9ybVJDW91QmR?bvNPAUM*<8ER>%My|7tA#f9#o(;+TgfyUw|9t zVl%BP#$&#A|5YrXg;o|t#uBqbt|ml&{k%vM!XraJQ|gNZb!mnabMH$s7bVR5G5!M6 zL1wPMLD(V22iQb)!sTX!{Z?~ln(z8yQ6g^DFFkQr+`{jXY^e4h&3N zekEd~AxHhs@WG}Y4{YHg9vA|6$%<#IfSHr3ztTK%R>r zl2_z&u>#hGeZaXoY*{8H$(1xZu3srokXPgut%%}2{noZHUjik(AByBQgz*mo*0bObeL_jd6K-!it1r|1E|B@+?b-0@43Y%yB z(i~oOX2LDL$>WotJWlq)G=#t}BAo&<6NHLI^bz)v{JB*` zQ`j)wCcG&R@GQhwbeZXEH@YZ0f?$5Gn=tYA0|ax(bD5!sz0%=klKRZ=yUktlA`>Ev z|5eb_&Ah>Er)D+`4AkU5EB9~+Sw&5lu^GVGOx!VjBHS`C5lZU7^mwX)Nl8V1C>8nP zB9R~97)%TvY;v{bZ?Lve)1x!^kHi@gdGG&~`LSsy14_-0!i#H+*vf@Wfs-~8jx?Oz z1Pd`SM8!}d8eWLJ^YozeS*+q#Y-Avc9t&L=$`F>=oS#5lwg-C|7TQ@X++o=K@X>#`toxjO$md^FBC_@H+jxUQoA_w{d zD2kRtaS2JcljItlYX(Vo49+#_`62^`(E|WTDto(F1xplzbN@=CQ9dl=FKbf{h>_(z zG@K3V&5<`Gmt$ApQ<5a;(-#CEkoC8oPp#m)#p!+Iw`6pa@e|TSJNhyidBGceFH-yi zK%fs2!b?f~q~LV67gn8uY?RnPGf9v}h{8YxbJg+7+1yQZGHdM{C6@h#FR*dWLBGwU z6Qlmyty&)I?wfdYV@d_(?$c(kFV`;GzE8WRL%R>97AZGvCC64?KKB=hyZf|TwsAc^ zggne!C;yNF%e6eZGq0^&oAnRg-oN1DeJszp-9yx}>ptXW^md*f+NZVka@;qsos8=# zND?`Ra{WtG(xT;U2RRp>bB03ZxhJtCVd4KSfPbLn{hc4+y|H7zcFW6r-_Y`Q@|5q5 zL!YF(K?O~m{W14%(5x+7w?$28Aopp*E7|xXzK*CSu$3VM5d_cLm?y*xh};9&(;hN0 zRWWBuCWHerWvNVAWQumjt3$W@rK zaMT%@K8$$-8!yNik;kYNovJ@WB0LZ$@8kL@9yIao>*+oEHNt787PN=~o-1{He=*}8 zu@AX7Q)$!C!Ury=)p_~=jqiU*1E>Ub{+>wJAE~+F0(0P{#8RlQ^G}hdflBC6@q{Dr zglmIOC-?*Z7N;7$RI z_yj>F7F4L?yI2r_rV&yg>R8Ger^?Dx?-dJT`mY_U^mo>TGc{-g!{c{er4;2Y@?xa- z_kbWEwMVo+oB$fxjftR`)$0OHRxXeGshD3fx9ppjnAGnCQ(j$_J@z#fdy8ydo>x@O zHC;Zp%s=P$%4**ob#vyIEK0baQ&(|!nSNhVSuwY2ep!{@ba`!A9WT`ROZ;`F8KV|g z@aL{`^jd85O6qJ?)wY_F$}+#d%w+u9DymA$7TKx;ep_|9t+u3UZkef$cLG(lWxndU zRn$^yQ()TWSC^IzPOmLlsHav`EdYwrSm8DW+~T@AQ{6e21Ce_3+NqPBCjQJemDJ7+ z2)wrWfjYnK_A*Hb$3A0J#f-%j6{aGZP*hRDU+=_mmzriQE-f|r ztE+AEORDa&m6rHRY!p*lQC4TP@i>i{vAE8(c*cxTrWxhslsH2Q zX>rBnzRI$a+Bv=w-#i1oIyS4y7S8ci2S9RdS)i`0)aVuNN-F7}68}I_d2QLijnR3k zyi(I$=PZ_rOt%Nh%gbtQ)eFjMYXeoL+iR=uD67&NROhG2`6eI8_St;ZRpk|P1GOdo zis~vGnX79}Mpw-*n_pdfm#ISVs{^Bxgq|=!6J?8P%6vd4U0hjFRc5Qc{W~O>N~-93 zf7x8XsHn5mg8z!zvQpDzJ`@Vw`Kl|cYeDSQraA?4xgcxQ;_?d9)z!ATfN!4754qIU zRM$~vO_>fO7!)MmZCY4cT{YKM6_|g!w6ok+34z7>O3DKXb$R7{V!v`NAMO`d%rI32 zDl22;q&jGExk=$Juapm6RR=6HM#(>35CCTY9ciVeIYO?Co{M~@8B$Y)os1@hJln!~ z;JL)-E32y`hpoJ#vMdpW`Y2Q6US}(5-LnR*ycEt_BC zze{1GynKe~_L5TD9c8suWtIAP(?_Z5%#zaTs>-`eGo&BYSY#B)_56~$J51lHDVtka zar+#IuMV;@x!hAYTRLmb%vskuXSt`|Xqw_Jn&rOM?J{|;n=)m(^XfS>t}eRKbS(!) zr+8n(n*(!D>E)Fb@$|VB<%6zcdFGWZ zil@tUEL|ENf1qw+Py7|-<#Q_UUKoE$3sqVSoY;Nrg_;uI9e`LDf1$=#ns7Z(e~oXT ze%NI^k6gzJtD9Rfr?#>z{;V!gHR#?yw`9=$qTA=k^U8IsoVzP(;^}f7OP^m-Ge_q* zCSR?OX-AE2nkK9*P-iNG8TtH7FiZuN@FIUKrK-B3uFND{1C}_qwxqN|W*PY{sT{ap zSXN3WmRIwrlxCSKN=-HXT4sv6lJc@ST-Hg2H5H4>Dor(k*oEBA(MMv804|AL018}v zQT$eCG$plCyRW+DE}BtYV}i2*v1wjKoxd93=9^?pLRx;vr>3M%=D2ED+#L0Gd3Ei4 zsa+-w)185mD!WS5Wz=mLXKamL8DNmKT`K~Cf~g3nmNq0GE~$x^Zq<( zthy;Jsf8IB*N}4=*kV3a&*ldz{S`GZ1a(*EV}h#EuS=Lv^~AvKG@W@t-H|*8_yU#H zgP#sclm@HZOiJo^5f^hy0qJeoOwKeo7d)#;bUB&OfgR9D_L7wikw%|Tr8BfY@S)vfCKgiGW7l3Jgh$lzsI z=+^*WTdH4{RaREiK=XPT2o{wUAW_{_RNY}J7OHis>BHpJXBn4}ym386#(;5MSY6AD zWgxqv#$R1)^OwN;ln|y*Ad1?Ko+Wj0%5uAY)V^jp`pYjFg;W ztD9FHs4NxfZ!Tm28Qc8xkV(d>jK|GqP%+X*xh;RJ<5F_Q#hirV%4@6V+s4`a)wXe$ zOfc#_UcQ>@g}P|sUs!Eq8<0%L#b@Z4WU7RivZ}dE-j@vIi%GD@&1H%U*>Tw*mS3N% z7gmTU0N1jeUwpp6U`UII`Uwp>9)1uRbg7_hkq>FpR$W_x$Wu~ji0X>CC~xQX!~I=+ zO&k_V{60)t3*QdDjr$Mx`}vmgoyFJ1H=pk-`*=rvx@1Mpr|U}n*V>~0T8v*)fpKsA z?!0n_NMs`81*-0-s$N*d!opZ7Al%7E2`@Sl6d#nu!4y*+Px({F^BW5bCl+%p_p%Zg zH}P7o?v~3MM8mo{<&0P*E0{!LuL{(d5TI0va=}w$9J&mFLV@T<-V?-$Tn8sd77?+y zu7V!WU)39;_XET`9~K1+$lm_DYRYUzYp|(-!SWaY5TYymOotVB>oR(I300ID#h7N* z1}M24(nc)P!L6lYk;v>w(*vy9PSMZAfy0qpRtM5}Uqu99SzH z2kwh(GvoZ?_A>uMCNRc0GmtHxeZ)BE$G)kH#$VkJb@OPM%povTI>zV@edzG^*zQsT^>|P8 z1wm|~sMhYrl0a{fv4VuGgqAB|Fl9^|)q%P5Apf#EWL;XSle94orkB*PNHeMB6ALI4 z3td)jCVkOmx;!?q`U17AI_3kUX@N1@`@L*xb*S?!D`0kGMSPjLq?8ogRKZ{t8a}r!!&Kxn6_qGDE8_1rFVX)_HWe$S zNr|a&`i;}zinkZml6A7lGxK_puw%$!0bf@#AE{Gc)QVL2MeULPr}@6b_YJ-u@onTA zgOS<6;OjjGU(YVkpV^Gxtb&{iU9%32N|*bczp8mx^4Wer^#dcn)yOxtkaRwPI{33J z@m3_^<01TL8A$TQ@S6C3;A(8EBmMT~BmFCbNBZC9_jJr&*We|@-}sct zoRn-yNlmk+XAK{5QufKGoSO3u+o-e8$vyYH^YiRu$6fNx{6}lPA+u)ZuNis z@>j*zTsw2tlgsY?Zo_RQxBE(ezw!qU{BYHpz@v{DMg8u{Mx&^v-}{ZC*8JfqRn+)+ zQSNwA*Tst}Q$;=aH9*RUm2+Agq|wKKB$)Wh)@2N|?z9+414aE#wa&lh>lM{_EL5{b z$6EKKD(b00Ma2+xYEBGM=jZ8&8h|R^z+-Wq0M(=MqT)C|f6dW2KVDHWoDbmYck!ao zMH!Uv*wIi8bl<;1dz=zZZHgCVP{Q#VI6w&oQN15aiV(c-y^Dl2L20DAAjj( z6C8@v-BYG|yo%JXyZ(mRHwq+)pRc5=d?_j;UesyvqDChcBiCQ6s3Gy9PLCIL!M|UW zHf(67UesAf(zo9CK_@3d$sNN=8ab3O{M7sj2)7NwHYu$C9G|Smar{p2eD~ za#~YTCDEFalA2^n;k8sY;xhP{&88vg>FNArTCG-ovMd(%F$R4s=|hK~eA=03pLfB< z-@I&6fhm2&>E~XAhlP_bC>WH_xY4ZEWKB!9YWl~jS+!)oB&KF)T87+ZWLVQPQsqHv zs@%svTw0UWA1A7uOhF4B$tRpE*?HU>+xC39$faI>7j=n zdK>_jJ^0|V?CfmbdFUa2o>(mn0z4B5%LdPDXY#j?zQF1ty$yB%PTL9oZ6+W zxbtU@C!Xl)y6L7@zBy^q6W2ZT&`poMR=4q_qD%fU@u7-I>&kz8TWW36N0x%CZRcOQ zsq%*#96$42`oj%BtG_qr)2>%u(Oe79-kl8nSvUfaY)ZnEmH*~sQ!+oY&z+>w(s-IA zUvmoSNy&1TX5}hLwwKe=%)Bq}rliOdwy*IpxQu=EWz79c3w4dHS{RA=85cuLlc!!g zaol+Q=Th}^Nj`5UEF(`m}`^iZWmw}pPT}9v9ntLHBu9QrnmpCeeA~n*f?TSc;~En5r!{`B9^d*erMShwB1t#jM0 zZ@%{Cm2dswt+ThU+Me?E!nY%D-?-!D9h2Vq{X1vWk&5U$ z(W1}(`q{;ut2;;RYS{I~uJX^{`rNzw`P~=nd1TM9u4P?&yL@}!*z4Z+%)Y$+KiNOz zi^X5;{$kFTTfUrp;7Zds z*!N`Lnf)ul*PW(+nr4|dm@i9uJn6LLQ1X%FD$DzpYf{=$@>3s6JvFU4?O@s+)_+*9 zPJc0dY{oA$P8!lQsV$hMrV^ z(w>t_vbSctPX6=B=biHKDe0%)bLy^BZ_RlB?fUo$*+_<^jASwGF1pLJ!{@T`xtwOX@wvv#4@KWyu;M~5vK<{5VSu+N9S zIP`&`r9&?rY90Dc=98IAGq26e%{(w<(~zGInLp&pAtQ!-l(9A=m~nH)g&FF zrl9F&ldP!!-v8_VMg3RxkL=&m*V^~PzVf~aeHnf49$9nb-Xk-QoOh(>@aDsh9Iig> zJbcpOPYykM==+CmJ#_IQ^Px9-f8D#N_p07AdiNY`J-F&%`N0VXha7yjXHCz&J+pew z>*?u!x%-js>TYLucK0U-o;?scaO;7K4S!ciq)Bt?P`g zu03sgR_!U@>4XO7Q?eD+@Sspxm3v!cmEKF@e7qc!8V84qSG&8Wzj znQ=wN`5D7A4yAvb{(Aaz>Ay-3r!Pz|NuQQJKK(4_{{7Z>t?kx7Sbt(|v{qSXTPIt` zSWmHU5k@mN=$I~82Tbx#&R-AS@JvA(?C-uYBS5nueu1@`asz3GHsh-qJQb#gT zcctt|c`4=hDG#T7H>EP=`jmncd&)^EM=YOOwpjjRdCYRZQd~xzOnCU-HdMl|l>9NSc{+Mbi06!;=n~KQ_N^ ze%Aa;^K$b7^KIs<%=zXs%~tb1(?9U5@s#N&rbbhhX|`#yX^aWOCR1nsw*D9Uf7AcN z{w4i$`>*Mr*ne)n)_<_?pM9_PJ=6CeeWAWU-<&>g-z9w``%?S5j_f${(vjaEdHBe8 zk5nGH{z$=*(MPh6^c{{I-g@|j!@oYf^6=eo^z%c_ zhiVVqa%jq-v4>7OWI43EcYAMZ?{9k_>|NSh(L1yEir({khxZ;j`0>Hl4?cJBR|mrf z7alA*IPKv0gJ&H~Ke)f=-JbTIKlJ>xr>Up9=f`KdW}qLGc!x8MG;X^(NNK-);k(17Nr%{mS$FJR8~}0TiG`&D@rXZt1Ydptfdr~Oz4u$}u9>?&+tqIO zt-HV9-Scw(vORqfg z_>r&u#uy^Ujt#EWcR#v{>50)8eX@t6Cm!Ijq%7t!i6k#=jjO z-Fiyvk6X8HGr!HYHeK5mwB6bEl7xp6{!SRw?x}X=?MAeJrM<8H#18Lvh)JBD_-SI> zjte?|*Re;Zdphmv)VK3;dWmbT&sa}e)4Tkyi_&#c*Y#cFy3Ok5?$*A0e)sRYU(n;e z9(#K9>$$RLY0tqIJa<9m1!I!dCh0HCzVQ7EoA;XCYfG<=7u|kQ$wj?-FYc`K64A-gaNFzD>(`MSVeiMqQ;osy?JHQSVjnRP)vO>Kt{3 z>QE=EB{!-f1KL0NNFa96= z-}txsKlOj;-{618|Av2!|3ymVNq?dLVgCbur~fYh?fyLf&FJDO{_Fh{{A2y;{$c)P z{~-Srw8K9B3;bRE9sLRZR{l7DwBO+O`_B5#_)hqa_zw8?`*!W{C?>XO7zQ=rz_?DvC3w#TG3uwW!d{ccl_$Ks?3Nf62Sr z`?U9Q?{e>h-uu0Gdlz|c@y_+;c&B-9^k#XlLn{pT4)I>&z0%vydx`f#Z+CBJZ+mZR zZ*y;qH^QrU>*^}&%Il8R9jg1YZcp9Lx}T`EU)OzJx4G_vy7%hds(Y>O<+|tVim+o= zpidUp-BWi5HG5v&?7Hc7H`Pt5%d8tyH==H6-L-XB)m@IJ=~dUG&RW-@u1%e#&Qupk zpXIHssy$U(R(rViuiCw}zt#R+t0;%m@6>nIr_{SB&7tZ=szt5z|L*_H|0-oM-=FEf z(%;!{^dIs4;9Ku|#&?fz8u@gwuND2`AKov#YrQK-`@|m$h%y7S`TYJGu7S+U~V6^p`u(axa`+a(4FF(Pu9^n{d`&^LNd*nzw2m zuUS-cL(Slt3uIbWHtH)ONukKK-qaXdQs<`UOs=KNjRYR+KRW+}w zM5}#Pxu)`=%K4RL56fRDUtFG3KDzv}@`Q39`e@t9w@yBOa^cDBlY>uQa5DDfsS`U-Y(DYQiKQoQ zK9O;v|A`JKloJP!e|x<6_>;%)Jbu&hl;gdQH$Prcw!7@JvNdH7mCY-=uI$RPPGyF& z(qrErTYs$R*xkpb9vgP7&#{)rs*mnH`uWk!pvD=9f+?y{5EVX|vK3hkrS|>G1Q17az_!JnC@Y!wH9d zhyFVB^`Ui#9zV43Q1+qZLp=}09y)b!=fRH;x(+Tqc=N%GgG_U>sO3z~r zEF_1{sdMSvIuAo4tKP16U_-g|ZoNmZ7_0`n!C`P3Tv%BigJQHA?M8>uX>=LgMvqa6 zu+p15BAgMf2zP`hLW#6usW~E@*Z}TGPoxrMjj~5Mu;pA)?kG=`5^asPM?0dO(Jrh# zPqfm^+RWa}(ahP*)y&<@(@cr6#@J&VG0qrQj622?qnNBFyUAg4np`Hg$zxJtt+Do4 zN31i}73+@m#42&tID4EU&Kc*5bH{n&6tmTAH#^Kuv&-x@d(296Yjb;ZM{{R$S95oB zPjkg$wb(5Vi__w=xGf%w(!$!p-onws*}~PrjowyTT3gy%I$Angx>~whdRi*2tgY;= z9Ic$KT&>)#Jgt;?YrH+)5$}w5#k=D@@k(oJYkO-)YiDa$YjGk+k4t89jqPf9UL8;9b6sU9XuVBL~Eiw(UIs(bS1hIJ&8(3Ye#!W zM@MHzS4Ve8Pe-MbwUfP*qm#3ftCPEvr<2mz+S%UO(b?JA)!E(I(^*l<(D|RM>(r;! z`_;MXM0K#*M@>)->Txvn7XRD+XZ(x(^Zb+iDgI0R?a%}#v4FnBI)2vofG^K?y>F<` z=Ih{#^qunVK_9-04t&tNz?xS1|R@bSnSzSf# z{@QP9H`KmZ`!KrUCM@a8Ypu1W+RC$@v)`S4|LjX=A31wFR#5ucE6#Q~8+*38=C7LX zYd)xXxn>1gVp`3pngKQ4YRolftN*V4q58w>HPw$+-%&lidJJ|@kLu>twN(eJN~%7t zdbO$$eKE6YY}LT3o>eWXyp@L;BW|vIt@3d!hgp^5DzC0gs%%y1t0=AbrQ*|y*DIc= zxTj)vMP|jd6&F^-SEy%>p8566XJ_6x^W+)lnVZjyKVv_0(U~@96g0@r)1RMSclxQ* z_npo?JrRq&_vyB$^{0=Y+I8xSQ*WIrI<@%Jyi-}HhMcy2OKU=<} ze17@l@}cFn^7iEs*z_`V$GbrAj@f{;BSy7jUZ^ z)i+g_`lR|Wz5H$T@HeTM>Tva1wV!&S+DUDtHdFonGxXzs(1&mHf8u}7|C;}K|Kt7# z{RRF7{#pKPdg@gFK>wxwp8gJgi$B6&=PUOeq{jS6o%x7bvxYw8QQs2Z9lm+=B$Irj zeM9JR`_S7a_~LweU$ytR_b=~n-tFGcy&ur4zT|z%`-t~G#_czI9p3TYkzTv^a&Iqs z&ersrYF$O$k-GhLJLJaD z9;)3_`%~>#wI4Gl@M`UI^h^)b-dQ^zOL21TnA()uD{C*ImugpQt~J!2J$vHp-)DC* zgRtf7rn7IIefjLu*yi_Ro#&pNdUhgpGx==)v%RUGZ5aD0XRB(C)p%-tt@*abU9+*~ zjhYv0R@FRQb8k(4&Fq>R85It%xu)i_nxvXeHLYr*YkbwGt4pi@sQ$V7YkIo(s$Z*K zUHw?~(&~ch1=TaFug9WKtsYoyqc*p%wp2$@qfcVv{$BNC)z+#HtKP0!Q}s;M%Bsax zi>l^TO{>bP8dWv8YCu(=s;*USt6~{xR#%o){#m)Ra(m_HmG4)+S?Q{Ls`8OaXXR~` zb1EH`<10s0UR%iwn9^KnqjXfdGakB3xr%Yoa3zEB(M`%sWv+6YQlKnW9#I}wo>5*> z)++BP?<=1wUn<*`9m*c%FXf1GN~uv)B}!-3wbpgib=O^_>#Mtp7sS$Z8M=wO8+9{v zb9MQ;yL5|n59=P&Jww0pn(l4g`?^nbTXoxYzvzC~{iQpiE7w))R9&P#PTyLesPCrl zrSGf1lAb3`KSn=6f1`eeK39LM{x1Ff`iJz7>5KF)>R)4Izfr$gzg7R8{%8H~`akuh z`jh%|+IvBbcdKoS?44}UnW*BXlV7P%ffn39_hC8wFA2Jjgo;JK__@Ch| z!v@1Cs9JCk<810!0{OjjfnX=xV&sc&TxK@mgc5akO!~G21xZc(d^q zMyU50moZX(+V}z^*0+os7`c97{FV{yF8aa4#uLUWqt9q$!o5{Q`-m=#aBUG+L|hY* z8Zjy&Ga@@;TEv`)TO#hDr+hHt(TJxao{xAnVqL`gh>w_g`X-_zVpqieh(i%47=L&p z43Q>gJK9BdiA;*TB=U;LYa)k6rblK*ULQF%a!%xe$VHL&Mm`w1GV;mD=Ofodz8Seb z@}tPlBezACME(}JFY-|2@yLouFJqXPs1{M}=z%YYx+JQ9)YVZbQHs)28Oa>jQ_5!L zPfD?mZk%qB?s?r7U8&Bj@28){*m{lrTXMFw;VSz5rG_^RKaoF)#$@9x;|k+@q}FHb z7LgV)FJe{1hs4e8qQ%n7_4^>x(osFu+KqHl;^9Q}Iq578CT z?V4TNY&viXMQyPK=cyIV$B z@+?nUKBixfY;h5@RSR3JZt+En!!6=k_HCKf@}8EjwEU*!iI(xLu55Kvs|Q-W(W<0X zWvdSK=QHD%$G;o@Tf8^EYwKami9OzWQ|o=L4Q(!LGrCQFn`hd5*5+WFn6|dIKc{_R`;G1QwAXd$ z*&)5df(}o2*xcc-4pE7H60b{Kl=wp8mc%28=8pY3PVRVb$5%Uk+p)Z3>rMkZP3g3> z)4EPSb*k=^*m-d0oX#scukXC8v%hmU>u~FQ>niI<*8SFqF1@;Bbh*9Db6q~~a;Qse z*Gs!j>{`(E<*wVh9`D+!+kkF2c3a%-^=?0Qt6+3^ZTA`7AMRes_ zD6OagS1O~h0dG~7(#qEvn^?bDssMd%as z7wNCjkJV4tFVsJxe?k8)?eI7KQN2&!!qAUMC*v8h(Qr!BBn;%7O^biIp&5wkN7pBG@>rTOs(%1 zIgGkKFY>;~Rgtezx4)14lNucr)jp~Z*5q}}INcew0*i8e)K^ivqsp)&0cM`so8hU_BA`z%ox)) zrdP~0F=Jz<$1IF_IOh47;+U<>jvbBh#aK+;O#MwGOgEVFOp8rVnO-+-HvLH5tfF=% z#$FOTICgyO?AU_XM`K@(-59$qc2DfdSbbdUxTLs&aiim=#O22=i+e8a?YPh5cElZy ztBo_8yO{f#hnXjv=VF_#GQVd2$oxI_=^1lm^LEUi+M8e3d}i}InlEquV)OOPCG2iq zMvZQ1>0!Cjl5V-la*O2wOOfSG%cqu~Ee9<%7E_B(EiP@5(ju$H%`NU}@mPyBEk0=R zZHs*^PPH($Y}>L|%d1;vw4By*VatbGKHsvq<(8H^TOMiYYiVhva6Dy;TG)Gv`NT(K zn?2KR>)fbEE9T@~{_3A=llR^pxnPfOv-RhqUY1`^KJ>u53p#InKl0TBpS^h5j!mU6e-pK+ z-&wwmxVG6-2}R~VKaQJoZ=b8@Mn9c9{V`qkv_lnRZ@zizl-$H!wiyqMR;Hdl{$ynC zU9ajod|nZK|HQ4$E5F)ZJR{@C2Q80o`t*^4WgmL?cl=}O@IJq{K2z|^@)_wn>awQ1 zH|mG68?VY&Hox+h?c*KEukIi5+mpMlp1bv@HFXs`f0=V+_7LyxdHqtC&3db3ljHYW z`xsLWb~IdeQ+muB-xS3CF=#3}h15{?V(ykYHcU$?z_{iOTiHe5U~`;!me%KgY~UA*b|`|Ce@HukUg4bT4k zZvK_Sem(lm!k?dS-E)s|ahtujwlq!qd&$7*tFDpROG8=?86pU0LiXeP!p)d!G2|rLAA=8Zhqk{xPR!ef-m`iJSlT zN94w9NA`a&?e~k~cBOZSd8cZGp}*r!WAc`hj{W2J&suwO<-AMp_;hya^7T``YrlBr zX4lX2d-VS+XWWwuW49ZInLhrojlSz8JtM|{I`E?}lT4qy_xR)u7a8ZQ&wfq)?Tbr) zEZO+T3%h%Fe0$&Z#a~Q+uIK4#WvgGAb6d<4bM>!BHd}pdfAg^iW<}l7YN8Tx|A^0? zjK6c!UvFRZ?p*^qydV4A%AX&P`}Eg?ADrA<&}IJ~(~h5iSvvTy9j9v6|B*9q@$a3# zZ}aJW*Z2Ie>d%G6^A`^LAmPyD=w*3xnycRqjGUQm(zQ@unDOZBx2M+pqTW1Z=#RN= z7X20DI`MPdZ<&jYqrX^hxN=I*S+7;Mag>Z2HhcJy?o%V zE3SKc^Xp%}@bSKTe|&G)5p|<2@$@I3Jp9E+-`bv7f8GCH+0Z?rf5}HrME>^ug%kH> zel}}&w~Ozbxqj1#DO>d&a&B04(fnRld}`Y8(#qH^9ri~|UU5?2hvt7RCvOdI7@{~i z6}z4Ln>erLRKoXq$-Qp_8c8-lN4 zX?t!P_Uu{b&dAT1KRp;j4LtV1UAf)Jg@Ka=VGVhUQbQ{!Yshv^ad!q$VbPd3Xjwj1 zloo;nARow<07PCPfa?UUiqb*Qt|%7?Is@S_!JkhLEah&j{xNP z5q^8)+vMrwQW1`by)z4-Er`zk%AU)*Cl;corHuXgy{ullz5 z)n~z;+$V4KtCx!8z~SSRba|yw{tRYE-@tSwW8kHneL4HFl@20{UD2|Jo~2~*SKgh3 z9408PP{~TNIB-r;rUXT@aFV@(0@yFwjzO+9%uMkPZr-qKHaW}>?9J7ra-^00~I_BXK-}ZWA&e8VIPX7I>kM69E zT$=h-&;QLl)aI!PJNv(XdzE?R=pQbAd)|poFWk8AnosZX>+Vbbyvs{d{%rBs*q<(a zcfqM<4-Nn3!q;aXY4^;e-B*5i$JvMnhJM-O)fop{KRN!_%QxOu8Mk88_kG@)d%WZG zH~ew+CwKb{i-&CK_R6%sTRm~zFPE*q^^EC}k>6eP=FP`CJa_$`fgj&h7xmz3&@G6Rw|d z{WMN)$4S$cHr`ME1R8VT@1_0IwWck4K$a?Q0Rjp$-H1OMXous>cft6YQ0Fi0859MYBi1}Il3{gum= ze#|QMRW4O*$|dZ#=)B|&M+ z+*E5NUTMXzB|WZ%*($RVr^G5IC5E0dn)$0pei3L%_J9R-9_?IZ$xf}~SF4^?Ygpr~ zQY%#^bJf$Vc9yFr)f4=Vv+j9JJ*pm2OIiOsq#jfcsDHB#`X@h+x?kPLis)W-kNUg1 zTiwMx`A+rSFZ)^+DE$ zA5oX9E7@1|IB|Q5cs@g%pC|q>T`1KOLFiV za&tR5TS6}XLXQ7N?(d-__E9E(Q9_3(t0R=#aZ2$NH{e zsrjR61LJ5B6KETgXeT$&W~R`7c*UC*HHWq}mzK7GR(BiiZxOArfR^c0?ql}!0p&q< z8$GNnS5_*8%%rYTo>ZP@rsX;1dF2JgrM#@HQU1r=>g&pz%3I8^zRQk;4a~D{Qa)l< z?i1!?K3BFd=lZp>P5G9Y*B_J;>dsormbNXeTYeq1HZHAPehFGzm)0)7)>@knw0ddx((|Sa zbb)9C`LP*^vJYql(F>v(L^sHf9ieE5aQjDIX7Ou3pQbSaIzzOE=nc^v@~hVLhiDM_ zRcLxdG>QC9Y5GJoN z?IZd}etR@6Bzj1GyEJVi`sg+P>;5-cr7LDFW&`_`KJBu#vWw|Q z|4*#f>|{OfcmG~?VEoBGjD!Be{-gdf{|SFNdowEi)&8^oI=|nquwTQdMuusXdYux| zDE0azq)kG)q+XMR^hmuH3F(lK2C3H{A?;DGJ3^YHUT=i7Mo4GWYmAV-sMi)DT@lh0 z^?D+tCF*rVNJE75L%ntg>4tjE5Yh`Ftx&HMLK>l7AB40)y)Fo8f{-4l*8(9OP_F?( z?LXA|18sjdJKDthXAxf0chU5SEQr%K0y>YyY1$G?%t5`!;xFy7E4r@-y6*yd;9j)m zKD2KeExs>0;Bqv=0Qzo8>D8JROh&(?XnK&*6q+y{T{uS5h1UhOVHP&S_1F$Kq7fZv z#A(=EvyFPnnANT=_!Tir)MRz4?u% zIlphvojWw`xl7s2D%M`*4`sjNVg2K8f%@fv*=o|zcik;ur|5`T{~R|T_USuo!M2< zMc0khu^ze$bV<4kStaYOyI6OL&c+P;W$aMwue(AwfOWHhx~p~9=&scz>jvwFF!!FS z8>So19>$TnQM%ErsEuWPCQ~)a^fyWy}xkxe{+k%kBoEW6hGnq^7-nEyiR*D zFCF8g9ih=VAG)}8M(7>IM(>K>IpdawH`|@eWx4GE-%0j`x5&p>=FL{}`QQPhu7hFV z61IK*NW}A|c~uwJj+?#eHZUXCt9rmZumUUwEqqR~1ndr$g9AWiF8}5gw15uK3g&|@ zun6>kn}na|Rd<07um*I4@q8iMG2g4&z!ESMwB6!Wor1S|)it0eAAg|bcCQ-C*PshQ zn|u{|kyp(HEqCwtngYk(x543^BU^?glbHMTyUUi+^uk@-1%d1ubKr~pCw;G z&TC;ilV$l`GZa{TkhW`e7OhL$o)H{7j%JTpq)>> zS-O$mU_a2#=hU*~9xRZ1z8~k3dvGi00r$%NdeYIIc=D;q6wtNNtLA}LK5DlL^njbd zJU&XfSMVd^*Ms~42Y`-`iJ#nqPSClT_^TwVuSGfAC7eaz;tQ68g`o2w&jSm=9iVcE`~!;*rJTS#umrRn z<2ihO#0gqKYZ>ta?O-mb9OpTp3)}!^oIoGRJy-+U%4x@ZsJyU}d;^QmQr=8XxWVqA zqn3OI^SnG??tP?F?!gkU7%T@BKmIPm9qbJj>wIb+Xy;$stOcFmHc&D6)G~1g6M4zX z#&%pgm;q*kd0-w`0v3WEa1E$L@E^NCH@FKdjKcrr$nh_Sb3i4=r>+JwOt^!2UPo(X)*e394Z6X-U~y06L8TYz z97uXVhoFu0fQ9{u_aL5kCC?GOif};tAj%Ugv6G&w2`8EKfO&(77nm`WciBMeF!G-j zCF^j?33P%5pfZB;1>N8pxgSkFff-Zre=Txg2ADB}c!0K9qz`n1UNA3*^05;x{}C-8 z^nfm~cn(;4i2&q2aQ8<2NOUK*c-InMf(K{!EDeC=7Htl5^*mezrZ|j z9q0nxU@ z_mN*<9=Hq4SWG<}MmU8&H5YU|MtuP7t9ZWLgI+KXw4@RKQ=~`mY2q(f#J4EG;%CU; z;o!66C+G$jfhAxeXnBtM1=?0qE+YsRj0ej>J7|60r)GjBU>=z90{H~G!6LByMcO-P zb^{jad-sD%e3r^#ClfYSibvl?aoA?Uy?;*-S>jJ+zU^35f5-#YtkNAV- z_p{CmW-RfmN!JtpQv8GNhlm$g$o~(_$>#Zm#22)_M81H9FZ)%;4Wtt+0F_t#>Kf3s z)~|Ym2P;4~7=0t|ulv8<+yx!7Q*4%mvHe_N&F9xJRi&eV`uOjFbTB%O!#0SSOk`U zn?T22@?j?a50YLm1Iz_opc529?9)+brS>+CUqa0v3W!_-|=W*YOwP?@^E&*NOR=Mx2s>b=;gEp`jOaa|s z7FcLi)iq!q|M903bb?;tK}#O@T~#$3RJyS~4qCv?pcO0uZD1*w0U8$&PIuPeL1z#0 z4RnFqK&7Xu)_{c;Z~e446OfG#k85&1Bjash2%HfRU)z(TMPEC;uV`v~F-I>(T{JIMdB z8C zt)Oy)s`it6Fiq}nBz~YB%mWL-C7>HD0?Wa5p!Fug2Q$DOg8YN)Qc#&fy#Vt-O9A;0 zb_WaDS78U0X_Oae2XjCtSO9v!LgCpzu|{}slibfx)$O1%Q&l~n8>|rbS?ry-n|#Qj z96%3f1MRb^w_q`t1(t)kpluHA0n7teflhEO=ms}~o}0-ZP?<}7?;(Bj@DJMOtLk#l z3A(^?aD(u9lowbC?gc$yIcQlx{l1s{024qb*c)_%cCZ}G1g*D_ey|WM5O=Up+`%9A=7IU32P_0LZl}CJ2j~`ea0loDOTiM* z3)&YF-}`tT*blTWqJDveU@qtao#GCz0&REDZsZ=^F86m5p4@}R`$-R&0G5Eg!Hm18 zUvdvl2R+~-&{;rup!IIT18v||&;jlO3&Aqb4YI7Ml!Ni0^&Zj>W`Ki0Czt^igVRAb zxCkr(mxCVA1s2{*I7`R}C*=XU@1uPSF5!8gZ7JbCfZQ_j541i;{(}y%22`FSpO+#B z=7V-{8JGdC1|48Am>ftHP=1C%2^0E+I;af)t{Mb{xV zD!NdouzISnHmWGw(wQTP;=*i6H7AT{Zdw@aRIY75u-9eXyNXxwpTb#~$=swS_6m!BXvvrIak0QUEvj{hllS4Qc=Nh<{pd7+&;4Fq~CIp9Y z+c?+3#R!)GCN0hJq+glfRj&}4 z(Pj&-(P^esiKgb>4|nUoxM$*S4|AV{|KUOZlD2%@9k^!(!(W8^2ouvM+)LiC!R;|| zOEKH@1=_ZWRn$VFS2VVdDXLA*N11*zYqv-n2FUm(n&Z=CVSO4kW~hoEz2dmrG{j)b+K_Q zfhxKfvlWVP2b-gZnZ!?~JUg2?z^47^zYO;>*rZqyUxpuE);y`h*kW)Vzl7MXiP zApGGbb`s%kP?SZ;ye2Yu4u+r75WbX0F2Tbz1fOckZ2Ua(4DVTlwU@A@4hHgeSg4*2 zHEH#;0GT2ObLJw$;ovNUTLbrPFpZB&8dn;Inyo90gUw0HBZ$M&$Yk??#Ze>7cKw+c z^8gr9KiF(VGLYm{lRguNV%vlr9Pakbj$~u}pZcu)(y@txVk#5nyc#dib)_r+R_J5a;62GT}{3EQ161wJh|iub-PI_8ZM< zspgDvTG5R#r;RjcOgg6+Nh13&DStY@0>ao3eEv$&ODjY#Ef?LpRP@r~NCMEWH)jnt zJH~3&Xl9J2g2=@N-89&w&o*aGGdo6W5>n^ozpZ)}c~u$e(dSw9H_=uo7wJn}xTV~| zx~;f{bX5jY-;uW|T6dO8=Ni0}@OI$Ga;H~)N&HCLTS0jAXW~|l+Zx<{3bP$yXR%K|!q_=ujiA=9tGt6nKG*=9>Nty98HgU^P4M|eqtgK)__ zahr}?`9HWhaa(e?S7kV^#r57m(zU*PHEz3b`$pVCX{X!OI~(fN$Ur`AL$=@^bYM_d zh4<5BfngwO%G%IR4>zR|q!&L)tjYf#^mCpb#$!+qk2dG&7dNSegL#)0gT7nrRezTH zq2--q!ux@|BOjzJbCFr}fLDF*AL4k?IdM$Fj|)G>WnPtO)bKnY@VtiNr)ac%-j3`5 zWP|m{R$m5Iyq4m&8n@ZOZ~}JUut5Ci6XaR3gj0&lGeMb#c5KsQqKSzUun|Re0J7Qa zThQuQ{|_WD_90)$R<4&o@N>Qj0%)f zupL{>xB)z-}(YU*?nl9>)#H6eIIbZCT>D3mGpm_i-Ic2j+>?$zWUaB9rsf zx#^e|kYPY3<6moY>OV4)ra(AT(a@tzLn!9~PXVJ_B<1(UfS1CHf>qXD860^CY*J0fn{bH#`mY|gsf>=>#IIIt(syi#Ozb6UMB z#?P8(z3PP$*A#lCVdh2o3=)zVtfVqnNj4XOE;1@le;1FUT5EAE#oy}Zg7r#lf?)qF z`q|imKdZg!Zb0G@Y(o;6w;S3J0d>dOhU^AppAlKY$uSRLY&}LBpWGA3676|e$n}0c zEZtaw(X!q10a4!;S0(tp>7EOXwBz$mRg;p0j0guwW0xOq{s zIgffgps5jHu6faLGHjeCq{Y?9ID*x{a{5v%j!DPi=5};kLp3$+hU0aGP)#M&!6~4UDZ~ zMa)9RE_pRHRtV_!kS>rpy?)48*u(gRq_-)(6>c|@w?C0_W5~Fhz+}nnJDN-gt%Ekh zxr*?eud(N>aeiX+8!nU*2^js-vIBj_R^(l4&+QLF^J0=erO1>aL$|LT@*FQ*Dct7Z zbF{SHWgd`fwr6TNt<7$U_8F#)>3g@P{=5-vw?yJbn)GO5VI{0I+*afExr83np>{oL zH{e}sXSv9vz3EjaH^}HSrJ+e#EyHa&ZtH_?!8$aGmcR%lSP6%i=GLd)iri-WB&_qQ z_Xqtf){D43@Jw{G=qnF0OORCzUB>rmWRHN;(HvXLo8=EFuZ!THtT zyr&bHCG4|(sF6(Ld|HD{IWmpIVOA?xwkDQ#*H@|)fdwJ9rH2HXa?##4tXS^vKQUC>HKy#05>;oYjA5PVTJ6k#`89Z&auBpue3QYe)$xNdW!3F^`lG} zeG{%9sk4Z)rxE+~qo&(%I&MX{{hzjB3D1e2?jL*AQ4$CGs>S-7w$$r{)wpHh_LR7V z^tWb1XV98x>DGoJJ?&lEY6*U};>Rj}f^Ai;1w&Sp;oG z8!`uwd0oP9Xd5dV%1i2ECNg=SG+h@Z-}7;I;r?Jl`O7SAs#eib%~`2t2PT#NgFu+* z0VjUe;>Y_b`>&;g3-vjndGWM{xr$-f!urt|!*^f|562iz#TXurF+3b&IMrOk>Evn4 z^ux`CoJE{2{q=Y{qN}yh_`r9`}RZii~9&dzc&BHOv!bhd162 z8~PE9=>hoj;;;0ZkbMxGQw(oAcKyrev>h@-+Wr6vdiA#&tZ@u3}`5 zF%eU3ER~DOI>HSJ*ag9Hu`ehOL3nh{>27NLx9||bGsI|-rq6*8C+kGzPea9 zC78vjly)kmof<6d@si#1C{4*F89HeBR7MyBehBH>Ms^y@8zVG3ZEiz0(fw)h?v9~b zh(F2eK)R5@n3pl26)FYyV%+a&aF=m4D=_kO+KuSE9AsjD3~x8+yc@%8jrwtT&<-m? zemV006sG8o&B&A@Lw6R8S75C`%4ZjDWw=qq+CkElGPoMJiNc^87VGsxNQkyHDSl!* zkv}D&G8N7W*AEWUSvw@0esFfU4Z>)3QvWdFj5l3pjLIZxE`al#5OJ>jNG5S>Q%uo9u2I6h1Q6|ZOlCV(I#6Kb=5{#2MEi-I~UrR z@fwvx& zD{`2L89x4w6xFZAxd^${$kq3w!MZwvij~n&K?j>yK_8-3Gbt;17ikxMu9L7iBrYDf z?mNBe!$MHz`eYtN9!p>0#jOap8^w)vT^XPyaT#yLAN*X&d+3H|JH%iN+M?u>q`{7C z_g(bAthb@hsZ65 zTL$-##sut7U|hRO(glZ5&ppt%kxHA=4kD znhs3NAx*aoLZM|Hu7M2UU?@m`Xu)KKiQ0-^kM?) z45>}0SIht{yxu)%cNMht#=0(KgNDKzA#tA2ba-0+N&E^3Z&|HZO_n_P_p%+w^oe0X z)8R3j8n9EgOL)HETB&}q>;|z8*LoCm5;A4D=lHRqb=;8WLA}n#6hkCI2Nip&DMhZg z(5-wW`;zEl(tmA`!_cgA|q~*LlBq!EToNOPS~k8ye6EG+#-5^GV+F6%|UF2||H<<$pgb_6vOKVvV8C2N%I@ zhI>mm@*~(UVec z#!HF4c;1D)ix!MyaD0etaBWKx{$^tnxF52a_$$HR$$#^=^L&5H@wcp(PyM^GKk_8_ zymYk3*XR4&ia+~B|9AfA8Wb=7YVh~4JTKH9W$>0?Uz{S>{UW-s-ad83`Em=x<@TITaoi12WW?IySVYfT^`1j!6jYnQ~QT; zGC0kIyCRH>hjYSFRkTCGOM+VsH!O@B1h)%rS{RoB*Y6VEs|(}gUG)sOK#K^piA8Yf zaCAx9Am8u`2+5SbHS~G8=*-BxD9Y6aH(P3Hn>{qOv%}@Xh3B8VWAB2iABTxt4qO>rgm~l-t^lqS zZidDLxI(y;zCQJfFm4T;a+y!PER5R(*BkEYFm5|s7F<~vC-3w3>*rG?2sz}r72IUN z(S>S-`6lkku;XUrJchm zmtdd6iB6V7+!gIkLfXfTxTHbeM6?J-z9OX%PmO`fEh za?H_NzS{o1W-k;GM(;tq?;A&e|79;=Yu`M`}KMpqMg%1pQhCF*Z4Jaes*JvJM5nMK$Bu@^h z*URCu;D-IT{ld-%!_lTqq*RmC+g%d=XrEdsfs=pd&F#tp@Kfg$0XDeABc8@+9ph6^ zi{Ga5MH`!?ip{70_&h6Wq?F+gKjPKS=^(5fg!LEK64pv)+u1kDyuflJhSt&uF_t3r zZ)kNPH2t83AzmacYY4-c;cHl@IWH|Ts(9%9v`F52@S8H$r^ZNN9AbV}z}eyI^-Db; zi-H{hf0YoyBNOZn?|^U7*cNZfuGGdF+CJ**we78wnyi%=#S*sy!c7_%(!-)h3gJ@V zmdNu%HVOG96UxCMT5zni8QHbS_7GW)1kMt;t#EG$!QK+)cu|U}TjY82?UJnPeCjRY z#vz;-wp-!m$Tf$I-Q(e`nLf3vX6I^(l>#CV+{8~m+->7S&&`KRgG+~NC3Tm1#`ETx z7$;E9*@04ODCi-k+2=56CjHp+sdeX2+I-1P|7FfcUw6LA&(nTA zpB-T`*qRv23^N(7X@X{k9~*!(9b+r{dY@V+`S#Cwz~XMBxwfGuncr+grI=*U;l=WK?Wcxj^kL1|1hg+EB1vx?_9X8P0@BmXl!+Pux5O{eFa=eQa@C!L_Z zJf|qvr#>SE*i;`A(*Nl!AsRCNDLr_Xb|c@~DP8DOM{+IYPvd8++XViOFo}CE?g@*0 z>hPfZ^|&OP_5>dXT_tPI4xM`|hh0p6`=-+6vR#BB}LWSLE-c;{y^6A=o zsOYlQJb%*ze5-|P@-tza**advrjnQPU7_u`wGFzFKwgg;Y_>7sCGNX|?kpQ?egp19 z8{BJx?wSou*bMscA99!P6zwJaru-)mQ(r9937T67h(y5?(=rZ4nx$k0;POb&cPX8!BCT1{3EIOO4A7E5s{Bpg0LDbA>PPE?US= z3C%H#BCI}W-9|6nC2MoYoAJABCG!)(bOm*PsIG_VCvUkJ<`PO16OY>Tsa8g@1JU1) z`P56K?F7~xd|DaJB<)bWaZh-h_Q|#6WAJ%R%{j`uc@Ofq)brXFWogIzBEs5CSe@iq zp?+Ro65Q3$&kr@R%Qm>cH{3L-{t_Qr7@G;B=n1|h6Kw1Mq%Sg>+GEZdpj84I#QMUM z%uNO3u~{MEH~AoJD+y~CVde6jqL2S+{16I@cN7hgQB4LmT&ri@8Dx9j z@TqThZ4|FiJqr(ueqwlwCIf5OhmcQr_U}XXWca>JF(BDp5NeLW{E;!-I{YR5;8P!r z;$}ue{XI=M^#3Mzw+2Gc| zJ;}8k!ll63b~fg+;5Nf$YEl8YT)61p8gov#OgQO}<;db(1y=}X6njRW(U4HB!ZBzF zPC9FgLxw$ivu#BEj4g_IggN@&zz9T}ln$-Z1;Q>T>=eH1wA1*15cWpG9E5$w- zC)vVlZ^5~E?cLyzzB9NZ&(l1^{~_vH*wJ?S+mp2M|C4<2lP~8infz1WR-!tcuzY&kQp+8MKD##2x47HTqflrG#XZ$tGdh4oSWtR~f3vSxS6cL%+Z zezp4lhp<)=R&k79t^EHOmXxE1u%?^&9#k-Io18nC78qDz0+9<8Dx*uupTr@IubcB# z{{N5hkg#$HE4!6n{jPCXP4yw^jM4P_n#}7IlY_A2zoU8D_|+GhbJJA0h4)9yjcqrw zJuaEuH)(8-OVKt%x^)aYn&_srJ@`okn~*~Kd;06YLxH_Y>9fU)u{k^X_-;aATb;J9 znSyK~vh_AZu<1(G{h`5@VX!K7JrCK63;gQX#&uoW8-_KjFAlHkjI5;$*Wkx`A>T-o z_7t$4$sP>eA^gR#SR4RVI6>lg{=kumlSNGr zlC_N*1U;QozI|y;@vF0>4utmUG?gFYP+$jn6m@AxeJ4-sXrsxd{HBu3@~bxcm_X2b zc}~(${wEyQfplxbNA10c8r*v0HY(^Atg{RQS^8t_&VWj*dsY^OGLd^MSawb54~M)+ zBSY~9{Slns%f|1f5&lN&UU_gE;6x3`A=$kIt{4uJRXc<$g4+ux>5#bu;nu;Go)exM z?f_h*$Z?3=4mb}SRbM;o{FU#7CXV#06N2ej8TK6)u{qxfZ+En*6Wn86P+Q1r+F?9l z^hS{l;MO!XO-v5qvfu{6)u&VZ=LY?2Y0~OpF#SRQY)8}%JAdW7 zrRn%TED58;8~2G0!x}1}bx3^#Q%$Jw&@Gi(p0}4UY9{yt-x|VRVtqktj}`D%zIpl0 zf9qmCh+!}`U86^8dqK``bVE&y+M8&Mf%lc9O!9}L2l>Y4`;uYQ|6tlu#f+E{vxP)` zMYeC3*#X1d4VFe)BTGZt(PqLa&GrZ8TtjWP>2aASn(4zPG#ImF_cg6nv?iO#bGnaU zJ@ZDtdNR_yi^+!ekNdRwqP2ir(!K41ij{rhu<@O-0YdgDR8ws0VI zXBFYu9R5aYPix_F&*3)1t%Z}v%OQSCxH)hRcL2^h#jjqVNd@F;;0D2oEh&fijU9;{ z3irLn1UM^P%2d8X8OHU4bHH5~#-+g(z={1QhlH06R|Lm$gLVj)2e%b&Mi{pQ&N|KC zXw9$)E*-94nA|$JMR3w5$|2#o;nu)0?WY~W?SPYSwK6@>z?H&z&*8jqNz<`A!{jU! z=n^=bv_slzcQ`lPRABAT3dfXH1GfgQ9Iks9w+SwGroYkt-0g5laNWY>Ja8%Ja20TlbGT?af&#ec zFu#d#i{N6yI2&9(oGFY;fy)cy9Jpn{<-)xxa-p`V^>Nz1DQyi+`;HUuY24LhZ<=hH z(^QL<5Vd}EGtbz>GqiXALqni{>PO$=A@rjujr&p76=pZ3u7Vw@MQc# zfc@pvtSp(@9;&_Gp{+foBbS!r4}6CyAonXOH!%N+TkLFqVBJ}pFJ=F&On)+KDs^lb z?t^geCC|{@v$XkCib`37n|y2dmH*b)H<+Cr4Ktfo*xE)e(PtHeSDeeYUgcS1WjM-i zKMV@lD=F^rEM}MEuC-hGjm7NnrMio>rtkXUZsD89kIFbaRJKj&-4xkJJE&=cPMhbJ z^erL0jNAR{CsO(TD?Ijr%7@&V(Butk-8%@+eNSV3R|>Zm4z;Hp($>6i3HS0X=`hZc zLHgmM!np2mmM}TdnFHWr;k3C@`mpon9x>(@N6NYu-9W=~A4^PMG+wnBrrB%SBJk3P z<;E3;m3mEI6cPU3bKoBDE>pT4C(3P#Qeb!l=_*3+;-$NeXP~(JgM5+9?2Bk%5i&M!U&aLQ|&Mf zd-l#I3lFc$2`BA7^mcG;6r5iU)vM6Bj#=@4nEzy)l}1>*2y4*&ezng(g%v)w&oDG+ zxBK~~4B=?{e;obOV!x`{XIk1PX=#_bE8jcsj$20Kx*JM+=sEKGouOsZwuaU=CA>lj z?-9x_mYaXi%MoUe-Y`ohInN)LY3suho`>*Kp7yJArII%lUU>W%E9;sLPn(5x5`^tK zbnkP1_2!^mdR`fY!b_1o+m|%mR?)hZ!7o)z1U1oT^<0f&qGhc14T3`5q%eu01jggF zwy}XYWW2<;#D(CnaBhQJ4X3Rq1i8I%YhU&^>~oNMQ4Y5Tu8M2PkMr6sgF4pfw+2Qu z4GlNVG`exSm3lFV2>d_oT@9R6Ww{>~Bov~#sf3C)DdK8Gqak9UjIw-+IvL?sCbR3Z zf+CEtBHr{i3UR44Cq=@dnu?H$YAYozZp}3!>~eKdA~ZinMa0iWMMA~h`+v^+{CCcI z<{Z|<+r539-*5Ms^Z&ok^FHtAdEfV(_ngLWb=2%XlQz-_?mTc8Nj$iBsAF7jo-a?? zO4Gv3VvM}G%l&le$U|=_^o|xi98!iWfwcpBE;xs;*0E~4I7{;UG|6*dX0Gnlu>|bx zguV2tj?S;(x4WLft-9;ogczYDKjpppn-GTg@almL1-2E~XH-x76?9&8(y<^J=q#Ww z`P_)Gqi*Tw{E~!4`fKtT{vn^6O$XV4$L#|>rk8%$%EQ+9?(48uk>rkGNSpB1c9L*s zr`Y?Rjv3*#rUTEIG$I+e_#zqD1;7+}&py{rMg4+~_l_8(XR$ofwXmnW@C}PWU1`VD zJ$Q!eblm2{Qf&rtWuVu#2IHV$KU6I{)Hi*{*heteIxxI@Kyx`KEJ@zuE3x&6qxk)f z&UuK>*N3CO$0C=yHmNV(;;LzrzJDl!?txyPAK=>wqKCE+sH2h|>h!a)u^itt*iUTW7$yH2(cXZ~mERZ(MbuN&O8>J4G8g^tyG1_*{mpMuU)od- z`UkalbpETvZ_5BrL*r_VZo>5qYY=t@!pg8q4oOoHSc?ynwznBr2H4#aD6G$~mJ{}x z*R75y4lmymAH(e5Div_^01jf0A_3-yp ze3$QhOa{ifbP%w~z$O4=`AFD-_-g^40)DUnXj8by?2R8XIL(1;0O!4*1n*j|X;c2| zX{ru$0=K}2ft3G74(^kOj9<`lC11B8j@VC-|G_>eY+Qx)SMTjKwPPWS)+OD^Phfru zTaqq0q#tPjRstsDVqgD*`?7d%nvOT!QwDC{)`sx0TRS>G7xbsvk5v0ac|0R>8`&9Q zfyxnaJd*X%1-o^Y^8vv*9SC4RO5bo2Omo@zW z@>1UCm#)J~q>McL-6hsfN5RG{*x0eIqw`SBr_i-zykaG=mh6@dW9y;62KpO+iFGlV zoL$(}R!n(%&*jSdCwl&&2V0BWQnJk@YVRu+e+!{K%V~Y<&K2TUNZ$r5B5VronH}5r zti7`E8Hd!%w)4@SY^a%=RO^4Wf0pNHFcy{SV%9CjczgG1+o?D5cjHF+rq96N;2SSp zWri`!b+UKO-*?yDW5&7-eJ2?NqkpMyL#JUq8TQ^O3Bi%aUkX^SjUAoyr6a8NU)3_H zrbX^$d?PylkW_yW)!l$(L%C)U+q2v=+KA`pX82UWw{>`Jkv6ac*t5V+$8Wd3a;dkz zQjgPK8O-nS4IXc80PB0z@gQC|AncX+?d$90`DEi%#_#j|+rzkqrF{%VV&5g`3NNwnwrGt`= zP0(2lokr2|<{WrtU~x}x&N0WgtR4rw8(|+rSmqHb_QbBTz*YJpUP`bsryFq*UedB2 zIwk1%*KD=|+XRg1lenJ+wh@@jDPpj_uFN2307S;_1)UO%&0v_FrS4XrSATq4u zbZz;agmJ1~)KDv=50!6DC4Q&txc;(A%x3X;*9rL+)kuUJFKs1kT!z-Ha{=6Uk#{eK zjBmV|xa&vOiM=gYr>hIttG2yhd5sUhzM)&g-hq&qyq-kr`QQtX&s#e>PYcFV?XRlw z;Ke3A?+K3wQ#(Wx)?wl8SfMzg_R4o9;xFHi=MV(IA!U9$uuTtOOx44KVhM;%z_$Jo z{gYr`sn$J&x;3V+Jk||J!c-7uGrpU3LN(0G2y+I*i0y;WNmm{Ut{>I|>-TU+=a0e5 zA>l>=yB*ja9^$UGX<#jnbaeh!Fz3UMWbst`pjqGsmOI>D5ce3+U2-2uY%KxzEI6;; z<6N*6z#1Rbxq)Ksz}5r10_So_xb?u2kKx+vAr9LLYz44UK1{wXwh`DwABK;_$9g>; zyti-=umrI8`@+e0$VLG>%7={t)(GrKAC?Bz2FzbpExPbqm;0Cp=dPxq7F*yRdz7hayN12i+3}y^s_;qcL2K*m_HBph&>Z7 zej(Ziu>E}Y1_LVrV_iyu8wqR=Ft4rQ-9%hGz_1S+sWGLL3#a#(g4Avu&luv#h$@t0owuWy*}L>uwE|)<6R0Y3Ctf(zOy$On7{ni0b2k}=3sJ&&m~|> z4YmzfJFu)5%7xnvtlvw)w%cze#`!)>+Ft@#1F-W&SC$E}3rp7cgc}8JNd(sjZc_x; z1}?s{)~5KM2R8+rzy7TRmiA#1_wB$Y1M}Lx_=RZ){n`w!5W!Wz?Tq01U4-`ka;;7A zs~+46aDKl=0b6dcG_a+>{AJPttlfu+{|kU^0)}F6`6{o$(tKSCF0m_|YX{dB!EFM! zF@zKUcYqu8=b-<4fDQCv;#V9K%!7a}pkK4Aehme;0GxM?l028!r>f5rz&#kD*8(oJ zyH-#9%7I%6&Y!PKffan1__Z3?3SgJgFL@kK<6aLg_DU@$_RHW}z|p?g+6gQJ>_*zc z_=mRQvoK!{;l$QZa5G-5+7c`UtOc0=8aM@54w(O1IRn@VgIx*ic7x@CZ3Z@2e8VAe ztOQm8cC?2$>~>)NUJGKIfYlqU46FfIAD`|{U@2e+_^>``NTY!DRqQ;-LBK`=`?g?a zyt=RV@a0-^CG0PO{RhN;^xoJN!Nml(_SyiIb@W?C6{=e!*VEn(`mv7g|x*JtizX z%=FeHyAY^j$QD}(d$At)_Fd4w>iE0rA12W~kCgE@c5<1S^SHikz-!l?oZk}=MZYztL^S6gy zS@h4qdV-fj!VLtr2AE{I9D)r6w%UiuoG}G#C9o+H2zeH^&U|_BIWKQbb^-J@LGO9h zi>M=VAJSh(8t~H108kJ8^{|yaxYNDA06yq_9B+N0wQE#$T3=bCt|07EgpEtQxVa#2 zER#IzgO2rD;O`LJ%QN|s2ih0@27}9id#`X+`|xXFuM7uzpu}bxVHY9n`z0(6bTzRS zUvl=Hs$&R0gKr+6g}RRX8>u2OaHMH@#OIB;%~nlCt>XnX1mr2 za&YybiFfhqnUhU)6O_Na3AC3w!g?70mEM4UBdBe{qAdvA(l&lK3G{f;^6_{iwU* zNV#1Le#x=;b}D{{wk7%EneGekxYrjFt*^HS*EeKctUI}tXG zuwLKP*gq~`pBoIkUmM0Zz`eO%wcecFKXD;fe8l=ckALRC-+d0`ce*5|RsP}fULNrH z*-qwmOCyfOh=2Z54zI-A6_fbc3mlG)G!XvOD;?f$?A&^4IDSV2{*wArF?Mz9*{#$pW5bS2b(;!Ibf&ZUbu)0H=Nm@bPmT^47$a-Bi{nXa?hSe*V7r(N2ssD0)a{Yh)S5of+(JDpb_c-|FW(?y(m?TXWH zmSfy|*+?u#oOUt>r=RTxr+x2Z!0?E67=Kzm670ioZq)i|@Pgv8*Ms42Q9NyM=4amE z%zul&q~%!D`anNfAL0p@pTz6Z&d=ih4rhEe--z3MBhGv)sh`Acz7e0zFqCpuFVJHQTgyj(@Q%xy~M5m#I64fM?2Vr>(xWz zOqa!Jk2vizU5TE~4sqI#zsKRMH^kcyaX8ceqLy1y?eLs@S#ickzSzsz;W_z)_wlD# zjQaO$eV~1wlc#;2UwWpi=Q)j+=j7uWFXN*<`onYb^oQrPS5Z4WC!bOOnJ(72;cX#qcjqa`{C*H7TfHH2QhNGu<*bl%uRX zaZ2);bDVwRzgGL+{1f`A$wB_NhR-U0pVkXX>K6=OGWsRu$Lo0G_a=SJKl1l0?`kXN z)n_>W$UmgK%SFt24bN~k{m-cXl-7UZk4E^<_DCsnb~)l_I{%2X{U*<>Rn|g{UgtOr2ou+@=^ImzL(}NB%fFv$|IhqQYX0(iOUd*xe~DZFnSSyIn)EUKtk;y*KJkH8U-O52RQZvQDnIg3 z^`CrH{U;w)KIEgyhkR7|kY5*3J{&ht+WaGay{Z3MZC~Wy9g)A}hbYhb!S+kO-tcU{ zPc`LRF?@sJS-u>nQQG*4pJDWApZtdnPx~A{Qqupd z_ODDArR6!!q_jNkHfsFji<*AwMe&T+@_E(2xzV*-O4_IYoF7wKp7Uf%)~}qVKi18` z@h>IEx0wfB`4hL}XR>T z587`xeEi8EUo*cje9inq`TMkgrDXj~Yy8CR{35SB$Ne?)3$;()&Myi(od4u+)%3A` z6rT$6cK(qz{2eC$lTQcr84vR}ruk3&7ZLf(`3a@XAL4fY!u;X5i<0fTto{+V^Mlee z&VTZEs(;i^J{#mWDxcK;B5m|bhR++`j{ow;{#Mmz`b&nl{a^a|pns28{XYeH+dt+i zL4Lc@PreZ3pEJCTpW{SczY<#h%-@0L`c(2>XjYw{)r@~%493s-CCevecsoAM8U8U{ zpP+u(_-Dt@x&2)KLI3Uex!v$~d{b7Q^B=ZzmTyu0Bma`-FY~Wtc!nd-{3XtL4*9hA zlDF!5=&Nc!6>~@YC6~X{@2TS_^2wb+-p;SGyMlZ_)laDXyp}KR+xaicpZtNU&-}?h z7qowv;p1ArsehE=^ICt&zgKytFSR>pf4JfEhPU(U%qv0tQ&gYnFB^S3|4thH(~W+y zkE?(5KdOF`kE);KyQ`me{2uS^;%B|0WcpbDh}-(X{2@Qlq>uSS-pl2iWzog|yobw3g56g$V?LS#QPc74L|*BJeh;XkW9^QUZhyZ)2*UjAFX|M-OVBh)V%{tL!_vLl$jn+#tt zyj@>vSDx!bl#HMCpZHhQKI?bU=zrbt6~nJop5>F!r(S9QJBH62{)dLg)6+3IsDGQ` zvxZ-1__E>eGOiS-D^f4AXthTm-XSY1&60mJ7E|ES?(J%jpB8a{4#yFQpO z{PRY?V0gQJnCKOZ|7F!rNul6K8vZrImkeKbm9v-fv~mAa=SS=pC|Q5vIzMB(r?foR z7bz`IySDwOwEv=B6wi1qA6I?a-(S<$kLgohPa_4_^IkaI1>reAUe5FVj|lPu%=r*K zXZ(d{TzGlZSB}CdF8>d4r?JYxZr8_Qdd_x#sGjduevsj@wFpnT<2h(`jQd|Up6mkl z*6;-_2<`=0uKu~Fa^3Uv64do__>pq{aDA$z0p+<`Io{?(>|H8LkGLPi^RfW|2h)*S z=+0#;fE>K8c62)bOL&Ke9G!aZatGYd`s-P+rt^>@3p~7tIYi|MmE%-SRoSX?zRJZam#JK(a;?e@ zDz~WIu5y>k-p^_LDu<{Xp>mwcsVZAl&R4lue+g0vT+1uOL5sM8_ zIYi|MmE%-SRoSX?zRJZam#JK(a;?e@Dz~WIu5y>k-ha~cs~nbmKIbY>s zmCIDFQn^;;29;Y>ZdbWWW$%i{uX2dW5h};2oT{=_<$RTkRW4JxO66LW8&qylxn1Qh zmAzlk_*D*3IYQ+)l~Yx=s+_NKvC3sCSE*d9a)Zh(Dz~fLrLy;n8o$aRDo3asr*f*w zR+aNrE>^irJMCAyT<5W&n*{X8B%Ec;|sa&PfS*`t_ zXbA5g7?RgVo=3@o-v1|$e&0J%Q}=G4;jJtVb1`Q=x_1u>`kcGfFAv?jo(&&$zDd`$ zGcQMlaQMAfXusc0xCiwpFExbg$Hr|8T7ji7DZHKk9oQam990QxpRje}w(V^f}w2x7oH<|2?XoI4eBoX|;}PlaG0v4= z{)6H6`zs%h;18w#$>I9PQ9ptoN&S)G`VGogP73GGR6ZTSe?s}vh;aRjsUN}TsDEO( z{%5Hl!GDqZ!^8Eztb8JZU#)!h1L69&(Z2WMsM`MF7s_WM_)W@}j}N!MMfvtWhu1HM zM*n|={v94}|0(5jM}+e`l}`@|=X+@Xof{O+_g6lDSU7*U^05fMUirkK;rheL9}>== zqI_y#I6qPOr1zrL+VY!1{Q=?nP1M&Hj=50P@|dH1JmUIV4H^FHL>-?bJ{BJTvC3x~ z!})NlRn+=RW`X*hAfPgLP?UxV7;)O(&3qt2?H?A7%I!rFch4X`pcC zo14eI$>`oPwW#vRYx&gIo2ay(Fz8?5bl=J+bN1g?`K*X&KkaX_{gn5)U)#s>85b;{ z)Y#zpU!j7%sVKgq*RRZ(t|i&_bcgcA$>IDjl`o$W&abEa2!5mTN$=$&wb%cy^?``_ z{}$SB4v+saP>qD|4!xe5%!OueoMIhDc`<0-2TbR7vB@kk5)c=WH^78@~Mg8e1`TXg!7jupNZhFQa%>JU)PQP zjmjr>yYAC@QSC~XD<6-T|NTPOhcaIc_x~K_i`RzpGe*1qqnHTi2kQDu`>t^R_E$a| z!M~#St&r9f6M)SYYZ-)?9yGjB$)3>UAN!YSn_H=bE&f*j3pLh{fuS9 z`7fz{DuQ37d~RO2KI?bdd#Psa^_BIztm(J@b(j9A@VBX7wti>kMrm{x)4uZiR=;DJ zVEryk3!d+*cmG@ZztQ!{;-c{SakyUp;@5=pM=IYQ!FT6(RA~=Yy9r~U{WDP-Cg59s zx^ML(*Zj9pA8fX5)A|vM82@}+%PIZ&@cNNazVx|pzCrnX1ix7MSOjnVwdYZ_WxCqs zb8*zmX*zlS*OU8JzX~mXoAoPkohzZzP2nX)-j+jF!{?Sdy|PLhuDf$S$B|S&x(ol8 z^1T0?R{J)UE43b`Z*Yv|Z&p6>#c=)x<;&NH^K3uyFNE{mrN{ci@bA;-`R(#-;l?Np zYKF_ig<5|p!-MSw-M98rHu2`n`CcOa$EJGJ_3X7@@3-~Y|A4;z-roNm@qc;efd?Ht z;9Ua`IrOkWhad6o#CwiBYVgrRj;TNPxc3fy->~;5k3Zo9!%rM>(#VrP_@Pm!oH{yn z+Ua8&#*Q05VdA7SCZBoM+363T^N}eZoqBHL$3Fgv^FDe0v`ka;1ufHCFPt&+qKju; zGJ8(;(z)~6E}MV(f-C;@Q&(Q~Z=cRxea*r}pIQ9xOFsL#&tH4p7p~8L@rE0h-n8sX z%WwYjS5|!WYhN#XaWa3Llcf(inNq$m#GNPK?__R-^7T$8l+WsU@_2_Y(|vI^9XwZW z{Z5k#l_v~uZW?}K>xk(mH@CDjH>0wR9N9eLgw~dmlT8<#c>M7nIJxDd=GI{?)0;2D z*KF`U+SeBii4B`KV_w_bwx;ITu-S9krVqPt_GQDGFPk~5<$W_-V&2(|rg<}B!&Z? zf#$R{wKc_tO`kEXb#Buo)2Gd7ff1fL)oD$0=Qds8H27PzBrX{6{A#*n<^}L&PMbsn z#53AFZ=UDhG%wk+X3oAiH1GZrurC73-UC;Pcu%;N5anQF%=XT*9by;u7Er&U`jqYc zodNET=ws~3bw_-lKKENt)*tH>BwjI1eUA5%z{EE7xqpL_`!x{6J8T6U2^4L=%YW{d zpq#Ca(|^W8ITre|7lY^Ak3m`VVs*Q~Bn|Xm;n)=X5S;ql|3S(9AB>;+O#k_+f4Umv zev&RJnTtd82jI`@&j2QQ(zV~^8JytYz8mgSaVU4Q@hld*06+cuMb)RQaAS+A#EqP7 z^xO40YD)U6YF+*lzuf2-RiE-0}~!8v8uXCI6_OUgBb)TqK3&J8b+ngY)Ze{hA9wIlRrMjGxRmqTj*~X`)g;h6t%HM$u=o2-YP>)i+?c>+y zK7mAo(@$#uM*|7|P+5i)TTFlE66b&V5~si12@M^KCAxmOA5TC?{Pv*!a6>R33HyB~ OCUTL+Zy$rVas3Z%y~XSR literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/_imagingcms.cpython-35m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_imagingcms.cpython-35m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..d267589de6f4a7556d2141d7f663d7ea9e28d98b GIT binary patch literal 34704 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 LLnoO}b6)=i9Nwdf literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/_imagingft.cpython-35m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_imagingft.cpython-35m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..0fe689ac8ab775e701a0799cffc6eba4cd2f7025 GIT binary patch literal 25472 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 literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/_imagingft.cpython-36m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_imagingft.cpython-36m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..fd9b178d995ebeebf11de5bff783e9d779a5b6d4 GIT binary patch literal 25472 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 literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/_imagingmath.cpython-35m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_imagingmath.cpython-35m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..bbb242cb6f7c7f4575d88b568f50c77f9baa66bd GIT binary patch literal 18720 zcmeHP3wTu3wLX&!7$nY&INE?z1{pLUjtK-zDvwMO;KU9(LJ;KPWRjUAqj@oz2zYZL zGz6KB!Q5V3>jRCgt@mrax4FI4N7Z&h1jJ8mM6Y1Ak}EzYh?){bij}$l+K)C?X}ll=gi4Dtex$elVmU`vLq`r6>7OH9LW_OZF!;slB;AZ=iod_ z8OeBu^miRovt)5dQbn;bfOHJSad-x6g4$R`(v8U+ZxvLIO9D*eQfBi0l$kbGk+e%p zMbZ?`rWir#cwY4Dsa^0%O1xCu?}dC+@4A9DkD(1ho}_Zz4H!puo@x>9R^|(RgZU+e z9DpLJP|xOO1y1god)-3CSM&0)(*GRsi~XzKeRRXND_`9IX7QIa&V}QA9Aqc?W>`pR z%mtm4n>1nABZ{(R?7GTAOYU%^?TxX8Lz1NX*ch-WBXC@RgLGYp<02fgq>0K%K}UgJ zEb5~{zl-A%(H;Y86ZNrzYRRRdF-}lB=y*}TOi&`}I40njNDUNPrb(=(C|3$9i9=RE zuhP^rP|paXqgT3$hWH|Sq>|9aM|uZ=K!H>X>6gO-9m)$&)<@Z^K${Mr9|;5^XFT~As5?~C)z z*YEq-ybpB!`glv+-dFF*-zBZs5h#)(3yoNya$Hk1}l*ghShoTt>v zjUw>Xpu`^)i|H5mX9BnB>3uZx~bl4#6D zN~6=3;H6444$|8$=1cRW@-Pm@mC?=sdS0q3=UoZNJKSRvx zCc*Cz{B2`7aF4*B68yIBa6tO=4S`2Ta{Lxflrch17bRSjJ2+9M2s~H#P0D`({bWzA zNaj+`+XBxJ^OATb^V@fnjZPal`pcuJlAK)Ky8lez#X7(JNZ@TE&fP+kUD#P{s_&r1ydX#b;q_LZ#YYjg%@0$+T}|k!njp@V zbrpd!0)w(r6{tqD%DW0@{|cO{{Ww(;PbJmLsa8%kvS1FgU=Fij4zpkmvtSOhfX>hj z2tsj&&^aWOM&SgZI8hBkaiUsn%}R*&c>KX&b&aR8rqmk>)KnA9W-~`A!=xA&<1JI% zt6eqK<(@ggnyLkLaEvDes31@p@+|O&3Pb*?1)*S|x*Xu_V9=9a>GuXvcLvKnZf~&8 zUsPX9UU#qdT!%FPZ+$72iI%POR!?cgt)4P(pb`TLv3wp+pvqegVO8Ex1+aNFzIvFS zAM|@e{>lBoTz`lRP$~l@wV?|1`W$sNjtpv-Qf->z@%y|XFZ7hu)$tGkRP9sdx(f61 zJ(C@i9a9taEEZAN4k#iRS-t;cR1DwZKd#51Bq>(5Clw_FQ2nUDFuJ>)CNOIta30y0 z#|>rn7)2jR;QUF9pW5>GhrIE%iG8Kav{5&^XC~TB7Z{YrTpOd3U$&pu;nm{zL$?mM zIr(@=rJR2e{OO`!;%>43b9H#5;8%5c*La1MJ+o|#(r*&&YISRHI4)6Q8hm&HRg_*0 zuD!G#*5JZ5Y*d<T50G;(Yj9Ltd?=^EUaK(V$Oe250m*5EWZS#mWv>6S&+;L@km z=hoooN@mc-8a!2l7i(|?SfW&Da8m+R6t(F-laA@m(r=kr~Uv? zeEfQx&0}&=qjm+2?CFl9jK7`Q25NV)c97cSvYsew-$HF#(w=tKE}=HLuBVN)mr$Er z*3-(`^Qld)>S<){YpG2x>ZxVzJZh6`dWu>5d(@`T=y9|5WNMR(dU9F&w^!MevR1TN zQCntA$h0X7)s`V+LDihYYWTg-NKE|}@X^%ITORK&bC}1hXZ*`MY1aL1jPHR0wPor% zAPdzAM=@UQIGU`6d)1EEEY+}GedTB<4FWTTz*G`An7qar_dNsGQ`C^N$hvl) zv#G;SkaK<7+KxV{m&>2)iY$Ws>mWZW|m8uwU42BiX#)8L>7dTQ>~U zus>mVbZI9%)!M&)UsoUe<-Ee$c$)f_o!nSY~K*pryxA8CTe%rD?9az)DF z&|M3mxjI{oEFqU7UJ6UM!jI3nBFnZZE;yDi*2K)6BCec~tZ?(8&@gAj7`gZJqv7q& zaMs2aCl;^6kTci1cCWK(D;952+S=bOUG7{4NMXf9MRqeysX@hsb{Gt4-?1x*5^5KJg|7w#>1tw0YyBduA`WE^_{SFgC>c6kk|*$E?v%okmn;F zf8T(xE{Jy@vAD>};51e6r51wIt51nCsn@?5W z+%()wRTSVl+7vU;Etjh$bsOED_L(i`y^Nn4bSst_cedol)t0PgBYNnHIlCG6OV(?! zC%?A_m;1#14n`Rb=Aw>1^ZCXk+%Xx|obC1d)utUOg*kt#-$@%0S8>h#%n9}1{1x>t zI!*mm3m0Ja1(EBmt`;ksy}a(yb(m)FjJsNlZ1(&1u zmG^_*j0t z^(o9ba;DU(h*8VlnmIg zdwI$_QvV0OVH5WcEIv+X4-!L7Hte~u9S?TSh&|>_KRn+4kueJ&y(w%OKl)gkSVm@k za#22`q>g-cRl-l!q2}}#DX%5}1v(vLL>D#sMEj+0?v3*(apYGhP_pE`HA-mT|N3$e3%LP_ENld4Q1y1~4cY5$+LjSzNylJPHe_=SzU6A<^%S;2jK=%hUV@$gN(=Ods zh^J6$?Z~Dwjc4A`|*;CQG#P~q$`ya;R2hB^+VFCEz6GC3oHVCP~1aCdw1U2_3e0~32 zv%a%4Kaxv~)h)88sNpQT%#VC&Q|*PN+i0qICMy?rx>#JhSlo%TGY^%u_T^&^Tj*?j zBDQva9Jg9G8v61u)88qDP21U$yy=9s1v$5-t$i3vkv3o{5N>MtOGMo6!tkfDY6zfb zpgC%It1JAz8vaBLcg9kHHb?76t4&uJ>K$q%9~SQ=DQYA)Bi_yOODrEuAO5A4;GU~d z7k;9)cD)hT*=qQ6JU{&zZiRhn#5g`3zEQ&k_VmoC+Co9y0-v~0v$}j!KOnqo7 z?icMg5%CRnOPo9x8PYitPh*=D19hbP)G1j^Uj1;)G#gL;GNT{97hBnru!rv}(mzhG zKaJ~$>H-)Mekaz7VQ@wkiDogE61Uo+(ydXM*00h+aW0>eLT`609wWU2?nkilEi-mN zz#l%tGjV$A9vcZYYIuhl-WHol)s_p%f3UEbIH;pDw(uzHSi?JltYdF%7Du1tXo)~4 zaC8I$7eeL>^a75)g`EyGPoQ6Z$>iS1d8Y{U1CF+Hbeuq6;piwX;R1m^&C$>&Om4D3 zf5Fk0IogLm2Owl(cX2f33&y)opsP9hTQ2uiftGUg07thAbRI|Ne8eO?A<(Ni+Q!i~ zfsW;;2QSOF3#i$awMBMCQra99_fFUi|rm{CgEgV;t=k z=tz#1e99!yi-*LU%+cw64DAr;M{H>>{3S>KTcEo+>OR7F9~Ni_NAKfu=>;c}`)iIG zKV!V>1o~r+e#|AT5a?QtF6O*mfd)9bi=%FVF5sx^5R*Ggpffo7I!EcH6tdxRjuwB; zc)u&q^EtYoqp1S@f=t4ny3}wCcV28qQnM3DiApufpzjQbHw2D-bwK+v0RPMUDZWMU z)!rPCZwufR2KfR3y}~f?{Qlx4T8X zyF*c;7`oSKxH$P5dS}l8ruKdD_)k%9QkM9AEf*t_1ydRHKz&C=92JHpS z1}**|9;a>B4Z5D%NV8i&yFlLpwIPf4f>QoYMM6@LAJai=K?^{;K`TMs$ZvOpMnT&_ zGmvXu1Z@M2fm)C`jJQfPg4#fPL8pTjBX=wY?E(#fx{)6?QXBLEYGb!QM{Upp)W(js z;xC-tpwmHXu|IvFy`Xne8@p`_sDhpJ7HBJ|5q|;Azz&!M+67t!T8k)e0JR{3A0c`; z9{&`y7qkF>A#ME|=0kreMM&=fZ3O+4+6a6LZriAc*Nzm!?ei7GDvROb)N@i=;cGkk z=v6w)J6H=)#blXdO1suPd}T_bGHcW|6Q|fOC78w+;P?;l36TV|_t}<#HeyY0VhG15 zc3uSL78t$8v>rza*4#&!YO*vXCEa97aduK)8;)gz^gV;VcJ%o{#keIjZW5Y%a2OFc z?0vsNljY7N)s(g&*=e#h8IzWn(wrts9`SB}k-vYNf;ks~pS>>!{!K|v;xAzQ9u5D? z+&AdjU3YAo)$nNy|(YCzA{P797RkI{-fId_%y}5xd8mFZsSH9^&f-U*$>o$nR;`FIzNxSd-;)O|sCJg1semY5UyhTZX<{ zgdOPf$Z?hEYagUKQe(icVFV}tb3-lx5;mr3h#7=1%#Hei#G57_&U%&&+GtaCu;R~3BgPl2x%d~cls-%r7pg}l>3#<^%cx!wky-YEDU z0N*;|)7Tf%@lpOVB43?s9(by!EIS3hZ18OX-yJ%=x9jv4gKsqQ;>q|ZU#?cn?SDe&z9AKinVOrC=Ldf+5{F3d3_ukmo0PF#k?XKCC-e=ELs~FHF>3 z!x5o8t9D$vj)mdf==F&U)ai2hMuntOw3|;H(G!X+0pnYv`sQYAE;_ z%L;uPK}EK$qMgd&#P@Xaop<>?q4?}6@%@DOd@1q0g!pVsk>62>&k7U$pB;_YkP7-e zO$E2#tn|{G=P0;^WhDi_L#W`-u&lU*eexRxx=*HppJ%+}+87mV3O$#gBA?UH;~OgC zGc2Xp#M=_Lh>6N)F>Wzlm?b|OQ}Fbk*&h{-!oxV$mU{71hqb4RemqKIZ7GLqJ@aSz z-Mn7&Ps|+orJ#=sx?RxM1$|%8LxK(!@pO@(mkByeP`#c;u|9fSwuQT8b5JV3uaOM! zKPxt;O+sIZ%I|RGcQ<-_MH6&!H~B^aa7lY{EqVKdPhlppwf3`z^AZQ zg}1IkarjnO*R8JNG!*1L_}H$FzFcE$qTxYb&|m4L0isr08B!eV+dv1Zj`A8bL;h7b zvrh#b!5a3Zn8RP;DGPe5{GJLQgvb^j>hT7H-qn1BtV4shDo_gbH6fA=QM@8lv znI|~P|9=9qL5`RCOVXG~bflL|ljCI`%K%2Q<#?G7C6)OPEUf6`FB>Q}Lc)HTenkIhosV8 zDL}R*U8x%{|6dkK$0RPST!Pdq<^8K}yu4mZs=xl|=iem8%k^)Z$R$fE*H7xx>yPNh z>;E4W`TwTK@p}FD>c+dTiSS`F*GS|5fz-vMuRvFou>~ zj+gf@_-}Gpk$k+>AAb^m8XaV!951i8^8c^t5*t>|TaJ@{q`$WiiySY%z3oQSgZde{U{Nw?GhupMd<%P3!<*q_5ZO;GA;lB literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/_imagingmath.cpython-36m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_imagingmath.cpython-36m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..a24140297ca2cb3b1820d5ed1505d6e58eb69169 GIT binary patch literal 18720 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 literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/_imagingmorph.cpython-35m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_imagingmorph.cpython-35m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..20bb3d40c2c858ed89a275fd9100132eea2f1efc GIT binary patch literal 10560 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

    0wa}9TcAq)fa)~ZHn`;RP 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

    dytPKd@PU20GuqR9PA*L0c9-dvy~JjO+}QZGUA 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 z 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 pgJxs##T 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

    guXLt%6r@qj2TULQl8=F6~ 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 W6G)fGW*WhNRpY literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/_tkinter_finder.py b/ascii2img/src/PIL/_tkinter_finder.py new file mode 100644 index 0000000..21f0caa --- /dev/null +++ b/ascii2img/src/PIL/_tkinter_finder.py @@ -0,0 +1,20 @@ +""" Find compiled module linking to Tcl / Tk libraries +""" +import sys + +if sys.version_info[0] > 2: + from tkinter import _tkinter as tk +else: + from Tkinter import tkinter as tk + +if hasattr(sys, 'pypy_find_executable'): + # Tested with packages at https://bitbucket.org/pypy/pypy/downloads. + # PyPies 1.6, 2.0 do not have tkinter built in. PyPy3-2.3.1 gives an + # OSError trying to import tkinter. Otherwise: + try: # PyPy 5.1, 4.0.0, 2.6.1, 2.6.0 + TKINTER_LIB = tk.tklib_cffi.__file__ + except AttributeError: + # PyPy3 2.4, 2.1-beta1; PyPy 2.5.1, 2.5.0, 2.4.0, 2.3, 2.2, 2.1 + TKINTER_LIB = tk.tkffi.verifier.modulefilename +else: + TKINTER_LIB = tk.__file__ diff --git a/ascii2img/src/PIL/_util.py b/ascii2img/src/PIL/_util.py new file mode 100644 index 0000000..51c6f68 --- /dev/null +++ b/ascii2img/src/PIL/_util.py @@ -0,0 +1,27 @@ +import os + +if bytes is str: + def isStringType(t): + return isinstance(t, basestring) + + def isPath(f): + return isinstance(f, basestring) +else: + def isStringType(t): + return isinstance(t, str) + + def isPath(f): + return isinstance(f, (bytes, str)) + + +# Checks if an object is a string, and that it points to a directory. +def isDirectory(f): + return isPath(f) and os.path.isdir(f) + + +class deferred_error(object): + def __init__(self, ex): + self.ex = ex + + def __getattr__(self, elt): + raise self.ex diff --git a/ascii2img/src/PIL/_webp.cpython-35m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_webp.cpython-35m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..e7a814c564b66c934f4222ca47d63862001a0276 GIT binary patch literal 10720 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 Xez+YOnH4*Opix!+I~I(xnPvSagM4hS literal 0 HcmV?d00001 diff --git a/ascii2img/src/PIL/_webp.cpython-36m-x86_64-linux-gnu.so b/ascii2img/src/PIL/_webp.cpython-36m-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..8c18e070354e6c84e62a6d84434b1bff934572b8 GIT binary patch literal 10720 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¥^mcnV3%?6QlW<4mzY`wj$-T)x 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

  • TyA*AwvOh$7KH3gtzm4_+ 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